src/newgrf.cpp
author peter1138
Fri, 18 Jan 2008 21:08:40 +0000
changeset 8353 056b4f562f88
parent 8323 d5531c7645a7
child 8372 49f8ca06527d
permissions -rw-r--r--
(svn r11919) -Codechange: Assign numbered parameters to world generator widgets to avoid separate DrawString()s, and do the same for the scenario flat-land window.
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 "fileio.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    12
#include "engine.h"
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
    13
#include "spritecache.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    14
#include "station.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    15
#include "sprite.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    16
#include "newgrf.h"
2159
f6284cf5fab0 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2013
diff changeset
    17
#include "variables.h"
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
    18
#include "bridge.h"
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
    19
#include "town.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
    20
#include "newgrf_engine.h"
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
    21
#include "newgrf_text.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
    22
#include "fontcache.h"
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
    23
#include "currency.h"
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
    24
#include "landscape.h"
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
    25
#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
    26
#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
    27
#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
    28
#include "newgrf_spritegroup.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
    29
#include "cargotype.h"
6533
8be3ef428116 (svn r9721) -Codechange: -Codechange: Cleanup of industry_cmd (Step-12). Dynamically build the legends (name and color) for industries in the smallmap_gui.
belugas
parents: 6529
diff changeset
    30
#include "industry.h"
6583
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
    31
#include "newgrf_canal.h"
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents: 6623
diff changeset
    32
#include "newgrf_commons.h"
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
    33
#include "newgrf_townname.h"
7233
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
    34
#include "newgrf_industries.h"
7772
c89384e3f8de (svn r11321) -Codechange: add support to load different graphics for halftile slopes using a NewGRF. Patch by frosch.
rubidium
parents: 7757
diff changeset
    35
#include "gfxinit.h"
7805
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
    36
#include "fios.h"
8103
cf92483a0abf (svn r11664) -Codechange: use more specific ("rail_type.h" instead of "rail.h" that includes way more than only "rail_type.h") includes at some places.
rubidium
parents: 8089
diff changeset
    37
#include "rail.h"
8114
dd6d21dc99c1 (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8104
diff changeset
    38
#include "strings_func.h"
8123
ce31d2843a95 (svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents: 8121
diff changeset
    39
#include "gfx_func.h"
8140
0d0d8c94f84b (svn r11702) -Codechange: move all date related stuff to date*.
rubidium
parents: 8131
diff changeset
    40
#include "date_func.h"
8144
65cec0877b78 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8140
diff changeset
    41
#include "vehicle_func.h"
8157
1505def01945 (svn r11719) -Codechange: split sound.h in a header with types and one with functions.
rubidium
parents: 8150
diff changeset
    42
#include "sound_func.h"
8214
971f861d5543 (svn r11777) -Codechange: split the string header and make do not include it when it's not necessary.
rubidium
parents: 8198
diff changeset
    43
#include "string_func.h"
8236
8a5dd0b42e47 (svn r11800) -Codechange: move some functions to a more logical location + some type safety.
rubidium
parents: 8235
diff changeset
    44
#include "road_func.h"
8254
1496654ca5e7 (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8243
diff changeset
    45
#include "player_base.h"
8270
e7c342f6b14c (svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents: 8264
diff changeset
    46
#include "settings_type.h"
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
    47
8264
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8258
diff changeset
    48
#include "table/strings.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8258
diff changeset
    49
#include "table/sprites.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8258
diff changeset
    50
#include "table/town_land.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8258
diff changeset
    51
#include "table/build_industry.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8258
diff changeset
    52
#include "table/landscape_sprite.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8258
diff changeset
    53
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    54
/* TTDPatch extended GRF format codec
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    55
 * (c) Petr Baudis 2004 (GPL'd)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    56
 * 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
    57
 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    58
 * Contains portions of documentation by TTDPatch team.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    59
 * 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
    60
 * 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
    61
 * 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
    62
455
b151d55203bf (svn r665) code fixes for newgrf.c/newgrf.h
dominik
parents: 452
diff changeset
    63
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
    64
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
    65
static uint _file_index; // XXX
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    66
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
    67
static GRFFile *_cur_grffile;
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    68
GRFFile *_first_grffile;
3707
7dc7e4d2487e (svn r4650) - NewGRF: use the correct type for _cur_spriteid
peter1138
parents: 3704
diff changeset
    69
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
    70
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
    71
static uint32 _nfo_line;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    72
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
    73
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
    74
3814
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
    75
/* 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
    76
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
    77
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    78
/* 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
    79
static uint32 _ttdpatch_flags[8];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    80
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
    81
/* 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
    82
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
    83
6769
13ccbd0f86b3 (svn r10005) -Codechange: Merge two flags (2cc and newhouses) indicating some newgrf features have been loaded, and introduce the newindustry one.
belugas
parents: 6765
diff changeset
    84
/* Indicates which are the newgrf features currently loaded ingame */
6914
6219e65dd7bf (svn r10167) -Codechange: Change the flagging system of grf loaded feature from a bitset to a bool evaluation.
belugas
parents: 6908
diff changeset
    85
GRFLoadedFeatures _loaded_newgrf_features;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    86
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
    87
enum GrfDataType {
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    88
	GDT_SOUND,
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
    89
};
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    90
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    91
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
    92
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
    93
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    94
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
    95
enum grfspec_feature {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    96
	GSF_TRAIN,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    97
	GSF_ROAD,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    98
	GSF_SHIP,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    99
	GSF_AIRCRAFT,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   100
	GSF_STATION,
2438
f0bf4adbd620 (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
   101
	GSF_CANAL,
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   102
	GSF_BRIDGE,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   103
	GSF_TOWNHOUSE,
3620
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
   104
	GSF_GLOBALVAR,
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
   105
	GSF_INDUSTRYTILES,
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
   106
	GSF_INDUSTRIES,
3620
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
   107
	GSF_CARGOS,
a8f09c120f03 (svn r4517) - NewGRF: fix and complete the feature list
peter1138
parents: 3614
diff changeset
   108
	GSF_SOUNDFX,
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
   109
};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   110
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   111
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   112
typedef void (*SpecialSpriteHandler)(byte *buf, int len);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   113
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
   114
static const uint _vehcounts[4] = {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   115
	/* GSF_TRAIN */    NUM_TRAIN_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   116
	/* GSF_ROAD */     NUM_ROAD_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   117
	/* GSF_SHIP */     NUM_SHIP_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   118
	/* GSF_AIRCRAFT */ NUM_AIRCRAFT_ENGINES
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   119
};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   120
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
   121
static const uint _vehshifts[4] = {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   122
	/* GSF_TRAIN */    0,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   123
	/* GSF_ROAD */     ROAD_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   124
	/* GSF_SHIP */     SHIP_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   125
	/* GSF_AIRCRAFT */ AIRCRAFT_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   126
};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   127
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
   128
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
   129
	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
   130
};
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
   131
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
   132
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
   133
static uint16 cargo_disallowed[TOTAL_NUM_ENGINES];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   134
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
   135
/* 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
   136
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
   137
6781
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
   138
/* Contains the GRF ID of the owner of a cargo if it has been reserved */
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
   139
static uint32 _grm_cargos[NUM_CARGO];
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
   140
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   141
/** 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
   142
 * 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
   143
 * 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
   144
 * 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
   145
 * 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
   146
 * 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
   147
 * @param severity debugging severity level, see debug.h
6481
85ad87daf4b0 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6479
diff changeset
   148
 * @param str message in printf() format */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   149
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
   150
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   151
	char buf[1024];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   152
	va_list va;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   153
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   154
	va_start(va, str);
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   155
	vsnprintf(buf, sizeof(buf), str, va);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   156
	va_end(va);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   157
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   158
	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
   159
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   160
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
   161
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
   162
{
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
   163
	if (real >= wanted) return true;
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
   164
	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
   165
	return false;
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
   166
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   167
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 490
diff changeset
   168
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
   169
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   170
	return *(*buf)++;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   171
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   172
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   173
static uint16 grf_load_word(byte **buf)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   174
{
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
   175
	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
   176
	return val | (grf_load_byte(buf) << 8);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   177
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   178
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   179
static uint16 grf_load_extended(byte** buf)
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   180
{
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   181
	uint16 val;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   182
	val = grf_load_byte(buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   183
	if (val == 0xFF) val = grf_load_word(buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   184
	return val;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   185
}
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   186
2324
23ac249f4c70 (svn r2850) [newgrf] Patch from peter1139
miham
parents: 2204
diff changeset
   187
static uint32 grf_load_dword(byte **buf)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   188
{
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
   189
	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
   190
	return val | (grf_load_word(buf) << 16);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   191
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   192
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
   193
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
   194
{
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
   195
	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
   196
		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
   197
		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
   198
		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
   199
		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
   200
			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
   201
			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
   202
	}
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
   203
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   204
6090
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   205
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
   206
{
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   207
	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
   208
	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
   209
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   210
	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
   211
		/* 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
   212
		(*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
   213
		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
   214
	} else {
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   215
		/* 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
   216
		string_length++;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   217
	}
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   218
	*buf += string_length;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   219
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   220
	return string;
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   221
}
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
   222
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   223
static GRFFile *GetFileByGRFID(uint32 grfid)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   224
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   225
	GRFFile *file;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   226
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   227
	for (file = _first_grffile; file != NULL; file = file->next) {
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   228
		if (file->grfid == grfid) break;
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   229
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   230
	return file;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   231
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   232
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   233
static GRFFile *GetFileByFilename(const char *filename)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   234
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   235
	GRFFile *file;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   236
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   237
	for (file = _first_grffile; file != NULL; file = file->next) {
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   238
		if (strcmp(file->filename, filename) == 0) break;
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   239
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   240
	return file;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   241
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   242
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   243
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   244
/** 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
   245
 * while taking in consideration the "drift" between TTDPatch string system and OpenTTD's one
6481
85ad87daf4b0 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6479
diff changeset
   246
 * @param grfid Id of the grf file
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   247
 * @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
   248
 * @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
   249
 */
7615
8ffd309681c2 (svn r11144) -Codechange: add support for newgrf callbacks 29 and 35
glx
parents: 7605
diff changeset
   250
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
   251
{
7879
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   252
	/* StringID table for TextIDs 0x4E->0x6D */
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   253
	static StringID units_volume[] = {
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   254
		STR_NOTHING,    STR_PASSENGERS, STR_TONS,       STR_BAGS,
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   255
		STR_LITERS,     STR_ITEMS,      STR_CRATES,     STR_TONS,
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   256
		STR_TONS,       STR_TONS,       STR_TONS,       STR_BAGS,
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   257
		STR_TONS,       STR_TONS,       STR_TONS,       STR_BAGS,
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   258
		STR_TONS,       STR_TONS,       STR_BAGS,       STR_LITERS,
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   259
		STR_TONS,       STR_LITERS,     STR_TONS,       STR_NOTHING,
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   260
		STR_BAGS,       STR_LITERS,     STR_TONS,       STR_NOTHING,
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   261
		STR_TONS,       STR_NOTHING,    STR_LITERS,     STR_NOTHING
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   262
	};
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   263
	/* 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
   264
	 * 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
   265
	 * 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
   266
	 * 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
   267
	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
   268
		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
   269
	}
7602
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   270
#define TEXID_TO_STRINGID(begin, end, stringid) if (str >= begin && str <= end) return str + (stringid - begin)
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   271
	/* We have some changes in our cargo strings, resulting in some missing. */
7602
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   272
	TEXID_TO_STRINGID(0x000E, 0x002D, STR_000E);
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   273
	TEXID_TO_STRINGID(0x002E, 0x004D, STR_002E);
7879
27da043a4f69 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 7873
diff changeset
   274
	if (str >= 0x004E && str <= 0x006D) str = units_volume[str - 0x004E];
7602
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   275
	TEXID_TO_STRINGID(0x006E, 0x008D, STR_QUANTITY_NOTHING);
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   276
	TEXID_TO_STRINGID(0x008E, 0x00AD, STR_ABBREV_NOTHING);
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
   277
8150
7c4a5e8d94ff (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8144
diff changeset
   278
	/* Map building names according to our lang file changes. There are several
7c4a5e8d94ff (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8144
diff changeset
   279
	 * ranges of house ids, all of which need to be remapped to allow newgrfs
7c4a5e8d94ff (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8144
diff changeset
   280
	 * to use original house names. */
7602
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   281
	TEXID_TO_STRINGID(0x200F, 0x201F, STR_200F_TALL_OFFICE_BLOCK);
8150
7c4a5e8d94ff (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8144
diff changeset
   282
	TEXID_TO_STRINGID(0x2036, 0x2041, STR_2036_COTTAGES);
7c4a5e8d94ff (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8144
diff changeset
   283
	TEXID_TO_STRINGID(0x2059, 0x205C, STR_2059_IGLOO);
7602
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   284
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   285
	/* Same thing for industries, since the introduction of 4 new strings above STR_482A_PRODUCTION_LAST_MONTH */
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   286
	TEXID_TO_STRINGID(0x482A, 0x483B, STR_482A_PRODUCTION_LAST_MONTH);
9f2631198c8a (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 7570
diff changeset
   287
#undef TEXTID_TO_STRINGID
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   288
7605
9b6226ed3384 (svn r11132) -Fix: NewGRFs seem to assume that STR_NULL is an empty string or so.
rubidium
parents: 7602
diff changeset
   289
	if (str == STR_NULL) return STR_EMPTY;
9b6226ed3384 (svn r11132) -Fix: NewGRFs seem to assume that STR_NULL is an empty string or so.
rubidium
parents: 7602
diff changeset
   290
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   291
	return str;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   292
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   293
6375
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   294
static uint8 MapDOSColour(uint8 colour)
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   295
{
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   296
	if (_use_dos_palette) return colour;
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   297
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   298
	if (colour < 10) {
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   299
		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
   300
		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
   301
	}
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   302
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   303
	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
   304
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   305
	return colour;
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   306
}
b22ee0b2ccd0 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6373
diff changeset
   307
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
   308
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   309
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
   310
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   311
static void dewagonize(int condition, int engine)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   312
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   313
	EngineInfo *ei = &_engine_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   314
	RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   315
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   316
	if (condition != 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   317
		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
   318
		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
   319
			rvi->railveh_type = RAILVEH_SINGLEHEAD;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   320
	} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   321
		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
   322
		rvi->railveh_type = RAILVEH_WAGON;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   323
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   324
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   325
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   326
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
   327
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   328
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   329
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   330
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   331
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   332
		EngineInfo *ei       = &_engine_info[engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   333
		RailVehicleInfo *rvi = &_rail_vehicle_info[engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   334
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   335
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   336
			case 0x05: { // Track type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   337
				uint8 tracktype = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   338
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
   339
				switch (tracktype) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   340
					case 0: rvi->railtype = rvi->engclass >= 2 ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   341
					case 1: rvi->railtype = RAILTYPE_MONO; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   342
					case 2: rvi->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
   343
					default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   344
						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
   345
						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
   346
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   347
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   348
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   349
			case 0x08: // AI passenger service
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
   350
				/** @todo Tells the AI that this engine is designed for
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
   351
				 * passenger services and shouldn't be used for freight. */
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   352
				grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   353
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   354
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   355
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   356
			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
   357
				uint16 speed = grf_load_word(&buf);
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   358
				if (speed == 0xFFFF) speed = 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   359
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   360
				rvi->max_speed = speed;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   361
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   362
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   363
			case 0x0B: { // Power
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   364
				uint16 power = grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   365
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   366
				if (rvi->railveh_type == RAILVEH_MULTIHEAD) power /= 2;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   367
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   368
				rvi->power = power;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   369
				dewagonize(power, engine + i);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   370
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   371
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   372
			case 0x0D: { // Running cost factor
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   373
				uint8 runcostfact = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   374
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   375
				if (rvi->railveh_type == RAILVEH_MULTIHEAD) runcostfact /= 2;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   376
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   377
				rvi->running_cost_base = runcostfact;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   378
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   379
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   380
			case 0x0E: { // Running cost base
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   381
				uint32 base = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   382
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   383
				switch (base) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   384
					case 0x4C30: rvi->running_cost_class = 0; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   385
					case 0x4C36: rvi->running_cost_class = 1; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   386
					case 0x4C3C: rvi->running_cost_class = 2; break;
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   387
					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
   388
					default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   389
						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
   390
						break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   391
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   392
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   393
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   394
			case 0x12: { // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   395
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   396
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
   397
				/* 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
   398
				 * 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
   399
				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
   400
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   401
				rvi->image_index = spriteid;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   402
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   403
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   404
			case 0x13: { // Dual-headed
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   405
				uint8 dual = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   406
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   407
				if (dual != 0) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   408
					if (rvi->railveh_type != RAILVEH_MULTIHEAD) {
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   409
						// adjust power and running cost if needed
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   410
						rvi->power /= 2;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   411
						rvi->running_cost_base /= 2;
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   412
					}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   413
					rvi->railveh_type = RAILVEH_MULTIHEAD;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   414
				} else {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   415
					if (rvi->railveh_type == RAILVEH_MULTIHEAD) {
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   416
						// adjust power and running cost if needed
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   417
						rvi->power *= 2;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   418
						rvi->running_cost_base *= 2;
2836
9c023d993651 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   419
					}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   420
					rvi->railveh_type = rvi->power == 0 ?
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
   421
						RAILVEH_WAGON : RAILVEH_SINGLEHEAD;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   422
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   423
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   424
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   425
			case 0x14: // Cargo capacity
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   426
				rvi->capacity = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   427
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   428
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   429
			case 0x15: { // Cargo type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   430
				uint8 ctype = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   431
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   432
				if (ctype < NUM_CARGO && HasBit(_cargo_mask, ctype)) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   433
					rvi->cargo_type = 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
   434
				} else {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   435
					rvi->cargo_type = CT_INVALID;
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
   436
					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
   437
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   438
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   439
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   440
			case 0x16: // Weight
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   441
				SB(rvi->weight, 0, 8, grf_load_byte(&buf));
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   442
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   443
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   444
			case 0x17: // Cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   445
				rvi->base_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   446
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   447
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   448
			case 0x18: // AI rank
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   449
				rvi->ai_rank = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   450
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   451
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   452
			case 0x19: { // Engine traction type
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   453
				/* What do the individual numbers mean?
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   454
				 * 0x00 .. 0x07: Steam
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   455
				 * 0x08 .. 0x27: Diesel
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   456
				 * 0x28 .. 0x31: Electric
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   457
				 * 0x32 .. 0x37: Monorail
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   458
				 * 0x38 .. 0x41: Maglev
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   459
				 */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   460
				uint8 traction = grf_load_byte(&buf);
6581
3641873f4f3f (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 6579
diff changeset
   461
				EngineClass engclass;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   462
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   463
				if (traction <= 0x07) {
6581
3641873f4f3f (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 6579
diff changeset
   464
					engclass = EC_STEAM;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   465
				} else if (traction <= 0x27) {
6581
3641873f4f3f (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 6579
diff changeset
   466
					engclass = EC_DIESEL;
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
   467
				} else if (traction <= 0x31) {
6581
3641873f4f3f (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 6579
diff changeset
   468
					engclass = EC_ELECTRIC;
6585
46035c6baa8d (svn r9799) -Codechange: separate engine class and engine running cost class (mart3p).
rubidium
parents: 6583
diff changeset
   469
				} else if (traction <= 0x37) {
46035c6baa8d (svn r9799) -Codechange: separate engine class and engine running cost class (mart3p).
rubidium
parents: 6583
diff changeset
   470
					engclass = EC_MONORAIL;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   471
				} else if (traction <= 0x41) {
6585
46035c6baa8d (svn r9799) -Codechange: separate engine class and engine running cost class (mart3p).
rubidium
parents: 6583
diff changeset
   472
					engclass = EC_MAGLEV;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   473
				} else {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   474
					break;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   475
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   476
				if (rvi->railtype == RAILTYPE_RAIL     && engclass >= EC_ELECTRIC) rvi->railtype = RAILTYPE_ELECTRIC;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   477
				if (rvi->railtype == RAILTYPE_ELECTRIC && engclass  < EC_ELECTRIC) rvi->railtype = RAILTYPE_RAIL;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   478
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   479
				rvi->engclass = engclass;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   480
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   481
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   482
			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
   483
				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
   484
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
   485
				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
   486
					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
   487
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   488
					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
   489
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   490
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   491
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   492
			case 0x1B: // Powered wagons power bonus
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   493
				rvi->pow_wag_power = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   494
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   495
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   496
			case 0x1C: // Refit cost
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   497
				ei->refit_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   498
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   499
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   500
			case 0x1D: // Refit cargo
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   501
				ei->refit_mask = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   502
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   503
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   504
			case 0x1E: // Callback
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   505
				ei->callbackmask = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   506
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   507
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   508
			case 0x1F: // Tractive effort coefficient
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   509
				rvi->tractive_effort = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   510
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   511
7791
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   512
			case 0x20: // Air drag
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   513
				/** @todo Air drag for trains. */
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   514
				grf_load_byte(&buf);
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   515
				ret = true;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   516
				break;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   517
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   518
			case 0x21: // Shorter vehicle
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   519
				rvi->shorten_factor = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   520
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   521
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   522
			case 0x22: // Visual effect
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
   523
				/** @see note in engine.h about rvi->visual_effect */
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   524
				rvi->visual_effect = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   525
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   526
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   527
			case 0x23: // Powered wagons weight bonus
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   528
				rvi->pow_wag_weight = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   529
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   530
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   531
			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
   532
				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
   533
2545
aa71b3d576ce (svn r3074) -NewGrf: Fix stupid typo in weight setting.
peter1138
parents: 2542
diff changeset
   534
				if (weight > 4) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
   535
					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
   536
				} else {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   537
					SB(rvi->weight, 8, 8, weight);
2542
812fc4357594 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   538
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   539
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   540
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   541
			case 0x25: // User-defined bit mask to set when checking veh. var. 42
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   542
				rvi->user_def_data = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   543
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   544
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   545
			case 0x26: // Retire vehicle early
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   546
				ei->retire_early = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   547
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   548
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   549
			case 0x27: // Miscellaneous flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   550
				ei->misc_flags = grf_load_byte(&buf);
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   551
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   552
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   553
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   554
			case 0x28: // Cargo classes allowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   555
				cargo_allowed[engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   556
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   557
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   558
			case 0x29: // Cargo classes disallowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   559
				cargo_disallowed[engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   560
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   561
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   562
			case 0x2A: // Long format introduction date (days since year 0)
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   563
				ei->base_intro = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   564
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   565
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   566
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   567
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   568
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   569
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   570
	}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   571
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   572
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   573
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   574
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   575
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   576
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
   577
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   578
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   579
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   580
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   581
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   582
		EngineInfo *ei       = &_engine_info[ROAD_ENGINES_INDEX + engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   583
		RoadVehicleInfo *rvi = &_road_vehicle_info[engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   584
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   585
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   586
			case 0x08: // Speed (1 unit is 0.5 kmh)
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   587
				rvi->max_speed = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   588
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   589
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   590
			case 0x09: // Running cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   591
				rvi->running_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   592
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   593
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   594
			case 0x0A: // Running cost base
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
   595
				/** @todo : I have no idea. --pasky
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   596
				 * I THINK it is used for overriding the base cost of all road vehicle (_price.roadveh_base) --belugas */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   597
				grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   598
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   599
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   600
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   601
			case 0x0E: { // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   602
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   603
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   604
				/* 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
   605
				if (spriteid == 0xFF) spriteid = 0xFD;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   606
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   607
				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
   608
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   609
				rvi->image_index = spriteid;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   610
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   611
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   612
			case 0x0F: // Cargo capacity
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   613
				rvi->capacity = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   614
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   615
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   616
			case 0x10: { // Cargo type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   617
				uint8 cargo = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   618
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   619
				if (cargo < NUM_CARGO && HasBit(_cargo_mask, cargo)) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   620
					rvi->cargo_type = 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
   621
				} else {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   622
					rvi->cargo_type = CT_INVALID;
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
   623
					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
   624
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   625
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   626
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   627
			case 0x11: // Cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   628
				rvi->base_cost = grf_load_byte(&buf); // ?? is it base_cost?
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   629
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   630
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   631
			case 0x12: // SFX
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   632
				rvi->sfx = (SoundFx)grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   633
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   634
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   635
			case 0x13: // Power in 10hp
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   636
			case 0x14: // Weight in 1/4 tons
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   637
			case 0x15: // Speed in mph*0.8
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
   638
				/** @todo Support for road vehicles realistic power
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   639
				 * computations (called rvpower in TTDPatch) is just
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   640
				 * missing in OTTD yet. --pasky */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   641
				grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   642
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   643
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   644
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   645
			case 0x16: // Cargos available for refitting
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   646
				ei->refit_mask = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   647
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   648
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   649
			case 0x17: // Callback mask
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   650
				ei->callbackmask = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   651
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   652
7791
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   653
			case 0x18: // Tractive effort
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   654
			case 0x19: // Air drag
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   655
				/** @todo Tractive effort and air drag for road vehicles. */
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   656
				grf_load_byte(&buf);
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   657
				ret = true;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   658
				break;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   659
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   660
			case 0x1A: // Refit cost
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   661
				ei->refit_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   662
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   663
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   664
			case 0x1B: // Retire vehicle early
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   665
				ei->retire_early = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   666
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   667
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   668
			case 0x1C: // Miscellaneous flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   669
				ei->misc_flags = grf_load_byte(&buf);
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   670
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   671
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   672
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   673
			case 0x1D: // Cargo classes allowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   674
				cargo_allowed[ROAD_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   675
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   676
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   677
			case 0x1E: // Cargo classes disallowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   678
				cargo_disallowed[ROAD_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   679
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   680
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   681
			case 0x1F: // Long format introduction date (days since year 0)
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   682
				ei->base_intro = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   683
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   684
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   685
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   686
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   687
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   688
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   689
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   690
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   691
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   692
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   693
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   694
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   695
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
   696
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   697
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   698
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   699
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   700
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   701
		EngineInfo *ei       = &_engine_info[SHIP_ENGINES_INDEX + engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   702
		ShipVehicleInfo *svi = &_ship_vehicle_info[engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   703
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   704
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   705
			case 0x08: { // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   706
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   707
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   708
				/* 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
   709
				if (spriteid == 0xFF) spriteid = 0xFD;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   710
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   711
				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
   712
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   713
				svi->image_index = spriteid;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   714
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   715
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   716
			case 0x09: // Refittable
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   717
				svi->refittable = (grf_load_byte(&buf) != 0);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   718
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   719
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   720
			case 0x0A: // Cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   721
				svi->base_cost = grf_load_byte(&buf); // ?? is it base_cost?
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   722
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   723
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   724
			case 0x0B: // Speed (1 unit is 0.5 kmh)
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   725
				svi->max_speed = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   726
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   727
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   728
			case 0x0C: { // Cargo type
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   729
				uint8 cargo = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   730
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   731
				if (cargo < NUM_CARGO && HasBit(_cargo_mask, cargo)) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   732
					svi->cargo_type = 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
   733
				} else {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   734
					svi->cargo_type = CT_INVALID;
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
   735
					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
   736
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   737
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   738
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   739
			case 0x0D: // Cargo capacity
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   740
				svi->capacity = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   741
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   742
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   743
			case 0x0F: // Running cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   744
				svi->running_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   745
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   746
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   747
			case 0x10: // SFX
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   748
				svi->sfx = (SoundFx)grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   749
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   750
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   751
			case 0x11: // Cargos available for refitting
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   752
				ei->refit_mask = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   753
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   754
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   755
			case 0x12: // Callback mask
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   756
				ei->callbackmask = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   757
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   758
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   759
			case 0x13: // Refit cost
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   760
				ei->refit_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   761
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   762
7791
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   763
			case 0x14: // Ocean speed fraction
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   764
			case 0x15: // Canal speed fraction
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   765
				/** @todo Speed fractions for ships on oceans and canals */
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   766
				grf_load_byte(&buf);
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   767
				ret = true;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   768
				break;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
   769
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   770
			case 0x16: // Retire vehicle early
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   771
				ei->retire_early = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   772
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   773
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   774
			case 0x17: // Miscellaneous flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   775
				ei->misc_flags = grf_load_byte(&buf);
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   776
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   777
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   778
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   779
			case 0x18: // Cargo classes allowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   780
				cargo_allowed[SHIP_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   781
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   782
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   783
			case 0x19: // Cargo classes disallowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   784
				cargo_disallowed[SHIP_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   785
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   786
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   787
			case 0x1A: // Long format introduction date (days since year 0)
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   788
				ei->base_intro = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   789
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   790
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   791
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   792
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   793
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   794
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   795
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   796
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   797
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   798
	return ret;
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
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   801
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
   802
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   803
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   804
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   805
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   806
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   807
		EngineInfo *ei           = &_engine_info[AIRCRAFT_ENGINES_INDEX + engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   808
		AircraftVehicleInfo *avi = &_aircraft_vehicle_info[engine + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   809
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   810
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   811
			case 0x08: { // Sprite ID
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   812
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   813
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   814
				/* 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
   815
				if (spriteid == 0xFF) spriteid = 0xFD;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   816
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   817
				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
   818
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   819
				avi->image_index = spriteid;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   820
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   821
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   822
			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
   823
				if (grf_load_byte(&buf) == 0) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   824
					avi->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
   825
				} else {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   826
					SB(avi->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
   827
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   828
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   829
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   830
			case 0x0A: // Large
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   831
				SB(avi->subtype, 1, 1, (grf_load_byte(&buf) != 0 ? 1 : 0)); // AIR_FAST
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   832
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   833
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   834
			case 0x0B: // Cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   835
				avi->base_cost = grf_load_byte(&buf); // ?? is it base_cost?
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   836
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   837
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   838
			case 0x0C: // Speed (1 unit is 8 mph, we translate to 1 unit is 1 km/h)
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   839
				avi->max_speed = (grf_load_byte(&buf) * 129) / 10;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   840
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   841
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   842
			case 0x0D: // Acceleration
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   843
				avi->acceleration = (grf_load_byte(&buf) * 129) / 10;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   844
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   845
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   846
			case 0x0E: // Running cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   847
				avi->running_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   848
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   849
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   850
			case 0x0F: // Passenger capacity
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   851
				avi->passenger_capacity = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   852
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   853
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   854
			case 0x11: // Mail capacity
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   855
				avi->mail_capacity = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   856
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   857
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   858
			case 0x12: // SFX
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   859
				avi->sfx = (SoundFx)grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   860
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   861
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   862
			case 0x13: // Cargos available for refitting
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   863
				ei->refit_mask = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   864
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   865
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   866
			case 0x14: // Callback mask
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   867
				ei->callbackmask = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   868
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   869
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   870
			case 0x15: // Refit cost
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   871
				ei->refit_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   872
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   873
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   874
			case 0x16: // Retire vehicle early
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   875
				ei->retire_early = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   876
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   877
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   878
			case 0x17: // Miscellaneous flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   879
				ei->misc_flags = grf_load_byte(&buf);
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   880
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   881
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   882
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   883
			case 0x18: // Cargo classes allowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   884
				cargo_allowed[AIRCRAFT_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   885
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   886
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   887
			case 0x19: // Cargo classes disallowed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   888
				cargo_disallowed[AIRCRAFT_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   889
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   890
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   891
			case 0x1A: // Long format introduction date (days since year 0)
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   892
				ei->base_intro = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   893
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   894
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   895
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   896
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   897
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   898
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   899
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   900
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   901
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   902
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   903
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   904
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   905
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
   906
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   907
	byte *buf = *bufp;
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
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   918
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   919
		StationSpec *statspec = _cur_grffile->stations[stid + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   920
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   921
		/* Check that the station we are modifying is defined. */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   922
		if (statspec == NULL && prop != 0x08) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   923
			grfmsg(2, "StationChangeInfo: Attempt to modify undefined station %u, ignoring", stid + i);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   924
			continue;
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
   925
		}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   926
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   927
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   928
			case 0x08: { // Class ID
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   929
				StationSpec **spec = &_cur_grffile->stations[stid + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   930
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
   931
				/* Property 0x08 is special; it is where the station is allocated */
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   932
				if (*spec == NULL) *spec = 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
   933
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
   934
				/* 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
   935
				uint32 classid = grf_load_dword(&buf);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   936
				(*spec)->sclass = AllocateStationClass(BSWAP32(classid));
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   937
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   938
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
   939
			case 0x09: // Define sprite layout
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
   940
				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
   941
				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
   942
				statspec->copied_renderdata = false;
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
   943
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
   944
				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
   945
					DrawTileSprites *dts = &statspec->renderdata[t];
3570
707f93772b0a (svn r4452) - NewGRF: switch to unsigned ints for array indices.
peter1138
parents: 3566
diff changeset
   946
					uint seq_count = 0;
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
   947
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
   948
					dts->seq = NULL;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   949
					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
   950
					dts->ground_pal = grf_load_word(&buf);
3775
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3771
diff changeset
   951
					if (dts->ground_sprite == 0) continue;
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   952
					if (HasBit(dts->ground_pal, 15)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
   953
						ClrBit(dts->ground_pal, 15);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
   954
						SetBit(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   955
					}
8158
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   956
					if (HasBit(dts->ground_pal, 14)) {
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   957
						ClrBit(dts->ground_pal, 14);
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   958
						SetBit(dts->ground_sprite, SPRITE_MODIFIER_OPAQUE);
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   959
					}
8084
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   960
					if (HasBit(dts->ground_sprite, 15)) {
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   961
						ClrBit(dts->ground_sprite, 15);
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   962
						SetBit(dts->ground_sprite, PALETTE_MODIFIER_COLOR);
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   963
					}
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   964
					if (HasBit(dts->ground_sprite, 14)) {
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   965
						ClrBit(dts->ground_sprite, 14);
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   966
						SetBit(dts->ground_sprite, PALETTE_MODIFIER_TRANSPARENT);
aa5d431209a9 (svn r11645) -Fix (r8128): station ground tiles may have transparency or company colour
glx
parents: 8074
diff changeset
   967
					}
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
   968
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   969
					while (buf < *bufp + len) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   970
						DrawTileSeqStruct *dtss;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   971
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
   972
						/* 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
   973
						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
   974
						dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   975
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   976
						dtss->delta_x = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   977
						if ((byte) dtss->delta_x == 0x80) break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   978
						dtss->delta_y = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   979
						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
   980
						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
   981
						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
   982
						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
   983
						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
   984
						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
   985
3775
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3771
diff changeset
   986
						/* Remap flags as ours collide */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   987
						if (HasBit(dtss->pal, 15)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
   988
							ClrBit(dtss->pal, 15);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
   989
							SetBit(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   990
						}
8158
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   991
						if (HasBit(dtss->pal, 14)) {
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   992
							ClrBit(dtss->pal, 14);
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   993
							SetBit(dtss->image, SPRITE_MODIFIER_OPAQUE);
2946a316540b (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8157
diff changeset
   994
						}
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
   995
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
   996
						if (HasBit(dtss->image, 15)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
   997
							ClrBit(dtss->image, 15);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
   998
							SetBit(dtss->image, PALETTE_MODIFIER_COLOR);
3775
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3771
diff changeset
   999
						}
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  1000
						if (HasBit(dtss->image, 14)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  1001
							ClrBit(dtss->image, 14);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  1002
							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
  1003
						}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1004
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1005
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1006
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1007
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1008
			case 0x0A: { // Copy sprite layout
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1009
				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
  1010
				const StationSpec *srcstatspec = _cur_grffile->stations[srcid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1011
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1012
				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
  1013
				statspec->renderdata = srcstatspec->renderdata;
3740
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  1014
				statspec->copied_renderdata = true;
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1015
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1016
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1017
			case 0x0B: // Callback mask
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1018
				statspec->callbackmask = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1019
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1020
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1021
			case 0x0C: // Disallowed number of platforms
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1022
				statspec->disallowed_platforms = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1023
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1024
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1025
			case 0x0D: // Disallowed platform lengths
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1026
				statspec->disallowed_lengths = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1027
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1028
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1029
			case 0x0E: // Define custom layout
5060
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1030
				statspec->copied_layouts = false;
e942a3137724 (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1031
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1032
				while (buf < *bufp + len) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1033
					byte length = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1034
					byte number = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1035
					StationLayout layout;
3570
707f93772b0a (svn r4452) - NewGRF: switch to unsigned ints for array indices.
peter1138
parents: 3566
diff changeset
  1036
					uint l, p;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1037
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1038
					if (length == 0 || number == 0) break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1039
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1040
					//debug("l %d > %d ?", length, stat->lengths);
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1041
					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
  1042
						statspec->platforms = ReallocT(statspec->platforms, length);
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1043
						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
  1044
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
  1045
						statspec->layouts = ReallocT(statspec->layouts, length);
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1046
						memset(statspec->layouts + statspec->lengths, 0,
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1047
						       (length - statspec->lengths) * sizeof(*statspec->layouts));
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1048
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1049
						statspec->lengths = length;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1050
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1051
					l = length - 1; // index is zero-based
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1052
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1053
					//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
  1054
					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
  1055
						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
  1056
						/* 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
  1057
						memset(statspec->layouts[l] + statspec->platforms[l], 0,
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1058
						       (number - statspec->platforms[l]) * sizeof(**statspec->layouts));
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1059
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1060
						statspec->platforms[l] = number;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1061
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1062
542
de27e74b11bd (svn r939) -Fix: Fixed compiler errors
truelight
parents: 536
diff changeset
  1063
					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
  1064
					layout = MallocT<byte>(length * number);
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1065
					for (l = 0; l < length; l++) {
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1066
						for (p = 0; p < number; p++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1067
							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
  1068
						}
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1069
					}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1070
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1071
					l--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1072
					p--;
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1073
					free(statspec->layouts[l][p]);
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1074
					statspec->layouts[l][p] = layout;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1075
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1076
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1077
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1078
			case 0x0F: { // Copy custom layout
5060
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;
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1086
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1087
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1088
			case 0x10: // Little/lots cargo threshold
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1089
				statspec->cargo_threshold = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1090
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1091
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1092
			case 0x11: // Pylon placement
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1093
				statspec->pylons = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1094
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1095
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1096
			case 0x12: // Cargo types for random triggers
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1097
				statspec->cargo_triggers = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1098
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1099
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1100
			case 0x13: // General flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1101
				statspec->flags = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1102
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1103
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1104
			case 0x14: // Overhead wire placement
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1105
				statspec->wires = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1106
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1107
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1108
			case 0x15: // Blocked tiles
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1109
				statspec->blocked = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1110
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1111
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1112
			case 0x16: // @todo Animation info
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1113
				grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1114
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1115
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1116
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1117
			case 0x17: // @todo Animation speed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1118
				grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1119
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1120
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1121
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1122
			case 0x18: // @todo Animation triggers
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1123
				grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1124
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1125
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1126
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1127
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1128
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1129
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1130
		}
452
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;
3504
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1140
	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
  1141
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1142
	if (brid + numinfo > MAX_BRIDGES) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1143
		grfmsg(1, "BridgeChangeInfo: Bridge %u is invalid, max %u, ignoring", brid + numinfo, MAX_BRIDGES);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1144
		return false;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1145
	}
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1146
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1147
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1148
		Bridge *bridge = &_bridge[brid + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1149
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1150
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1151
			case 0x08: // Year of availability
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1152
				bridge->avail_year = ORIGINAL_BASE_YEAR + grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1153
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1154
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1155
			case 0x09: // Minimum length
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1156
				bridge->min_length = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1157
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1158
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1159
			case 0x0A: // Maximum length
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1160
				bridge->max_length = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1161
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1162
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1163
			case 0x0B: // Cost factor
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1164
				bridge->price = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1165
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1166
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1167
			case 0x0C: // Maximum speed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1168
				bridge->speed = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1169
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1170
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1171
			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
  1172
				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
  1173
				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
  1174
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
  1175
				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
  1176
					/* 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
  1177
					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
  1178
				}
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
  1179
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
  1180
				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
  1181
					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
  1182
						grfmsg(1, "BridgeChangeInfo: Table %d >= 7, skipping", tableid);
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1183
						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
  1184
						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
  1185
					}
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
  1186
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
  1187
					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
  1188
						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
  1189
					}
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
  1190
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  1191
					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
  1192
						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
  1193
						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
  1194
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  1195
						if (HasBit(pal, 15)) {
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  1196
							SetBit(image, PALETTE_MODIFIER_TRANSPARENT);
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1197
						}
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1198
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1199
						/* Clear old color modifer bit */
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  1200
						ClrBit(image, 15);
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1201
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5617
diff changeset
  1202
						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
  1203
						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
  1204
					}
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
  1205
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1206
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1207
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1208
			case 0x0E: // Flags; bit 0 - disable far pillars
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1209
				bridge->flags = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1210
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1211
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1212
			case 0x0F: // Long format year of availability (year since year 0)
7922
a7e266f966d9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 7902
diff changeset
  1213
				bridge->avail_year = Clamp(grf_load_dword(&buf), MIN_YEAR, MAX_YEAR);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1214
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1215
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1216
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1217
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1218
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1219
		}
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
  1220
	}
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
  1221
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
  1222
	*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
  1223
	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
  1224
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1225
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1226
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
  1227
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1228
	byte *buf = *bufp;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1229
	bool ret = false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1230
7161
0bb3acce3797 (svn r10435) -Fix (r9315): numinfo starts from 1, not 0, so make it possible to define a house with a local id of 255.
maedhros
parents: 7160
diff changeset
  1231
	if (hid + numinfo > HOUSE_MAX) {
0bb3acce3797 (svn r10435) -Fix (r9315): numinfo starts from 1, not 0, so make it possible to define a house with a local id of 255.
maedhros
parents: 7160
diff changeset
  1232
		grfmsg(1, "TownHouseChangeInfo: Too many houses loaded (%u), max (%u). Ignoring.", hid + numinfo, HOUSE_MAX);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1233
		return false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1234
	}
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
	/* 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
  1237
	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
  1238
		_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
  1239
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1240
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1241
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1242
		HouseSpec *housespec = _cur_grffile->housespec[hid + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1243
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1244
		if (prop != 0x08 && housespec == NULL) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1245
			grfmsg(2, "TownHouseChangeInfo: Attempt to modify undefined house %u. Ignoring.", hid + i);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1246
			continue;
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1247
		}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1248
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1249
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1250
			case 0x08: { // Substitute building type, and definition of a new house
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1251
				HouseSpec **house = &_cur_grffile->housespec[hid + i];
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1252
				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
  1253
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1254
				if (subs_id == 0xFF) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1255
					/* 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
  1256
					 * 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
  1257
					_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
  1258
					continue;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1259
				} 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
  1260
					/* 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
  1261
					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
  1262
					return false;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1263
				}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1264
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1265
				/* Allocate space for this house. */
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1266
				if (*house == NULL) *house = CallocT<HouseSpec>(1);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1267
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1268
				housespec = *house;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1269
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1270
				memcpy(housespec, &_house_specs[subs_id], sizeof(_house_specs[subs_id]));
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1271
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1272
				housespec->enabled = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1273
				housespec->local_id = hid + i;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1274
				housespec->substitute_id = subs_id;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1275
				housespec->grffile = _cur_grffile;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1276
				housespec->random_colour[0] = 0x04;  // those 4 random colours are the base colour
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1277
				housespec->random_colour[1] = 0x08;  // for all new houses
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1278
				housespec->random_colour[2] = 0x0C;  // they stand for red, blue, orange and green
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1279
				housespec->random_colour[3] = 0x06;
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1280
7431
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1281
				/* Make sure that the third cargo type is valid in this
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1282
				 * climate. This can cause problems when copying the properties
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1283
				 * of a house that accepts food, where the new house is valid
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1284
				 * in the temperate climate. */
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1285
				if (!GetCargo(housespec->accepts_cargo[2])->IsValid()) {
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1286
					housespec->cargo_acceptance[2] = 0;
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1287
				}
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1288
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1289
				/**
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1290
				 * New houses do not (currently) expect to have a default start
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1291
				 * date before 1930, as this breaks the build date stuff.
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1292
				 * @see FinaliseHouseArray() for more details.
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1293
				 */
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1294
				if (housespec->min_date < 1930) housespec->min_date = 1930;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1295
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1296
				_loaded_newgrf_features.has_newhouses = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1297
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1298
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1299
			case 0x09: // Building flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1300
				housespec->building_flags = (BuildingFlags)grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1301
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1302
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1303
			case 0x0A: { // Availability years
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1304
				uint16 years = grf_load_word(&buf);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1305
				housespec->min_date = GB(years, 0, 8) > 150 ? MAX_YEAR : ORIGINAL_BASE_YEAR + GB(years, 0, 8);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1306
				housespec->max_date = GB(years, 8, 8) > 150 ? MAX_YEAR : ORIGINAL_BASE_YEAR + GB(years, 8, 8);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1307
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1308
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1309
			case 0x0B: // Population
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1310
				housespec->population = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1311
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1312
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1313
			case 0x0C: // Mail generation multiplier
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1314
				housespec->mail_generation = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1315
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1316
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1317
			case 0x0D: // Passenger acceptance
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1318
			case 0x0E: // Mail acceptance
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1319
				housespec->cargo_acceptance[prop - 0x0D] = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1320
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1321
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1322
			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
  1323
				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
  1324
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
				/* 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
  1326
				 * Else, we have "standard" 3rd cargo type, goods or candy, for toyland once more */
7431
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1327
				CargoID cid = (goods >= 0) ? ((_opt.landscape == LT_TOYLAND) ? CT_CANDY : CT_GOODS) :
6357
f0f5e7d1713c (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6350
diff changeset
  1328
						((_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
  1329
7431
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1330
				/* Make sure the cargo type is valid in this climate. */
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1331
				if (!GetCargo(cid)->IsValid()) goods = 0;
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1332
cac40a9365f3 (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7287
diff changeset
  1333
				housespec->accepts_cargo[2] = cid;
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1334
				housespec->cargo_acceptance[2] = abs(goods); // but we do need positive value here
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1335
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1336
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1337
			case 0x10: // Local authority rating decrease on removal
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1338
				housespec->remove_rating_decrease = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1339
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1340
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1341
			case 0x11: // Removal cost multiplier
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1342
				housespec->removal_cost = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1343
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1344
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1345
			case 0x12: // Building name ID
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  1346
				housespec->building_name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1347
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1348
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1349
			case 0x13: // Building availability mask
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1350
				housespec->building_availability = (HouseZones)grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1351
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1352
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1353
			case 0x14: // House callback flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1354
				housespec->callback_mask = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1355
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1356
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1357
			case 0x15: { // House override byte
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1358
				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
  1359
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1360
				/* 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
  1361
				if (override >= NEW_HOUSE_OFFSET) {
7160
131be0f3e0ef (svn r10434) -Fix (r9315): When setting multiple house overrides in one Action 0, don't override them all with the first ID.
maedhros
parents: 7159
diff changeset
  1362
					grfmsg(2, "TownHouseChangeInfo: Attempt to override new house %u with house id %u. Ignoring.", override, hid + i);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1363
					continue;
6332
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
7873
9bb5874c81df (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 7831
diff changeset
  1366
				_house_mngr.Add(hid + i, _cur_grffile->grfid, override);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1367
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1368
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1369
			case 0x16: // Periodic refresh multiplier
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1370
				housespec->processing_time = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1371
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1372
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1373
			case 0x17: // Four random colours to use
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1374
				for (uint j = 0; j < 4; j++) housespec->random_colour[j] = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1375
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1376
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1377
			case 0x18: // Relative probability of appearing
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1378
				housespec->probability = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1379
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1380
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1381
			case 0x19: // Extra flags
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1382
				housespec->extra_flags = (HouseExtraFlags)grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1383
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1384
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1385
			case 0x1A: // Animation frames
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1386
				housespec->animation_frames = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1387
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1388
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1389
			case 0x1B: // Animation speed
7922
a7e266f966d9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 7902
diff changeset
  1390
				housespec->animation_speed = Clamp(grf_load_byte(&buf), 2, 16);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1391
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1392
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1393
			case 0x1C: // Class of the building type
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1394
				housespec->class_id = AllocateHouseClassID(grf_load_byte(&buf), _cur_grffile->grfid);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1395
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1396
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1397
			case 0x1D: // Callback flags 2
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1398
				housespec->callback_mask |= (grf_load_byte(&buf) << 8);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1399
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1400
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1401
			case 0x1E: { // Accepted cargo types
6461
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1402
				uint32 cargotypes = grf_load_dword(&buf);
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1403
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1404
				/* Check if the cargo types should not be changed */
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1405
				if (cargotypes == 0xFFFFFFFF) break;
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1406
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1407
				for (uint j = 0; j < 3; j++) {
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1408
					/* Get the cargo number from the 'list' */
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1409
					uint8 cargo_part = GB(cargotypes, 8 * j, 8);
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1410
					CargoID cargo = GetCargoTranslation(cargo_part, _cur_grffile);
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1411
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1412
					if (cargo == CT_INVALID) {
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1413
						/* Disable acceptance of invalid cargo type */
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1414
						housespec->cargo_acceptance[j] = 0;
6461
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1415
					} else {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1416
						housespec->accepts_cargo[j] = cargo;
6461
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1417
					}
1cfd2363a072 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6451
diff changeset
  1418
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1419
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1420
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1421
			case 0x1F: // Minimum life span
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1422
				housespec->minimum_life = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1423
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1424
7791
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
  1425
			case 0x20: { // @todo Cargo acceptance watch list
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
  1426
				byte count = grf_load_byte(&buf);
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
  1427
				for (byte j = 0; j < count; j++) grf_load_byte(&buf);
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
  1428
				ret = true;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
  1429
			} break;
6d0d9804ef67 (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 7780
diff changeset
  1430
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1431
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1432
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1433
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1434
		}
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1435
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1436
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1437
	*bufp = buf;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1438
	return ret;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1439
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  1440
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1441
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
  1442
{
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1443
	byte *buf = *bufp;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1444
	bool ret = false;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1445
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1446
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1447
		switch (prop) {
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1448
			case 0x08: { // Cost base factor
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1449
				byte factor = grf_load_byte(&buf);
2508
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1450
				uint price = gvid + i;
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1451
2508
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1452
				if (price < NUM_PRICES) {
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1453
					SetPriceBaseMultiplier(price, factor);
1926793f2977 (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1454
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1455
					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
  1456
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1457
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1458
7899
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1459
			case 0x09: { // Cargo translation table
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1460
				if (gvid != 0) {
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1461
					if (i == 0) grfmsg(1, "InitChangeInfo: Cargo translation table must start at zero");
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1462
					/* Skip data */
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1463
					buf += 4;
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1464
					break;
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1465
				}
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1466
				if (i == 0) {
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1467
					free(_cur_grffile->cargo_list);
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1468
					_cur_grffile->cargo_max = numinfo;
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1469
					_cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1470
				}
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1471
				CargoLabel cl = grf_load_dword(&buf);
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1472
				_cur_grffile->cargo_list[i] = BSWAP32(cl);
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  1473
			} break;
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1474
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1475
			case 0x0A: { // Currency display names
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1476
				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
  1477
				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
  1478
4504
1c238774d1b0 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  1479
				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
  1480
					_currency_specs[curidx].name = newone;
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1481
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1482
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1483
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1484
			case 0x0B: { // Currency multipliers
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1485
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1486
				uint32 rate = grf_load_dword(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1487
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1488
				if (curidx < NUM_CURRENCY) {
4602
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1489
					/* 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
  1490
					 * 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
  1491
					 * to be compatible */
43c44f7df615 (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1492
					_currency_specs[curidx].rate = rate / 1000;
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1493
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1494
					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
  1495
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1496
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1497
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1498
			case 0x0C: { // Currency options
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1499
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1500
				uint16 options = grf_load_word(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1501
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1502
				if (curidx < NUM_CURRENCY) {
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1503
					_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
  1504
					/* 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
  1505
					 * 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
  1506
					_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
  1507
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1508
					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
  1509
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1510
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1511
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1512
			case 0x0D: { // Currency prefix symbol
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1513
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1514
				uint32 tempfix = grf_load_dword(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1515
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1516
				if (curidx < NUM_CURRENCY) {
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1517
					memcpy(_currency_specs[curidx].prefix, &tempfix, 4);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1518
					_currency_specs[curidx].prefix[4] = 0;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1519
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1520
					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
  1521
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1522
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1523
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1524
			case 0x0E: { // Currency suffix symbol
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1525
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1526
				uint32 tempfix = grf_load_dword(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1527
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1528
				if (curidx < NUM_CURRENCY) {
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6481
diff changeset
  1529
					memcpy(&_currency_specs[curidx].suffix, &tempfix, 4);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1530
					_currency_specs[curidx].suffix[4] = 0;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1531
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1532
					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
  1533
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1534
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1535
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1536
			case 0x0F: { //  Euro introduction dates
4625
f365b341a330 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1537
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1538
				Year year_euro = grf_load_word(&buf);
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1539
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1540
				if (curidx < NUM_CURRENCY) {
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1541
					_currency_specs[curidx].to_euro = year_euro;
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1542
				} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  1543
					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
  1544
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1545
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1546
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1547
			case 0x10: // Snow line height table
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1548
				if (numinfo > 1 || IsSnowLineSet()) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1549
					grfmsg(1, "GlobalVarChangeInfo: The snowline can only be set once (%d)", numinfo);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1550
				} else if (len < SNOW_LINE_MONTHS * SNOW_LINE_DAYS) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1551
					grfmsg(1, "GlobalVarChangeInfo: Not enough entries set in the snowline table (%d)", len);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1552
				} else {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1553
					byte table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1554
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1555
					for (uint i = 0; i < SNOW_LINE_MONTHS; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1556
						for (uint j = 0; j < SNOW_LINE_DAYS; j++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1557
							table[i][j] = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1558
						}
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1559
					}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1560
					SetSnowLine(table);
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  1561
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1562
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1563
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1564
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1565
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1566
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1567
		}
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1568
	}
3504
bb52064dbe8a (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1569
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1570
	*bufp = buf;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1571
	return ret;
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1572
}
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1573
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1574
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
  1575
{
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1576
	byte *buf = *bufp;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1577
	bool ret = false;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1578
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1579
	if (cid + numinfo > NUM_CARGO) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1580
		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
  1581
		return false;
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
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1584
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1585
		CargoSpec *cs = &_cargo[cid + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1586
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1587
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1588
			case 0x08: /* Bit number of cargo */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1589
				cs->bitnum = grf_load_byte(&buf);
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1590
				if (cs->IsValid()) {
7718
ae76f089652d (svn r11253) -Fix (r9411): industries can still use cargo they define, even if these cargo are disabled by a grf loaded later
glx
parents: 7717
diff changeset
  1591
					cs->grfid = _cur_grffile->grfid;
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  1592
					SetBit(_cargo_mask, cid + i);
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1593
				} else {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  1594
					ClrBit(_cargo_mask, cid + i);
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1595
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1596
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1597
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1598
			case 0x09: /* String ID for cargo type name */
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  1599
				cs->name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7276
16061f14665c (svn r10606) -Fix (r8826): plural and single cargo names were mixed up.
peter1138
parents: 7240
diff changeset
  1600
				break;
16061f14665c (svn r10606) -Fix (r8826): plural and single cargo names were mixed up.
peter1138
parents: 7240
diff changeset
  1601
16061f14665c (svn r10606) -Fix (r8826): plural and single cargo names were mixed up.
peter1138
parents: 7240
diff changeset
  1602
			case 0x0A: /* String for 1 unit of cargo */
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  1603
				cs->name_single = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1604
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1605
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1606
			case 0x0B:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1607
				/* String for units of cargo. This is different in OpenTTD to TTDPatch
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1608
				 * (e.g. 10 tonnes of coal) */
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  1609
				cs->units_volume = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1610
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1611
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1612
			case 0x0C: /* String for quantity of cargo (e.g. 10 tonnes of coal) */
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  1613
				cs->quantifier = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1614
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1615
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1616
			case 0x0D: /* String for two letter cargo abbreviation */
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  1617
				cs->abbrev = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1618
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1619
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1620
			case 0x0E: /* Sprite ID for cargo icon */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1621
				cs->sprite = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1622
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1623
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1624
			case 0x0F: /* Weight of one unit of cargo */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1625
				cs->weight = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1626
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1627
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1628
			case 0x10: /* Used for payment calculation */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1629
				cs->transit_days[0] = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1630
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1631
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1632
			case 0x11: /* Used for payment calculation */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1633
				cs->transit_days[1] = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1634
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1635
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1636
			case 0x12: /* Base cargo price */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1637
				cs->initial_payment = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1638
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1639
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1640
			case 0x13: /* Colour for station rating bars */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1641
				cs->rating_colour = MapDOSColour(grf_load_byte(&buf));
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1642
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1643
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1644
			case 0x14: /* Colour for cargo graph */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1645
				cs->legend_colour = MapDOSColour(grf_load_byte(&buf));
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1646
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1647
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1648
			case 0x15: /* Freight status */
7162
6435ada4bc34 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7161
diff changeset
  1649
				cs->is_freight = (grf_load_byte(&buf) != 0);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1650
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1651
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1652
			case 0x16: /* Cargo classes */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1653
				cs->classes = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1654
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1655
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1656
			case 0x17: /* Cargo label */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1657
				cs->label = grf_load_dword(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1658
				cs->label = BSWAP32(cs->label);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1659
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1660
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1661
			case 0x18: { /* Town growth substitute type */
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1662
				uint8 substitute_type = grf_load_byte(&buf);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1663
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1664
				switch (substitute_type) {
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1665
					case 0x00: cs->town_effect = TE_PASSENGERS; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1666
					case 0x02: cs->town_effect = TE_MAIL; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1667
					case 0x05: cs->town_effect = TE_GOODS; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1668
					case 0x09: cs->town_effect = TE_WATER; break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1669
					case 0x0B: cs->town_effect = TE_FOOD; break;
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1670
					default:
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1671
						grfmsg(1, "CargoChangeInfo: Unknown town growth substitute value %d, setting to none.", substitute_type);
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1672
					case 0xFF: cs->town_effect = TE_NONE; break;
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1673
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1674
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1675
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1676
			case 0x19: /* Town growth coefficient */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1677
				cs->multipliertowngrowth = grf_load_word(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1678
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1679
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1680
			case 0x1A: /* Bitmask of callbacks to use */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1681
				cs->callback_mask = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1682
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1683
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1684
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1685
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1686
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1687
		}
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1688
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1689
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1690
	*bufp = buf;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1691
	return ret;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1692
}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1693
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  1694
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1695
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
  1696
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1697
	byte *buf = *bufp;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1698
	bool ret = false;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1699
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1700
	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
  1701
		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
  1702
		return false;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1703
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1704
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1705
	for (int i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1706
		uint sound = sid + i + _cur_grffile->sound_offset - GetNumOriginalSounds();
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1707
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1708
		if (sound >= GetNumSounds()) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1709
			grfmsg(1, "SoundEffectChangeInfo: Sound %d not defined (max %d)", sound, GetNumSounds());
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1710
			continue;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1711
		}
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1712
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1713
		switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1714
			case 0x08: // Relative volume
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1715
				GetSound(sound)->volume = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1716
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1717
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1718
			case 0x09: // Priority
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1719
				GetSound(sound)->priority = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1720
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1721
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1722
			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
  1723
				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
  1724
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1725
				if (orig_sound >= GetNumSounds()) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1726
					grfmsg(1, "SoundEffectChangeInfo: Original sound %d not defined (max %d)", 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
  1727
				} else {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1728
					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
  1729
					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
  1730
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1731
					/* 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
  1732
					*oldfe = *newfe;
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1733
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1734
			} break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1735
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1736
			default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1737
				ret = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1738
				break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  1739
		}
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1740
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1741
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1742
	*bufp = buf;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1743
	return ret;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1744
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1745
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1746
static bool IndustrytilesChangeInfo(uint indtid, int numinfo, int prop, byte **bufp, int len)
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1747
{
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1748
	byte *buf = *bufp;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1749
	bool ret = false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1750
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1751
	if (indtid + numinfo > NUM_INDUSTRYTILES) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1752
		grfmsg(1, "IndustryTilesChangeInfo: Too many industry tiles loaded (%u), max (%u). Ignoring.", indtid + numinfo, NUM_INDUSTRYTILES);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1753
		return false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1754
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1755
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1756
	/* Allocate industry tile specs if they haven't been allocated already. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1757
	if (_cur_grffile->indtspec == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1758
		_cur_grffile->indtspec = CallocT<IndustryTileSpec*>(NUM_INDUSTRYTILES);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1759
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1760
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1761
	for (int i = 0; i < numinfo; i++) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1762
		IndustryTileSpec *tsp = _cur_grffile->indtspec[indtid + i];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1763
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1764
		if (prop != 0x08 && tsp == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1765
			grfmsg(2, "IndustryTilesChangeInfo: Attempt to modify undefined industry tile %u. Ignoring.", indtid + i);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1766
			continue;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1767
		}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1768
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1769
		switch (prop) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1770
			case 0x08: { // Substitute industry tile type
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1771
				IndustryTileSpec **tilespec = &_cur_grffile->indtspec[indtid + i];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1772
				byte subs_id = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1773
7459
1b30a380ce60 (svn r10955) -Fix: The substitute prop (0x08) of industry tiles does not behave as prop 0x08 of industry. Therefore, do not disable the old industry with value of 0xFF. Not a bug fix, just a spec compliance correction...
belugas
parents: 7431
diff changeset
  1774
				if (subs_id >= NEW_INDUSTRYTILEOFFSET) {
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1775
					/* The substitute id must be one of the original industry tile. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1776
					grfmsg(2, "IndustryTilesChangeInfo: Attempt to use new industry tile %u as substitute industry tile for %u. Ignoring.", subs_id, indtid + i);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1777
					return false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1778
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1779
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1780
				/* Allocate space for this industry. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1781
				if (*tilespec == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1782
					int tempid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1783
					*tilespec = CallocT<IndustryTileSpec>(1);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1784
					tsp = *tilespec;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1785
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1786
					memcpy(tsp, &_industry_tile_specs[subs_id], sizeof(_industry_tile_specs[subs_id]));
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1787
					tsp->enabled = true;
8104
cb18bacacde0 (svn r11665) -Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08.
belugas
parents: 8103
diff changeset
  1788
cb18bacacde0 (svn r11665) -Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08.
belugas
parents: 8103
diff changeset
  1789
					/* A copied tile should not have the animation infos copied too.
cb18bacacde0 (svn r11665) -Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08.
belugas
parents: 8103
diff changeset
  1790
					 * The anim_state should be left untouched, though
cb18bacacde0 (svn r11665) -Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08.
belugas
parents: 8103
diff changeset
  1791
					 * It is up to the author to animate them himself */
cb18bacacde0 (svn r11665) -Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08.
belugas
parents: 8103
diff changeset
  1792
					tsp->anim_production = INDUSTRYTILE_NOANIM;
cb18bacacde0 (svn r11665) -Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08.
belugas
parents: 8103
diff changeset
  1793
					tsp->anim_next = INDUSTRYTILE_NOANIM;
cb18bacacde0 (svn r11665) -Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08.
belugas
parents: 8103
diff changeset
  1794
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1795
					tsp->grf_prop.local_id = indtid + i;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1796
					tsp->grf_prop.subst_id = subs_id;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1797
					tsp->grf_prop.grffile = _cur_grffile;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1798
					tempid = _industile_mngr.AddEntityID(indtid + i, _cur_grffile->grfid, subs_id); // pre-reserve the tile slot
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1799
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1800
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1801
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1802
			case 0x09: { // Industry tile override
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1803
				byte ovrid = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1804
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1805
				/* The industry being overridden must be an original industry. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1806
				if (ovrid >= NEW_INDUSTRYTILEOFFSET) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1807
					grfmsg(2, "IndustryTilesChangeInfo: Attempt to override new industry tile %u with industry tile id %u. Ignoring.", ovrid, indtid + i);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1808
					return false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1809
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1810
7873
9bb5874c81df (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 7831
diff changeset
  1811
				_industile_mngr.Add(indtid + i, _cur_grffile->grfid, ovrid);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1812
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1813
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1814
			case 0x0A: // Tile acceptance
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1815
			case 0x0B:
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1816
			case 0x0C: {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1817
				uint16 acctp = grf_load_word(&buf);
7988
fa2cce262aa9 (svn r11544) -Fix [FS#1501]: revert r11453 as it translated cargo when it should not
glx
parents: 7978
diff changeset
  1818
				tsp->accepts_cargo[prop - 0x0A] = GetCargoTranslation(GB(acctp, 0, 8), _cur_grffile);
7631
7fc3e541dad6 (svn r11162) -Fix: Acceptance is not a cargo, but rather a level of... acceptance :) So don't need to get cargo name out of it (glx)
belugas
parents: 7630
diff changeset
  1819
				tsp->acceptance[prop - 0x0A] = GB(acctp, 8, 8);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1820
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1821
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1822
			case 0x0D: // Land shape flags
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1823
				tsp->slopes_refused = (Slope)grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1824
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1825
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1826
			case 0x0E: // Callback flags
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1827
				tsp->callback_flags = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1828
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1829
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1830
			case 0x0F: // Animation information
7229
a5f262f6df1b (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7217
diff changeset
  1831
				tsp->animation_info = grf_load_word(&buf);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1832
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1833
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1834
			case 0x10: // Animation speed
7229
a5f262f6df1b (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7217
diff changeset
  1835
				tsp->animation_speed = grf_load_byte(&buf);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1836
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1837
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1838
			case 0x11: // Triggers for callback 25
7229
a5f262f6df1b (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7217
diff changeset
  1839
				tsp->animation_triggers = grf_load_byte(&buf);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1840
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1841
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1842
			case 0x12: // Special flags
7229
a5f262f6df1b (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7217
diff changeset
  1843
				tsp->animation_special_flags = grf_load_byte(&buf);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1844
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1845
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1846
			default:
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1847
				ret = true;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1848
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1849
		}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1850
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1851
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1852
	*bufp = buf;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1853
	return ret;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1854
}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1855
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1856
static bool IndustriesChangeInfo(uint indid, int numinfo, int prop, byte **bufp, int len)
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1857
{
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1858
	byte *buf = *bufp;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1859
	bool ret = false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1860
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1861
	if (indid + numinfo > NUM_INDUSTRYTYPES) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1862
		grfmsg(1, "IndustriesChangeInfo: Too many industries loaded (%u), max (%u). Ignoring.", indid + numinfo, NUM_INDUSTRYTYPES);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1863
		return false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1864
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1865
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1866
	grfmsg(1, "IndustriesChangeInfo: newid %u", indid);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1867
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1868
	/* Allocate industry specs if they haven't been allocated already. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1869
	if (_cur_grffile->industryspec == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1870
		_cur_grffile->industryspec = CallocT<IndustrySpec*>(NUM_INDUSTRYTYPES);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1871
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1872
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1873
	for (int i = 0; i < numinfo; i++) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1874
		IndustrySpec *indsp = _cur_grffile->industryspec[indid + i];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1875
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1876
		if (prop != 0x08 && indsp == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1877
			grfmsg(2, "IndustriesChangeInfo: Attempt to modify undefined industry %u. Ignoring.", indid + i);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1878
			continue;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1879
		}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1880
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1881
		switch (prop) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1882
			case 0x08: { // Substitute industry type
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1883
				IndustrySpec **indspec = &_cur_grffile->industryspec[indid + i];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1884
				byte subs_id = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1885
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1886
				if (subs_id == 0xFF) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1887
					/* Instead of defining a new industry, a substitute industry id
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1888
					 * of 0xFF disables the old industry with the current id. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1889
					_industry_specs[indid + i].enabled = false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1890
					continue;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1891
				} else if (subs_id >= NEW_INDUSTRYOFFSET) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1892
					/* The substitute id must be one of the original industry. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1893
					grfmsg(2, "_industry_specs: Attempt to use new industry %u as substitute industry for %u. Ignoring.", subs_id, indid + i);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1894
					return false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1895
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1896
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1897
				/* Allocate space for this industry.
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1898
				 * Only need to do it once. If ever it is called again, it should not
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1899
				 * do anything */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1900
				if (*indspec == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1901
					*indspec = CallocT<IndustrySpec>(1);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1902
					indsp = *indspec;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1903
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1904
					memcpy(indsp, &_origin_industry_specs[subs_id], sizeof(_industry_specs[subs_id]));
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1905
					indsp->enabled = true;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1906
					indsp->grf_prop.local_id = indid + i;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1907
					indsp->grf_prop.subst_id = subs_id;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1908
					indsp->grf_prop.grffile = _cur_grffile;
7716
2d526433aa95 (svn r11251) -Fix[FS#1318]: Newindustries must not rely on the old check placement functions. It is the the job of callbacks. Therefor, upon substitution, disable the said check.
belugas
parents: 7705
diff changeset
  1909
					/* If the grf industry needs to check its surounding upon creation, it should
2d526433aa95 (svn r11251) -Fix[FS#1318]: Newindustries must not rely on the old check placement functions. It is the the job of callbacks. Therefor, upon substitution, disable the said check.
belugas
parents: 7705
diff changeset
  1910
					 * rely on callbacks, not on the original placement functions */
2d526433aa95 (svn r11251) -Fix[FS#1318]: Newindustries must not rely on the old check placement functions. It is the the job of callbacks. Therefor, upon substitution, disable the said check.
belugas
parents: 7705
diff changeset
  1911
					indsp->check_proc = CHECK_NOTHING;
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1912
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1913
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1914
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1915
			case 0x09: { // Industry type override
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1916
				byte ovrid = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1917
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1918
				/* The industry being overridden must be an original industry. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1919
				if (ovrid >= NEW_INDUSTRYOFFSET) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1920
					grfmsg(2, "IndustriesChangeInfo: Attempt to override new industry %u with industry id %u. Ignoring.", ovrid, indid + i);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1921
					return false;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1922
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1923
				indsp->grf_prop.override = ovrid;
7873
9bb5874c81df (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 7831
diff changeset
  1924
				_industry_mngr.Add(indid + i, _cur_grffile->grfid, ovrid);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1925
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1926
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1927
			case 0x0A: { // Set industry layout(s)
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1928
				indsp->num_table = grf_load_byte(&buf); // Number of layaouts
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1929
				uint32 defsize = grf_load_dword(&buf);  // Total size of the definition
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1930
				IndustryTileTable **tile_table = CallocT<IndustryTileTable*>(indsp->num_table); // Table with tiles to compose an industry
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1931
				IndustryTileTable *itt = CallocT<IndustryTileTable>(defsize); // Temporary array to read the tile layouts from the GRF
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1932
				int size;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1933
				IndustryTileTable *copy_from;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1934
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1935
				for (byte j = 0; j < indsp->num_table; j++) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1936
					for (int k = 0;; k++) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1937
						itt[k].ti.x = grf_load_byte(&buf); // Offsets from northermost tile
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1938
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1939
						if (itt[k].ti.x == 0xFE && k == 0) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1940
							/* This means we have to borrow the layout from an old industry */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1941
							IndustryType type = grf_load_byte(&buf);  //industry holding required layout
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1942
							byte laynbr = grf_load_byte(&buf);        //layout number to borrow
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1943
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1944
							copy_from = (IndustryTileTable*)_origin_industry_specs[type].table[laynbr];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1945
							for (size = 1;; size++) {
7746
91c0bb5613c9 (svn r11283) -Fix(r11282): a typo. Don't ask.
belugas
parents: 7745
diff changeset
  1946
								if (copy_from[size - 1].ti.x == -0x80 && copy_from[size - 1].ti.y == 0) break;
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1947
							}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1948
							break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1949
						}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1950
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1951
						itt[k].ti.y = grf_load_byte(&buf); // Or table definition finalisation
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1952
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1953
						if (itt[k].ti.x == 0 && itt[k].ti.y == 0x80) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1954
							/*  Not the same terminator.  The one we are using is rather
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1955
							 x= -80, y = x .  So, adjust it. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1956
							itt[k].ti.x = -0x80;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1957
							itt[k].ti.y =  0;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1958
							itt[k].gfx  =  0;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1959
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1960
							size = k + 1;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1961
							copy_from = itt;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1962
							break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1963
						}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1964
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1965
						itt[k].gfx = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1966
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1967
						if (itt[k].gfx == 0xFE) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1968
							/* Use a new tile from this GRF */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1969
							int local_tile_id = grf_load_word(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1970
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1971
							/* Read the ID from the _industile_mngr. */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1972
							int tempid = _industile_mngr.GetID(local_tile_id, _cur_grffile->grfid);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1973
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1974
							if (tempid == INVALID_INDUSTRYTILE) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1975
								grfmsg(2, "IndustriesChangeInfo: Attempt to use industry tile %u with industry id %u, not yet defined. Ignoring.", local_tile_id, indid);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1976
							} else {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1977
								/* Declared as been valid, can be used */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1978
								itt[k].gfx = tempid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1979
								size = k + 1;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1980
								copy_from = itt;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1981
							}
7630
e6f5a3dbd443 (svn r11161) -Fix: Allow to transform coordinates in negative ones when gfx of 0xFF allows it
belugas
parents: 7620
diff changeset
  1982
						} else if (itt[k].gfx == 0xFF) {
e6f5a3dbd443 (svn r11161) -Fix: Allow to transform coordinates in negative ones when gfx of 0xFF allows it
belugas
parents: 7620
diff changeset
  1983
							itt[k].ti.x = (int8)GB(itt[k].ti.x, 0, 8);
e6f5a3dbd443 (svn r11161) -Fix: Allow to transform coordinates in negative ones when gfx of 0xFF allows it
belugas
parents: 7620
diff changeset
  1984
							itt[k].ti.y = (int8)GB(itt[k].ti.y, 0, 8);
7633
9a6d9c982348 (svn r11164) -Fix(r11161): a rogue space roaming in the night... removed
belugas
parents: 7631
diff changeset
  1985
						}
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1986
					}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1987
					tile_table[j] = CallocT<IndustryTileTable>(size);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1988
					memcpy(tile_table[j], copy_from, sizeof(*copy_from) * size);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1989
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1990
				/* Install final layout construction in the industry spec */
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1991
				indsp->table = tile_table;
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  1992
				SetBit(indsp->cleanup_flag, 1);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1993
				free(itt);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1994
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1995
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1996
			case 0x0B: // Industry production flags
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1997
				indsp->life_type = (IndustryLifeType)grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1998
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  1999
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2000
			case 0x0C: // Industry closure message
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  2001
				indsp->closure_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2002
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2003
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2004
			case 0x0D: // Production increase message
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  2005
				indsp->production_up_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2006
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2007
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2008
			case 0x0E: // Production decrease message
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  2009
				indsp->production_down_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2010
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2011
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2012
			case 0x0F: // Fund cost multiplier
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2013
				indsp->cost_multiplier = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2014
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2015
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2016
			case 0x10: // Production cargo types
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2017
				for (byte j = 0; j < 2; j++) {
7988
fa2cce262aa9 (svn r11544) -Fix [FS#1501]: revert r11453 as it translated cargo when it should not
glx
parents: 7978
diff changeset
  2018
					indsp->produced_cargo[j] = GetCargoTranslation(grf_load_byte(&buf), _cur_grffile);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2019
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2020
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2021
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2022
			case 0x11: // Acceptance cargo types
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2023
				for (byte j = 0; j < 3; j++) {
7988
fa2cce262aa9 (svn r11544) -Fix [FS#1501]: revert r11453 as it translated cargo when it should not
glx
parents: 7978
diff changeset
  2024
					indsp->accepts_cargo[j] = GetCargoTranslation(grf_load_byte(&buf), _cur_grffile);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2025
				}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2026
				grf_load_byte(&buf); // Unnused, eat it up
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2027
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2028
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2029
			case 0x12: // Production multipliers
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2030
			case 0x13:
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2031
				indsp->production_rate[prop - 0x12] = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2032
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2033
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2034
			case 0x14: // Minimal amount of cargo distributed
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2035
				indsp->minimal_cargo = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2036
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2037
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2038
			case 0x15: { // Random sound effects
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2039
				indsp->number_of_sounds = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2040
				uint8 *sounds = MallocT<uint8>(indsp->number_of_sounds);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2041
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2042
				for (uint8 j = 0; j < indsp->number_of_sounds; j++) sounds[j] = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2043
				indsp->random_sounds = sounds;
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2044
				SetBit(indsp->cleanup_flag, 0);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2045
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2046
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2047
			case 0x16: // Conflicting industry types
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2048
				for (byte j = 0; j < 3; j++) indsp->conflicting[j] = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2049
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2050
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2051
			case 0x17: // Probability in random game
7664
7cf2085c7392 (svn r11195) -Fix: creation chances for industries during gameplay and during map generation were swapped.
rubidium
parents: 7661
diff changeset
  2052
				indsp->appear_creation[_opt.landscape] = grf_load_byte(&buf);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2053
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2054
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2055
			case 0x18: // Probability during gameplay
7664
7cf2085c7392 (svn r11195) -Fix: creation chances for industries during gameplay and during map generation were swapped.
rubidium
parents: 7661
diff changeset
  2056
				indsp->appear_ingame[_opt.landscape] = grf_load_byte(&buf);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2057
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2058
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2059
			case 0x19: // Map color
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2060
				indsp->map_colour = MapDOSColour(grf_load_byte(&buf));
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2061
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2062
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2063
			case 0x1A: // Special industry flags to define special behavior
7757
3e63b119a5bf (svn r11302) -Fix (r9520): typo
glx
parents: 7746
diff changeset
  2064
				indsp->behaviour = (IndustryBehaviour)grf_load_dword(&buf);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2065
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2066
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2067
			case 0x1B: // New industry text ID
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  2068
				indsp->new_industry_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2069
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2070
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2071
			case 0x1C: // Input cargo multipliers for the three input cargo types
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2072
			case 0x1D:
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2073
			case 0x1E: {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2074
					uint32 multiples = grf_load_dword(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2075
					indsp->input_cargo_multiplier[prop - 0x1C][0] = GB(multiples, 0,15);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2076
					indsp->input_cargo_multiplier[prop - 0x1C][1] = GB(multiples, 15,15);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2077
				} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2078
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2079
			case 0x1F: // Industry name
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  2080
				indsp->name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2081
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2082
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2083
			case 0x20: // Prospecting success chance
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2084
				indsp->prospecting_chance = grf_load_dword(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2085
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2086
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2087
			case 0x21:   // Callback flags
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2088
			case 0x22: { // Callback additional flags
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2089
				byte aflag = grf_load_byte(&buf);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2090
				SB(indsp->callback_flags, (prop - 0x21) * 8, 8, aflag);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2091
			} break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2092
7978
c74fc8173339 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 7954
diff changeset
  2093
			case 0x23: // removal cost multiplier
c74fc8173339 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 7954
diff changeset
  2094
				indsp->removal_cost_multiplier = grf_load_dword(&buf);
c74fc8173339 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 7954
diff changeset
  2095
				break;
c74fc8173339 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 7954
diff changeset
  2096
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2097
			default:
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2098
				ret = true;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2099
				break;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2100
		}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2101
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2102
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2103
	*bufp = buf;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2104
	return ret;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2105
}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2106
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2107
/* Action 0x00 */
3879
cfa3cf4731d2 (svn r4928) CodeChange : Rename functions referring to "Vehicle" for "Feature".
belugas
parents: 3875
diff changeset
  2108
static void FeatureChangeInfo(byte *buf, int len)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2109
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2110
	byte *bufend = buf + len;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2111
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2112
	/* <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
  2113
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2114
	 * 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
  2115
	 *                 4 for defining new train station sets
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2116
	 * 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
  2117
	 * B num-info      how many vehicles/stations to change
7892
3e3e1c093a56 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 7882
diff changeset
  2118
	 * E id            ID of first vehicle/station to change, if num-info is
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2119
	 *                 greater than one, this one and the following
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2120
	 *                 vehicles/stations will be changed
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2121
	 * 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
  2122
	 * 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
  2123
	/* TODO: Bridges, town houses. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2124
2438
f0bf4adbd620 (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
  2125
	static const VCI_Handler handler[] = {
3825
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2126
		/* GSF_TRAIN */        RailVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2127
		/* GSF_ROAD */         RoadVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2128
		/* GSF_SHIP */         ShipVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2129
		/* GSF_AIRCRAFT */     AircraftVehicleChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2130
		/* GSF_STATION */      StationChangeInfo,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2131
		/* GSF_CANAL */        NULL,
0d9125733b19 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2132
		/* GSF_BRIDGE */       BridgeChangeInfo,
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2133
		/* GSF_TOWNHOUSE */    TownHouseChangeInfo,
7941
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2134
		/* GSF_GLOBALVAR */    NULL, /* Global variables are handled during reservation */
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2135
		/* GSF_INDUSTRYTILES */IndustrytilesChangeInfo,
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2136
		/* GSF_INDUSTRIES */   IndustriesChangeInfo,
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2137
		/* 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
  2138
		/* GSF_SOUNDFX */      SoundEffectChangeInfo,
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2139
	};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2140
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
  2141
	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
  2142
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2143
	uint8 feature  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2144
	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
  2145
	uint numinfo  = grf_load_byte(&buf);
7892
3e3e1c093a56 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 7882
diff changeset
  2146
	uint engine   = grf_load_extended(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2147
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2148
	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
  2149
	               feature, numprops, engine, numinfo);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2150
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
  2151
	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
  2152
		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
  2153
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2154
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2155
2439
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2156
	if (feature <= GSF_AIRCRAFT) {
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2157
		if (engine + numinfo > _vehcounts[feature]) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2158
			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
  2159
			return;
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2160
		}
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2161
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2162
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2163
	while (numprops-- && buf < bufend) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2164
		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
  2165
		bool ignoring = false;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2166
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2167
		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
  2168
			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
  2169
			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
  2170
			case GSF_SHIP:
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2171
			case GSF_AIRCRAFT: {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2172
				bool handled = true;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2173
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2174
				for (uint i = 0; i < numinfo; i++) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2175
					EngineInfo *ei = &_engine_info[engine + _vehshifts[feature] + i];
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2176
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2177
					/* Common properties for vehicles */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2178
					switch (prop) {
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2179
						case 0x00: // Introduction date
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2180
							ei->base_intro = grf_load_word(&buf) + DAYS_TILL_ORIGINAL_BASE_YEAR;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2181
							break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2182
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2183
						case 0x02: // Decay speed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2184
							SB(ei->unk2, 0, 7, grf_load_byte(&buf) & 0x7F);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2185
							break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2186
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2187
						case 0x03: // Vehicle life
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2188
							ei->lifelength = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2189
							break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2190
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2191
						case 0x04: // Model life
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2192
							ei->base_life = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2193
							break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2194
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2195
						case 0x06: // Climates available
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2196
							ei->climates = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2197
							break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2198
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2199
						case 0x07: // Loading speed
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2200
							/* Hyronymus explained me what does
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2201
							 * this mean and insists on having a
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2202
							 * credit ;-). --pasky */
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2203
							ei->load_amount = grf_load_byte(&buf);
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2204
							break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2205
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2206
						default:
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2207
							handled = false;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2208
							break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2209
					}
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2210
				}
7159
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2211
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2212
				if (handled) break;
9030d8ca51f8 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7034
diff changeset
  2213
			} /* FALL THROUGH */
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2214
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2215
			default:
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2216
				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
  2217
					ignoring = true;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2218
				}
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2219
				break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2220
		}
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2221
8074
6441201410d7 (svn r11635) -Codechange: Give a more informative debug message when encountering unknown newgrf feature in action 00 handling.(FS#1551, Bilbo)
belugas
parents: 8040
diff changeset
  2222
		if (ignoring) grfmsg(1, "FeatureChangeInfo: Ignoring property 0x%02X of feature 0x%02X (not implemented)", prop, feature);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2223
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2224
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2225
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
  2226
/* 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
  2227
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
  2228
{
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
  2229
	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
  2230
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2231
	uint8 feature  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2232
	uint8 numprops = grf_load_byte(&buf);
7892
3e3e1c093a56 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 7882
diff changeset
  2233
	grf_load_byte(&buf);     // num-info
3e3e1c093a56 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 7882
diff changeset
  2234
	grf_load_extended(&buf); // id
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
  2235
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
  2236
	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
  2237
		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
  2238
		/* 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
  2239
		 * 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
  2240
		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
  2241
	}
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
  2242
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2243
	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
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
  2244
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
  2245
	/* 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
  2246
	_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
  2247
}
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
  2248
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2249
/* Action 0x00 (GLS_RESERVE) */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2250
static void ReserveChangeInfo(byte *buf, int len)
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2251
{
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2252
	byte *bufend = buf + len;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2253
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2254
	if (!check_length(len, 6, "InitChangeInfo")) return;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2255
	buf++;
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2256
	uint8 feature  = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2257
7941
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2258
	if (feature != GSF_CARGOS && feature != GSF_GLOBALVAR) return;
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2259
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2260
	uint8 numprops = grf_load_byte(&buf);
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2261
	uint8 numinfo  = grf_load_byte(&buf);
7892
3e3e1c093a56 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 7882
diff changeset
  2262
	uint8 index    = grf_load_extended(&buf);
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2263
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2264
	while (numprops-- && buf < bufend) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2265
		uint8 prop = grf_load_byte(&buf);
7941
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2266
		bool ignoring = false;
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2267
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2268
		switch (feature) {
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2269
			default: NOT_REACHED();
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2270
			case GSF_CARGOS:
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2271
				ignoring = CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf);
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2272
				break;
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2273
			case GSF_GLOBALVAR:
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2274
				ignoring = GlobalVarChangeInfo(index, numinfo, prop, &buf, bufend - buf);
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2275
				break;
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2276
		}
7941
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2277
2cb6dd3c46ee (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 7931
diff changeset
  2278
		if (ignoring) grfmsg(2, "ReserveChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2279
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2280
}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  2281
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2282
/**
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2283
 * Creates a spritegroup representing a callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2284
 * @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
  2285
 * @return A spritegroup representing that callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2286
 */
4893
000692659d8c (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2287
static const SpriteGroup* NewCallBackResultSpriteGroup(uint16 value)
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2288
{
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  2289
	SpriteGroup *group = AllocateSpriteGroup();
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2290
2488
1e98c71e5f6a (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2291
	group->type = SGT_CALLBACK;
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2292
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2293
	/* 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
  2294
	 * 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
  2295
	if ((value >> 8) == 0xFF) {
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  2296
		value &= ~0xFF00;
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  2297
	} else {
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2298
		value &= ~0x8000;
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  2299
	}
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2300
2488
1e98c71e5f6a (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2301
	group->g.callback.result = value;
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2302
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2303
	return group;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2304
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2305
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
  2306
/**
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
  2307
 * Creates a spritegroup representing a sprite number result.
6481
85ad87daf4b0 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6479
diff changeset
  2308
 * @param sprite The sprite number.
85ad87daf4b0 (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6479
diff changeset
  2309
 * @param num_sprites The number of sprites per set.
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
  2310
 * @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
  2311
 */
4893
000692659d8c (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2312
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
  2313
{
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  2314
	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
  2315
	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
  2316
	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
  2317
	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
  2318
	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
  2319
}
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
  2320
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2321
/* Action 0x01 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2322
static void NewSpriteSet(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2323
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2324
	/* <01> <feature> <num-sets> <num-ent>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2325
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2326
	 * B feature       feature to define sprites for
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2327
	 *                 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
  2328
	 * B num-sets      number of sprite sets
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2329
	 * 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
  2330
	 *                 For vehicles, this is the number of different
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2331
	 *                         vehicle directions in each sprite set
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2332
	 *                         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
  2333
	 *                         In that case, use num-dirs=4.
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2334
	 */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2335
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
  2336
	if (!check_length(len, 4, "NewSpriteSet")) return;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2337
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2338
	uint8 feature   = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2339
	uint8 num_sets  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2340
	uint16 num_ents = grf_load_extended(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2341
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
  2342
	_cur_grffile->spriteset_start = _cur_spriteid;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2343
	_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
  2344
	_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
  2345
	_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
  2346
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2347
	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
  2348
		_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
  2349
	);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2350
8282
d9f5096a5d54 (svn r11846) -Fix [FS#1651]: implicit conversion from unsigned to signed int caused compilation failure with MSVC.
peter1138
parents: 8270
diff changeset
  2351
	for (int i = 0; i < num_sets * num_ents; i++) {
7953
db4cd9ef0efc (svn r11509) -Fix: off-by-one error in some sprite numbers; increase sprite number counter before loading the next sprite instead of after doing so.
rubidium
parents: 7941
diff changeset
  2352
		_nfo_line++;
6908
6b1324d7a2c9 (svn r10157) -Fix: use as indentified for PNGs, the place of the image as it was in the grf, not the internal SpriteID
truelight
parents: 6894
diff changeset
  2353
		LoadNextSprite(_cur_spriteid++, _file_index, _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
  2354
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2355
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2356
6576
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2357
/* Action 0x01 (SKIP) */
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2358
static void SkipAct1(byte *buf, int len)
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2359
{
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2360
	if (!check_length(len, 4, "SkipAct1")) return;
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2361
	buf++;
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2362
	grf_load_byte(&buf);
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2363
	uint8 num_sets  = grf_load_byte(&buf);
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2364
	uint16 num_ents = grf_load_extended(&buf);
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2365
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2366
	_skip_sprites = num_sets * num_ents;
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2367
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2368
	grfmsg(3, "SkipAct1: Skipping %d sprites", _skip_sprites);
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2369
}
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  2370
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
  2371
/* 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
  2372
 * defined spritegroup. */
4893
000692659d8c (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2373
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
  2374
{
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2375
	if (HasBit(groupid, 15)) return NewCallBackResultSpriteGroup(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
  2376
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
  2377
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2378
		grfmsg(1, "GetGroupFromGroupID(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
  2379
		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
  2380
	}
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
  2381
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
  2382
	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
  2383
}
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
  2384
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
  2385
/* 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
  2386
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
  2387
{
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2388
	if (HasBit(spriteid, 15)) return NewCallBackResultSpriteGroup(spriteid);
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
  2389
3667
67cf868114ac (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2390
	if (spriteid >= _cur_grffile->spriteset_numsets) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2391
		grfmsg(1, "CreateGroupFromGroupID(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
  2392
		return NULL;
67cf868114ac (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2393
	}
67cf868114ac (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2394
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
  2395
	/* 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
  2396
	 * 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
  2397
	 * 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
  2398
	if (_cur_grffile->spriteset_start + spriteid * num_sprites + num_sprites > _cur_spriteid) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2399
		grfmsg(1, "CreateGroupFromGroupID(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
  2400
				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
  2401
				_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
  2402
				_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
  2403
		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
  2404
	}
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
  2405
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2406
	if (feature != _cur_grffile->spriteset_feature) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2407
		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Sprite set feature 0x%02X does not match action feature 0x%02X, skipping",
6885
12cc0502992a (svn r10128) -Fix (r4811): missing printf parameters in newgrf debug message
peter1138
parents: 6873
diff changeset
  2408
				setid, type,
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2409
				_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
  2410
		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
  2411
	}
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2412
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
  2413
	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
  2414
}
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
  2415
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2416
/* Action 0x02 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2417
static void NewSpriteGroup(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2418
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2419
	/* <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
  2420
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2421
	 * B feature       see action 1
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2422
	 * B set-id        ID of this particular definition
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2423
	 * B type/num-entries
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2424
	 *                 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
  2425
	 *                 list definition, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2426
	 *                 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
  2427
	 *                 meaning depends on the feature
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2428
	 * 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
  2429
	SpriteGroup *group = NULL;
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2430
	byte *bufend = buf + len;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2431
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
  2432
	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
  2433
	buf++;
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2434
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2435
	uint8 feature = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2436
	uint8 setid   = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2437
	uint8 type    = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2438
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
  2439
	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
  2440
		/* 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
  2441
		_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
  2442
		/* 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
  2443
		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
  2444
			_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
  2445
	}
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
  2446
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2447
	switch (type) {
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2448
		/* Deterministic Sprite Group */
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2449
		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
  2450
		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
  2451
		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
  2452
		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
  2453
		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
  2454
		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
  2455
		{
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
  2456
			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
  2457
			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
  2458
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
  2459
			/* 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
  2460
			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
  2461
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2462
			group = AllocateSpriteGroup();
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2463
			group->type = SGT_DETERMINISTIC;
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2464
			group->g.determ.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
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
  2465
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
  2466
			switch (GB(type, 2, 2)) {
3672
f626ea3c9994 (svn r4588) - NewGRF: silence a false compiler warning
peter1138
parents: 3668
diff changeset
  2467
				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
  2468
				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
  2469
				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
  2470
				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
  2471
			}
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2472
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
  2473
			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
  2474
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
  2475
			/* 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
  2476
			 * 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
  2477
			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
  2478
				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
  2479
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
  2480
				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
  2481
					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
  2482
				}
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
  2483
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
  2484
				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
  2485
				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
  2486
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
  2487
				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
  2488
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
  2489
				/* 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
  2490
				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
  2491
				adjust->variable  = grf_load_byte(&buf);
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2492
				if (adjust->variable == 0x7E) {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2493
					/* Link subroutine group */
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2494
					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
  2495
				} else {
7954
57b51c69c072 (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 7953
diff changeset
  2496
					adjust->parameter = IsInsideMM(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5609
diff changeset
  2497
				}
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
  2498
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
  2499
				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
  2500
				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
  2501
				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
  2502
				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
  2503
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
  2504
				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
  2505
					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
  2506
					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
  2507
				} 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
  2508
					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
  2509
					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
  2510
				}
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
  2511
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
  2512
				/* Continue reading var adjusts while bit 5 is set. */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2513
			} while (HasBit(varadjust, 5));
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
  2514
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
  2515
			group->g.determ.num_ranges = grf_load_byte(&buf);
6659
dc6f5b564096 (svn r9890) -Codechange: Don't allocate space for 0 spriteset ranges
peter1138
parents: 6652
diff changeset
  2516
			if (group->g.determ.num_ranges > 0) 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
  2517
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
  2518
			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
  2519
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2520
			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
  2521
				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
  2522
				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
  2523
				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
  2524
			}
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2525
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
  2526
			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
  2527
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2528
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2529
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2530
		/* Randomized Sprite Group */
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2531
		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
  2532
		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
  2533
		{
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
  2534
			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
  2535
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2536
			group = AllocateSpriteGroup();
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2537
			group->type = SGT_RANDOMIZED;
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2538
			group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
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
  2539
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2540
			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
  2541
			group->g.random.triggers       = GB(triggers, 0, 7);
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2542
			group->g.random.cmp_mode       = HasBit(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
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
  2543
			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
  2544
			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
  2545
			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
  2546
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
  2547
			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
  2548
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2549
			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
  2550
				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
  2551
			}
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2552
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2553
			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
  2554
		}
3633
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2555
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
  2556
		/* 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
  2557
		default:
fd7db14d4491 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2558
		{
3803
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2559
87ff6c6f7d96 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2560
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
  2561
			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
  2562
				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
  2563
				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
  2564
				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
  2565
				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
  2566
				case GSF_STATION:
6583
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2567
				case GSF_CANAL:
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  2568
				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
  2569
				{
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
  2570
					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
  2571
					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
  2572
					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
  2573
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
  2574
					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
  2575
						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
  2576
						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
  2577
					}
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
  2578
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
  2579
					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
  2580
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
  2581
					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
  2582
					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
  2583
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
  2584
					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
  2585
					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
  2586
					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
  2587
					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
  2588
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2589
					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
  2590
							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
  2591
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2592
					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
  2593
						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
  2594
						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
  2595
						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
  2596
					}
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
  2597
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2598
					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
  2599
						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
  2600
						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
  2601
						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
  2602
					}
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
  2603
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
  2604
					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
  2605
				}
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
  2606
7174
688c4e8b5d73 (svn r10448) -Codechange: Industry Tiles and Houses share almost the same spritegroup format.
belugas
parents: 7168
diff changeset
  2607
				case GSF_TOWNHOUSE:
688c4e8b5d73 (svn r10448) -Codechange: Industry Tiles and Houses share almost the same spritegroup format.
belugas
parents: 7168
diff changeset
  2608
				case GSF_INDUSTRYTILES: {
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2609
					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
  2610
					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
  2611
					uint i;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2612
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2613
					group = AllocateSpriteGroup();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2614
					group->type = SGT_TILELAYOUT;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2615
					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
  2616
					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
  2617
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2618
					/* Groundsprite */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2619
					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
  2620
					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
  2621
					/* Remap transparent/colour modifier bits */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2622
					if (HasBit(group->g.layout.dts->ground_sprite, 14)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2623
						ClrBit(group->g.layout.dts->ground_sprite, 14);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2624
						SetBit(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_TRANSPARENT);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2625
					}
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2626
					if (HasBit(group->g.layout.dts->ground_sprite, 15)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2627
						ClrBit(group->g.layout.dts->ground_sprite, 15);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2628
						SetBit(group->g.layout.dts->ground_sprite, PALETTE_MODIFIER_COLOR);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2629
					}
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2630
					if (HasBit(group->g.layout.dts->ground_pal, 14)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2631
						ClrBit(group->g.layout.dts->ground_pal, 14);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2632
						SetBit(group->g.layout.dts->ground_sprite, SPRITE_MODIFIER_OPAQUE);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2633
					}
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2634
					if (HasBit(group->g.layout.dts->ground_pal, 15)) {
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2635
						/* 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
  2636
						 * last spriteset defined. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2637
						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
  2638
						SB(group->g.layout.dts->ground_sprite, 0, SPRITE_WIDTH, sprite);
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2639
						ClrBit(group->g.layout.dts->ground_pal, 15);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2640
					}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2641
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2642
					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
  2643
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2644
					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
  2645
						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
  2646
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2647
						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
  2648
						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
  2649
						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
  2650
						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
  2651
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2652
						if (HasBit(seq->image, 14)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2653
							ClrBit(seq->image, 14);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2654
							SetBit(seq->image, PALETTE_MODIFIER_TRANSPARENT);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2655
						}
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2656
						if (HasBit(seq->image, 15)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2657
							ClrBit(seq->image, 15);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2658
							SetBit(seq->image, PALETTE_MODIFIER_COLOR);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2659
						}
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2660
						if (HasBit(seq->pal, 14)) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2661
							ClrBit(seq->pal, 14);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  2662
							SetBit(seq->image, SPRITE_MODIFIER_OPAQUE);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2663
						}
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  2664
						if (HasBit(seq->pal, 15)) {
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2665
							/* 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
  2666
							 * last spriteset defined. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2667
							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
  2668
							SB(seq->image, 0, SPRITE_WIDTH, sprite);
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  2669
							ClrBit(seq->pal, 15);
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2670
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2671
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2672
						if (type > 0) {
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2673
							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
  2674
							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
  2675
						}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2676
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2677
						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
  2678
						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
  2679
						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
  2680
					}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2681
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2682
					/* Set the terminator value. */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2683
					((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
  2684
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2685
					break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2686
				}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  2687
7168
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2688
				case GSF_INDUSTRIES: {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2689
					if (type > 1) {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2690
						grfmsg(1, "NewSpriteGroup: Unsupported industry production version %d, skipping", type);
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2691
						break;
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2692
					}
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2693
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2694
					group = AllocateSpriteGroup();
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2695
					group->type = SGT_INDUSTRY_PRODUCTION;
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2696
					group->g.indprod.version = type;
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2697
					if (type == 0) {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2698
						for (uint i = 0; i < 3; i++) {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2699
							group->g.indprod.substract_input[i] = grf_load_word(&buf);
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2700
						}
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2701
						for (uint i = 0; i < 2; i++) {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2702
							group->g.indprod.add_output[i] = grf_load_word(&buf);
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2703
						}
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2704
						group->g.indprod.again = grf_load_byte(&buf);
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2705
					} else {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2706
						for (uint i = 0; i < 3; i++) {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2707
							group->g.indprod.substract_input[i] = grf_load_byte(&buf);
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2708
						}
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2709
						for (uint i = 0; i < 2; i++) {
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2710
							group->g.indprod.add_output[i] = grf_load_byte(&buf);
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2711
						}
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2712
						group->g.indprod.again = grf_load_byte(&buf);
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2713
					}
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2714
					break;
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2715
				}
25e07ccb4a3d (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7162
diff changeset
  2716
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
  2717
				/* 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
  2718
				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
  2719
			}
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
  2720
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2721
	}
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
  2722
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
  2723
	_cur_grffile->spritegroups[setid] = group;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2724
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2725
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2726
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
  2727
{
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2728
	/* 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
  2729
	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
  2730
	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
  2731
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
  2732
	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
  2733
		/* 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
  2734
		if (ctype >= 32) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2735
			grfmsg(1, "TranslateCargo: Cargo bitnum %d out of range (max 31), skipping.", ctype);
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
  2736
			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
  2737
		}
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
  2738
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
  2739
		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
  2740
			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
  2741
			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
  2742
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
  2743
			if (cs->bitnum == ctype) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2744
				grfmsg(6, "TranslateCargo: Cargo bitnum %d mapped to cargo type %d.", ctype, c);
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
  2745
				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
  2746
			}
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
  2747
		}
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
  2748
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2749
		grfmsg(5, "TranslateCargo: Cargo bitnum %d not available in this climate, skipping.", ctype);
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
  2750
		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
  2751
	}
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
  2752
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2753
	/* 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
  2754
	if (ctype >= _cur_grffile->cargo_max) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2755
		grfmsg(1, "TranslateCargo: 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
  2756
		return CT_INVALID;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2757
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2758
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2759
	/* 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
  2760
	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
  2761
	if (cl == 0) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2762
		grfmsg(5, "TranslateCargo: Cargo type %d not available in this climate, skipping.", ctype);
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2763
		return CT_INVALID;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2764
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2765
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2766
	ctype = GetCargoIDByLabel(cl);
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2767
	if (ctype == CT_INVALID) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2768
		grfmsg(5, "TranslateCargo: Cargo '%c%c%c%c' unsupported, skipping.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8));
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2769
		return CT_INVALID;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2770
	}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2771
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2772
	grfmsg(6, "TranslateCargo: 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);
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2773
	return ctype;
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2774
}
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2775
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
  2776
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2777
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
  2778
{
8198
a1d062c165b5 (svn r11761) -Codechange: Use appropriate variable types for NewGRF engine overrides, and adjust scope while there.
peter1138
parents: 8194
diff changeset
  2779
	static EngineID *last_engines;
a1d062c165b5 (svn r11761) -Codechange: Use appropriate variable types for NewGRF engine overrides, and adjust scope while there.
peter1138
parents: 8194
diff changeset
  2780
	static uint last_engines_count;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2781
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
  2782
	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
  2783
		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
  2784
			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
  2785
			last_engines_count = idcount;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2786
		}
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
  2787
	} else {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2788
		if (last_engines_count == 0) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2789
			grfmsg(0, "VehicleMapSpriteGroup: WagonOverride: No engine to do override with");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2790
			return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2791
		}
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
  2792
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2793
		grfmsg(6, "VehicleMapSpriteGroup: WagonOverride: %u engines, %u wagons",
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2794
				last_engines_count, idcount);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2795
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2796
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2797
	for (uint i = 0; i < idcount; i++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2798
		uint8 engine_id = buf[3 + i];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2799
		uint8 engine = engine_id + _vehshifts[feature];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2800
		byte *bp = &buf[4 + idcount];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2801
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2802
		if (engine_id > _vehcounts[feature]) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2803
			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
  2804
			return;
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
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2807
		grfmsg(7, "VehicleMapSpriteGroup: [%d] Engine %d...", i, engine);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2808
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2809
		for (uint c = 0; c < cidcount; c++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2810
			uint8 ctype = grf_load_byte(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2811
			uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2812
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2813
			grfmsg(8, "VehicleMapSpriteGroup: * [%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
  2814
2516
4659ceee4dcb (svn r3045) -NewGRF, Codechange: Don't attempt to map and empty sprite group to a vehicle.
peter1138
parents: 2515
diff changeset
  2815
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2816
				grfmsg(1, "VehicleMapSpriteGroup: 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
  2817
				continue;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2818
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2819
6143
dbca54e64e01 (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6142
diff changeset
  2820
			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
  2821
			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
  2822
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2823
			if (wagover) {
4869
3a75d9b3b5ea (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4818
diff changeset
  2824
				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
  2825
			} 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
  2826
				SetCustomEngineSprites(engine, ctype, _cur_grffile->spritegroups[groupid]);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2827
				last_engines[i] = engine;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2828
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2829
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2830
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2831
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2832
	{
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
  2833
		byte *bp = &buf[4 + idcount + cidcount * 3];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2834
		uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2835
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  2836
		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
  2837
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  2838
		for (uint i = 0; i < idcount; i++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2839
			uint8 engine = buf[3 + i] + _vehshifts[feature];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2840
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  2841
			/* 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
  2842
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6805
3a516a89ddb4 (svn r10044) -Fix: Minor NewGRF debug message fixes, and skip sprites of an unsupported Action 5 feature.
peter1138
parents: 6781
diff changeset
  2843
				grfmsg(1, "VehicleMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
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
  2844
				       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
  2845
				continue;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2846
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2847
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2848
			if (wagover) {
8235
7987f051dd76 (svn r11799) -Codechange: no need to special-case helicopter rotor 'overrides'
peter1138
parents: 8221
diff changeset
  2849
				SetWagonOverrideSprites(engine, CT_DEFAULT, _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
  2850
			} 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
  2851
				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
  2852
				SetEngineGRF(engine, _cur_grffile);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2853
				last_engines[i] = engine;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2854
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2855
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2856
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2857
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2858
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
  2859
6583
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2860
static void CanalMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2861
{
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2862
	byte *bp = &buf[4 + idcount + cidcount * 3];
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2863
	uint16 groupid = grf_load_word(&bp);
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2864
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2865
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2866
		grfmsg(1, "CanalMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2867
		       groupid, _cur_grffile->spritegroups_count);
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2868
		return;
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2869
	}
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2870
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2871
	for (uint i = 0; i < idcount; i++) {
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2872
		CanalFeature cf = (CanalFeature)buf[3 + i];
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2873
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2874
		if (cf >= CF_END) {
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2875
			grfmsg(1, "CanalMapSpriteGroup: Canal subset %d out of range, skipping", cf);
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2876
			continue;
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2877
		}
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2878
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2879
		_canal_sg[cf] = _cur_grffile->spritegroups[groupid];
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2880
	}
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2881
}
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2882
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  2883
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
  2884
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
  2885
{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2886
	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
  2887
		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
  2888
		StationSpec *statspec = _cur_grffile->stations[stid];
7699
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2889
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2890
		if (statspec == NULL) {
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2891
			grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stid);
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2892
			return;
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2893
		}
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2894
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
  2895
		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
  2896
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2897
		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
  2898
			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
  2899
			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
  2900
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2901
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2902
				grfmsg(1, "StationMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
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
  2903
				       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
  2904
				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
  2905
			}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2906
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2907
			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
  2908
			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
  2909
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2910
			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
  2911
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2912
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2913
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2914
	{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2915
		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
  2916
		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
  2917
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2918
		if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2919
			grfmsg(1, "StationMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
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
  2920
			       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
  2921
			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
  2922
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2923
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2924
		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
  2925
			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
  2926
			StationSpec *statspec = _cur_grffile->stations[stid];
7699
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2927
			if (statspec == NULL) {
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2928
				grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stid);
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2929
				continue;
ed0f40f66af9 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 7698
diff changeset
  2930
			}
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
  2931
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2932
			statspec->spritegroup[CT_DEFAULT] = _cur_grffile->spritegroups[groupid];
6451
e576c71bfc09 (svn r9601) -Codechange: Store grf file reference in station spec, not just GRF ID
peter1138
parents: 6424
diff changeset
  2933
			statspec->grffile = _cur_grffile;
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
  2934
			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
  2935
			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
  2936
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2937
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2938
}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2939
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2940
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2941
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
  2942
{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2943
	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
  2944
	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
  2945
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2946
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2947
		grfmsg(1, "TownHouseMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
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
  2948
		       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
  2949
		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
  2950
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2951
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2952
	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
  2953
		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
  2954
		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
  2955
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2956
		if (hs == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  2957
			grfmsg(1, "TownHouseMapSpriteGroup: Too many houses defined, skipping");
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
  2958
			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
  2959
		}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2960
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2961
		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
  2962
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2963
}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  2964
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2965
static void IndustryMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2966
{
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2967
	byte *bp = &buf[4 + idcount + cidcount * 3];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2968
	uint16 groupid = grf_load_word(&bp);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2969
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2970
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2971
		grfmsg(1, "IndustryMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2972
		       groupid, _cur_grffile->spritegroups_count);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2973
		return;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2974
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2975
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2976
	for (uint i = 0; i < idcount; i++) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2977
		uint8 id = buf[3 + i];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2978
		IndustrySpec *indsp = _cur_grffile->industryspec[id];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2979
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2980
		if (indsp == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2981
			grfmsg(1, "IndustryMapSpriteGroup: Too many industries defined, skipping");
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2982
			return;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2983
		}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2984
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2985
		indsp->grf_prop.spritegroup = _cur_grffile->spritegroups[groupid];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2986
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2987
}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2988
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2989
static void IndustrytileMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2990
{
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2991
	byte *bp = &buf[4 + idcount + cidcount * 3];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2992
	uint16 groupid = grf_load_word(&bp);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2993
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2994
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2995
		grfmsg(1, "IndustrytileMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2996
		       groupid, _cur_grffile->spritegroups_count);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2997
		return;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2998
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  2999
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3000
	for (uint i = 0; i < idcount; i++) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3001
		uint8 id = buf[3 + i];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3002
		IndustryTileSpec *indtsp = _cur_grffile->indtspec[id];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3003
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3004
		if (indtsp == NULL) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3005
			grfmsg(1, "IndustrytileMapSpriteGroup: Too many industry tiles defined, skipping");
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3006
			return;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3007
		}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3008
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3009
		indtsp->grf_prop.spritegroup = _cur_grffile->spritegroups[groupid];
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3010
	}
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3011
}
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3012
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3013
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
  3014
{
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3015
	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
  3016
	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
  3017
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3018
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3019
		grfmsg(1, "CargoMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3020
		       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
  3021
		return;
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3022
	}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3023
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3024
	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
  3025
		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
  3026
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3027
		if (cid >= NUM_CARGO) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3028
			grfmsg(1, "CargoMapSpriteGroup: Cargo ID %d out of range, skipping");
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3029
			continue;
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3030
		}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3031
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3032
		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
  3033
		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
  3034
		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
  3035
	}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3036
}
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3037
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3038
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
  3039
/* 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
  3040
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
  3041
{
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3042
	/* <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
  3043
	 * 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
  3044
	 * 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
  3045
	 *
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3046
	 * 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
  3047
	 * 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
  3048
	 *                 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
  3049
	 * 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
  3050
	 * 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
  3051
	 *                 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
  3052
	 * 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
  3053
	 * 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
  3054
	 * 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
  3055
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3056
	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
  3057
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3058
	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
  3059
	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
  3060
	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
  3061
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3062
	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
  3063
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3064
	/* 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
  3065
	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
  3066
		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
  3067
		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
  3068
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3069
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3070
	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
  3071
	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
  3072
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3073
	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
  3074
			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
  3075
7620
e6b07f259eff (svn r11150) -Fix [FS#1202]: NewGRF action 3 does not necessarily need an action 1 to be defined. Patch by frosch.
rubidium
parents: 7615
diff changeset
  3076
	if (_cur_grffile->spritegroups == 0) {
e6b07f259eff (svn r11150) -Fix [FS#1202]: NewGRF action 3 does not necessarily need an action 1 to be defined. Patch by frosch.
rubidium
parents: 7615
diff changeset
  3077
		grfmsg(1, "FeatureMapSpriteGroup: No sprite groups to work on! Skipping");
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
  3078
		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
  3079
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3080
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3081
	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
  3082
		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
  3083
		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
  3084
		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
  3085
		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
  3086
			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
  3087
			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
  3088
6583
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  3089
		case GSF_CANAL:
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  3090
			CanalMapSpriteGroup(buf, idcount, cidcount);
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  3091
			return;
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  3092
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
  3093
		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
  3094
			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
  3095
			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
  3096
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3097
		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
  3098
			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
  3099
			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
  3100
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3101
		case GSF_INDUSTRIES:
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3102
			IndustryMapSpriteGroup(buf, idcount, cidcount);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3103
			return;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3104
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3105
		case GSF_INDUSTRYTILES:
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3106
			IndustrytileMapSpriteGroup(buf, idcount, cidcount);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3107
			return;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  3108
6365
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3109
		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
  3110
			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
  3111
			return;
b52bd4ca10b6 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6363
diff changeset
  3112
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
  3113
		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
  3114
			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
  3115
			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
  3116
	}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3117
}
bddccbf3420d (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6361
diff changeset
  3118
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3119
/* Action 0x04 */
3879
cfa3cf4731d2 (svn r4928) CodeChange : Rename functions referring to "Vehicle" for "Feature".
belugas
parents: 3875
diff changeset
  3120
static void FeatureNewName(byte *buf, int len)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3121
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3122
	/* <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
  3123
	 *
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3124
	 * B veh-type      see action 0 (as 00..07, + 0A
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3125
	 *                 But IF veh-type = 48, then generic text
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3126
	 * 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
  3127
	                   with up to 64 language.
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3128
	                   Otherwise, it is a mapping where set bits have meaning
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3129
	                   0 = american, 1 = english, 2 = german, 3 = french, 4 = spanish
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3130
	                   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
  3131
	 * 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
  3132
	 * 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
  3133
	 *                 Byte : ID of vehicle to change
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3134
	 *                 Word : ID of string to change/add
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3135
	 * 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
  3136
	 *                 which the next name begins. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3137
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
  3138
	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
  3139
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
  3140
	if (!check_length(len, 6, "FeatureNewName")) return;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3141
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3142
	uint8 feature  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3143
	uint8 lang     = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3144
	uint8 num      = grf_load_byte(&buf);
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  3145
	bool generic   = HasBit(lang, 7);
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3146
	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
  3147
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  3148
	ClrBit(lang, 7);
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3149
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
  3150
	if (feature <= GSF_AIRCRAFT && id < _vehcounts[feature]) {
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3151
		id += _vehshifts[feature];
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3152
	}
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3153
	uint16 endid = id + num;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3154
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3155
	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
  3156
	               id, endid, feature, lang);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3157
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
  3158
	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
  3159
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3160
	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
  3161
		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
  3162
		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
  3163
dd413a1ccb6b (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6062
diff changeset
  3164
		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
  3165
6607
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3166
		grfmsg(8, "FeatureNewName: 0x%04X <- %s", id, name);
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3167
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3168
		switch (feature) {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3169
			case GSF_TRAIN:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3170
			case GSF_ROAD:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3171
			case GSF_SHIP:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3172
			case GSF_AIRCRAFT:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3173
				if (id < TOTAL_NUM_ENGINES) {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3174
					StringID string = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_8000_KIRBY_PAUL_TANK_STEAM + id);
8258
9fa31acb07bc (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8254
diff changeset
  3175
					EngineInfo *ei = &_engine_info[id];
9fa31acb07bc (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8254
diff changeset
  3176
					ei->string_id = string;
6607
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3177
				} else {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3178
					AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, id);
3614
c697c69b6363 (svn r4510) - NewGRF bounds checking:
peter1138
parents: 3604
diff changeset
  3179
				}
6607
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3180
				break;
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3181
7182
3cce857179f9 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7174
diff changeset
  3182
			case GSF_INDUSTRIES: {
3cce857179f9 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7174
diff changeset
  3183
				AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
3cce857179f9 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7174
diff changeset
  3184
				break;
3cce857179f9 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7174
diff changeset
  3185
			}
3cce857179f9 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7174
diff changeset
  3186
6607
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3187
			case GSF_TOWNHOUSE:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3188
			default:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3189
				switch (GB(id, 8, 8)) {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3190
					case 0xC4: // Station class name
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3191
						if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3192
							grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3193
						} else {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3194
							StationClassID sclass = _cur_grffile->stations[GB(id, 0, 8)]->sclass;
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3195
							SetStationClassName(sclass, AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED));
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  3196
						}
6607
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3197
						break;
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3198
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3199
					case 0xC5: // Station name
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3200
						if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3201
							grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3202
						} else {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3203
							_cur_grffile->stations[GB(id, 0, 8)]->name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3204
						}
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3205
						break;
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3206
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3207
					case 0xC9: // House name
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3208
						if (_cur_grffile->housespec == NULL || _cur_grffile->housespec[GB(id, 0, 8)] == NULL) {
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3209
							grfmsg(1, "FeatureNewName: Attempt to name undefined house 0x%X, ignoring.", GB(id, 0, 8));
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3210
						} else {
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  3211
							_cur_grffile->housespec[GB(id, 0, 8)]->building_name = GRFMappedStringID(AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED), 0);
6607
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3212
						}
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3213
						break;
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3214
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3215
					case 0xD0:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3216
					case 0xDC:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3217
						AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3218
						break;
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3219
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3220
					default:
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3221
						grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3222
						break;
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3223
				}
ef92dcaaa49c (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 6606
diff changeset
  3224
				break;
3642
8da309b5fd2b (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3641
diff changeset
  3225
8da309b5fd2b (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3641
diff changeset
  3226
#if 0
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3227
				case GSF_CANAL :
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3228
				case GSF_BRIDGE :
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3229
					AddGRFString(_cur_spriteid, id, lang, name);
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6481
diff changeset
  3230
					switch (GB(id, 8, 8)) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3231
						case 0xC9: // House name
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3232
						default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3233
							grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3234
					}
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3235
					break;
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3236
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3237
				default :
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3238
					grfmsg(7, "FeatureNewName: Unsupported feature (0x%02X)", feature);
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3239
					break;
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3240
#endif
452
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
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3244
7882
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3245
/**
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3246
 * Sanitize incoming sprite offsets for Action 5 graphics replacements.
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3247
 * @param num         the number of sprites to load.
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3248
 * @param offset      offset from the base.
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3249
 * @param max_sprites the maximum number of sprites that can be loaded in this action 5.
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3250
 * @param name        used for error warnings.
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3251
 * @return the number of sprites that is going to be skipped
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3252
 */
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3253
static uint16 SanitizeSpriteOffset(uint16& num, uint16 offset, int max_sprites, const char *name)
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3254
{
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3255
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3256
	if (offset >= max_sprites) {
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3257
		grfmsg(1, "GraphicsNew: %s sprite offset must be less than %i, skipping", name, max_sprites);
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3258
		uint orig_num = num;
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3259
		num = 0;
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3260
		return orig_num;
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3261
	}
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3262
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3263
	if (offset + num > max_sprites) {
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3264
		grfmsg(4, "GraphicsNew: %s sprite overflow, truncating...", name);
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3265
		uint orig_num = num;
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3266
		num = max(max_sprites - offset, 0);
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3267
		return orig_num - num;
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3268
	}
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3269
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3270
	return 0;
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3271
}
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3272
8183
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3273
/** Allows to reposition the loaded sprite to its correct placment.
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3274
 * @param load_index SpriteID of the sprite to be relocated */
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3275
static inline void TranslateShoreSprites(SpriteID load_index)
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3276
{
8185
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3277
	/** Contains the displacement required for the corresponding initial sprite*/
8183
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3278
	static const SpriteID shore_dup[8] = {
8185
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3279
		SPR_SHORE_BASE +  4,  ///< 4062
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3280
		SPR_SHORE_BASE +  1,  ///< 4063
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3281
		SPR_SHORE_BASE +  2,  ///< 4064
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3282
		SPR_SHORE_BASE +  8,  ///< 4065
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3283
		SPR_SHORE_BASE +  6,  ///< 4066
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3284
		SPR_SHORE_BASE + 12,  ///< 4067
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3285
		SPR_SHORE_BASE +  3,  ///< 4068
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3286
		SPR_SHORE_BASE +  9,  ///< 4069
8183
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3287
	};
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3288
8185
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3289
	DupSprite(load_index, shore_dup[load_index - SPR_ORIGINALSHORE_START]);
8183
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3290
}
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3291
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3292
/* Action 0x05 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3293
static void GraphicsNew(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3294
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3295
	/* <05> <graphics-type> <num-sprites> <other data...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3296
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3297
	 * 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
  3298
	 * 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
  3299
	 * 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
  3300
	/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3301
8243
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3302
	enum Action5BlockType {
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3303
		A5BLOCK_FIXED,                ///< Only allow replacing a whole block of sprites. (TTDP compatible)
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3304
		A5BLOCK_ALLOW_OFFSET,         ///< Allow replacing any subset by specifiing an offset.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3305
		A5BLOCK_INVALID,              ///< unknown/not-implemented type
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3306
	};
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3307
	struct Action5Type {
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3308
		Action5BlockType block_type;  ///< How is this Action5 type processed?
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3309
		SpriteID sprite_base;         ///< Load the sprites starting from this sprite.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3310
		uint16 min_sprites;           ///< If the Action5 contains less sprites, the whole block will be ignored.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3311
		uint16 max_sprites;           ///< If the Action5 contains more sprites, only the first max_sprites sprites will be used.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3312
		const char *name;             ///< Name for error messages.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3313
	};
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3314
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3315
	static const Action5Type action5_types[] = {
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3316
		/* Note: min_sprites should not be changed. Therefore these constants are directly here and not in sprites.h */
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3317
		/* 0x00 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x00"             },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3318
		/* 0x01 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x01"             },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3319
		/* 0x02 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x02"             },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3320
		/* 0x03 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x03"             },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3321
		/* 0x04 */ { A5BLOCK_FIXED,        SPR_SIGNALS_BASE,   48, PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT,    "Signal graphics"       },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3322
		/* 0x05 */ { A5BLOCK_FIXED,        SPR_ELRAIL_BASE,    48, ELRAIL_SPRITE_COUNT,                         "Catenary graphics"     },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3323
		/* 0x06 */ { A5BLOCK_FIXED,        SPR_SLOPES_BASE,    74, NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT, "Foundation graphics"   },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3324
		/* 0x07 */ { A5BLOCK_INVALID,      0,                  75, 0,                                           "TTDP GUI graphics"     }, // Not used by OTTD.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3325
		/* 0x08 */ { A5BLOCK_FIXED,        SPR_CANALS_BASE,    65, CANALS_SPRITE_COUNT,                         "Canal graphics"        },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3326
		/* 0x09 */ { A5BLOCK_FIXED,        SPR_ONEWAY_BASE,     6, ONEWAY_SPRITE_COUNT,                         "One way road graphics" },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3327
		/* 0x0A */ { A5BLOCK_FIXED,        SPR_2CCMAP_BASE,   256, TWOCCMAP_SPRITE_COUNT,                       "2CC colour maps"       },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3328
		/* 0x0B */ { A5BLOCK_FIXED,        SPR_TRAMWAY_BASE,  113, TRAMWAY_SPRITE_COUNT,                        "Tramway graphics"      },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3329
		/* 0x0C */ { A5BLOCK_INVALID,      0,                 133, 0,                                           "Snowy temperate tree"  }, // Not yet used by OTTD.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3330
		/* 0x0D */ { A5BLOCK_FIXED,        SPR_SHORE_BASE,     16, SPR_SHORE_SPRITE_COUNT,                      "Shore graphics"        },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3331
		/* 0x0E */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "New Signals graphics"  }, // Not yet used by OTTD.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3332
		/* 0x0F */ { A5BLOCK_INVALID,      0,                  12, 0,                                           "Sloped rail track"     }, // Not yet used by OTTD.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3333
		/* 0x10 */ { A5BLOCK_FIXED,        SPR_AIRPORTX_BASE,  15, AIRPORTX_SPRITE_COUNT,                       "Airport graphics"      },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3334
		/* 0x11 */ { A5BLOCK_FIXED,        SPR_ROADSTOP_BASE,   8, ROADSTOP_SPRITE_COUNT,                       "Road stop graphics"    },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3335
		/* 0x12 */ { A5BLOCK_INVALID,      0,                   8, 0,                                           "Aqueduct graphics"     }, // Not yet used by OTTD.
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3336
		/* 0x13 */ { A5BLOCK_FIXED,        SPR_AUTORAIL_BASE,  55, AUTORAIL_SPRITE_COUNT,                       "Autorail graphics"     },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3337
		/* 0x14 */ { A5BLOCK_ALLOW_OFFSET, SPR_FLAGS_BASE,      1, FLAGS_SPRITE_COUNT,                          "Flag graphics"         },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3338
		/* 0x15 */ { A5BLOCK_ALLOW_OFFSET, SPR_OPENTTD_BASE,    1, OPENTTD_SPRITE_COUNT,                        "OpenTTD GUI graphics"  },
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3339
	};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3340
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
  3341
	if (!check_length(len, 2, "GraphicsNew")) return;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3342
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3343
	uint8 type = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3344
	uint16 num = grf_load_extended(&buf);
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  3345
	uint16 offset = HasBit(type, 7) ? grf_load_extended(&buf) : 0;
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  3346
	ClrBit(type, 7); // Clear the high bit as that only indicates whether there is an offset.
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3347
8243
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3348
	if ((type == 0x0D) && (num == 10) && _cur_grffile->is_ottdfile) {
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3349
		/* Special not-TTDP-compatible case used in openttd(d/w).grf
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3350
		 * Missing shore sprites and initialisation of SPR_SHORE_BASE */
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3351
		grfmsg(2, "GraphicsNew: Loading 10 missing shore sprites from openttd(d/w).grf.");
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3352
		LoadNextSprite(       SPR_SHORE_BASE          +  0, _file_index, _nfo_line++); // SLOPE_STEEP_S
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3353
		TranslateShoreSprites(SPR_ORIGINALSHORE_START +  1);                           // SLOPE_W
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3354
		TranslateShoreSprites(SPR_ORIGINALSHORE_START +  2);                           // SLOPE_S
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3355
		TranslateShoreSprites(SPR_ORIGINALSHORE_START +  6);                           // SLOPE_SW
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3356
		TranslateShoreSprites(SPR_ORIGINALSHORE_START     );                           // SLOPE_E
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3357
		LoadNextSprite(       SPR_SHORE_BASE          +  5, _file_index, _nfo_line++); // SLOPE_STEEP_W
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3358
		TranslateShoreSprites(SPR_ORIGINALSHORE_START +  4);                           // SLOPE_SE
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3359
		LoadNextSprite(       SPR_SHORE_BASE          +  7, _file_index, _nfo_line++); // SLOPE_WSE
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3360
		TranslateShoreSprites(SPR_ORIGINALSHORE_START +  3);                           // SLOPE_N
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3361
		TranslateShoreSprites(SPR_ORIGINALSHORE_START +  7);                           // SLOPE_NW
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3362
		LoadNextSprite(       SPR_SHORE_BASE          + 10, _file_index, _nfo_line++); // SLOPE_STEEP_N
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3363
		LoadNextSprite(       SPR_SHORE_BASE          + 11, _file_index, _nfo_line++); // SLOPE_NWS
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3364
		TranslateShoreSprites(SPR_ORIGINALSHORE_START +  5);                           // SLOPE_NE
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3365
		LoadNextSprite(       SPR_SHORE_BASE          + 13, _file_index, _nfo_line++); // SLOPE_ENW
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3366
		LoadNextSprite(       SPR_SHORE_BASE          + 14, _file_index, _nfo_line++); // SLOPE_SEN
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3367
		LoadNextSprite(       SPR_SHORE_BASE          + 15, _file_index, _nfo_line++); // SLOPE_STEEP_E
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3368
		LoadNextSprite(       SPR_SHORE_BASE          + 16, _file_index, _nfo_line++); // SLOPE_EW
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3369
		LoadNextSprite(       SPR_SHORE_BASE          + 17, _file_index, _nfo_line++); // SLOPE_NS
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3370
		return;
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
  3371
	}
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
  3372
8243
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3373
	/* Supported type? */
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3374
	if ((type >= lengthof(action5_types)) || (action5_types[type].block_type == A5BLOCK_INVALID)) {
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3375
		grfmsg(2, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring)", type, num);
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3376
		_skip_sprites = num;
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3377
		return;
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
  3378
	}
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
  3379
8243
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3380
	const Action5Type *action5_type = &action5_types[type];
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3381
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3382
	/* Ignore offset if not allowed */
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3383
	if ((action5_type->block_type != A5BLOCK_ALLOW_OFFSET) && (offset != 0)) {
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3384
		grfmsg(1, "GraphicsNew: %s (type 0x%02X) do not allow an <offset> field. Ignoring offset.", action5_type->name, type);
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3385
		offset = 0;
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3386
	}
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3387
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3388
	/* Ignore action5 if too few sprites are specified. (for TTDP compatibility)
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3389
	 * This does not make sense, if <offset> is allowed */
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3390
	if ((action5_type->block_type == A5BLOCK_FIXED) && (num < action5_type->min_sprites)) {
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3391
		grfmsg(1, "GraphicsNew: %s (type 0x%02X) count must be at least %d. Only %d were specified. Skipping.", action5_type->name, type, action5_type->min_sprites, num);
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3392
		_skip_sprites = num;
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3393
		return;
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3394
	}
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3395
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3396
	/* Load at most max_sprites sprites. Skip remaining sprites. (for compatibility with TTDP and future extentions) */
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3397
	uint16 skip_num = SanitizeSpriteOffset(num, offset, action5_type->max_sprites, action5_type->name);
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3398
	SpriteID replace = action5_type->sprite_base + offset;
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3399
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3400
	/* Load <num> sprites starting from <replace>, then skip <skip_num> sprites. */
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3401
	grfmsg(2, "GraphicsNew: Replacing sprites %d to %d of %s (type 0x%02X) at SpriteID 0x%04X", offset, offset + num - 1, action5_type->name, type, replace);
6f76ab9f5ac0 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8239
diff changeset
  3402
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
  3403
	for (; num > 0; num--) {
7953
db4cd9ef0efc (svn r11509) -Fix: off-by-one error in some sprite numbers; increase sprite number counter before loading the next sprite instead of after doing so.
rubidium
parents: 7941
diff changeset
  3404
		_nfo_line++;
6908
6b1324d7a2c9 (svn r10157) -Fix: use as indentified for PNGs, the place of the image as it was in the grf, not the internal SpriteID
truelight
parents: 6894
diff changeset
  3405
		LoadNextSprite(replace == 0 ? _cur_spriteid++ : replace++, _file_index, _nfo_line);
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
  3406
	}
7882
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3407
308cab08d2f3 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 7879
diff changeset
  3408
	_skip_sprites = skip_num;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3409
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3410
6529
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3411
/* Action 0x05 (SKIP) */
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3412
static void SkipAct5(byte *buf, int len)
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3413
{
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3414
	if (!check_length(len, 2, "SkipAct5")) return;
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3415
	buf++;
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3416
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3417
	/* Ignore type byte */
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3418
	grf_load_byte(&buf);
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3419
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3420
	/* Skip the sprites of this action */
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3421
	_skip_sprites = grf_load_extended(&buf);
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3422
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3423
	grfmsg(3, "SkipAct5: Skipping %d sprites", _skip_sprites);
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3424
}
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3425
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3426
static uint32 GetParamVal(byte param, uint32 *cond_val)
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3427
{
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3428
	switch (param) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3429
		case 0x81: // current year
7922
a7e266f966d9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 7902
diff changeset
  3430
			return Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
5340
8e534cd781cc (svn r7506) -Codechange: [NewGRF] Add action 7/9/D variable 0x81 (current year)
glx
parents: 5338
diff changeset
  3431
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3432
		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
  3433
			return _opt.landscape;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3434
6813
4ad1ec93dd64 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 6806
diff changeset
  3435
		case 0x84: { // GRF loading stage
4ad1ec93dd64 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 6806
diff changeset
  3436
			uint32 res = 0;
4ad1ec93dd64 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 6806
diff changeset
  3437
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  3438
			if (_cur_stage > GLS_INIT) SetBit(res, 0);
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  3439
			if (_cur_stage == GLS_RESERVE) SetBit(res, 8);
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  3440
			if (_cur_stage == GLS_ACTIVATION) SetBit(res, 9);
6813
4ad1ec93dd64 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 6806
diff changeset
  3441
			return res;
4ad1ec93dd64 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 6806
diff changeset
  3442
		}
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3443
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3444
		case 0x85: // TTDPatch flags, only for bit tests
3811
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3445
			if (cond_val == NULL) {
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3446
				/* Supported in Action 0x07 and 0x09, not 0x0D */
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3447
				return 0;
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3448
			} else {
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3449
				uint32 param_val = _ttdpatch_flags[*cond_val / 0x20];
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3450
				*cond_val %= 0x20;
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3451
				return param_val;
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3452
			}
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3453
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3454
		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
  3455
			return _opt.road_side << 4;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3456
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3457
		case 0x88: // GRF ID check
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3458
			return 0;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3459
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3460
		case 0x8B: { // TTDPatch version
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3461
			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
  3462
			uint minor    = 6;
7672
4e0a4b93efb7 (svn r11203) -Codechange: Raise the TTDPatch version a little higher, as some new features will be shortly exploitable
belugas
parents: 7666
diff changeset
  3463
			uint revision = 1; // special case: 2.0.1 is 2.0.10
4e0a4b93efb7 (svn r11203) -Codechange: Raise the TTDPatch version a little higher, as some new features will be shortly exploitable
belugas
parents: 7666
diff changeset
  3464
			uint build    = 1382;
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
  3465
			return (major << 24) | (minor << 20) | (revision << 16) | build;
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3466
		}
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3467
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3468
		case 0x8D: // TTD Version, 00=DOS, 01=Windows
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3469
			return !_use_dos_palette;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3470
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3471
		case 0x8E: // Y-offset for train sprites
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3472
			return _traininfo_vehicle_pitch;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3473
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3474
		case 0x92: // Game mode
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3475
			return _game_mode;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3476
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3477
		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
  3478
			return UINT_MAX;
5287
917cc6407bda (svn r7436) -Codechange: Add action7/9/D variable 0x9A (-1)
peter1138
parents: 5234
diff changeset
  3479
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3480
		case 0x9D: // TTD Platform, 00=TTDPatch, 01=OpenTTD
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3481
			return 1;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3482
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3483
		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
  3484
			return _misc_grf_features;
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  3485
7780
12ef69de4e60 (svn r11330) -Add: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics.
rubidium
parents: 7772
diff changeset
  3486
		case 0xA1: { // OpenTTD version
12ef69de4e60 (svn r11330) -Add: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics.
rubidium
parents: 7772
diff changeset
  3487
			extern uint32 _openttd_newgrf_version;
12ef69de4e60 (svn r11330) -Add: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics.
rubidium
parents: 7772
diff changeset
  3488
			return _openttd_newgrf_version;
12ef69de4e60 (svn r11330) -Add: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics.
rubidium
parents: 7772
diff changeset
  3489
		}
12ef69de4e60 (svn r11330) -Add: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics.
rubidium
parents: 7772
diff changeset
  3490
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3491
		default:
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3492
			/* GRF Parameter */
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3493
			if (param < 0x80) return _cur_grffile->param[param];
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3494
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3495
			/* In-game variable. */
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3496
			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
  3497
			return UINT_MAX;
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3498
	}
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3499
}
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3500
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3501
/* Action 0x06 */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3502
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
  3503
{
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3504
	/* <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
  3505
	 *
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3506
	 * 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
  3507
	 *                 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
  3508
	 * 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
  3509
	 *                 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
  3510
	 *                 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
  3511
	 *                 were specified.
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3512
	 * 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
  3513
	 *                 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
  3514
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3515
	/* Preload the next sprite */
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3516
	uint32 pos = FioGetPos();
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3517
	uint16 num = FioReadWord();
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3518
	uint8 type = FioReadByte();
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3519
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3520
	/* 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
  3521
	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
  3522
		_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
  3523
		FioReadBlock(_preload_sprite, num);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3524
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3525
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3526
	/* 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
  3527
	FioSeekTo(pos, SEEK_SET);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3528
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3529
	if (type != 0xFF) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3530
		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
  3531
		return;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3532
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3533
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3534
	/* 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
  3535
	buf++;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3536
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3537
	for (;;) {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3538
		uint i;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3539
		uint param_num;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3540
		uint param_size;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3541
		uint offset;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3542
		bool add_value;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3543
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3544
		/* 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
  3545
		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
  3546
		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
  3547
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3548
		/* 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
  3549
		 * 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
  3550
		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
  3551
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3552
		/* 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
  3553
		 * instead of replacing it. */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  3554
		add_value  = HasBit(param_size, 7);
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3555
		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
  3556
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3557
		/* 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
  3558
		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
  3559
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3560
		/* 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
  3561
		 * 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
  3562
		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
  3563
			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
  3564
			break;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3565
		}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3566
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3567
		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
  3568
6652
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3569
		bool carry = false;
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3570
		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
  3571
			uint32 value = GetParamVal(param_num + i / 4, NULL);
6652
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3572
			/* Reset carry flag for each iteration of the variable (only really
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3573
			 * matters if param_size is greater than 4) */
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3574
			if (i == 0) carry = false;
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3575
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3576
			if (add_value) {
6652
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3577
				uint new_value = _preload_sprite[offset + i] + GB(value, (i % 4) * 8, 8) + (carry ? 1 : 0);
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3578
				_preload_sprite[offset + i] = GB(new_value, 0, 8);
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3579
				/* Check if the addition overflowed */
ab91aefc7c0f (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 6649
diff changeset
  3580
				carry = new_value >= 256;
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3581
			} else {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3582
				_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
  3583
			}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3584
		}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3585
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3586
}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3587
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3588
/* Action 0x07 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3589
/* Action 0x09 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3590
static void SkipIf(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3591
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3592
	/* <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
  3593
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3594
	 * B param-num
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3595
	 * B param-size
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3596
	 * B condition-type
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3597
	 * V value
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3598
	 * B num-sprites */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3599
	/* 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
  3600
	uint32 cond_val = 0;
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3601
	uint32 mask = 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3602
	bool result;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3603
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
  3604
	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
  3605
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3606
	uint8 param     = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3607
	uint8 paramsize = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3608
	uint8 condtype  = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3609
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3610
	if (condtype < 2) {
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3611
		/* 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
  3612
		paramsize = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3613
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3614
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3615
	switch (paramsize) {
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3616
		case 4: cond_val = grf_load_dword(&buf); mask = 0xFFFFFFFF; break;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3617
		case 2: cond_val = grf_load_word(&buf);  mask = 0x0000FFFF; break;
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3618
		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
  3619
		default: break;
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3620
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3621
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3622
	if (param < 0x80 && _cur_grffile->param_end <= param) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3623
		grfmsg(7, "SkipIf: Param %d undefined, skipping test", param);
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3624
		return;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3625
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3626
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3627
	uint32 param_val = GetParamVal(param, &cond_val);
3806
cf2afd9440a1 (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3628
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3629
	grfmsg(7, "SkipIf: 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
  3630
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3631
	/*
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3632
	 * Parameter (variable in specs) 0x88 can only have GRF ID checking
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3633
	 * conditions, except conditions 0x0B and 0x0C (cargo availability)
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3634
	 * as those ignore the parameter. So, when the condition type is
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3635
	 * either of those, the specific variable 0x88 code is skipped, so
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3636
	 * the "general" code for the cargo availability conditions kicks in.
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3637
	 */
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3638
	if (param == 0x88 && condtype != 0x0B && condtype != 0x0C) {
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
  3639
		/* 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
  3640
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
  3641
		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
  3642
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
  3643
		if (condtype != 10 && c == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3644
			grfmsg(7, "SkipIf: GRFID 0x%08X unknown, skipping test", BSWAP32(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
  3645
			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
  3646
		}
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
  3647
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
  3648
		switch (condtype) {
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3649
			/* Tests 0x06 to 0x0A are only for param 0x88, GRFID checks */
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3650
			case 0x06: // Is GRFID active?
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3651
				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
  3652
				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
  3653
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3654
			case 0x07: // Is GRFID non-active?
6229
695400602ab0 (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6193
diff changeset
  3655
				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
  3656
				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
  3657
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3658
			case 0x08: // 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
  3659
				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
  3660
				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
  3661
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3662
			case 0x09: // 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
  3663
				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
  3664
				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
  3665
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3666
			case 0x0A: // 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
  3667
				/* 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
  3668
				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
  3669
				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
  3670
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3671
			default: grfmsg(1, "SkipIf: Unsupported GRF condition type %02X. 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
  3672
		}
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
  3673
	} 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
  3674
		/* 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
  3675
		switch (condtype) {
7808
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3676
			case 0x00: result = !!(param_val & (1 << cond_val));
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3677
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3678
			case 0x01: result = !(param_val & (1 << cond_val));
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3679
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3680
			case 0x02: result = (param_val & mask) == cond_val;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3681
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3682
			case 0x03: result = (param_val & mask) != cond_val;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3683
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3684
			case 0x04: result = (param_val & mask) < cond_val;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3685
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3686
			case 0x05: result = (param_val & mask) > cond_val;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3687
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3688
			case 0x0B: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3689
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3690
			case 0x0C: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3691
				break;
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3692
07640f0ae961 (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 7805
diff changeset
  3693
			default: grfmsg(1, "SkipIf: Unsupported condition type %02X. 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
  3694
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3695
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3696
1607
fd027776f222 (svn r2111) So, result is bool therefore no need for this horrible == 0 thing.
pasky
parents: 1606
diff changeset
  3697
	if (!result) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3698
		grfmsg(2, "SkipIf: Not skipping sprites, test was false");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3699
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3700
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3701
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3702
	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
  3703
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
  3704
	/* 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
  3705
	 * 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
  3706
	 * 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
  3707
	 * label in the file is used. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3708
	GRFLabel *choice = NULL;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3709
	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
  3710
		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
  3711
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
  3712
		/* 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
  3713
		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
  3714
		/* 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
  3715
		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
  3716
			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
  3717
			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
  3718
		}
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
  3719
	}
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
  3720
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
  3721
	if (choice != NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3722
		grfmsg(2, "SkipIf: 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
  3723
		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
  3724
		_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
  3725
		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
  3726
	}
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
  3727
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3728
	grfmsg(2, "SkipIf: Skipping %d sprites, test was true", numsprites);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3729
	_skip_sprites = numsprites;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3730
	if (_skip_sprites == 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3731
		/* 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
  3732
		 * we use -1 to indicate that all further
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3733
		 * sprites should be skipped. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3734
		_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
  3735
aafc68ecee06 (svn r8831) -Feature: If an action 7/9 leads to skipping the rest of the file, disable the
maedhros
parents: 6095
diff changeset
  3736
		/* If an action 8 hasn't been encountered yet, disable the grf. */
8089
35b1c3d3ec66 (svn r11650) -Fix: 'initialised' NewGRFs could still be deactivated in the later 'activation' pass.
rubidium
parents: 8084
diff changeset
  3737
		if (_cur_grfconfig->status != GCS_ACTIVATED) {
6925
f73d75a1f7da (svn r10178) -Fix: Don't deactivate newgrf files when skipping the rest of the file during the initialisation stage.
maedhros
parents: 6914
diff changeset
  3738
			_cur_grfconfig->status = GCS_DISABLED;
f73d75a1f7da (svn r10178) -Fix: Don't deactivate newgrf files when skipping the rest of the file during the initialisation stage.
maedhros
parents: 6914
diff changeset
  3739
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3740
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3741
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3742
5317
a41d1389c092 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3743
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
  3744
/* 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
  3745
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
  3746
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3747
	if (!check_length(len, 8, "Info")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3748
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3749
	grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3750
	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
  3751
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3752
	_cur_grfconfig->grfid = grfid;
5317
a41d1389c092 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3753
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
  3754
	/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  3755
	if (GB(grfid, 24, 8) == 0xFF) SetBit(_cur_grfconfig->flags, GCF_SYSTEM);
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
  3756
5317
a41d1389c092 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3757
	len -= 6;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3758
	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
  3759
	_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
  3760
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
  3761
	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
  3762
	if (len > 0) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3763
		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
  3764
		_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
  3765
	}
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
  3766
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
  3767
	/* 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
  3768
	_skip_sprites = -1;
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3769
}
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3770
3640
afe6a5032f6a (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3771
/* Action 0x08 */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3772
static void GRFInfo(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3773
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3774
	/* <08> <version> <grf-id> <name> <info>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3775
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3776
	 * B version       newgrf version, currently 06
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3777
	 * 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
  3778
	 * S name          name of this .grf set
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3779
	 * 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
  3780
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3781
	if (!check_length(len, 8, "GRFInfo")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3782
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3783
	uint8 version    = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3784
	uint32 grfid     = grf_load_dword(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3785
	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
  3786
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3787
	_cur_grffile->grfid = grfid;
3640
afe6a5032f6a (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3788
	_cur_grffile->grf_version = version;
6806
c0faecfdc59f (svn r10045) -Codechange: Process Action 8 during GLS_RESERVATION to allow Action 7/Action 9s to work properly
peter1138
parents: 6805
diff changeset
  3789
	_cur_grfconfig->status = _cur_stage < GLS_RESERVE ? GCS_INITIALISED : GCS_ACTIVATED;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3790
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
  3791
	/* Do swap the GRFID for displaying purposes since people expect that */
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  3792
	DEBUG(grf, 1, "GRFInfo: 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
  3793
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3794
3640
afe6a5032f6a (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3795
/* Action 0x0A */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3796
static void SpriteReplace(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3797
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3798
	/* <0A> <num-sets> <set1> [<set2> ...]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3799
	 * <set>: <num-sprites> <first-sprite>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3800
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3801
	 * 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
  3802
	 * Each set:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3803
	 * 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
  3804
	 * W first-sprite  First sprite number to replace */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3805
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3806
	buf++; // skip action byte
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3807
	uint8 num_sets = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3808
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3809
	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
  3810
		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
  3811
		uint16 first_sprite = grf_load_word(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3812
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  3813
		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
  3814
			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
  3815
		);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3816
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3817
		for (uint j = 0; j < num_sprites; j++) {
8183
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3818
			int load_index = first_sprite + j;
7953
db4cd9ef0efc (svn r11509) -Fix: off-by-one error in some sprite numbers; increase sprite number counter before loading the next sprite instead of after doing so.
rubidium
parents: 7941
diff changeset
  3819
			_nfo_line++;
8183
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3820
			LoadNextSprite(load_index, _file_index, _nfo_line); // XXX
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3821
8185
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3822
			/*  Shore sprites now located at different addresses.
8183
2340115d8a6b (svn r11746) -Fix(r11727): Make sure that action 0A does follow the same new ordering of shore sprites. It was not considered in the missing shore patch
belugas
parents: 8165
diff changeset
  3823
			 * So apply the required displacements */
8185
c1b24f4cd72e (svn r11748) -Codechange: Remove magic numbers introduced on r11746 and r11727
belugas
parents: 8183
diff changeset
  3824
			if (IsInsideMM(load_index, SPR_ORIGINALSHORE_START, SPR_ORIGINALSHORE_END + 1)) TranslateShoreSprites(load_index);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3825
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3826
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3827
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3828
6529
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3829
/* Action 0x0A (SKIP) */
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3830
static void SkipActA(byte *buf, int len)
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3831
{
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3832
	buf++;
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3833
	uint8 num_sets = grf_load_byte(&buf);
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3834
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3835
	for (uint i = 0; i < num_sets; i++) {
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3836
		/* Skip the sprites this replaces */
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3837
		_skip_sprites += grf_load_byte(&buf);
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3838
		/* But ignore where they go */
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3839
		grf_load_word(&buf);
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3840
	}
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3841
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3842
	grfmsg(3, "SkipActA: Skipping %d sprites", _skip_sprites);
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3843
}
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  3844
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  3845
/* 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
  3846
static void GRFLoadError(byte *buf, int len)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3847
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3848
	/* <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
  3849
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3850
	 * B severity      00: notice, contine loading grf file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3851
	 *                 01: warning, continue loading grf file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3852
	 *                 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
  3853
	 *                     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
  3854
	 *                 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
  3855
	 *                     the future (only when restarting the patch)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3856
	 * 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
  3857
	 * B message-id    message to show, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3858
	 * 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
  3859
	 *                 not present for built-in messages.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3860
	 * 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
  3861
	 * 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
  3862
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3863
	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
  3864
		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
  3865
		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
  3866
		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
  3867
		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
  3868
		STR_NEWGRF_ERROR_LOAD_BEFORE,
7780
12ef69de4e60 (svn r11330) -Add: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics.
rubidium
parents: 7772
diff changeset
  3869
		STR_NEWGRF_ERROR_LOAD_AFTER,
12ef69de4e60 (svn r11330) -Add: OTTD version checking for NewGRFs. This allows NewGRFs to do something different for different versions of OpenTTD, like disabling it for too low versions or loading different graphics.
rubidium
parents: 7772
diff changeset
  3870
		STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER,
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3871
	};
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  3872
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
  3873
	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
  3874
		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
  3875
		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
  3876
		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
  3877
		STR_NEWGRF_ERROR_MSG_FATAL
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  3878
	};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3879
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
  3880
	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
  3881
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3882
	/* 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
  3883
	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
  3884
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  3885
	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
  3886
	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
  3887
	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
  3888
	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
  3889
	len -= 4;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3890
6873
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  3891
	/* Skip the error if it isn't valid for the current language. */
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  3892
	if (!CheckGrfLangID(lang, _cur_grffile->grf_version)) return;
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  3893
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3894
	/* 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
  3895
	 * is set. */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  3896
	if (!HasBit(severity, 7) && _cur_stage == GLS_INIT) {
6805
3a516a89ddb4 (svn r10044) -Fix: Minor NewGRF debug message fixes, and skip sprites of an unsupported Action 5 feature.
peter1138
parents: 6781
diff changeset
  3897
		grfmsg(7, "GRFLoadError: Skipping non-fatal GRFLoadError in stage %d", _cur_stage);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3898
		return;
3588
69817310ddf8 (svn r4474) - NewGRF: Skip non-fatal errors when not in stage 2.
peter1138
parents: 3577
diff changeset
  3899
	}
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  3900
	ClrBit(severity, 7);
6095
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3901
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3902
	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
  3903
		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
  3904
		severity = 2;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3905
	} 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
  3906
		/* 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
  3907
		 * 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
  3908
		_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
  3909
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3910
		_skip_sprites = -1;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3911
	}
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3912
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3913
	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
  3914
		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
  3915
		return;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3916
	}
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3917
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3918
	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
  3919
		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
  3920
		return;
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3921
	}
d02d52f58ba6 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6091
diff changeset
  3922
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
  3923
	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
  3924
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3925
	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
  3926
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3927
	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
  3928
		/* 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
  3929
		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
  3930
		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
  3931
6873
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  3932
		error->custom_message = TranslateTTDPatchCodes(message);
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
  3933
	} 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
  3934
		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
  3935
	}
d38163ddfef9 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6096
diff changeset
  3936
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
  3937
	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
  3938
		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
  3939
		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
  3940
6873
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  3941
		error->data = TranslateTTDPatchCodes(data);
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
  3942
	}
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3943
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3944
	/* 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
  3945
	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
  3946
	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
  3947
		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
  3948
		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
  3949
	}
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3950
	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
  3951
cd42df0c1f0f (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6128
diff changeset
  3952
	_cur_grfconfig->error = error;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3953
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3954
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  3955
/* Action 0x0C */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3956
static void GRFComment(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3957
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3958
	/* <0C> [<ignored...>]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3959
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3960
	 * 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
  3961
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
  3962
	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
  3963
6107
2a0a919dc46a (svn r8843) -Fix
tron
parents: 6103
diff changeset
  3964
	int text_len = len - 1;
2a0a919dc46a (svn r8843) -Fix
tron
parents: 6103
diff changeset
  3965
	const char *text = (const char*)(buf + 1);
2a0a919dc46a (svn r8843) -Fix
tron
parents: 6103
diff changeset
  3966
	grfmsg(2, "GRFComment: %.*s", text_len, text);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3967
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  3968
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
  3969
/* 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
  3970
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
  3971
{
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
  3972
	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
  3973
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  3974
	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
  3975
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
  3976
	/* 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
  3977
	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
  3978
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
  3979
	/* 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
  3980
	 * 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
  3981
	 * 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
  3982
	 * 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
  3983
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  3984
	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
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
  3985
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
  3986
	/* 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
  3987
	_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
  3988
}
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
  3989
6515
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3990
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3991
static uint32 GetPatchVariable(uint8 param)
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3992
{
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3993
	switch (param) {
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3994
		/* start year - 1920 */
6579
3b1c0599dace (svn r9793) -Fix (r9701): Action D 'TTDPatch variable' 0x0B should be the starting year, not the current year.
maedhros
parents: 6576
diff changeset
  3995
		case 0x0B: return max(_patches.starting_year, ORIGINAL_BASE_YEAR) - ORIGINAL_BASE_YEAR;
6515
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3996
		/* freight trains weight factor */
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3997
		case 0x0E: return _patches.freight_trains;
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3998
		/* empty wagon speed increase */
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  3999
		case 0x0F: return 0;
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4000
		/* plane speed factor */
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4001
		case 0x10: return 4;
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4002
		/* 2CC colormap base sprite */
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4003
		case 0x11: return SPR_2CCMAP_BASE;
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4004
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4005
		default:
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4006
			grfmsg(2, "ParamSet: Unknown Patch variable 0x%02X.", param);
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4007
			return 0;
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4008
	}
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4009
}
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4010
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4011
6781
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4012
static uint32 PerformGRM(uint32 *grm, uint16 num_ids, uint16 count, uint8 op, uint8 target, const char *type)
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4013
{
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4014
	uint start = 0;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4015
	uint size  = 0;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4016
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4017
	if (op == 6) {
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4018
		/* Return GRFID of set that reserved ID */
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4019
		return grm[_cur_grffile->param[target]];
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4020
	}
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4021
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4022
	/* With an operation of 2 or 3, we want to reserve a specific block of IDs */
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4023
	if (op == 2 || op == 3) start = _cur_grffile->param[target];
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4024
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4025
	for (uint i = start; i < num_ids; i++) {
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4026
		if (grm[i] == 0) {
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4027
			size++;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4028
		} else {
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4029
			if (op == 2 || op == 3) break;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4030
			start = i + 1;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4031
			size = 0;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4032
		}
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4033
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4034
		if (size == count) break;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4035
	}
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4036
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4037
	if (size == count) {
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4038
		/* Got the slot... */
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4039
		if (op == 0 || op == 3) {
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4040
			grfmsg(2, "ParamSet: GRM: Reserving %d %s at %d", count, type, start);
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4041
			for (uint i = 0; i < count; i++) grm[start + i] = _cur_grffile->grfid;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4042
		}
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4043
		return start;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4044
	}
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4045
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4046
	/* Unable to allocate */
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4047
	if (op != 4 && op != 5) {
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4048
		/* Deactivate GRF */
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4049
		grfmsg(0, "ParamSet: GRM: Unable to allocate %d %s, deactivating", count, type);
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4050
		_cur_grfconfig->status = GCS_DISABLED;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4051
		_skip_sprites = -1;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4052
		return UINT_MAX;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4053
	}
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4054
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4055
	grfmsg(1, "ParamSet: GRM: Unable to allocate %d %s", count, type);
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4056
	return UINT_MAX;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4057
}
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4058
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4059
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4060
/* Action 0x0D */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4061
static void ParamSet(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4062
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4063
	/* <0D> <target> <operation> <source1> <source2> [<data>]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4064
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4065
	 * B target        parameter number where result is stored
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4066
	 * B operation     operation to perform, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4067
	 * B source1       first source operand
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4068
	 * B source2       second source operand
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4069
	 * 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
  4070
	 *                 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
  4071
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4072
	 * Operations
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4073
	 * 00      Set parameter equal to source1
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4074
	 * 01      Addition, source1 + source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4075
	 * 02      Subtraction, source1 - source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4076
	 * 03      Unsigned multiplication, source1 * source2 (both unsigned)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4077
	 * 04      Signed multiplication, source1 * source2 (both signed)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4078
	 * 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
  4079
	 *         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
  4080
	 *         negative, source1 is unsigned)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4081
	 * 06      Signed bit shift, source1 by source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4082
	 *         (source2 like in 05, and source1 as well)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4083
	 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4084
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
  4085
	if (!check_length(len, 5, "ParamSet")) return;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4086
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4087
	uint8 target = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4088
	uint8 oper   = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4089
	uint32 src1  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4090
	uint32 src2  = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4091
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4092
	uint32 data = 0;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4093
	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
  4094
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4095
	/* 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
  4096
	 * 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
  4097
	 * defined if any of the following applies:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4098
	 * - 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
  4099
	 * - 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
  4100
	 *   an earlier action D */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  4101
	if (HasBit(oper, 7)) {
3807
736ea84b3cf4 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  4102
		if (target < 0x80 && target < _cur_grffile->param_end) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  4103
			grfmsg(7, "ParamSet: Param %u already defined, skipping", target);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4104
			return;
3807
736ea84b3cf4 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  4105
		}
736ea84b3cf4 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  4106
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4107
		oper = GB(oper, 0, 7);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4108
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4109
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
  4110
	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
  4111
		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
  4112
			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
  4113
				/* Patch variables */
6515
df4dba70cd68 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 6507
diff changeset
  4114
				src1 = GetPatchVariable(src1);
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
  4115
			} 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
  4116
				/* 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
  4117
				if (_cur_stage != GLS_ACTIVATION) {
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4118
					/* Ignore GRM during initialization */
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4119
					src1 = 0;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4120
				} else {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4121
					uint8  op      = src1;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4122
					uint8  feature = GB(data, 8, 8);
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4123
					uint16 count   = GB(data, 16, 16);
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4124
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4125
					switch (feature) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4126
						case 0x00: // Trains
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4127
						case 0x01: // Road Vehicles
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4128
						case 0x02: // Ships
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4129
						case 0x03: // Aircraft
6781
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4130
							src1 = PerformGRM(&_grm_engines[_vehshifts[feature]], _vehcounts[feature], count, op, target, "vehicles");
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4131
							if (_skip_sprites == -1) return;
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4132
							break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4133
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4134
						case 0x08: // General sprites
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4135
							switch (op) {
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4136
								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
  4137
									/* 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
  4138
									if (_cur_spriteid + count >= 16384) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  4139
										grfmsg(0, "ParamSet: 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
  4140
										_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
  4141
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
  4142
										_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
  4143
										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
  4144
									}
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
  4145
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4146
									/* '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
  4147
									src1 = _cur_spriteid;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4148
									_cur_spriteid += count;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4149
									break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4150
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4151
								case 1:
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4152
									src1 = _cur_spriteid;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4153
									break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4154
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4155
								default:
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  4156
									grfmsg(1, "ParamSet: 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
  4157
									return;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4158
							}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4159
							break;
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4160
6781
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4161
						case 0x0B: // Cargo
7690
293efb2185a8 (svn r11224) -Fix: GRM for cargos has registration entries for both cargo IDs and cargo bitmasks, not only cargo IDs.
rubidium
parents: 7674
diff changeset
  4162
							/* There are two ranges: one for cargo IDs and one for cargo bitmasks */
293efb2185a8 (svn r11224) -Fix: GRM for cargos has registration entries for both cargo IDs and cargo bitmasks, not only cargo IDs.
rubidium
parents: 7674
diff changeset
  4163
							src1 = PerformGRM(_grm_cargos, NUM_CARGO * 2, count, op, target, "cargos");
6781
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4164
							if (_skip_sprites == -1) return;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4165
							break;
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  4166
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  4167
						default: grfmsg(1, "ParamSet: 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
  4168
					}
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4169
				}
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
  4170
			}
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
  4171
		} 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
  4172
			/* 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
  4173
			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
  4174
			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
  4175
				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
  4176
			} 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
  4177
				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
  4178
			}
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
  4179
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4180
	} 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
  4181
		/* 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
  4182
		 * 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
  4183
		 * 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
  4184
		 * 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
  4185
		 * of 0 is used instead.  */
3811
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  4186
		src1 = (src1 == 0xFF) ? data : GetParamVal(src1, NULL);
8f2b44f6b709 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  4187
		src2 = (src2 == 0xFF) ? data : GetParamVal(src2, NULL);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4188
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4189
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4190
	/* 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
  4191
	 * 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
  4192
	 * 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
  4193
	 * 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
  4194
	 * instead. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4195
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4196
	uint32 res;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4197
	switch (oper) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4198
		case 0x00:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4199
			res = src1;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4200
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4201
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4202
		case 0x01:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4203
			res = src1 + src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4204
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4205
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4206
		case 0x02:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4207
			res = src1 - src2;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4208
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4209
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4210
		case 0x03:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4211
			res = src1 * src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4212
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4213
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4214
		case 0x04:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4215
			res = (int32)src1 * (int32)src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4216
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4217
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4218
		case 0x05:
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4219
			if ((int32)src2 < 0) {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4220
				res = src1 >> -(int32)src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4221
			} else {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4222
				res = src1 << src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4223
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4224
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4225
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4226
		case 0x06:
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4227
			if ((int32)src2 < 0) {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4228
				res = (int32)src1 >> -(int32)src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4229
			} else {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4230
				res = (int32)src1 << src2;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4231
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4232
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4233
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4234
		case 0x07: // Bitwise AND
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4235
			res = src1 & src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4236
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4237
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4238
		case 0x08: // Bitwise OR
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4239
			res = src1 | src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4240
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4241
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4242
		case 0x09: // Unsigned division
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4243
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4244
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4245
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4246
				res = src1 / src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4247
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4248
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4249
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4250
		case 0x0A: // Signed divison
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4251
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4252
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4253
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4254
				res = (int32)src1 / (int32)src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4255
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4256
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4257
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4258
		case 0x0B: // Unsigned modulo
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4259
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4260
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4261
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4262
				res = src1 % src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4263
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4264
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4265
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4266
		case 0x0C: // Signed modulo
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4267
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4268
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4269
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4270
				res = (int32)src1 % (int32)src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4271
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4272
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4273
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4274
		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
  4275
	}
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4276
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4277
	switch (target) {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4278
		case 0x8E: // Y-Offset for train sprites
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4279
			_traininfo_vehicle_pitch = res;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4280
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4281
7730
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4282
		case 0x8F: // Rail track type cost factors
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4283
			_railtype_cost_multiplier[0] = GB(res, 0, 8);
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4284
			if (_patches.disable_elrails) {
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4285
				_railtype_cost_multiplier[1] = GB(res, 0, 8);
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4286
				_railtype_cost_multiplier[2] = GB(res, 8, 8);
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4287
			} else {
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4288
				_railtype_cost_multiplier[1] = GB(res, 8, 8);
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4289
				_railtype_cost_multiplier[2] = GB(res, 16, 8);
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4290
			}
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4291
			_railtype_cost_multiplier[3] = GB(res, 16, 8);
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4292
			break;
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4293
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4294
		/* @todo implement */
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4295
		case 0x93: // Tile refresh offset to left
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4296
		case 0x94: // Tile refresh offset to right
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4297
		case 0x95: // Tile refresh offset upwards
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4298
		case 0x96: // Tile refresh offset downwards
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4299
		case 0x97: // Snow line height
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4300
		case 0x99: // Global ID offset
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4301
			grfmsg(7, "ParamSet: Skipping unimplemented target 0x%02X", target);
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4302
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4303
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4304
		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
  4305
			_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
  4306
			/* Set train list engine width */
6541
dfa5165a5ab7 (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6533
diff changeset
  4307
			_traininfo_vehicle_width = HasGrfMiscBit(GMB_TRAIN_WIDTH_32_PIXELS) ? 32 : 29;
3814
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  4308
			break;
5fb36810d6ad (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  4309
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4310
		default:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4311
			if (target < 0x80) {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4312
				_cur_grffile->param[target] = res;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4313
				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
  4314
			} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4315
				grfmsg(7, "ParamSet: Skipping unknown target 0x%02X", target);
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4316
			}
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4317
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4318
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4319
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4320
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
  4321
/* 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
  4322
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
  4323
{
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
  4324
	/* <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
  4325
	 *
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
  4326
	 * 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
  4327
	 * 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
  4328
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4329
	if (!check_length(len, 2, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4330
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4331
	uint8 num = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4332
	if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4333
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4334
	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
  4335
		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
  4336
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
  4337
		/* 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
  4338
		if (grfid != _cur_grfconfig->grfid) {
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  4339
			SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
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
  4340
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
  4341
			/* 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
  4342
			_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
  4343
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
  4344
			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
  4345
		}
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
  4346
	}
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
  4347
}
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
  4348
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  4349
/* Action 0x0E */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4350
static void GRFInhibit(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4351
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4352
	/* <0E> <num> <grfids...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4353
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4354
	 * B num           Number of GRFIDs that follow
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4355
	 * D grfids        GRFIDs of the files to deactivate */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4356
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4357
	if (!check_length(len, 2, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4358
	buf++;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4359
	uint8 num = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4360
	if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4361
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4362
	for (uint i = 0; i < num; i++) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4363
		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
  4364
		GRFConfig *file = GetGRFConfig(grfid);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4365
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4366
		/* 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
  4367
		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
  4368
			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
  4369
			file->status = GCS_DISABLED;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4370
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4371
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4372
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4373
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4374
/* Action 0x0F */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4375
static void FeatureTownName(byte *buf, int len)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4376
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4377
	/* <0F> <id> <style-name> <num-parts> <parts>
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4378
	 *
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4379
	 * B id          ID of this definition in bottom 7 bits (final definition if bit 7 set)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4380
	 * V style-name  Name of the style (only for final definition)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4381
	 * B num-parts   Number of parts in this definition
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4382
	 * V parts       The parts */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4383
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4384
	if (!check_length(len, 1, "FeatureTownName: definition ID")) return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4385
	buf++; len--;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4386
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4387
	uint32 grfid = _cur_grffile->grfid;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4388
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4389
	GRFTownName *townname = AddGRFTownName(grfid);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4390
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4391
	byte id = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4392
	len--;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4393
	grfmsg(6, "FeatureTownName: definition 0x%02X", id & 0x7F);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4394
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  4395
	if (HasBit(id, 7)) {
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4396
		/* Final definition */
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  4397
		ClrBit(id, 7);
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4398
		bool new_scheme = _cur_grffile->grf_version >= 7;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4399
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4400
		if (!check_length(len, 1, "FeatureTownName: lang_id")) return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4401
		byte lang = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4402
		len--;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4403
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4404
		byte nb_gen = townname->nb_gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4405
		do {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  4406
			ClrBit(lang, 7);
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4407
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4408
			if (!check_length(len, 1, "FeatureTownName: style name")) return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4409
			const char *name = grf_load_string(&buf, len);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4410
			len -= strlen(name) + 1;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4411
			grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, TranslateTTDPatchCodes(name));
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4412
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4413
			townname->name[nb_gen] = AddGRFString(grfid, id, lang, new_scheme, name, STR_UNDEFINED);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4414
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4415
			if (!check_length(len, 1, "FeatureTownName: lang_id")) return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4416
			lang = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4417
			len--;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4418
		} while (lang != 0);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4419
		townname->id[nb_gen] = id;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4420
		townname->nb_gen++;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4421
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4422
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4423
	if (!check_length(len, 1, "FeatureTownName: number of parts")) return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4424
	byte nb = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4425
	len--;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4426
	grfmsg(6, "FeatureTownName: %d parts", nb, nb);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4427
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4428
	townname->nbparts[id] = nb;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4429
	townname->partlist[id] = CallocT<NamePartList>(nb);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4430
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4431
	for (int i = 0; i < nb; i++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4432
		if (!check_length(len, 3, "FeatureTownName: parts header")) return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4433
		byte nbtext =  grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4434
		townname->partlist[id][i].bitstart  = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4435
		townname->partlist[id][i].bitcount  = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4436
		townname->partlist[id][i].maxprob   = 0;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4437
		townname->partlist[id][i].partcount = nbtext;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4438
		townname->partlist[id][i].parts     = CallocT<NamePart>(nbtext);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4439
		len -= 3;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4440
		grfmsg(6, "FeatureTownName: part %d contains %d texts and will use GB(seed, %d, %d)", i, nbtext, townname->partlist[id][i].bitstart, townname->partlist[id][i].bitcount);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4441
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4442
		for (int j = 0; j < nbtext; j++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4443
			if (!check_length(len, 2, "FeatureTownName: part")) return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4444
			byte prob = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4445
			len--;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4446
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  4447
			if (HasBit(prob, 7)) {
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4448
				byte ref_id = grf_load_byte(&buf);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4449
				len--;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4450
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4451
				if (townname->nbparts[ref_id] == 0) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4452
					grfmsg(0, "FeatureTownName: definition 0x%02X doesn't exist, deactivating", ref_id);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4453
					DelGRFTownName(grfid);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4454
					_cur_grfconfig->status = GCS_DISABLED;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4455
					_skip_sprites = -1;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4456
					return;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4457
				}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4458
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4459
				grfmsg(6, "FeatureTownName: part %d, text %d, uses intermediate definition 0x%02X (with probability %d)", i, j, ref_id, prob & 0x7F);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4460
				townname->partlist[id][i].parts[j].data.id = ref_id;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4461
			} else {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4462
				const char *text = grf_load_string(&buf, len);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4463
				len -= strlen(text) + 1;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4464
				townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(text);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4465
				grfmsg(6, "FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[id][i].parts[j].data.text, prob);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4466
			}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4467
			townname->partlist[id][i].parts[j].prob = prob;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4468
			townname->partlist[id][i].maxprob += GB(prob, 0, 7);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4469
		}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4470
		grfmsg(6, "FeatureTownName: part %d, total probability %d", i, townname->partlist[id][i].maxprob);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4471
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4472
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4473
3715
b696b84baf30 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  4474
/* 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
  4475
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
  4476
{
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
  4477
	/* <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
  4478
	 *
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
  4479
	 * 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
  4480
	 * 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
  4481
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
  4482
	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
  4483
	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
  4484
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4485
	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
  4486
	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
  4487
	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
  4488
	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
  4489
	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
  4490
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
  4491
	/* 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
  4492
	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
  4493
		_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
  4494
	} 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
  4495
		/* 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
  4496
		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
  4497
		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
  4498
		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
  4499
	}
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
  4500
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4501
	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
  4502
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4503
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4504
/* Action 0x11 */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4505
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
  4506
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4507
	/* <11> <num>
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4508
	 *
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4509
	 * 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
  4510
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
  4511
	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
  4512
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4513
	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
  4514
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4515
	_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
  4516
	_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
  4517
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4518
	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
  4519
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4520
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4521
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
  4522
{
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4523
	const GRFFile *file;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4524
	FileEntry *se = AllocateFileEntry();
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4525
	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
  4526
	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
  4527
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4528
	file = GetFileByGRFID(grfid);
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4529
	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
  4530
		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
  4531
		return;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4532
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4533
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4534
	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
  4535
		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
  4536
		return;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4537
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4538
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4539
	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
  4540
5024
5e98bf731469 (svn r7065) Use simple assignment instead of memcpy()
tron
parents: 5011
diff changeset
  4541
	*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
  4542
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4543
	/* 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
  4544
	se->volume   = 128;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4545
	se->priority = 0;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4546
}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4547
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4548
/* 'Action 0xFE' */
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4549
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
  4550
{
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4551
	if (_grf_data_blocks == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4552
		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
  4553
		return;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4554
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4555
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4556
	buf++;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4557
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4558
	_grf_data_blocks--;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4559
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4560
	/* 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
  4561
	 * 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
  4562
	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
  4563
		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
  4564
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4565
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4566
	switch (_grf_data_type) {
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4567
		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
  4568
		default: NOT_REACHED(); break;
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4569
	}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4570
}
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4571
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4572
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
  4573
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4574
	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
  4575
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4576
	/* 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
  4577
	 * so that the indices used elsewhere are still correct. */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4578
	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
  4579
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  4580
	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
  4581
		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
  4582
		return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4583
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4584
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4585
	/* 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
  4586
	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
  4587
5379
929378a0014f (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5369
diff changeset
  4588
	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
  4589
		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
  4590
		return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4591
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4592
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4593
	for (;;) {
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4594
		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
  4595
		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
  4596
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4597
		switch (tag) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4598
			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
  4599
				/* 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
  4600
				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
  4601
					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
  4602
					return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4603
				}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4604
				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
  4605
				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
  4606
				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
  4607
				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
  4608
				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
  4609
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4610
				/* 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
  4611
				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
  4612
				break;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4613
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4614
			case 'atad': // 'data'
7570
5d5d9b6af0ef (svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents: 7459
diff changeset
  4615
				se->file_size   = size;
5d5d9b6af0ef (svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents: 7459
diff changeset
  4616
				se->file_offset = FioGetPos() - (len - (buf - buf_start)) + 1;
5d5d9b6af0ef (svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents: 7459
diff changeset
  4617
				se->file_slot   = _file_index;
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4618
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4619
				/* 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
  4620
				se->volume = 0x80;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4621
				se->priority = 0;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4622
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4623
				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
  4624
				return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4625
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4626
			default:
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4627
				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
  4628
				return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4629
		}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4630
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4631
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4632
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
  4633
/* 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
  4634
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
  4635
{
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
  4636
	/* <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
  4637
	 *
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
  4638
	 * 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
  4639
	 * 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
  4640
	 * 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
  4641
	 * 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
  4642
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
  4643
	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
  4644
	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
  4645
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4646
	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
  4647
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
  4648
	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
  4649
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4650
	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
  4651
		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
  4652
		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
  4653
		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
  4654
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4655
		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
  4656
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4657
		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
  4658
			SetUnicodeGlyph(size, base_char + c, _cur_spriteid);
7953
db4cd9ef0efc (svn r11509) -Fix: off-by-one error in some sprite numbers; increase sprite number counter before loading the next sprite instead of after doing so.
rubidium
parents: 7941
diff changeset
  4659
			_nfo_line++;
6908
6b1324d7a2c9 (svn r10157) -Fix: use as indentified for PNGs, the place of the image as it was in the grf, not the internal SpriteID
truelight
parents: 6894
diff changeset
  4660
			LoadNextSprite(_cur_spriteid++, _file_index, _nfo_line);
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
  4661
		}
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
  4662
	}
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
  4663
}
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
  4664
6234
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4665
/* Action 0x13 */
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4666
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
  4667
{
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4668
	/* <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
  4669
	 *
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4670
	 * 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
  4671
	 * 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
  4672
	 * 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
  4673
	 * 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
  4674
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4675
	buf++; len--;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4676
	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
  4677
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4678
	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
  4679
	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
  4680
	if (c == NULL || (c->status != GCS_INITIALISED && c->status != GCS_ACTIVATED)) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  4681
		grfmsg(7, "TranslateGRFStrings: GRFID 0x%08x unknown, skipping action 13", BSWAP32(grfid));
6234
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4682
		return;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4683
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4684
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4685
	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
  4686
		/* 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
  4687
		 * and disable this file. */
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4688
		GRFError *error = CallocT<GRFError>(1);
6873
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  4689
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  4690
		char tmp[256];
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  4691
		GetString(tmp, STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE, lastof(tmp));
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  4692
		error->data = strdup(tmp);
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  4693
6234
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4694
		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
  4695
		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
  4696
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4697
		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
  4698
		_cur_grfconfig->error = error;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4699
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4700
		_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
  4701
		_skip_sprites = -1;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4702
		return;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4703
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4704
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4705
	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
  4706
	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
  4707
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4708
	if (!((first_id >= 0xD000 && first_id + num_strings <= 0xD3FF) || (first_id >= 0xDC00 && first_id + num_strings <= 0xDCFF))) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  4709
		grfmsg(7, "TranslateGRFStrings: Attempting to set out-of-range string IDs in action 13 (first: 0x%4X, number: 0x%2X)", first_id, num_strings);
6234
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4710
		return;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4711
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4712
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4713
	len -= 7;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4714
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4715
	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
  4716
		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
  4717
		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
  4718
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4719
		len -= (int)string_length;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4720
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4721
		if (string_length == 1) {
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4722
			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
  4723
			continue;
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4724
		}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4725
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4726
		/* 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
  4727
		 * 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
  4728
		 * 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
  4729
		 * 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
  4730
		 * 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
  4731
		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
  4732
	}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4733
}
023a25b334b6 (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6229
diff changeset
  4734
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4735
/* 'Action 0xFF' */
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4736
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
  4737
{
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4738
	if (_grf_data_blocks == 0) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4739
		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
  4740
		return;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4741
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4742
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4743
	buf++;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4744
	uint8 name_len = grf_load_byte(&buf);
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4745
	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
  4746
	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
  4747
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  4748
	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
  4749
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4750
	_grf_data_blocks--;
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4751
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4752
	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
  4753
		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
  4754
		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
  4755
	}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4756
}
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4757
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
  4758
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
  4759
/* 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
  4760
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
  4761
{
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  4762
	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
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
  4763
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
  4764
	/* 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
  4765
	_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
  4766
}
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
  4767
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
  4768
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4769
static void InitializeGRFSpecial()
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4770
{
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4771
	_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
  4772
	                   |                                        (1 << 0x0D)  // newairports
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4773
	                   |                                        (1 << 0x0E)  // largestations
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4774
	                   |           ((_patches.longbridges ? 1 : 0) << 0x0F)  // longbridges
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4775
	                   |                                        (0 << 0x10)  // loadtime
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4776
	                   |                                        (1 << 0x12)  // presignals
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4777
	                   |                                        (1 << 0x13)  // extpresignals
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4778
	                   | ((_patches.never_expire_vehicles ? 1 : 0) << 0x16)  // enginespersist
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4779
	                   |                                        (1 << 0x1B)  // multihead
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4780
	                   |                                        (1 << 0x1D)  // lowmemory
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4781
	                   |                                        (1 << 0x1E); // generalfixes
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4782
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4783
	_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
  4784
	                   |        ((_patches.mammoth_trains ? 1 : 0) << 0x08)  // mammothtrains
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4785
	                   |                                        (1 << 0x09)  // trainrefit
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4786
	                   |                                        (0 << 0x0B)  // subsidiaries
5550
ffed4fb7555d (svn r7930) -Fix: [FS#520] Wrong GRF flag set for gradual loading (mart3p)
Darkvater
parents: 5525
diff changeset
  4787
	                   |       ((_patches.gradual_loading ? 1 : 0) << 0x0C)  // gradualloading
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4788
	                   |                                        (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
  4789
	                   |                                        (1 << 0x13)  // unifiedmaglevmode - set bit 1 mode
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4790
	                   |                                        (1 << 0x14)  // bridgespeedlimits
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4791
	                   |                                        (1 << 0x16)  // eternalgame
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4792
	                   |                                        (1 << 0x17)  // newtrains
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4793
	                   |                                        (1 << 0x18)  // newrvs
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4794
	                   |                                        (1 << 0x19)  // newships
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4795
	                   |                                        (1 << 0x1A)  // newplanes
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4796
	                   |           ((_patches.signal_side ? 1 : 0) << 0x1B)  // signalsontrafficside
7730
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4797
	                   |       ((_patches.disable_elrails ? 0 : 1) << 0x1C); // electrifiedrailway
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4798
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4799
	_ttdpatch_flags[2] =                                        (1 << 0x01)  // loadallgraphics - obsolote
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4800
	                   |                                        (1 << 0x03)  // semaphores
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4801
	                   |                                        (0 << 0x0B)  // enhancedgui
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4802
	                   |                                        (0 << 0x0C)  // newagerating
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4803
	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x0D)  // buildonslopes
6507
ab8107a6c110 (svn r9690) -Codechange: Update another couple of NewGRF TTDPatch flags
peter1138
parents: 6503
diff changeset
  4804
	                   |         ((_patches.full_load_any ? 1 : 0) << 0x0E)  // fullloadany
6894
721970ba51d0 (svn r10141) -Fix (FS#848, r8973): Set the newgrf bit for realistic plane speeds (bulb)
celestar
parents: 6885
diff changeset
  4805
	                   |                                        (1 << 0x0F)  // planespeed - TODO depends on patch when implemented
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4806
	                   |                                        (0 << 0x10)  // moreindustriesperclimate - obsolete
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4807
	                   |                                        (0 << 0x11)  // moretoylandfeatures
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4808
	                   |                                        (1 << 0x12)  // newstations
7730
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  4809
	                   |                                        (1 << 0x13)  // tracktypecostdiff
6503
892c9b941008 (svn r9686) -Codechange: Update a couple of NewGRF TTDPatch flags
peter1138
parents: 6492
diff changeset
  4810
	                   |                                        (1 << 0x14)  // manualconvert
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4811
	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x15)  // buildoncoasts
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4812
	                   |                                        (1 << 0x16)  // canals
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4813
	                   |                                        (1 << 0x17)  // newstartyear
6503
892c9b941008 (svn r9686) -Codechange: Update a couple of NewGRF TTDPatch flags
peter1138
parents: 6492
diff changeset
  4814
	                   |    ((_patches.freight_trains > 1 ? 1 : 0) << 0x18)  // freighttrains
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4815
	                   |                                        (1 << 0x19)  // newhouses
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4816
	                   |                                        (1 << 0x1A)  // newbridges
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4817
	                   |                                        (1 << 0x1B)  // newtownnames
7694
3c4a0b7894cd (svn r11228) -Codechange: implement the "moreanimation" feature of TTDP, so we can properly support newindustries.
rubidium
parents: 7690
diff changeset
  4818
	                   |                                        (1 << 0x1C)  // moreanimation
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4819
	                   |    ((_patches.wagon_speed_limits ? 1 : 0) << 0x1D)  // wagonspeedlimits
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4820
	                   |                                        (1 << 0x1E)  // newshistory
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4821
	                   |                                        (0 << 0x1F); // custombridgeheads
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4822
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4823
	_ttdpatch_flags[3] =                                        (0 << 0x00)  // newcargodistribution
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4824
	                   |                                        (1 << 0x01)  // windowsnap
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4825
	                   |                                        (0 << 0x02)  // townbuildnoroad
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4826
	                   |                                        (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
  4827
	                   |                                        (0 << 0x04)  // aichoosechance
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4828
	                   |                                        (1 << 0x05)  // resolutionwidth
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4829
	                   |                                        (1 << 0x06)  // resolutionheight
7673
af64a5335dad (svn r11204) -Feature: [NewGRF] Add support for Action 00 for Industries and IndustryTiles.
belugas
parents: 7672
diff changeset
  4830
	                   |                                        (1 << 0x07)  // newindustries
6623
e35eb9de954b (svn r9843) -Fix (r9838): tell the newgrfs that we now support proper FIFO loading.
rubidium
parents: 6607
diff changeset
  4831
	                   |         ((_patches.improved_load ? 1 : 0) << 0x08)  // fifoloading
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4832
	                   |                                        (0 << 0x09)  // townroadbranchprob
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4833
	                   |                                        (0 << 0x0A)  // tempsnowline
6463
e986fe39dfe7 (svn r9638) -Feature: Increase cargo types from 12 to 32 and enable newcargo flag in NewGRF loader.
peter1138
parents: 6461
diff changeset
  4834
	                   |                                        (1 << 0x0B)  // newcargo
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4835
	                   |                                        (1 << 0x0C)  // enhancemultiplayer
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4836
	                   |                                        (1 << 0x0D)  // onewayroads
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4837
	                   |   ((_patches.nonuniform_stations ? 1 : 0) << 0x0E)  // irregularstations
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4838
	                   |                                        (1 << 0x0F)  // statistics
4657
dfbc1d1e6fd0 (svn r6533) - Fix (r6532): Somebody forgot to add newsounds to the ttdpatch flags...
peter1138
parents: 4656
diff changeset
  4839
	                   |                                        (1 << 0x10)  // newsounds
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4840
	                   |                                        (1 << 0x11)  // autoreplace
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4841
	                   |                                        (1 << 0x12)  // autoslope
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4842
	                   |                                        (0 << 0x13)  // followvehicle
6691
f9adbb0be102 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 6686
diff changeset
  4843
	                   |                                        (1 << 0x14)  // trams
4381
c97b8f5119ad (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4844
	                   |                                        (0 << 0x15)  // enhancetunnels
6857
60130753e595 (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 6848
diff changeset
  4845
	                   |                                        (1 << 0x16)  // shortrvs
60130753e595 (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 6848
diff changeset
  4846
	                   |                                        (1 << 0x17)  // articulatedrvs
6507
ab8107a6c110 (svn r9690) -Codechange: Update another couple of NewGRF TTDPatch flags
peter1138
parents: 6503
diff changeset
  4847
	                   |                                        (1 << 0x1E); // variablerunningcosts
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4848
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  4849
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4850
static void ResetCustomStations()
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4851
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4852
	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
  4853
		if (file->stations == NULL) continue;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4854
		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
  4855
			if (file->stations[i] == NULL) continue;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4856
			StationSpec *statspec = file->stations[i];
3740
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4857
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4858
			/* 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
  4859
			if (!statspec->copied_renderdata) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4860
				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
  4861
					free((void*)statspec->renderdata[t].seq);
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4862
				}
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4863
				free(statspec->renderdata);
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4864
			}
4742b3d6f37b (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  4865
5061
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4866
			/* Release platforms and layouts */
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4867
			if (!statspec->copied_layouts) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4868
				for (uint l = 0; l < statspec->lengths; l++) {
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4869
					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
  4870
						free(statspec->layouts[l][p]);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4871
					}
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4872
					free(statspec->layouts[l]);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4873
				}
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4874
				free(statspec->layouts);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4875
				free(statspec->platforms);
9ca17a7278fa (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  4876
			}
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
  4877
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
  4878
			/* 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
  4879
			free(statspec);
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4880
		}
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
  4881
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
  4882
		/* 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
  4883
		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
  4884
		file->stations = NULL;
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4885
	}
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4886
}
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  4887
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4888
static void ResetCustomHouses()
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4889
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4890
	GRFFile *file;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4891
	uint i;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4892
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4893
	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
  4894
		if (file->housespec == NULL) continue;
6848
b13a56180454 (svn r10088) -Codechange: A typo and a code-style
belugas
parents: 6834
diff changeset
  4895
		for (i = 0; i < HOUSE_MAX; i++) {
b13a56180454 (svn r10088) -Codechange: A typo and a code-style
belugas
parents: 6834
diff changeset
  4896
			free(file->housespec[i]);
b13a56180454 (svn r10088) -Codechange: A typo and a code-style
belugas
parents: 6834
diff changeset
  4897
		}
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4898
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4899
		free(file->housespec);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4900
		file->housespec = NULL;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4901
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4902
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  4903
6759
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4904
static void ResetCustomIndustries()
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4905
{
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4906
	GRFFile *file;
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4907
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4908
	for (file = _first_grffile; file != NULL; file = file->next) {
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4909
		uint i;
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4910
		/* We are verifiying both tiles and industries specs loaded from the grf file
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4911
		 * First, let's deal with industryspec */
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4912
		if (file->industryspec != NULL) {
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4913
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4914
			for (i = 0; i < NUM_INDUSTRYTYPES; i++) {
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4915
				IndustrySpec *ind = file->industryspec[i];
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4916
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4917
				if (ind != NULL) {
6765
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4918
					/* We need to remove the sounds array */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  4919
					if (HasBit(ind->cleanup_flag, CLEAN_RANDOMSOUNDS)) {
6765
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4920
						free((void*)ind->random_sounds);
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4921
					}
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4922
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4923
					/* We need to remove the tiles layouts */
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  4924
					if (HasBit(ind->cleanup_flag, CLEAN_TILELSAYOUT) && ind->table != NULL) {
6765
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4925
						for (int j = 0; j < ind->num_table; j++) {
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4926
							/* remove the individual layouts */
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4927
							if (ind->table[j] != NULL) {
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4928
								free((IndustryTileTable*)ind->table[j]);
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4929
							}
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4930
						}
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4931
						/* remove the layouts pointers */
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4932
						free((IndustryTileTable**)ind->table);
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4933
						ind->table = NULL;
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4934
					}
50903afa1a48 (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 6764
diff changeset
  4935
6759
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4936
					free(ind);
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4937
					ind = NULL;
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4938
				}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4939
			}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4940
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4941
			free(file->industryspec);
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4942
			file->industryspec = NULL;
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4943
		}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4944
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4945
		if (file->indtspec != NULL) {
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4946
			for (i = 0; i < NUM_INDUSTRYTILES; i++) {
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4947
				if (file->indtspec[i] != NULL) {
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4948
					free(file->indtspec[i]);
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4949
					file->indtspec[i] = NULL;
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4950
				}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4951
			}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4952
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4953
			free(file->indtspec);
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4954
			file->indtspec = NULL;
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4955
		}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4956
	}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4957
}
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  4958
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4959
static void ResetNewGRF()
4953
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4960
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4961
	GRFFile *next;
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4962
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  4963
	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
  4964
		next = f->next;
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4965
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4966
		free(f->filename);
6684
2f8288bdd427 (svn r9916) -Codechange: Free memory used by cargo translation tables
peter1138
parents: 6659
diff changeset
  4967
		free(f->cargo_list);
4953
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4968
		free(f);
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4969
	}
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4970
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4971
	_first_grffile = NULL;
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4972
	_cur_grffile   = NULL;
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4973
}
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  4974
6870
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4975
static void ResetNewGRFErrors()
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4976
{
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4977
	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  4978
		if (!HasBit(c->flags, GCF_COPY) && c->error != NULL) {
6873
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  4979
			free(c->error->custom_message);
b4d0648edd29 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 6870
diff changeset
  4980
			free(c->error->data);
6870
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4981
			free(c->error);
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4982
			c->error = NULL;
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4983
		}
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4984
	}
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4985
}
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  4986
2491
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  4987
/**
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
  4988
 * 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
  4989
 * 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
  4990
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  4991
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
  4992
{
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  4993
	CleanUpStrings();
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  4994
	CleanUpGRFTownNames();
3601
138bf309cf27 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  4995
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4996
	/* Copy/reset original engine info data */
8221
59791d0e0c04 (svn r11784) -Codechange: set up initial engine data in one place
peter1138
parents: 8214
diff changeset
  4997
	SetupEngines();
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
  4998
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  4999
	/* Copy/reset original bridge info data
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5000
	 * First, free sprite table data */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  5001
	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
  5002
		if (_bridge[i].sprite_table != NULL) {
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  5003
			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
  5004
			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
  5005
		}
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
  5006
	}
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
  5007
	memcpy(&_bridge, &orig_bridge, sizeof(_bridge));
2491
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  5008
6349
908a23fd464f (svn r9387) -Fix (r9385): termination of a comment forgotten.
rubidium
parents: 6348
diff changeset
  5009
	/* 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
  5010
	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
  5011
	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
  5012
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5013
	/* Reset GRM reservations */
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  5014
	memset(&_grm_engines, 0, sizeof(_grm_engines));
6781
17e17ed7d032 (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 6769
diff changeset
  5015
	memset(&_grm_cargos, 0, sizeof(_grm_cargos));
4961
5c6439ce39f1 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  5016
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5017
	/* Unload sprite group data */
2491
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  5018
	UnloadWagonOverrides();
15a117630a4f (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  5019
	UnloadCustomEngineSprites();
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
  5020
	ResetEngineListOrder();
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  5021
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5022
	/* Reset price base data */
2506
eca87f30e05a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  5023
	ResetPriceBaseMultipliers();
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5024
4377
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  5025
	/* Reset the curencies array */
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  5026
	ResetCurrencies();
f04bcf6f9a04 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  5027
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5028
	/* Reset the house array */
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5029
	ResetCustomHouses();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5030
	ResetHouses();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5031
6743
e84a3b89d46b (svn r9976) -Codechange: Declare a writable array of specs for industry and industry tiles.
belugas
parents: 6691
diff changeset
  5032
	/* Reset the industries structures*/
6759
cd55b02175dd (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 6743
diff changeset
  5033
	ResetCustomIndustries();
6743
e84a3b89d46b (svn r9976) -Codechange: Declare a writable array of specs for industry and industry tiles.
belugas
parents: 6691
diff changeset
  5034
	ResetIndustries();
e84a3b89d46b (svn r9976) -Codechange: Declare a writable array of specs for industry and industry tiles.
belugas
parents: 6691
diff changeset
  5035
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5036
	/* Reset station classes */
2625
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5037
	ResetStationClasses();
19bf7f695537 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5038
	ResetCustomStations();
2812
95102021c840 (svn r3360) Fix initialization of engines for precalculation of default refit mask.
peter1138
parents: 2769
diff changeset
  5039
6583
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  5040
	/* Reset canal sprite groups */
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  5041
	memset(_canal_sg, 0, sizeof(_canal_sg));
71d62b85d3ad (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6581
diff changeset
  5042
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  5043
	/* Reset the snowline table. */
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  5044
	ClearSnowLine();
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6342
diff changeset
  5045
4953
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5046
	/* Reset NewGRF files */
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5047
	ResetNewGRF();
2a33d1ff2ab7 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5048
6870
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  5049
	/* Reset NewGRF errors. */
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  5050
	ResetNewGRFErrors();
02df7ee32d9a (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 6857
diff changeset
  5051
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
  5052
	/* 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
  5053
	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
  5054
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
  5055
	/* 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
  5056
	_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
  5057
	_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
  5058
	_traininfo_vehicle_width = 29;
6769
13ccbd0f86b3 (svn r10005) -Codechange: Merge two flags (2cc and newhouses) indicating some newgrf features have been loaded, and introduce the newindustry one.
belugas
parents: 6765
diff changeset
  5059
7730
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  5060
	/* Reset track cost multipliers. */
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  5061
	memcpy(&_railtype_cost_multiplier, &_default_railtype_cost_multiplier, sizeof(_default_railtype_cost_multiplier));
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7718
diff changeset
  5062
6914
6219e65dd7bf (svn r10167) -Codechange: Change the flagging system of grf loaded feature from a bitset to a bool evaluation.
belugas
parents: 6908
diff changeset
  5063
	_loaded_newgrf_features.has_2CC           = false;
6219e65dd7bf (svn r10167) -Codechange: Change the flagging system of grf loaded feature from a bitset to a bool evaluation.
belugas
parents: 6908
diff changeset
  5064
	_loaded_newgrf_features.has_newhouses     = false;
7661
3c1f788966ec (svn r11192) -Fix: Little typo with bigger consequences when trying to remove a newindustries aware grf
belugas
parents: 7660
diff changeset
  5065
	_loaded_newgrf_features.has_newindustries = false;
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
  5066
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  5067
	InitializeSoundPool();
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5068
	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
  5069
}
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
  5070
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
  5071
/** Reset all NewGRFData that was used only while processing data */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  5072
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
  5073
{
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
  5074
	/* Clear the GOTO labels used for GRF processing */
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  5075
	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
  5076
		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
  5077
		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
  5078
		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
  5079
	}
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
  5080
	_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
  5081
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5082
	/* 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
  5083
	free(_cur_grffile->spritegroups);
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5084
	_cur_grffile->spritegroups = NULL;
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5085
	_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
  5086
}
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
  5087
6147
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5088
static void BuildCargoTranslationMap()
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5089
{
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5090
	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
  5091
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5092
	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
  5093
		const CargoSpec *cs = GetCargo(c);
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5094
		if (!cs->IsValid()) continue;
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5095
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5096
		if (_cur_grffile->cargo_max == 0) {
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5097
			/* 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
  5098
			_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
  5099
		} else {
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5100
			/* 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
  5101
			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
  5102
				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
  5103
					_cur_grffile->cargo_map[c] = i;
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5104
					break;
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5105
				}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5106
			}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5107
		}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5108
	}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5109
}
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5110
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
  5111
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
  5112
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  5113
	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
  5114
	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
  5115
		/* 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
  5116
		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
  5117
		_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
  5118
		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
  5119
	}
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
  5120
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
  5121
	newfile = CallocT<GRFFile>(1);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5122
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5123
	if (newfile == NULL) error ("Out of memory");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5124
7034
e2d80a01d9c1 (svn r10298) -Fix [FS#903]: show the subdirectory below the default data directory in this filename in the newgrf list. The directory was removed in r9560 because then it used to full path instead of the path relative to the data directory, but since the inclusion of "search paths" that is not necessary anymore.
rubidium
parents: 6956
diff changeset
  5125
	newfile->filename = strdup(config->filename);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5126
	newfile->sprite_offset = sprite_offset;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5127
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
  5128
	/* 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
  5129
	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
  5130
	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
  5131
	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
  5132
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5133
	if (_first_grffile == NULL) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5134
		_cur_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5135
		_first_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5136
	} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5137
		_cur_grffile->next = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5138
		_cur_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5139
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5140
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5141
5037
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5142
6145
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5143
/** 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
  5144
 * 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
  5145
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
  5146
	'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
  5147
	'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
  5148
	'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
  5149
	'PLST', 'FZDR',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5150
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5151
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5152
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
  5153
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5154
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5155
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
  5156
	'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
  5157
	'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
  5158
	'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
  5159
	'PLST', 'FZDR',
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5160
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5161
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5162
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
  5163
	'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
  5164
	'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
  5165
	0 };
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5166
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5167
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
  5168
	_default_refitmasks_rail,
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5169
	_default_refitmasks_road,
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5170
	_default_refitmasks_ships,
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5171
	_default_refitmasks_aircraft,
5037
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5172
};
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5173
70f2158c5de0 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5174
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5175
/**
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5176
 * 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
  5177
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  5178
static void CalculateRefitMasks()
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5179
{
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  5180
	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5181
		uint32 mask = 0;
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5182
		uint32 not_mask = 0;
6284
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5183
		uint32 xor_mask = 0;
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5184
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5185
		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
  5186
			const GRFFile *file = GetEngineGRF(engine);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5187
			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
  5188
				/* 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
  5189
				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
  5190
				for (uint i = 0; i < num_cargo; i++) {
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  5191
					if (!HasBit(_engine_info[engine].refit_mask, i)) continue;
6284
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5192
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5193
					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
  5194
					if (c == CT_INVALID) continue;
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5195
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  5196
					SetBit(xor_mask, c);
6284
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5197
				}
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5198
			} else {
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5199
				/* 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
  5200
				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
  5201
					const CargoSpec *cs = GetCargo(c);
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5202
					if (!cs->IsValid()) continue;
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5203
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  5204
					if (HasBit(_engine_info[engine].refit_mask, cs->bitnum)) SetBit(xor_mask, c);
6284
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5205
				}
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5206
			}
29edfea44492 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6282
diff changeset
  5207
		}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5208
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5209
		if (cargo_allowed[engine] != 0) {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5210
			/* 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
  5211
			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
  5212
				const CargoSpec *cs = GetCargo(i);
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  5213
				if (cargo_allowed[engine]    & cs->classes) SetBit(mask,     i);
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  5214
				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
  5215
			}
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5216
		} else {
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5217
			/* 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
  5218
			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
  5219
						GetEngine(engine)->type != VEH_TRAIN || (
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5220
							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
  5221
							RailVehInfo(engine)->railveh_type != RAILVEH_WAGON
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5222
						)
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5223
					)) {
6145
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5224
				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
  5225
				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
  5226
					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
  5227
c839ab950ecc (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6143
diff changeset
  5228
					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
  5229
					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
  5230
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  5231
					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
  5232
				}
3033
9cba043eb38f (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5233
			}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5234
		}
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
  5235
		_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
  5236
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
  5237
		/* 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
  5238
		 * 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
  5239
		switch (GetEngine(engine)->type) {
6638
09c5d7bf69a5 (svn r9869) -Codechange: replace some bytes with VehicleType, i.e. more type strictness.
rubidium
parents: 6629
diff changeset
  5240
			default: NOT_REACHED();
09c5d7bf69a5 (svn r9869) -Codechange: replace some bytes with VehicleType, i.e. more type strictness.
rubidium
parents: 6629
diff changeset
  5241
			case VEH_AIRCRAFT: break;
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
  5242
			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
  5243
				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
  5244
				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
  5245
				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
  5246
				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
  5247
			}
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
  5248
			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
  5249
				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
  5250
				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
  5251
				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
  5252
				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
  5253
			}
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
  5254
			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
  5255
				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
  5256
				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
  5257
				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
  5258
				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
  5259
			}
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
  5260
		}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5261
	}
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5262
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5263
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5264
/** 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
  5265
 * 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
  5266
 * 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
  5267
 * 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
  5268
static void FinaliseHouseArray()
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5269
{
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5270
	/* 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
  5271
	 * 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
  5272
	 * 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
  5273
	 * 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
  5274
	 * If there have been any houses defined with start dates before 1930 then
8165
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5275
	 * the dates are left alone.
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5276
	 * On the other hand, why 1930? Just 'fix' the houses with the lowest
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5277
	 * minimum introduction date to 0.
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5278
	 */
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5279
	Year min_date = MAX_YEAR;
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5280
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5281
	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
  5282
		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
  5283
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5284
		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
  5285
			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
  5286
			if (hs != NULL) {
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5287
				hs->building_name.MapString();
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents: 6623
diff changeset
  5288
				_house_mngr.SetEntitySpec(hs);
8165
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5289
				if (hs->min_date < min_date) min_date = hs->min_date;
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5290
			}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5291
		}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5292
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5293
8165
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5294
	if (min_date != 0) {
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5295
		for (int i = 0; i < HOUSE_MAX; i++) {
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5296
			HouseSpec *hs = GetHouseSpecs(i);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5297
8165
5ba605a5dd90 (svn r11728) -Fix [FS#1577]: if there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available.
rubidium
parents: 8164
diff changeset
  5298
			if (hs->enabled && hs->min_date == min_date) hs->min_date = 0;
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5299
		}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5300
	}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5301
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5302
7183
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5303
/** Add all new industries to the industry array. Industry properties can be set at any
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5304
 * time in the GRF file, so we can only add a industry spec to the industry array
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5305
 * after the file has finished loading. */
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5306
static void FinaliseIndustriesArray()
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5307
{
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5308
	for (GRFFile *file = _first_grffile; file != NULL; file = file->next) {
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5309
		if (file->industryspec != NULL) {
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5310
			for (int i = 0; i < NUM_INDUSTRYTYPES; i++) {
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5311
				IndustrySpec *indsp = file->industryspec[i];
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5312
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5313
				if (indsp != NULL && indsp->enabled) {
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5314
					StringID strid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5315
					/* process the conversion of text at the end, so to be sure everything will be fine
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5316
					 * and available.  Check if it does not return undefind marker, which is a very good sign of a
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5317
					 * substitute industry who has not changed the string been examined, thus using it as such */
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5318
					indsp->name.MapString();
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5319
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->name);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5320
					if (strid != STR_UNDEFINED) indsp->name = strid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5321
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5322
					indsp->closure_text.MapString();
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5323
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->closure_text);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5324
					if (strid != STR_UNDEFINED) indsp->closure_text = strid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5325
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5326
					indsp->production_up_text.MapString();
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5327
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->production_up_text);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5328
					if (strid != STR_UNDEFINED) indsp->production_up_text = strid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5329
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5330
					indsp->production_down_text.MapString();
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5331
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->production_down_text);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5332
					if (strid != STR_UNDEFINED) indsp->production_down_text = strid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5333
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5334
					indsp->new_industry_text.MapString();
7217
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5335
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->new_industry_text);
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5336
					if (strid != STR_UNDEFINED) indsp->new_industry_text = strid;
ff5b3c502e84 (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7183
diff changeset
  5337
7183
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5338
					_industry_mngr.SetEntitySpec(indsp);
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5339
					_loaded_newgrf_features.has_newindustries = true;
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5340
				}
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5341
			}
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5342
		}
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5343
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5344
		if (file->indtspec != NULL) {
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5345
			for (int i = 0; i < NUM_INDUSTRYTILES; i++) {
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5346
				IndustryTileSpec *indtsp = file->indtspec[i];
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5347
				if (indtsp != NULL) {
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5348
					_industile_mngr.SetEntitySpec(indtsp);
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5349
				}
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5350
			}
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5351
		}
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5352
	}
7233
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5353
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5354
	for (uint j = 0; j < NUM_INDUSTRYTYPES; j++) {
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5355
		IndustrySpec *indsp = &_industry_specs[j];
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5356
		if (indsp->enabled && indsp->grf_prop.grffile != NULL) {
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5357
			for (uint i = 0; i < 3; i++) {
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5358
				indsp->conflicting[i] = MapNewGRFIndustryType(indsp->conflicting[i], indsp->grf_prop.grffile->grfid);
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5359
			}
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5360
		}
aadfbb505671 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7229
diff changeset
  5361
	}
7183
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5362
}
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5363
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5364
/** 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
  5365
 * 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
  5366
 * properly. */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5367
static void MapNewCargoStrings()
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5368
{
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5369
	for (CargoID c = 0; c < NUM_CARGO; c++) {
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5370
		CargoSpec *cs = &_cargo[c];
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5371
		/* Don't map if the cargo is unavailable or not from NewGRF */
7718
ae76f089652d (svn r11253) -Fix (r9411): industries can still use cargo they define, even if these cargo are disabled by a grf loaded later
glx
parents: 7717
diff changeset
  5372
		if (cs->grfid == 0) continue;
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5373
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5374
		cs->name.MapString();
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5375
		cs->name_single.MapString();
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5376
		cs->units_volume.MapString();
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5377
		cs->quantifier.MapString();
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5378
		cs->abbrev.MapString();
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5379
	}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5380
}
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5381
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5382
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5383
/* 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
  5384
 * 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
  5385
 * partial implementation yet). */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5386
/* 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
  5387
 * 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
  5388
 * 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
  5389
static void DecodeSpecialSprite(uint num, GrfLoadingStage stage)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5390
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5391
	/* 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
  5392
	 * 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
  5393
	 * 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
  5394
	 * "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
  5395
	 * 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
  5396
	 * 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
  5397
	 * 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
  5398
	 * 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
  5399
	 * --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
  5400
	/* 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
  5401
	 * 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
  5402
	 * 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
  5403
	static const SpecialSpriteHandler handlers[][GLS_END] = {
7899
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  5404
		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       NULL,           ReserveChangeInfo, FeatureChangeInfo, },
6576
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  5405
		/* 0x01 */ { SkipAct1, SkipAct1,  SkipAct1,        SkipAct1,       SkipAct1,          NewSpriteSet, },
3a7cc737dec8 (svn r9790) -Codechange: [NewGRF] Skip action 1 sprites in all stages except activation. This also cleans up some special-case handling of the sprites. Actions 1 and 2 are now not considered unsafe, as an Action 3 (which is unsafe) is required for them.
peter1138
parents: 6570
diff changeset
  5406
		/* 0x02 */ { NULL,     NULL,      NULL,            NULL,           NULL,              NewSpriteGroup, },
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5407
		/* 0x03 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              FeatureMapSpriteGroup, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5408
		/* 0x04 */ { NULL,     NULL,      NULL,            NULL,           NULL,              FeatureNewName, },
6529
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  5409
		/* 0x05 */ { SkipAct5, SkipAct5,  SkipAct5,        SkipAct5,       SkipAct5,          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
  5410
		/* 0x06 */ { NULL,     NULL,      NULL,            CfgApply,       CfgApply,          CfgApply, },
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5411
		/* 0x07 */ { NULL,     NULL,      NULL,            NULL,           SkipIf,            SkipIf, },
6806
c0faecfdc59f (svn r10045) -Codechange: Process Action 8 during GLS_RESERVATION to allow Action 7/Action 9s to work properly
peter1138
parents: 6805
diff changeset
  5412
		/* 0x08 */ { ScanInfo, NULL,      NULL,            GRFInfo,        GRFInfo,           GRFInfo, },
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5413
		/* 0x09 */ { NULL,     NULL,      NULL,            SkipIf,         SkipIf,            SkipIf, },
6529
c572290f0cb9 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 6515
diff changeset
  5414
		/* 0x0A */ { SkipActA, SkipActA,  SkipActA,        SkipActA,       SkipActA,          SpriteReplace, },
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5415
		/* 0x0B */ { NULL,     NULL,      NULL,            GRFLoadError,   GRFLoadError,      GRFLoadError, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5416
		/* 0x0C */ { NULL,     NULL,      NULL,            GRFComment,     NULL,              GRFComment, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5417
		/* 0x0D */ { NULL,     SafeParamSet, NULL,         ParamSet,       ParamSet,          ParamSet, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5418
		/* 0x0E */ { NULL,     SafeGRFInhibit, NULL,       GRFInhibit,     GRFInhibit,        GRFInhibit, },
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  5419
		/* 0x0F */ { NULL,     GRFUnsafe, NULL,            FeatureTownName, NULL,             NULL, },
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5420
		/* 0x10 */ { NULL,     NULL,      DefineGotoLabel, NULL,           NULL,              NULL, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5421
		/* 0x11 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              GRFSound, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5422
		/* 0x12 */ { NULL,     NULL,      NULL,            NULL,           NULL,              LoadFontGlyph, },
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5423
		/* 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
  5424
	};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5425
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5426
	byte* buf;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5427
3895
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5428
	if (_preload_sprite == NULL) {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5429
		/* 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
  5430
		 * 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
  5431
		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
  5432
		FioReadBlock(buf, num);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5433
	} else {
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5434
		/* 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
  5435
		buf = _preload_sprite;
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5436
		_preload_sprite = NULL;
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  5437
		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
  5438
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5439
		/* 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
  5440
		FioSeekTo(num, SEEK_CUR);
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5441
	}
ebe5f95d8917 (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5442
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  5443
	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
  5444
4656
9c1d8c4d3e60 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  5445
	if (action == 0xFF) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5446
		grfmsg(7, "DecodeSpecialSprite: 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
  5447
		GRFDataBlock(buf, num);
4818
6caf76622964 (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  5448
	} else if (action == 0xFE) {
7899
ff8ddda625b5 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 7892
diff changeset
  5449
		grfmsg(7, "DecodeSpecialSprite: 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
  5450
		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
  5451
	} else if (action >= lengthof(handlers)) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5452
		grfmsg(7, "DecodeSpecialSprite: 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
  5453
	} else if (handlers[action][stage] == NULL) {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5454
		grfmsg(7, "DecodeSpecialSprite: 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
  5455
	} else {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5456
		grfmsg(7, "DecodeSpecialSprite: 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
  5457
		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
  5458
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5459
	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
  5460
}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5461
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5462
8194
46b8e23a8f44 (svn r11757) -Fix(r11727): Don't use a function's default parameter when the value can be (more adequately, even better) computed from another source.
belugas
parents: 8185
diff changeset
  5463
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
  5464
{
7034
e2d80a01d9c1 (svn r10298) -Fix [FS#903]: show the subdirectory below the default data directory in this filename in the newgrf list. The directory was removed in r9560 because then it used to full path instead of the path relative to the data directory, but since the inclusion of "search paths" that is not necessary anymore.
rubidium
parents: 6956
diff changeset
  5465
	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
  5466
	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
  5467
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5468
	/* 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
  5469
	 * 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
  5470
	 * 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
  5471
	 * 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
  5472
	 * 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
  5473
	 *
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5474
	 * 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
  5475
	 * 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
  5476
	 * 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
  5477
	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
  5478
		_cur_grffile = GetFileByFilename(filename);
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5379
diff changeset
  5479
		if (_cur_grffile == NULL) error("File '%s' lost in cache.\n", filename);
6806
c0faecfdc59f (svn r10045) -Codechange: Process Action 8 during GLS_RESERVATION to allow Action 7/Action 9s to work properly
peter1138
parents: 6805
diff changeset
  5480
		if (stage == GLS_RESERVE && config->status != GCS_INITIALISED) return;
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  5481
		if (stage == GLS_ACTIVATION && !HasBit(config->flags, GCF_RESERVED)) return;
8194
46b8e23a8f44 (svn r11757) -Fix(r11727): Don't use a function's default parameter when the value can be (more adequately, even better) computed from another source.
belugas
parents: 8185
diff changeset
  5482
		_cur_grffile->is_ottdfile = config->IsOpenTTDBaseGRF();
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
  5483
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5484
7805
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5485
	if (file_index > LAST_GRF_SLOT) {
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5486
		DEBUG(grf, 0, "'%s' is not loaded as the maximum number of GRFs has been reached", filename);
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5487
		config->status = GCS_DISABLED;
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5488
		config->error  = CallocT<GRFError>(1);
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5489
		config->error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5490
		config->error->message  = STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED;
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5491
		return;
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5492
	}
7ab20f94cc80 (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 7796
diff changeset
  5493
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
  5494
	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
  5495
	_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
  5496
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  5497
	_cur_grfconfig = config;
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  5498
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5499
	DEBUG(grf, 2, "LoadNewGRFFile: 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
  5500
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5501
	/* 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
  5502
	 * 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
  5503
	 * 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
  5504
	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
  5505
		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
  5506
	} else {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5507
		DEBUG(grf, 7, "LoadNewGRFFile: 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
  5508
		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
  5509
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5510
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5511
	_skip_sprites = 0; // XXX
3557
1e9867319bce (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  5512
	_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
  5513
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5514
	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
  5515
		byte type = FioReadByte();
3557
1e9867319bce (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  5516
		_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
  5517
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5518
		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
  5519
			if (_skip_sprites == 0) {
2958
ac0a9673b522 (svn r3520) Remove unused parameters from some functions
tron
parents: 2935
diff changeset
  5520
				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
  5521
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
  5522
				/* 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
  5523
				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
  5524
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
  5525
				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
  5526
			} 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
  5527
				FioSkipBytes(num);
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  5528
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5529
		} else {
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5530
			if (_skip_sprites == 0) grfmsg(7, "LoadNewGRFFile: 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
  5531
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5532
			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
  5533
			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
  5534
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5535
			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
  5536
				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
  5537
			} 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
  5538
				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
  5539
					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
  5540
					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
  5541
						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
  5542
						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
  5543
					} 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
  5544
						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
  5545
						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
  5546
						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
  5547
					}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5548
				}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5549
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5550
		}
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
  5551
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5552
		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
  5553
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5554
}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5555
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6234
diff changeset
  5556
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
  5557
8323
d5531c7645a7 (svn r11888) -Codechange: simplify sorting of the strings in town names dropdown
glx
parents: 8298
diff changeset
  5558
extern void InitGRFTownGeneratorNames();
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  5559
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5560
static void AfterLoadGRFs()
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5561
{
6686
9e8b32366bd6 (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 6684
diff changeset
  5562
	/* Update the bitmasks for the vehicle lists */
9e8b32366bd6 (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 6684
diff changeset
  5563
	Player *p;
9e8b32366bd6 (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 6684
diff changeset
  5564
	FOR_ALL_PLAYERS(p) {
9e8b32366bd6 (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 6684
diff changeset
  5565
		p->avail_railtypes = GetPlayerRailtypes(p->index);
9e8b32366bd6 (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 6684
diff changeset
  5566
		p->avail_roadtypes = GetPlayerRoadtypes(p->index);
9e8b32366bd6 (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 6684
diff changeset
  5567
	}
9e8b32366bd6 (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 6684
diff changeset
  5568
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5569
	/* 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
  5570
	CalculateRefitMasks();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5571
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5572
	/* 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
  5573
	InitDepotWindowBlockSizes();
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5574
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5575
	/* 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
  5576
	FinaliseHouseArray();
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5577
7183
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5578
	/* Add all new industries to the industry array. */
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5579
	FinaliseIndustriesArray();
a7182cc3a8ea (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7182
diff changeset
  5580
6533
8be3ef428116 (svn r9721) -Codechange: -Codechange: Cleanup of industry_cmd (Step-12). Dynamically build the legends (name and color) for industries in the smallmap_gui.
belugas
parents: 6529
diff changeset
  5581
	/* Create dynamic list of industry legends for smallmap_gui.cpp */
8be3ef428116 (svn r9721) -Codechange: -Codechange: Cleanup of industry_cmd (Step-12). Dynamically build the legends (name and color) for industries in the smallmap_gui.
belugas
parents: 6529
diff changeset
  5582
	BuildIndustriesLegend();
8be3ef428116 (svn r9721) -Codechange: -Codechange: Cleanup of industry_cmd (Step-12). Dynamically build the legends (name and color) for industries in the smallmap_gui.
belugas
parents: 6529
diff changeset
  5583
6359
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5584
	/* 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
  5585
	 * loaded before strings... */
8527262c4cf8 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6357
diff changeset
  5586
	MapNewCargoStrings();
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  5587
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 6927
diff changeset
  5588
	/* Update the townname generators list */
8323
d5531c7645a7 (svn r11888) -Codechange: simplify sorting of the strings in town names dropdown
glx
parents: 8298
diff changeset
  5589
	InitGRFTownGeneratorNames();
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5590
}
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5591
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
  5592
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
  5593
{
2930
99088d4aba31 (svn r3486) - NewGRF fix: Always reinitialize the ttdpatch flags as patch settings may have changed.
peter1138
parents: 2895
diff changeset
  5594
	InitializeGRFSpecial();
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5595
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
  5596
	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
  5597
8159
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5598
	/*
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5599
	 * Reset the status of all files, so we can 'retry' to load them.
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5600
	 * This is needed when one for example rearranges the NewGRFs in-game
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5601
	 * and a previously disabled NewGRF becomes useable. If it would not
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5602
	 * be reset, the NewGRF would remain disabled even though it should
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5603
	 * have been enabled.
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5604
	 */
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5605
	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5606
		if (c->status != GCS_NOT_FOUND) c->status = GCS_UNKNOWN;
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5607
	}
0c9c45471c99 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8158
diff changeset
  5608
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
  5609
	/* 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
  5610
	 * 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
  5611
	 * and load information from it. */
7830
146cbcd4c29e (svn r11380) -Revert (r11191, r11196): it worked, but broke cargo loading
glx
parents: 7808
diff changeset
  5612
	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
  5613
		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
  5614
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5615
		_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
  5616
		_cur_spriteid = load_index;
6281
79c5ff190fbe (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6280
diff changeset
  5617
		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
  5618
			if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND) continue;
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  5619
			if (stage > GLS_INIT && HasBit(c->flags, GCF_INIT_ONLY)) continue;
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  5620
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
  5621
			/* @todo usererror() */
7034
e2d80a01d9c1 (svn r10298) -Fix [FS#903]: show the subdirectory below the default data directory in this filename in the newgrf list. The directory was removed in r9560 because then it used to full path instead of the path relative to the data directory, but since the inclusion of "search paths" that is not necessary anymore.
rubidium
parents: 6956
diff changeset
  5622
			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
  5623
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
  5624
			if (stage == GLS_LABELSCAN) InitNewGRFFile(c, _cur_spriteid);
8194
46b8e23a8f44 (svn r11757) -Fix(r11727): Don't use a function's default parameter when the value can be (more adequately, even better) computed from another source.
belugas
parents: 8185
diff changeset
  5625
			LoadNewGRFFile(c, slot++, stage);
6820
1b9283c26656 (svn r10059) -Fix (r10045): Pretend GRF is still in initialisation state when leaving reservation stage. This fixes action 7/9 tests for grfs that will be active.
peter1138
parents: 6813
diff changeset
  5626
			if (stage == GLS_RESERVE) {
7931
b0a46cd92225 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 7929
diff changeset
  5627
				SetBit(c->flags, GCF_RESERVED);
7830
146cbcd4c29e (svn r11380) -Revert (r11191, r11196): it worked, but broke cargo loading
glx
parents: 7808
diff changeset
  5628
			} else if (stage == GLS_ACTIVATION) {
7929
6c9b25842b0f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 7928
diff changeset
  5629
				ClrBit(c->flags, GCF_RESERVED);
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
  5630
				ClearTemporaryNewGRFData();
6147
ee050ca3889f (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6145
diff changeset
  5631
				BuildCargoTranslationMap();
6477
573b27af65be (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6470
diff changeset
  5632
				DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur_spriteid);
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
  5633
			}
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
  5634
		}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5635
	}
2611
36aa372eeb34 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5636
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6288
diff changeset
  5637
	/* 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
  5638
	AfterLoadGRFs();
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  5639
}
6541
dfa5165a5ab7 (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6533
diff changeset
  5640
dfa5165a5ab7 (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6533
diff changeset
  5641
bool HasGrfMiscBit(GrfMiscBit bit)
dfa5165a5ab7 (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6533
diff changeset
  5642
{
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7922
diff changeset
  5643
	return HasBit(_misc_grf_features, bit);
6541
dfa5165a5ab7 (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6533
diff changeset
  5644
}
8298
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5645
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5646
void GRFMappedStringID::MapString()
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5647
{
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5648
	if (this->grfid == 0) return;
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5649
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5650
	this->string = MapGRFStringID(this->grfid, this->string);
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5651
	this->grfid = 0;
681e3c5f50ad (svn r11862) -Fix [FS#1559]: when two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF... So store the GRF ID with the strings. To be extra sure add the same protection mechanism to industries and towns too.
rubidium
parents: 8282
diff changeset
  5652
}