src/newgrf.cpp
author belugas
Wed, 04 Apr 2007 01:35:16 +0000
changeset 6420 456c275f3313
parent 6376 5623a9704a27
child 6424 d410d4c31d15
permissions -rw-r--r--
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
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
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
     3
/** @file newgrf.cpp */
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
     4
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     5
#include "stdafx.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     6
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     7
#include <stdarg.h>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     8
1891
862800791170 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1883
diff changeset
     9
#include "openttd.h"
1299
39c06aba09aa (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1183
diff changeset
    10
#include "debug.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    11
#include "gfx.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    12
#include "fileio.h"
2163
b17b313113a0 (svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents: 2159
diff changeset
    13
#include "functions.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    14
#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
    15
#include "spritecache.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    16
#include "station.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    17
#include "sprite.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    18
#include "newgrf.h"
2159
f6284cf5fab0 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2013
diff changeset
    19
#include "variables.h"
3566
21db83574baf (svn r4447) - NewGRF: It seems I committed printing action NOP Action 0x0C which is mainly used for comments. So leave it in, but fix the created warning. Use proper action name for check_length() in Action 0x10
Darkvater
parents: 3561
diff changeset
    20
#include "string.h"
3821
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
    21
#include "table/strings.h"
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
    22
#include "bridge.h"
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
    23
#include "town.h"
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
    24
#include "economy.h"
2962
f0a49b646c48 (svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents: 2958
diff changeset
    25
#include "newgrf_engine.h"
3577
c6532e0bee4c (svn r4463) -Codechange. Include vehicle.h directly instead of implicitly via station.h in a number of source files
celestar
parents: 3571
diff changeset
    26
#include "vehicle.h"
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
    27
#include "newgrf_text.h"
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
    28
#include "table/sprites.h"
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
    29
#include "fontcache.h"
4293
4b7006c1b5eb (svn r5926) -Codechange: make _cur_year contain the full year, instead of the offset since 1920
rubidium
parents: 4230
diff changeset
    30
#include "date.h"
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
    31
#include "currency.h"
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
    32
#include "landscape.h"
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    33
#include "sound.h"
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
    34
#include "newgrf_config.h"
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
    35
#include "newgrf_house.h"
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    36
#include "newgrf_sound.h"
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
    37
#include "newgrf_spritegroup.h"
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
    38
#include "helpers.hpp"
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
    39
#include "table/town_land.h"
6091
c8827d9ae04a (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6090
diff changeset
    40
#include "cargotype.h"
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
    41
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    42
/* TTDPatch extended GRF format codec
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    43
 * (c) Petr Baudis 2004 (GPL'd)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    44
 * 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
    45
 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    46
 * Contains portions of documentation by TTDPatch team.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    47
 * 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
    48
 * 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
    49
 * 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
    50
455
b151d55203bf (svn r665) code fixes for newgrf.c/newgrf.h
dominik
parents: 452
diff changeset
    51
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
    52
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
    53
static uint _file_index; // XXX
5209
1b7a72191019 (svn r7324) -Codechange: reset newgrf signal location data
peter1138
parents: 5161
diff changeset
    54
SpriteID _signal_base;
5210
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
    55
SpriteID _coast_base;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    56
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
    57
static GRFFile *_cur_grffile;
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    58
GRFFile *_first_grffile;
3707
7dc7e4d2487e (svn r4650) - NewGRF: use the correct type for _cur_spriteid
peter1138
parents: 3704
diff changeset
    59
static SpriteID _cur_spriteid;
5225
af5d9de16c8d (svn r7345) -Codechange: enumification of NewGRF loading stage, and move enum definition to header for future use.
peter1138
parents: 5211
diff changeset
    60
static GrfLoadingStage _cur_stage;
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
    61
static uint32 _nfo_line;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    62
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
    63
static GRFConfig *_cur_grfconfig;
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
    64
3814
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
    65
/* Miscellaneous GRF features, set by Action 0x0D, parameter 0x9E */
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
    66
static byte _misc_grf_features = 0;
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
    67
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    68
/* 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
    69
static uint32 _ttdpatch_flags[8];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    70
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
    71
/* Used by Action 0x06 to preload a pseudo sprite and modify its content */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
    72
static byte *_preload_sprite = NULL;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
    73
4742
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
    74
/* Set if any vehicle is loaded which uses 2cc (two company colours) */
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
    75
bool _have_2cc = false;
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
    76
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
    77
/* Set if there are any newhouses loaded. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
    78
bool _have_newhouses = false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
    79
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    80
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
    81
enum GrfDataType {
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    82
	GDT_SOUND,
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
    83
};
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    84
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    85
static byte _grf_data_blocks;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    86
static GrfDataType _grf_data_type;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    87
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    88
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
    89
enum grfspec_feature {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    90
	GSF_TRAIN,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    91
	GSF_ROAD,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    92
	GSF_SHIP,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    93
	GSF_AIRCRAFT,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    94
	GSF_STATION,
2438
f0bf4adbd620 (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
    95
	GSF_CANAL,
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    96
	GSF_BRIDGE,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    97
	GSF_TOWNHOUSE,
3620
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
    98
	GSF_GLOBALVAR,
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
    99
	GSF_INDUSTRYTILES,
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
   100
	GSF_INDUSTRIES,
3620
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
   101
	GSF_CARGOS,
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
   102
	GSF_SOUNDFX,
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
   103
};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   104
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   105
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   106
typedef void (*SpecialSpriteHandler)(byte *buf, int len);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   107
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
   108
static const uint _vehcounts[4] = {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   109
	/* GSF_TRAIN */    NUM_TRAIN_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   110
	/* GSF_ROAD */     NUM_ROAD_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   111
	/* GSF_SHIP */     NUM_SHIP_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   112
	/* GSF_AIRCRAFT */ NUM_AIRCRAFT_ENGINES
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   113
};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   114
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
   115
static const uint _vehshifts[4] = {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   116
	/* GSF_TRAIN */    0,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   117
	/* GSF_ROAD */     ROAD_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   118
	/* GSF_SHIP */     SHIP_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   119
	/* GSF_AIRCRAFT */ AIRCRAFT_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   120
};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   121
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   122
enum {
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   123
	MAX_STATIONS = 256,
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   124
};
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   125
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
   126
static uint16 cargo_allowed[TOTAL_NUM_ENGINES];
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
   127
static uint16 cargo_disallowed[TOTAL_NUM_ENGINES];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   128
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
   129
/* Contains the GRF ID of the owner of a vehicle if it has been reserved */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
   130
static uint32 _grm_engines[TOTAL_NUM_ENGINES];
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
   131
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   132
/** DEBUG() function dedicated to newGRF debugging messages
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   133
 * Function is essentialy the same as DEBUG(grf, severity, ...) with the
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   134
 * addition of file:line information when parsing grf files.
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   135
 * NOTE: for the above reason(s) grfmsg() should ONLY be used for
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   136
 * loading/parsing grf files, not for runtime debug messages as there
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   137
 * is no file information available during that time.
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   138
 * @param severity debugging severity level, see debug.h
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   139
 * @param debugging message in printf() format */
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   140
void CDECL grfmsg(int severity, const char *str, ...)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   141
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   142
	char buf[1024];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   143
	va_list va;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   144
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   145
	va_start(va, str);
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   146
	vsnprintf(buf, sizeof(buf), str, va);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   147
	va_end(va);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   148
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   149
	DEBUG(grf, severity, "[%s:%d] %s", _cur_grfconfig->filename, _nfo_line, buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   150
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   151
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
   152
static inline bool check_length(int real, int wanted, const char *str)
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
   153
{
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
   154
	if (real >= wanted) return true;
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
   155
	grfmsg(0, "%s: Invalid pseudo sprite length %d (expected %d)!", str, real, wanted);
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
   156
	return false;
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
   157
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   158
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 490
diff changeset
   159
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
   160
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   161
	return *(*buf)++;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   162
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   163
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   164
static uint16 grf_load_word(byte **buf)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   165
{
3711
431475cbb208 (svn r4654) - Fix [NewGRF]: Properly read in the GRFID. This fixes GRFID checking and activation/deactivation. Do swap the GRFID for displaying purposes.
Darkvater
parents: 3709
diff changeset
   166
	uint16 val = grf_load_byte(buf);
431475cbb208 (svn r4654) - Fix [NewGRF]: Properly read in the GRFID. This fixes GRFID checking and activation/deactivation. Do swap the GRFID for displaying purposes.
Darkvater
parents: 3709
diff changeset
   167
	return val | (grf_load_byte(buf) << 8);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   168
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   169
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   170
static uint16 grf_load_extended(byte** buf)
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   171
{
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   172
	uint16 val;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   173
	val = grf_load_byte(buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   174
	if (val == 0xFF) val = grf_load_word(buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   175
	return val;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   176
}
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   177
2324
23ac249f4c70 (svn r2850) [newgrf] Patch from peter1139
miham
parents: 2204
diff changeset
   178
static uint32 grf_load_dword(byte **buf)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   179
{
3711
431475cbb208 (svn r4654) - Fix [NewGRF]: Properly read in the GRFID. This fixes GRFID checking and activation/deactivation. Do swap the GRFID for displaying purposes.
Darkvater
parents: 3709
diff changeset
   180
	uint32 val = grf_load_word(buf);
431475cbb208 (svn r4654) - Fix [NewGRF]: Properly read in the GRFID. This fixes GRFID checking and activation/deactivation. Do swap the GRFID for displaying purposes.
Darkvater
parents: 3709
diff changeset
   181
	return val | (grf_load_word(buf) << 16);
452
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
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   184
static uint32 grf_load_var(byte size, byte **buf)
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   185
{
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   186
	switch (size) {
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   187
		case 1: return grf_load_byte(buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   188
		case 2: return grf_load_word(buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   189
		case 4: return grf_load_dword(buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   190
		default:
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   191
			NOT_REACHED();
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   192
			return 0;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   193
	}
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   194
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   195
6090
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   196
static const char *grf_load_string(byte **buf, size_t max_len)
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   197
{
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   198
	const char *string   = *(const char **)buf;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   199
	size_t string_length = ttd_strnlen(string, max_len);
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   200
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   201
	if (string_length == max_len) {
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   202
		/* String was not NUL terminated, so make sure it is now. */
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   203
		(*buf)[string_length - 1] = '\0';
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   204
		grfmsg(7, "String was not terminated with a zero byte.");
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   205
	} else {
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   206
		/* Increase the string length to include the NUL byte. */
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   207
		string_length++;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   208
	}
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   209
	*buf += string_length;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   210
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   211
	return string;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   212
}
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   213
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   214
static GRFFile *GetFileByGRFID(uint32 grfid)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   215
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   216
	GRFFile *file;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   217
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   218
	for (file = _first_grffile; file != NULL; file = file->next) {
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   219
		if (file->grfid == grfid) break;
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   220
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   221
	return file;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   222
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   223
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   224
static GRFFile *GetFileByFilename(const char *filename)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   225
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   226
	GRFFile *file;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   227
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   228
	for (file = _first_grffile; file != NULL; file = file->next) {
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   229
		if (strcmp(file->filename, filename) == 0) break;
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   230
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   231
	return file;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   232
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   233
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   234
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   235
/** Used when setting an object's property to map to the GRF's strings
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   236
 * while taking in consideration the "drift" between TTDPatch string system and OpenTTD's one
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   237
 * @param str StringID that we want to have the equivalent in OoenTTD
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   238
 * @return the properly adjusted StringID
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   239
 */
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   240
static StringID MapGRFStringID(uint32 grfid, StringID str)
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   241
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   242
	/* 0xD0 and 0xDC stand for all the TextIDs in the range
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   243
	 * of 0xD000 (misc graphics texts) and 0xDC00 (misc persistent texts).
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   244
	 * These strings are unique to each grf file, and thus require to be used with the
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   245
	 * grfid in which they are declared */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   246
	if (GB(str, 8, 8) == 0xD0 || GB(str, 8, 8) == 0xDC) {
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   247
		return GetGRFStringID(grfid, str);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   248
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   249
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   250
	/* We have some changes in our cargo strings, resulting in some missing. */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   251
	if (str >= 0x006E && str <= 0x008D) return str - 0x20;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   252
	if (str >= 0x008E && str <= 0x00AD) return str - 0x20;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   253
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   254
	/* Map building names according to our lang file changes
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   255
	 * 0x200F = Tall Office Block, first house name in the original data, the one that TTDPatch stil uses
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   256
	 * 0x201F = Old houses is the last house name.
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   257
	 * OpenTTD does not have exactly the same order aymore, so, the code below allows
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   258
	 * to compensate for the difference */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   259
	if (str >= 0x200F && str <= 0x201F) return str + (STR_200F_TALL_OFFICE_BLOCK - 0x200F);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   260
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   261
	return str;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   262
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   263
6375
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   264
static uint8 MapDOSColour(uint8 colour)
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   265
{
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   266
	if (_use_dos_palette) return colour;
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   267
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   268
	if (colour < 10) {
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   269
		static uint8 dos_to_win_colour_map[] = { 0, 215, 216, 136, 88, 106, 32, 33, 40, 245 };
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   270
		return dos_to_win_colour_map[colour];
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   271
	}
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   272
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   273
	if (colour >= 245 && colour < 254) return colour - 28;
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   274
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   275
	return colour;
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   276
}
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   277
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   278
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   279
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
   280
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   281
#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
   282
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   283
static void dewagonize(int condition, int engine)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   284
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   285
	EngineInfo *ei = &_engine_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   286
	RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   287
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   288
	if (condition != 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   289
		ei->unk2 &= ~0x80;
6030
0415afaa9ac1 (svn r8753) -Regression (r8455): Do not unilateraly decide that this engine is a single-headed. Only do it if it previously had no power and that now there is. Or something...
belugas
parents: 5972
diff changeset
   290
		if (rvi->railveh_type == RAILVEH_WAGON)
0415afaa9ac1 (svn r8753) -Regression (r8455): Do not unilateraly decide that this engine is a single-headed. Only do it if it previously had no power and that now there is. Or something...
belugas
parents: 5972
diff changeset
   291
			rvi->railveh_type = RAILVEH_SINGLEHEAD;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   292
	} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   293
		ei->unk2 |= 0x80;
5868
94430141c189 (svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified.
belugas
parents: 5855
diff changeset
   294
		rvi->railveh_type = RAILVEH_WAGON;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   295
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   296
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   297
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   298
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
   299
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   300
	EngineInfo *ei = &_engine_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   301
	RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   302
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   303
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   304
	bool ret = false;
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
	switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   307
		case 0x05: // Track type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   308
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   309
				uint8 tracktype = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   310
3026
7bbf6cbf3749 (svn r3606) - NewGRF: Convert from TTDP railtype values to our own railtypes. (These are currently the same, but won't be forever...)
peter1138
parents: 3023
diff changeset
   311
				switch (tracktype) {
5763
a6029daa547f (svn r8314) -Fix
tron
parents: 5668
diff changeset
   312
					case 0: rvi[i].railtype = rvi[i].engclass == 2 ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL; break;
a6029daa547f (svn r8314) -Fix
tron
parents: 5668
diff changeset
   313
					case 1: rvi[i].railtype = RAILTYPE_MONO; break;
a6029daa547f (svn r8314) -Fix
tron
parents: 5668
diff changeset
   314
					case 2: rvi[i].railtype = RAILTYPE_MAGLEV; break;
3026
7bbf6cbf3749 (svn r3606) - NewGRF: Convert from TTDP railtype values to our own railtypes. (These are currently the same, but won't be forever...)
peter1138
parents: 3023
diff changeset
   315
					default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   316
						grfmsg(1, "RailVehicleChangeInfo: Invalid track type %d specified, ignoring", tracktype);
3026
7bbf6cbf3749 (svn r3606) - NewGRF: Convert from TTDP railtype values to our own railtypes. (These are currently the same, but won't be forever...)
peter1138
parents: 3023
diff changeset
   317
						break;
7bbf6cbf3749 (svn r3606) - NewGRF: Convert from TTDP railtype values to our own railtypes. (These are currently the same, but won't be forever...)
peter1138
parents: 3023
diff changeset
   318
				}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   319
			}
3026
7bbf6cbf3749 (svn r3606) - NewGRF: Convert from TTDP railtype values to our own railtypes. (These are currently the same, but won't be forever...)
peter1138
parents: 3023
diff changeset
   320
			break;
7bbf6cbf3749 (svn r3606) - NewGRF: Convert from TTDP railtype values to our own railtypes. (These are currently the same, but won't be forever...)
peter1138
parents: 3023
diff changeset
   321
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   322
		case 0x08: // AI passenger service
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   323
			/* @todo missing feature */
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   324
			FOR_EACH_OBJECT grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   325
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   326
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   327
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   328
		case 0x09: // Speed (1 unit is 1 kmh)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   329
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   330
				uint16 speed = grf_load_word(&buf);
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   331
				if (speed == 0xFFFF) speed = 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   332
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   333
				rvi[i].max_speed = speed;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   334
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   335
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   336
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   337
		case 0x0B: // Power
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   338
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   339
				uint16 power = grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   340
5868
94430141c189 (svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified.
belugas
parents: 5855
diff changeset
   341
				if (rvi[i].railveh_type == RAILVEH_MULTIHEAD) power /= 2;
1894
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   342
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   343
				rvi[i].power = power;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   344
				dewagonize(power, engine + i);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   345
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   346
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   347
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   348
		case 0x0D: // Running cost factor
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   349
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   350
				uint8 runcostfact = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   351
5868
94430141c189 (svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified.
belugas
parents: 5855
diff changeset
   352
				if (rvi[i].railveh_type == RAILVEH_MULTIHEAD) runcostfact /= 2;
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   353
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   354
				rvi[i].running_cost_base = runcostfact;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   355
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   356
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   357
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   358
		case 0x0E: // Running cost base
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   359
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   360
				uint32 base = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   361
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   362
				switch (base) {
2840
9038b4ab8c9a (svn r3388) - NewGRF: Allow train running cost class to differ from engine class. Also fix typo in r3384.
peter1138
parents: 2838
diff changeset
   363
					case 0x4C30: rvi[i].running_cost_class = 0; break;
9038b4ab8c9a (svn r3388) - NewGRF: Allow train running cost class to differ from engine class. Also fix typo in r3384.
peter1138
parents: 2838
diff changeset
   364
					case 0x4C36: rvi[i].running_cost_class = 1; break;
9038b4ab8c9a (svn r3388) - NewGRF: Allow train running cost class to differ from engine class. Also fix typo in r3384.
peter1138
parents: 2838
diff changeset
   365
					case 0x4C3C: rvi[i].running_cost_class = 2; break;
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   366
					case 0: break; // Used by wagons
5324
d5b8b676aee9 (svn r7485) -Codechange: [NewGRF] Add debug warning for unsupported running cost bases for rail vehicles.
peter1138
parents: 5317
diff changeset
   367
					default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   368
						grfmsg(1, "RailVehicleChangeInfo: Unsupported running cost base 0x%04X, ignoring", base);
5324
d5b8b676aee9 (svn r7485) -Codechange: [NewGRF] Add debug warning for unsupported running cost bases for rail vehicles.
peter1138
parents: 5317
diff changeset
   369
						break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   370
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   371
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   372
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   373
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   374
		case 0x12: // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   375
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   376
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   377
2895
8e15f64c4934 (svn r3449) - NewGRF Fix: When changing the sprite ID of a vehicle, if it is not FD (custom graphics), the value needs to changed from a 16bit array offset to an array index. (fixes tropicstw.grf)
peter1138
parents: 2876
diff changeset
   378
				/* TTD sprite IDs point to a location in a 16bit array, but we use it
8e15f64c4934 (svn r3449) - NewGRF Fix: When changing the sprite ID of a vehicle, if it is not FD (custom graphics), the value needs to changed from a 16bit array offset to an array index. (fixes tropicstw.grf)
peter1138
parents: 2876
diff changeset
   379
				 * as an array index, so we need it to be half the original value. */
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   380
				if (spriteid < 0xFD) spriteid >>= 1;
2895
8e15f64c4934 (svn r3449) - NewGRF Fix: When changing the sprite ID of a vehicle, if it is not FD (custom graphics), the value needs to changed from a 16bit array offset to an array index. (fixes tropicstw.grf)
peter1138
parents: 2876
diff changeset
   381
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   382
				rvi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   383
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   384
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   385
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   386
		case 0x13: // Dual-headed
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   387
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   388
				uint8 dual = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   389
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   390
				if (dual != 0) {
5868
94430141c189 (svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified.
belugas
parents: 5855
diff changeset
   391
					if (rvi[i].railveh_type != RAILVEH_MULTIHEAD) {
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   392
						// adjust power and running cost if needed
1894
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   393
						rvi[i].power /= 2;
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   394
						rvi[i].running_cost_base /= 2;
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   395
					}
5868
94430141c189 (svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified.
belugas
parents: 5855
diff changeset
   396
					rvi[i].railveh_type = RAILVEH_MULTIHEAD;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   397
				} else {
5868
94430141c189 (svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified.
belugas
parents: 5855
diff changeset
   398
					if (rvi[i].railveh_type == RAILVEH_MULTIHEAD) {
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   399
						// adjust power and running cost if needed
1894
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   400
						rvi[i].power *= 2;
2840
9038b4ab8c9a (svn r3388) - NewGRF: Allow train running cost class to differ from engine class. Also fix typo in r3384.
peter1138
parents: 2838
diff changeset
   401
						rvi[i].running_cost_base *= 2;
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   402
					}
5875
fabb49e65684 (svn r8465) -Regression (r8455): Switching from dual to single head should switch to wagon if power is zero. .Or something.
peter1138
parents: 5868
diff changeset
   403
					rvi[i].railveh_type = rvi[i].power == 0 ?
fabb49e65684 (svn r8465) -Regression (r8455): Switching from dual to single head should switch to wagon if power is zero. .Or something.
peter1138
parents: 5868
diff changeset
   404
						RAILVEH_WAGON : RAILVEH_SINGLEHEAD;
452
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
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   407
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   408
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   409
		case 0x14: // Cargo capacity
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   410
			FOR_EACH_OBJECT rvi[i].capacity = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   411
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   412
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   413
		case 0x15: // Cargo type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   414
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   415
				uint8 ctype = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   416
6280
977a42059676 (svn r9092) -Codechange: (NewGRF) (re r8885) Also set cargo type as invalid if the chosen type is not available in the current climate.
peter1138
parents: 6259
diff changeset
   417
				if (ctype < NUM_CARGO && HASBIT(_cargo_mask, ctype)) {
2846
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   418
					rvi[i].cargo_type = ctype;
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   419
				} else {
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
   420
					rvi[i].cargo_type = CT_INVALID;
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
   421
					grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
2846
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   422
				}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   423
			}
3023
d651099f7b18 (svn r3603) - NewGRF: Support loading of AI rank data
peter1138
parents: 3006
diff changeset
   424
			break;
d651099f7b18 (svn r3603) - NewGRF: Support loading of AI rank data
peter1138
parents: 3006
diff changeset
   425
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   426
		case 0x16: // Weight
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   427
			FOR_EACH_OBJECT SB(rvi[i].weight, 0, 8, grf_load_byte(&buf));
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   428
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   429
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   430
		case 0x17: // Cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   431
			FOR_EACH_OBJECT rvi[i].base_cost = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   432
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   433
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   434
		case 0x18: // AI rank
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   435
			FOR_EACH_OBJECT rvi[i].ai_rank = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   436
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   437
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   438
		case 0x19: // Engine traction type
2838
abfaee414ae7 (svn r3386) - NewGRF: Small comment update, and fix for possible issue with engine class not getting set.
peter1138
parents: 2836
diff changeset
   439
			/* What do the individual numbers mean?
abfaee414ae7 (svn r3386) - NewGRF: Small comment update, and fix for possible issue with engine class not getting set.
peter1138
parents: 2836
diff changeset
   440
			 * 0x00 .. 0x07: Steam
abfaee414ae7 (svn r3386) - NewGRF: Small comment update, and fix for possible issue with engine class not getting set.
peter1138
parents: 2836
diff changeset
   441
			 * 0x08 .. 0x27: Diesel
abfaee414ae7 (svn r3386) - NewGRF: Small comment update, and fix for possible issue with engine class not getting set.
peter1138
parents: 2836
diff changeset
   442
			 * 0x28 .. 0x31: Electric
abfaee414ae7 (svn r3386) - NewGRF: Small comment update, and fix for possible issue with engine class not getting set.
peter1138
parents: 2836
diff changeset
   443
			 * 0x32 .. 0x37: Monorail
abfaee414ae7 (svn r3386) - NewGRF: Small comment update, and fix for possible issue with engine class not getting set.
peter1138
parents: 2836
diff changeset
   444
			 * 0x38 .. 0x41: Maglev
abfaee414ae7 (svn r3386) - NewGRF: Small comment update, and fix for possible issue with engine class not getting set.
peter1138
parents: 2836
diff changeset
   445
			 */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   446
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   447
				uint8 traction = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   448
				int engclass;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   449
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   450
				if (traction <= 0x07) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   451
					engclass = 0;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   452
				} else if (traction <= 0x27) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   453
					engclass = 1;
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3095
diff changeset
   454
				} else if (traction <= 0x31) {
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3095
diff changeset
   455
					engclass = 2;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   456
				} else if (traction <= 0x41) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   457
					engclass = 2;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   458
				} else {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   459
					break;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   460
				}
5763
a6029daa547f (svn r8314) -Fix
tron
parents: 5668
diff changeset
   461
				if (rvi[i].railtype == RAILTYPE_RAIL     && engclass == 2) rvi[i].railtype = RAILTYPE_ELECTRIC;
a6029daa547f (svn r8314) -Fix
tron
parents: 5668
diff changeset
   462
				if (rvi[i].railtype == RAILTYPE_ELECTRIC && engclass != 2) rvi[i].railtype = RAILTYPE_RAIL;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   463
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   464
				rvi[i].engclass = engclass;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   465
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   466
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   467
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   468
		case 0x1A: // Alter purchase list sort order
2971
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   469
			FOR_EACH_OBJECT {
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   470
				EngineID pos = grf_load_byte(&buf);
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   471
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   472
				if (pos < NUM_TRAIN_ENGINES) {
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   473
					AlterRailVehListOrder(engine + i, pos);
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   474
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   475
					grfmsg(2, "RailVehicleChangeInfo: Invalid train engine ID %d, ignoring", pos);
2971
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   476
				}
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   477
			}
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   478
			break;
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   479
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   480
		case 0x1B: // Powered wagons power bonus
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   481
			FOR_EACH_OBJECT rvi[i].pow_wag_power = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   482
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   483
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   484
		case 0x1C: // Refit cost
3997
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   485
			FOR_EACH_OBJECT ei[i].refit_cost = grf_load_byte(&buf);
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   486
			break;
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   487
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   488
		case 0x1D: // Refit cargo
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   489
			FOR_EACH_OBJECT ei[i].refit_mask = grf_load_dword(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   490
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   491
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   492
		case 0x1E: // Callback
3956
92362ba224b7 (svn r5105) - NewGRF: Move callbackmask from *VehicleInfo to EngineInfo. This simplifies code that works with more than one vehicle type.
peter1138
parents: 3924
diff changeset
   493
			FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   494
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   495
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   496
		case 0x1F: // Tractive effort coefficient
5400
bba42ad3223b (svn r7592) -Feature: Add support for tractive effort to 'realistic' acceleration.
peter1138
parents: 5382
diff changeset
   497
			FOR_EACH_OBJECT rvi[i].tractive_effort = grf_load_byte(&buf);
bba42ad3223b (svn r7592) -Feature: Add support for tractive effort to 'realistic' acceleration.
peter1138
parents: 5382
diff changeset
   498
			break;
bba42ad3223b (svn r7592) -Feature: Add support for tractive effort to 'realistic' acceleration.
peter1138
parents: 5382
diff changeset
   499
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   500
		case 0x21: // Shorter vehicle
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   501
			FOR_EACH_OBJECT rvi[i].shorten_factor = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   502
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   503
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   504
		case 0x22: // Visual effect
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   505
			/* see note in engine.h about rvi->visual_effect */
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   506
			FOR_EACH_OBJECT rvi[i].visual_effect = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   507
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   508
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   509
		case 0x23: // Powered wagons weight bonus
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   510
			FOR_EACH_OBJECT rvi[i].pow_wag_weight = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   511
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   512
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   513
		case 0x24: // High byte of vehicle weight
2542
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   514
			FOR_EACH_OBJECT {
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   515
				byte weight = grf_load_byte(&buf);
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   516
2545
aa71b3d576ce (svn r3074) -NewGrf: Fix stupid typo in weight setting.
peter1138
parents: 2542
diff changeset
   517
				if (weight > 4) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   518
					grfmsg(2, "RailVehicleChangeInfo: Nonsensical weight of %d tons, ignoring", weight << 8);
2542
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   519
				} else {
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   520
					SB(rvi[i].weight, 8, 8, weight);
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   521
				}
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   522
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   523
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   524
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   525
		case 0x25: // User-defined bit mask to set when checking veh. var. 42
3862
fe7b57944a39 (svn r4896) - NewGRF: add support for vehicle property 0x25 (user defined data) used by variable 0x42.
peter1138
parents: 3845
diff changeset
   526
			FOR_EACH_OBJECT rvi[i].user_def_data = grf_load_byte(&buf);
fe7b57944a39 (svn r4896) - NewGRF: add support for vehicle property 0x25 (user defined data) used by variable 0x42.
peter1138
parents: 3845
diff changeset
   527
			break;
fe7b57944a39 (svn r4896) - NewGRF: add support for vehicle property 0x25 (user defined data) used by variable 0x42.
peter1138
parents: 3845
diff changeset
   528
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   529
		case 0x27: // Miscellaneous flags
4742
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
   530
			FOR_EACH_OBJECT {
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
   531
				ei[i].misc_flags = grf_load_byte(&buf);
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
   532
				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
   533
			}
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   534
			break;
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   535
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   536
		case 0x28: // Cargo classes allowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   537
			FOR_EACH_OBJECT cargo_allowed[engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   538
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   539
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   540
		case 0x29: // Cargo classes disallowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   541
			FOR_EACH_OBJECT cargo_disallowed[engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   542
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   543
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   544
		case 0x2A: // Long format introduction date (days since year 0)
5114
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   545
			FOR_EACH_OBJECT ei[i].base_intro = grf_load_dword(&buf);
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   546
			break;
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   547
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   548
		/* @todo air drag and retire vehicle early
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   549
		 * Fall-through for unimplemented one byte long properties. */
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   550
		case 0x20: // Air drag
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   551
		case 0x26: // Retire vehicle early
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   552
			FOR_EACH_OBJECT grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   553
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   554
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   555
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   556
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   557
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   558
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   559
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   560
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   561
	return ret;
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
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   564
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
   565
{
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   566
	EngineInfo *ei = &_engine_info[ROAD_ENGINES_INDEX + engine];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   567
	RoadVehicleInfo *rvi = &_road_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   568
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   569
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   570
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   571
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   572
	switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   573
		case 0x08: // Speed (1 unit is 0.5 kmh)
3488
7bf7e30fb865 (svn r4339) - Comment Change: NewGRF, update comments for units of speed
peter1138
parents: 3355
diff changeset
   574
			FOR_EACH_OBJECT rvi[i].max_speed = grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   575
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   576
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   577
		case 0x09: // Running cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   578
			FOR_EACH_OBJECT rvi[i].running_cost = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   579
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   580
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   581
		case 0x0A: // Running cost base
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   582
			/* @todo : I have no idea. --pasky
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   583
			 * I THINK it is used for overriding the base cost of all road vehicle (_price.roadveh_base) --belugas */
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   584
			FOR_EACH_OBJECT grf_load_dword(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   585
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   586
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   587
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   588
		case 0x0E: // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   589
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   590
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   591
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   592
				/* cars have different custom id in the GRF file */
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   593
				if (spriteid == 0xFF) spriteid = 0xFD;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   594
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   595
				if (spriteid < 0xFD) spriteid >>= 1;
2895
8e15f64c4934 (svn r3449) - NewGRF Fix: When changing the sprite ID of a vehicle, if it is not FD (custom graphics), the value needs to changed from a 16bit array offset to an array index. (fixes tropicstw.grf)
peter1138
parents: 2876
diff changeset
   596
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   597
				rvi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   598
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   599
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   600
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   601
		case 0x0F: // Cargo capacity
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   602
			FOR_EACH_OBJECT rvi[i].capacity = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   603
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   604
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   605
		case 0x10: // Cargo type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   606
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   607
				uint8 cargo = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   608
6280
977a42059676 (svn r9092) -Codechange: (NewGRF) (re r8885) Also set cargo type as invalid if the chosen type is not available in the current climate.
peter1138
parents: 6259
diff changeset
   609
				if (cargo < NUM_CARGO && HASBIT(_cargo_mask, cargo)) {
2846
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   610
					rvi[i].cargo_type = cargo;
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   611
				} else {
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
   612
					rvi[i].cargo_type = CT_INVALID;
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
   613
					grfmsg(2, "RoadVehicleChangeInfo: Invalid cargo type %d, using first refittable", cargo);
2846
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   614
				}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   615
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   616
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   617
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   618
		case 0x11: // Cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   619
			FOR_EACH_OBJECT rvi[i].base_cost = grf_load_byte(&buf); // ?? is it base_cost?
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   620
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   621
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   622
		case 0x12: // SFX
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   623
			FOR_EACH_OBJECT rvi[i].sfx = (SoundFx)grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   624
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   625
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   626
		case 0x13: // Power in 10hp
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   627
		case 0x14: // Weight in 1/4 tons
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   628
		case 0x15: // Speed in mph*0.8
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   629
			/* TODO: Support for road vehicles realistic power
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   630
			 * computations (called rvpower in TTDPatch) is just
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   631
			 * missing in OTTD yet. --pasky */
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   632
			FOR_EACH_OBJECT grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   633
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   634
			break;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   635
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   636
		case 0x16: // Cargos available for refitting
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   637
			FOR_EACH_OBJECT ei[i].refit_mask = grf_load_dword(&buf);
3006
6da38dbee2a7 (svn r3586) - NewGRF: Load callback masks for all vehicle types.
peter1138
parents: 2971
diff changeset
   638
			break;
6da38dbee2a7 (svn r3586) - NewGRF: Load callback masks for all vehicle types.
peter1138
parents: 2971
diff changeset
   639
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   640
		case 0x17: // Callback mask
3956
92362ba224b7 (svn r5105) - NewGRF: Move callbackmask from *VehicleInfo to EngineInfo. This simplifies code that works with more than one vehicle type.
peter1138
parents: 3924
diff changeset
   641
			FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   642
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   643
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   644
		case 0x1A: // Refit cost
3997
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   645
			FOR_EACH_OBJECT ei[i].refit_cost = grf_load_byte(&buf);
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   646
			break;
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   647
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   648
		case 0x1C: // Miscellaneous flags
4952
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   649
			FOR_EACH_OBJECT {
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   650
				ei[i].misc_flags = grf_load_byte(&buf);
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   651
				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   652
			}
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   653
			break;
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   654
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   655
		case 0x1D: // Cargo classes allowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   656
			FOR_EACH_OBJECT cargo_allowed[ROAD_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   657
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   658
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   659
		case 0x1E: // Cargo classes disallowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   660
			FOR_EACH_OBJECT cargo_disallowed[ROAD_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   661
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   662
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   663
		case 0x1F: // Long format introduction date (days since year 0)
5114
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   664
			FOR_EACH_OBJECT ei[i].base_intro = grf_load_dword(&buf);
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   665
			break;
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   666
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   667
		case 0x18: // Tractive effort
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   668
		case 0x19: // Air drag
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   669
		case 0x1B: // Retire vehicle early
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   670
			/* @todo */
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   671
			FOR_EACH_OBJECT grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   672
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   673
			break;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   674
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   675
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   676
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   677
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   678
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   679
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   680
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   681
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   682
}
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
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
   685
{
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   686
	EngineInfo *ei = &_engine_info[SHIP_ENGINES_INDEX + engine];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   687
	ShipVehicleInfo *svi = &_ship_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   688
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   689
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   690
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   691
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   692
	//printf("e %x prop %x?\n", engine, prop);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   693
	switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   694
		case 0x08: // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   695
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   696
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   697
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   698
				/* ships have different custom id in the GRF file */
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   699
				if (spriteid == 0xFF) spriteid = 0xFD;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   700
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   701
				if (spriteid < 0xFD) spriteid >>= 1;
2895
8e15f64c4934 (svn r3449) - NewGRF Fix: When changing the sprite ID of a vehicle, if it is not FD (custom graphics), the value needs to changed from a 16bit array offset to an array index. (fixes tropicstw.grf)
peter1138
parents: 2876
diff changeset
   702
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   703
				svi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   704
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   705
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   706
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   707
		case 0x09: // Refittable
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   708
			FOR_EACH_OBJECT svi[i].refittable = (grf_load_byte(&buf) != 0);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   709
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   710
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   711
		case 0x0A: // Cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   712
			FOR_EACH_OBJECT svi[i].base_cost = grf_load_byte(&buf); // ?? is it base_cost?
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   713
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   714
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   715
		case 0x0B: // Speed (1 unit is 0.5 kmh)
3488
7bf7e30fb865 (svn r4339) - Comment Change: NewGRF, update comments for units of speed
peter1138
parents: 3355
diff changeset
   716
			FOR_EACH_OBJECT svi[i].max_speed = grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   717
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   718
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   719
		case 0x0C: // Cargo type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   720
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   721
				uint8 cargo = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   722
6280
977a42059676 (svn r9092) -Codechange: (NewGRF) (re r8885) Also set cargo type as invalid if the chosen type is not available in the current climate.
peter1138
parents: 6259
diff changeset
   723
				if (cargo < NUM_CARGO && HASBIT(_cargo_mask, cargo)) {
2846
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   724
					svi[i].cargo_type = cargo;
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   725
				} else {
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
   726
					svi[i].cargo_type = CT_INVALID;
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
   727
					grfmsg(2, "ShipVehicleChangeInfo: Invalid cargo type %d, using first refittable", cargo);
2846
0972c297c410 (svn r3394) - NewGRF fix: ignore non-climate dependent cargo types. The spec is rather vague on this, but we don't support newcargos anyway.
peter1138
parents: 2840
diff changeset
   728
				}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   729
			}
3006
6da38dbee2a7 (svn r3586) - NewGRF: Load callback masks for all vehicle types.
peter1138
parents: 2971
diff changeset
   730
			break;
6da38dbee2a7 (svn r3586) - NewGRF: Load callback masks for all vehicle types.
peter1138
parents: 2971
diff changeset
   731
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   732
		case 0x0D: // Cargo capacity
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   733
			FOR_EACH_OBJECT svi[i].capacity = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   734
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   735
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   736
		case 0x0F: // Running cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   737
			FOR_EACH_OBJECT svi[i].running_cost = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   738
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   739
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   740
		case 0x10: // SFX
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   741
			FOR_EACH_OBJECT svi[i].sfx = (SoundFx)grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   742
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   743
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   744
		case 0x11: // Cargos available for refitting
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   745
			FOR_EACH_OBJECT ei[i].refit_mask = grf_load_dword(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   746
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   747
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   748
		case 0x12: // Callback mask
3956
92362ba224b7 (svn r5105) - NewGRF: Move callbackmask from *VehicleInfo to EngineInfo. This simplifies code that works with more than one vehicle type.
peter1138
parents: 3924
diff changeset
   749
			FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   750
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   751
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   752
		case 0x13: // Refit cost
3997
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   753
			FOR_EACH_OBJECT ei[i].refit_cost = grf_load_byte(&buf);
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   754
			break;
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   755
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   756
		case 0x17: // Miscellaneous flags
4952
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   757
			FOR_EACH_OBJECT {
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   758
				ei[i].misc_flags = grf_load_byte(&buf);
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   759
				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   760
			}
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   761
			break;
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   762
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   763
		case 0x18: // Cargo classes allowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   764
			FOR_EACH_OBJECT cargo_allowed[SHIP_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   765
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   766
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   767
		case 0x19: // Cargo classes disallowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   768
			FOR_EACH_OBJECT cargo_disallowed[SHIP_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   769
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   770
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   771
		case 0x1A: // Long format introduction date (days since year 0)
5114
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   772
			FOR_EACH_OBJECT ei[i].base_intro = grf_load_dword(&buf);
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   773
			break;
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   774
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   775
		case 0x14: // Ocean speed fraction
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   776
		case 0x15: // Canal speed fraction
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   777
		case 0x16: // Retire vehicle early
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   778
			/* @todo */
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   779
			FOR_EACH_OBJECT grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   780
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   781
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   782
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   783
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   784
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   785
			break;
452
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
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   788
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   789
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   790
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   791
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   792
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
   793
{
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   794
	EngineInfo *ei = &_engine_info[AIRCRAFT_ENGINES_INDEX + engine];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   795
	AircraftVehicleInfo *avi = &_aircraft_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   796
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   797
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   798
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   799
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   800
	//printf("e %x prop %x?\n", engine, prop);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   801
	switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   802
		case 0x08: // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   803
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   804
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   805
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   806
				/* aircraft have different custom id in the GRF file */
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   807
				if (spriteid == 0xFF) spriteid = 0xFD;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   808
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   809
				if (spriteid < 0xFD) spriteid >>= 1;
2895
8e15f64c4934 (svn r3449) - NewGRF Fix: When changing the sprite ID of a vehicle, if it is not FD (custom graphics), the value needs to changed from a 16bit array offset to an array index. (fixes tropicstw.grf)
peter1138
parents: 2876
diff changeset
   810
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   811
				avi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   812
			}
3006
6da38dbee2a7 (svn r3586) - NewGRF: Load callback masks for all vehicle types.
peter1138
parents: 2971
diff changeset
   813
			break;
6da38dbee2a7 (svn r3586) - NewGRF: Load callback masks for all vehicle types.
peter1138
parents: 2971
diff changeset
   814
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   815
		case 0x09: // Helicopter
4926
4b2f470a4355 (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   816
			FOR_EACH_OBJECT {
4b2f470a4355 (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   817
				if (grf_load_byte(&buf) == 0) {
5855
6f273e99a57a (svn r8429) -Codechange: Add a name for AircraftVehicleInfo subtype helicopter and remove some magic numbers related to the subtype.
Darkvater
parents: 5763
diff changeset
   818
					avi[i].subtype = AIR_HELI;
4926
4b2f470a4355 (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   819
				} else {
5855
6f273e99a57a (svn r8429) -Codechange: Add a name for AircraftVehicleInfo subtype helicopter and remove some magic numbers related to the subtype.
Darkvater
parents: 5763
diff changeset
   820
					SB(avi[i].subtype, 0, 1, 1); // AIR_CTOL
4926
4b2f470a4355 (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   821
				}
4b2f470a4355 (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   822
			}
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   823
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   824
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   825
		case 0x0A: // Large
5855
6f273e99a57a (svn r8429) -Codechange: Add a name for AircraftVehicleInfo subtype helicopter and remove some magic numbers related to the subtype.
Darkvater
parents: 5763
diff changeset
   826
			FOR_EACH_OBJECT SB(avi[i].subtype, 1, 1, (grf_load_byte(&buf) != 0 ? 1 : 0)); // AIR_FAST
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   827
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   828
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   829
		case 0x0B: // Cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   830
			FOR_EACH_OBJECT avi[i].base_cost = grf_load_byte(&buf); // ?? is it base_cost?
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   831
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   832
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   833
		case 0x0C: // Speed (1 unit is 8 mph, we translate to 1 unit is 1 km/h)
6193
6f20de9e4f1b (svn r8973) -Feature/Codechange: Changed the internal unit for aircraft velocities to from 8mph to 1km/h (peter1138), also give aircraft realsitic velocities (so that 1km/h is 1km/h independent of vehicle type) (peter1138). Introduce a flag to reduce aircraft speed in holding patterns to some realistic velocity. Use this flag for the city airport for the time being and make use of the different entry points for this airport type.
celestar
parents: 6186
diff changeset
   834
			FOR_EACH_OBJECT avi[i].max_speed = (grf_load_byte(&buf) * 129) / 10;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   835
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   836
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   837
		case 0x0D: // Acceleration
6193
6f20de9e4f1b (svn r8973) -Feature/Codechange: Changed the internal unit for aircraft velocities to from 8mph to 1km/h (peter1138), also give aircraft realsitic velocities (so that 1km/h is 1km/h independent of vehicle type) (peter1138). Introduce a flag to reduce aircraft speed in holding patterns to some realistic velocity. Use this flag for the city airport for the time being and make use of the different entry points for this airport type.
celestar
parents: 6186
diff changeset
   838
			FOR_EACH_OBJECT avi[i].acceleration = (grf_load_byte(&buf) * 129) / 10;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   839
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   840
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   841
		case 0x0E: // Running cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   842
			FOR_EACH_OBJECT avi[i].running_cost = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   843
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   844
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   845
		case 0x0F: // Passenger capacity
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   846
			FOR_EACH_OBJECT avi[i].passenger_capacity = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   847
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   848
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   849
		case 0x11: // Mail capacity
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   850
			FOR_EACH_OBJECT avi[i].mail_capacity = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   851
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   852
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   853
		case 0x12: // SFX
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   854
			FOR_EACH_OBJECT avi[i].sfx = (SoundFx)grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   855
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   856
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   857
		case 0x13: // Cargos available for refitting
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   858
			FOR_EACH_OBJECT ei[i].refit_mask = grf_load_dword(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   859
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   860
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   861
		case 0x14: // Callback mask
3956
92362ba224b7 (svn r5105) - NewGRF: Move callbackmask from *VehicleInfo to EngineInfo. This simplifies code that works with more than one vehicle type.
peter1138
parents: 3924
diff changeset
   862
			FOR_EACH_OBJECT ei[i].callbackmask = grf_load_byte(&buf);
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   863
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   864
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   865
		case 0x15: // Refit cost
3997
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   866
			FOR_EACH_OBJECT ei[i].refit_cost = grf_load_byte(&buf);
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   867
			break;
8a997effbcec (svn r5201) - NewGRF: add loading of default refit costs. This information is not yet used
peter1138
parents: 3956
diff changeset
   868
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   869
		case 0x17: // Miscellaneous flags
4952
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   870
			FOR_EACH_OBJECT {
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   871
				ei[i].misc_flags = grf_load_byte(&buf);
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   872
				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
9c45131d0657 (svn r6946) - Fix (r6654): This applies to all vehicle types, not just rail vehicles... (mart3p)
peter1138
parents: 4926
diff changeset
   873
			}
3095
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   874
			break;
19084629d27a (svn r3684) - NewGRF: Support loading of miscellaneous flags (not used yet)
peter1138
parents: 3089
diff changeset
   875
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   876
		case 0x18: // Cargo classes allowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   877
			FOR_EACH_OBJECT cargo_allowed[AIRCRAFT_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   878
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   879
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   880
		case 0x19: // Cargo classes disallowed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   881
			FOR_EACH_OBJECT cargo_disallowed[AIRCRAFT_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   882
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   883
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   884
		case 0x1A: // Long format introduction date (days since year 0)
5114
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   885
			FOR_EACH_OBJECT ei[i].base_intro = grf_load_dword(&buf);
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   886
			break;
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
   887
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   888
		case 0x16: // Retire vehicle early
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   889
			/* @todo */
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   890
			FOR_EACH_OBJECT grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   891
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   892
			break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   893
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   894
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   895
			ret = true;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
   896
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   897
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   898
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   899
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   900
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   901
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   902
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   903
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
   904
{
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   905
	StationSpec **statspec;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   906
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   907
	int i;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
   908
	bool ret = false;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   909
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   910
	if (stid + numinfo > MAX_STATIONS) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   911
		grfmsg(1, "StationChangeInfo: Station %u is invalid, max %u, ignoring", stid + numinfo, MAX_STATIONS);
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   912
		return false;
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   913
	}
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   914
3501
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
   915
	/* Allocate station specs if necessary */
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
   916
	if (_cur_grffile->stations == NULL) _cur_grffile->stations = CallocT<StationSpec*>(MAX_STATIONS);
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   917
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   918
	statspec = &_cur_grffile->stations[stid];
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   919
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   920
	if (prop != 0x08) {
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   921
		/* Check that all stations we are modifying are defined. */
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   922
		FOR_EACH_OBJECT {
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   923
			if (statspec[i] == NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   924
				grfmsg(2, "StationChangeInfo: Attempt to modify undefined station %u, ignoring", stid + i);
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   925
				return false;
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   926
			}
3501
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
   927
		}
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
   928
	}
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
   929
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   930
	switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   931
		case 0x08: // Class ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   932
			FOR_EACH_OBJECT {
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   933
				/* Property 0x08 is special; it is where the station is allocated */
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
   934
				if (statspec[i] == NULL) statspec[i] = CallocT<StationSpec>(1);
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   935
3711
431475cbb208 (svn r4654) - Fix [NewGRF]: Properly read in the GRFID. This fixes GRFID checking and activation/deactivation. Do swap the GRFID for displaying purposes.
Darkvater
parents: 3709
diff changeset
   936
				/* Swap classid because we read it in BE meaning WAYP or DFLT */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
   937
				uint32 classid = grf_load_dword(&buf);
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   938
				statspec[i]->sclass = AllocateStationClass(BSWAP32(classid));
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   939
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   940
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
   941
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   942
		case 0x09: // Define sprite layout
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   943
			FOR_EACH_OBJECT {
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   944
				StationSpec *statspec = _cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   945
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
   946
				statspec->tiles = grf_load_extended(&buf);
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
   947
				statspec->renderdata = CallocT<DrawTileSprites>(statspec->tiles);
3740
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
   948
				statspec->copied_renderdata = false;
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
   949
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
   950
				for (uint t = 0; t < statspec->tiles; t++) {
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
   951
					DrawTileSprites *dts = &statspec->renderdata[t];
3570
707f93772b0a (svn r4452) - NewGRF: switch to unsigned ints for array indices.
peter1138
parents: 3566
diff changeset
   952
					uint seq_count = 0;
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
   953
3737
1e4df4eb9298 (svn r4719) - Newstations: instead of drawing nothing, fall back to the default sprite layout if a station layout specifies so.
peter1138
parents: 3736
diff changeset
   954
					dts->seq = NULL;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   955
					dts->ground_sprite = grf_load_word(&buf);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   956
					dts->ground_pal = grf_load_word(&buf);
3775
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3771
diff changeset
   957
					if (dts->ground_sprite == 0) continue;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   958
					if (HASBIT(dts->ground_pal, 15)) {
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   959
						CLRBIT(dts->ground_pal, 15);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   960
						SETBIT(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   961
					}
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
   962
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   963
					while (buf < *bufp + len) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   964
						DrawTileSeqStruct *dtss;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   965
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   966
						/* no relative bounding box support */
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
   967
						dts->seq = ReallocT((DrawTileSeqStruct*)dts->seq, ++seq_count);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   968
						dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   969
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   970
						dtss->delta_x = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   971
						if ((byte) dtss->delta_x == 0x80) break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   972
						dtss->delta_y = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   973
						dtss->delta_z = grf_load_byte(&buf);
4230
f4e93251e2f6 (svn r5787) Rename width, height and unk of struct DrawTileSeqStruct to size_{x,y,z}
tron
parents: 4201
diff changeset
   974
						dtss->size_x = grf_load_byte(&buf);
f4e93251e2f6 (svn r5787) Rename width, height and unk of struct DrawTileSeqStruct to size_{x,y,z}
tron
parents: 4201
diff changeset
   975
						dtss->size_y = grf_load_byte(&buf);
f4e93251e2f6 (svn r5787) Rename width, height and unk of struct DrawTileSeqStruct to size_{x,y,z}
tron
parents: 4201
diff changeset
   976
						dtss->size_z = grf_load_byte(&buf);
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   977
						dtss->image = grf_load_word(&buf);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   978
						dtss->pal = grf_load_word(&buf);
3771
9bce8ac706b2 (svn r4763) - Newstations: revert r4762, instead map bit the palette modifier from bit 14 to bit 31 on GRF load.
peter1138
parents: 3768
diff changeset
   979
3775
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3771
diff changeset
   980
						/* Remap flags as ours collide */
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   981
						if (HASBIT(dtss->pal, 15)) {
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   982
							CLRBIT(dtss->pal, 15);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   983
							SETBIT(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   984
						}
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   985
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   986
						if (HASBIT(dtss->image, 15)) {
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   987
							CLRBIT(dtss->image, 15);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   988
							SETBIT(dtss->image, PALETTE_MODIFIER_COLOR);
3775
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3771
diff changeset
   989
						}
3771
9bce8ac706b2 (svn r4763) - Newstations: revert r4762, instead map bit the palette modifier from bit 14 to bit 31 on GRF load.
peter1138
parents: 3768
diff changeset
   990
						if (HASBIT(dtss->image, 14)) {
9bce8ac706b2 (svn r4763) - Newstations: revert r4762, instead map bit the palette modifier from bit 14 to bit 31 on GRF load.
peter1138
parents: 3768
diff changeset
   991
							CLRBIT(dtss->image, 14);
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   992
							SETBIT(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
3771
9bce8ac706b2 (svn r4763) - Newstations: revert r4762, instead map bit the palette modifier from bit 14 to bit 31 on GRF load.
peter1138
parents: 3768
diff changeset
   993
						}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   994
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   995
				}
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
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
   998
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   999
		case 0x0A: // Copy sprite layout
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1000
			FOR_EACH_OBJECT {
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1001
				StationSpec *statspec = _cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1002
				byte srcid = grf_load_byte(&buf);
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1003
				const StationSpec *srcstatspec = _cur_grffile->stations[srcid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1004
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1005
				statspec->tiles = srcstatspec->tiles;
3738
4694e7a0e2e4 (svn r4720) - Newstations: instead of literally copying sprite layout data, just copy the pointer to the existing data.
peter1138
parents: 3737
diff changeset
  1006
				statspec->renderdata = srcstatspec->renderdata;
3740
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  1007
				statspec->copied_renderdata = true;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1008
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1009
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1010
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1011
		case 0x0B: // Callback mask
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1012
			FOR_EACH_OBJECT statspec[i]->callbackmask = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1013
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1014
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1015
		case 0x0C: // Disallowed number of platforms
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1016
			FOR_EACH_OBJECT statspec[i]->disallowed_platforms = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1017
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1018
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1019
		case 0x0D: // Disallowed platform lengths
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1020
			FOR_EACH_OBJECT statspec[i]->disallowed_lengths = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1021
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1022
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1023
		case 0x0E: // Define custom layout
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1024
			FOR_EACH_OBJECT {
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1025
				StationSpec *statspec = _cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1026
5060
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1027
				statspec->copied_layouts = false;
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1028
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1029
				while (buf < *bufp + len) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1030
					byte length = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1031
					byte number = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1032
					StationLayout layout;
3570
707f93772b0a (svn r4452) - NewGRF: switch to unsigned ints for array indices.
peter1138
parents: 3566
diff changeset
  1033
					uint l, p;
452
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
					if (length == 0 || number == 0) break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1036
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1037
					//debug("l %d > %d ?", length, stat->lengths);
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1038
					if (length > statspec->lengths) {
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  1039
						statspec->platforms = ReallocT(statspec->platforms, length);
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1040
						memset(statspec->platforms + statspec->lengths, 0, length - statspec->lengths);
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1041
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  1042
						statspec->layouts = ReallocT(statspec->layouts, length);
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1043
						memset(statspec->layouts + statspec->lengths, 0,
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1044
						       (length - statspec->lengths) * sizeof(*statspec->layouts));
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1045
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1046
						statspec->lengths = length;
452
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
					l = length - 1; // index is zero-based
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1049
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1050
					//debug("p %d > %d ?", number, stat->platforms[l]);
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1051
					if (number > statspec->platforms[l]) {
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  1052
						statspec->layouts[l] = ReallocT(statspec->layouts[l], number);
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1053
						/* We expect NULL being 0 here, but C99 guarantees that. */
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1054
						memset(statspec->layouts[l] + statspec->platforms[l], 0,
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1055
						       (number - statspec->platforms[l]) * sizeof(**statspec->layouts));
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1056
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1057
						statspec->platforms[l] = number;
452
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
542
de27e74b11bd (svn r939) -Fix: Fixed compiler errors
truelight
parents: 536
diff changeset
  1060
					p = 0;
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  1061
					layout = MallocT<byte>(length * number);
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1062
					for (l = 0; l < length; l++) {
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1063
						for (p = 0; p < number; p++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1064
							layout[l * number + p] = grf_load_byte(&buf);
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1065
						}
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1066
					}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1067
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1068
					l--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1069
					p--;
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1070
					free(statspec->layouts[l][p]);
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1071
					statspec->layouts[l][p] = layout;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1072
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1073
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1074
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1075
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1076
		case 0x0F: // Copy custom layout
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1077
			FOR_EACH_OBJECT {
5060
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1078
				StationSpec *statspec = _cur_grffile->stations[stid + i];
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1079
				byte srcid = grf_load_byte(&buf);
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1080
				const StationSpec *srcstatspec = _cur_grffile->stations[srcid];
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1081
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1082
				statspec->lengths   = srcstatspec->lengths;
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1083
				statspec->platforms = srcstatspec->platforms;
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1084
				statspec->layouts   = srcstatspec->layouts;
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1085
				statspec->copied_layouts = true;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1086
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1087
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1088
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1089
		case 0x10: // Little/lots cargo threshold
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1090
			FOR_EACH_OBJECT statspec[i]->cargo_threshold = grf_load_word(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1091
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1092
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1093
		case 0x11: // Pylon placement
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1094
			FOR_EACH_OBJECT statspec[i]->pylons = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1095
			break;
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1096
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1097
		case 0x12: // Cargo types for random triggers
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1098
			FOR_EACH_OBJECT statspec[i]->cargo_triggers = grf_load_dword(&buf);
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1099
			break;
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1100
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1101
		case 0x13: // General flags
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1102
			FOR_EACH_OBJECT statspec[i]->flags = grf_load_byte(&buf);
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1103
			break;
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1104
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1105
		case 0x14: // Overhead wire placement
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1106
			FOR_EACH_OBJECT statspec[i]->wires = grf_load_byte(&buf);
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1107
			break;
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1108
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1109
		case 0x15: // Blocked tiles
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  1110
			FOR_EACH_OBJECT statspec[i]->blocked = grf_load_byte(&buf);
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1111
			break;
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1112
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1113
		case 0x16: // @todo Animation info
5903
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1114
			FOR_EACH_OBJECT grf_load_word(&buf);
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1115
			ret = true;
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1116
			break;
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1117
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1118
		case 0x17: // @todo Animation speed
5903
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1119
			FOR_EACH_OBJECT grf_load_byte(&buf);
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1120
			ret = true;
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1121
			break;
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1122
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1123
		case 0x18: // @todo Animation triggers
5903
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1124
			FOR_EACH_OBJECT grf_load_word(&buf);
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1125
			ret = true;
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1126
			break;
2bb5b340115b (svn r8526) -Codechange: add stubs for unsupported newgrf station properties
peter1138
parents: 5889
diff changeset
  1127
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1128
		default:
3505
091f0285df7d (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
  1129
			ret = true;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1130
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1131
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1132
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1133
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1134
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1135
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1136
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1137
static bool BridgeChangeInfo(uint brid, int numinfo, int prop, byte **bufp, int len)
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1138
{
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1139
	byte *buf = *bufp;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1140
	int i;
3504
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1141
	bool ret = false;
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1142
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1143
	switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1144
		case 0x08: // Year of availability
4322
f40bbdf476b3 (svn r5975) -Cleanup: use ORIGINAL_BASE_YEAR & ORIGINAL_MAX_YEAR where the functions really depend on the original date format.
rubidium
parents: 4321
diff changeset
  1145
			FOR_EACH_OBJECT _bridge[brid + i].avail_year = ORIGINAL_BASE_YEAR + grf_load_byte(&buf);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1146
			break;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1147
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1148
		case 0x09: // Minimum length
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1149
			FOR_EACH_OBJECT _bridge[brid + i].min_length = grf_load_byte(&buf);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1150
			break;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1151
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1152
		case 0x0A: // Maximum length
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1153
			FOR_EACH_OBJECT _bridge[brid + i].max_length = grf_load_byte(&buf);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1154
			break;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1155
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1156
		case 0x0B: // Cost factor
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1157
			FOR_EACH_OBJECT _bridge[brid + i].price = grf_load_byte(&buf);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1158
			break;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1159
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1160
		case 0x0C: // Maximum speed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1161
			FOR_EACH_OBJECT _bridge[brid + i].speed = grf_load_word(&buf);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1162
			break;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1163
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1164
		case 0x0D: // Bridge sprite tables
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1165
			FOR_EACH_OBJECT {
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1166
				Bridge *bridge = &_bridge[brid + i];
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1167
				byte tableid = grf_load_byte(&buf);
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1168
				byte numtables = grf_load_byte(&buf);
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1169
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1170
				if (bridge->sprite_table == NULL) {
3555
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1171
					/* Allocate memory for sprite table pointers and zero out */
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  1172
					bridge->sprite_table = CallocT<PalSpriteID*>(7);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1173
				}
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1174
3555
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1175
				for (; numtables-- != 0; tableid++) {
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1176
					if (tableid >= 7) { // skip invalid data
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1177
						grfmsg(1, "BridgeChangeInfo: Table %d >= 7, skipping", tableid);
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1178
						for (byte sprite = 0; sprite < 32; sprite++) grf_load_dword(&buf);
3555
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1179
						continue;
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1180
					}
3555
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1181
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1182
					if (bridge->sprite_table[tableid] == NULL) {
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  1183
						bridge->sprite_table[tableid] = MallocT<PalSpriteID>(32);
3555
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1184
					}
968a9f073113 (svn r4429) - CodeChange[newgrf]: Action0, prop 0x0D. use calloc to allocate memory and zero it out and change the loop a little
Darkvater
parents: 3548
diff changeset
  1185
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1186
					for (byte sprite = 0; sprite < 32; sprite++) {
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1187
						SpriteID image = grf_load_word(&buf);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1188
						SpriteID pal   = grf_load_word(&buf);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1189
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1190
						if (HASBIT(pal, 15)) {
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1191
							SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1192
						}
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1193
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1194
						/* Clear old color modifer bit */
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1195
						CLRBIT(image, 15);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1196
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1197
						bridge->sprite_table[tableid][sprite].sprite = image;
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1198
						bridge->sprite_table[tableid][sprite].pal    = pal;
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1199
					}
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1200
				}
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1201
			}
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1202
			break;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1203
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1204
		case 0x0E: // Flags; bit 0 - disable far pillars
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1205
			FOR_EACH_OBJECT _bridge[brid + i].flags = grf_load_byte(&buf);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1206
			break;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1207
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1208
		case 0x0F: // Long format year of availability (year since year 0)
5114
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
  1209
			FOR_EACH_OBJECT _bridge[brid + i].avail_year = clamp(grf_load_dword(&buf), MIN_YEAR, MAX_YEAR);
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
  1210
			break;
9487e87478ba (svn r7191) -Feature: Add NewGRF support for 32 bit dates, allowing vehicles and bridges to be available before 1920.
peter1138
parents: 5108
diff changeset
  1211
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1212
		default:
3504
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1213
			ret = true;
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1214
	}
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1215
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1216
	*bufp = buf;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1217
	return ret;
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1218
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1219
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1220
static bool TownHouseChangeInfo(uint hid, int numinfo, int prop, byte **bufp, int len)
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1221
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1222
	HouseSpec **housespec;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1223
	byte *buf = *bufp;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1224
	int i;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1225
	bool ret = false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1226
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1227
	if (hid + numinfo >= HOUSE_MAX) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1228
		grfmsg(1, "TownHouseChangeInfo: Too many houses loaded (%u), max (%u). Ignoring.", hid + numinfo, HOUSE_MAX-1);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1229
		return false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1230
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1231
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1232
	/* Allocate house specs if they haven't been allocated already. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1233
	if (_cur_grffile->housespec == NULL) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1234
		_cur_grffile->housespec = CallocT<HouseSpec*>(HOUSE_MAX);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1235
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1236
		/* Reset any overrides that have been set. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1237
		ResetHouseOverrides();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1238
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1239
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1240
	housespec = &_cur_grffile->housespec[hid];
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1241
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1242
	if (prop != 0x08) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1243
		/* Check that all the houses being modified have been defined. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1244
		FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1245
			if (housespec[i] == NULL) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1246
				grfmsg(2, "TownHouseChangeInfo: Attempt to modify undefined house %u. Ignoring.", hid + i);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1247
				return false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1248
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1249
		}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1250
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1251
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1252
	switch (prop) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1253
		case 0x08: // Substitute building type, and definition of a new house
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1254
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1255
				byte subs_id = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1256
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1257
				if (subs_id == 0xFF) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1258
					/* Instead of defining a new house, a substitute house id
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1259
					 * of 0xFF disables the old house with the current id. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1260
					_house_specs[hid + i].enabled = false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1261
					continue;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1262
				} else if (subs_id >= NEW_HOUSE_OFFSET) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1263
					/* The substitute id must be one of the original houses. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1264
					grfmsg(2, "TownHouseChangeInfo: Attempt to use new house %u as substitute house for %u. Ignoring.", subs_id, hid + i);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1265
					return false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1266
				}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1267
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1268
				/* Allocate space for this house. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1269
				if (housespec[i] == NULL) housespec[i] = CallocT<HouseSpec>(1);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1270
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1271
				memcpy(housespec[i], &_house_specs[subs_id], sizeof(_house_specs[subs_id]));
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1272
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1273
				housespec[i]->enabled = true;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1274
				housespec[i]->local_id = hid + i;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1275
				housespec[i]->substitute_id = subs_id;
6342
a44ad9acf82a (svn r9367) -Fix (r9315): If a new house doesn't have a corresponding action 3, the
maedhros
parents: 6341
diff changeset
  1276
				housespec[i]->grffile = _cur_grffile;
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1277
				housespec[i]->random_colour[0] = 0x04;  // those 4 random colours are the base colour
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1278
				housespec[i]->random_colour[1] = 0x08;  // for all new houses
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1279
				housespec[i]->random_colour[2] = 0x0C;  // they stand for red, blue, orange and green
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1280
				housespec[i]->random_colour[3] = 0x06;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1281
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1282
				/* New houses do not (currently) expect to have a default start
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1283
				 * date before 1930, as this breaks the build date stuff. See
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1284
				 * FinaliseHouseArray() for more details. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1285
				if (housespec[i]->min_date < 1930) housespec[i]->min_date = 1930;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1286
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1287
			_have_newhouses = true;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1288
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1289
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1290
		case 0x09: // Building flags
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1291
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1292
				byte state = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1293
				housespec[i]->building_flags = (BuildingFlags)state;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1294
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1295
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1296
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1297
		case 0x0A: // Availability years
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1298
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1299
				uint16 years = grf_load_word(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1300
				housespec[i]->min_date = GB(years, 0, 8) > 150 ? MAX_YEAR : ORIGINAL_BASE_YEAR + GB(years, 0, 8);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1301
				housespec[i]->max_date = GB(years, 8, 8) > 150 ? MAX_YEAR : ORIGINAL_BASE_YEAR + GB(years, 8, 8);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1302
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1303
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1304
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1305
		case 0x0B: // Population
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1306
			FOR_EACH_OBJECT housespec[i]->population = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1307
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1308
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1309
		case 0x0C: // Mail generation multiplier
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1310
			FOR_EACH_OBJECT housespec[i]->mail_generation = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1311
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1312
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1313
		case 0x0D: // Passenger acceptance
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1314
		case 0x0E: // Mail acceptance
6341
b670e4765225 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6332
diff changeset
  1315
			FOR_EACH_OBJECT housespec[i]->cargo_acceptance[prop - 0x0D] = grf_load_byte(&buf);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1316
			break;
6341
b670e4765225 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6332
diff changeset
  1317
		case 0x0F: // Goods/candy, food/fizzy drinks acceptance
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1318
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1319
				int8 goods = grf_load_byte(&buf);
6341
b670e4765225 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6332
diff changeset
  1320
b670e4765225 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6332
diff changeset
  1321
				/* If value of goods is negative, it means in fact food or, if in toyland, fizzy_drink acceptance.
b670e4765225 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6332
diff changeset
  1322
				 * Else, we have "standard" 3rd cargo type, goods or candy, for toyland once more */
6357
f0f5e7d1713c (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6350
diff changeset
  1323
				housespec[i]->accepts_cargo[2] = (goods >= 0) ? ((_opt.landscape == LT_TOYLAND) ? CT_CANDY : CT_GOODS) :
f0f5e7d1713c (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6350
diff changeset
  1324
						((_opt.landscape == LT_TOYLAND) ? CT_FIZZY_DRINKS : CT_FOOD);
6341
b670e4765225 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6332
diff changeset
  1325
b670e4765225 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6332
diff changeset
  1326
				housespec[i]->cargo_acceptance[2] = abs(goods); // but we do need positive value here
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1327
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1328
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1329
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1330
		case 0x10: // Local authority rating decrease on removal
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1331
			FOR_EACH_OBJECT housespec[i]->remove_rating_decrease = grf_load_word(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1332
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1333
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1334
		case 0x11: // Removal cost multiplier
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1335
			FOR_EACH_OBJECT housespec[i]->removal_cost = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1336
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1337
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1338
		case 0x12: // Building name ID
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1339
			FOR_EACH_OBJECT housespec[i]->building_name = MapGRFStringID(_cur_grffile->grfid, grf_load_word(&buf));
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1340
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1341
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1342
		case 0x13: // Building availability mask
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1343
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1344
				uint16 avail = grf_load_word(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1345
				housespec[i]->building_availability = (HouseZones)avail;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1346
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1347
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1348
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1349
		case 0x14: // House callback flags
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1350
			FOR_EACH_OBJECT housespec[i]->callback_mask = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1351
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1352
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1353
		case 0x15: // House override byte
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1354
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1355
				byte override = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1356
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1357
				/* The house being overridden must be an original house. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1358
				if (override >= NEW_HOUSE_OFFSET) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1359
					grfmsg(2, "TownHouseChangeInfo: Attempt to override new house %u with house id %u. Ignoring.", override, hid);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1360
					return false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1361
				}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1362
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1363
				AddHouseOverride(hid, override);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1364
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1365
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1366
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1367
		case 0x16: // Periodic refresh multiplier
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1368
			FOR_EACH_OBJECT housespec[i]->processing_time = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1369
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1370
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1371
		case 0x17: // Four random colours to use
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1372
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1373
				uint j;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1374
				for (j = 0; j < 4; j++)	housespec[i]->random_colour[j] = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1375
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1376
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1377
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1378
		case 0x18: // Relative probability of appearing
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1379
			FOR_EACH_OBJECT housespec[i]->probability = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1380
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1381
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1382
		case 0x19: // Extra flags
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1383
			FOR_EACH_OBJECT {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1384
				byte flags = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1385
				housespec[i]->extra_flags = (HouseExtraFlags)flags;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1386
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1387
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1388
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1389
		case 0x1A: // Animation frames
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1390
			FOR_EACH_OBJECT housespec[i]->animation_frames = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1391
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1392
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1393
		case 0x1B: // Animation speed
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1394
			FOR_EACH_OBJECT housespec[i]->animation_speed = clamp(grf_load_byte(&buf), 2, 16);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1395
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1396
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1397
		case 0x1C: // Class of the building type
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1398
			FOR_EACH_OBJECT housespec[i]->class_id = AllocateHouseClassID(grf_load_byte(&buf), _cur_grffile->grfid);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1399
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1400
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1401
		case 0x1D: // Callback flags 2
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1402
			FOR_EACH_OBJECT housespec[i]->callback_mask |= (grf_load_byte(&buf) << 8);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1403
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1404
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1405
		case 0x1E: // Accepted cargo types
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1406
			FOR_EACH_OBJECT grf_load_dword(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1407
			ret = true;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1408
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1409
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1410
		default:
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1411
			ret = true;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1412
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1413
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1414
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1415
	*bufp = buf;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1416
	return ret;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1417
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1418
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1419
static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, int len)
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1420
{
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1421
	byte *buf = *bufp;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1422
	int i;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1423
	bool ret = false;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1424
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1425
	switch (prop) {
3504
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1426
		case 0x08: /* Cost base factor */
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1427
			FOR_EACH_OBJECT {
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1428
				byte factor = grf_load_byte(&buf);
2508
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1429
				uint price = gvid + i;
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1430
2508
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1431
				if (price < NUM_PRICES) {
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1432
					SetPriceBaseMultiplier(price, factor);
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1433
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1434
					grfmsg(1, "GlobalVarChangeInfo: Price %d out of range, ignoring", price);
2508
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1435
				}
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1436
			}
3504
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1437
			break;
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1438
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1439
		case 0x09: /* Cargo translation table */
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1440
			/* This is loaded during the initialisation stage, so just skip it here. */
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1441
			/* Each entry is 4 bytes. */
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1442
			buf += numinfo * 4;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1443
			break;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1444
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1445
		case 0x0A: // Currency display names
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1446
			FOR_EACH_OBJECT {
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1447
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1448
				StringID newone = GetGRFStringID(_cur_grffile->grfid, grf_load_word(&buf));
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1449
4504
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  1450
				if ((newone != STR_UNDEFINED) && (curidx < NUM_CURRENCY)) {
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  1451
					_currency_specs[curidx].name = newone;
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1452
				}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1453
			}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1454
			break;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1455
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1456
		case 0x0B: // Currency multipliers
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1457
			FOR_EACH_OBJECT {
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1458
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1459
				uint32 rate = grf_load_dword(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1460
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1461
				if (curidx < NUM_CURRENCY) {
4602
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1462
					/* TTDPatch uses a multiple of 1000 for its conversion calculations,
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1463
					 * which OTTD does not. For this reason, divide grf value by 1000,
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1464
					 * to be compatible */
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1465
					_currency_specs[curidx].rate = rate / 1000;
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1466
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1467
					grfmsg(1, "GlobalVarChangeInfo: Currency multipliers %d out of range, ignoring", curidx);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1468
				}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1469
			}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1470
			break;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1471
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1472
		case 0x0C: // Currency options
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1473
			FOR_EACH_OBJECT {
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1474
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1475
				uint16 options = grf_load_word(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1476
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1477
				if (curidx < NUM_CURRENCY) {
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1478
					_currency_specs[curidx].separator = GB(options, 0, 8);
4602
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1479
					/* By specifying only one bit, we prevent errors,
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1480
					 * since newgrf specs said that only 0 and 1 can be set for symbol_pos */
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1481
					_currency_specs[curidx].symbol_pos = GB(options, 8, 1);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1482
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1483
					grfmsg(1, "GlobalVarChangeInfo: Currency option %d out of range, ignoring", curidx);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1484
				}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1485
			}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1486
			break;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1487
4602
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1488
		case 0x0D: // Currency prefix symbol
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1489
			FOR_EACH_OBJECT {
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1490
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1491
				uint32 tempfix = grf_load_dword(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1492
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1493
				if (curidx < NUM_CURRENCY) {
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1494
					memcpy(_currency_specs[curidx].prefix,&tempfix,4);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1495
					_currency_specs[curidx].prefix[4] = 0;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1496
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1497
					grfmsg(1, "GlobalVarChangeInfo: Currency symbol %d out of range, ignoring", curidx);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1498
				}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1499
			}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1500
			break;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1501
4602
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1502
		case 0x0E: // Currency suffix symbol
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1503
			FOR_EACH_OBJECT {
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1504
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1505
				uint32 tempfix = grf_load_dword(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1506
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1507
				if (curidx < NUM_CURRENCY) {
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1508
					memcpy(&_currency_specs[curidx].suffix,&tempfix,4);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1509
					_currency_specs[curidx].suffix[4] = 0;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1510
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1511
					grfmsg(1, "GlobalVarChangeInfo: Currency symbol %d out of range, ignoring", curidx);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1512
				}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1513
			}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1514
			break;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1515
4504
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  1516
		case 0x0F: //  Euro introduction dates
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1517
			FOR_EACH_OBJECT {
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1518
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1519
				Year year_euro = grf_load_word(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1520
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1521
				if (curidx < NUM_CURRENCY) {
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1522
					_currency_specs[curidx].to_euro = year_euro;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1523
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1524
					grfmsg(1, "GlobalVarChangeInfo: Euro intro date %d out of range, ignoring", curidx);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1525
				}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1526
			}
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1527
			break;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1528
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1529
		case 0x10: // 12 * 32 * B Snow line height table
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1530
			if (numinfo > 1 || IsSnowLineSet()) {
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1531
				grfmsg(1, "GlobalVarChangeInfo: The snowline can only be set once (%d)", numinfo);
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1532
			} else if (len < SNOW_LINE_MONTHS * SNOW_LINE_DAYS) {
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1533
				grfmsg(1, "GlobalVarChangeInfo: Not enough entries set in the snowline table (%d)", len);
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1534
			} else {
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1535
				byte table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS];
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1536
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1537
				for (uint i = 0; i < SNOW_LINE_MONTHS; i++) {
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1538
					for (uint j = 0; j < SNOW_LINE_DAYS; j++) {
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1539
						table[i][j] = grf_load_byte(&buf);
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1540
					}
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1541
				}
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1542
				SetSnowLine(table);
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1543
			}
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1544
			break;
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1545
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1546
		default:
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1547
			ret = true;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1548
	}
3504
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1549
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1550
	*bufp = buf;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1551
	return ret;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1552
}
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1553
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1554
static bool CargoChangeInfo(uint cid, int numinfo, int prop, byte **bufp, int len)
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1555
{
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1556
	if (cid + numinfo > NUM_CARGO) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1557
		grfmsg(2, "CargoChangeInfo: Cargo type %d out of range (max %d)", cid + numinfo, NUM_CARGO - 1);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1558
		return false;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1559
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1560
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1561
	CargoSpec *cs = &_cargo[cid];
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1562
	byte *buf = *bufp;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1563
	int i;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1564
	bool ret = false;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1565
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1566
	switch (prop) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1567
		case 0x08: /* Bit number of cargo */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1568
			FOR_EACH_OBJECT {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1569
				cs[i].bitnum = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1570
				cs[i].grfid = _cur_grffile->grfid;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1571
				if (cs->IsValid()) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1572
					SETBIT(_cargo_mask, cid + i);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1573
				} else {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1574
					CLRBIT(_cargo_mask, cid + i);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1575
				}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1576
			}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1577
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1578
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1579
		case 0x09: /* String ID for cargo type name */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1580
			FOR_EACH_OBJECT cs[i].name = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1581
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1582
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1583
		case 0x0A: /* String for cargo name, plural */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1584
			FOR_EACH_OBJECT cs[i].name_plural = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1585
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1586
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1587
		case 0x0B:
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1588
			/* String for units of cargo. This is different in OpenTTD to TTDPatch
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1589
			 * (e.g. 10 tonnes of coal) */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1590
			FOR_EACH_OBJECT cs[i].units_volume = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1591
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1592
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1593
		case 0x0C: /* String for quantity of cargo (e.g. 10 tonnes of coal) */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1594
			FOR_EACH_OBJECT cs[i].quantifier = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1595
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1596
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1597
		case 0x0D: /* String for two letter cargo abbreviation */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1598
			FOR_EACH_OBJECT cs[i].abbrev = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1599
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1600
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1601
		case 0x0E: /* Sprite ID for cargo icon */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1602
			FOR_EACH_OBJECT cs[i].sprite = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1603
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1604
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1605
		case 0x0F: /* Weight of one unit of cargo */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1606
			FOR_EACH_OBJECT cs[i].weight = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1607
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1608
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1609
		case 0x10: /* Used for payment calculation */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1610
			FOR_EACH_OBJECT cs[i].transit_days[0] = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1611
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1612
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1613
		case 0x11: /* Used for payment calculation */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1614
			FOR_EACH_OBJECT cs[i].transit_days[1] = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1615
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1616
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1617
		case 0x12: /* Base cargo price */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1618
			FOR_EACH_OBJECT cs[i].initial_payment = grf_load_dword(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1619
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1620
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1621
		case 0x13: /* Colour for station rating bars */
6375
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
  1622
			FOR_EACH_OBJECT cs[i].rating_colour = MapDOSColour(grf_load_byte(&buf));
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1623
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1624
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1625
		case 0x14: /* Colour for cargo graph */
6375
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
  1626
			FOR_EACH_OBJECT cs[i].legend_colour = MapDOSColour(grf_load_byte(&buf));
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1627
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1628
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1629
		case 0x15: /* Freight status */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1630
			FOR_EACH_OBJECT cs[i].is_freight = grf_load_byte(&buf) != 0;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1631
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1632
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1633
		case 0x16: /* Cargo classes */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1634
			FOR_EACH_OBJECT cs[i].classes = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1635
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1636
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1637
		case 0x17: /* Cargo label */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1638
			FOR_EACH_OBJECT {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1639
				cs[i].label = grf_load_dword(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1640
				cs[i].label = BSWAP32(cs[i].label);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1641
			}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1642
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1643
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1644
		case 0x18: /* Town growth substitute type */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1645
			FOR_EACH_OBJECT {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1646
				uint8 substitute_type = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1647
				switch (substitute_type) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1648
					case 0x00: cs[i].town_effect = TE_PASSENGERS; break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1649
					case 0x02: cs[i].town_effect = TE_MAIL; break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1650
					case 0x05: cs[i].town_effect = TE_GOODS; break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1651
					case 0x09: cs[i].town_effect = TE_WATER; break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1652
					case 0x0B: cs[i].town_effect = TE_FOOD; break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1653
					default:
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1654
						grfmsg(1, "CargoChangeInfo: Unknown town growth substitute value %d, setting to none.", substitute_type);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1655
					case 0xFF: cs[i].town_effect = TE_NONE; break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1656
				}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1657
			}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1658
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1659
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1660
		case 0x19: /* Town growth coefficient */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1661
			FOR_EACH_OBJECT cs[i].multipliertowngrowth = grf_load_word(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1662
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1663
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1664
		case 0x1A: /* Bitmask of callbacks to use */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1665
			FOR_EACH_OBJECT cs[i].callback_mask = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1666
			break;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1667
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1668
		default:
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1669
			ret = true;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1670
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1671
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1672
	*bufp = buf;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1673
	return ret;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1674
}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1675
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1676
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1677
static bool SoundEffectChangeInfo(uint sid, int numinfo, int prop, byte **bufp, int len)
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1678
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1679
	byte *buf = *bufp;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1680
	int i;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1681
	bool ret = false;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1682
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1683
	if (_cur_grffile->sound_offset == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1684
		grfmsg(1, "SoundEffectChangeInfo: No effects defined, skipping");
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1685
		return false;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1686
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1687
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1688
	switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1689
		case 0x08: // Relative volume
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1690
			FOR_EACH_OBJECT {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1691
				uint sound = sid + i + _cur_grffile->sound_offset - GetNumOriginalSounds();
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1692
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1693
				if (sound >= GetNumSounds()) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1694
					grfmsg(1, "SoundEffectChangeInfo: Sound %d not defined (max %d)", sound, GetNumSounds());
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1695
				} else {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1696
					GetSound(sound)->volume = grf_load_byte(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1697
				}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1698
			}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1699
			break;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1700
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1701
		case 0x09: // Priority
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1702
			FOR_EACH_OBJECT {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1703
				uint sound = sid + i + _cur_grffile->sound_offset - GetNumOriginalSounds();
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1704
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1705
				if (sound >= GetNumSounds()) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1706
					grfmsg(1, "SoundEffectChangeInfo: Sound %d not defined (max %d)", sound, GetNumSounds());
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1707
				} else {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1708
					GetSound(sound)->priority = grf_load_byte(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1709
				}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1710
			}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1711
			break;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1712
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1713
		case 0x0A: // Override old sound
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1714
			FOR_EACH_OBJECT {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1715
				uint sound = sid + i + _cur_grffile->sound_offset - GetNumOriginalSounds();
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1716
				uint orig_sound = grf_load_byte(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1717
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1718
				if (sound >= GetNumSounds() || orig_sound >= GetNumSounds()) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1719
					grfmsg(1, "SoundEffectChangeInfo: Sound %d or %d not defined (max %d)", sound, orig_sound, GetNumSounds());
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1720
				} else {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1721
					FileEntry *newfe = GetSound(sound);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1722
					FileEntry *oldfe = GetSound(orig_sound);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1723
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1724
					/* Literally copy the data of the new sound over the original */
5024
5e98bf731469 (svn r7065) Use simple assignment instead of memcpy()
tron
parents: 5011
diff changeset
  1725
					*oldfe = *newfe;
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1726
				}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1727
			}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1728
			break;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1729
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1730
		default:
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1731
			ret = true;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1732
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1733
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1734
	*bufp = buf;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1735
	return ret;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1736
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1737
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1738
/* Action 0x00 */
3879
cfa3cf4731d2 (svn r4928) CodeChange : Rename functions referring to "Vehicle" for "Feature".
belugas
parents: 3875
diff changeset
  1739
static void FeatureChangeInfo(byte *buf, int len)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1740
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1741
	byte *bufend = buf + len;
6288
f8103e0d58ba (svn r9108) -Fix(9093) : MSVC was a bit unhappy with some of the type changes. So basically, widening the types makes the difference
belugas
parents: 6284
diff changeset
  1742
	uint i;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1743
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1744
	/* <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
  1745
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1746
	 * 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
  1747
	 *                 4 for defining new train station sets
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1748
	 * 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
  1749
	 * 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
  1750
	 * 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
  1751
	 *                 greater than one, this one and the following
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1752
	 *                 vehicles/stations will be changed
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1753
	 * 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
  1754
	 * 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
  1755
	/* TODO: Bridges, town houses. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1756
2438
f0bf4adbd620 (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
  1757
	static const VCI_Handler handler[] = {
3825
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1758
		/* GSF_TRAIN */        RailVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1759
		/* GSF_ROAD */         RoadVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1760
		/* GSF_SHIP */         ShipVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1761
		/* GSF_AIRCRAFT */     AircraftVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1762
		/* GSF_STATION */      StationChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1763
		/* GSF_CANAL */        NULL,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1764
		/* GSF_BRIDGE */       BridgeChangeInfo,
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1765
		/* GSF_TOWNHOUSE */    TownHouseChangeInfo,
3825
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1766
		/* GSF_GLOBALVAR */    GlobalVarChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1767
		/* GSF_INDUSTRYTILES */NULL,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  1768
		/* GSF_INDUSTRIES */   NULL,
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1769
		/* GSF_CARGOS */       NULL, /* Cargo is handled during reservation */
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1770
		/* GSF_SOUNDFX */      SoundEffectChangeInfo,
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1771
	};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1772
542
de27e74b11bd (svn r939) -Fix: Fixed compiler errors
truelight
parents: 536
diff changeset
  1773
	EngineInfo *ei = NULL;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1774
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1775
	if (len == 1) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1776
		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1777
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1778
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1779
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  1780
	if (!check_length(len, 6, "FeatureChangeInfo")) return;
3714
aa27d8962f6a (svn r4657) - NewGRF: use grf_load_byte() in favour of array accesses
peter1138
parents: 3712
diff changeset
  1781
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1782
	uint8 feature  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1783
	uint8 numprops = grf_load_byte(&buf);
6288
f8103e0d58ba (svn r9108) -Fix(9093) : MSVC was a bit unhappy with some of the type changes. So basically, widening the types makes the difference
belugas
parents: 6284
diff changeset
  1784
	uint numinfo  = grf_load_byte(&buf);
f8103e0d58ba (svn r9108) -Fix(9093) : MSVC was a bit unhappy with some of the type changes. So basically, widening the types makes the difference
belugas
parents: 6284
diff changeset
  1785
	uint engine   = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1786
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1787
	grfmsg(6, "FeatureChangeInfo: feature %d, %d properties, to apply to %d+%d",
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1788
	               feature, numprops, engine, numinfo);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1789
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
  1790
	if (feature >= lengthof(handler) || handler[feature] == NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1791
		grfmsg(1, "FeatureChangeInfo: Unsupported feature %d, skipping", feature);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1792
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1793
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1794
2439
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1795
	if (feature <= GSF_AIRCRAFT) {
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1796
		if (engine + numinfo > _vehcounts[feature]) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1797
			grfmsg(0, "FeatureChangeInfo: Last engine ID %d out of bounds (max %d), skipping", engine + numinfo, _vehcounts[feature]);
2439
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1798
			return;
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1799
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1800
		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
  1801
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1802
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1803
	while (numprops-- && buf < bufend) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1804
		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
  1805
		bool ignoring = false;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1806
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1807
		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
  1808
			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
  1809
			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
  1810
			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
  1811
			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
  1812
				/* 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
  1813
				switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1814
					case 0x00: // Introduction date
4322
f40bbdf476b3 (svn r5975) -Cleanup: use ORIGINAL_BASE_YEAR & ORIGINAL_MAX_YEAR where the functions really depend on the original date format.
rubidium
parents: 4321
diff changeset
  1815
						FOR_EACH_OBJECT ei[i].base_intro = grf_load_word(&buf) + DAYS_TILL_ORIGINAL_BASE_YEAR;
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1816
						break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1817
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1818
					case 0x02: // Decay speed
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1819
						FOR_EACH_OBJECT SB(ei[i].unk2, 0, 7, grf_load_byte(&buf) & 0x7F);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1820
						break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1821
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1822
					case 0x03: // Vehicle life
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1823
						FOR_EACH_OBJECT ei[i].lifelength = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1824
						break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1825
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1826
					case 0x04: // Model life
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1827
						FOR_EACH_OBJECT ei[i].base_life = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1828
						break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1829
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1830
					case 0x06: // Climates available
3089
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1831
						FOR_EACH_OBJECT ei[i].climates = grf_load_byte(&buf);
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1832
						break;
b073c15f794c (svn r3678) - NewGRF Codechange: remove redundant braces and temporary variables.
peter1138
parents: 3033
diff changeset
  1833
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1834
					case 0x07: // Loading speed
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1835
						/* 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
  1836
						 * 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
  1837
						 * credit ;-). --pasky */
5211
fb4dc0ca975d (svn r7326) -Feature: Add support for gradual (un)loading of vehicles (Maedhros)
peter1138
parents: 5210
diff changeset
  1838
						FOR_EACH_OBJECT ei[i].load_amount = 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
  1839
						break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1840
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1841
					default:
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1842
						if (handler[feature](engine, numinfo, prop, &buf, bufend - 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
  1843
							ignoring = true;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1844
						}
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1845
						break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1846
				}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1847
				break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1848
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1849
			default:
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1850
				if (handler[feature](engine, numinfo, prop, &buf, bufend - 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
  1851
					ignoring = true;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1852
				}
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1853
				break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1854
		}
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1855
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1856
		if (ignoring) grfmsg(2, "FeatureChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1857
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1858
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1859
5525
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1860
/* Action 0x00 (GLS_SAFETYSCAN) */
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1861
static void SafeChangeInfo(byte *buf, int len)
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1862
{
6128
e4a3586c6ca6 (svn r8865) -Codechange: (NewGRF) Ignore 1 byte action 0s during safety check
peter1138
parents: 6113
diff changeset
  1863
	if (len == 1) {
e4a3586c6ca6 (svn r8865) -Codechange: (NewGRF) Ignore 1 byte action 0s during safety check
peter1138
parents: 6113
diff changeset
  1864
		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
e4a3586c6ca6 (svn r8865) -Codechange: (NewGRF) Ignore 1 byte action 0s during safety check
peter1138
parents: 6113
diff changeset
  1865
		return;
e4a3586c6ca6 (svn r8865) -Codechange: (NewGRF) Ignore 1 byte action 0s during safety check
peter1138
parents: 6113
diff changeset
  1866
	}
e4a3586c6ca6 (svn r8865) -Codechange: (NewGRF) Ignore 1 byte action 0s during safety check
peter1138
parents: 6113
diff changeset
  1867
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  1868
	if (!check_length(len, 6, "SafeChangeInfo")) return;
5525
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1869
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1870
	uint8 feature  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1871
	uint8 numprops = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1872
	grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1873
	grf_load_byte(&buf);
5525
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1874
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1875
	if (feature == GSF_BRIDGE && numprops == 1) {
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1876
		uint8 prop = grf_load_byte(&buf);
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1877
		/* Bridge property 0x0D is redefinition of sprite layout tables, which
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1878
		 * is considered safe. */
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1879
		if (prop == 0x0D) return;
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1880
	}
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1881
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1882
	SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1883
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1884
	/* Skip remainder of GRF */
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1885
	_skip_sprites = -1;
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1886
}
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  1887
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1888
/* Action 0x00 (GLS_INIT) */
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1889
static void InitChangeInfo(byte *buf, int len)
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1890
{
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1891
	byte *bufend = buf + len;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1892
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1893
	if (len == 1) {
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1894
		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1895
		return;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1896
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1897
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1898
	if (!check_length(len, 6, "InitChangeInfo")) return;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1899
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1900
	uint8 feature  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1901
	uint8 numprops = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1902
	uint8 numinfo  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1903
	uint8 index    = grf_load_byte(&buf);
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1904
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1905
	while (numprops-- && buf < bufend) {
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1906
		uint8 prop = grf_load_byte(&buf);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1907
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1908
		switch (feature) {
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1909
			case GSF_GLOBALVAR:
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1910
				switch (prop) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1911
					case 0x09: // Cargo Translation Table
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1912
						if (index != 0) {
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1913
							grfmsg(1, "InitChangeInfo: Cargo translation table must start at zero");
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1914
							return;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1915
						}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1916
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1917
						free(_cur_grffile->cargo_list);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1918
						_cur_grffile->cargo_max = numinfo;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1919
						_cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1920
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1921
						int i;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1922
						FOR_EACH_OBJECT {
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1923
							CargoLabel cl = grf_load_dword(&buf);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1924
							_cur_grffile->cargo_list[i] = BSWAP32(cl);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1925
						}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1926
						break;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1927
				}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1928
				break;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1929
		}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1930
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1931
}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  1932
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1933
/* Action 0x00 (GLS_RESERVE) */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1934
static void ReserveChangeInfo(byte *buf, int len)
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1935
{
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1936
	byte *bufend = buf + len;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1937
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1938
	if (len == 1) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1939
		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1940
		return;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1941
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1942
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1943
	if (!check_length(len, 6, "InitChangeInfo")) return;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1944
	buf++;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1945
	uint8 feature  = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1946
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1947
	if (feature != GSF_CARGOS) return;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1948
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1949
	uint8 numprops = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1950
	uint8 numinfo  = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1951
	uint8 index    = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1952
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1953
	while (numprops-- && buf < bufend) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1954
		uint8 prop = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1955
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1956
		if (CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf)) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1957
			grfmsg(2, "FeatureChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1958
		}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1959
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1960
}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1961
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1962
#undef FOR_EACH_OBJECT
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1963
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1964
/**
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1965
 * Creates a spritegroup representing a callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1966
 * @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
  1967
 * @return A spritegroup representing that callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1968
 */
4893
000692659d8c (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  1969
static const SpriteGroup* NewCallBackResultSpriteGroup(uint16 value)
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1970
{
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  1971
	SpriteGroup *group = AllocateSpriteGroup();
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1972
2488
1e98c71e5f6a (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  1973
	group->type = SGT_CALLBACK;
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1974
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1975
	/* Old style callback results have the highest byte 0xFF so signify it is a callback result
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  1976
	 * New style ones only have the highest bit set (allows 15-bit results, instead of just 8) */
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1977
	if ((value >> 8) == 0xFF) {
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1978
		value &= ~0xFF00;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1979
	} else {
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1980
		value &= ~0x8000;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1981
	}
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1982
2488
1e98c71e5f6a (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  1983
	group->g.callback.result = value;
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1984
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1985
	return group;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1986
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1987
2489
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1988
/**
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1989
 * Creates a spritegroup representing a sprite number result.
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1990
 * @param value The sprite number.
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1991
 * @param sprites The number of sprites per set.
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1992
 * @return A spritegroup representing the sprite number result.
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1993
 */
4893
000692659d8c (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  1994
static const SpriteGroup* NewResultSpriteGroup(SpriteID sprite, byte num_sprites)
2489
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1995
{
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  1996
	SpriteGroup *group = AllocateSpriteGroup();
2489
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  1997
	group->type = SGT_RESULT;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  1998
	group->g.result.sprite = sprite;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  1999
	group->g.result.num_sprites = num_sprites;
2489
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  2000
	return group;
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  2001
}
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  2002
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2003
/* Action 0x01 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2004
static void NewSpriteSet(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2005
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2006
	/* <01> <feature> <num-sets> <num-ent>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2007
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2008
	 * B feature       feature to define sprites for
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2009
	 *                 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
  2010
	 * B num-sets      number of sprite sets
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2011
	 * 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
  2012
	 *                 For vehicles, this is the number of different
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2013
	 *                         vehicle directions in each sprite set
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2014
	 *                         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
  2015
	 *                         In that case, use num-dirs=4.
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2016
	 */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2017
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2018
	if (!check_length(len, 4, "NewSpriteSet")) return;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2019
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2020
	uint8 feature   = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2021
	uint8 num_sets  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2022
	uint16 num_ents = grf_load_extended(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2023
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
  2024
	_cur_grffile->spriteset_start = _cur_spriteid;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2025
	_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
  2026
	_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
  2027
	_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
  2028
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2029
	grfmsg(7, "New sprite set at %d of type %d, consisting of %d sets with %d views each (total %d)",
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
  2030
		_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
  2031
	);
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
  2032
6288
f8103e0d58ba (svn r9108) -Fix(9093) : MSVC was a bit unhappy with some of the type changes. So basically, widening the types makes the difference
belugas
parents: 6284
diff changeset
  2033
	for (uint16 i = 0; i < num_sets * num_ents; i++) {
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
  2034
		LoadNextSprite(_cur_spriteid++, _file_index);
3557
1e9867319bce (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  2035
		_nfo_line++;
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
  2036
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2037
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2038
3666
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2039
/* Helper function to either create a callback or link to a previously
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2040
 * defined spritegroup. */
4893
000692659d8c (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2041
static const SpriteGroup* GetGroupFromGroupID(byte setid, byte type, uint16 groupid)
3666
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2042
{
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2043
	if (HASBIT(groupid, 15)) return NewCallBackResultSpriteGroup(groupid);
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2044
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2045
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2046
		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Groupid 0x%04X does not exist, leaving empty", setid, type, groupid);
3666
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2047
		return NULL;
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2048
	}
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2049
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2050
	return _cur_grffile->spritegroups[groupid];
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2051
}
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2052
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2053
/* Helper function to either create a callback or a result sprite group. */
4893
000692659d8c (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2054
static const SpriteGroup* CreateGroupFromGroupID(byte feature, byte setid, byte type, uint16 spriteid, uint16 num_sprites)
3666
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2055
{
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2056
	if (HASBIT(spriteid, 15)) return NewCallBackResultSpriteGroup(spriteid);
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2057
3667
67cf868114ac (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2058
	if (spriteid >= _cur_grffile->spriteset_numsets) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2059
		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Sprite set %u invalid, max %u", setid, type, spriteid, _cur_grffile->spriteset_numsets);
3667
67cf868114ac (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2060
		return NULL;
67cf868114ac (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2061
	}
67cf868114ac (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2062
3666
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2063
	/* Check if the sprite is within range. This can fail if the Action 0x01
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2064
	 * is skipped, as TTDPatch mandates that Action 0x02s must be processed.
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2065
	 * We don't have that rule, but must live by the Patch... */
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2066
	if (_cur_grffile->spriteset_start + spriteid * num_sprites + num_sprites > _cur_spriteid) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2067
		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Real Sprite IDs 0x%04X - 0x%04X do not (all) exist (max 0x%04X), leaving empty",
3666
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2068
				setid, type,
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2069
				_cur_grffile->spriteset_start + spriteid * num_sprites,
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2070
				_cur_grffile->spriteset_start + spriteid * num_sprites + num_sprites - 1, _cur_spriteid - 1);
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2071
		return NULL;
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2072
	}
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2073
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2074
	if (feature != _cur_grffile->spriteset_feature) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2075
		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Sprite set feature 0x%02X does not match action feature 0x%02X, skipping",
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2076
				_cur_grffile->spriteset_feature, feature);
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2077
		return NULL;
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2078
	}
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2079
3666
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2080
	return NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteid * num_sprites, num_sprites);
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2081
}
d37f272cc136 (svn r4581) - NewGRF: replace replicated action 2 code with two functions to simplify code somewhat. Also check that a sprite id is
peter1138
parents: 3648
diff changeset
  2082
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2083
/* Action 0x02 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2084
static void NewSpriteGroup(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2085
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2086
	/* <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
  2087
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2088
	 * B feature       see action 1
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2089
	 * B set-id        ID of this particular definition
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2090
	 * B type/num-entries
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2091
	 *                 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
  2092
	 *                 list definition, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2093
	 *                 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
  2094
	 *                 meaning depends on the feature
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2095
	 * V feature-specific-data (huge mess, don't even look it up --pasky) */
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2096
	SpriteGroup *group = NULL;
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2097
	byte *bufend = buf + len;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2098
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2099
	if (!check_length(len, 5, "NewSpriteGroup")) return;
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2100
	buf++;
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2101
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2102
	uint8 feature = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2103
	uint8 setid   = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2104
	uint8 type    = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2105
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
  2106
	if (setid >= _cur_grffile->spritegroups_count) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2107
		/* Allocate memory for new sprite group references. */
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  2108
		_cur_grffile->spritegroups = ReallocT(_cur_grffile->spritegroups, setid + 1);
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2109
		/* Initialise new space to NULL */
2488
1e98c71e5f6a (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2110
		for (; _cur_grffile->spritegroups_count < (setid + 1); _cur_grffile->spritegroups_count++)
1e98c71e5f6a (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2111
			_cur_grffile->spritegroups[_cur_grffile->spritegroups_count] = NULL;
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
  2112
	}
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
  2113
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2114
	switch (type) {
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2115
		/* Deterministic Sprite Group */
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2116
		case 0x81: // Self scope, byte
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2117
		case 0x82: // Parent scope, byte
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2118
		case 0x85: // Self scope, word
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2119
		case 0x86: // Parent scope, word
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2120
		case 0x89: // Self scope, dword
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2121
		case 0x8A: // Parent scope, dword
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2122
		{
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2123
			byte varadjust;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2124
			byte varsize;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2125
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2126
			/* Check we can load the var size parameter */
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2127
			if (!check_length(bufend - buf, 1, "NewSpriteGroup (Deterministic) (1)")) return;
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2128
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2129
			group = AllocateSpriteGroup();
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2130
			group->type = SGT_DETERMINISTIC;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2131
			group->g.determ.var_scope = HASBIT(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2132
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2133
			switch (GB(type, 2, 2)) {
3672
f626ea3c9994 (svn r4588) - NewGRF: silence a false compiler warning
peter1138
parents: 3668
diff changeset
  2134
				default: NOT_REACHED();
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2135
				case 0: group->g.determ.size = DSG_SIZE_BYTE;  varsize = 1; break;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2136
				case 1: group->g.determ.size = DSG_SIZE_WORD;  varsize = 2; break;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2137
				case 2: group->g.determ.size = DSG_SIZE_DWORD; varsize = 4; break;
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2138
			}
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2139
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2140
			if (!check_length(bufend - buf, 5 + varsize, "NewSpriteGroup (Deterministic) (2)")) return;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2141
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2142
			/* Loop through the var adjusts. Unfortunately we don't know how many we have
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2143
			 * from the outset, so we shall have to keep reallocing. */
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2144
			do {
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2145
				DeterministicSpriteGroupAdjust *adjust;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2146
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2147
				if (group->g.determ.num_adjusts > 0) {
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2148
					if (!check_length(bufend - buf, 2 + varsize + 3, "NewSpriteGroup (Deterministic) (3)")) return;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2149
				}
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2150
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2151
				group->g.determ.num_adjusts++;
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  2152
				group->g.determ.adjusts = ReallocT(group->g.determ.adjusts, group->g.determ.num_adjusts);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2153
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2154
				adjust = &group->g.determ.adjusts[group->g.determ.num_adjusts - 1];
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2155
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2156
				/* The first var adjust doesn't have an operation specified, so we set it to add. */
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  2157
				adjust->operation = group->g.determ.num_adjusts == 1 ? DSGA_OP_ADD : (DeterministicSpriteGroupAdjustOperation)grf_load_byte(&buf);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2158
				adjust->variable  = grf_load_byte(&buf);
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2159
				if (adjust->variable == 0x7E) {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2160
					/* Link subroutine group */
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2161
					adjust->subroutine = GetGroupFromGroupID(setid, type, grf_load_byte(&buf));
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2162
				} else {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2163
					adjust->parameter = IS_BYTE_INSIDE(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2164
				}
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2165
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2166
				varadjust = grf_load_byte(&buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2167
				adjust->shift_num = GB(varadjust, 0, 5);
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  2168
				adjust->type      = (DeterministicSpriteGroupAdjustType)GB(varadjust, 6, 2);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2169
				adjust->and_mask  = grf_load_var(varsize, &buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2170
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2171
				if (adjust->type != DSGA_TYPE_NONE) {
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2172
					adjust->add_val    = grf_load_var(varsize, &buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2173
					adjust->divmod_val = grf_load_var(varsize, &buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2174
				} else {
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2175
					adjust->add_val    = 0;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2176
					adjust->divmod_val = 0;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2177
				}
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2178
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2179
				/* Continue reading var adjusts while bit 5 is set. */
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2180
			} while (HASBIT(varadjust, 5));
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2181
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2182
			group->g.determ.num_ranges = grf_load_byte(&buf);
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  2183
			group->g.determ.ranges = CallocT<DeterministicSpriteGroupRange>(group->g.determ.num_ranges);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2184
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2185
			if (!check_length(bufend - buf, 2 + (2 + 2 * varsize) * group->g.determ.num_ranges, "NewSpriteGroup (Deterministic)")) return;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2186
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2187
			for (uint i = 0; i < group->g.determ.num_ranges; i++) {
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2188
				group->g.determ.ranges[i].group = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2189
				group->g.determ.ranges[i].low   = grf_load_var(varsize, &buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2190
				group->g.determ.ranges[i].high  = grf_load_var(varsize, &buf);
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2191
			}
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2192
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2193
			group->g.determ.default_group = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2194
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2195
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2196
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2197
		/* Randomized Sprite Group */
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2198
		case 0x80: // Self scope
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2199
		case 0x83: // Parent scope
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2200
		{
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2201
			if (!check_length(bufend - buf, 7, "NewSpriteGroup (Randomized) (1)")) return;
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2202
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2203
			group = AllocateSpriteGroup();
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2204
			group->type = SGT_RANDOMIZED;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2205
			group->g.random.var_scope = HASBIT(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2206
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2207
			uint8 triggers = grf_load_byte(&buf);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2208
			group->g.random.triggers       = GB(triggers, 0, 7);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2209
			group->g.random.cmp_mode       = HASBIT(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2210
			group->g.random.lowest_randbit = grf_load_byte(&buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2211
			group->g.random.num_groups     = grf_load_byte(&buf);
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  2212
			group->g.random.groups = CallocT<const SpriteGroup*>(group->g.random.num_groups);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2213
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2214
			if (!check_length(bufend - buf, 2 * group->g.random.num_groups, "NewSpriteGroup (Randomized) (2)")) return;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2215
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2216
			for (uint i = 0; i < group->g.random.num_groups; i++) {
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2217
				group->g.random.groups[i] = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2218
			}
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2219
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2220
			break;
2489
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  2221
		}
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2222
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2223
		/* Neither a variable or randomized sprite group... must be a real group */
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2224
		default:
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2225
		{
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2226
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2227
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2228
			switch (feature) {
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2229
				case GSF_TRAIN:
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2230
				case GSF_ROAD:
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2231
				case GSF_SHIP:
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2232
				case GSF_AIRCRAFT:
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2233
				case GSF_STATION:
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2234
				case GSF_CARGOS:
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2235
				{
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2236
					byte sprites     = _cur_grffile->spriteset_numents;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2237
					byte num_loaded  = type;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2238
					byte num_loading = grf_load_byte(&buf);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2239
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2240
					if (_cur_grffile->spriteset_start == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2241
						grfmsg(0, "NewSpriteGroup: No sprite set to work on! Skipping");
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2242
						return;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2243
					}
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2244
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2245
					if (!check_length(bufend - buf, 2 * num_loaded + 2 * num_loading, "NewSpriteGroup (Real) (1)")) return;
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2246
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2247
					group = AllocateSpriteGroup();
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2248
					group->type = SGT_REAL;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2249
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2250
					group->g.real.num_loaded  = num_loaded;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2251
					group->g.real.num_loading = num_loading;
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  2252
					if (num_loaded  > 0) group->g.real.loaded = CallocT<const SpriteGroup*>(num_loaded);
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  2253
					if (num_loading > 0) group->g.real.loading = CallocT<const SpriteGroup*>(num_loading);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2254
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2255
					grfmsg(6, "NewSpriteGroup: New SpriteGroup 0x%02X, %u views, %u loaded, %u loading",
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2256
							setid, sprites, num_loaded, num_loading);
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2257
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2258
					for (uint i = 0; i < num_loaded; i++) {
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2259
						uint16 spriteid = grf_load_word(&buf);
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2260
						group->g.real.loaded[i] = CreateGroupFromGroupID(feature, setid, type, spriteid, sprites);
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2261
						grfmsg(8, "NewSpriteGroup: + rg->loaded[%i]  = subset %u", i, spriteid);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2262
					}
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2263
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2264
					for (uint i = 0; i < num_loading; i++) {
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2265
						uint16 spriteid = grf_load_word(&buf);
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2266
						group->g.real.loading[i] = CreateGroupFromGroupID(feature, setid, type, spriteid, sprites);
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2267
						grfmsg(8, "NewSpriteGroup: + rg->loading[%i] = subset %u", i, spriteid);
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2268
					}
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2269
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2270
					break;
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2271
				}
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2272
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2273
				case GSF_TOWNHOUSE: {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2274
					byte sprites     = _cur_grffile->spriteset_numents;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2275
					byte num_sprites = max((uint8)1, type);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2276
					uint i;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2277
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2278
					group = AllocateSpriteGroup();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2279
					group->type = SGT_TILELAYOUT;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2280
					group->g.layout.num_sprites = sprites;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2281
					group->g.layout.dts = CallocT<DrawTileSprites>(1);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2282
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2283
					/* Groundsprite */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2284
					group->g.layout.dts->ground_sprite = grf_load_word(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2285
					group->g.layout.dts->ground_pal    = grf_load_word(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2286
					/* Remap transparent/colour modifier bits */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2287
					if (HASBIT(group->g.layout.dts->ground_sprite, 14)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2288
						CLRBIT(group->g.layout.dts->ground_sprite, 14);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2289
						SETBIT(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_TRANSPARENT);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2290
					}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2291
					if (HASBIT(group->g.layout.dts->ground_sprite, 15)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2292
						CLRBIT(group->g.layout.dts->ground_sprite, 15);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2293
						SETBIT(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_COLOR);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2294
					}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2295
					if (HASBIT(group->g.layout.dts->ground_pal, 14)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2296
						CLRBIT(group->g.layout.dts->ground_pal, 14);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2297
						SETBIT(group->g.layout.dts->ground_sprite, SPRITE_MODIFIER_OPAQUE);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2298
					}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2299
					if (HASBIT(group->g.layout.dts->ground_pal, 15)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2300
						/* Bit 31 set means this is a custom sprite, so rewrite it to the
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2301
						 * last spriteset defined. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2302
						SpriteID sprite = _cur_grffile->spriteset_start + GB(group->g.layout.dts->ground_sprite, 0, 14) * sprites;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2303
						SB(group->g.layout.dts->ground_sprite, 0, SPRITE_WIDTH, sprite);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2304
						CLRBIT(group->g.layout.dts->ground_pal, 15);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2305
					}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2306
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2307
					group->g.layout.dts->seq = CallocT<DrawTileSeqStruct>(num_sprites + 1);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2308
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2309
					for (i = 0; i < num_sprites; i++) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2310
						DrawTileSeqStruct *seq = (DrawTileSeqStruct*)&group->g.layout.dts->seq[i];
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2311
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2312
						seq->image = grf_load_word(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2313
						seq->pal   = grf_load_word(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2314
						seq->delta_x = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2315
						seq->delta_y = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2316
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2317
						if (HASBIT(seq->image, 14)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2318
							CLRBIT(seq->image, 14);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2319
							SETBIT(seq->image, PALETTE_MODIFIER_TRANSPARENT);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2320
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2321
						if (HASBIT(seq->image, 15)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2322
							CLRBIT(seq->image, 15);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2323
							SETBIT(seq->image, PALETTE_MODIFIER_COLOR);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2324
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2325
						if (HASBIT(seq->pal, 14)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2326
							CLRBIT(seq->pal, 14);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2327
							SETBIT(seq->image, SPRITE_MODIFIER_OPAQUE);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2328
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2329
						if (HASBIT(seq->pal, 15)) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2330
							/* Bit 31 set means this is a custom sprite, so rewrite it to the
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2331
							 * last spriteset defined. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2332
							SpriteID sprite = _cur_grffile->spriteset_start + GB(seq->image, 0, 14) * sprites;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2333
							SB(seq->image, 0, SPRITE_WIDTH, sprite);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2334
							CLRBIT(seq->pal, 15);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2335
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2336
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2337
						if (type > 0) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2338
							seq->delta_z = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2339
							if ((byte)seq->delta_z == 0x80) continue;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2340
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2341
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2342
						seq->size_x = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2343
						seq->size_y = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2344
						seq->size_z = grf_load_byte(&buf);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2345
					}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2346
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2347
					/* Set the terminator value. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2348
					((DrawTileSeqStruct*)group->g.layout.dts->seq)[i].delta_x = (byte)0x80;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2349
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2350
					break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2351
				}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2352
3668
42325f12e7d8 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
  2353
				/* Loading of Tile Layout and Production Callback groups would happen here */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2354
				default: grfmsg(1, "NewSpriteGroup: Unsupported feature %d, skipping", feature);
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2355
			}
2489
6fbb72b64e07 (svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
peter1138
parents: 2488
diff changeset
  2356
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2357
	}
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
  2358
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
  2359
	_cur_grffile->spritegroups[setid] = group;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2360
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2361
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2362
static CargoID TranslateCargo(uint8 feature, uint8 ctype)
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2363
{
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2364
	/* Special cargo types for purchase list and stations */
6148
5247b66aad19 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6147
diff changeset
  2365
	if (feature == GSF_STATION && ctype == 0xFE) return CT_DEFAULT_NA;
5247b66aad19 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6147
diff changeset
  2366
	if (ctype == 0xFF) return CT_PURCHASE;
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2367
6361
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2368
	if (_cur_grffile->cargo_max == 0) {
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2369
		/* No cargo table, so use bitnum values */
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2370
		if (ctype >= 32) {
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2371
			grfmsg(1, "FeatureMapSpriteGroup: Cargo bitnum %d out of range (max 31), skipping.", ctype);
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2372
			return CT_INVALID;
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2373
		}
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2374
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2375
		for (CargoID c = 0; c < NUM_CARGO; c++) {
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2376
			const CargoSpec *cs = GetCargo(c);
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2377
			if (!cs->IsValid()) continue;
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2378
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2379
			if (cs->bitnum == ctype) {
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2380
				grfmsg(6, "FeatureMapSpriteGroup: Cargo bitnum %d mapped to cargo type %d.", ctype, c);
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2381
				return c;
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2382
			}
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2383
		}
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2384
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2385
		grfmsg(5, "FeatureMapSpriteGroup: Cargo bitnum %d not available in this climate, skipping.", ctype);
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2386
		return CT_INVALID;
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2387
	}
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2388
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2389
	/* Check if the cargo type is out of bounds of the cargo translation table */
6361
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2390
	if (ctype >= _cur_grffile->cargo_max) {
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2391
		grfmsg(1, "FeatureMapSpriteGroup: Cargo type %d out of range (max %d), skipping.", ctype, _cur_grffile->cargo_max - 1);
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2392
		return CT_INVALID;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2393
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2394
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2395
	/* Look up the cargo label from the translation table */
6361
e3c29a0de66f (svn r9413) -Codechange: Remove default cargo translation table and use bitnums directly if no table is provided. This lets pre-cargolabel cargo definitions work.
peter1138
parents: 6359
diff changeset
  2396
	CargoLabel cl = _cur_grffile->cargo_list[ctype];
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2397
	if (cl == 0) {
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2398
		grfmsg(5, "FeatureMapSpriteGroup: Cargo type %d not available in this climate, skipping.", ctype);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2399
		return CT_INVALID;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2400
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2401
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2402
	ctype = GetCargoIDByLabel(cl);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2403
	if (ctype == CT_INVALID) {
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2404
		grfmsg(5, "FeatureMapSpriteGroup: Cargo '%c%c%c%c' unsupported, skipping.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8));
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2405
		return CT_INVALID;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2406
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2407
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2408
	grfmsg(6, "FeatureMapSpriteGroup: Cargo '%c%c%c%c' mapped to cargo type %d.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8), ctype);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2409
	return ctype;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2410
}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2411
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2412
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2413
static void VehicleMapSpriteGroup(byte *buf, byte feature, uint8 idcount, uint8 cidcount, bool wagover)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2414
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2415
	static byte *last_engines;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2416
	static int last_engines_count;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2417
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2418
	if (!wagover) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2419
		if (last_engines_count != idcount) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2420
			last_engines = ReallocT(last_engines, idcount);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2421
			last_engines_count = idcount;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2422
		}
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2423
	} else {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2424
		if (last_engines_count == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2425
			grfmsg(0, "FeatureMapSpriteGroup: WagonOverride: No engine to do override with");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2426
			return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2427
		}
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2428
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2429
		grfmsg(6, "FeatureMapSpriteGroup: WagonOverride: %u engines, %u wagons",
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2430
				last_engines_count, idcount);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2431
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2432
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2433
	for (uint i = 0; i < idcount; i++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2434
		uint8 engine_id = buf[3 + i];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2435
		uint8 engine = engine_id + _vehshifts[feature];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2436
		byte *bp = &buf[4 + idcount];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2437
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2438
		if (engine_id > _vehcounts[feature]) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2439
			grfmsg(0, "Id %u for feature 0x%02X is out of bounds", engine_id, feature);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2440
			return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2441
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2442
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2443
		grfmsg(7, "FeatureMapSpriteGroup: [%d] Engine %d...", i, engine);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2444
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2445
		for (uint c = 0; c < cidcount; c++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2446
			uint8 ctype = grf_load_byte(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2447
			uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2448
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2449
			grfmsg(8, "FeatureMapSpriteGroup: * [%d] Cargo type 0x%X, group id 0x%02X", c, ctype, groupid);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2450
2516
4659ceee4dcb (svn r3045) -NewGRF, Codechange: Don't attempt to map and empty sprite group to a vehicle.
peter1138
parents: 2515
diff changeset
  2451
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2452
				grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping", groupid, _cur_grffile->spritegroups_count);
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2453
				continue;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2454
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2455
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2456
			ctype = TranslateCargo(feature, ctype);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2457
			if (ctype == CT_INVALID) continue;
5338
a78592405640 (svn r7503) -Codechange: [NewGRF] Add bounds checking for spriteset cargo types. (NewCargo support will change this rule a bit...)
peter1138
parents: 5334
diff changeset
  2458
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2459
			if (wagover) {
4869
3a75d9b3b5ea (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4818
diff changeset
  2460
				SetWagonOverrideSprites(engine, ctype, _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
  2461
			} 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
  2462
				SetCustomEngineSprites(engine, ctype, _cur_grffile->spritegroups[groupid]);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2463
				last_engines[i] = engine;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2464
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2465
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2466
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2467
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2468
	{
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2469
		byte *bp = &buf[4 + idcount + cidcount * 3];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2470
		uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2471
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2472
		grfmsg(8, "-- Default group id 0x%04X", groupid);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2473
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2474
		for (uint i = 0; i < idcount; i++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2475
			uint8 engine = buf[3 + i] + _vehshifts[feature];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2476
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2477
			/* Don't tell me you don't love duplicated code! */
2516
4659ceee4dcb (svn r3045) -NewGRF, Codechange: Don't attempt to map and empty sprite group to a vehicle.
peter1138
parents: 2515
diff changeset
  2478
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2479
				grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2480
				       groupid, _cur_grffile->spritegroups_count);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2481
				continue;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2482
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2483
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2484
			if (wagover) {
3695
e1d5608f4d32 (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3694
diff changeset
  2485
				/* If the ID for this action 3 is the same as the vehicle ID,
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2486
 * this indicates we have a helicopter rotor override. */
3695
e1d5608f4d32 (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3694
diff changeset
  2487
				if (feature == GSF_AIRCRAFT && engine == last_engines[i]) {
e1d5608f4d32 (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3694
diff changeset
  2488
					SetRotorOverrideSprites(engine, _cur_grffile->spritegroups[groupid]);
e1d5608f4d32 (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3694
diff changeset
  2489
				} else {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2490
					/* TODO: No multiple cargo types per vehicle yet. --pasky */
6148
5247b66aad19 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6147
diff changeset
  2491
					SetWagonOverrideSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
3695
e1d5608f4d32 (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3694
diff changeset
  2492
				}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2493
			} else {
6148
5247b66aad19 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6147
diff changeset
  2494
				SetCustomEngineSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid]);
3924
d06b513d65c3 (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3895
diff changeset
  2495
				SetEngineGRF(engine, _cur_grffile);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2496
				last_engines[i] = engine;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2497
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2498
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2499
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2500
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2501
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2502
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2503
static void StationMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2504
{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2505
	for (uint i = 0; i < idcount; i++) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2506
		uint8 stid = buf[3 + i];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2507
		StationSpec *statspec = _cur_grffile->stations[stid];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2508
		byte *bp = &buf[4 + idcount];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2509
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2510
		for (uint c = 0; c < cidcount; c++) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2511
			uint8 ctype = grf_load_byte(&bp);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2512
			uint16 groupid = grf_load_word(&bp);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2513
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2514
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2515
				grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2516
				       groupid, _cur_grffile->spritegroups_count);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2517
				continue;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2518
			}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2519
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2520
			ctype = TranslateCargo(GSF_STATION, ctype);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2521
			if (ctype == CT_INVALID) continue;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2522
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2523
			statspec->spritegroup[ctype] = _cur_grffile->spritegroups[groupid];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2524
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2525
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2526
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2527
	{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2528
		byte *bp = &buf[4 + idcount + cidcount * 3];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2529
		uint16 groupid = grf_load_word(&bp);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2530
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2531
		if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2532
			grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2533
			       groupid, _cur_grffile->spritegroups_count);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2534
			return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2535
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2536
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2537
		for (uint i = 0; i < idcount; i++) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2538
			uint8 stid = buf[3 + i];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2539
			StationSpec *statspec = _cur_grffile->stations[stid];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2540
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2541
			statspec->spritegroup[CT_DEFAULT] = _cur_grffile->spritegroups[groupid];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2542
			statspec->grfid = _cur_grffile->grfid;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2543
			statspec->localidx = stid;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2544
			SetCustomStationSpec(statspec);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2545
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2546
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2547
}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2548
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2549
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2550
static void TownHouseMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2551
{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2552
	byte *bp = &buf[4 + idcount + cidcount * 3];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2553
	uint16 groupid = grf_load_word(&bp);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2554
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2555
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2556
		grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2557
		       groupid, _cur_grffile->spritegroups_count);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2558
		return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2559
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2560
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2561
	for (uint i = 0; i < idcount; i++) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2562
		uint8 hid = buf[3 + i];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2563
		HouseSpec *hs = _cur_grffile->housespec[hid];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2564
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2565
		if (hs == NULL) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2566
			grfmsg(1, "FeatureMapSpriteGroup: Too many houses defined, skipping");
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2567
			return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2568
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2569
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2570
		hs->spritegroup = _cur_grffile->spritegroups[groupid];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2571
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2572
}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2573
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2574
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2575
static void CargoMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2576
{
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2577
	byte *bp = &buf[4 + idcount + cidcount * 3];
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2578
	uint16 groupid = grf_load_word(&bp);
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2579
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2580
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2581
		grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2582
		       groupid, _cur_grffile->spritegroups_count);
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2583
		return;
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2584
	}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2585
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2586
	for (uint i = 0; i < idcount; i++) {
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2587
		CargoID cid = buf[3 + i];
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2588
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2589
		if (cid >= NUM_CARGO) {
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2590
			grfmsg(1, "FeatureMapSpriteGroup: Cargo ID %d out of range, skipping");
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2591
			continue;
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2592
		}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2593
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2594
		CargoSpec *cs = &_cargo[cid];
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2595
		cs->grfid = _cur_grffile->grfid;
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2596
		cs->group = _cur_grffile->spritegroups[groupid];
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2597
	}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2598
}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2599
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2600
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2601
/* Action 0x03 */
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2602
static void FeatureMapSpriteGroup(byte *buf, int len)
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2603
{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2604
	/* <03> <feature> <n-id> <ids>... <num-cid> [<cargo-type> <cid>]... <def-cid>
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2605
	 * id-list    := [<id>] [id-list]
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2606
	 * cargo-list := <cargo-type> <cid> [cargo-list]
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2607
	 *
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2608
	 * B feature       see action 0
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2609
	 * B n-id          bits 0-6: how many IDs this definition applies to
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2610
	 *                 bit 7: if set, this is a wagon override definition (see below)
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2611
	 * B ids           the IDs for which this definition applies
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2612
	 * B num-cid       number of cargo IDs (sprite group IDs) in this definition
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2613
	 *                 can be zero, in that case the def-cid is used always
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2614
	 * B cargo-type    type of this cargo type (e.g. mail=2, wood=7, see below)
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2615
	 * W cid           cargo ID (sprite group ID) for this type of cargo
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2616
	 * W def-cid       default cargo ID (sprite group ID) */
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2617
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2618
	if (!check_length(len, 6, "FeatureMapSpriteGroup")) return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2619
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2620
	uint8 feature = buf[1];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2621
	uint8 idcount = buf[2] & 0x7F;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2622
	bool wagover = (buf[2] & 0x80) == 0x80;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2623
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2624
	if (!check_length(len, 3 + idcount, "FeatureMapSpriteGroup")) return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2625
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2626
	/* If idcount is zero, this is a feature callback */
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2627
	if (idcount == 0) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2628
		grfmsg(2, "FeatureMapSpriteGroup: Feature callbacks not implemented yet");
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2629
		return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2630
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2631
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2632
	uint8 cidcount = buf[3 + idcount];
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2633
	if (!check_length(len, 4 + idcount + cidcount * 3, "FeatureMapSpriteGroup")) return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2634
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2635
	grfmsg(6, "FeatureMapSpriteGroup: Feature %d, %d ids, %d cids, wagon override %d",
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2636
			feature, idcount, cidcount, wagover);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2637
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2638
	if (_cur_grffile->spriteset_start == 0 || _cur_grffile->spritegroups == 0) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2639
		grfmsg(1, "FeatureMapSpriteGroup: No sprite set to work on! Skipping");
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2640
		return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2641
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2642
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2643
	switch (feature) {
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2644
		case GSF_TRAIN:
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2645
		case GSF_ROAD:
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2646
		case GSF_SHIP:
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2647
		case GSF_AIRCRAFT:
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2648
			VehicleMapSpriteGroup(buf, feature, idcount, cidcount, wagover);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2649
			return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2650
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2651
		case GSF_STATION:
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2652
			StationMapSpriteGroup(buf, idcount, cidcount);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2653
			return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2654
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2655
		case GSF_TOWNHOUSE:
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2656
			TownHouseMapSpriteGroup(buf, idcount, cidcount);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2657
			return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2658
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2659
		case GSF_CARGOS:
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2660
			CargoMapSpriteGroup(buf, idcount, cidcount);
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2661
			return;
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2662
6363
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2663
		default:
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2664
			grfmsg(1, "FeatureMapSpriteGroup: Unsupported feature %d, skipping", feature);
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2665
			return;
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2666
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2667
}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2668
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2669
/* Action 0x04 */
3879
cfa3cf4731d2 (svn r4928) CodeChange : Rename functions referring to "Vehicle" for "Feature".
belugas
parents: 3875
diff changeset
  2670
static void FeatureNewName(byte *buf, int len)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2671
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2672
	/* <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
  2673
	 *
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2674
	 * B veh-type      see action 0 (as 00..07, + 0A
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2675
	 *                 But IF veh-type = 48, then generic text
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2676
	 * B language-id   If bit 6 is set, This is the extended language scheme,
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2677
	                   with up to 64 language.
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2678
	                   Otherwise, it is a mapping where set bits have meaning
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2679
	                   0 = american, 1 = english, 2 = german, 3 = french, 4 = spanish
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2680
	                   Bit 7 set means this is a generic text, not a vehicle one (or else)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2681
	 * 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
  2682
	 * B/W offset      number of the first vehicle that gets a new name
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2683
	 *                 Byte : ID of vehicle to change
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2684
	 *                 Word : ID of string to change/add
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2685
	 * 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
  2686
	 *                 which the next name begins. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2687
3643
c04228043cb0 (svn r4552) - NewGRF: fix braino... in r4550, new_scheme should true when the version is 7 or higher, not less than 7...
peter1138
parents: 3642
diff changeset
  2688
	bool new_scheme = _cur_grffile->grf_version >= 7;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2689
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2690
	if (!check_length(len, 6, "FeatureNewName")) return;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2691
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2692
	uint8 feature  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2693
	uint8 lang     = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2694
	uint8 num      = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2695
	bool generic   = HASBIT(lang, 7);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2696
	uint16 id      = generic ? grf_load_word(&buf) : grf_load_byte(&buf);
4992
bd2716c79584 (svn r6995) - Codechange: NewGRF; strip bit 7 of the language ID earlier and handle handle a language ID of 0x7F as the preferred default language.
peter1138
parents: 4964
diff changeset
  2697
bd2716c79584 (svn r6995) - Codechange: NewGRF; strip bit 7 of the language ID earlier and handle handle a language ID of 0x7F as the preferred default language.
peter1138
parents: 4964
diff changeset
  2698
	CLRBIT(lang, 7);
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2699
3760
68d223d2df89 (svn r4751) - NewGRF: when assigning new texts, ignore the feature byte as some sets use generic feature always. Also, don't add vehicle id shifts if the vehicle id is out of range.
peter1138
parents: 3750
diff changeset
  2700
	if (feature <= GSF_AIRCRAFT && id < _vehcounts[feature]) {
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2701
		id += _vehshifts[feature];
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2702
	}
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2703
	uint16 endid = id + num;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2704
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2705
	grfmsg(6, "FeatureNewName: About to rename engines %d..%d (feature %d) in language 0x%02X",
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2706
	               id, endid, feature, lang);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2707
4992
bd2716c79584 (svn r6995) - Codechange: NewGRF; strip bit 7 of the language ID earlier and handle handle a language ID of 0x7F as the preferred default language.
peter1138
parents: 4964
diff changeset
  2708
	len -= generic ? 6 : 5;
bd2716c79584 (svn r6995) - Codechange: NewGRF; strip bit 7 of the language ID earlier and handle handle a language ID of 0x7F as the preferred default language.
peter1138
parents: 4964
diff changeset
  2709
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2710
	for (; id < endid && len > 0; id++) {
6090
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2711
		const char *name   = grf_load_string(&buf, len);
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2712
		size_t name_length = strlen(name) + 1;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2713
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2714
		len -= (int)name_length;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2715
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2716
		if (name_length == 1) {
6062
bc99beb6607d (svn r8792) -Fix (r6623): Don't check whether a string length is 1 when you already know it isn't.
maedhros
parents: 6030
diff changeset
  2717
			grfmsg(7, "FeatureNewName: Can't add empty name");
6090
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2718
		} else if (name_length > 127) {
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  2719
			grfmsg(7, "FeatureNewName: Too long a name (%d)", name_length);
6062
bc99beb6607d (svn r8792) -Fix (r6623): Don't check whether a string length is 1 when you already know it isn't.
maedhros
parents: 6030
diff changeset
  2720
		} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2721
			grfmsg(8, "FeatureNewName: %d <- %s", id, name);
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2722
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2723
			switch (feature) {
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2724
				case GSF_TRAIN:
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2725
				case GSF_ROAD:
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2726
				case GSF_SHIP:
3614
c697c69b6363 (svn r4510) - NewGRF bounds checking:
peter1138
parents: 3604
diff changeset
  2727
				case GSF_AIRCRAFT: {
3821
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2728
					if (id < TOTAL_NUM_ENGINES) {
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2729
						StringID string = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_8000_KIRBY_PAUL_TANK_STEAM + id);
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2730
						SetCustomEngineName(id, string);
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2731
					} else {
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2732
						AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, id);
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2733
					}
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2734
					break;
3614
c697c69b6363 (svn r4510) - NewGRF bounds checking:
peter1138
parents: 3604
diff changeset
  2735
				}
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2736
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2737
				case GSF_TOWNHOUSE:
3760
68d223d2df89 (svn r4751) - NewGRF: when assigning new texts, ignore the feature byte as some sets use generic feature always. Also, don't add vehicle id shifts if the vehicle id is out of range.
peter1138
parents: 3750
diff changeset
  2738
				default:
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2739
					switch (GB(id, 8, 8)) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2740
						case 0xC4: // Station class name
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  2741
							if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2742
								grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
3760
68d223d2df89 (svn r4751) - NewGRF: when assigning new texts, ignore the feature byte as some sets use generic feature always. Also, don't add vehicle id shifts if the vehicle id is out of range.
peter1138
parents: 3750
diff changeset
  2743
							} else {
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  2744
								StationClassID sclass = _cur_grffile->stations[GB(id, 0, 8)]->sclass;
3821
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2745
								SetStationClassName(sclass, AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED));
3760
68d223d2df89 (svn r4751) - NewGRF: when assigning new texts, ignore the feature byte as some sets use generic feature always. Also, don't add vehicle id shifts if the vehicle id is out of range.
peter1138
parents: 3750
diff changeset
  2746
							}
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2747
							break;
3760
68d223d2df89 (svn r4751) - NewGRF: when assigning new texts, ignore the feature byte as some sets use generic feature always. Also, don't add vehicle id shifts if the vehicle id is out of range.
peter1138
parents: 3750
diff changeset
  2748
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2749
						case 0xC5: // Station name
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  2750
							if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2751
								grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
3760
68d223d2df89 (svn r4751) - NewGRF: when assigning new texts, ignore the feature byte as some sets use generic feature always. Also, don't add vehicle id shifts if the vehicle id is out of range.
peter1138
parents: 3750
diff changeset
  2752
							} else {
3821
57db5bab0f24 (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3814
diff changeset
  2753
								_cur_grffile->stations[GB(id, 0, 8)]->name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
3760
68d223d2df89 (svn r4751) - NewGRF: when assigning new texts, ignore the feature byte as some sets use generic feature always. Also, don't add vehicle id shifts if the vehicle id is out of range.
peter1138
parents: 3750
diff changeset
  2754
							}
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2755
							break;
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2756
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2757
						case 0xC9: { // House name
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2758
							if (_cur_grffile->housespec == NULL || _cur_grffile->housespec[GB(id, 0, 8)] == NULL) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2759
								grfmsg(1, "FeatureNewName: Attempt to name undefined house 0x%X, ignoring.", GB(id, 0, 8));
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2760
							} else {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2761
								_cur_grffile->housespec[GB(id, 0, 8)]->building_name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2762
							}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2763
							break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2764
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2765
4504
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  2766
						case 0xD0:
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  2767
						case 0xDC:
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  2768
							AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  2769
							break;
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  2770
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2771
						default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2772
							grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2773
							break;
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2774
					}
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2775
					break;
3642
8da309b5fd2b (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3641
diff changeset
  2776
8da309b5fd2b (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3641
diff changeset
  2777
#if 0
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2778
				case GSF_CANAL :
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2779
				case GSF_BRIDGE :
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2780
					AddGRFString(_cur_spriteid, id, lang, name);
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2781
					switch (GB(id, 8,8)) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2782
						case 0xC9: // House name
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2783
						default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2784
							grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2785
					}
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2786
					break;
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2787
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2788
				case GSF_INDUSTRIES :
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2789
				case 0x48 :   // for generic strings
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2790
					AddGRFString(_cur_spriteid, id, lang, name);
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2791
					break;
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2792
				default :
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2793
					grfmsg(7, "FeatureNewName: Unsupported feature (0x%02X)", feature);
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2794
					break;
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2795
#endif
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  2796
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2797
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2798
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2799
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2800
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2801
/* Action 0x05 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2802
static void GraphicsNew(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2803
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2804
	/* <05> <graphics-type> <num-sprites> <other data...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2805
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2806
	 * 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
  2807
	 * 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
  2808
	 * 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
  2809
	/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2810
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2811
	SpriteID replace = 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2812
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  2813
	if (!check_length(len, 2, "GraphicsNew")) return;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2814
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2815
	uint8 type = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2816
	uint16 num = grf_load_extended(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2817
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2818
	switch (type) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2819
		case 0x04: // Signal graphics
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2820
			if (num != 112 && num != 240) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2821
				grfmsg(1, "GraphicsNews: Signal graphics sprite count must be 112 or 240, skipping");
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2822
				return;
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2823
			}
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2824
			_signal_base = _cur_spriteid;
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2825
			break;
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2826
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2827
		case 0x05: // Catenary graphics
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2828
			if (num != 48) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2829
				grfmsg(1, "GraphicsNews: Catenary graphics sprite count must be 48, skipping");
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2830
				return;
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2831
			}
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2832
			replace = SPR_ELRAIL_BASE + 3;
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2833
			break;
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2834
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2835
		case 0x06: // Foundations
3709
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2836
			if (num != 74) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2837
				grfmsg(1, "GraphicsNews: Foundation graphics sprite count must be 74, skipping");
3709
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2838
				return;
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2839
			}
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2840
			replace = SPR_SLOPES_BASE;
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2841
			break;
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2842
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2843
		case 0x08: // Canal graphics
3709
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2844
			if (num != 65) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2845
				grfmsg(1, "GraphicsNews: Canal graphics sprite count must be 65, skipping");
3709
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2846
				return;
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2847
			}
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2848
			replace = SPR_CANALS_BASE + 5;
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2849
			break;
ccccabc1e8bc (svn r4652) - NewGRF: support loading of foundation and canal graphics from NewGRF files via action 5
peter1138
parents: 3708
diff changeset
  2850
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2851
		case 0x0D: // Coast graphics
5210
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
  2852
			if (num != 16) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2853
				grfmsg(1, "GraphicsNews: Coast graphics sprite count must be 16, skipping");
5210
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
  2854
				return;
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
  2855
			}
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
  2856
			_coast_base = _cur_spriteid;
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
  2857
			break;
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
  2858
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2859
		default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2860
			grfmsg(2, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring)",
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2861
					type, num);
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2862
			return;
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2863
	}
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2864
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2865
	if (replace == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2866
		grfmsg(2, "GraphicsNew: Loading %u sprites of type 0x%02X at SpriteID 0x%04X", num, type, _cur_spriteid);
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2867
	} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2868
		grfmsg(2, "GraphicsNew: Replacing %u sprites of type 0x%02X at SpriteID 0x%04X", num, type, replace);
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2869
	}
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2870
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2871
	for (; num > 0; num--) {
3708
a152a2d1d4d1 (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  2872
		LoadNextSprite(replace == 0 ? _cur_spriteid++ : replace++, _file_index);
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2873
		_nfo_line++;
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3635
diff changeset
  2874
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2875
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2876
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2877
static uint32 GetParamVal(byte param, uint32 *cond_val)
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2878
{
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2879
	switch (param) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2880
		case 0x81: // current year
5340
8e534cd781cc (svn r7506) -Codechange: [NewGRF] Add action 7/9/D variable 0x81 (current year)
glx
parents: 5338
diff changeset
  2881
			return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
8e534cd781cc (svn r7506) -Codechange: [NewGRF] Add action 7/9/D variable 0x81 (current year)
glx
parents: 5338
diff changeset
  2882
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2883
		case 0x83: // current climate, 0=temp, 1=arctic, 2=trop, 3=toyland
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2884
			return _opt.landscape;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2885
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2886
		case 0x84: // GRF loading stage
5161
e5ba90f4da6f (svn r7266) -Codechange: Make the NewGRF loading stage look like ttdpatch to NewGRFs
peter1138
parents: 5115
diff changeset
  2887
			return (_cur_stage > GLS_INIT) | ((_cur_stage == GLS_ACTIVATION) << 9);
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2888
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2889
		case 0x85: // TTDPatch flags, only for bit tests
3811
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2890
			if (cond_val == NULL) {
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2891
				/* Supported in Action 0x07 and 0x09, not 0x0D */
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2892
				return 0;
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2893
			} else {
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2894
				uint32 param_val = _ttdpatch_flags[*cond_val / 0x20];
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2895
				*cond_val %= 0x20;
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2896
				return param_val;
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  2897
			}
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2898
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2899
		case 0x86: // road traffic side, bit 4 clear=left, set=right
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2900
			return _opt.road_side << 4;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2901
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2902
		case 0x88: // GRF ID check
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2903
			return 0;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2904
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2905
		case 0x8B: { // TTDPatch version
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2906
			uint major    = 2;
4993
dc740984a32f (svn r6996) - Codechange: Pretend to be the current version of TTDPatch. This value doesn't anything to us as we don't follow TTDPatch's development timeline...
peter1138
parents: 4992
diff changeset
  2907
			uint minor    = 6;
dc740984a32f (svn r6996) - Codechange: Pretend to be the current version of TTDPatch. This value doesn't anything to us as we don't follow TTDPatch's development timeline...
peter1138
parents: 4992
diff changeset
  2908
			uint revision = 0; // special case: 2.0.1 is 2.0.10
dc740984a32f (svn r6996) - Codechange: Pretend to be the current version of TTDPatch. This value doesn't anything to us as we don't follow TTDPatch's development timeline...
peter1138
parents: 4992
diff changeset
  2909
			uint build    = 1168;
dc740984a32f (svn r6996) - Codechange: Pretend to be the current version of TTDPatch. This value doesn't anything to us as we don't follow TTDPatch's development timeline...
peter1138
parents: 4992
diff changeset
  2910
			return (major << 24) | (minor << 20) | (revision << 16) | build;
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2911
		}
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2912
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2913
		case 0x8D: // TTD Version, 00=DOS, 01=Windows
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2914
			return !_use_dos_palette;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2915
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2916
		case 0x8E: // Y-offset for train sprites
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2917
			return _traininfo_vehicle_pitch;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2918
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2919
		case 0x92: // Game mode
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2920
			return _game_mode;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2921
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2922
		case 0x9A: // Always -1
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  2923
			return UINT_MAX;
5287
917cc6407bda (svn r7436) -Codechange: Add action7/9/D variable 0x9A (-1)
peter1138
parents: 5234
diff changeset
  2924
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2925
		case 0x9D: // TTD Platform, 00=TTDPatch, 01=OpenTTD
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2926
			return 1;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2927
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2928
		case 0x9E: // Miscellaneous GRF features
3814
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  2929
			return _misc_grf_features;
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  2930
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2931
		default:
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2932
			/* GRF Parameter */
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2933
			if (param < 0x80) return _cur_grffile->param[param];
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2934
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2935
			/* In-game variable. */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2936
			grfmsg(1, "Unsupported in-game variable 0x%02X", param);
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  2937
			return UINT_MAX;
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2938
	}
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2939
}
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  2940
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2941
/* Action 0x06 */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2942
static void CfgApply(byte *buf, int len)
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2943
{
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2944
	/* <06> <param-num> <param-size> <offset> ... <FF>
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2945
	 *
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2946
	 * B param-num     Number of parameter to substitute (First = "zero")
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2947
	 *                 Ignored if that parameter was not specified in newgrf.cfg
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2948
	 * B param-size    How many bytes to replace.  If larger than 4, the
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2949
	 *                 bytes of the following parameter are used.  In that
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2950
	 *                 case, nothing is applied unless *all* parameters
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2951
	 *                 were specified.
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2952
	 * B offset        Offset into data from beginning of next sprite
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2953
	 *                 to place where parameter is to be stored. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2954
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2955
	/* Preload the next sprite */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2956
	uint32 pos = FioGetPos();
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2957
	uint16 num = FioReadWord();
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2958
	uint8 type = FioReadByte();
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2959
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2960
	/* Check if the sprite is a pseudo sprite. We can't operate on real sprites. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2961
	if (type == 0xFF) {
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  2962
		_preload_sprite = MallocT<byte>(num);
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2963
		FioReadBlock(_preload_sprite, num);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2964
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2965
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2966
	/* Reset the file position to the start of the next sprite */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2967
	FioSeekTo(pos, SEEK_SET);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2968
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2969
	if (type != 0xFF) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2970
		grfmsg(2, "CfgApply: Ignoring (next sprite is real, unsupported)");
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2971
		return;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2972
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2973
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2974
	/* Now perform the Action 0x06 on our data. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2975
	buf++;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2976
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2977
	for (;;) {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2978
		uint i;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2979
		uint param_num;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2980
		uint param_size;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2981
		uint offset;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2982
		bool add_value;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2983
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2984
		/* Read the parameter to apply. 0xFF indicates no more data to change. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2985
		param_num = grf_load_byte(&buf);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2986
		if (param_num == 0xFF) break;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2987
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2988
		/* Get the size of the parameter to use. If the size covers multiple
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2989
		 * double words, sequential parameter values are used. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2990
		param_size = grf_load_byte(&buf);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2991
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2992
		/* Bit 7 of param_size indicates we should add to the original value
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2993
		 * instead of replacing it. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2994
		add_value  = HASBIT(param_size, 7);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2995
		param_size = GB(param_size, 0, 7);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2996
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2997
		/* Where to apply the data to within the pseudo sprite data. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2998
		offset     = grf_load_extended(&buf);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  2999
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3000
		/* If the parameter is a GRF parameter (not an internal variable) check
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3001
		 * if it (and all further sequential parameters) has been defined. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3002
		if (param_num < 0x80 && (param_num + (param_size - 1) / 4) >= _cur_grffile->param_end) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3003
			grfmsg(2, "CfgApply: Ignoring (param %d not set)", (param_num + (param_size - 1) / 4));
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3004
			break;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3005
		}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3006
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3007
		grfmsg(8, "CfgApply: Applying %u bytes from parameter 0x%02X at offset 0x%04X", param_size, param_num, offset);
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3008
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3009
		for (i = 0; i < param_size; i++) {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3010
			uint32 value = GetParamVal(param_num + i / 4, NULL);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3011
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3012
			if (add_value) {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3013
				_preload_sprite[offset + i] += GB(value, (i % 4) * 8, 8);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3014
			} else {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3015
				_preload_sprite[offset + i] = GB(value, (i % 4) * 8, 8);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3016
			}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3017
		}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3018
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3019
}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3020
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3021
/* Action 0x07 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3022
/* Action 0x09 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3023
static void SkipIf(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3024
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3025
	/* <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
  3026
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3027
	 * B param-num
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3028
	 * B param-size
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3029
	 * B condition-type
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3030
	 * V value
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3031
	 * B num-sprites */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3032
	/* TODO: More params. More condition types. */
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
  3033
	uint32 cond_val = 0;
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3034
	uint32 mask = 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3035
	bool result;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3036
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  3037
	if (!check_length(len, 6, "SkipIf")) return;
3714
aa27d8962f6a (svn r4657) - NewGRF: use grf_load_byte() in favour of array accesses
peter1138
parents: 3712
diff changeset
  3038
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3039
	uint8 param     = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3040
	uint8 paramsize = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3041
	uint8 condtype  = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3042
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3043
	if (condtype < 2) {
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3044
		/* 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
  3045
		paramsize = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3046
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3047
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3048
	switch (paramsize) {
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3049
		case 4: cond_val = grf_load_dword(&buf); mask = 0xFFFFFFFF; break;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3050
		case 2: cond_val = grf_load_word(&buf);  mask = 0x0000FFFF; break;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3051
		case 1: cond_val = grf_load_byte(&buf);  mask = 0x000000FF; break;
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3052
		default: break;
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3053
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3054
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3055
	if (param < 0x80 && _cur_grffile->param_end <= param) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3056
		grfmsg(7, "Param %d undefined, skipping test", param);
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3057
		return;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3058
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3059
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3060
	uint32 param_val = GetParamVal(param, &cond_val);
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3061
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3062
	grfmsg(7, "Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3063
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3064
	if (param == 0x88) {
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3065
		/* GRF ID checks */
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3066
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3067
		const GRFConfig *c = GetGRFConfig(cond_val);
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3068
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3069
		if (condtype != 10 && c == NULL) {
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3070
			grfmsg(7, "GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3071
			return;
5234
980aa61260aa (svn r7354) -Codechange: Remove grffile->flags and use grfconfig->flags exclusively. Update action 7/9 now that we know if GRFs are disabled.
peter1138
parents: 5228
diff changeset
  3072
		}
980aa61260aa (svn r7354) -Codechange: Remove grffile->flags and use grfconfig->flags exclusively. Update action 7/9 now that we know if GRFs are disabled.
peter1138
parents: 5228
diff changeset
  3073
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3074
		switch (condtype) {
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3075
			/* Tests 6 to 10 are only for param 0x88, GRFID checks */
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3076
			case 6: // Is GRFID active?
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3077
				result = c->status == GCS_ACTIVATED;
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3078
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3079
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3080
			case 7: // Is GRFID non-active?
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3081
				result = c->status != GCS_ACTIVATED;
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3082
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3083
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3084
			case 8: // GRFID is not but will be active?
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3085
				result = c->status == GCS_INITIALISED;
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3086
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3087
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3088
			case 9: // GRFID is or will be active?
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3089
				result = c->status == GCS_ACTIVATED || c->status == GCS_INITIALISED;
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3090
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3091
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3092
			case 10: // GRFID is not nor will be active
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3093
				/* This is the only condtype that doesn't get ignored if the GRFID is not found */
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3094
				result = c == NULL || c->flags == GCS_DISABLED || c->status == GCS_NOT_FOUND;
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3095
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3096
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3097
			default: grfmsg(1, "Unsupported GRF test %d. Ignoring", condtype); return;
5234
980aa61260aa (svn r7354) -Codechange: Remove grffile->flags and use grfconfig->flags exclusively. Update action 7/9 now that we know if GRFs are disabled.
peter1138
parents: 5228
diff changeset
  3098
		}
5452
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3099
	} else {
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3100
		/* Parameter or variable tests */
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3101
		switch (condtype) {
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3102
			case 0: result = !!(param_val & (1 << cond_val));
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3103
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3104
			case 1: result = !(param_val & (1 << cond_val));
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3105
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3106
			case 2: result = (param_val & mask) == cond_val;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3107
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3108
			case 3: result = (param_val & mask) != cond_val;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3109
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3110
			case 4: result = (param_val & mask) < cond_val;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3111
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3112
			case 5: result = (param_val & mask) > cond_val;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3113
				break;
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3114
089bef783925 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5430
diff changeset
  3115
			default: grfmsg(1, "Unsupported test %d. Ignoring", condtype); return;
5234
980aa61260aa (svn r7354) -Codechange: Remove grffile->flags and use grfconfig->flags exclusively. Update action 7/9 now that we know if GRFs are disabled.
peter1138
parents: 5228
diff changeset
  3116
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3117
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3118
1607
fd027776f222 (svn r2111) So, result is bool therefore no need for this horrible == 0 thing.
pasky
parents: 1606
diff changeset
  3119
	if (!result) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3120
		grfmsg(2, "Not skipping sprites, test was false");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3121
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3122
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3123
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3124
	uint8 numsprites = grf_load_byte(&buf);
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3125
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3126
	/* numsprites can be a GOTO label if it has been defined in the GRF
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3127
	 * file. The jump will always be the first matching label that follows
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3128
	 * the current nfo_line. If no matching label is found, the first matching
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3129
	 * label in the file is used. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3130
	GRFLabel *choice = NULL;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3131
	for (GRFLabel *label = _cur_grffile->label; label != NULL; label = label->next) {
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3132
		if (label->label != numsprites) continue;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3133
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3134
		/* Remember a goto before the current line */
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3135
		if (choice == NULL) choice = label;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3136
		/* If we find a label here, this is definitely good */
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3137
		if (label->nfo_line > _nfo_line) {
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3138
			choice = label;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3139
			break;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3140
		}
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3141
	}
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3142
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3143
	if (choice != NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3144
		grfmsg(2, "Jumping to label 0x%0X at line %d, test was true", choice->label, choice->nfo_line);
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3145
		FioSeekTo(choice->pos, SEEK_SET);
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3146
		_nfo_line = choice->nfo_line;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3147
		return;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3148
	}
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3149
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3150
	grfmsg(2, "Skipping %d sprites, test was true", numsprites);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3151
	_skip_sprites = numsprites;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3152
	if (_skip_sprites == 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3153
		/* 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
  3154
		 * we use -1 to indicate that all further
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3155
		 * sprites should be skipped. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3156
		_skip_sprites = -1;
6096
aafc68ecee06 (svn r8831) -Feature: If an action 7/9 leads to skipping the rest of the file, disable the
maedhros
parents: 6095
diff changeset
  3157
aafc68ecee06 (svn r8831) -Feature: If an action 7/9 leads to skipping the rest of the file, disable the
maedhros
parents: 6095
diff changeset
  3158
		/* If an action 8 hasn't been encountered yet, disable the grf. */
6373
75654b0484cd (svn r9436) -Fix (r9411): don't deactivate GRF in an action 7/9 during reservation (and loading of cargo data), and action 6 should be run also
peter1138
parents: 6365
diff changeset
  3159
		if (_cur_stage != GLS_RESERVE && _cur_grfconfig->status != GCS_ACTIVATED) _cur_grfconfig->status = GCS_DISABLED;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3160
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3161
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3162
5317
a41d1389c092 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3163
5502
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3164
/* Action 0x08 (GLS_FILESCAN) */
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3165
static void ScanInfo(byte *buf, int len)
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3166
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3167
	if (!check_length(len, 8, "Info")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3168
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3169
	grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3170
	uint32 grfid  = grf_load_dword(&buf);
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3171
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3172
	_cur_grfconfig->grfid = grfid;
5317
a41d1389c092 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3173
5329
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  3174
	/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  3175
	if (GB(grfid, 24, 8) == 0xFF) SETBIT(_cur_grfconfig->flags, GCF_SYSTEM);
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  3176
5317
a41d1389c092 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3177
	len -= 6;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3178
	const char *name = grf_load_string(&buf, len);
6186
fdb3705ca465 (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6148
diff changeset
  3179
	_cur_grfconfig->name = TranslateTTDPatchCodes(name);
fdb3705ca465 (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6148
diff changeset
  3180
fdb3705ca465 (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6148
diff changeset
  3181
	len -= strlen(name) + 1;
fdb3705ca465 (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6148
diff changeset
  3182
	if (len > 0) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3183
		const char *info = grf_load_string(&buf, len);
6186
fdb3705ca465 (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6148
diff changeset
  3184
		_cur_grfconfig->info = TranslateTTDPatchCodes(info);
5317
a41d1389c092 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3185
	}
5329
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  3186
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  3187
	/* GLS_INFOSCAN only looks for the action 8, so we can skip the rest of the file */
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3188
	_skip_sprites = -1;
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3189
}
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3190
3640
afe6a5032f6a (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3191
/* Action 0x08 */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3192
static void GRFInfo(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3193
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3194
	/* <08> <version> <grf-id> <name> <info>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3195
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3196
	 * B version       newgrf version, currently 06
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3197
	 * 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
  3198
	 * S name          name of this .grf set
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3199
	 * S info          string describing the set, and e.g. author and copyright */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3200
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3201
	if (!check_length(len, 8, "GRFInfo")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3202
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3203
	uint8 version    = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3204
	uint32 grfid     = grf_load_dword(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3205
	const char *name = grf_load_string(&buf, len - 6);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3206
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3207
	_cur_grffile->grfid = grfid;
3640
afe6a5032f6a (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3208
	_cur_grffile->grf_version = version;
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3209
	_cur_grfconfig->status = _cur_stage < GLS_ACTIVATION ? GCS_INITIALISED : GCS_ACTIVATED;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3210
3711
431475cbb208 (svn r4654) - Fix [NewGRF]: Properly read in the GRFID. This fixes GRFID checking and activation/deactivation. Do swap the GRFID for displaying purposes.
Darkvater
parents: 3709
diff changeset
  3211
	/* Do swap the GRFID for displaying purposes since people expect that */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3212
	DEBUG(grf, 1, "Loaded GRFv%d set %08lX - %s", version, BSWAP32(grfid), name);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3213
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3214
3640
afe6a5032f6a (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3215
/* Action 0x0A */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3216
static void SpriteReplace(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3217
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3218
	/* <0A> <num-sets> <set1> [<set2> ...]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3219
	 * <set>: <num-sprites> <first-sprite>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3220
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3221
	 * 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
  3222
	 * Each set:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3223
	 * 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
  3224
	 * W first-sprite  First sprite number to replace */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3225
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3226
	buf++; // skip action byte
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3227
	uint8 num_sets = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3228
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3229
	for (uint i = 0; i < num_sets; i++) {
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
  3230
		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
  3231
		uint16 first_sprite = grf_load_word(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3232
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3233
		grfmsg(2, "SpriteReplace: [Set %d] Changing %d sprites, beginning with %d",
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
  3234
			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
  3235
		);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3236
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3237
		for (uint j = 0; j < num_sprites; j++) {
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
  3238
			LoadNextSprite(first_sprite + j, _file_index); // XXX
3557
1e9867319bce (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  3239
			_nfo_line++;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3240
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3241
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3242
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3243
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  3244
/* Action 0x0B */
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3245
static void GRFLoadError(byte *buf, int len)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3246
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3247
	/* <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
  3248
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3249
	 * B severity      00: notice, contine loading grf file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3250
	 *                 01: warning, continue loading grf file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3251
	 *                 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
  3252
	 *                     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
  3253
	 *                 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
  3254
	 *                     the future (only when restarting the patch)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3255
	 * 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
  3256
	 * B message-id    message to show, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3257
	 * 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
  3258
	 *                 not present for built-in messages.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3259
	 * V data          additional data for built-in (or custom) messages
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3260
	 * B parnum        parameter numbers to be shown in the message (maximum of 2) */
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3261
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3262
	static const StringID msgstr[] = {
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3263
		STR_NEWGRF_ERROR_VERSION_NUMBER,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3264
		STR_NEWGRF_ERROR_DOS_OR_WINDOWS,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3265
		STR_NEWGRF_ERROR_UNSET_SWITCH,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3266
		STR_NEWGRF_ERROR_INVALID_PARAMETER,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3267
		STR_NEWGRF_ERROR_LOAD_BEFORE,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3268
		STR_NEWGRF_ERROR_LOAD_AFTER
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3269
	};
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  3270
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3271
	static const StringID sevstr[] = {
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3272
		STR_NEWGRF_ERROR_MSG_INFO,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3273
		STR_NEWGRF_ERROR_MSG_WARNING,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3274
		STR_NEWGRF_ERROR_MSG_ERROR,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3275
		STR_NEWGRF_ERROR_MSG_FATAL
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  3276
	};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3277
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3278
	/* AddGRFString expects the string to be referred to by an id in the newgrf
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3279
	 * file. Errors messages are never referred to however, so invent ids that
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3280
	 * are unlikely to be reached in a newgrf file so they don't overwrite
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3281
	 * anything else. */
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3282
	enum {
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3283
		MESSAGE_STRING_ID = MAX_UVALUE(StringID) - 1,
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3284
		MESSAGE_DATA_ID   = MAX_UVALUE(StringID)
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3285
	};
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3286
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3287
	if (!check_length(len, 6, "GRFLoadError")) return;
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3288
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3289
	/* For now we can only show one message per newgrf file. */
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3290
	if (_cur_grfconfig->error != NULL) return;
6090
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  3291
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3292
	buf++; // Skip the action byte.
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3293
	byte severity   = grf_load_byte(&buf);
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3294
	byte lang       = grf_load_byte(&buf);
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3295
	byte message_id = grf_load_byte(&buf);
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3296
	len -= 4;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3297
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3298
	/* Skip the error until the activation stage unless bit 7 of the severity
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3299
	 * is set. */
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3300
	if (!HASBIT(severity, 7) && _cur_stage < GLS_ACTIVATION) {
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3301
		grfmsg(7, "Skipping non-fatal GRFLoadError in stage 1");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3302
		return;
3588
69817310ddf8 (svn r4474) - NewGRF: Skip non-fatal errors when not in stage 2.
peter1138
parents: 3577
diff changeset
  3303
	}
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3304
	CLRBIT(severity, 7);
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3305
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3306
	if (severity >= lengthof(sevstr)) {
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3307
		grfmsg(7, "GRFLoadError: Invalid severity id %d. Setting to 2 (non-fatal error).", severity);
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3308
		severity = 2;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3309
	} else if (severity == 3) {
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3310
		/* This is a fatal error, so make sure the GRF is deactivated and no
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3311
		 * more of it gets loaded. */
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3312
		_cur_grfconfig->status = GCS_DISABLED;
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3313
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3314
		_skip_sprites = -1;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3315
	}
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3316
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3317
	if (message_id >= lengthof(msgstr) && message_id != 0xFF) {
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3318
		grfmsg(7, "GRFLoadError: Invalid message id.");
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3319
		return;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3320
	}
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3321
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3322
	if (len <= 1) {
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3323
		grfmsg(7, "GRFLoadError: No message data supplied.");
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3324
		return;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3325
	}
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3326
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3327
	bool new_scheme = _cur_grffile->grf_version >= 7;
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3328
	GRFError *error = CallocT<GRFError>(1);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3329
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3330
	error->severity = sevstr[severity];
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3331
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3332
	if (message_id == 0xFF) {
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3333
		/* This is a custom error message. */
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3334
		const char *message = grf_load_string(&buf, len);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3335
		len -= (strlen(message) + 1);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3336
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3337
		error->message = AddGRFString(_cur_grffile->grfid, MESSAGE_STRING_ID, lang, new_scheme, message, STR_UNDEFINED);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3338
	} else {
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3339
		error->message = msgstr[message_id];
6103
d38163ddfef9 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6096
diff changeset
  3340
	}
d38163ddfef9 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6096
diff changeset
  3341
6139
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3342
	if (len > 0) {
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3343
		const char *data = grf_load_string(&buf, len);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3344
		len -= (strlen(data) + 1);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3345
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3346
		error->data = AddGRFString(_cur_grffile->grfid, MESSAGE_DATA_ID, lang, new_scheme, data, STR_UNDEFINED);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3347
	}
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3348
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3349
	/* Only two parameter numbers can be used in the string. */
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3350
	uint i = 0;
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3351
	for (; i < 2 && len > 0; i++) {
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3352
		error->param_number[i] = grf_load_byte(&buf);
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3353
		len--;
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3354
	}
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3355
	error->num_params = i;
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3356
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3357
	_cur_grfconfig->error = error;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3358
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3359
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  3360
/* Action 0x0C */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3361
static void GRFComment(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3362
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3363
	/* <0C> [<ignored...>]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3364
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3365
	 * V ignored       Anything following the 0C is ignored */
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3366
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3367
	if (len == 1) return;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3368
6107
2a0a919dc46a (svn r8843) -Fix
tron
parents: 6103
diff changeset
  3369
	int text_len = len - 1;
2a0a919dc46a (svn r8843) -Fix
tron
parents: 6103
diff changeset
  3370
	const char *text = (const char*)(buf + 1);
2a0a919dc46a (svn r8843) -Fix
tron
parents: 6103
diff changeset
  3371
	grfmsg(2, "GRFComment: %.*s", text_len, text);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3372
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3373
5525
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3374
/* Action 0x0D (GLS_SAFETYSCAN) */
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3375
static void SafeParamSet(byte *buf, int len)
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3376
{
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  3377
	if (!check_length(len, 5, "SafeParamSet")) return;
5525
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3378
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3379
	uint8 target = grf_load_byte(&buf);
5525
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3380
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3381
	/* Only writing GRF parameters is considered safe */
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3382
	if (target < 0x80) return;
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3383
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3384
	/* GRM could be unsafe, but as here it can only happen after other GRFs
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3385
	 * are loaded, it should be okay. If the GRF tried to use the slots it
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3386
	 * reserved, it would be marked unsafe anyway. GRM for (e.g. bridge)
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3387
	 * sprites  is considered safe. */
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3388
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3389
	SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3390
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3391
	/* Skip remainder of GRF */
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3392
	_skip_sprites = -1;
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3393
}
c4aadd23c749 (svn r7831) -Codechange: [NewGRF] Do not mark as unsafe those NewGRFs that set their own parameters (via action D) and/or change only bridge sprite table layouts (action 0, property D).
peter1138
parents: 5502
diff changeset
  3394
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3395
/* Action 0x0D */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3396
static void ParamSet(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3397
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3398
	/* <0D> <target> <operation> <source1> <source2> [<data>]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3399
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3400
	 * B target        parameter number where result is stored
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3401
	 * B operation     operation to perform, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3402
	 * B source1       first source operand
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3403
	 * B source2       second source operand
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3404
	 * 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
  3405
	 *                 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
  3406
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3407
	 * Operations
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3408
	 * 00      Set parameter equal to source1
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3409
	 * 01      Addition, source1 + source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3410
	 * 02      Subtraction, source1 - source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3411
	 * 03      Unsigned multiplication, source1 * source2 (both unsigned)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3412
	 * 04      Signed multiplication, source1 * source2 (both signed)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3413
	 * 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
  3414
	 *         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
  3415
	 *         negative, source1 is unsigned)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3416
	 * 06      Signed bit shift, source1 by source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3417
	 *         (source2 like in 05, and source1 as well)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3418
	 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3419
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  3420
	if (!check_length(len, 5, "ParamSet")) return;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3421
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3422
	uint8 target = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3423
	uint8 oper   = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3424
	uint32 src1  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3425
	uint32 src2  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3426
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3427
	uint32 data = 0;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3428
	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
  3429
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3430
	/* 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
  3431
	 * 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
  3432
	 * defined if any of the following applies:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3433
	 * - 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
  3434
	 * - 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
  3435
	 *   an earlier action D */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3436
	if (HASBIT(oper, 7)) {
3807
736ea84b3cf4 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  3437
		if (target < 0x80 && target < _cur_grffile->param_end) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3438
			grfmsg(7, "Param %u already defined, skipping", target);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3439
			return;
3807
736ea84b3cf4 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  3440
		}
736ea84b3cf4 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  3441
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3442
		oper = GB(oper, 0, 7);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3443
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3444
3808
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3445
	if (src2 == 0xFE) {
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3446
		if (GB(data, 0, 8) == 0xFF) {
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3447
			if (data == 0x0000FFFF) {
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3448
				/* Patch variables */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3449
				grfmsg(2, "ParamSet: Reading Patch variables unsupported");
3808
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3450
				return;
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3451
			} else {
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3452
				/* GRF Resource Management */
5225
af5d9de16c8d (svn r7345) -Codechange: enumification of NewGRF loading stage, and move enum definition to header for future use.
peter1138
parents: 5211
diff changeset
  3453
				if (_cur_stage != GLS_ACTIVATION) {
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3454
					/* Ignore GRM during initialization */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3455
					src1 = 0;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3456
				} else {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3457
					uint8  op      = src1;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3458
					uint8  feature = GB(data, 8, 8);
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3459
					uint16 count   = GB(data, 16, 16);
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3460
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3461
					switch (feature) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3462
						case 0x00: // Trains
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3463
						case 0x01: // Road Vehicles
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3464
						case 0x02: // Ships
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3465
						case 0x03: // Aircraft
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3466
						{
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3467
							uint start = 0;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3468
							uint size  = 0;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3469
							uint shift = _vehshifts[feature];
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3470
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3471
							if (op == 6) {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3472
								/* Return GRFID of set that reserved ID */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3473
								src1 = _grm_engines[shift + _cur_grffile->param[target]];
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3474
								break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3475
							}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3476
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3477
							/* With an operation of 2 or 3, we want to reserve a specific block of IDs */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3478
							if (op == 2 || op == 3) start = _cur_grffile->param[target];
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3479
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3480
							for (uint i = start; i < _vehcounts[feature]; i++) {
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3481
								if (_grm_engines[shift + i] == 0) {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3482
									size++;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3483
								} else {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3484
									if (op == 2 || op == 3) break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3485
									start = i + 1;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3486
									size = 0;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3487
								}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3488
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3489
								if (size == count) break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3490
							}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3491
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3492
							if (size == count) {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3493
								/* Got the slot... */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3494
								if (op == 0 || op == 3) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3495
									grfmsg(2, "GRM: Reserving %d vehicles at %d", count, start);
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3496
									for (uint i = 0; i < count; i++) _grm_engines[shift + start + i] = _cur_grffile->grfid;
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3497
								}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3498
								src1 = start;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3499
							} else {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3500
								/* Unable to allocate */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3501
								if (op != 4 && op != 5) {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3502
									/* Deactivate GRF */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3503
									grfmsg(0, "GRM: Unable to allocate %d vehicles, deactivating", count);
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3504
									_cur_grfconfig->status = GCS_DISABLED;
5011
0b0003ba213e (svn r7031) -Codechange: Use _skip_sprites to skip the rest of the NewGRF when disabled by GRM, and add a shortcut so that the rest of the file isn't scanned.
peter1138
parents: 5008
diff changeset
  3505
0b0003ba213e (svn r7031) -Codechange: Use _skip_sprites to skip the rest of the NewGRF when disabled by GRM, and add a shortcut so that the rest of the file isn't scanned.
peter1138
parents: 5008
diff changeset
  3506
									_skip_sprites = -1;
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3507
									return;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3508
								}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3509
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3510
								grfmsg(1, "GRM: Unable to allocate %d vehicles", count);
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  3511
								src1 = UINT_MAX;
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3512
							}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3513
							break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3514
						}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3515
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3516
						case 0x08: // General sprites
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3517
							switch (op) {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3518
								case 0:
5889
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3519
									/* Check if the allocated sprites will fit below the original sprite limit */
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3520
									if (_cur_spriteid + count >= 16384) {
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3521
										grfmsg(0, "GRM: Unable to allocate %d sprites; try changing NewGRF order", count);
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3522
										_cur_grfconfig->status = GCS_DISABLED;
5889
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3523
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3524
										_skip_sprites = -1;
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3525
										return;
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3526
									}
461a9fbf58da (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 5875
diff changeset
  3527
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3528
									/* 'Reserve' space at the current sprite ID */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3529
									src1 = _cur_spriteid;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3530
									_cur_spriteid += count;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3531
									break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3532
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3533
								case 1:
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3534
									src1 = _cur_spriteid;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3535
									break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3536
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3537
								default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3538
									grfmsg(1, "GRM: Unsupported operation %d for general sprites", op);
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3539
									return;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3540
							}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3541
							break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3542
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3543
						default: grfmsg(1, "GRM: Unsupported feature 0x%X", feature); return;
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3544
					}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  3545
				}
3808
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3546
			}
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3547
		} else {
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3548
			/* Read another GRF File's parameter */
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3549
			const GRFFile *file = GetFileByGRFID(data);
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3550
			if (file == NULL || src1 >= file->param_end) {
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3551
				src1 = 0;
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3552
			} else {
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3553
				src1 = file->param[src1];
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3554
			}
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3555
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3556
	} else {
3808
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3557
		/* The source1 and source2 operands refer to the grf parameter number
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3558
		 * like in action 6 and 7.  In addition, they can refer to the special
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3559
		 * variables available in action 7, or they can be FF to use the value
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3560
		 * of <data>.  If referring to parameters that are undefined, a value
dadaaa757e8f (svn r4818) - NewGRF: add support for reading another GRF file's parameters, and warn if GRF Resource Management is tried.
peter1138
parents: 3807
diff changeset
  3561
		 * of 0 is used instead.  */
3811
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3562
		src1 = (src1 == 0xFF) ? data : GetParamVal(src1, NULL);
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3563
		src2 = (src2 == 0xFF) ? data : GetParamVal(src2, NULL);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3564
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3565
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3566
	/* 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
  3567
	 * 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
  3568
	 * 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
  3569
	 * 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
  3570
	 * instead. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3571
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3572
	uint32 res;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3573
	switch (oper) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3574
		case 0x00:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3575
			res = src1;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3576
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3577
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3578
		case 0x01:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3579
			res = src1 + src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3580
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3581
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3582
		case 0x02:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3583
			res = src1 - src2;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3584
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3585
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3586
		case 0x03:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3587
			res = src1 * src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3588
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3589
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3590
		case 0x04:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3591
			res = (int32)src1 * (int32)src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3592
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3593
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3594
		case 0x05:
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  3595
			if ((int32)src2 < 0) {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3596
				res = src1 >> -(int32)src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  3597
			} else {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3598
				res = src1 << src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  3599
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3600
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3601
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3602
		case 0x06:
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  3603
			if ((int32)src2 < 0) {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3604
				res = (int32)src1 >> -(int32)src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  3605
			} else {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3606
				res = (int32)src1 << src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  3607
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3608
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3609
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3610
		case 0x07: // Bitwise AND
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3611
			res = src1 & src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3612
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3613
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3614
		case 0x08: // Bitwise OR
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3615
			res = src1 | src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3616
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3617
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3618
		case 0x09: // Unsigned division
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3619
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3620
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3621
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3622
				res = src1 / src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3623
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3624
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3625
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3626
		case 0x0A: // Signed divison
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3627
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3628
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3629
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3630
				res = (int32)src1 / (int32)src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3631
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3632
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3633
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3634
		case 0x0B: // Unsigned modulo
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3635
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3636
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3637
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3638
				res = src1 % src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3639
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3640
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3641
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3642
		case 0x0C: // Signed modulo
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3643
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3644
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3645
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3646
				res = (int32)src1 % (int32)src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3647
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3648
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  3649
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3650
		default: grfmsg(0, "ParamSet: Unknown operation %d, skipping", oper); return;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3651
	}
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3652
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3653
	switch (target) {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3654
		case 0x8E: // Y-Offset for train sprites
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3655
			_traininfo_vehicle_pitch = res;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3656
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3657
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3658
		/* @todo implement */
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3659
		case 0x8F: // Rail track type cost factors
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3660
		case 0x93: // Tile refresh offset to left
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3661
		case 0x94: // Tile refresh offset to right
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3662
		case 0x95: // Tile refresh offset upwards
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3663
		case 0x96: // Tile refresh offset downwards
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3664
		case 0x97: // Snow line height
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3665
		case 0x99: // Global ID offset
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3666
			grfmsg(7, "ParamSet: Skipping unimplemented target 0x%02X", target);
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3667
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3668
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3669
		case 0x9E: // Miscellaneous GRF features
3814
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  3670
			_misc_grf_features = res;
3845
af6eb0103fed (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  3671
			/* Set train list engine width */
af6eb0103fed (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  3672
			_traininfo_vehicle_width = HASBIT(res, 3) ? 32 : 29;
3814
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  3673
			break;
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  3674
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3675
		default:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3676
			if (target < 0x80) {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3677
				_cur_grffile->param[target] = res;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3678
				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
  3679
			} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3680
				grfmsg(7, "ParamSet: Skipping unknown target 0x%02X", target);
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3681
			}
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  3682
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3683
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3684
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3685
5502
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3686
/* Action 0x0E (GLS_SAFETYSCAN) */
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3687
static void SafeGRFInhibit(byte *buf, int len)
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3688
{
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3689
	/* <0E> <num> <grfids...>
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3690
	 *
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3691
	 * B num           Number of GRFIDs that follow
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3692
	 * D grfids        GRFIDs of the files to deactivate */
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3693
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3694
	if (!check_length(len, 2, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3695
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3696
	uint8 num = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3697
	if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3698
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3699
	for (uint i = 0; i < num; i++) {
5502
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3700
		uint32 grfid = grf_load_dword(&buf);
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3701
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3702
		/* GRF is unsafe it if tries to deactivate other GRFs */
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3703
		if (grfid != _cur_grfconfig->grfid) {
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3704
			SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3705
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3706
			/* Skip remainder of GRF */
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3707
			_skip_sprites = -1;
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3708
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3709
			return;
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3710
		}
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3711
	}
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3712
}
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  3713
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  3714
/* Action 0x0E */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3715
static void GRFInhibit(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3716
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3717
	/* <0E> <num> <grfids...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3718
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3719
	 * B num           Number of GRFIDs that follow
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3720
	 * D grfids        GRFIDs of the files to deactivate */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3721
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3722
	if (!check_length(len, 2, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3723
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3724
	uint8 num = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3725
	if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3726
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3727
	for (uint i = 0; i < num; i++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3728
		uint32 grfid = grf_load_dword(&buf);
5333
dedf1f6de6d3 (svn r7495) -Fix (r7354): [NewGRF] Deactivate the target GRF, not the current GRF.
peter1138
parents: 5329
diff changeset
  3729
		GRFConfig *file = GetGRFConfig(grfid);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3730
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3731
		/* Unset activation flag */
5369
6420e8dd829c (svn r7554) -Fix (r7496): In Action 0xE, don't deactivate the current GRF (to be ported to 0.5)
peter1138
parents: 5340
diff changeset
  3732
		if (file != NULL && file != _cur_grfconfig) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3733
			grfmsg(2, "GRFInhibit: Deactivating file '%s'", file->filename);
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3734
			file->status = GCS_DISABLED;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3735
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3736
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3737
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3738
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  3739
/* Action 0x10 */
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3740
static void DefineGotoLabel(byte *buf, int len)
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3741
{
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3742
	/* <10> <label> [<comment>]
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3743
	 *
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3744
	 * B label      The label to define
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3745
	 * V comment    Optional comment - ignored */
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3746
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  3747
	if (!check_length(len, 1, "DefineGotoLabel")) return;
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3748
	buf++; len--;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3749
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3750
	GRFLabel *label = MallocT<GRFLabel>(1);
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3751
	label->label    = grf_load_byte(&buf);
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3752
	label->nfo_line = _nfo_line;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3753
	label->pos      = FioGetPos();
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3754
	label->next     = NULL;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3755
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3756
	/* Set up a linked list of goto targets which we will search in an Action 0x7/0x9 */
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3757
	if (_cur_grffile->label == NULL) {
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3758
		_cur_grffile->label = label;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3759
	} else {
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3760
		/* Attach the label to the end of the list */
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3761
		GRFLabel *l;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3762
		for (l = _cur_grffile->label; l->next != NULL; l = l->next);
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3763
		l->next = label;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3764
	}
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3765
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3766
	grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", label->label);
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  3767
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3768
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3769
/* Action 0x11 */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3770
static void GRFSound(byte *buf, int len)
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3771
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3772
	/* <11> <num>
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3773
	 *
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3774
	 * W num      Number of sound files that follow */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3775
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  3776
	if (!check_length(len, 1, "GRFSound")) return;
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3777
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3778
	uint16 num = grf_load_word(&buf);
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3779
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3780
	_grf_data_blocks = num;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3781
	_grf_data_type   = GDT_SOUND;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3782
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3783
	if (_cur_grffile->sound_offset == 0) _cur_grffile->sound_offset = GetNumSounds();
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3784
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3785
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3786
static void ImportGRFSound(byte *buf, int len)
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3787
{
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3788
	const GRFFile *file;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3789
	FileEntry *se = AllocateFileEntry();
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3790
	uint32 grfid = grf_load_dword(&buf);
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3791
	uint16 sound = grf_load_word(&buf);
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3792
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3793
	file = GetFileByGRFID(grfid);
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3794
	if (file == NULL || file->sound_offset == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3795
		grfmsg(1, "ImportGRFSound: Source file not available");
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3796
		return;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3797
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3798
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3799
	if (file->sound_offset + sound >= GetNumSounds()) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3800
		grfmsg(1, "ImportGRFSound: Sound effect %d is invalid", sound);
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3801
		return;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3802
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3803
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3804
	grfmsg(2, "ImportGRFSound: Copying sound %d (%d) from file %X", sound, file->sound_offset + sound, grfid);
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3805
5024
5e98bf731469 (svn r7065) Use simple assignment instead of memcpy()
tron
parents: 5011
diff changeset
  3806
	*se = *GetSound(file->sound_offset + sound);
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3807
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3808
	/* Reset volume and priority, which TTDPatch doesn't copy */
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3809
	se->volume   = 128;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3810
	se->priority = 0;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3811
}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3812
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3813
/* 'Action 0xFE' */
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3814
static void GRFImportBlock(byte *buf, int len)
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3815
{
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3816
	if (_grf_data_blocks == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3817
		grfmsg(2, "GRFImportBlock: Unexpected import block, skipping");
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3818
		return;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3819
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3820
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3821
	buf++;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3822
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3823
	_grf_data_blocks--;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3824
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3825
	/* XXX 'Action 0xFE' isn't really specified. It is only mentioned for
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3826
	 * importing sounds, so this is probably all wrong... */
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3827
	if (grf_load_byte(&buf) != _grf_data_type) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3828
		grfmsg(1, "GRFImportBlock: Import type mismatch");
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3829
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3830
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3831
	switch (_grf_data_type) {
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3832
		case GDT_SOUND: ImportGRFSound(buf, len - 1); break;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3833
		default: NOT_REACHED(); break;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3834
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3835
}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  3836
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3837
static void LoadGRFSound(byte *buf, int len)
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3838
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3839
	byte *buf_start = buf;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3840
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3841
	/* Allocate a sound entry. This is done even if the data is not loaded
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3842
	 * so that the indices used elsewhere are still correct. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3843
	FileEntry *se = AllocateFileEntry();
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3844
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  3845
	if (grf_load_dword(&buf) != BSWAP32('RIFF')) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3846
		grfmsg(1, "LoadGRFSound: Missing RIFF header");
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3847
		return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3848
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3849
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3850
	/* Size of file -- we ignore this */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3851
	grf_load_dword(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3852
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  3853
	if (grf_load_dword(&buf) != BSWAP32('WAVE')) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3854
		grfmsg(1, "LoadGRFSound: Invalid RIFF type");
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3855
		return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3856
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3857
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3858
	for (;;) {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3859
		uint32 tag  = grf_load_dword(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3860
		uint32 size = grf_load_dword(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3861
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3862
		switch (tag) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3863
			case ' tmf': // 'fmt '
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3864
				/* Audio format, must be 1 (PCM) */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3865
				if (grf_load_word(&buf) != 1) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3866
					grfmsg(1, "LoadGRFSound: Invalid audio format");
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3867
					return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3868
				}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3869
				se->channels = grf_load_word(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3870
				se->rate = grf_load_dword(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3871
				grf_load_dword(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3872
				grf_load_word(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3873
				se->bits_per_sample = grf_load_word(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3874
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3875
				/* Consume any extra bytes */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3876
				for (; size > 16; size--) grf_load_byte(&buf);
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3877
				break;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3878
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3879
			case 'atad': // 'data'
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3880
				se->file_size    = size;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3881
				se->file_offset  = FioGetPos() - (len - (buf - buf_start)) + 1;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3882
				se->file_offset |= _file_index << 24;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3883
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3884
				/* Set default volume and priority */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3885
				se->volume = 0x80;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3886
				se->priority = 0;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3887
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3888
				grfmsg(2, "LoadGRFSound: channels %u, sample rate %u, bits per sample %u, length %u", se->channels, se->rate, se->bits_per_sample, size);
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3889
				return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3890
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3891
			default:
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3892
				se->file_size = 0;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3893
				return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3894
		}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3895
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3896
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3897
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3898
/* Action 0x12 */
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3899
static void LoadFontGlyph(byte *buf, int len)
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3900
{
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3901
	/* <12> <num_def> <font_size> <num_char> <base_char>
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3902
	 *
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3903
	 * B num_def      Number of definitions
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3904
	 * B font_size    Size of font (0 = normal, 1 = small, 2 = large)
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3905
	 * B num_char     Number of consecutive glyphs
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3906
	 * W base_char    First character index */
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3907
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3908
	buf++; len--;
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  3909
	if (!check_length(len, 1, "LoadFontGlyph")) return;
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3910
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3911
	uint8 num_def = grf_load_byte(&buf);
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3912
5590
6a0c2739e124 (svn r8041) -Regression (r7564): [NewGRF] check_length should skip further processing if a length is too short, so give the function a return value
peter1138
parents: 5587
diff changeset
  3913
	if (!check_length(len, 1 + num_def * 4, "LoadFontGlyph")) return;
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3914
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3915
	for (uint i = 0; i < num_def; i++) {
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  3916
		FontSize size    = (FontSize)grf_load_byte(&buf);
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3917
		uint8  num_char  = grf_load_byte(&buf);
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3918
		uint16 base_char = grf_load_word(&buf);
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3919
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3920
		grfmsg(7, "LoadFontGlyph: Loading %u glyph(s) at 0x%04X for size %u", num_char, base_char, size);
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3921
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3922
		for (uint c = 0; c < num_char; c++) {
5108
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3923
			SetUnicodeGlyph(size, base_char + c, _cur_spriteid);
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3924
			LoadNextSprite(_cur_spriteid++, _file_index);
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3925
			_nfo_line++;
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3926
		}
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3927
	}
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3928
}
aeaef6fe53b7 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5061
diff changeset
  3929
6234
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3930
/* Action 0x13 */
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3931
static void TranslateGRFStrings(byte *buf, int len)
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3932
{
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3933
	/* <13> <grfid> <num-ent> <offset> <text...>
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3934
	 *
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3935
	 * 4*B grfid     The GRFID of the file whose texts are to be translated
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3936
	 * B   num-ent   Number of strings
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3937
	 * W   offset    First text ID
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3938
	 * S   text...   Zero-terminated strings */
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3939
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3940
	buf++; len--;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3941
	if (!check_length(len, 7, "TranslateGRFString")) return;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3942
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3943
	uint32 grfid = grf_load_dword(&buf);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3944
	const GRFConfig *c = GetGRFConfig(grfid);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3945
	if (c == NULL || (c->status != GCS_INITIALISED && c->status != GCS_ACTIVATED)) {
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3946
		grfmsg(7, "GRFID 0x%08x unknown, skipping action 13", BSWAP32(grfid));
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3947
		return;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3948
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3949
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3950
	if (c->status == GCS_INITIALISED) {
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3951
		/* If the file is not active but will be activated later, give an error
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3952
		 * and disable this file. */
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3953
		GRFError *error = CallocT<GRFError>(1);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3954
		error->message  = STR_NEWGRF_ERROR_LOAD_AFTER;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3955
		error->data     = STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3956
		error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3957
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3958
		if (_cur_grfconfig->error != NULL) free(_cur_grfconfig->error);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3959
		_cur_grfconfig->error = error;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3960
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3961
		_cur_grfconfig->status = GCS_DISABLED;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3962
		_skip_sprites = -1;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3963
		return;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3964
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3965
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3966
	byte num_strings = grf_load_byte(&buf);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3967
	uint16 first_id  = grf_load_word(&buf);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3968
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3969
	if (!((first_id >= 0xD000 && first_id + num_strings <= 0xD3FF) || (first_id >= 0xDC00 && first_id + num_strings <= 0xDCFF))) {
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3970
		grfmsg(7, "Attempting to set out-of-range string IDs in action 13 (first: 0x%4X, number: 0x%2X)", first_id, num_strings);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3971
		return;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3972
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3973
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3974
	len -= 7;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3975
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3976
	for (uint i = 0; i < num_strings && len > 0; i++) {
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3977
		const char *string   = grf_load_string(&buf, len);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3978
		size_t string_length = strlen(string) + 1;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3979
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3980
		len -= (int)string_length;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3981
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3982
		if (string_length == 1) {
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3983
			grfmsg(7, "TranslateGRFString: Ignoring empty string.");
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3984
			continue;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3985
		}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3986
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3987
		/* Since no language id is supplied this string has to be added as a
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3988
		 * generic string, thus the language id of 0x7F. For this to work
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3989
		 * new_scheme has to be true as well. A language id of 0x7F will be
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3990
		 * overridden by a non-generic id, so this will not change anything if
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3991
		 * a string has been provided specifically for this language. */
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3992
		AddGRFString(grfid, first_id + i, 0x7F, true, string, STR_UNDEFINED);
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3993
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3994
}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  3995
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3996
/* 'Action 0xFF' */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3997
static void GRFDataBlock(byte *buf, int len)
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3998
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  3999
	if (_grf_data_blocks == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4000
		grfmsg(2, "GRFDataBlock: unexpected data block, skipping");
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4001
		return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4002
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4003
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4004
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4005
	uint8 name_len = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4006
	const char *name = (const char *)buf;
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4007
	buf += name_len + 1;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4008
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4009
	grfmsg(2, "GRFDataBlock: block name '%s'...", name);
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4010
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4011
	_grf_data_blocks--;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4012
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4013
	switch (_grf_data_type) {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4014
		case GDT_SOUND: LoadGRFSound(buf, len - name_len - 2); break;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4015
		default: NOT_REACHED(); break;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4016
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4017
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4018
5329
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4019
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4020
/* Used during safety scan on unsafe actions */
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4021
static void GRFUnsafe(byte *buf, int len)
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4022
{
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4023
	SETBIT(_cur_grfconfig->flags, GCF_UNSAFE);
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4024
5502
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  4025
	/* Skip remainder of GRF */
003b36599ff8 (svn r7795) -Codechange: [NewGRF] When safety checking, allow an Action E that force activates the GRF. Unfortunately this requires knowing the GRF ID in advance (before the Action 8) so the static GRFs are now scanned twice on start up, once for the GRF ID, and then for the safety check. (This fix allows unifont.grf to be used.)
peter1138
parents: 5476
diff changeset
  4026
	_skip_sprites = -1;
5329
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4027
}
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4028
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4029
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4030
static void InitializeGRFSpecial()
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4031
{
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4032
	_ttdpatch_flags[0] =  ((_patches.always_small_airport ? 1 : 0) << 0x0C)  // keepsmallairport
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4033
	                   |                                        (1 << 0x0D)  // newairports
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4034
	                   |                                        (1 << 0x0E)  // largestations
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4035
	                   |           ((_patches.longbridges ? 1 : 0) << 0x0F)  // longbridges
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4036
	                   |                                        (0 << 0x10)  // loadtime
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4037
	                   |                                        (1 << 0x12)  // presignals
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4038
	                   |                                        (1 << 0x13)  // extpresignals
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4039
	                   | ((_patches.never_expire_vehicles ? 1 : 0) << 0x16)  // enginespersist
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4040
	                   |                                        (1 << 0x1B)  // multihead
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4041
	                   |                                        (1 << 0x1D)  // lowmemory
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4042
	                   |                                        (1 << 0x1E); // generalfixes
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4043
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4044
	_ttdpatch_flags[1] =                                        (0 << 0x07)  // moreairports - based on units of noise
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4045
	                   |        ((_patches.mammoth_trains ? 1 : 0) << 0x08)  // mammothtrains
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4046
	                   |                                        (1 << 0x09)  // trainrefit
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4047
	                   |                                        (0 << 0x0B)  // subsidiaries
5550
ffed4fb7555d (svn r7930) -Fix: [FS#520] Wrong GRF flag set for gradual loading (mart3p)
Darkvater
parents: 5525
diff changeset
  4048
	                   |       ((_patches.gradual_loading ? 1 : 0) << 0x0C)  // gradualloading
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4049
	                   |                                        (1 << 0x12)  // unifiedmaglevmode - set bit 0 mode. Not revelant to OTTD
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4050
	                   |                                        (1 << 0x13)  // unifiedmaglevmode - set bit 1 mode
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4051
	                   |                                        (1 << 0x14)  // bridgespeedlimits
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4052
	                   |                                        (1 << 0x16)  // eternalgame
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4053
	                   |                                        (1 << 0x17)  // newtrains
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4054
	                   |                                        (1 << 0x18)  // newrvs
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4055
	                   |                                        (1 << 0x19)  // newships
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4056
	                   |                                        (1 << 0x1A)  // newplanes
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4057
	                   |           ((_patches.signal_side ? 1 : 0) << 0x1B)  // signalsontrafficside
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4058
	                   |                                        (1 << 0x1C); // electrifiedrailway
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4059
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4060
	_ttdpatch_flags[2] =                                        (1 << 0x01)  // loadallgraphics - obsolote
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4061
	                   |                                        (1 << 0x03)  // semaphores
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4062
	                   |                                        (0 << 0x0B)  // enhancedgui
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4063
	                   |                                        (0 << 0x0C)  // newagerating
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4064
	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x0D)  // buildonslopes
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4065
	                   |                                        (0 << 0x0F)  // planespeed
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4066
	                   |                                        (0 << 0x10)  // moreindustriesperclimate - obsolete
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4067
	                   |                                        (0 << 0x11)  // moretoylandfeatures
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4068
	                   |                                        (1 << 0x12)  // newstations
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4069
	                   |                                        (0 << 0x13)  // tracktypecostdiff
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4070
	                   |                                        (0 << 0x14)  // manualconvert
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4071
	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x15)  // buildoncoasts
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4072
	                   |                                        (1 << 0x16)  // canals
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4073
	                   |                                        (1 << 0x17)  // newstartyear
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4074
	                   |                                        (0 << 0x18)  // freighttrains
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4075
	                   |                                        (1 << 0x19)  // newhouses
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4076
	                   |                                        (1 << 0x1A)  // newbridges
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4077
	                   |                                        (0 << 0x1B)  // newtownnames
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4078
	                   |                                        (0 << 0x1C)  // moreanimations
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4079
	                   |    ((_patches.wagon_speed_limits ? 1 : 0) << 0x1D)  // wagonspeedlimits
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4080
	                   |                                        (1 << 0x1E)  // newshistory
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4081
	                   |                                        (0 << 0x1F); // custombridgeheads
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4082
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4083
	_ttdpatch_flags[3] =                                        (0 << 0x00)  // newcargodistribution
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4084
	                   |                                        (1 << 0x01)  // windowsnap
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4085
	                   |                                        (0 << 0x02)  // townbuildnoroad
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4086
	                   |                                        (0 << 0x03)  // pathbasedsignalling. To enable if ever pbs is back
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4087
	                   |                                        (0 << 0x04)  // aichoosechance
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4088
	                   |                                        (1 << 0x05)  // resolutionwidth
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4089
	                   |                                        (1 << 0x06)  // resolutionheight
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4090
	                   |                                        (0 << 0x07)  // newindustries
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4091
	                   |                                        (0 << 0x08)  // fifoloading
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4092
	                   |                                        (0 << 0x09)  // townroadbranchprob
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4093
	                   |                                        (0 << 0x0A)  // tempsnowline
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4094
	                   |                                        (0 << 0x0B)  // newcargo
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4095
	                   |                                        (1 << 0x0C)  // enhancemultiplayer
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4096
	                   |                                        (1 << 0x0D)  // onewayroads
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4097
	                   |   ((_patches.nonuniform_stations ? 1 : 0) << 0x0E)  // irregularstations
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4098
	                   |                                        (1 << 0x0F)  // statistics
4657
dfbc1d1e6fd0 (svn r6533) - Fix (r6532): Somebody forgot to add newsounds to the ttdpatch flags...
peter1138
parents: 4656
diff changeset
  4099
	                   |                                        (1 << 0x10)  // newsounds
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4100
	                   |                                        (1 << 0x11)  // autoreplace
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4101
	                   |                                        (1 << 0x12)  // autoslope
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4102
	                   |                                        (0 << 0x13)  // followvehicle
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4103
	                   |                                        (0 << 0x14)  // trams
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4104
	                   |                                        (0 << 0x15)  // enhancetunnels
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4105
	                   |                                        (0 << 0x16)  // shortrvs
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4106
	                   |                                        (0 << 0x17); // articulatedrvs
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4107
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4108
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4109
static void ResetCustomStations()
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4110
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4111
	for (GRFFile *file = _first_grffile; file != NULL; file = file->next) {
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  4112
		if (file->stations == NULL) continue;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4113
		for (uint i = 0; i < MAX_STATIONS; i++) {
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  4114
			if (file->stations[i] == NULL) continue;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4115
			StationSpec *statspec = file->stations[i];
3740
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4116
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4117
			/* Release renderdata, if it wasn't copied from another custom station spec  */
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4118
			if (!statspec->copied_renderdata) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4119
				for (uint t = 0; t < statspec->tiles; t++) {
3740
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4120
					free((void*)statspec->renderdata[t].seq);
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4121
				}
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4122
				free(statspec->renderdata);
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4123
			}
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4124
5061
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4125
			/* Release platforms and layouts */
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4126
			if (!statspec->copied_layouts) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4127
				for (uint l = 0; l < statspec->lengths; l++) {
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4128
					for (uint p = 0; p < statspec->platforms[l]; p++) {
5061
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4129
						free(statspec->layouts[l][p]);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4130
					}
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4131
					free(statspec->layouts[l]);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4132
				}
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4133
				free(statspec->layouts);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4134
				free(statspec->platforms);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4135
			}
3768
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  4136
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  4137
			/* Release this station */
5194cf3c57b1 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
  4138
			free(statspec);
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4139
		}
3501
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
  4140
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
  4141
		/* Free and reset the station data */
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
  4142
		free(file->stations);
0a0c5bcc9a72 (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
  4143
		file->stations = NULL;
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4144
	}
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4145
}
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4146
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4147
static void ResetCustomHouses()
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4148
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4149
	GRFFile *file;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4150
	uint i;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4151
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4152
	for (file = _first_grffile; file != NULL; file = file->next) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4153
		if (file->housespec == NULL) continue;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4154
		for (i = 0; i < HOUSE_MAX; i++) free(file->housespec[i]);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4155
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4156
		free(file->housespec);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4157
		file->housespec = NULL;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4158
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4159
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4160
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4161
static void ResetNewGRF()
4953
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4162
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4163
	GRFFile *next;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4164
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4165
	for (GRFFile *f = _first_grffile; f != NULL; f = next) {
4953
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4166
		next = f->next;
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4167
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4168
		free(f->filename);
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4169
		free(f);
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4170
	}
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4171
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4172
	_first_grffile = NULL;
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4173
	_cur_grffile   = NULL;
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4174
}
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4175
2491
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  4176
/**
2463
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4177
 * Reset all NewGRF loaded data
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4178
 * TODO
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4179
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4180
static void ResetNewGRFData()
2463
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4181
{
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  4182
	CleanUpStrings();
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  4183
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4184
	/* Copy/reset original engine info data */
2463
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4185
	memcpy(&_engine_info, &orig_engine_info, sizeof(orig_engine_info));
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4186
	memcpy(&_rail_vehicle_info, &orig_rail_vehicle_info, sizeof(orig_rail_vehicle_info));
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4187
	memcpy(&_ship_vehicle_info, &orig_ship_vehicle_info, sizeof(orig_ship_vehicle_info));
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4188
	memcpy(&_aircraft_vehicle_info, &orig_aircraft_vehicle_info, sizeof(orig_aircraft_vehicle_info));
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4189
	memcpy(&_road_vehicle_info, &orig_road_vehicle_info, sizeof(orig_road_vehicle_info));
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  4190
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4191
	/* Copy/reset original bridge info data
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4192
	 * First, free sprite table data */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4193
	for (uint i = 0; i < MAX_BRIDGES; i++) {
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  4194
		if (_bridge[i].sprite_table != NULL) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4195
			for (uint j = 0; j < 7; j++) free(_bridge[i].sprite_table[j]);
2478
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  4196
			free(_bridge[i].sprite_table);
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  4197
		}
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  4198
	}
cd6a02ba3853 (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  4199
	memcpy(&_bridge, &orig_bridge, sizeof(_bridge));
2491
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  4200
6349
908a23fd464f (svn r9387) -Fix (r9385): termination of a comment forgotten.
rubidium
parents: 6348
diff changeset
  4201
	/* Reset refit/cargo class data */
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4202
	memset(&cargo_allowed, 0, sizeof(cargo_allowed));
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4203
	memset(&cargo_disallowed, 0, sizeof(cargo_disallowed));
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4204
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4205
	/* Reset GRM reservations */
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4206
	memset(&_grm_engines, 0, sizeof(_grm_engines));
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4207
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4208
	/* Unload sprite group data */
2491
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  4209
	UnloadWagonOverrides();
3695
e1d5608f4d32 (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3694
diff changeset
  4210
	UnloadRotorOverrideSprites();
2491
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  4211
	UnloadCustomEngineSprites();
2769
eab49a86038e (svn r3316) - NewGRF: Unload engine names before loading grf files. This fixes names in climates where the engines don't get loaded. Renamed function to reflect its purpose.
peter1138
parents: 2766
diff changeset
  4212
	UnloadCustomEngineNames();
2971
cae3a81e8674 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  4213
	ResetEngineListOrder();
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  4214
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4215
	/* Reset price base data */
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  4216
	ResetPriceBaseMultipliers();
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4217
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  4218
	/* Reset the curencies array */
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  4219
	ResetCurrencies();
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  4220
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4221
	/* Reset the house array */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4222
	ResetCustomHouses();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4223
	ResetHouses();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4224
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4225
	/* Reset station classes */
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4226
	ResetStationClasses();
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4227
	ResetCustomStations();
2812
95102021c840 (svn r3360) Fix initialization of engines for precalculation of default refit mask.
peter1138
parents: 2769
diff changeset
  4228
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  4229
	/* Reset the snowline table. */
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  4230
	ClearSnowLine();
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  4231
4953
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4232
	/* Reset NewGRF files */
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4233
	ResetNewGRF();
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4234
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4235
	/* Add engine type to engine data. This is needed for the refit precalculation. */
2812
95102021c840 (svn r3360) Fix initialization of engines for precalculation of default refit mask.
peter1138
parents: 2769
diff changeset
  4236
	AddTypeToEngines();
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  4237
6091
c8827d9ae04a (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6090
diff changeset
  4238
	/* Set up the default cargo types */
c8827d9ae04a (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6090
diff changeset
  4239
	SetupCargoForClimate(_opt.landscape);
c8827d9ae04a (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6090
diff changeset
  4240
3845
af6eb0103fed (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  4241
	/* Reset misc GRF features and train list display variables */
af6eb0103fed (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  4242
	_misc_grf_features = 0;
af6eb0103fed (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  4243
	_traininfo_vehicle_pitch = 0;
af6eb0103fed (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  4244
	_traininfo_vehicle_width = 29;
4742
d915db693186 (svn r6654) - Codechange: If no 2cc vehicles are available, hide the secondary colour choice.
peter1138
parents: 4711
diff changeset
  4245
	_have_2cc = false;
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4246
	_have_newhouses = false;
5209
1b7a72191019 (svn r7324) -Codechange: reset newgrf signal location data
peter1138
parents: 5161
diff changeset
  4247
	_signal_base = 0;
5210
3415ef43c70a (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 5209
diff changeset
  4248
	_coast_base = 0;
3845
af6eb0103fed (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  4249
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4250
	InitializeSoundPool();
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  4251
	InitializeSpriteGroupPool();
2463
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4252
}
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4253
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4254
/** Reset all NewGRFData that was used only while processing data */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4255
static void ClearTemporaryNewGRFData()
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4256
{
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4257
	/* Clear the GOTO labels used for GRF processing */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4258
	for (GRFLabel *l = _cur_grffile->label; l != NULL;) {
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4259
		GRFLabel *l2 = l->next;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4260
		free(l);
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4261
		l = l2;
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4262
	}
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4263
	_cur_grffile->label = NULL;
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  4264
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  4265
	/* Clear the list of spritegroups */
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  4266
	free(_cur_grffile->spritegroups);
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  4267
	_cur_grffile->spritegroups = NULL;
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  4268
	_cur_grffile->spritegroups_count = 0;
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4269
}
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4270
6147
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4271
static void BuildCargoTranslationMap()
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4272
{
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4273
	memset(_cur_grffile->cargo_map, 0xFF, sizeof(_cur_grffile->cargo_map));
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4274
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4275
	for (CargoID c = 0; c < NUM_CARGO; c++) {
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4276
		const CargoSpec *cs = GetCargo(c);
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4277
		if (!cs->IsValid()) continue;
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4278
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4279
		if (_cur_grffile->cargo_max == 0) {
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4280
			/* Default translation table, so just a straight mapping to bitnum */
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4281
			_cur_grffile->cargo_map[c] = cs->bitnum;
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4282
		} else {
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4283
			/* Check the translation table for this cargo's label */
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4284
			for (uint i = 0; i < _cur_grffile->cargo_max; i++) {
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4285
				if (cs->label == _cur_grffile->cargo_list[i]) {
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4286
					_cur_grffile->cargo_map[c] = i;
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4287
					break;
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4288
				}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4289
			}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4290
		}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4291
	}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4292
}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4293
3628
69646d0924a5 (svn r4527) - Feature [NewGRF]: Add support for specifying parameters to GRF files. Usage: "mygrf = 1". You can pass up to 128 parameters, each one seperated by a comma or a space-character. Big thanks to peter1138 for the inspiration and examples.
Darkvater
parents: 3620
diff changeset
  4294
static void InitNewGRFFile(const GRFConfig *config, int sprite_offset)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4295
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4296
	GRFFile *newfile = GetFileByFilename(config->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
  4297
	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
  4298
		/* 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
  4299
		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
  4300
		_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
  4301
		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
  4302
	}
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
  4303
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  4304
	newfile = CallocT<GRFFile>(1);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4305
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  4306
	if (newfile == NULL) error ("Out of memory");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4307
3628
69646d0924a5 (svn r4527) - Feature [NewGRF]: Add support for specifying parameters to GRF files. Usage: "mygrf = 1". You can pass up to 128 parameters, each one seperated by a comma or a space-character. Big thanks to peter1138 for the inspiration and examples.
Darkvater
parents: 3620
diff changeset
  4308
	newfile->filename = strdup(config->filename);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4309
	newfile->sprite_offset = sprite_offset;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4310
3628
69646d0924a5 (svn r4527) - Feature [NewGRF]: Add support for specifying parameters to GRF files. Usage: "mygrf = 1". You can pass up to 128 parameters, each one seperated by a comma or a space-character. Big thanks to peter1138 for the inspiration and examples.
Darkvater
parents: 3620
diff changeset
  4311
	/* Copy the initial parameter list */
69646d0924a5 (svn r4527) - Feature [NewGRF]: Add support for specifying parameters to GRF files. Usage: "mygrf = 1". You can pass up to 128 parameters, each one seperated by a comma or a space-character. Big thanks to peter1138 for the inspiration and examples.
Darkvater
parents: 3620
diff changeset
  4312
	assert(lengthof(newfile->param) == lengthof(config->param) && lengthof(config->param) == 0x80);
69646d0924a5 (svn r4527) - Feature [NewGRF]: Add support for specifying parameters to GRF files. Usage: "mygrf = 1". You can pass up to 128 parameters, each one seperated by a comma or a space-character. Big thanks to peter1138 for the inspiration and examples.
Darkvater
parents: 3620
diff changeset
  4313
	newfile->param_end = config->num_params;
5430
7864a926dd4d (svn r7636) -Cleanup: Remove unused window classes (sorry WC-mess) and use sizeof(array) instead
Darkvater
parents: 5413
diff changeset
  4314
	memcpy(newfile->param, config->param, sizeof(newfile->param));
3628
69646d0924a5 (svn r4527) - Feature [NewGRF]: Add support for specifying parameters to GRF files. Usage: "mygrf = 1". You can pass up to 128 parameters, each one seperated by a comma or a space-character. Big thanks to peter1138 for the inspiration and examples.
Darkvater
parents: 3620
diff changeset
  4315
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4316
	if (_first_grffile == NULL) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4317
		_cur_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4318
		_first_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4319
	} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4320
		_cur_grffile->next = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4321
		_cur_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4322
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4323
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4324
5037
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  4325
6145
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4326
/** List of what cargo labels are refittable for the given the vehicle-type.
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4327
 * Only currently active labels are applied. */
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4328
static const CargoLabel _default_refitmasks_rail[] = {
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4329
	'PASS', 'COAL', 'MAIL', 'LVST', 'GOOD', 'GRAI', 'WHEA', 'MAIZ', 'WOOD',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4330
	'IORE', 'STEL', 'VALU', 'GOLD', 'DIAM', 'PAPR', 'FOOD', 'FRUT', 'CORE',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4331
	'WATR', 'SUGR', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4332
	'PLST', 'FZDR',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4333
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4334
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4335
static const CargoLabel _default_refitmasks_road[] = {
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4336
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4337
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4338
static const CargoLabel _default_refitmasks_ships[] = {
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4339
	'COAL', 'MAIL', 'LVST', 'GOOD', 'GRAI', 'WHEA', 'MAIZ', 'WOOD', 'IORE',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4340
	'STEL', 'VALU', 'GOLD', 'DIAM', 'PAPR', 'FOOD', 'FRUT', 'CORE', 'WATR',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4341
	'RUBR', 'SUGR', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4342
	'PLST', 'FZDR',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4343
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4344
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4345
static const CargoLabel _default_refitmasks_aircraft[] = {
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4346
	'PASS', 'MAIL', 'GOOD', 'VALU', 'GOLD', 'DIAM', 'FOOD', 'FRUT', 'SUGR',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4347
	'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4348
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4349
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4350
static const CargoLabel *_default_refitmasks[] = {
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4351
	_default_refitmasks_rail,
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4352
	_default_refitmasks_road,
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4353
	_default_refitmasks_ships,
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4354
	_default_refitmasks_aircraft,
5037
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  4355
};
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  4356
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  4357
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4358
/**
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4359
 * Precalculate refit masks from cargo classes for all vehicles.
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4360
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4361
static void CalculateRefitMasks()
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4362
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4363
	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
6282
861f9a1108bb (svn r9094) -Codechange: Don't set up refit masks for engine types not in the current climate, and exclude engine types if their cargo type is invalid and they have no refittable type.
peter1138
parents: 6281
diff changeset
  4364
		/* Skip engine if not available in this climate */
861f9a1108bb (svn r9094) -Codechange: Don't set up refit masks for engine types not in the current climate, and exclude engine types if their cargo type is invalid and they have no refittable type.
peter1138
parents: 6281
diff changeset
  4365
		if (!HASBIT(_engine_info[engine].climates, _opt.landscape)) continue;
861f9a1108bb (svn r9094) -Codechange: Don't set up refit masks for engine types not in the current climate, and exclude engine types if their cargo type is invalid and they have no refittable type.
peter1138
parents: 6281
diff changeset
  4366
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4367
		uint32 mask = 0;
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4368
		uint32 not_mask = 0;
6284
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4369
		uint32 xor_mask = 0;
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4370
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4371
		if (_engine_info[engine].refit_mask != 0) {
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4372
			const GRFFile *file = GetEngineGRF(engine);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4373
			if (file != NULL && file->cargo_max != 0) {
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4374
				/* Apply cargo translation table to the refit mask */
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4375
				uint num_cargo = min(32, file->cargo_max);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4376
				for (uint i = 0; i < num_cargo; i++) {
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4377
					if (!HASBIT(_engine_info[engine].refit_mask, i)) continue;
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4378
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4379
					CargoID c = GetCargoIDByLabel(file->cargo_list[i]);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4380
					if (c == CT_INVALID) continue;
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4381
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4382
					SETBIT(xor_mask, c);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4383
				}
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4384
			} else {
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4385
				/* No cargo table, so use the cargo bitnum values */
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4386
				for (CargoID c = 0; c < NUM_CARGO; c++) {
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4387
					const CargoSpec *cs = GetCargo(c);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4388
					if (!cs->IsValid()) continue;
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4389
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4390
					if (HASBIT(_engine_info[engine].refit_mask, cs->bitnum)) SETBIT(xor_mask, c);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4391
				}
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4392
			}
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  4393
		}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4394
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4395
		if (cargo_allowed[engine] != 0) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4396
			/* Build up the list of cargo types from the set cargo classes. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4397
			for (CargoID i = 0; i < NUM_CARGO; i++) {
6113
a10ede03ac58 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6107
diff changeset
  4398
				const CargoSpec *cs = GetCargo(i);
6148
5247b66aad19 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6147
diff changeset
  4399
				if (cargo_allowed[engine]    & cs->classes) SETBIT(mask,     i);
5247b66aad19 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6147
diff changeset
  4400
				if (cargo_disallowed[engine] & cs->classes) SETBIT(not_mask, i);
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4401
			}
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4402
		} else {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4403
			/* Don't apply default refit mask to wagons or engines with no capacity */
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  4404
			if (xor_mask == 0 && (
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  4405
						GetEngine(engine)->type != VEH_TRAIN || (
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  4406
							RailVehInfo(engine)->capacity != 0 &&
5868
94430141c189 (svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified.
belugas
parents: 5855
diff changeset
  4407
							RailVehInfo(engine)->railveh_type != RAILVEH_WAGON
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  4408
						)
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  4409
					)) {
6145
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4410
				const CargoLabel *cl = _default_refitmasks[GetEngine(engine)->type];
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4411
				for (uint i = 0;; i++) {
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4412
					if (cl[i] == 0) break;
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4413
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4414
					CargoID cargo = GetCargoIDByLabel(cl[i]);
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4415
					if (cargo == CT_INVALID) continue;
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4416
6148
5247b66aad19 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6147
diff changeset
  4417
					SETBIT(xor_mask, cargo);
6145
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  4418
				}
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  4419
			}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4420
		}
6113
a10ede03ac58 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6107
diff changeset
  4421
		_engine_info[engine].refit_mask = ((mask & ~not_mask) ^ xor_mask) & _cargo_mask;
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4422
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4423
		/* Check if this engine's cargo type is valid. If not, set to the first refittable
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4424
		 * cargo type. Apparently cargo_type isn't a common property... */
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4425
		switch (GetEngine(engine)->type) {
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  4426
			case VEH_TRAIN: {
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4427
				RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4428
				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
6282
861f9a1108bb (svn r9094) -Codechange: Don't set up refit masks for engine types not in the current climate, and exclude engine types if their cargo type is invalid and they have no refittable type.
peter1138
parents: 6281
diff changeset
  4429
				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4430
				break;
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4431
			}
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  4432
			case VEH_ROAD: {
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4433
				RoadVehicleInfo *rvi = &_road_vehicle_info[engine - ROAD_ENGINES_INDEX];
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4434
				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
6282
861f9a1108bb (svn r9094) -Codechange: Don't set up refit masks for engine types not in the current climate, and exclude engine types if their cargo type is invalid and they have no refittable type.
peter1138
parents: 6281
diff changeset
  4435
				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4436
				break;
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4437
			}
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  4438
			case VEH_SHIP: {
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4439
				ShipVehicleInfo *svi = &_ship_vehicle_info[engine - SHIP_ENGINES_INDEX];
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4440
				if (svi->cargo_type == CT_INVALID) svi->cargo_type = FindFirstRefittableCargo(engine);
6282
861f9a1108bb (svn r9094) -Codechange: Don't set up refit masks for engine types not in the current climate, and exclude engine types if their cargo type is invalid and they have no refittable type.
peter1138
parents: 6281
diff changeset
  4441
				if (svi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
6142
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4442
				break;
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4443
			}
80f876e7bb9f (svn r8885) -Codechange: (NewGRF) If a default cargo type property is out of range then choose the cargo type from its refit list.
peter1138
parents: 6139
diff changeset
  4444
		}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4445
	}
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4446
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4447
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4448
/** Add all new houses to the house array. House properties can be set at any
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4449
 * time in the GRF file, so we can only add a house spec to the house array
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4450
 * after the file has finished loading. We also need to check the dates, due to
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4451
 * the TTDPatch behaviour described below that we need to emulate. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4452
static void FinaliseHouseArray()
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4453
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4454
	/* If there are no houses with start dates before 1930, then all houses
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4455
	 * with start dates of 1930 have them reset to 0. This is in order to be
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4456
	 * compatible with TTDPatch, where if no houses have start dates before
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4457
	 * 1930 and the date is before 1930, the game pretends that this is 1930.
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4458
	 * If there have been any houses defined with start dates before 1930 then
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4459
	 * the dates are left alone. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4460
	bool reset_dates = true;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4461
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4462
	for (GRFFile *file = _first_grffile; file != NULL; file = file->next) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4463
		if (file->housespec == NULL) continue;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4464
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4465
		for (int i = 0; i < HOUSE_MAX; i++) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4466
			HouseSpec *hs = file->housespec[i];
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4467
			if (hs != NULL) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4468
				SetHouseSpec(hs);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4469
				if (hs->min_date < 1930) reset_dates = false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4470
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4471
		}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4472
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4473
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4474
	if (reset_dates) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4475
		for (int i = NEW_HOUSE_OFFSET; i < HOUSE_MAX; i++) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4476
			HouseSpec *hs = GetHouseSpecs(i);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4477
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4478
			if (hs->enabled && hs->min_date == 1930) hs->min_date = 0;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4479
		}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4480
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4481
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4482
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4483
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4484
/** Each cargo string needs to be mapped from TTDPatch to OpenTTD string IDs.
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4485
 * This is done after loading so that strings from Action 4 will be mapped
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4486
 * properly. */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4487
static void MapNewCargoStrings()
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4488
{
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4489
	for (CargoID c = 0; c < NUM_CARGO; c++) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4490
		CargoSpec *cs = &_cargo[c];
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4491
		/* Don't map if the cargo is unavailable or not from NewGRF */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4492
		if (!cs->IsValid() || cs->grfid == 0) continue;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4493
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4494
		cs->name         = MapGRFStringID(cs->grfid, cs->name);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4495
		cs->name_plural  = MapGRFStringID(cs->grfid, cs->name_plural);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4496
		cs->units_volume = MapGRFStringID(cs->grfid, cs->units_volume);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4497
		cs->quantifier   = MapGRFStringID(cs->grfid, cs->quantifier);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4498
		cs->abbrev       = MapGRFStringID(cs->grfid, cs->abbrev);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4499
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4500
}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4501
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4502
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4503
/* 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
  4504
 * 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
  4505
 * partial implementation yet). */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4506
/* 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
  4507
 * 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
  4508
 * better make this more robust in the future. */
5008
c2b96042d529 (svn r7027) - Codechange: Replace NewGRF loading stage masks with separate function lists. This will allow us to call different handlers depending on the current stage. Also enum-ize the stage.
peter1138
parents: 4993
diff changeset
  4509
static void DecodeSpecialSprite(uint num, GrfLoadingStage stage)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4510
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4511
	/* 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
  4512
	 * here.  In TTDPatch, for some reason actions 1 and 2 are carried out
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4513
	 * during stage 1, whilst action 3 is carried out during stage 2 (to
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4514
	 * "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
  4515
	 * 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
  4516
	 * 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
  4517
	 * in an earlier stage than associating, so...  We just process actions
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4518
	 * 1 and 2 in stage 2 now, let's hope that won't get us into problems.
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4519
	 * --pasky */
3561
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4520
	/* We need a pre-stage to set up GOTO labels of Action 0x10 because the grf
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4521
	 * is not in memory and scanning the file every time would be too expensive.
2f67415d44aa (svn r4439) - NewGRF: Add support for Action 0x10. This also required an extra pre-stage (before initialize and activation) to scan the GRF file for GOTO labels. Big thanks for peter1138 for the guidance and answers, as well as parts of the code.
Darkvater
parents: 3557
diff changeset
  4522
	 * In other stages we skip action 0x10 since it's already dealt with. */
5008
c2b96042d529 (svn r7027) - Codechange: Replace NewGRF loading stage masks with separate function lists. This will allow us to call different handlers depending on the current stage. Also enum-ize the stage.
peter1138
parents: 4993
diff changeset
  4523
	static const SpecialSpriteHandler handlers[][GLS_END] = {
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4524
		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       InitChangeInfo, ReserveChangeInfo, FeatureChangeInfo, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4525
		/* 0x01 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              NewSpriteSet, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4526
		/* 0x02 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              NewSpriteGroup, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4527
		/* 0x03 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              FeatureMapSpriteGroup, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4528
		/* 0x04 */ { NULL,     NULL,      NULL,            NULL,           NULL,              FeatureNewName, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4529
		/* 0x05 */ { NULL,     NULL,      NULL,            NULL,           NULL,              GraphicsNew, },
6373
75654b0484cd (svn r9436) -Fix (r9411): don't deactivate GRF in an action 7/9 during reservation (and loading of cargo data), and action 6 should be run also
peter1138
parents: 6365
diff changeset
  4530
		/* 0x06 */ { NULL,     NULL,      NULL,            CfgApply,       CfgApply,          CfgApply, },
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4531
		/* 0x07 */ { NULL,     NULL,      NULL,            NULL,           SkipIf,            SkipIf, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4532
		/* 0x08 */ { ScanInfo, NULL,      NULL,            GRFInfo,        NULL,              GRFInfo, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4533
		/* 0x09 */ { NULL,     NULL,      NULL,            SkipIf,         SkipIf,            SkipIf, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4534
		/* 0x0A */ { NULL,     NULL,      NULL,            NULL,           NULL,              SpriteReplace, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4535
		/* 0x0B */ { NULL,     NULL,      NULL,            GRFLoadError,   GRFLoadError,      GRFLoadError, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4536
		/* 0x0C */ { NULL,     NULL,      NULL,            GRFComment,     NULL,              GRFComment, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4537
		/* 0x0D */ { NULL,     SafeParamSet, NULL,         ParamSet,       ParamSet,          ParamSet, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4538
		/* 0x0E */ { NULL,     SafeGRFInhibit, NULL,       GRFInhibit,     GRFInhibit,        GRFInhibit, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4539
		/* 0x0F */ { NULL,     NULL,      NULL,            NULL,           NULL,              NULL, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4540
		/* 0x10 */ { NULL,     NULL,      DefineGotoLabel, NULL,           NULL,              NULL, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4541
		/* 0x11 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              GRFSound, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4542
		/* 0x12 */ { NULL,     NULL,      NULL,            NULL,           NULL,              LoadFontGlyph, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4543
		/* 0x13 */ { NULL,     NULL,      NULL,            NULL,           NULL,              TranslateGRFStrings, },
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
  4544
	};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4545
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4546
	byte* buf;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4547
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4548
	if (_preload_sprite == NULL) {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4549
		/* No preloaded sprite to work with; allocate and read the
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4550
		 * pseudo sprite content. */
5609
dc6a58930ba4 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5593
diff changeset
  4551
		buf = MallocT<byte>(num);
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4552
		if (buf == NULL) error("DecodeSpecialSprite: Could not allocate memory");
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4553
		FioReadBlock(buf, num);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4554
	} else {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4555
		/* Use the preloaded sprite data. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4556
		buf = _preload_sprite;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4557
		_preload_sprite = NULL;
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4558
		grfmsg(7, "DecodeSpecialSprite: Using preloaded pseudo sprite data");
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4559
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4560
		/* Skip the real (original) content of this action. */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4561
		FioSeekTo(num, SEEK_CUR);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4562
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  4563
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4564
	byte action = buf[0];
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
  4565
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4566
	if (action == 0xFF) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4567
		grfmsg(7, "Handling data block in stage %d", stage);
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4568
		GRFDataBlock(buf, num);
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4569
	} else if (action == 0xFE) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4570
		grfmsg(7, "Handling import block in stage %d", stage);
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4571
		GRFImportBlock(buf, num);
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4572
	} else if (action >= lengthof(handlers)) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4573
		grfmsg(7, "Skipping unknown action 0x%02X", action);
5008
c2b96042d529 (svn r7027) - Codechange: Replace NewGRF loading stage masks with separate function lists. This will allow us to call different handlers depending on the current stage. Also enum-ize the stage.
peter1138
parents: 4993
diff changeset
  4574
	} else if (handlers[action][stage] == NULL) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4575
		grfmsg(7, "Skipping action 0x%02X in stage %d", action, stage);
2645
841087328e0e (svn r3187) Simplify overly complicated ifs, especially if (foo) return false; else return true; is confusing
tron
parents: 2628
diff changeset
  4576
	} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4577
		grfmsg(7, "Handling action 0x%02X in stage %d", action, stage);
5008
c2b96042d529 (svn r7027) - Codechange: Replace NewGRF loading stage masks with separate function lists. This will allow us to call different handlers depending on the current stage. Also enum-ize the stage.
peter1138
parents: 4993
diff changeset
  4578
		handlers[action][stage](buf, num);
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
  4579
	}
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
  4580
	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
  4581
}
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
  4582
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
  4583
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  4584
void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage 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
  4585
{
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  4586
	const char *filename = config->filename;
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
  4587
	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
  4588
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
  4589
	/* 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
  4590
	 * 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
  4591
	 * 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
  4592
	 * 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
  4593
	 * 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
  4594
	 *
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
  4595
	 * 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
  4596
	 * 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
  4597
	 * processed once at initialization.  */
5329
9c5e8061ea0f (svn r7490) -Feature: Load a list of NewGRFs from the config (in the [newgrf-static] section) that should always be loaded. These will also be active during the intro screen, and in multiplayer games. Only "network-safe" NewGRFs are permitted, such as fonts and sprite replacement sets.
peter1138
parents: 5324
diff changeset
  4598
	if (stage != GLS_FILESCAN && stage != GLS_SAFETYSCAN && stage != GLS_LABELSCAN) {
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
  4599
		_cur_grffile = GetFileByFilename(filename);
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4600
		if (_cur_grffile == NULL) error("File '%s' lost in cache.\n", filename);
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  4601
		if (stage == GLS_ACTIVATION && config->status != GCS_INITIALISED) return;
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
  4602
	}
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
  4603
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
  4604
	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
  4605
	_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
  4606
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  4607
	_cur_grfconfig = config;
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  4608
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4609
	DEBUG(grf, 2, "Reading NewGRF-file '%s'", filename);
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
  4610
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
  4611
	/* 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
  4612
	 * 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
  4613
	 * 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
  4614
	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
  4615
		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
  4616
	} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4617
		DEBUG(grf, 7, "Custom .grf has invalid format");
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  4618
		return;
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
  4619
	}
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
  4620
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
  4621
	_skip_sprites = 0; // XXX
3557
1e9867319bce (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  4622
	_nfo_line = 0;
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
  4623
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
  4624
	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
  4625
		byte type = FioReadByte();
3557
1e9867319bce (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  4626
		_nfo_line++;
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
  4627
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
  4628
		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
  4629
			if (_skip_sprites == 0) {
2958
ac0a9673b522 (svn r3520) Remove unused parameters from some functions
tron
parents: 2935
diff changeset
  4630
				DecodeSpecialSprite(num, stage);
5011
0b0003ba213e (svn r7031) -Codechange: Use _skip_sprites to skip the rest of the NewGRF when disabled by GRM, and add a shortcut so that the rest of the file isn't scanned.
peter1138
parents: 5008
diff changeset
  4631
0b0003ba213e (svn r7031) -Codechange: Use _skip_sprites to skip the rest of the NewGRF when disabled by GRM, and add a shortcut so that the rest of the file isn't scanned.
peter1138
parents: 5008
diff changeset
  4632
				/* Stop all processing if we are to skip the remaining sprites */
0b0003ba213e (svn r7031) -Codechange: Use _skip_sprites to skip the rest of the NewGRF when disabled by GRM, and add a shortcut so that the rest of the file isn't scanned.
peter1138
parents: 5008
diff changeset
  4633
				if (_skip_sprites == -1) break;
0b0003ba213e (svn r7031) -Codechange: Use _skip_sprites to skip the rest of the NewGRF when disabled by GRM, and add a shortcut so that the rest of the file isn't scanned.
peter1138
parents: 5008
diff changeset
  4634
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
  4635
				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
  4636
			} 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
  4637
				FioSkipBytes(num);
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  4638
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4639
		} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4640
			if (_skip_sprites == 0) grfmsg(7, "Skipping unexpected sprite");
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
  4641
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
  4642
			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
  4643
			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
  4644
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
  4645
			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
  4646
				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
  4647
			} 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
  4648
				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
  4649
					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
  4650
					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
  4651
						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
  4652
						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
  4653
					} 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
  4654
						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
  4655
						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
  4656
						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
  4657
					}
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
  4658
				}
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
  4659
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4660
		}
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
  4661
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
  4662
		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
  4663
	}
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
  4664
}
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
  4665
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4666
void InitDepotWindowBlockSizes();
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
  4667
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4668
static void AfterLoadGRFs()
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4669
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4670
	/* Pre-calculate all refit masks after loading GRF files. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4671
	CalculateRefitMasks();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4672
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4673
	/* Set the block size in the depot windows based on vehicle sprite sizes */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4674
	InitDepotWindowBlockSizes();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4675
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4676
	/* Add all new houses to the house array. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4677
	FinaliseHouseArray();
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4678
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4679
	/* Map cargo strings. This is a separate step because cargos are
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4680
	 * loaded before strings... */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  4681
	MapNewCargoStrings();
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4682
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4683
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
  4684
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
  4685
{
2930
99088d4aba31 (svn r3486) - NewGRF fix: Always reinitialize the ttdpatch flags as patch settings may have changed.
peter1138
parents: 2895
diff changeset
  4686
	InitializeGRFSpecial();
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4687
2463
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4688
	ResetNewGRFData();
db029c987bc7 (svn r2989) - Make engine/vehicle information tables constant. Duplicate them so NewGRF data can be loaded without wiping out the default data.
peter1138
parents: 2458
diff changeset
  4689
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
  4690
	/* 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
  4691
	 * 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
  4692
	 * and load information from it. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4693
	for (GrfLoadingStage stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; 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
  4694
		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
  4695
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
  4696
		_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
  4697
		_cur_spriteid = load_index;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4698
		for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  4699
			if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND) continue;
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  4700
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4701
			/* @todo usererror() */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4702
			if (!FioCheckFileExists(c->filename)) error("NewGRF file is missing '%s'", c->filename);
3628
69646d0924a5 (svn r4527) - Feature [NewGRF]: Add support for specifying parameters to GRF files. Usage: "mygrf = 1". You can pass up to 128 parameters, each one seperated by a comma or a space-character. Big thanks to peter1138 for the inspiration and examples.
Darkvater
parents: 3620
diff changeset
  4703
5008
c2b96042d529 (svn r7027) - Codechange: Replace NewGRF loading stage masks with separate function lists. This will allow us to call different handlers depending on the current stage. Also enum-ize the stage.
peter1138
parents: 4993
diff changeset
  4704
			if (stage == GLS_LABELSCAN) InitNewGRFFile(c, _cur_spriteid);
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  4705
			LoadNewGRFFile(c, slot++, stage);
5476
fa6583f537ce (svn r7760) -Codechange: Debug messages for newgrf showed the starting sprite, not the current sprite index. Also only output the debug message during activation, when sprites are loaded.
peter1138
parents: 5475
diff changeset
  4706
			if (stage == GLS_ACTIVATION) {
fa6583f537ce (svn r7760) -Codechange: Debug messages for newgrf showed the starting sprite, not the current sprite index. Also only output the debug message during activation, when sprites are loaded.
peter1138
parents: 5475
diff changeset
  4707
				ClearTemporaryNewGRFData();
6147
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  4708
				BuildCargoTranslationMap();
5476
fa6583f537ce (svn r7760) -Codechange: Debug messages for newgrf showed the starting sprite, not the current sprite index. Also only output the debug message during activation, when sprites are loaded.
peter1138
parents: 5475
diff changeset
  4709
				DEBUG(sprite, 2, "Currently %i sprites are loaded", _cur_spriteid);
fa6583f537ce (svn r7760) -Codechange: Debug messages for newgrf showed the starting sprite, not the current sprite index. Also only output the debug message during activation, when sprites are loaded.
peter1138
parents: 5475
diff changeset
  4710
			}
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
  4711
		}
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
  4712
	}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  4713
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4714
	/* Call any functions that should be run after GRFs have been loaded. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4715
	AfterLoadGRFs();
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4716
}