src/newgrf.cpp
author smatz
Mon, 18 Feb 2008 14:59:30 +0000
changeset 9091 c1cddeb8511c
parent 9073 740f7aaa3ff6
child 9118 bf19f7f901bc
permissions -rw-r--r--
(svn r12176) -Codechange: one division less when playing sounds (patch by Dominik)
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
     3
/** @file newgrf.cpp */
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
     4
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "stdafx.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     6
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     7
#include <stdarg.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     8
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1883
diff changeset
     9
#include "openttd.h"
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1183
diff changeset
    10
#include "debug.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    11
#include "fileio.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    12
#include "engine.h"
2342
c19fb4f2df30 (svn 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"
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
    14
#include "station.h"
405
6830ae7a0d5d (svn r602) -newgrf: Move DrawTileSeqStruct & co and struct SpriteGroup to sprite.h (pasky)
darkvater
parents: 404
diff changeset
    15
#include "sprite.h"
452
520e4ed6945d (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents: 449
diff changeset
    16
#include "newgrf.h"
2159
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2013
diff changeset
    17
#include "variables.h"
2478
16b05f1de6bb (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"
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
    19
#include "town.h"
2962
dbd168a4703a (svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents: 2958
diff changeset
    20
#include "newgrf_engine.h"
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
    21
#include "newgrf_text.h"
5108
dc67d70b5a45 (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
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
    23
#include "currency.h"
6669
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6668
diff changeset
    24
#include "landscape.h"
5228
c4a780348f66 (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"
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
    26
#include "newgrf_house.h"
4656
acffecd6f484 (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
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
    28
#include "newgrf_spritegroup.h"
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6416
diff changeset
    29
#include "cargotype.h"
7029
209e4b2e1180 (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: 7025
diff changeset
    30
#include "industry.h"
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
    31
#include "newgrf_canal.h"
7125
4ce0c7a12a3f (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents: 7119
diff changeset
    32
#include "newgrf_commons.h"
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
    33
#include "newgrf_townname.h"
7729
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
    34
#include "newgrf_industries.h"
8268
a83cbd95f3d3 (svn r11321) -Codechange: add support to load different graphics for halftile slopes using a NewGRF. Patch by frosch.
rubidium
parents: 8253
diff changeset
    35
#include "gfxinit.h"
8301
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
    36
#include "fios.h"
8599
b609cdeeff3f (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: 8585
diff changeset
    37
#include "rail.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8600
diff changeset
    38
#include "strings_func.h"
8619
c2434269c3eb (svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents: 8617
diff changeset
    39
#include "gfx_func.h"
8636
2b158acb649c (svn r11702) -Codechange: move all date related stuff to date*.
rubidium
parents: 8627
diff changeset
    40
#include "date_func.h"
8640
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8636
diff changeset
    41
#include "vehicle_func.h"
8653
a83f7a536919 (svn r11719) -Codechange: split sound.h in a header with types and one with functions.
rubidium
parents: 8646
diff changeset
    42
#include "sound_func.h"
8710
52015340050c (svn r11777) -Codechange: split the string header and make do not include it when it's not necessary.
rubidium
parents: 8694
diff changeset
    43
#include "string_func.h"
8732
b18f578f7c16 (svn r11800) -Codechange: move some functions to a more logical location + some type safety.
rubidium
parents: 8731
diff changeset
    44
#include "road_func.h"
8750
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8739
diff changeset
    45
#include "player_base.h"
8766
c86cfa3a7580 (svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents: 8760
diff changeset
    46
#include "settings_type.h"
8887
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
    47
#include "map_func.h"
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
    48
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    49
#include "table/strings.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    50
#include "table/sprites.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    51
#include "table/town_land.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    52
#include "table/build_industry.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    53
#include "table/landscape_sprite.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    54
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    55
/* TTDPatch extended GRF format codec
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    56
 * (c) Petr Baudis 2004 (GPL'd)
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
    57
 * Changes by Florian octo Forster are (c) by the OpenTTD development team.
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
    58
 *
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    59
 * Contains portions of documentation by TTDPatch team.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    60
 * Thanks especially to Josef Drexler for the documentation as well as a lot
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    61
 * of help at #tycoon. Also thanks to Michael Blunck for is GRF files which
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    62
 * served as subject to the initial testing of this codec. */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    63
455
e7ac799e1437 (svn r665) code fixes for newgrf.c/newgrf.h
dominik
parents: 452
diff changeset
    64
2342
c19fb4f2df30 (svn 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 int _skip_sprites; // XXX
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
    66
static uint _file_index; // XXX
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    67
2340
0a9f3eeccb96 (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
    68
static GRFFile *_cur_grffile;
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    69
GRFFile *_first_grffile;
3707
2999a89e8abd (svn r4650) - NewGRF: use the correct type for _cur_spriteid
peter1138
parents: 3704
diff changeset
    70
static SpriteID _cur_spriteid;
5225
52ddcedcc6f7 (svn r7345) -Codechange: enumification of NewGRF loading stage, and move enum definition to header for future use.
peter1138
parents: 5211
diff changeset
    71
static GrfLoadingStage _cur_stage;
3561
29c95ab685c0 (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
    72
static uint32 _nfo_line;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    73
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
    74
static GRFConfig *_cur_grfconfig;
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
    75
3814
d0b901dfc313 (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
    76
/* Miscellaneous GRF features, set by Action 0x0D, parameter 0x9E */
d0b901dfc313 (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
    77
static byte _misc_grf_features = 0;
d0b901dfc313 (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
    78
363
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
    79
/* 32 * 8 = 256 flags. Apparently TTDPatch uses this many.. */
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
    80
static uint32 _ttdpatch_flags[8];
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
    81
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
    82
/* Used by Action 0x06 to preload a pseudo sprite and modify its content */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
    83
static byte *_preload_sprite = NULL;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
    84
7265
74148c363f9d (svn r10005) -Codechange: Merge two flags (2cc and newhouses) indicating some newgrf features have been loaded, and introduce the newindustry one.
belugas
parents: 7261
diff changeset
    85
/* Indicates which are the newgrf features currently loaded ingame */
7410
358b83972e29 (svn r10167) -Codechange: Change the flagging system of grf loaded feature from a bitset to a bool evaluation.
belugas
parents: 7404
diff changeset
    86
GRFLoadedFeatures _loaded_newgrf_features;
363
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
    87
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    88
enum GrfDataType {
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    89
	GDT_SOUND,
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    90
};
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    91
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    92
static byte _grf_data_blocks;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    93
static GrfDataType _grf_data_type;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    94
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
    95
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    96
typedef void (*SpecialSpriteHandler)(byte *buf, int len);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    97
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
    98
static const uint _vehcounts[4] = {
373
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
    99
	/* GSF_TRAIN */    NUM_TRAIN_ENGINES,
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
   100
	/* GSF_ROAD */     NUM_ROAD_ENGINES,
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
   101
	/* GSF_SHIP */     NUM_SHIP_ENGINES,
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
   102
	/* GSF_AIRCRAFT */ NUM_AIRCRAFT_ENGINES
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
   103
};
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
   104
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
   105
static const uint _vehshifts[4] = {
373
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
   106
	/* GSF_TRAIN */    0,
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
   107
	/* GSF_ROAD */     ROAD_ENGINES_INDEX,
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
   108
	/* GSF_SHIP */     SHIP_ENGINES_INDEX,
218e83c92cb8 (svn r561) -newgrf: killed some of the magic numbers in the code (pasky)
celestar
parents: 372
diff changeset
   109
	/* GSF_AIRCRAFT */ AIRCRAFT_ENGINES_INDEX,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   110
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   111
3768
46d328178509 (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
   112
enum {
46d328178509 (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
   113
	MAX_STATIONS = 256,
46d328178509 (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
   114
};
46d328178509 (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
   115
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
   116
static uint16 cargo_allowed[TOTAL_NUM_ENGINES];
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
   117
static uint16 cargo_disallowed[TOTAL_NUM_ENGINES];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   118
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
   119
/* Contains the GRF ID of the owner of a vehicle if it has been reserved */
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
   120
static uint32 _grm_engines[TOTAL_NUM_ENGINES];
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
   121
7277
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
   122
/* Contains the GRF ID of the owner of a cargo if it has been reserved */
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
   123
static uint32 _grm_cargos[NUM_CARGO];
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
   124
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   125
/** DEBUG() function dedicated to newGRF debugging messages
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   126
 * Function is essentialy the same as DEBUG(grf, severity, ...) with the
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   127
 * addition of file:line information when parsing grf files.
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   128
 * NOTE: for the above reason(s) grfmsg() should ONLY be used for
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   129
 * loading/parsing grf files, not for runtime debug messages as there
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   130
 * is no file information available during that time.
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   131
 * @param severity debugging severity level, see debug.h
6977
67b989528f3d (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6975
diff changeset
   132
 * @param str message in printf() format */
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   133
void CDECL grfmsg(int severity, const char *str, ...)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   134
{
65
f9f866bc609c (svn r66) -Fix Station list updated on station deletion/station rename
darkvater
parents: 51
diff changeset
   135
	char buf[1024];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   136
	va_list va;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   137
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   138
	va_start(va, str);
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   139
	vsnprintf(buf, sizeof(buf), str, va);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   140
	va_end(va);
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
   141
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   142
	DEBUG(grf, severity, "[%s:%d] %s", _cur_grfconfig->filename, _nfo_line, buf);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   143
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   144
5841
b36d6b560aaa (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: 5838
diff changeset
   145
static inline bool check_length(int real, int wanted, const char *str)
5567
2af6b4aa2833 (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5557
diff changeset
   146
{
5841
b36d6b560aaa (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: 5838
diff changeset
   147
	if (real >= wanted) return true;
5567
2af6b4aa2833 (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5557
diff changeset
   148
	grfmsg(0, "%s: Invalid pseudo sprite length %d (expected %d)!", str, real, wanted);
5841
b36d6b560aaa (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: 5838
diff changeset
   149
	return false;
5567
2af6b4aa2833 (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5557
diff changeset
   150
}
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
   151
500
ef288590e096 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 490
diff changeset
   152
static inline byte grf_load_byte(byte **buf)
368
32aad6ad36e1 (svn r556) -newgrf: Some seemingly proper support for loading stages of grf files (octo & pasky).
darkvater
parents: 367
diff changeset
   153
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   154
	return *(*buf)++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   155
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   156
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   157
static uint16 grf_load_word(byte **buf)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   158
{
3711
4a0d1c635b56 (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
   159
	uint16 val = grf_load_byte(buf);
4a0d1c635b56 (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
   160
	return val | (grf_load_byte(buf) << 8);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   161
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   162
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   163
static uint16 grf_load_extended(byte** buf)
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   164
{
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   165
	uint16 val;
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   166
	val = grf_load_byte(buf);
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   167
	if (val == 0xFF) val = grf_load_word(buf);
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   168
	return val;
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   169
}
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   170
2324
117bd73a0731 (svn r2850) [newgrf] Patch from peter1139
miham
parents: 2204
diff changeset
   171
static uint32 grf_load_dword(byte **buf)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   172
{
3711
4a0d1c635b56 (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
   173
	uint32 val = grf_load_word(buf);
4a0d1c635b56 (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
   174
	return val | (grf_load_word(buf) << 16);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   175
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   176
3668
d7ed0a867b49 (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
   177
static uint32 grf_load_var(byte size, byte **buf)
d7ed0a867b49 (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
   178
{
d7ed0a867b49 (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
   179
	switch (size) {
d7ed0a867b49 (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
   180
		case 1: return grf_load_byte(buf);
d7ed0a867b49 (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
   181
		case 2: return grf_load_word(buf);
d7ed0a867b49 (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
   182
		case 4: return grf_load_dword(buf);
d7ed0a867b49 (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
   183
		default:
d7ed0a867b49 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   184
			NOT_REACHED();
d7ed0a867b49 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   185
			return 0;
d7ed0a867b49 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   186
	}
d7ed0a867b49 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3667
diff changeset
   187
}
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
   188
6416
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   189
static const char *grf_load_string(byte **buf, size_t max_len)
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   190
{
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   191
	const char *string   = *(const char **)buf;
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   192
	size_t string_length = ttd_strnlen(string, max_len);
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   193
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   194
	if (string_length == max_len) {
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   195
		/* String was not NUL terminated, so make sure it is now. */
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   196
		(*buf)[string_length - 1] = '\0';
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   197
		grfmsg(7, "String was not terminated with a zero byte.");
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   198
	} else {
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   199
		/* Increase the string length to include the NUL byte. */
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   200
		string_length++;
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   201
	}
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   202
	*buf += string_length;
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   203
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   204
	return string;
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   205
}
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
   206
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   207
static GRFFile *GetFileByGRFID(uint32 grfid)
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   208
{
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   209
	GRFFile *file;
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   210
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   211
	for (file = _first_grffile; file != NULL; file = file->next) {
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   212
		if (file->grfid == grfid) break;
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   213
	}
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   214
	return file;
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   215
}
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   216
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   217
static GRFFile *GetFileByFilename(const char *filename)
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   218
{
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   219
	GRFFile *file;
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   220
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   221
	for (file = _first_grffile; file != NULL; file = file->next) {
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   222
		if (strcmp(file->filename, filename) == 0) break;
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   223
	}
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   224
	return file;
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   225
}
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   226
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
   227
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   228
/** Used when setting an object's property to map to the GRF's strings
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   229
 * while taking in consideration the "drift" between TTDPatch string system and OpenTTD's one
6977
67b989528f3d (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6975
diff changeset
   230
 * @param grfid Id of the grf file
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   231
 * @param str StringID that we want to have the equivalent in OoenTTD
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   232
 * @return the properly adjusted StringID
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   233
 */
8111
23e6be5756bb (svn r11144) -Codechange: add support for newgrf callbacks 29 and 35
glx
parents: 8101
diff changeset
   234
StringID MapGRFStringID(uint32 grfid, StringID str)
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   235
{
8375
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   236
	/* StringID table for TextIDs 0x4E->0x6D */
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   237
	static StringID units_volume[] = {
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   238
		STR_NOTHING,    STR_PASSENGERS, STR_TONS,       STR_BAGS,
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   239
		STR_LITERS,     STR_ITEMS,      STR_CRATES,     STR_TONS,
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   240
		STR_TONS,       STR_TONS,       STR_TONS,       STR_BAGS,
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   241
		STR_TONS,       STR_TONS,       STR_TONS,       STR_BAGS,
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   242
		STR_TONS,       STR_TONS,       STR_BAGS,       STR_LITERS,
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   243
		STR_TONS,       STR_LITERS,     STR_TONS,       STR_NOTHING,
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   244
		STR_BAGS,       STR_LITERS,     STR_TONS,       STR_NOTHING,
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   245
		STR_TONS,       STR_NOTHING,    STR_LITERS,     STR_NOTHING
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   246
	};
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   247
	/* 0xD0 and 0xDC stand for all the TextIDs in the range
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
   248
	 * of 0xD000 (misc graphics texts) and 0xDC00 (misc persistent texts).
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   249
	 * These strings are unique to each grf file, and thus require to be used with the
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   250
	 * grfid in which they are declared */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   251
	if (GB(str, 8, 8) == 0xD0 || GB(str, 8, 8) == 0xDC) {
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   252
		return GetGRFStringID(grfid, str);
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   253
	}
8098
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   254
#define TEXID_TO_STRINGID(begin, end, stringid) if (str >= begin && str <= end) return str + (stringid - begin)
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   255
	/* We have some changes in our cargo strings, resulting in some missing. */
8098
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   256
	TEXID_TO_STRINGID(0x000E, 0x002D, STR_000E);
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   257
	TEXID_TO_STRINGID(0x002E, 0x004D, STR_002E);
8375
4f557c447806 (svn r11429) -Fix (r11129): some TextID to StringID 'translations' didn't follow our format
glx
parents: 8369
diff changeset
   258
	if (str >= 0x004E && str <= 0x006D) str = units_volume[str - 0x004E];
8098
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   259
	TEXID_TO_STRINGID(0x006E, 0x008D, STR_QUANTITY_NOTHING);
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   260
	TEXID_TO_STRINGID(0x008E, 0x00AD, STR_ABBREV_NOTHING);
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   261
8646
cdf6b29351d0 (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8640
diff changeset
   262
	/* Map building names according to our lang file changes. There are several
cdf6b29351d0 (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8640
diff changeset
   263
	 * ranges of house ids, all of which need to be remapped to allow newgrfs
cdf6b29351d0 (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8640
diff changeset
   264
	 * to use original house names. */
8098
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   265
	TEXID_TO_STRINGID(0x200F, 0x201F, STR_200F_TALL_OFFICE_BLOCK);
8646
cdf6b29351d0 (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8640
diff changeset
   266
	TEXID_TO_STRINGID(0x2036, 0x2041, STR_2036_COTTAGES);
cdf6b29351d0 (svn r11712) -Fix (r9315): Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids.
maedhros
parents: 8640
diff changeset
   267
	TEXID_TO_STRINGID(0x2059, 0x205C, STR_2059_IGLOO);
8098
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   268
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   269
	/* Same thing for industries, since the introduction of 4 new strings above STR_482A_PRODUCTION_LAST_MONTH */
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   270
	TEXID_TO_STRINGID(0x482A, 0x483B, STR_482A_PRODUCTION_LAST_MONTH);
e6088f363c48 (svn r11129) -Fix: update some TextID to StringID 'translations' to reflect changes in language files
glx
parents: 8066
diff changeset
   271
#undef TEXTID_TO_STRINGID
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   272
8101
fd60816a6c13 (svn r11132) -Fix: NewGRFs seem to assume that STR_NULL is an empty string or so.
rubidium
parents: 8098
diff changeset
   273
	if (str == STR_NULL) return STR_EMPTY;
fd60816a6c13 (svn r11132) -Fix: NewGRFs seem to assume that STR_NULL is an empty string or so.
rubidium
parents: 8098
diff changeset
   274
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   275
	return str;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   276
}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   277
6701
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   278
static uint8 MapDOSColour(uint8 colour)
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   279
{
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   280
	if (_use_dos_palette) return colour;
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   281
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   282
	if (colour < 10) {
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   283
		static uint8 dos_to_win_colour_map[] = { 0, 215, 216, 136, 88, 106, 32, 33, 40, 245 };
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   284
		return dos_to_win_colour_map[colour];
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   285
	}
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   286
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   287
	if (colour >= 245 && colour < 254) return colour - 28;
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   288
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   289
	return colour;
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   290
}
d4c3cb84e494 (svn r9438) -Codechange: Map cargo colours from DOS to Windows if necessary.
peter1138
parents: 6699
diff changeset
   291
9073
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   292
/** Map the colour modifiers of TTDPatch to those that Open is using.
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   293
 * @param grf_sprite pointer to the structure been modified
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   294
 */
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   295
static void MapSpriteMappingRecolour(PalSpriteID *grf_sprite)
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   296
{
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   297
	if (HasBit(grf_sprite->pal, 14)) {
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   298
		ClrBit(grf_sprite->pal, 14);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   299
		SetBit(grf_sprite->sprite, SPRITE_MODIFIER_OPAQUE);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   300
	}
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   301
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   302
	if (HasBit(grf_sprite->sprite, 14)) {
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   303
		ClrBit(grf_sprite->sprite, 14);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   304
		SetBit(grf_sprite->sprite, PALETTE_MODIFIER_TRANSPARENT);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   305
	}
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   306
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   307
	if (HasBit(grf_sprite->sprite, 15)) {
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   308
		ClrBit(grf_sprite->sprite, 15);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   309
		SetBit(grf_sprite->sprite, PALETTE_MODIFIER_COLOR);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   310
	}
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   311
}
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
   312
360
ff657281ae48 (svn r548) -newgrf: minor style changes, and application of boolean type
darkvater
parents: 359
diff changeset
   313
typedef bool (*VCI_Handler)(uint engine, int numinfo, int prop, byte **buf, int len);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   314
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   315
static void dewagonize(int condition, int engine)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   316
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   317
	EngineInfo *ei = &_engine_info[engine];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   318
	RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   319
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
   320
	if (condition != 0) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   321
		ei->unk2 &= ~0x80;
6356
688f81d17aec (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: 6223
diff changeset
   322
		if (rvi->railveh_type == RAILVEH_WAGON)
688f81d17aec (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: 6223
diff changeset
   323
			rvi->railveh_type = RAILVEH_SINGLEHEAD;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   324
	} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   325
		ei->unk2 |= 0x80;
6119
b47985557d1e (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: 6106
diff changeset
   326
		rvi->railveh_type = RAILVEH_WAGON;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   327
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   328
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   329
360
ff657281ae48 (svn r548) -newgrf: minor style changes, and application of boolean type
darkvater
parents: 359
diff changeset
   330
static bool RailVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   331
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   332
	byte *buf = *bufp;
360
ff657281ae48 (svn r548) -newgrf: minor style changes, and application of boolean type
darkvater
parents: 359
diff changeset
   333
	bool ret = false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   334
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   335
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   336
		EngineInfo *ei       = &_engine_info[engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   337
		RailVehicleInfo *rvi = &_rail_vehicle_info[engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   338
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   339
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   340
			case 0x05: { // Track type
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   341
				uint8 tracktype = grf_load_byte(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   342
3026
6401a6942660 (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
				switch (tracktype) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   344
					case 0: rvi->railtype = rvi->engclass >= 2 ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   345
					case 1: rvi->railtype = RAILTYPE_MONO; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   346
					case 2: rvi->railtype = RAILTYPE_MAGLEV; break;
3026
6401a6942660 (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
   347
					default:
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   348
						grfmsg(1, "RailVehicleChangeInfo: Invalid track type %d specified, ignoring", tracktype);
3026
6401a6942660 (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
   349
						break;
6401a6942660 (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
   350
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   351
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   352
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   353
			case 0x08: // AI passenger service
8945
8cb92ac1b2fb (svn r12019) -Codechange: Add support for passenger engine designation for AI-use, NewGRF property 0x08 for trains.
peter1138
parents: 8927
diff changeset
   354
				/* Tells the AI that this engine is designed for
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
   355
				 * passenger services and shouldn't be used for freight. */
8945
8cb92ac1b2fb (svn r12019) -Codechange: Add support for passenger engine designation for AI-use, NewGRF property 0x08 for trains.
peter1138
parents: 8927
diff changeset
   356
				rvi->ai_passenger_only = grf_load_byte(&buf);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   357
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   358
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   359
			case 0x09: { // Speed (1 unit is 1 kmh)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   360
				uint16 speed = grf_load_word(&buf);
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   361
				if (speed == 0xFFFF) speed = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   362
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   363
				rvi->max_speed = speed;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   364
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   365
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   366
			case 0x0B: { // Power
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   367
				uint16 power = grf_load_word(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   368
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   369
				if (rvi->railveh_type == RAILVEH_MULTIHEAD) power /= 2;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   370
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   371
				rvi->power = power;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   372
				dewagonize(power, engine + i);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   373
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   374
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   375
			case 0x0D: { // Running cost factor
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   376
				uint8 runcostfact = grf_load_byte(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   377
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   378
				if (rvi->railveh_type == RAILVEH_MULTIHEAD) runcostfact /= 2;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   379
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   380
				rvi->running_cost_base = runcostfact;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   381
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   382
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   383
			case 0x0E: { // Running cost base
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   384
				uint32 base = grf_load_dword(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   385
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   386
				switch (base) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   387
					case 0x4C30: rvi->running_cost_class = 0; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   388
					case 0x4C36: rvi->running_cost_class = 1; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   389
					case 0x4C3C: rvi->running_cost_class = 2; break;
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
   390
					case 0: break; // Used by wagons
5324
b2429a2def00 (svn r7485) -Codechange: [NewGRF] Add debug warning for unsupported running cost bases for rail vehicles.
peter1138
parents: 5317
diff changeset
   391
					default:
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   392
						grfmsg(1, "RailVehicleChangeInfo: Unsupported running cost base 0x%04X, ignoring", base);
5324
b2429a2def00 (svn r7485) -Codechange: [NewGRF] Add debug warning for unsupported running cost bases for rail vehicles.
peter1138
parents: 5317
diff changeset
   393
						break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   394
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   395
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   396
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   397
			case 0x12: { // Sprite ID
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   398
				uint8 spriteid = grf_load_byte(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   399
2895
943612f25754 (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
				/* TTD sprite IDs point to a location in a 16bit array, but we use it
943612f25754 (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
   401
				 * as an array index, so we need it to be half the original value. */
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   402
				if (spriteid < 0xFD) spriteid >>= 1;
2895
943612f25754 (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
   403
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   404
				rvi->image_index = spriteid;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   405
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   406
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   407
			case 0x13: { // Dual-headed
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   408
				uint8 dual = grf_load_byte(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   409
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
   410
				if (dual != 0) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   411
					if (rvi->railveh_type != RAILVEH_MULTIHEAD) {
2836
b5e8424f5955 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   412
						// adjust power and running cost if needed
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   413
						rvi->power /= 2;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   414
						rvi->running_cost_base /= 2;
2836
b5e8424f5955 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   415
					}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   416
					rvi->railveh_type = RAILVEH_MULTIHEAD;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   417
				} else {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   418
					if (rvi->railveh_type == RAILVEH_MULTIHEAD) {
2836
b5e8424f5955 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   419
						// adjust power and running cost if needed
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   420
						rvi->power *= 2;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   421
						rvi->running_cost_base *= 2;
2836
b5e8424f5955 (svn r3384) - NewGRF fix: running cost should be halved for dual head vehicles.
peter1138
parents: 2812
diff changeset
   422
					}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   423
					rvi->railveh_type = rvi->power == 0 ?
6126
40a18030c3aa (svn r8465) -Regression (r8455): Switching from dual to single head should switch to wagon if power is zero. .Or something.
peter1138
parents: 6119
diff changeset
   424
						RAILVEH_WAGON : RAILVEH_SINGLEHEAD;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   425
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   426
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   427
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   428
			case 0x14: // Cargo capacity
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   429
				rvi->capacity = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   430
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   431
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   432
			case 0x15: { // Cargo type
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   433
				uint8 ctype = grf_load_byte(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   434
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
   435
				if (ctype < NUM_CARGO && HasBit(_cargo_mask, ctype)) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   436
					rvi->cargo_type = ctype;
2846
ac8731dd4121 (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
				} else {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   438
					rvi->cargo_type = CT_INVALID;
6468
29a9bd549d0b (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: 6465
diff changeset
   439
					grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
2846
ac8731dd4121 (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
   440
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   441
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   442
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   443
			case 0x16: // Weight
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   444
				SB(rvi->weight, 0, 8, grf_load_byte(&buf));
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   445
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   446
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   447
			case 0x17: // Cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   448
				rvi->base_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   449
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   450
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   451
			case 0x18: // AI rank
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   452
				rvi->ai_rank = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   453
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   454
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   455
			case 0x19: { // Engine traction type
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   456
				/* What do the individual numbers mean?
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   457
				 * 0x00 .. 0x07: Steam
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   458
				 * 0x08 .. 0x27: Diesel
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   459
				 * 0x28 .. 0x31: Electric
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   460
				 * 0x32 .. 0x37: Monorail
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   461
				 * 0x38 .. 0x41: Maglev
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   462
				 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   463
				uint8 traction = grf_load_byte(&buf);
7077
a76fe9c65fcb (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 7075
diff changeset
   464
				EngineClass engclass;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   465
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   466
				if (traction <= 0x07) {
7077
a76fe9c65fcb (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 7075
diff changeset
   467
					engclass = EC_STEAM;
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   468
				} else if (traction <= 0x27) {
7077
a76fe9c65fcb (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 7075
diff changeset
   469
					engclass = EC_DIESEL;
3355
a653b8e47f27 (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
   470
				} else if (traction <= 0x31) {
7077
a76fe9c65fcb (svn r9795) -Codechange: enumify the EngineClass.
rubidium
parents: 7075
diff changeset
   471
					engclass = EC_ELECTRIC;
7081
279d45234afe (svn r9799) -Codechange: separate engine class and engine running cost class (mart3p).
rubidium
parents: 7079
diff changeset
   472
				} else if (traction <= 0x37) {
279d45234afe (svn r9799) -Codechange: separate engine class and engine running cost class (mart3p).
rubidium
parents: 7079
diff changeset
   473
					engclass = EC_MONORAIL;
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   474
				} else if (traction <= 0x41) {
7081
279d45234afe (svn r9799) -Codechange: separate engine class and engine running cost class (mart3p).
rubidium
parents: 7079
diff changeset
   475
					engclass = EC_MAGLEV;
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   476
				} else {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   477
					break;
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   478
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   479
				if (rvi->railtype == RAILTYPE_RAIL     && engclass >= EC_ELECTRIC) rvi->railtype = RAILTYPE_ELECTRIC;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   480
				if (rvi->railtype == RAILTYPE_ELECTRIC && engclass  < EC_ELECTRIC) rvi->railtype = RAILTYPE_RAIL;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   481
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   482
				rvi->engclass = engclass;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   483
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   484
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   485
			case 0x1A: { // Alter purchase list sort order
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   486
				EngineID pos = grf_load_byte(&buf);
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   487
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   488
				if (pos < NUM_TRAIN_ENGINES) {
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   489
					AlterRailVehListOrder(engine + i, pos);
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   490
				} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   491
					grfmsg(2, "RailVehicleChangeInfo: Invalid train engine ID %d, ignoring", pos);
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
   492
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   493
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   494
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   495
			case 0x1B: // Powered wagons power bonus
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   496
				rvi->pow_wag_power = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   497
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   498
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   499
			case 0x1C: // Refit cost
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   500
				ei->refit_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   501
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   502
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   503
			case 0x1D: // Refit cargo
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   504
				ei->refit_mask = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   505
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   506
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   507
			case 0x1E: // Callback
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   508
				ei->callbackmask = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   509
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   510
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   511
			case 0x1F: // Tractive effort coefficient
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   512
				rvi->tractive_effort = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   513
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   514
8287
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   515
			case 0x20: // Air drag
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   516
				/** @todo Air drag for trains. */
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   517
				grf_load_byte(&buf);
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   518
				ret = true;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   519
				break;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   520
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   521
			case 0x21: // Shorter vehicle
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   522
				rvi->shorten_factor = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   523
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   524
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   525
			case 0x22: // Visual effect
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
   526
				/** @see note in engine.h about rvi->visual_effect */
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   527
				rvi->visual_effect = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   528
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   529
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   530
			case 0x23: // Powered wagons weight bonus
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   531
				rvi->pow_wag_weight = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   532
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   533
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   534
			case 0x24: { // High byte of vehicle weight
2542
fdea27216e48 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   535
				byte weight = grf_load_byte(&buf);
fdea27216e48 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   536
2545
d1965652e523 (svn r3074) -NewGrf: Fix stupid typo in weight setting.
peter1138
parents: 2542
diff changeset
   537
				if (weight > 4) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   538
					grfmsg(2, "RailVehicleChangeInfo: Nonsensical weight of %d tons, ignoring", weight << 8);
2542
fdea27216e48 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   539
				} else {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   540
					SB(rvi->weight, 8, 8, weight);
2542
fdea27216e48 (svn r3071) -NewGRF: Add support for rail vehicle weight greater than 255 tons.
peter1138
parents: 2530
diff changeset
   541
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   542
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   543
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   544
			case 0x25: // User-defined bit mask to set when checking veh. var. 42
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   545
				rvi->user_def_data = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   546
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   547
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   548
			case 0x26: // Retire vehicle early
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   549
				ei->retire_early = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   550
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   551
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   552
			case 0x27: // Miscellaneous flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   553
				ei->misc_flags = grf_load_byte(&buf);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
   554
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   555
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   556
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   557
			case 0x28: // Cargo classes allowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   558
				cargo_allowed[engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   559
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   560
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   561
			case 0x29: // Cargo classes disallowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   562
				cargo_disallowed[engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   563
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   564
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   565
			case 0x2A: // Long format introduction date (days since year 0)
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   566
				ei->base_intro = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   567
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   568
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   569
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   570
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   571
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   572
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   573
	}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   574
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   575
	*bufp = buf;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   576
	return ret;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   577
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   578
378
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   579
static bool RoadVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   580
{
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   581
	byte *buf = *bufp;
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   582
	bool ret = false;
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   583
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   584
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   585
		EngineInfo *ei       = &_engine_info[ROAD_ENGINES_INDEX + engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   586
		RoadVehicleInfo *rvi = &_road_vehicle_info[engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   587
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   588
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   589
			case 0x08: // Speed (1 unit is 0.5 kmh)
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   590
				rvi->max_speed = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   591
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   592
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   593
			case 0x09: // Running cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   594
				rvi->running_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   595
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   596
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   597
			case 0x0A: // Running cost base
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
   598
				/** @todo : I have no idea. --pasky
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   599
				 * I THINK it is used for overriding the base cost of all road vehicle (_price.roadveh_base) --belugas */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   600
				grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   601
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   602
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   603
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   604
			case 0x0E: { // Sprite ID
378
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   605
				uint8 spriteid = grf_load_byte(&buf);
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   606
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
   607
				/* cars have different custom id in the GRF file */
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   608
				if (spriteid == 0xFF) spriteid = 0xFD;
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   609
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   610
				if (spriteid < 0xFD) spriteid >>= 1;
2895
943612f25754 (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
   611
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   612
				rvi->image_index = spriteid;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   613
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   614
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   615
			case 0x0F: // Cargo capacity
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   616
				rvi->capacity = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   617
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   618
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   619
			case 0x10: { // Cargo type
378
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   620
				uint8 cargo = grf_load_byte(&buf);
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   621
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
   622
				if (cargo < NUM_CARGO && HasBit(_cargo_mask, cargo)) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   623
					rvi->cargo_type = cargo;
2846
ac8731dd4121 (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
				} else {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   625
					rvi->cargo_type = CT_INVALID;
6468
29a9bd549d0b (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: 6465
diff changeset
   626
					grfmsg(2, "RoadVehicleChangeInfo: Invalid cargo type %d, using first refittable", cargo);
2846
ac8731dd4121 (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
   627
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   628
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   629
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   630
			case 0x11: // Cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   631
				rvi->base_cost = grf_load_byte(&buf); // ?? is it base_cost?
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   632
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   633
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   634
			case 0x12: // SFX
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   635
				rvi->sfx = (SoundFx)grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   636
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   637
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   638
			case 0x13: // Power in 10hp
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   639
			case 0x14: // Weight in 1/4 tons
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   640
			case 0x15: // Speed in mph*0.8
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
   641
				/** @todo Support for road vehicles realistic power
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   642
				 * computations (called rvpower in TTDPatch) is just
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   643
				 * missing in OTTD yet. --pasky */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   644
				grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   645
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   646
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   647
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   648
			case 0x16: // Cargos available for refitting
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   649
				ei->refit_mask = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   650
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   651
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   652
			case 0x17: // Callback mask
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   653
				ei->callbackmask = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   654
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   655
8287
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   656
			case 0x18: // Tractive effort
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   657
			case 0x19: // Air drag
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   658
				/** @todo Tractive effort and air drag for road vehicles. */
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   659
				grf_load_byte(&buf);
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   660
				ret = true;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   661
				break;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   662
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   663
			case 0x1A: // Refit cost
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   664
				ei->refit_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   665
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   666
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   667
			case 0x1B: // Retire vehicle early
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   668
				ei->retire_early = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   669
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   670
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   671
			case 0x1C: // Miscellaneous flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   672
				ei->misc_flags = grf_load_byte(&buf);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
   673
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   674
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   675
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   676
			case 0x1D: // Cargo classes allowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   677
				cargo_allowed[ROAD_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   678
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   679
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   680
			case 0x1E: // Cargo classes disallowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   681
				cargo_disallowed[ROAD_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   682
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   683
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   684
			case 0x1F: // Long format introduction date (days since year 0)
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   685
				ei->base_intro = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   686
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   687
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   688
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   689
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   690
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   691
		}
378
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   692
	}
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   693
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   694
	*bufp = buf;
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   695
	return ret;
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   696
}
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
   697
360
ff657281ae48 (svn r548) -newgrf: minor style changes, and application of boolean type
darkvater
parents: 359
diff changeset
   698
static bool ShipVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   699
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   700
	byte *buf = *bufp;
360
ff657281ae48 (svn r548) -newgrf: minor style changes, and application of boolean type
darkvater
parents: 359
diff changeset
   701
	bool ret = false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   702
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   703
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   704
		EngineInfo *ei       = &_engine_info[SHIP_ENGINES_INDEX + engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   705
		ShipVehicleInfo *svi = &_ship_vehicle_info[engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   706
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   707
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   708
			case 0x08: { // Sprite ID
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   709
				uint8 spriteid = grf_load_byte(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   710
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
   711
				/* ships have different custom id in the GRF file */
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   712
				if (spriteid == 0xFF) spriteid = 0xFD;
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   713
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   714
				if (spriteid < 0xFD) spriteid >>= 1;
2895
943612f25754 (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
   715
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   716
				svi->image_index = spriteid;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   717
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   718
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   719
			case 0x09: // Refittable
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   720
				svi->refittable = (grf_load_byte(&buf) != 0);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   721
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   722
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   723
			case 0x0A: // Cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   724
				svi->base_cost = grf_load_byte(&buf); // ?? is it base_cost?
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   725
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   726
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   727
			case 0x0B: // Speed (1 unit is 0.5 kmh)
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   728
				svi->max_speed = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   729
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   730
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   731
			case 0x0C: { // Cargo type
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   732
				uint8 cargo = grf_load_byte(&buf);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   733
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
   734
				if (cargo < NUM_CARGO && HasBit(_cargo_mask, cargo)) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   735
					svi->cargo_type = cargo;
2846
ac8731dd4121 (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
				} else {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   737
					svi->cargo_type = CT_INVALID;
6468
29a9bd549d0b (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: 6465
diff changeset
   738
					grfmsg(2, "ShipVehicleChangeInfo: Invalid cargo type %d, using first refittable", cargo);
2846
ac8731dd4121 (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
   739
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   740
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   741
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   742
			case 0x0D: // Cargo capacity
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   743
				svi->capacity = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   744
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   745
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   746
			case 0x0F: // Running cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   747
				svi->running_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   748
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   749
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   750
			case 0x10: // SFX
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   751
				svi->sfx = (SoundFx)grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   752
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   753
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   754
			case 0x11: // Cargos available for refitting
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   755
				ei->refit_mask = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   756
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   757
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   758
			case 0x12: // Callback mask
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   759
				ei->callbackmask = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   760
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   761
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   762
			case 0x13: // Refit cost
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   763
				ei->refit_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   764
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   765
8287
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   766
			case 0x14: // Ocean speed fraction
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   767
			case 0x15: // Canal speed fraction
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   768
				/** @todo Speed fractions for ships on oceans and canals */
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   769
				grf_load_byte(&buf);
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   770
				ret = true;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   771
				break;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
   772
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   773
			case 0x16: // Retire vehicle early
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   774
				ei->retire_early = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   775
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   776
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   777
			case 0x17: // Miscellaneous flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   778
				ei->misc_flags = grf_load_byte(&buf);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
   779
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   780
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   781
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   782
			case 0x18: // Cargo classes allowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   783
				cargo_allowed[SHIP_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   784
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   785
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   786
			case 0x19: // Cargo classes disallowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   787
				cargo_disallowed[SHIP_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   788
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   789
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   790
			case 0x1A: // Long format introduction date (days since year 0)
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   791
				ei->base_intro = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   792
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   793
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   794
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   795
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   796
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   797
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   798
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   799
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   800
	*bufp = buf;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   801
	return ret;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   802
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   803
381
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   804
static bool AircraftVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   805
{
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   806
	byte *buf = *bufp;
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   807
	bool ret = false;
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   808
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   809
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   810
		EngineInfo *ei           = &_engine_info[AIRCRAFT_ENGINES_INDEX + engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   811
		AircraftVehicleInfo *avi = &_aircraft_vehicle_info[engine + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   812
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   813
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   814
			case 0x08: { // Sprite ID
381
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   815
				uint8 spriteid = grf_load_byte(&buf);
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   816
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
   817
				/* aircraft have different custom id in the GRF file */
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   818
				if (spriteid == 0xFF) spriteid = 0xFD;
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   819
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
   820
				if (spriteid < 0xFD) spriteid >>= 1;
2895
943612f25754 (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
   821
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   822
				avi->image_index = spriteid;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   823
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   824
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   825
			case 0x09: // Helicopter
4926
f67f27fb122f (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   826
				if (grf_load_byte(&buf) == 0) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   827
					avi->subtype = AIR_HELI;
4926
f67f27fb122f (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   828
				} else {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   829
					SB(avi->subtype, 0, 1, 1); // AIR_CTOL
4926
f67f27fb122f (svn r6906) - Fix [FS#370]: Clear 'large plane' flag if 'helicopter' flag is set. (mart3p)
peter1138
parents: 4918
diff changeset
   830
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   831
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   832
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   833
			case 0x0A: // Large
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   834
				SB(avi->subtype, 1, 1, (grf_load_byte(&buf) != 0 ? 1 : 0)); // AIR_FAST
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   835
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   836
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   837
			case 0x0B: // Cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   838
				avi->base_cost = grf_load_byte(&buf); // ?? is it base_cost?
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   839
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   840
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   841
			case 0x0C: // Speed (1 unit is 8 mph, we translate to 1 unit is 1 km/h)
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   842
				avi->max_speed = (grf_load_byte(&buf) * 129) / 10;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   843
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   844
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   845
			case 0x0D: // Acceleration
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   846
				avi->acceleration = (grf_load_byte(&buf) * 129) / 10;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   847
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   848
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   849
			case 0x0E: // Running cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   850
				avi->running_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   851
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   852
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   853
			case 0x0F: // Passenger capacity
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   854
				avi->passenger_capacity = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   855
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   856
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   857
			case 0x11: // Mail capacity
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   858
				avi->mail_capacity = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   859
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   860
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   861
			case 0x12: // SFX
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   862
				avi->sfx = (SoundFx)grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   863
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   864
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   865
			case 0x13: // Cargos available for refitting
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   866
				ei->refit_mask = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   867
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   868
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   869
			case 0x14: // Callback mask
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   870
				ei->callbackmask = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   871
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   872
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   873
			case 0x15: // Refit cost
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   874
				ei->refit_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   875
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   876
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   877
			case 0x16: // Retire vehicle early
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   878
				ei->retire_early = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   879
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   880
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   881
			case 0x17: // Miscellaneous flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   882
				ei->misc_flags = grf_load_byte(&buf);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
   883
				_loaded_newgrf_features.has_2CC |= HasBit(ei->misc_flags, EF_USES_2CC);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   884
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   885
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   886
			case 0x18: // Cargo classes allowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   887
				cargo_allowed[AIRCRAFT_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   888
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   889
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   890
			case 0x19: // Cargo classes disallowed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   891
				cargo_disallowed[AIRCRAFT_ENGINES_INDEX + engine + i] = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   892
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   893
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   894
			case 0x1A: // Long format introduction date (days since year 0)
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   895
				ei->base_intro = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   896
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   897
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   898
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   899
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   900
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   901
		}
381
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   902
	}
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   903
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   904
	*bufp = buf;
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   905
	return ret;
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   906
}
94c4794d6bd4 (svn r570) -newgrf: Support for custom aircrafts via GRF files. Planeset seems to work :). Also use aircraft_vehinfo() instead of the old tables (pasky).
darkvater
parents: 379
diff changeset
   907
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   908
static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int len)
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   909
{
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   910
	byte *buf = *bufp;
3505
e9a3a6b79561 (svn r4356) - NewGRF: Load more newstation properties.
peter1138
parents: 3504
diff changeset
   911
	bool ret = false;
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   912
3768
46d328178509 (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
	if (stid + numinfo > MAX_STATIONS) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
   914
		grfmsg(1, "StationChangeInfo: Station %u is invalid, max %u, ignoring", stid + numinfo, MAX_STATIONS);
3768
46d328178509 (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
   915
		return false;
46d328178509 (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
   916
	}
46d328178509 (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
3501
cf7d2c33e7fc (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
   918
	/* Allocate station specs if necessary */
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
   919
	if (_cur_grffile->stations == NULL) _cur_grffile->stations = CallocT<StationSpec*>(MAX_STATIONS);
3768
46d328178509 (svn r4760) - Newstations: change the way custom stations are allocated when loading from GRF, as the current way was flawed (reallocing memory which is referenced elsewhere)
peter1138
parents: 3761
diff changeset
   920
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   921
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   922
		StationSpec *statspec = _cur_grffile->stations[stid + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   923
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   924
		/* Check that the station we are modifying is defined. */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   925
		if (statspec == NULL && prop != 0x08) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   926
			grfmsg(2, "StationChangeInfo: Attempt to modify undefined station %u, ignoring", stid + i);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   927
			continue;
3501
cf7d2c33e7fc (svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.
peter1138
parents: 3488
diff changeset
   928
		}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   929
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   930
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   931
			case 0x08: { // Class ID
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   932
				StationSpec **spec = &_cur_grffile->stations[stid + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   933
3768
46d328178509 (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
   934
				/* Property 0x08 is special; it is where the station is allocated */
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   935
				if (*spec == NULL) *spec = CallocT<StationSpec>(1);
3768
46d328178509 (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
   936
3711
4a0d1c635b56 (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
   937
				/* Swap classid because we read it in BE meaning WAYP or DFLT */
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
   938
				uint32 classid = grf_load_dword(&buf);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   939
				(*spec)->sclass = AllocateStationClass(BSWAP32(classid));
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   940
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   941
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   942
			case 0x09: // Define sprite layout
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
   943
				statspec->tiles = grf_load_extended(&buf);
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
   944
				statspec->renderdata = CallocT<DrawTileSprites>(statspec->tiles);
3740
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
   945
				statspec->copied_renderdata = false;
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
   946
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
   947
				for (uint t = 0; t < statspec->tiles; t++) {
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
   948
					DrawTileSprites *dts = &statspec->renderdata[t];
3570
f9749bae861e (svn r4452) - NewGRF: switch to unsigned ints for array indices.
peter1138
parents: 3566
diff changeset
   949
					uint seq_count = 0;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
   950
3737
26341085bbbf (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
   951
					dts->seq = NULL;
9067
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
   952
					dts->ground.sprite = grf_load_word(&buf);
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
   953
					dts->ground.pal = grf_load_word(&buf);
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
   954
					if (dts->ground.sprite == 0) continue;
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
   955
					if (HasBit(dts->ground.pal, 15)) {
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
   956
						ClrBit(dts->ground.pal, 15);
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
   957
						SetBit(dts->ground.sprite, SPRITE_MODIFIER_USE_OFFSET);
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5868
diff changeset
   958
					}
9073
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   959
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   960
					MapSpriteMappingRecolour(&dts->ground);
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
   961
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   962
					while (buf < *bufp + len) {
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   963
						DrawTileSeqStruct *dtss;
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   964
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
   965
						/* no relative bounding box support */
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
   966
						dts->seq = ReallocT((DrawTileSeqStruct*)dts->seq, ++seq_count);
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   967
						dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1];
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   968
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   969
						dtss->delta_x = grf_load_byte(&buf);
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   970
						if ((byte) dtss->delta_x == 0x80) break;
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   971
						dtss->delta_y = grf_load_byte(&buf);
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   972
						dtss->delta_z = grf_load_byte(&buf);
4230
cd86b1c47f33 (svn r5787) Rename width, height and unk of struct DrawTileSeqStruct to size_{x,y,z}
tron
parents: 4201
diff changeset
   973
						dtss->size_x = grf_load_byte(&buf);
cd86b1c47f33 (svn r5787) Rename width, height and unk of struct DrawTileSeqStruct to size_{x,y,z}
tron
parents: 4201
diff changeset
   974
						dtss->size_y = grf_load_byte(&buf);
cd86b1c47f33 (svn r5787) Rename width, height and unk of struct DrawTileSeqStruct to size_{x,y,z}
tron
parents: 4201
diff changeset
   975
						dtss->size_z = grf_load_byte(&buf);
9066
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
   976
						dtss->image.sprite = grf_load_word(&buf);
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
   977
						dtss->image.pal = grf_load_word(&buf);
3771
b34d07131ad1 (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
   978
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3771
diff changeset
   979
						/* Remap flags as ours collide */
9066
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
   980
						if (HasBit(dtss->image.pal, 15)) {
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
   981
							ClrBit(dtss->image.pal, 15);
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
   982
							SetBit(dtss->image.sprite, SPRITE_MODIFIER_USE_OFFSET);
8654
83dc418497a9 (svn r11720) -Codechange: [NewGRF] Add support for bit 30 of station tile layouts; forcing a sprite to always be opaque.
peter1138
parents: 8653
diff changeset
   983
						}
9073
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   984
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
   985
						MapSpriteMappingRecolour(&dtss->image);
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   986
					}
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
   987
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   988
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   989
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   990
			case 0x0A: { // Copy sprite layout
398
20f8a2faf809 (svn r590) -newgrf: Instead of a bunch of statinfo arrays, use station-array of struct StationSpec-s (pasky).
darkvater
parents: 397
diff changeset
   991
				byte srcid = grf_load_byte(&buf);
3768
46d328178509 (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
   992
				const StationSpec *srcstatspec = _cur_grffile->stations[srcid];
398
20f8a2faf809 (svn r590) -newgrf: Instead of a bunch of statinfo arrays, use station-array of struct StationSpec-s (pasky).
darkvater
parents: 397
diff changeset
   993
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
   994
				statspec->tiles = srcstatspec->tiles;
3738
d41775f0f3fb (svn r4720) - Newstations: instead of literally copying sprite layout data, just copy the pointer to the existing data.
peter1138
parents: 3737
diff changeset
   995
				statspec->renderdata = srcstatspec->renderdata;
3740
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
   996
				statspec->copied_renderdata = true;
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   997
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   998
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
   999
			case 0x0B: // Callback mask
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1000
				statspec->callbackmask = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1001
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1002
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1003
			case 0x0C: // Disallowed number of platforms
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1004
				statspec->disallowed_platforms = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1005
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1006
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1007
			case 0x0D: // Disallowed platform lengths
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1008
				statspec->disallowed_lengths = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1009
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1010
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1011
			case 0x0E: // Define custom layout
5060
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1012
				statspec->copied_layouts = false;
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1013
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1014
				while (buf < *bufp + len) {
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1015
					byte length = grf_load_byte(&buf);
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1016
					byte number = grf_load_byte(&buf);
449
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1017
					StationLayout layout;
3570
f9749bae861e (svn r4452) - NewGRF: switch to unsigned ints for array indices.
peter1138
parents: 3566
diff changeset
  1018
					uint l, p;
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1019
449
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1020
					if (length == 0 || number == 0) break;
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1021
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1022
					//debug("l %d > %d ?", length, stat->lengths);
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1023
					if (length > statspec->lengths) {
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  1024
						statspec->platforms = ReallocT(statspec->platforms, length);
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1025
						memset(statspec->platforms + statspec->lengths, 0, length - statspec->lengths);
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1026
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  1027
						statspec->layouts = ReallocT(statspec->layouts, length);
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1028
						memset(statspec->layouts + statspec->lengths, 0,
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1029
						       (length - statspec->lengths) * sizeof(*statspec->layouts));
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1030
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1031
						statspec->lengths = length;
449
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1032
					}
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1033
					l = length - 1; // index is zero-based
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1034
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1035
					//debug("p %d > %d ?", number, stat->platforms[l]);
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1036
					if (number > statspec->platforms[l]) {
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  1037
						statspec->layouts[l] = ReallocT(statspec->layouts[l], number);
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  1038
						/* We expect NULL being 0 here, but C99 guarantees that. */
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1039
						memset(statspec->layouts[l] + statspec->platforms[l], 0,
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1040
						       (number - statspec->platforms[l]) * sizeof(**statspec->layouts));
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1041
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1042
						statspec->platforms[l] = number;
449
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1043
					}
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1044
542
2f35c4770b06 (svn r939) -Fix: Fixed compiler errors
truelight
parents: 536
diff changeset
  1045
					p = 0;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  1046
					layout = MallocT<byte>(length * number);
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1047
					for (l = 0; l < length; l++) {
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1048
						for (p = 0; p < number; p++) {
449
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1049
							layout[l * number + p] = grf_load_byte(&buf);
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1050
						}
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  1051
					}
449
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1052
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1053
					l--;
d9325d9f24bb (svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)
tron
parents: 448
diff changeset
  1054
					p--;
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1055
					free(statspec->layouts[l][p]);
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3672
diff changeset
  1056
					statspec->layouts[l][p] = layout;
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1057
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1058
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1059
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1060
			case 0x0F: { // Copy custom layout
5060
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1061
				byte srcid = grf_load_byte(&buf);
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1062
				const StationSpec *srcstatspec = _cur_grffile->stations[srcid];
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1063
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1064
				statspec->lengths   = srcstatspec->lengths;
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1065
				statspec->platforms = srcstatspec->platforms;
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1066
				statspec->layouts   = srcstatspec->layouts;
2d577061b0ec (svn r7113) -Codechange: [NewStations] Add support for copying custom station layouts
peter1138
parents: 5037
diff changeset
  1067
				statspec->copied_layouts = true;
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1068
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1069
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1070
			case 0x10: // Little/lots cargo threshold
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1071
				statspec->cargo_threshold = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1072
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1073
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1074
			case 0x11: // Pylon placement
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1075
				statspec->pylons = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1076
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1077
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1078
			case 0x12: // Cargo types for random triggers
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1079
				statspec->cargo_triggers = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1080
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1081
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1082
			case 0x13: // General flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1083
				statspec->flags = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1084
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1085
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1086
			case 0x14: // Overhead wire placement
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1087
				statspec->wires = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1088
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1089
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1090
			case 0x15: // Blocked tiles
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1091
				statspec->blocked = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1092
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1093
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1094
			case 0x16: // @todo Animation info
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1095
				grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1096
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1097
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1098
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1099
			case 0x17: // @todo Animation speed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1100
				grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1101
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1102
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1103
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1104
			case 0x18: // @todo Animation triggers
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1105
				grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1106
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1107
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1108
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1109
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1110
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1111
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1112
		}
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1113
	}
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1114
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1115
	*bufp = buf;
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1116
	return ret;
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1117
}
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1118
8868
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1119
static bool CanalChangeInfo(uint id, int numinfo, int prop, byte **bufp, int len)
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1120
{
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1121
	byte *buf = *bufp;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1122
	bool ret = false;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1123
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1124
	if (id + numinfo > CF_END) {
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1125
		grfmsg(1, "CanalChangeInfo: Canal feature %u is invalid, max %u, ignoreing", id + numinfo, CF_END);
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1126
		return false;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1127
	}
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1128
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1129
	for (int i = 0; i < numinfo; i++) {
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1130
		WaterFeature *wf = &_water_feature[id + i];
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1131
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1132
		switch (prop) {
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1133
			case 0x08:
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1134
				wf->callbackmask = grf_load_byte(&buf);
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1135
				break;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1136
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1137
			case 0x09:
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1138
				wf->flags = grf_load_byte(&buf);
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1139
				break;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1140
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1141
			default:
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1142
				ret = true;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1143
				break;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1144
		}
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1145
	}
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1146
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1147
	*bufp = buf;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1148
	return ret;
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1149
}
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  1150
2478
16b05f1de6bb (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1151
static bool BridgeChangeInfo(uint brid, int numinfo, int prop, byte **bufp, int len)
16b05f1de6bb (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
  1152
{
16b05f1de6bb (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
  1153
	byte *buf = *bufp;
3504
546b53897c01 (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1154
	bool ret = false;
2478
16b05f1de6bb (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1155
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1156
	if (brid + numinfo > MAX_BRIDGES) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1157
		grfmsg(1, "BridgeChangeInfo: Bridge %u is invalid, max %u, ignoring", brid + numinfo, MAX_BRIDGES);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1158
		return false;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1159
	}
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1160
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1161
	for (int i = 0; i < numinfo; i++) {
9031
e260304797e6 (svn r12111) -Codechange: Rename Bridge to BridgeSpec, out of consistensy with other Specs in used.
belugas
parents: 8990
diff changeset
  1162
		BridgeSpec *bridge = &_bridge[brid + i];
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1163
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1164
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1165
			case 0x08: // Year of availability
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1166
				bridge->avail_year = ORIGINAL_BASE_YEAR + grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1167
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1168
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1169
			case 0x09: // Minimum length
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1170
				bridge->min_length = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1171
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1172
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1173
			case 0x0A: // Maximum length
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1174
				bridge->max_length = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1175
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1176
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1177
			case 0x0B: // Cost factor
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1178
				bridge->price = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1179
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1180
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1181
			case 0x0C: // Maximum speed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1182
				bridge->speed = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1183
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1184
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1185
			case 0x0D: { // Bridge sprite tables
2478
16b05f1de6bb (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
  1186
				byte tableid = grf_load_byte(&buf);
16b05f1de6bb (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
  1187
				byte numtables = grf_load_byte(&buf);
16b05f1de6bb (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
  1188
16b05f1de6bb (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
  1189
				if (bridge->sprite_table == NULL) {
3555
7a4f6e2aee0f (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
					/* Allocate memory for sprite table pointers and zero out */
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  1191
					bridge->sprite_table = CallocT<PalSpriteID*>(7);
2478
16b05f1de6bb (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
  1192
				}
16b05f1de6bb (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
  1193
3555
7a4f6e2aee0f (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
  1194
				for (; numtables-- != 0; tableid++) {
7a4f6e2aee0f (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
  1195
					if (tableid >= 7) { // skip invalid data
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1196
						grfmsg(1, "BridgeChangeInfo: Table %d >= 7, skipping", tableid);
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  1197
						for (byte sprite = 0; sprite < 32; sprite++) grf_load_dword(&buf);
3555
7a4f6e2aee0f (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
  1198
						continue;
2478
16b05f1de6bb (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
  1199
					}
3555
7a4f6e2aee0f (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
  1200
7a4f6e2aee0f (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
  1201
					if (bridge->sprite_table[tableid] == NULL) {
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  1202
						bridge->sprite_table[tableid] = MallocT<PalSpriteID>(32);
3555
7a4f6e2aee0f (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
  1203
					}
7a4f6e2aee0f (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
  1204
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  1205
					for (byte sprite = 0; sprite < 32; sprite++) {
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5868
diff changeset
  1206
						SpriteID image = grf_load_word(&buf);
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5868
diff changeset
  1207
						SpriteID pal   = grf_load_word(&buf);
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5868
diff changeset
  1208
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5868
diff changeset
  1209
						bridge->sprite_table[tableid][sprite].sprite = image;
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5868
diff changeset
  1210
						bridge->sprite_table[tableid][sprite].pal    = pal;
9073
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
  1211
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
  1212
						MapSpriteMappingRecolour(&bridge->sprite_table[tableid][sprite]);
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5868
diff changeset
  1213
					}
2478
16b05f1de6bb (svn r3004) -Feature, NewGRF: Support loading of bridge attributes and tables from GRF. Currently drawing tall pillars uses old data.
peter1138
parents: 2476
diff changeset
  1214
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1215
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1216
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1217
			case 0x0E: // Flags; bit 0 - disable far pillars
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1218
				bridge->flags = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1219
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1220
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1221
			case 0x0F: // Long format year of availability (year since year 0)
8418
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8398
diff changeset
  1222
				bridge->avail_year = Clamp(grf_load_dword(&buf), MIN_YEAR, MAX_YEAR);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1223
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1224
8990
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1225
			case 0x10: { // purchase string
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1226
				StringID newone = GetGRFStringID(_cur_grffile->grfid, grf_load_word(&buf));
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1227
				if (newone != STR_UNDEFINED) bridge->material = newone;
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1228
				} break;
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1229
9036
d3b132a4b97a (svn r12118) -Codechange: Put the two descriptions of bridges in an array instead of two single variables, following the transport type it represents
belugas
parents: 9031
diff changeset
  1230
			case 0x11: // description of bridge with rails or roads
d3b132a4b97a (svn r12118) -Codechange: Put the two descriptions of bridges in an array instead of two single variables, following the transport type it represents
belugas
parents: 9031
diff changeset
  1231
			case 0x12: {
8990
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1232
				StringID newone = GetGRFStringID(_cur_grffile->grfid, grf_load_word(&buf));
9036
d3b132a4b97a (svn r12118) -Codechange: Put the two descriptions of bridges in an array instead of two single variables, following the transport type it represents
belugas
parents: 9031
diff changeset
  1233
				if (newone != STR_UNDEFINED) bridge->transport_name[prop - 0x11] = newone;
8990
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1234
				} break;
dcaad4072e7b (svn r12069) -Feature[newGRF]: Specify the purchase, rail and road description of a bridge.
belugas
parents: 8985
diff changeset
  1235
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1236
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1237
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1238
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1239
		}
2478
16b05f1de6bb (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
  1240
	}
16b05f1de6bb (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
  1241
16b05f1de6bb (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
  1242
	*bufp = buf;
16b05f1de6bb (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
  1243
	return ret;
16b05f1de6bb (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
  1244
}
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  1245
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1246
static bool TownHouseChangeInfo(uint hid, int numinfo, int prop, byte **bufp, int len)
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1247
{
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1248
	byte *buf = *bufp;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1249
	bool ret = false;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1250
7657
1b1d190f0272 (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: 7656
diff changeset
  1251
	if (hid + numinfo > HOUSE_MAX) {
1b1d190f0272 (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: 7656
diff changeset
  1252
		grfmsg(1, "TownHouseChangeInfo: Too many houses loaded (%u), max (%u). Ignoring.", hid + numinfo, HOUSE_MAX);
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1253
		return false;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1254
	}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1255
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1256
	/* Allocate house specs if they haven't been allocated already. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1257
	if (_cur_grffile->housespec == NULL) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1258
		_cur_grffile->housespec = CallocT<HouseSpec*>(HOUSE_MAX);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1259
	}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1260
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1261
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1262
		HouseSpec *housespec = _cur_grffile->housespec[hid + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1263
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1264
		if (prop != 0x08 && housespec == NULL) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1265
			grfmsg(2, "TownHouseChangeInfo: Attempt to modify undefined house %u. Ignoring.", hid + i);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1266
			continue;
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1267
		}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1268
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1269
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1270
			case 0x08: { // Substitute building type, and definition of a new house
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1271
				HouseSpec **house = &_cur_grffile->housespec[hid + i];
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1272
				byte subs_id = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1273
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1274
				if (subs_id == 0xFF) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1275
					/* Instead of defining a new house, a substitute house id
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1276
					 * of 0xFF disables the old house with the current id. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1277
					_house_specs[hid + i].enabled = false;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1278
					continue;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1279
				} else if (subs_id >= NEW_HOUSE_OFFSET) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1280
					/* The substitute id must be one of the original houses. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1281
					grfmsg(2, "TownHouseChangeInfo: Attempt to use new house %u as substitute house for %u. Ignoring.", subs_id, hid + i);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1282
					return false;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1283
				}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1284
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1285
				/* Allocate space for this house. */
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1286
				if (*house == NULL) *house = CallocT<HouseSpec>(1);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1287
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1288
				housespec = *house;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1289
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1290
				memcpy(housespec, &_house_specs[subs_id], sizeof(_house_specs[subs_id]));
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1291
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1292
				housespec->enabled = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1293
				housespec->local_id = hid + i;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1294
				housespec->substitute_id = subs_id;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1295
				housespec->grffile = _cur_grffile;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1296
				housespec->random_colour[0] = 0x04;  // those 4 random colours are the base colour
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1297
				housespec->random_colour[1] = 0x08;  // for all new houses
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1298
				housespec->random_colour[2] = 0x0C;  // they stand for red, blue, orange and green
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1299
				housespec->random_colour[3] = 0x06;
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1300
7927
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1301
				/* Make sure that the third cargo type is valid in this
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1302
				 * climate. This can cause problems when copying the properties
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1303
				 * of a house that accepts food, where the new house is valid
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1304
				 * in the temperate climate. */
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1305
				if (!GetCargo(housespec->accepts_cargo[2])->IsValid()) {
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1306
					housespec->cargo_acceptance[2] = 0;
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1307
				}
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1308
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1309
				/**
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1310
				 * New houses do not (currently) expect to have a default start
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1311
				 * date before 1930, as this breaks the build date stuff.
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1312
				 * @see FinaliseHouseArray() for more details.
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1313
				 */
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1314
				if (housespec->min_date < 1930) housespec->min_date = 1930;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1315
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1316
				_loaded_newgrf_features.has_newhouses = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1317
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1318
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1319
			case 0x09: // Building flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1320
				housespec->building_flags = (BuildingFlags)grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1321
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1322
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1323
			case 0x0A: { // Availability years
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1324
				uint16 years = grf_load_word(&buf);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1325
				housespec->min_date = GB(years, 0, 8) > 150 ? MAX_YEAR : ORIGINAL_BASE_YEAR + GB(years, 0, 8);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1326
				housespec->max_date = GB(years, 8, 8) > 150 ? MAX_YEAR : ORIGINAL_BASE_YEAR + GB(years, 8, 8);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1327
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1328
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1329
			case 0x0B: // Population
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1330
				housespec->population = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1331
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1332
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1333
			case 0x0C: // Mail generation multiplier
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1334
				housespec->mail_generation = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1335
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1336
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1337
			case 0x0D: // Passenger acceptance
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1338
			case 0x0E: // Mail acceptance
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1339
				housespec->cargo_acceptance[prop - 0x0D] = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1340
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1341
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1342
			case 0x0F: { // Goods/candy, food/fizzy drinks acceptance
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1343
				int8 goods = grf_load_byte(&buf);
6667
437af4c23305 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6658
diff changeset
  1344
437af4c23305 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6658
diff changeset
  1345
				/* If value of goods is negative, it means in fact food or, if in toyland, fizzy_drink acceptance.
437af4c23305 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6658
diff changeset
  1346
				 * Else, we have "standard" 3rd cargo type, goods or candy, for toyland once more */
7927
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1347
				CargoID cid = (goods >= 0) ? ((_opt.landscape == LT_TOYLAND) ? CT_CANDY : CT_GOODS) :
6683
7ec558346172 (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6676
diff changeset
  1348
						((_opt.landscape == LT_TOYLAND) ? CT_FIZZY_DRINKS : CT_FOOD);
6667
437af4c23305 (svn r9366) -Codechange: Unify the different houses acceptances attributes on their cargo counterpart, as well as specifying cargo slot.
belugas
parents: 6658
diff changeset
  1349
7927
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1350
				/* Make sure the cargo type is valid in this climate. */
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1351
				if (!GetCargo(cid)->IsValid()) goods = 0;
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1352
21746ebe2ddb (svn r10836) -Fix [FS#1014]: Make sure the third cargo type accepted by houses is valid in
maedhros
parents: 7783
diff changeset
  1353
				housespec->accepts_cargo[2] = cid;
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1354
				housespec->cargo_acceptance[2] = abs(goods); // but we do need positive value here
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1355
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1356
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1357
			case 0x10: // Local authority rating decrease on removal
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1358
				housespec->remove_rating_decrease = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1359
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1360
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1361
			case 0x11: // Removal cost multiplier
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1362
				housespec->removal_cost = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1363
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1364
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1365
			case 0x12: // Building name ID
8794
ccb35d65645b (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: 8778
diff changeset
  1366
				housespec->building_name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1367
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1368
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1369
			case 0x13: // Building availability mask
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1370
				housespec->building_availability = (HouseZones)grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1371
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1372
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1373
			case 0x14: // House callback flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1374
				housespec->callback_mask = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1375
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1376
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1377
			case 0x15: { // House override byte
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1378
				byte override = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1379
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1380
				/* The house being overridden must be an original house. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1381
				if (override >= NEW_HOUSE_OFFSET) {
7656
bd97032a569a (svn r10434) -Fix (r9315): When setting multiple house overrides in one Action 0, don't override them all with the first ID.
maedhros
parents: 7655
diff changeset
  1382
					grfmsg(2, "TownHouseChangeInfo: Attempt to override new house %u with house id %u. Ignoring.", override, hid + i);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1383
					continue;
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1384
				}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1385
8369
4decac386a96 (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 8327
diff changeset
  1386
				_house_mngr.Add(hid + i, _cur_grffile->grfid, override);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1387
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1388
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1389
			case 0x16: // Periodic refresh multiplier
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1390
				housespec->processing_time = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1391
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1392
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1393
			case 0x17: // Four random colours to use
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1394
				for (uint j = 0; j < 4; j++) housespec->random_colour[j] = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1395
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1396
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1397
			case 0x18: // Relative probability of appearing
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1398
				housespec->probability = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1399
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1400
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1401
			case 0x19: // Extra flags
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1402
				housespec->extra_flags = (HouseExtraFlags)grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1403
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1404
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1405
			case 0x1A: // Animation frames
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1406
				housespec->animation_frames = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1407
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1408
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1409
			case 0x1B: // Animation speed
8418
b49fc6be1ab9 (svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents: 8398
diff changeset
  1410
				housespec->animation_speed = Clamp(grf_load_byte(&buf), 2, 16);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1411
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1412
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1413
			case 0x1C: // Class of the building type
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1414
				housespec->class_id = AllocateHouseClassID(grf_load_byte(&buf), _cur_grffile->grfid);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1415
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1416
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1417
			case 0x1D: // Callback flags 2
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1418
				housespec->callback_mask |= (grf_load_byte(&buf) << 8);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1419
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1420
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1421
			case 0x1E: { // Accepted cargo types
6957
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1422
				uint32 cargotypes = grf_load_dword(&buf);
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1423
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1424
				/* Check if the cargo types should not be changed */
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1425
				if (cargotypes == 0xFFFFFFFF) break;
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1426
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1427
				for (uint j = 0; j < 3; j++) {
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1428
					/* Get the cargo number from the 'list' */
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1429
					uint8 cargo_part = GB(cargotypes, 8 * j, 8);
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1430
					CargoID cargo = GetCargoTranslation(cargo_part, _cur_grffile);
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1431
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1432
					if (cargo == CT_INVALID) {
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1433
						/* Disable acceptance of invalid cargo type */
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1434
						housespec->cargo_acceptance[j] = 0;
6957
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1435
					} else {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1436
						housespec->accepts_cargo[j] = cargo;
6957
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1437
					}
55b90cc74f67 (svn r9621) -Codechange: implement newgrf house property 1E (cargo types)
peter1138
parents: 6947
diff changeset
  1438
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1439
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1440
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1441
			case 0x1F: // Minimum life span
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1442
				housespec->minimum_life = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1443
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1444
8287
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
  1445
			case 0x20: { // @todo Cargo acceptance watch list
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
  1446
				byte count = grf_load_byte(&buf);
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
  1447
				for (byte j = 0; j < count; j++) grf_load_byte(&buf);
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
  1448
				ret = true;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
  1449
			} break;
5e43bdaf2d8b (svn r11341) -Codechange: add missing callback ID enums, add stub for house property 20 and reorder unimplemented action 0 properties
glx
parents: 8276
diff changeset
  1450
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1451
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1452
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1453
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1454
		}
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1455
	}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1456
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1457
	*bufp = buf;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1458
	return ret;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1459
}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  1460
2506
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1461
static bool GlobalVarChangeInfo(uint gvid, int numinfo, int prop, byte **bufp, int len)
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1462
{
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1463
	byte *buf = *bufp;
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1464
	bool ret = false;
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1465
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1466
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1467
		switch (prop) {
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1468
			case 0x08: { // Cost base factor
2506
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1469
				byte factor = grf_load_byte(&buf);
2508
c1a1af1920ce (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1470
				uint price = gvid + i;
2506
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1471
2508
c1a1af1920ce (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1472
				if (price < NUM_PRICES) {
c1a1af1920ce (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1473
					SetPriceBaseMultiplier(price, factor);
c1a1af1920ce (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1474
				} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1475
					grfmsg(1, "GlobalVarChangeInfo: Price %d out of range, ignoring", price);
2508
c1a1af1920ce (svn r3034) -NewGRF: Improve error checking of setting price bases.
peter1138
parents: 2506
diff changeset
  1476
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1477
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1478
8974
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  1479
			case 0x09: // Cargo translation table
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  1480
				/* This is loaded during the reservation stage, so just skip it here. */
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  1481
				/* Each entry is 4 bytes. */
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  1482
				buf += 4;
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  1483
				break;
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1484
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1485
			case 0x0A: { // Currency display names
4625
3e45c59b5d64 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1486
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
3e45c59b5d64 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1487
				StringID newone = GetGRFStringID(_cur_grffile->grfid, grf_load_word(&buf));
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1488
4504
3d20af4bd525 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  1489
				if ((newone != STR_UNDEFINED) && (curidx < NUM_CURRENCY)) {
3d20af4bd525 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4434
diff changeset
  1490
					_currency_specs[curidx].name = newone;
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1491
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1492
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1493
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1494
			case 0x0B: { // Currency multipliers
4625
3e45c59b5d64 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1495
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1496
				uint32 rate = grf_load_dword(&buf);
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1497
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1498
				if (curidx < NUM_CURRENCY) {
4602
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1499
					/* TTDPatch uses a multiple of 1000 for its conversion calculations,
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1500
					 * which OTTD does not. For this reason, divide grf value by 1000,
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1501
					 * to be compatible */
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1502
					_currency_specs[curidx].rate = rate / 1000;
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1503
				} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1504
					grfmsg(1, "GlobalVarChangeInfo: Currency multipliers %d out of range, ignoring", curidx);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1505
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1506
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1507
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1508
			case 0x0C: { // Currency options
4625
3e45c59b5d64 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1509
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1510
				uint16 options = grf_load_word(&buf);
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1511
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1512
				if (curidx < NUM_CURRENCY) {
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1513
					_currency_specs[curidx].separator = GB(options, 0, 8);
4602
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1514
					/* By specifying only one bit, we prevent errors,
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1515
					 * since newgrf specs said that only 0 and 1 can be set for symbol_pos */
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4504
diff changeset
  1516
					_currency_specs[curidx].symbol_pos = GB(options, 8, 1);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1517
				} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1518
					grfmsg(1, "GlobalVarChangeInfo: Currency option %d out of range, ignoring", curidx);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1519
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1520
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1521
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1522
			case 0x0D: { // Currency prefix symbol
4625
3e45c59b5d64 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1523
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1524
				uint32 tempfix = grf_load_dword(&buf);
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1525
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1526
				if (curidx < NUM_CURRENCY) {
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1527
					memcpy(_currency_specs[curidx].prefix, &tempfix, 4);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1528
					_currency_specs[curidx].prefix[4] = 0;
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1529
				} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1530
					grfmsg(1, "GlobalVarChangeInfo: Currency symbol %d out of range, ignoring", curidx);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1531
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1532
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1533
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1534
			case 0x0E: { // Currency suffix symbol
4625
3e45c59b5d64 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1535
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1536
				uint32 tempfix = grf_load_dword(&buf);
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1537
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1538
				if (curidx < NUM_CURRENCY) {
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6977
diff changeset
  1539
					memcpy(&_currency_specs[curidx].suffix, &tempfix, 4);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1540
					_currency_specs[curidx].suffix[4] = 0;
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1541
				} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1542
					grfmsg(1, "GlobalVarChangeInfo: Currency symbol %d out of range, ignoring", curidx);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1543
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1544
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1545
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1546
			case 0x0F: { //  Euro introduction dates
4625
3e45c59b5d64 (svn r6485) -NewGRF Feature: Match the order of TTDPatch's currencies with those used in OTTD.
belugas
parents: 4602
diff changeset
  1547
				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1548
				Year year_euro = grf_load_word(&buf);
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1549
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1550
				if (curidx < NUM_CURRENCY) {
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1551
					_currency_specs[curidx].to_euro = year_euro;
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1552
				} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1553
					grfmsg(1, "GlobalVarChangeInfo: Euro intro date %d out of range, ignoring", curidx);
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  1554
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1555
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1556
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1557
			case 0x10: // Snow line height table
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1558
				if (numinfo > 1 || IsSnowLineSet()) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1559
					grfmsg(1, "GlobalVarChangeInfo: The snowline can only be set once (%d)", numinfo);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1560
				} else if (len < SNOW_LINE_MONTHS * SNOW_LINE_DAYS) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1561
					grfmsg(1, "GlobalVarChangeInfo: Not enough entries set in the snowline table (%d)", len);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1562
				} else {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1563
					byte table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1564
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1565
					for (uint i = 0; i < SNOW_LINE_MONTHS; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1566
						for (uint j = 0; j < SNOW_LINE_DAYS; j++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1567
							table[i][j] = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1568
						}
6669
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6668
diff changeset
  1569
					}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1570
					SetSnowLine(table);
6669
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6668
diff changeset
  1571
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1572
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1573
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1574
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1575
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1576
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1577
		}
2506
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1578
	}
3504
546b53897c01 (svn r4355) - NewGRF: Minor clean up; use the correct return type and remove extraneous brackets.
peter1138
parents: 3501
diff changeset
  1579
2506
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1580
	*bufp = buf;
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1581
	return ret;
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1582
}
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  1583
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1584
static bool CargoChangeInfo(uint cid, int numinfo, int prop, byte **bufp, int len)
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1585
{
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1586
	byte *buf = *bufp;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1587
	bool ret = false;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1588
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1589
	if (cid + numinfo > NUM_CARGO) {
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1590
		grfmsg(2, "CargoChangeInfo: Cargo type %d out of range (max %d)", cid + numinfo, NUM_CARGO - 1);
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1591
		return false;
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1592
	}
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1593
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1594
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1595
		CargoSpec *cs = &_cargo[cid + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1596
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1597
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1598
			case 0x08: /* Bit number of cargo */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1599
				cs->bitnum = grf_load_byte(&buf);
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1600
				if (cs->IsValid()) {
8214
854acef589c8 (svn r11253) -Fix (r9411): industries can still use cargo they define, even if these cargo are disabled by a grf loaded later
glx
parents: 8213
diff changeset
  1601
					cs->grfid = _cur_grffile->grfid;
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  1602
					SetBit(_cargo_mask, cid + i);
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1603
				} else {
8425
72a71d480c5f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 8424
diff changeset
  1604
					ClrBit(_cargo_mask, cid + i);
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1605
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1606
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1607
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1608
			case 0x09: /* String ID for cargo type name */
8794
ccb35d65645b (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: 8778
diff changeset
  1609
				cs->name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7772
82b58fd5897c (svn r10606) -Fix (r8826): plural and single cargo names were mixed up.
peter1138
parents: 7736
diff changeset
  1610
				break;
82b58fd5897c (svn r10606) -Fix (r8826): plural and single cargo names were mixed up.
peter1138
parents: 7736
diff changeset
  1611
82b58fd5897c (svn r10606) -Fix (r8826): plural and single cargo names were mixed up.
peter1138
parents: 7736
diff changeset
  1612
			case 0x0A: /* String for 1 unit of cargo */
8794
ccb35d65645b (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: 8778
diff changeset
  1613
				cs->name_single = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1614
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1615
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1616
			case 0x0B:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1617
				/* String for units of cargo. This is different in OpenTTD to TTDPatch
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1618
				 * (e.g. 10 tonnes of coal) */
8794
ccb35d65645b (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: 8778
diff changeset
  1619
				cs->units_volume = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1620
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1621
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1622
			case 0x0C: /* String for quantity of cargo (e.g. 10 tonnes of coal) */
8794
ccb35d65645b (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: 8778
diff changeset
  1623
				cs->quantifier = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1624
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1625
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1626
			case 0x0D: /* String for two letter cargo abbreviation */
8794
ccb35d65645b (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: 8778
diff changeset
  1627
				cs->abbrev = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1628
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1629
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1630
			case 0x0E: /* Sprite ID for cargo icon */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1631
				cs->sprite = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1632
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1633
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1634
			case 0x0F: /* Weight of one unit of cargo */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1635
				cs->weight = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1636
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1637
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1638
			case 0x10: /* Used for payment calculation */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1639
				cs->transit_days[0] = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1640
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1641
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1642
			case 0x11: /* Used for payment calculation */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1643
				cs->transit_days[1] = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1644
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1645
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1646
			case 0x12: /* Base cargo price */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1647
				cs->initial_payment = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1648
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1649
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1650
			case 0x13: /* Colour for station rating bars */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1651
				cs->rating_colour = MapDOSColour(grf_load_byte(&buf));
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1652
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1653
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1654
			case 0x14: /* Colour for cargo graph */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1655
				cs->legend_colour = MapDOSColour(grf_load_byte(&buf));
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1656
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1657
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1658
			case 0x15: /* Freight status */
7658
742319a52186 (svn r10436) -Cleanup: Doxygenise some comments, update others, and make a few statements more consistent with everything else.
maedhros
parents: 7657
diff changeset
  1659
				cs->is_freight = (grf_load_byte(&buf) != 0);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1660
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1661
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1662
			case 0x16: /* Cargo classes */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1663
				cs->classes = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1664
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1665
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1666
			case 0x17: /* Cargo label */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1667
				cs->label = grf_load_dword(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1668
				cs->label = BSWAP32(cs->label);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1669
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1670
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1671
			case 0x18: { /* Town growth substitute type */
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1672
				uint8 substitute_type = grf_load_byte(&buf);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1673
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1674
				switch (substitute_type) {
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1675
					case 0x00: cs->town_effect = TE_PASSENGERS; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1676
					case 0x02: cs->town_effect = TE_MAIL; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1677
					case 0x05: cs->town_effect = TE_GOODS; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1678
					case 0x09: cs->town_effect = TE_WATER; break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1679
					case 0x0B: cs->town_effect = TE_FOOD; break;
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1680
					default:
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1681
						grfmsg(1, "CargoChangeInfo: Unknown town growth substitute value %d, setting to none.", substitute_type);
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1682
					case 0xFF: cs->town_effect = TE_NONE; break;
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1683
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1684
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1685
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1686
			case 0x19: /* Town growth coefficient */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1687
				cs->multipliertowngrowth = grf_load_word(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1688
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1689
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1690
			case 0x1A: /* Bitmask of callbacks to use */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1691
				cs->callback_mask = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1692
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1693
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1694
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1695
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1696
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1697
		}
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1698
	}
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1699
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1700
	*bufp = buf;
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1701
	return ret;
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1702
}
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1703
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  1704
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1705
static bool SoundEffectChangeInfo(uint sid, int numinfo, int prop, byte **bufp, int len)
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1706
{
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1707
	byte *buf = *bufp;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1708
	bool ret = false;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1709
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1710
	if (_cur_grffile->sound_offset == 0) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  1711
		grfmsg(1, "SoundEffectChangeInfo: No effects defined, skipping");
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1712
		return false;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1713
	}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1714
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1715
	for (int i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1716
		uint sound = sid + i + _cur_grffile->sound_offset - GetNumOriginalSounds();
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1717
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1718
		if (sound >= GetNumSounds()) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1719
			grfmsg(1, "SoundEffectChangeInfo: Sound %d not defined (max %d)", sound, GetNumSounds());
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1720
			continue;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1721
		}
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1722
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1723
		switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1724
			case 0x08: // Relative volume
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1725
				GetSound(sound)->volume = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1726
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1727
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1728
			case 0x09: // Priority
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1729
				GetSound(sound)->priority = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1730
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1731
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1732
			case 0x0A: { // Override old sound
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1733
				uint orig_sound = grf_load_byte(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1734
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1735
				if (orig_sound >= GetNumSounds()) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1736
					grfmsg(1, "SoundEffectChangeInfo: Original sound %d not defined (max %d)", orig_sound, GetNumSounds());
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1737
				} else {
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1738
					FileEntry *newfe = GetSound(sound);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1739
					FileEntry *oldfe = GetSound(orig_sound);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1740
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1741
					/* Literally copy the data of the new sound over the original */
5024
f13f2f2d43f9 (svn r7065) Use simple assignment instead of memcpy()
tron
parents: 5011
diff changeset
  1742
					*oldfe = *newfe;
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1743
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1744
			} break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1745
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1746
			default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1747
				ret = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1748
				break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  1749
		}
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1750
	}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1751
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1752
	*bufp = buf;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1753
	return ret;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1754
}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  1755
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1756
static bool IndustrytilesChangeInfo(uint indtid, int numinfo, int prop, byte **bufp, int len)
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1757
{
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1758
	byte *buf = *bufp;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1759
	bool ret = false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1760
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1761
	if (indtid + numinfo > NUM_INDUSTRYTILES) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1762
		grfmsg(1, "IndustryTilesChangeInfo: Too many industry tiles loaded (%u), max (%u). Ignoring.", indtid + numinfo, NUM_INDUSTRYTILES);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1763
		return false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1764
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1765
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1766
	/* Allocate industry tile specs if they haven't been allocated already. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1767
	if (_cur_grffile->indtspec == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1768
		_cur_grffile->indtspec = CallocT<IndustryTileSpec*>(NUM_INDUSTRYTILES);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1769
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1770
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1771
	for (int i = 0; i < numinfo; i++) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1772
		IndustryTileSpec *tsp = _cur_grffile->indtspec[indtid + i];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1773
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1774
		if (prop != 0x08 && tsp == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1775
			grfmsg(2, "IndustryTilesChangeInfo: Attempt to modify undefined industry tile %u. Ignoring.", indtid + i);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1776
			continue;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1777
		}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1778
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1779
		switch (prop) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1780
			case 0x08: { // Substitute industry tile type
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1781
				IndustryTileSpec **tilespec = &_cur_grffile->indtspec[indtid + i];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1782
				byte subs_id = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1783
7955
7a2abd093498 (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: 7927
diff changeset
  1784
				if (subs_id >= NEW_INDUSTRYTILEOFFSET) {
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1785
					/* The substitute id must be one of the original industry tile. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1786
					grfmsg(2, "IndustryTilesChangeInfo: Attempt to use new industry tile %u as substitute industry tile for %u. Ignoring.", subs_id, indtid + i);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1787
					return false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1788
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1789
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1790
				/* Allocate space for this industry. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1791
				if (*tilespec == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1792
					int tempid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1793
					*tilespec = CallocT<IndustryTileSpec>(1);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1794
					tsp = *tilespec;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1795
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1796
					memcpy(tsp, &_industry_tile_specs[subs_id], sizeof(_industry_tile_specs[subs_id]));
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1797
					tsp->enabled = true;
8600
bb089962319d (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: 8599
diff changeset
  1798
bb089962319d (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: 8599
diff changeset
  1799
					/* A copied tile should not have the animation infos copied too.
bb089962319d (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: 8599
diff changeset
  1800
					 * The anim_state should be left untouched, though
bb089962319d (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: 8599
diff changeset
  1801
					 * It is up to the author to animate them himself */
bb089962319d (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: 8599
diff changeset
  1802
					tsp->anim_production = INDUSTRYTILE_NOANIM;
bb089962319d (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: 8599
diff changeset
  1803
					tsp->anim_next = INDUSTRYTILE_NOANIM;
bb089962319d (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: 8599
diff changeset
  1804
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1805
					tsp->grf_prop.local_id = indtid + i;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1806
					tsp->grf_prop.subst_id = subs_id;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1807
					tsp->grf_prop.grffile = _cur_grffile;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1808
					tempid = _industile_mngr.AddEntityID(indtid + i, _cur_grffile->grfid, subs_id); // pre-reserve the tile slot
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1809
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1810
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1811
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1812
			case 0x09: { // Industry tile override
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1813
				byte ovrid = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1814
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1815
				/* The industry being overridden must be an original industry. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1816
				if (ovrid >= NEW_INDUSTRYTILEOFFSET) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1817
					grfmsg(2, "IndustryTilesChangeInfo: Attempt to override new industry tile %u with industry tile id %u. Ignoring.", ovrid, indtid + i);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1818
					return false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1819
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1820
8369
4decac386a96 (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 8327
diff changeset
  1821
				_industile_mngr.Add(indtid + i, _cur_grffile->grfid, ovrid);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1822
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1823
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1824
			case 0x0A: // Tile acceptance
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1825
			case 0x0B:
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1826
			case 0x0C: {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1827
				uint16 acctp = grf_load_word(&buf);
8484
962c66e1cd50 (svn r11544) -Fix [FS#1501]: revert r11453 as it translated cargo when it should not
glx
parents: 8474
diff changeset
  1828
				tsp->accepts_cargo[prop - 0x0A] = GetCargoTranslation(GB(acctp, 0, 8), _cur_grffile);
8127
0cbf1d4a5f6d (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: 8126
diff changeset
  1829
				tsp->acceptance[prop - 0x0A] = GB(acctp, 8, 8);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1830
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1831
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1832
			case 0x0D: // Land shape flags
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1833
				tsp->slopes_refused = (Slope)grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1834
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1835
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1836
			case 0x0E: // Callback flags
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1837
				tsp->callback_flags = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1838
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1839
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1840
			case 0x0F: // Animation information
7725
e3892b38aa14 (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7713
diff changeset
  1841
				tsp->animation_info = grf_load_word(&buf);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1842
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1843
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1844
			case 0x10: // Animation speed
7725
e3892b38aa14 (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7713
diff changeset
  1845
				tsp->animation_speed = grf_load_byte(&buf);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1846
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1847
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1848
			case 0x11: // Triggers for callback 25
7725
e3892b38aa14 (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7713
diff changeset
  1849
				tsp->animation_triggers = grf_load_byte(&buf);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1850
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1851
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1852
			case 0x12: // Special flags
7725
e3892b38aa14 (svn r10508) -Codechange: allow customizable animation schemes for industries.
rubidium
parents: 7713
diff changeset
  1853
				tsp->animation_special_flags = grf_load_byte(&buf);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1854
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1855
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1856
			default:
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1857
				ret = true;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1858
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1859
		}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1860
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1861
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1862
	*bufp = buf;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1863
	return ret;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1864
}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1865
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1866
static bool IndustriesChangeInfo(uint indid, int numinfo, int prop, byte **bufp, int len)
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1867
{
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1868
	byte *buf = *bufp;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1869
	bool ret = false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1870
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1871
	if (indid + numinfo > NUM_INDUSTRYTYPES) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1872
		grfmsg(1, "IndustriesChangeInfo: Too many industries loaded (%u), max (%u). Ignoring.", indid + numinfo, NUM_INDUSTRYTYPES);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1873
		return false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1874
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1875
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1876
	grfmsg(1, "IndustriesChangeInfo: newid %u", indid);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1877
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1878
	/* Allocate industry specs if they haven't been allocated already. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1879
	if (_cur_grffile->industryspec == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1880
		_cur_grffile->industryspec = CallocT<IndustrySpec*>(NUM_INDUSTRYTYPES);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1881
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1882
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1883
	for (int i = 0; i < numinfo; i++) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1884
		IndustrySpec *indsp = _cur_grffile->industryspec[indid + i];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1885
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1886
		if (prop != 0x08 && indsp == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1887
			grfmsg(2, "IndustriesChangeInfo: Attempt to modify undefined industry %u. Ignoring.", indid + i);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1888
			continue;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1889
		}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1890
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1891
		switch (prop) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1892
			case 0x08: { // Substitute industry type
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1893
				IndustrySpec **indspec = &_cur_grffile->industryspec[indid + i];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1894
				byte subs_id = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1895
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1896
				if (subs_id == 0xFF) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1897
					/* Instead of defining a new industry, a substitute industry id
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1898
					 * of 0xFF disables the old industry with the current id. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1899
					_industry_specs[indid + i].enabled = false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1900
					continue;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1901
				} else if (subs_id >= NEW_INDUSTRYOFFSET) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1902
					/* The substitute id must be one of the original industry. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1903
					grfmsg(2, "_industry_specs: Attempt to use new industry %u as substitute industry for %u. Ignoring.", subs_id, indid + i);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1904
					return false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1905
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1906
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1907
				/* Allocate space for this industry.
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1908
				 * Only need to do it once. If ever it is called again, it should not
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1909
				 * do anything */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1910
				if (*indspec == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1911
					*indspec = CallocT<IndustrySpec>(1);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1912
					indsp = *indspec;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1913
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1914
					memcpy(indsp, &_origin_industry_specs[subs_id], sizeof(_industry_specs[subs_id]));
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1915
					indsp->enabled = true;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1916
					indsp->grf_prop.local_id = indid + i;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1917
					indsp->grf_prop.subst_id = subs_id;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1918
					indsp->grf_prop.grffile = _cur_grffile;
8212
4a6936f108a3 (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: 8201
diff changeset
  1919
					/* If the grf industry needs to check its surounding upon creation, it should
4a6936f108a3 (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: 8201
diff changeset
  1920
					 * rely on callbacks, not on the original placement functions */
4a6936f108a3 (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: 8201
diff changeset
  1921
					indsp->check_proc = CHECK_NOTHING;
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1922
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1923
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1924
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1925
			case 0x09: { // Industry type override
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1926
				byte ovrid = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1927
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1928
				/* The industry being overridden must be an original industry. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1929
				if (ovrid >= NEW_INDUSTRYOFFSET) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1930
					grfmsg(2, "IndustriesChangeInfo: Attempt to override new industry %u with industry id %u. Ignoring.", ovrid, indid + i);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1931
					return false;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1932
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1933
				indsp->grf_prop.override = ovrid;
8369
4decac386a96 (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 8327
diff changeset
  1934
				_industry_mngr.Add(indid + i, _cur_grffile->grfid, ovrid);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1935
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1936
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1937
			case 0x0A: { // Set industry layout(s)
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1938
				indsp->num_table = grf_load_byte(&buf); // Number of layaouts
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1939
				uint32 defsize = grf_load_dword(&buf);  // Total size of the definition
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1940
				IndustryTileTable **tile_table = CallocT<IndustryTileTable*>(indsp->num_table); // Table with tiles to compose an industry
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1941
				IndustryTileTable *itt = CallocT<IndustryTileTable>(defsize); // Temporary array to read the tile layouts from the GRF
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1942
				int size;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1943
				IndustryTileTable *copy_from;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1944
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1945
				for (byte j = 0; j < indsp->num_table; j++) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1946
					for (int k = 0;; k++) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1947
						itt[k].ti.x = grf_load_byte(&buf); // Offsets from northermost tile
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1948
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1949
						if (itt[k].ti.x == 0xFE && k == 0) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1950
							/* This means we have to borrow the layout from an old industry */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1951
							IndustryType type = grf_load_byte(&buf);  //industry holding required layout
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1952
							byte laynbr = grf_load_byte(&buf);        //layout number to borrow
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1953
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1954
							copy_from = (IndustryTileTable*)_origin_industry_specs[type].table[laynbr];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1955
							for (size = 1;; size++) {
8242
5178a27b2275 (svn r11283) -Fix(r11282): a typo. Don't ask.
belugas
parents: 8241
diff changeset
  1956
								if (copy_from[size - 1].ti.x == -0x80 && copy_from[size - 1].ti.y == 0) break;
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1957
							}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1958
							break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1959
						}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1960
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1961
						itt[k].ti.y = grf_load_byte(&buf); // Or table definition finalisation
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1962
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1963
						if (itt[k].ti.x == 0 && itt[k].ti.y == 0x80) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1964
							/*  Not the same terminator.  The one we are using is rather
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1965
							 x= -80, y = x .  So, adjust it. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1966
							itt[k].ti.x = -0x80;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1967
							itt[k].ti.y =  0;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1968
							itt[k].gfx  =  0;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1969
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1970
							size = k + 1;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1971
							copy_from = itt;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1972
							break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1973
						}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1974
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1975
						itt[k].gfx = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1976
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1977
						if (itt[k].gfx == 0xFE) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1978
							/* Use a new tile from this GRF */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1979
							int local_tile_id = grf_load_word(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1980
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1981
							/* Read the ID from the _industile_mngr. */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1982
							int tempid = _industile_mngr.GetID(local_tile_id, _cur_grffile->grfid);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1983
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1984
							if (tempid == INVALID_INDUSTRYTILE) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1985
								grfmsg(2, "IndustriesChangeInfo: Attempt to use industry tile %u with industry id %u, not yet defined. Ignoring.", local_tile_id, indid);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1986
							} else {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1987
								/* Declared as been valid, can be used */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1988
								itt[k].gfx = tempid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1989
								size = k + 1;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1990
								copy_from = itt;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1991
							}
8126
ff006fa6d1ab (svn r11161) -Fix: Allow to transform coordinates in negative ones when gfx of 0xFF allows it
belugas
parents: 8116
diff changeset
  1992
						} else if (itt[k].gfx == 0xFF) {
ff006fa6d1ab (svn r11161) -Fix: Allow to transform coordinates in negative ones when gfx of 0xFF allows it
belugas
parents: 8116
diff changeset
  1993
							itt[k].ti.x = (int8)GB(itt[k].ti.x, 0, 8);
ff006fa6d1ab (svn r11161) -Fix: Allow to transform coordinates in negative ones when gfx of 0xFF allows it
belugas
parents: 8116
diff changeset
  1994
							itt[k].ti.y = (int8)GB(itt[k].ti.y, 0, 8);
8129
7d673f9710c2 (svn r11164) -Fix(r11161): a rogue space roaming in the night... removed
belugas
parents: 8127
diff changeset
  1995
						}
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1996
					}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1997
					tile_table[j] = CallocT<IndustryTileTable>(size);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1998
					memcpy(tile_table[j], copy_from, sizeof(*copy_from) * size);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  1999
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2000
				/* Install final layout construction in the industry spec */
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2001
				indsp->table = tile_table;
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  2002
				SetBit(indsp->cleanup_flag, 1);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2003
				free(itt);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2004
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2005
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2006
			case 0x0B: // Industry production flags
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2007
				indsp->life_type = (IndustryLifeType)grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2008
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2009
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2010
			case 0x0C: // Industry closure message
8794
ccb35d65645b (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: 8778
diff changeset
  2011
				indsp->closure_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2012
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2013
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2014
			case 0x0D: // Production increase message
8794
ccb35d65645b (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: 8778
diff changeset
  2015
				indsp->production_up_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2016
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2017
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2018
			case 0x0E: // Production decrease message
8794
ccb35d65645b (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: 8778
diff changeset
  2019
				indsp->production_down_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2020
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2021
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2022
			case 0x0F: // Fund cost multiplier
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2023
				indsp->cost_multiplier = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2024
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2025
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2026
			case 0x10: // Production cargo types
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2027
				for (byte j = 0; j < 2; j++) {
8484
962c66e1cd50 (svn r11544) -Fix [FS#1501]: revert r11453 as it translated cargo when it should not
glx
parents: 8474
diff changeset
  2028
					indsp->produced_cargo[j] = GetCargoTranslation(grf_load_byte(&buf), _cur_grffile);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2029
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2030
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2031
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2032
			case 0x11: // Acceptance cargo types
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2033
				for (byte j = 0; j < 3; j++) {
8484
962c66e1cd50 (svn r11544) -Fix [FS#1501]: revert r11453 as it translated cargo when it should not
glx
parents: 8474
diff changeset
  2034
					indsp->accepts_cargo[j] = GetCargoTranslation(grf_load_byte(&buf), _cur_grffile);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2035
				}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2036
				grf_load_byte(&buf); // Unnused, eat it up
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2037
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2038
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2039
			case 0x12: // Production multipliers
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2040
			case 0x13:
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2041
				indsp->production_rate[prop - 0x12] = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2042
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2043
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2044
			case 0x14: // Minimal amount of cargo distributed
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2045
				indsp->minimal_cargo = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2046
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2047
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2048
			case 0x15: { // Random sound effects
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2049
				indsp->number_of_sounds = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2050
				uint8 *sounds = MallocT<uint8>(indsp->number_of_sounds);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2051
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2052
				for (uint8 j = 0; j < indsp->number_of_sounds; j++) sounds[j] = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2053
				indsp->random_sounds = sounds;
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  2054
				SetBit(indsp->cleanup_flag, 0);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2055
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2056
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2057
			case 0x16: // Conflicting industry types
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2058
				for (byte j = 0; j < 3; j++) indsp->conflicting[j] = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2059
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2060
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2061
			case 0x17: // Probability in random game
8160
2a2e46b8fba2 (svn r11195) -Fix: creation chances for industries during gameplay and during map generation were swapped.
rubidium
parents: 8157
diff changeset
  2062
				indsp->appear_creation[_opt.landscape] = grf_load_byte(&buf);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2063
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2064
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2065
			case 0x18: // Probability during gameplay
8160
2a2e46b8fba2 (svn r11195) -Fix: creation chances for industries during gameplay and during map generation were swapped.
rubidium
parents: 8157
diff changeset
  2066
				indsp->appear_ingame[_opt.landscape] = grf_load_byte(&buf);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2067
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2068
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2069
			case 0x19: // Map color
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2070
				indsp->map_colour = MapDOSColour(grf_load_byte(&buf));
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2071
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2072
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2073
			case 0x1A: // Special industry flags to define special behavior
8253
07efd7789987 (svn r11302) -Fix (r9520): typo
glx
parents: 8242
diff changeset
  2074
				indsp->behaviour = (IndustryBehaviour)grf_load_dword(&buf);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2075
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2076
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2077
			case 0x1B: // New industry text ID
8794
ccb35d65645b (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: 8778
diff changeset
  2078
				indsp->new_industry_text = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2079
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2080
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2081
			case 0x1C: // Input cargo multipliers for the three input cargo types
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2082
			case 0x1D:
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2083
			case 0x1E: {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2084
					uint32 multiples = grf_load_dword(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2085
					indsp->input_cargo_multiplier[prop - 0x1C][0] = GB(multiples, 0,15);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2086
					indsp->input_cargo_multiplier[prop - 0x1C][1] = GB(multiples, 15,15);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2087
				} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2088
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2089
			case 0x1F: // Industry name
8794
ccb35d65645b (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: 8778
diff changeset
  2090
				indsp->name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2091
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2092
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2093
			case 0x20: // Prospecting success chance
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2094
				indsp->prospecting_chance = grf_load_dword(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2095
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2096
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2097
			case 0x21:   // Callback flags
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2098
			case 0x22: { // Callback additional flags
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2099
				byte aflag = grf_load_byte(&buf);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2100
				SB(indsp->callback_flags, (prop - 0x21) * 8, 8, aflag);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2101
			} break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2102
8474
358b35762f02 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 8450
diff changeset
  2103
			case 0x23: // removal cost multiplier
358b35762f02 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 8450
diff changeset
  2104
				indsp->removal_cost_multiplier = grf_load_dword(&buf);
358b35762f02 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 8450
diff changeset
  2105
				break;
358b35762f02 (svn r11534) -Feature(newgrf): Implement property 23h for Industries.
belugas
parents: 8450
diff changeset
  2106
8966
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  2107
			case 0x24: // name for nearby station
8980
b510684944c2 (svn r12059) -Fix (r12041): industries prop 24 is a word
glx
parents: 8974
diff changeset
  2108
				indsp->station_name = GRFMappedStringID(grf_load_word(&buf), _cur_grffile->grfid);
8966
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  2109
				break;
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  2110
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2111
			default:
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2112
				ret = true;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2113
				break;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2114
		}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2115
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2116
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2117
	*bufp = buf;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2118
	return ret;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2119
}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2120
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  2121
/* Action 0x00 */
3879
3e9cd6403d73 (svn r4928) CodeChange : Rename functions referring to "Vehicle" for "Feature".
belugas
parents: 3875
diff changeset
  2122
static void FeatureChangeInfo(byte *buf, int len)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2123
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2124
	byte *bufend = buf + len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2125
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2126
	/* <00> <feature> <num-props> <num-info> <id> (<property <new-info>)...
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2127
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2128
	 * B feature       0, 1, 2 or 3 for trains, road vehicles, ships or planes
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2129
	 *                 4 for defining new train station sets
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2130
	 * B num-props     how many properties to change per vehicle/station
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2131
	 * B num-info      how many vehicles/stations to change
8388
d11398135687 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 8378
diff changeset
  2132
	 * E id            ID of first vehicle/station to change, if num-info is
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2133
	 *                 greater than one, this one and the following
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2134
	 *                 vehicles/stations will be changed
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2135
	 * B property      what property to change, depends on the feature
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2136
	 * V new-info      new bytes of info (variable size; depends on properties) */
391
573193308396 (svn r583) -newgrf: Hopefully prevent GRF files introducing new bridges or townhouses to crash the game (pasky).
darkvater
parents: 389
diff changeset
  2137
	/* TODO: Bridges, town houses. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2138
2438
eaef2b29fa3d (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
  2139
	static const VCI_Handler handler[] = {
3825
c4c69a0ca625 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2140
		/* GSF_TRAIN */        RailVehicleChangeInfo,
c4c69a0ca625 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2141
		/* GSF_ROAD */         RoadVehicleChangeInfo,
c4c69a0ca625 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2142
		/* GSF_SHIP */         ShipVehicleChangeInfo,
c4c69a0ca625 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2143
		/* GSF_AIRCRAFT */     AircraftVehicleChangeInfo,
c4c69a0ca625 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2144
		/* GSF_STATION */      StationChangeInfo,
8868
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  2145
		/* GSF_CANAL */        CanalChangeInfo,
3825
c4c69a0ca625 (svn r4838) Newgrf : Add empty base for newcargos
belugas
parents: 3821
diff changeset
  2146
		/* GSF_BRIDGE */       BridgeChangeInfo,
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2147
		/* GSF_TOWNHOUSE */    TownHouseChangeInfo,
8974
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2148
		/* GSF_GLOBALVAR */    GlobalVarChangeInfo,
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2149
		/* GSF_INDUSTRYTILES */IndustrytilesChangeInfo,
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2150
		/* GSF_INDUSTRIES */   IndustriesChangeInfo,
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2151
		/* GSF_CARGOS */       NULL, /* Cargo is handled during reservation */
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  2152
		/* GSF_SOUNDFX */      SoundEffectChangeInfo,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2153
	};
360
ff657281ae48 (svn r548) -newgrf: minor style changes, and application of boolean type
darkvater
parents: 359
diff changeset
  2154
5841
b36d6b560aaa (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: 5838
diff changeset
  2155
	if (!check_length(len, 6, "FeatureChangeInfo")) return;
3714
402f02b01241 (svn r4657) - NewGRF: use grf_load_byte() in favour of array accesses
peter1138
parents: 3712
diff changeset
  2156
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2157
	uint8 feature  = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2158
	uint8 numprops = grf_load_byte(&buf);
6614
b41f2210a494 (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: 6610
diff changeset
  2159
	uint numinfo  = grf_load_byte(&buf);
8388
d11398135687 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 8378
diff changeset
  2160
	uint engine   = grf_load_extended(&buf);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 74
diff changeset
  2161
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2162
	grfmsg(6, "FeatureChangeInfo: feature %d, %d properties, to apply to %d+%d",
378
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
  2163
	               feature, numprops, engine, numinfo);
9f170b63d48e (svn r567) -newgrf: Support for road vehicles customization (seems to work at
celestar
parents: 373
diff changeset
  2164
2440
443e2f3cce75 (svn r2966) Fix: newgrf: Replace special case with a check for the existence of a handler in VehicleChangeInfo.
peter1138
parents: 2439
diff changeset
  2165
	if (feature >= lengthof(handler) || handler[feature] == NULL) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2166
		grfmsg(1, "FeatureChangeInfo: Unsupported feature %d, skipping", feature);
391
573193308396 (svn r583) -newgrf: Hopefully prevent GRF files introducing new bridges or townhouses to crash the game (pasky).
darkvater
parents: 389
diff changeset
  2167
		return;
573193308396 (svn r583) -newgrf: Hopefully prevent GRF files introducing new bridges or townhouses to crash the game (pasky).
darkvater
parents: 389
diff changeset
  2168
	}
573193308396 (svn r583) -newgrf: Hopefully prevent GRF files introducing new bridges or townhouses to crash the game (pasky).
darkvater
parents: 389
diff changeset
  2169
2439
c820a9751afc (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2170
	if (feature <= GSF_AIRCRAFT) {
c820a9751afc (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2171
		if (engine + numinfo > _vehcounts[feature]) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2172
			grfmsg(0, "FeatureChangeInfo: Last engine ID %d out of bounds (max %d), skipping", engine + numinfo, _vehcounts[feature]);
2439
c820a9751afc (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2173
			return;
c820a9751afc (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2174
		}
c820a9751afc (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  2175
	}
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2176
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2177
	while (numprops-- && buf < bufend) {
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2178
		uint8 prop = grf_load_byte(&buf);
2421
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2179
		bool ignoring = false;
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2180
2421
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2181
		switch (feature) {
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2182
			case GSF_TRAIN:
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2183
			case GSF_ROAD:
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2184
			case GSF_SHIP:
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2185
			case GSF_AIRCRAFT: {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2186
				bool handled = true;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2187
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2188
				for (uint i = 0; i < numinfo; i++) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2189
					EngineInfo *ei = &_engine_info[engine + _vehshifts[feature] + i];
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2190
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2191
					/* Common properties for vehicles */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2192
					switch (prop) {
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2193
						case 0x00: // Introduction date
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2194
							ei->base_intro = grf_load_word(&buf) + DAYS_TILL_ORIGINAL_BASE_YEAR;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2195
							break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2196
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2197
						case 0x02: // Decay speed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2198
							SB(ei->unk2, 0, 7, grf_load_byte(&buf) & 0x7F);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2199
							break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2200
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2201
						case 0x03: // Vehicle life
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2202
							ei->lifelength = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2203
							break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2204
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2205
						case 0x04: // Model life
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2206
							ei->base_life = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2207
							break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2208
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2209
						case 0x06: // Climates available
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2210
							ei->climates = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2211
							break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2212
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2213
						case 0x07: // Loading speed
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2214
							/* Hyronymus explained me what does
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2215
							 * this mean and insists on having a
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2216
							 * credit ;-). --pasky */
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2217
							ei->load_amount = grf_load_byte(&buf);
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2218
							break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2219
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2220
						default:
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2221
							handled = false;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2222
							break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2223
					}
2421
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2224
				}
7655
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2225
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2226
				if (handled) break;
8d1e8833ce28 (svn r10433) -Codechange: Remove FOR_EACH_OBJECT by moving the for loops in the Action 0
maedhros
parents: 7530
diff changeset
  2227
			} /* FALL THROUGH */
2421
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2228
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2229
			default:
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2230
				if (handler[feature](engine, numinfo, prop, &buf, bufend - buf)) {
2421
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2231
					ignoring = true;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2232
				}
2421
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2233
				break;
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2234
		}
2421
7b6750d797bd (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  2235
8570
3312a80e0ebd (svn r11635) -Codechange: Give a more informative debug message when encountering unknown newgrf feature in action 00 handling.(FS#1551, Bilbo)
belugas
parents: 8536
diff changeset
  2236
		if (ignoring) grfmsg(1, "FeatureChangeInfo: Ignoring property 0x%02X of feature 0x%02X (not implemented)", prop, feature);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2237
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2238
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2239
5776
d80e79a2e71b (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: 5753
diff changeset
  2240
/* Action 0x00 (GLS_SAFETYSCAN) */
d80e79a2e71b (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: 5753
diff changeset
  2241
static void SafeChangeInfo(byte *buf, int len)
d80e79a2e71b (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: 5753
diff changeset
  2242
{
5841
b36d6b560aaa (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: 5838
diff changeset
  2243
	if (!check_length(len, 6, "SafeChangeInfo")) return;
5776
d80e79a2e71b (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: 5753
diff changeset
  2244
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2245
	uint8 feature  = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2246
	uint8 numprops = grf_load_byte(&buf);
8388
d11398135687 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 8378
diff changeset
  2247
	grf_load_byte(&buf);     // num-info
d11398135687 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 8378
diff changeset
  2248
	grf_load_extended(&buf); // id
5776
d80e79a2e71b (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: 5753
diff changeset
  2249
d80e79a2e71b (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: 5753
diff changeset
  2250
	if (feature == GSF_BRIDGE && numprops == 1) {
d80e79a2e71b (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: 5753
diff changeset
  2251
		uint8 prop = grf_load_byte(&buf);
d80e79a2e71b (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: 5753
diff changeset
  2252
		/* Bridge property 0x0D is redefinition of sprite layout tables, which
d80e79a2e71b (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: 5753
diff changeset
  2253
		 * is considered safe. */
d80e79a2e71b (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: 5753
diff changeset
  2254
		if (prop == 0x0D) return;
d80e79a2e71b (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: 5753
diff changeset
  2255
	}
d80e79a2e71b (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: 5753
diff changeset
  2256
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  2257
	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
5776
d80e79a2e71b (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: 5753
diff changeset
  2258
d80e79a2e71b (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: 5753
diff changeset
  2259
	/* Skip remainder of GRF */
d80e79a2e71b (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: 5753
diff changeset
  2260
	_skip_sprites = -1;
d80e79a2e71b (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: 5753
diff changeset
  2261
}
d80e79a2e71b (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: 5753
diff changeset
  2262
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2263
/* Action 0x00 (GLS_RESERVE) */
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2264
static void ReserveChangeInfo(byte *buf, int len)
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2265
{
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2266
	byte *bufend = buf + len;
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2267
8974
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2268
	if (!check_length(len, 6, "ReserveChangeInfo")) return;
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2269
	buf++;
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2270
	uint8 feature  = grf_load_byte(&buf);
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2271
8437
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2272
	if (feature != GSF_CARGOS && feature != GSF_GLOBALVAR) return;
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2273
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2274
	uint8 numprops = grf_load_byte(&buf);
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2275
	uint8 numinfo  = grf_load_byte(&buf);
8388
d11398135687 (svn r11443) -Fix: [NewGRF] Action 0 <id> is an extended byte
glx
parents: 8378
diff changeset
  2276
	uint8 index    = grf_load_extended(&buf);
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2277
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2278
	while (numprops-- && buf < bufend) {
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2279
		uint8 prop = grf_load_byte(&buf);
8437
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2280
		bool ignoring = false;
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2281
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2282
		switch (feature) {
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2283
			default: NOT_REACHED();
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2284
			case GSF_CARGOS:
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2285
				ignoring = CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf);
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2286
				break;
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2287
			case GSF_GLOBALVAR:
8974
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2288
				switch (prop) {
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2289
					case 0x09: // Cargo Translation Table
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2290
						if (index != 0) {
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2291
							grfmsg(1, "ReserveChangeInfo: Cargo translation table must start at zero");
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2292
							return;
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2293
						}
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2294
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2295
						free(_cur_grffile->cargo_list);
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2296
						_cur_grffile->cargo_max = numinfo;
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2297
						_cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2298
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2299
						for (uint i = 0; i < numinfo; i++) {
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2300
							CargoLabel cl = grf_load_dword(&buf);
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2301
							_cur_grffile->cargo_list[i] = BSWAP32(cl);
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2302
						}
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2303
						break;
2d3cc23e12ce (svn r12052) -Fix [FS#1737] (r11494): The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early. ;)
maedhros
parents: 8966
diff changeset
  2304
				}
8437
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2305
				break;
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2306
		}
8437
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2307
10c4010055a9 (svn r11494) -Fix [FS#1461] (r11450): cargo translation table was now loaded too late ;)
glx
parents: 8427
diff changeset
  2308
		if (ignoring) grfmsg(2, "ReserveChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2309
	}
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2310
}
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  2311
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2312
/**
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2313
 * Creates a spritegroup representing a callback result
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2314
 * @param value The value that was used to represent this callback result
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2315
 * @return A spritegroup representing that callback result
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2316
 */
4893
07d158194395 (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2317
static const SpriteGroup* NewCallBackResultSpriteGroup(uint16 value)
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2318
{
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  2319
	SpriteGroup *group = AllocateSpriteGroup();
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2320
2488
cbe3d6b60c27 (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2321
	group->type = SGT_CALLBACK;
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2322
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  2323
	/* Old style callback results have the highest byte 0xFF so signify it is a callback result
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  2324
	 * New style ones only have the highest bit set (allows 15-bit results, instead of just 8) */
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  2325
	if ((value >> 8) == 0xFF) {
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  2326
		value &= ~0xFF00;
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  2327
	} else {
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2328
		value &= ~0x8000;
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  2329
	}
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2330
2488
cbe3d6b60c27 (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2331
	group->g.callback.result = value;
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2332
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2333
	return group;
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  2334
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2335
2489
88827d8ae517 (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
  2336
/**
88827d8ae517 (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
  2337
 * Creates a spritegroup representing a sprite number result.
6977
67b989528f3d (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6975
diff changeset
  2338
 * @param sprite The sprite number.
67b989528f3d (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6975
diff changeset
  2339
 * @param num_sprites The number of sprites per set.
2489
88827d8ae517 (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
  2340
 * @return A spritegroup representing the sprite number result.
88827d8ae517 (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
  2341
 */
4893
07d158194395 (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2342
static const SpriteGroup* NewResultSpriteGroup(SpriteID sprite, byte num_sprites)
2489
88827d8ae517 (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
  2343
{
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  2344
	SpriteGroup *group = AllocateSpriteGroup();
2489
88827d8ae517 (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
  2345
	group->type = SGT_RESULT;
3668
d7ed0a867b49 (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
  2346
	group->g.result.sprite = sprite;
d7ed0a867b49 (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
  2347
	group->g.result.num_sprites = num_sprites;
2489
88827d8ae517 (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
  2348
	return group;
88827d8ae517 (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
  2349
}
88827d8ae517 (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
  2350
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  2351
/* Action 0x01 */
369
ab2266938fa8 (svn r557) -newgrf: Rename all 'superset' tokens to 'group' and some other small renamings (pasky and octo).
darkvater
parents: 368
diff changeset
  2352
static void NewSpriteSet(byte *buf, int len)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2353
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2354
	/* <01> <feature> <num-sets> <num-ent>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2355
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2356
	 * B feature       feature to define sprites for
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2357
	 *                 0, 1, 2, 3: veh-type, 4: train stations
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2358
	 * B num-sets      number of sprite sets
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2359
	 * E num-ent       how many entries per sprite set
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2360
	 *                 For vehicles, this is the number of different
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2361
	 *                         vehicle directions in each sprite set
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2362
	 *                         Set num-dirs=8, unless your sprites are symmetric.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2363
	 *                         In that case, use num-dirs=4.
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2364
	 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2365
5841
b36d6b560aaa (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: 5838
diff changeset
  2366
	if (!check_length(len, 4, "NewSpriteSet")) return;
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  2367
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2368
	uint8 feature   = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2369
	uint8 num_sets  = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2370
	uint16 num_ents = grf_load_extended(&buf);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2371
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2372
	_cur_grffile->spriteset_start = _cur_spriteid;
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  2373
	_cur_grffile->spriteset_feature = feature;
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2374
	_cur_grffile->spriteset_numsets = num_sets;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2375
	_cur_grffile->spriteset_numents = num_ents;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2376
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2377
	grfmsg(7, "New sprite set at %d of type %d, consisting of %d sets with %d views each (total %d)",
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2378
		_cur_spriteid, feature, num_sets, num_ents, num_sets * num_ents
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2379
	);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2380
8778
787d7fe77e9c (svn r11846) -Fix [FS#1651]: implicit conversion from unsigned to signed int caused compilation failure with MSVC.
peter1138
parents: 8766
diff changeset
  2381
	for (int i = 0; i < num_sets * num_ents; i++) {
8449
c5759019cbcd (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: 8437
diff changeset
  2382
		_nfo_line++;
7404
fc0559157f16 (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: 7390
diff changeset
  2383
		LoadNextSprite(_cur_spriteid++, _file_index, _nfo_line);
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2384
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2385
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2386
7072
973b998c5cfe (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: 7066
diff changeset
  2387
/* Action 0x01 (SKIP) */
973b998c5cfe (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: 7066
diff changeset
  2388
static void SkipAct1(byte *buf, int len)
973b998c5cfe (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: 7066
diff changeset
  2389
{
973b998c5cfe (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: 7066
diff changeset
  2390
	if (!check_length(len, 4, "SkipAct1")) return;
973b998c5cfe (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: 7066
diff changeset
  2391
	buf++;
973b998c5cfe (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: 7066
diff changeset
  2392
	grf_load_byte(&buf);
973b998c5cfe (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: 7066
diff changeset
  2393
	uint8 num_sets  = grf_load_byte(&buf);
973b998c5cfe (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: 7066
diff changeset
  2394
	uint16 num_ents = grf_load_extended(&buf);
973b998c5cfe (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: 7066
diff changeset
  2395
973b998c5cfe (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: 7066
diff changeset
  2396
	_skip_sprites = num_sets * num_ents;
973b998c5cfe (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: 7066
diff changeset
  2397
973b998c5cfe (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: 7066
diff changeset
  2398
	grfmsg(3, "SkipAct1: Skipping %d sprites", _skip_sprites);
973b998c5cfe (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: 7066
diff changeset
  2399
}
973b998c5cfe (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: 7066
diff changeset
  2400
3666
975cd26c8df7 (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
/* Helper function to either create a callback or link to a previously
975cd26c8df7 (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
 * defined spritegroup. */
4893
07d158194395 (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2403
static const SpriteGroup* GetGroupFromGroupID(byte setid, byte type, uint16 groupid)
3666
975cd26c8df7 (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
{
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  2405
	if (HasBit(groupid, 15)) return NewCallBackResultSpriteGroup(groupid);
3666
975cd26c8df7 (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
  2406
975cd26c8df7 (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
  2407
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2408
		grfmsg(1, "GetGroupFromGroupID(0x%02X:0x%02X): Groupid 0x%04X does not exist, leaving empty", setid, type, groupid);
3666
975cd26c8df7 (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
  2409
		return NULL;
975cd26c8df7 (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
  2410
	}
975cd26c8df7 (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
  2411
975cd26c8df7 (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
  2412
	return _cur_grffile->spritegroups[groupid];
975cd26c8df7 (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
}
975cd26c8df7 (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
975cd26c8df7 (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
/* Helper function to either create a callback or a result sprite group. */
4893
07d158194395 (svn r6837) - Codechange: More const SpriteGroups missed in r6836
peter1138
parents: 4869
diff changeset
  2416
static const SpriteGroup* CreateGroupFromGroupID(byte feature, byte setid, byte type, uint16 spriteid, uint16 num_sprites)
3666
975cd26c8df7 (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
  2417
{
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  2418
	if (HasBit(spriteid, 15)) return NewCallBackResultSpriteGroup(spriteid);
3666
975cd26c8df7 (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
  2419
3667
f87c17c36375 (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2420
	if (spriteid >= _cur_grffile->spriteset_numsets) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2421
		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Sprite set %u invalid, max %u", setid, type, spriteid, _cur_grffile->spriteset_numsets);
3667
f87c17c36375 (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2422
		return NULL;
f87c17c36375 (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2423
	}
f87c17c36375 (svn r4582) - NewGRF: include an additional check to see if a spriteset id is within range.
peter1138
parents: 3666
diff changeset
  2424
3666
975cd26c8df7 (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
  2425
	/* Check if the sprite is within range. This can fail if the Action 0x01
975cd26c8df7 (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
  2426
	 * is skipped, as TTDPatch mandates that Action 0x02s must be processed.
975cd26c8df7 (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
  2427
	 * We don't have that rule, but must live by the Patch... */
975cd26c8df7 (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
  2428
	if (_cur_grffile->spriteset_start + spriteid * num_sprites + num_sprites > _cur_spriteid) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2429
		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Real Sprite IDs 0x%04X - 0x%04X do not (all) exist (max 0x%04X), leaving empty",
3666
975cd26c8df7 (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
  2430
				setid, type,
975cd26c8df7 (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
  2431
				_cur_grffile->spriteset_start + spriteid * num_sprites,
975cd26c8df7 (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
  2432
				_cur_grffile->spriteset_start + spriteid * num_sprites + num_sprites - 1, _cur_spriteid - 1);
975cd26c8df7 (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
  2433
		return NULL;
975cd26c8df7 (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
  2434
	}
975cd26c8df7 (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
  2435
3803
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2436
	if (feature != _cur_grffile->spriteset_feature) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2437
		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Sprite set feature 0x%02X does not match action feature 0x%02X, skipping",
7381
bdc89f7887a1 (svn r10128) -Fix (r4811): missing printf parameters in newgrf debug message
peter1138
parents: 7369
diff changeset
  2438
				setid, type,
3803
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2439
				_cur_grffile->spriteset_feature, feature);
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2440
		return NULL;
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2441
	}
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2442
3666
975cd26c8df7 (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
  2443
	return NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteid * num_sprites, num_sprites);
975cd26c8df7 (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
  2444
}
975cd26c8df7 (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
  2445
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  2446
/* Action 0x02 */
369
ab2266938fa8 (svn r557) -newgrf: Rename all 'superset' tokens to 'group' and some other small renamings (pasky and octo).
darkvater
parents: 368
diff changeset
  2447
static void NewSpriteGroup(byte *buf, int len)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2448
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2449
	/* <02> <feature> <set-id> <type/num-entries> <feature-specific-data...>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2450
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2451
	 * B feature       see action 1
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2452
	 * B set-id        ID of this particular definition
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2453
	 * B type/num-entries
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2454
	 *                 if 80 or greater, this is a randomized or variational
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2455
	 *                 list definition, see below
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2456
	 *                 otherwise it specifies a number of entries, the exact
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2457
	 *                 meaning depends on the feature
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2458
	 * V feature-specific-data (huge mess, don't even look it up --pasky) */
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2459
	SpriteGroup *group = NULL;
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2460
	byte *bufend = buf + len;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 74
diff changeset
  2461
5841
b36d6b560aaa (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: 5838
diff changeset
  2462
	if (!check_length(len, 5, "NewSpriteGroup")) return;
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2463
	buf++;
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2464
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2465
	uint8 feature = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2466
	uint8 setid   = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2467
	uint8 type    = grf_load_byte(&buf);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2468
2444
e618726432a4 (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
  2469
	if (setid >= _cur_grffile->spritegroups_count) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  2470
		/* Allocate memory for new sprite group references. */
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  2471
		_cur_grffile->spritegroups = ReallocT(_cur_grffile->spritegroups, setid + 1);
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  2472
		/* Initialise new space to NULL */
2488
cbe3d6b60c27 (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2473
		for (; _cur_grffile->spritegroups_count < (setid + 1); _cur_grffile->spritegroups_count++)
cbe3d6b60c27 (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2480
diff changeset
  2474
			_cur_grffile->spritegroups[_cur_grffile->spritegroups_count] = NULL;
2444
e618726432a4 (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
  2475
	}
e618726432a4 (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
  2476
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2477
	switch (type) {
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2478
		/* Deterministic Sprite Group */
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2479
		case 0x81: // Self scope, byte
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2480
		case 0x82: // Parent scope, byte
3668
d7ed0a867b49 (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
  2481
		case 0x85: // Self scope, word
d7ed0a867b49 (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
		case 0x86: // Parent scope, word
d7ed0a867b49 (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
		case 0x89: // Self scope, dword
d7ed0a867b49 (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
		case 0x8A: // Parent scope, dword
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2485
		{
3668
d7ed0a867b49 (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
			byte varadjust;
d7ed0a867b49 (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
			byte varsize;
d7ed0a867b49 (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
d7ed0a867b49 (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
			/* Check we can load the var size parameter */
5841
b36d6b560aaa (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: 5838
diff changeset
  2490
			if (!check_length(bufend - buf, 1, "NewSpriteGroup (Deterministic) (1)")) return;
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2491
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2492
			group = AllocateSpriteGroup();
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2493
			group->type = SGT_DETERMINISTIC;
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  2494
			group->g.determ.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
3668
d7ed0a867b49 (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
  2495
d7ed0a867b49 (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
  2496
			switch (GB(type, 2, 2)) {
3672
73caf2e829f8 (svn r4588) - NewGRF: silence a false compiler warning
peter1138
parents: 3668
diff changeset
  2497
				default: NOT_REACHED();
3668
d7ed0a867b49 (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
				case 0: group->g.determ.size = DSG_SIZE_BYTE;  varsize = 1; break;
d7ed0a867b49 (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
				case 1: group->g.determ.size = DSG_SIZE_WORD;  varsize = 2; break;
d7ed0a867b49 (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
				case 2: group->g.determ.size = DSG_SIZE_DWORD; varsize = 4; break;
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2501
			}
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2502
5841
b36d6b560aaa (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: 5838
diff changeset
  2503
			if (!check_length(bufend - buf, 5 + varsize, "NewSpriteGroup (Deterministic) (2)")) return;
3668
d7ed0a867b49 (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
d7ed0a867b49 (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
			/* Loop through the var adjusts. Unfortunately we don't know how many we have
d7ed0a867b49 (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
			 * from the outset, so we shall have to keep reallocing. */
d7ed0a867b49 (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
			do {
d7ed0a867b49 (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
				DeterministicSpriteGroupAdjust *adjust;
d7ed0a867b49 (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
d7ed0a867b49 (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
				if (group->g.determ.num_adjusts > 0) {
5841
b36d6b560aaa (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: 5838
diff changeset
  2511
					if (!check_length(bufend - buf, 2 + varsize + 3, "NewSpriteGroup (Deterministic) (3)")) return;
3668
d7ed0a867b49 (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
				}
d7ed0a867b49 (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
  2513
d7ed0a867b49 (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
				group->g.determ.num_adjusts++;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  2515
				group->g.determ.adjusts = ReallocT(group->g.determ.adjusts, group->g.determ.num_adjusts);
3668
d7ed0a867b49 (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
  2516
d7ed0a867b49 (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
				adjust = &group->g.determ.adjusts[group->g.determ.num_adjusts - 1];
d7ed0a867b49 (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
  2518
d7ed0a867b49 (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
				/* The first var adjust doesn't have an operation specified, so we set it to add. */
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  2520
				adjust->operation = group->g.determ.num_adjusts == 1 ? DSGA_OP_ADD : (DeterministicSpriteGroupAdjustOperation)grf_load_byte(&buf);
3668
d7ed0a867b49 (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
				adjust->variable  = grf_load_byte(&buf);
5868
baa704b6dc4f (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5860
diff changeset
  2522
				if (adjust->variable == 0x7E) {
baa704b6dc4f (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5860
diff changeset
  2523
					/* Link subroutine group */
baa704b6dc4f (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5860
diff changeset
  2524
					adjust->subroutine = GetGroupFromGroupID(setid, type, grf_load_byte(&buf));
baa704b6dc4f (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5860
diff changeset
  2525
				} else {
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8449
diff changeset
  2526
					adjust->parameter = IsInsideMM(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
5868
baa704b6dc4f (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5860
diff changeset
  2527
				}
3668
d7ed0a867b49 (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
  2528
d7ed0a867b49 (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
  2529
				varadjust = grf_load_byte(&buf);
d7ed0a867b49 (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
  2530
				adjust->shift_num = GB(varadjust, 0, 5);
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  2531
				adjust->type      = (DeterministicSpriteGroupAdjustType)GB(varadjust, 6, 2);
3668
d7ed0a867b49 (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
  2532
				adjust->and_mask  = grf_load_var(varsize, &buf);
d7ed0a867b49 (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
  2533
d7ed0a867b49 (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
  2534
				if (adjust->type != DSGA_TYPE_NONE) {
d7ed0a867b49 (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
  2535
					adjust->add_val    = grf_load_var(varsize, &buf);
d7ed0a867b49 (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
  2536
					adjust->divmod_val = grf_load_var(varsize, &buf);
d7ed0a867b49 (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
  2537
				} else {
d7ed0a867b49 (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
  2538
					adjust->add_val    = 0;
d7ed0a867b49 (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
					adjust->divmod_val = 0;
d7ed0a867b49 (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
  2540
				}
d7ed0a867b49 (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
d7ed0a867b49 (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
  2542
				/* Continue reading var adjusts while bit 5 is set. */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  2543
			} while (HasBit(varadjust, 5));
3668
d7ed0a867b49 (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
d7ed0a867b49 (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
  2545
			group->g.determ.num_ranges = grf_load_byte(&buf);
7155
d7f32c08076b (svn r9890) -Codechange: Don't allocate space for 0 spriteset ranges
peter1138
parents: 7148
diff changeset
  2546
			if (group->g.determ.num_ranges > 0) group->g.determ.ranges = CallocT<DeterministicSpriteGroupRange>(group->g.determ.num_ranges);
3668
d7ed0a867b49 (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
  2547
5841
b36d6b560aaa (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: 5838
diff changeset
  2548
			if (!check_length(bufend - buf, 2 + (2 + 2 * varsize) * group->g.determ.num_ranges, "NewSpriteGroup (Deterministic)")) return;
3668
d7ed0a867b49 (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
  2549
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2550
			for (uint i = 0; i < group->g.determ.num_ranges; i++) {
3668
d7ed0a867b49 (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
  2551
				group->g.determ.ranges[i].group = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
d7ed0a867b49 (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
  2552
				group->g.determ.ranges[i].low   = grf_load_var(varsize, &buf);
d7ed0a867b49 (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
  2553
				group->g.determ.ranges[i].high  = grf_load_var(varsize, &buf);
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2554
			}
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2555
3668
d7ed0a867b49 (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
			group->g.determ.default_group = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2557
			break;
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 441
diff changeset
  2558
		}
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 441
diff changeset
  2559
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2560
		/* Randomized Sprite Group */
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2561
		case 0x80: // Self scope
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2562
		case 0x83: // Parent scope
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2563
		{
5841
b36d6b560aaa (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: 5838
diff changeset
  2564
			if (!check_length(bufend - buf, 7, "NewSpriteGroup (Randomized) (1)")) return;
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2565
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2566
			group = AllocateSpriteGroup();
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2567
			group->type = SGT_RANDOMIZED;
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  2568
			group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
3668
d7ed0a867b49 (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
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2570
			uint8 triggers = grf_load_byte(&buf);
3668
d7ed0a867b49 (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
			group->g.random.triggers       = GB(triggers, 0, 7);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  2572
			group->g.random.cmp_mode       = HasBit(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
3668
d7ed0a867b49 (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
			group->g.random.lowest_randbit = grf_load_byte(&buf);
d7ed0a867b49 (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
			group->g.random.num_groups     = grf_load_byte(&buf);
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  2575
			group->g.random.groups = CallocT<const SpriteGroup*>(group->g.random.num_groups);
3668
d7ed0a867b49 (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
5841
b36d6b560aaa (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: 5838
diff changeset
  2577
			if (!check_length(bufend - buf, 2 * group->g.random.num_groups, "NewSpriteGroup (Randomized) (2)")) return;
3668
d7ed0a867b49 (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
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2579
			for (uint i = 0; i < group->g.random.num_groups; i++) {
3668
d7ed0a867b49 (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
				group->g.random.groups[i] = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2581
			}
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2582
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2583
			break;
2489
88827d8ae517 (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
  2584
		}
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2585
3668
d7ed0a867b49 (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
  2586
		/* Neither a variable or randomized sprite group... must be a real group */
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2587
		default:
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2588
		{
3803
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2589
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2590
3668
d7ed0a867b49 (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
			switch (feature) {
d7ed0a867b49 (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
  2592
				case GSF_TRAIN:
d7ed0a867b49 (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
				case GSF_ROAD:
d7ed0a867b49 (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
  2594
				case GSF_SHIP:
d7ed0a867b49 (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
  2595
				case GSF_AIRCRAFT:
d7ed0a867b49 (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
				case GSF_STATION:
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2597
				case GSF_CANAL:
6691
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  2598
				case GSF_CARGOS:
3668
d7ed0a867b49 (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
				{
d7ed0a867b49 (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
  2600
					byte sprites     = _cur_grffile->spriteset_numents;
d7ed0a867b49 (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
  2601
					byte num_loaded  = type;
d7ed0a867b49 (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
					byte num_loading = grf_load_byte(&buf);
d7ed0a867b49 (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
d7ed0a867b49 (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
					if (_cur_grffile->spriteset_start == 0) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2605
						grfmsg(0, "NewSpriteGroup: No sprite set to work on! Skipping");
3668
d7ed0a867b49 (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
						return;
d7ed0a867b49 (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
  2607
					}
d7ed0a867b49 (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
  2608
5841
b36d6b560aaa (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: 5838
diff changeset
  2609
					if (!check_length(bufend - buf, 2 * num_loaded + 2 * num_loading, "NewSpriteGroup (Real) (1)")) return;
3668
d7ed0a867b49 (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
  2610
d7ed0a867b49 (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
  2611
					group = AllocateSpriteGroup();
d7ed0a867b49 (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
  2612
					group->type = SGT_REAL;
d7ed0a867b49 (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
  2613
d7ed0a867b49 (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
  2614
					group->g.real.num_loaded  = num_loaded;
d7ed0a867b49 (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
  2615
					group->g.real.num_loading = num_loading;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  2616
					if (num_loaded  > 0) group->g.real.loaded = CallocT<const SpriteGroup*>(num_loaded);
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  2617
					if (num_loading > 0) group->g.real.loading = CallocT<const SpriteGroup*>(num_loading);
3668
d7ed0a867b49 (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
  2618
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2619
					grfmsg(6, "NewSpriteGroup: New SpriteGroup 0x%02X, %u views, %u loaded, %u loading",
3668
d7ed0a867b49 (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
  2620
							setid, sprites, num_loaded, num_loading);
d7ed0a867b49 (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
  2621
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2622
					for (uint i = 0; i < num_loaded; i++) {
3668
d7ed0a867b49 (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
  2623
						uint16 spriteid = grf_load_word(&buf);
3803
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2624
						group->g.real.loaded[i] = CreateGroupFromGroupID(feature, setid, type, spriteid, sprites);
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2625
						grfmsg(8, "NewSpriteGroup: + rg->loaded[%i]  = subset %u", i, spriteid);
3668
d7ed0a867b49 (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
  2626
					}
d7ed0a867b49 (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
  2627
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2628
					for (uint i = 0; i < num_loading; i++) {
3668
d7ed0a867b49 (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
  2629
						uint16 spriteid = grf_load_word(&buf);
3803
1bd124196372 (svn r4811) - NewGRF: only check a sprite set's feature when assigning a sprite result sprite group.
peter1138
parents: 3785
diff changeset
  2630
						group->g.real.loading[i] = CreateGroupFromGroupID(feature, setid, type, spriteid, sprites);
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2631
						grfmsg(8, "NewSpriteGroup: + rg->loading[%i] = subset %u", i, spriteid);
3668
d7ed0a867b49 (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
  2632
					}
d7ed0a867b49 (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
  2633
d7ed0a867b49 (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
  2634
					break;
d7ed0a867b49 (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
  2635
				}
d7ed0a867b49 (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
  2636
7670
a37783587593 (svn r10448) -Codechange: Industry Tiles and Houses share almost the same spritegroup format.
belugas
parents: 7664
diff changeset
  2637
				case GSF_TOWNHOUSE:
a37783587593 (svn r10448) -Codechange: Industry Tiles and Houses share almost the same spritegroup format.
belugas
parents: 7664
diff changeset
  2638
				case GSF_INDUSTRYTILES: {
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2639
					byte sprites     = _cur_grffile->spriteset_numents;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2640
					byte num_sprites = max((uint8)1, type);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2641
					uint i;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2642
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2643
					group = AllocateSpriteGroup();
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2644
					group->type = SGT_TILELAYOUT;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2645
					group->g.layout.num_sprites = sprites;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2646
					group->g.layout.dts = CallocT<DrawTileSprites>(1);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2647
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2648
					/* Groundsprite */
9067
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  2649
					group->g.layout.dts->ground.sprite = grf_load_word(&buf);
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  2650
					group->g.layout.dts->ground.pal    = grf_load_word(&buf);
9073
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
  2651
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2652
					/* Remap transparent/colour modifier bits */
9073
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
  2653
					MapSpriteMappingRecolour(&group->g.layout.dts->ground);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
  2654
9067
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  2655
					if (HasBit(group->g.layout.dts->ground.pal, 15)) {
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2656
						/* Bit 31 set means this is a custom sprite, so rewrite it to the
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2657
						 * last spriteset defined. */
9067
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  2658
						SpriteID sprite = _cur_grffile->spriteset_start + GB(group->g.layout.dts->ground.sprite, 0, 14) * sprites;
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  2659
						SB(group->g.layout.dts->ground.sprite, 0, SPRITE_WIDTH, sprite);
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  2660
						ClrBit(group->g.layout.dts->ground.pal, 15);
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2661
					}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2662
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2663
					group->g.layout.dts->seq = CallocT<DrawTileSeqStruct>(num_sprites + 1);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2664
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2665
					for (i = 0; i < num_sprites; i++) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2666
						DrawTileSeqStruct *seq = (DrawTileSeqStruct*)&group->g.layout.dts->seq[i];
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2667
9066
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
  2668
						seq->image.sprite = grf_load_word(&buf);
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
  2669
						seq->image.pal   = grf_load_word(&buf);
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2670
						seq->delta_x = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2671
						seq->delta_y = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2672
9073
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
  2673
						MapSpriteMappingRecolour(&seq->image);
740f7aaa3ff6 (svn r12158) -Codechange: merge all the sprite recolouring mapping under a single function
belugas
parents: 9067
diff changeset
  2674
9066
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
  2675
						if (HasBit(seq->image.pal, 15)) {
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2676
							/* Bit 31 set means this is a custom sprite, so rewrite it to the
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2677
							 * last spriteset defined. */
9066
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
  2678
							SpriteID sprite = _cur_grffile->spriteset_start + GB(seq->image.sprite, 0, 14) * sprites;
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
  2679
							SB(seq->image.sprite, 0, SPRITE_WIDTH, sprite);
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9042
diff changeset
  2680
							ClrBit(seq->image.pal, 15);
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2681
						}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2682
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2683
						if (type > 0) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2684
							seq->delta_z = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2685
							if ((byte)seq->delta_z == 0x80) continue;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2686
						}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2687
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2688
						seq->size_x = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2689
						seq->size_y = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2690
						seq->size_z = grf_load_byte(&buf);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2691
					}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2692
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2693
					/* Set the terminator value. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2694
					((DrawTileSeqStruct*)group->g.layout.dts->seq)[i].delta_x = (byte)0x80;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2695
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2696
					break;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2697
				}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  2698
7664
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2699
				case GSF_INDUSTRIES: {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2700
					if (type > 1) {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2701
						grfmsg(1, "NewSpriteGroup: Unsupported industry production version %d, skipping", type);
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2702
						break;
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2703
					}
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2704
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2705
					group = AllocateSpriteGroup();
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2706
					group->type = SGT_INDUSTRY_PRODUCTION;
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2707
					group->g.indprod.version = type;
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2708
					if (type == 0) {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2709
						for (uint i = 0; i < 3; i++) {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2710
							group->g.indprod.substract_input[i] = grf_load_word(&buf);
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2711
						}
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2712
						for (uint i = 0; i < 2; i++) {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2713
							group->g.indprod.add_output[i] = grf_load_word(&buf);
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2714
						}
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2715
						group->g.indprod.again = grf_load_byte(&buf);
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2716
					} else {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2717
						for (uint i = 0; i < 3; i++) {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2718
							group->g.indprod.substract_input[i] = grf_load_byte(&buf);
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2719
						}
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2720
						for (uint i = 0; i < 2; i++) {
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2721
							group->g.indprod.add_output[i] = grf_load_byte(&buf);
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2722
						}
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2723
						group->g.indprod.again = grf_load_byte(&buf);
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2724
					}
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2725
					break;
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2726
				}
81c35390400e (svn r10442) -Codechange: implement the industry production callback.
rubidium
parents: 7658
diff changeset
  2727
3668
d7ed0a867b49 (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
  2728
				/* Loading of Tile Layout and Production Callback groups would happen here */
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2729
				default: grfmsg(1, "NewSpriteGroup: Unsupported feature %d, skipping", feature);
3633
414a50db1ac3 (svn r4537) - NewGRF: replace if cascade with a switch block in the sprite group loader
peter1138
parents: 3630
diff changeset
  2730
			}
2489
88827d8ae517 (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
  2731
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2732
	}
2444
e618726432a4 (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
  2733
e618726432a4 (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
  2734
	_cur_grffile->spritegroups[setid] = group;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2735
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2736
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2737
static CargoID TranslateCargo(uint8 feature, uint8 ctype)
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2738
{
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2739
	/* Special cargo types for purchase list and stations */
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
  2740
	if (feature == GSF_STATION && ctype == 0xFE) return CT_DEFAULT_NA;
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
  2741
	if (ctype == 0xFF) return CT_PURCHASE;
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2742
6687
d2ef5eda4562 (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: 6685
diff changeset
  2743
	if (_cur_grffile->cargo_max == 0) {
d2ef5eda4562 (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: 6685
diff changeset
  2744
		/* No cargo table, so use bitnum values */
d2ef5eda4562 (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: 6685
diff changeset
  2745
		if (ctype >= 32) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2746
			grfmsg(1, "TranslateCargo: Cargo bitnum %d out of range (max 31), skipping.", ctype);
6687
d2ef5eda4562 (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: 6685
diff changeset
  2747
			return CT_INVALID;
d2ef5eda4562 (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: 6685
diff changeset
  2748
		}
d2ef5eda4562 (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: 6685
diff changeset
  2749
d2ef5eda4562 (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: 6685
diff changeset
  2750
		for (CargoID c = 0; c < NUM_CARGO; c++) {
d2ef5eda4562 (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: 6685
diff changeset
  2751
			const CargoSpec *cs = GetCargo(c);
d2ef5eda4562 (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: 6685
diff changeset
  2752
			if (!cs->IsValid()) continue;
d2ef5eda4562 (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: 6685
diff changeset
  2753
d2ef5eda4562 (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: 6685
diff changeset
  2754
			if (cs->bitnum == ctype) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2755
				grfmsg(6, "TranslateCargo: Cargo bitnum %d mapped to cargo type %d.", ctype, c);
6687
d2ef5eda4562 (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: 6685
diff changeset
  2756
				return c;
d2ef5eda4562 (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: 6685
diff changeset
  2757
			}
d2ef5eda4562 (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: 6685
diff changeset
  2758
		}
d2ef5eda4562 (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: 6685
diff changeset
  2759
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2760
		grfmsg(5, "TranslateCargo: Cargo bitnum %d not available in this climate, skipping.", ctype);
6687
d2ef5eda4562 (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: 6685
diff changeset
  2761
		return CT_INVALID;
d2ef5eda4562 (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: 6685
diff changeset
  2762
	}
d2ef5eda4562 (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: 6685
diff changeset
  2763
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2764
	/* Check if the cargo type is out of bounds of the cargo translation table */
6687
d2ef5eda4562 (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: 6685
diff changeset
  2765
	if (ctype >= _cur_grffile->cargo_max) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2766
		grfmsg(1, "TranslateCargo: Cargo type %d out of range (max %d), skipping.", ctype, _cur_grffile->cargo_max - 1);
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2767
		return CT_INVALID;
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2768
	}
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2769
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2770
	/* Look up the cargo label from the translation table */
6687
d2ef5eda4562 (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: 6685
diff changeset
  2771
	CargoLabel cl = _cur_grffile->cargo_list[ctype];
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2772
	if (cl == 0) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2773
		grfmsg(5, "TranslateCargo: Cargo type %d not available in this climate, skipping.", ctype);
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2774
		return CT_INVALID;
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2775
	}
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2776
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2777
	ctype = GetCargoIDByLabel(cl);
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2778
	if (ctype == CT_INVALID) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2779
		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));
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2780
		return CT_INVALID;
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2781
	}
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2782
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2783
	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);
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2784
	return ctype;
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2785
}
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2786
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2787
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2788
static void VehicleMapSpriteGroup(byte *buf, byte feature, uint8 idcount, uint8 cidcount, bool wagover)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2789
{
8694
8b6828a78860 (svn r11761) -Codechange: Use appropriate variable types for NewGRF engine overrides, and adjust scope while there.
peter1138
parents: 8690
diff changeset
  2790
	static EngineID *last_engines;
8b6828a78860 (svn r11761) -Codechange: Use appropriate variable types for NewGRF engine overrides, and adjust scope while there.
peter1138
parents: 8690
diff changeset
  2791
	static uint last_engines_count;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2792
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2793
	if (!wagover) {
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2794
		if (last_engines_count != idcount) {
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2795
			last_engines = ReallocT(last_engines, idcount);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2796
			last_engines_count = idcount;
403
bfb365c74e80 (svn r600) -newgrf: Relocation offset for custom station sprites is now stored separately, making it possible to show different sprites in waypoint selection dialog (pasky).
darkvater
parents: 401
diff changeset
  2797
		}
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2798
	} else {
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2799
		if (last_engines_count == 0) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2800
			grfmsg(0, "VehicleMapSpriteGroup: WagonOverride: No engine to do override with");
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2801
			return;
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2802
		}
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2803
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2804
		grfmsg(6, "VehicleMapSpriteGroup: WagonOverride: %u engines, %u wagons",
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  2805
				last_engines_count, idcount);
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2806
	}
398
20f8a2faf809 (svn r590) -newgrf: Instead of a bunch of statinfo arrays, use station-array of struct StationSpec-s (pasky).
darkvater
parents: 397
diff changeset
  2807
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2808
	for (uint i = 0; i < idcount; i++) {
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2809
		uint8 engine_id = buf[3 + i];
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2810
		uint8 engine = engine_id + _vehshifts[feature];
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2811
		byte *bp = &buf[4 + idcount];
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2812
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2813
		if (engine_id > _vehcounts[feature]) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2814
			grfmsg(0, "Id %u for feature 0x%02X is out of bounds", engine_id, feature);
372
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2815
			return;
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2816
		}
1cc9354e2362 (svn r560) -newgrf: General cleanup of the code (pasky & octo)
celestar
parents: 369
diff changeset
  2817
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2818
		grfmsg(7, "VehicleMapSpriteGroup: [%d] Engine %d...", i, engine);
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  2819
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2820
		for (uint c = 0; c < cidcount; c++) {
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2821
			uint8 ctype = grf_load_byte(&bp);
369
ab2266938fa8 (svn r557) -newgrf: Rename all 'superset' tokens to 'group' and some other small renamings (pasky and octo).
darkvater
parents: 368
diff changeset
  2822
			uint16 groupid = grf_load_word(&bp);
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2823
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2824
			grfmsg(8, "VehicleMapSpriteGroup: * [%d] Cargo type 0x%X, group id 0x%02X", c, ctype, groupid);
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  2825
2516
b11f1229cefd (svn r3045) -NewGRF, Codechange: Don't attempt to map and empty sprite group to a vehicle.
peter1138
parents: 2515
diff changeset
  2826
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2827
				grfmsg(1, "VehicleMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping", groupid, _cur_grffile->spritegroups_count);
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2828
				continue;
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2829
			}
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2830
6469
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2831
			ctype = TranslateCargo(feature, ctype);
05a2e97144ec (svn r8886) -Codechange: (NewGRF) Add (partial) cargo translation table support, applied to action 3s only.
peter1138
parents: 6468
diff changeset
  2832
			if (ctype == CT_INVALID) continue;
5338
5b48218d8bd2 (svn r7503) -Codechange: [NewGRF] Add bounds checking for spriteset cargo types. (NewCargo support will change this rule a bit...)
peter1138
parents: 5334
diff changeset
  2833
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  2834
			if (wagover) {
4869
cded5f3a83c9 (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4818
diff changeset
  2835
				SetWagonOverrideSprites(engine, ctype, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2836
			} else {
2444
e618726432a4 (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
  2837
				SetCustomEngineSprites(engine, ctype, _cur_grffile->spritegroups[groupid]);
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2838
				last_engines[i] = engine;
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2839
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2840
		}
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2841
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2842
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2843
	{
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2844
		byte *bp = &buf[4 + idcount + cidcount * 3];
369
ab2266938fa8 (svn r557) -newgrf: Rename all 'superset' tokens to 'group' and some other small renamings (pasky and octo).
darkvater
parents: 368
diff changeset
  2845
		uint16 groupid = grf_load_word(&bp);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2846
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  2847
		grfmsg(8, "-- Default group id 0x%04X", groupid);
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  2848
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  2849
		for (uint i = 0; i < idcount; i++) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2850
			uint8 engine = buf[3 + i] + _vehshifts[feature];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2851
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  2852
			/* Don't tell me you don't love duplicated code! */
2516
b11f1229cefd (svn r3045) -NewGRF, Codechange: Don't attempt to map and empty sprite group to a vehicle.
peter1138
parents: 2515
diff changeset
  2853
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
7301
0e314c60f7a0 (svn r10044) -Fix: Minor NewGRF debug message fixes, and skip sprites of an unsupported Action 5 feature.
peter1138
parents: 7277
diff changeset
  2854
				grfmsg(1, "VehicleMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2855
				       groupid, _cur_grffile->spritegroups_count);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2856
				continue;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2857
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2858
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  2859
			if (wagover) {
8731
a2cab8a23491 (svn r11799) -Codechange: no need to special-case helicopter rotor 'overrides'
peter1138
parents: 8717
diff changeset
  2860
				SetWagonOverrideSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2861
			} else {
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
  2862
				SetCustomEngineSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid]);
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3895
diff changeset
  2863
				SetEngineGRF(engine, _cur_grffile);
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  2864
				last_engines[i] = engine;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2865
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2866
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2867
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2868
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2869
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2870
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2871
static void CanalMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2872
{
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2873
	byte *bp = &buf[4 + idcount + cidcount * 3];
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2874
	uint16 groupid = grf_load_word(&bp);
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2875
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2876
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2877
		grfmsg(1, "CanalMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2878
		       groupid, _cur_grffile->spritegroups_count);
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2879
		return;
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2880
	}
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2881
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2882
	for (uint i = 0; i < idcount; i++) {
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2883
		CanalFeature cf = (CanalFeature)buf[3 + i];
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2884
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2885
		if (cf >= CF_END) {
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2886
			grfmsg(1, "CanalMapSpriteGroup: Canal subset %d out of range, skipping", cf);
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2887
			continue;
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2888
		}
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2889
8868
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  2890
		_water_feature[cf].group = _cur_grffile->spritegroups[groupid];
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2891
	}
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2892
}
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2893
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  2894
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2895
static void StationMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2896
{
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2897
	for (uint i = 0; i < idcount; i++) {
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2898
		uint8 stid = buf[3 + i];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2899
		StationSpec *statspec = _cur_grffile->stations[stid];
8195
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2900
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2901
		if (statspec == NULL) {
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2902
			grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stid);
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2903
			return;
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2904
		}
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2905
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2906
		byte *bp = &buf[4 + idcount];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2907
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2908
		for (uint c = 0; c < cidcount; c++) {
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2909
			uint8 ctype = grf_load_byte(&bp);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2910
			uint16 groupid = grf_load_word(&bp);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2911
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2912
			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2913
				grfmsg(1, "StationMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2914
				       groupid, _cur_grffile->spritegroups_count);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2915
				continue;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2916
			}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2917
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2918
			ctype = TranslateCargo(GSF_STATION, ctype);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2919
			if (ctype == CT_INVALID) continue;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2920
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2921
			statspec->spritegroup[ctype] = _cur_grffile->spritegroups[groupid];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2922
		}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2923
	}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2924
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2925
	{
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2926
		byte *bp = &buf[4 + idcount + cidcount * 3];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2927
		uint16 groupid = grf_load_word(&bp);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2928
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2929
		if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2930
			grfmsg(1, "StationMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2931
			       groupid, _cur_grffile->spritegroups_count);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2932
			return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2933
		}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2934
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2935
		for (uint i = 0; i < idcount; i++) {
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2936
			uint8 stid = buf[3 + i];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2937
			StationSpec *statspec = _cur_grffile->stations[stid];
8195
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2938
			if (statspec == NULL) {
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2939
				grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stid);
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2940
				continue;
2676eea146e6 (svn r11233) -Fix [FS#1303]: handle some wrong written station NewGRFs a little more gracefully than segfaulting.
rubidium
parents: 8194
diff changeset
  2941
			}
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2942
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2943
			statspec->spritegroup[CT_DEFAULT] = _cur_grffile->spritegroups[groupid];
6947
c21859ab4493 (svn r9601) -Codechange: Store grf file reference in station spec, not just GRF ID
peter1138
parents: 6920
diff changeset
  2944
			statspec->grffile = _cur_grffile;
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2945
			statspec->localidx = stid;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2946
			SetCustomStationSpec(statspec);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2947
		}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2948
	}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2949
}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2950
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2951
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2952
static void TownHouseMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2953
{
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2954
	byte *bp = &buf[4 + idcount + cidcount * 3];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2955
	uint16 groupid = grf_load_word(&bp);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2956
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2957
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2958
		grfmsg(1, "TownHouseMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2959
		       groupid, _cur_grffile->spritegroups_count);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2960
		return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2961
	}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2962
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2963
	for (uint i = 0; i < idcount; i++) {
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2964
		uint8 hid = buf[3 + i];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2965
		HouseSpec *hs = _cur_grffile->housespec[hid];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2966
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2967
		if (hs == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  2968
			grfmsg(1, "TownHouseMapSpriteGroup: Too many houses defined, skipping");
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2969
			return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2970
		}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2971
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2972
		hs->spritegroup = _cur_grffile->spritegroups[groupid];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2973
	}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2974
}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  2975
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2976
static void IndustryMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2977
{
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2978
	byte *bp = &buf[4 + idcount + cidcount * 3];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2979
	uint16 groupid = grf_load_word(&bp);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2980
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2981
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2982
		grfmsg(1, "IndustryMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2983
		       groupid, _cur_grffile->spritegroups_count);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2984
		return;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2985
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2986
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2987
	for (uint i = 0; i < idcount; i++) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2988
		uint8 id = buf[3 + i];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2989
		IndustrySpec *indsp = _cur_grffile->industryspec[id];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2990
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2991
		if (indsp == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2992
			grfmsg(1, "IndustryMapSpriteGroup: Too many industries defined, skipping");
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2993
			return;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2994
		}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2995
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2996
		indsp->grf_prop.spritegroup = _cur_grffile->spritegroups[groupid];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2997
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2998
}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  2999
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3000
static void IndustrytileMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3001
{
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3002
	byte *bp = &buf[4 + idcount + cidcount * 3];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3003
	uint16 groupid = grf_load_word(&bp);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3004
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3005
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3006
		grfmsg(1, "IndustrytileMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3007
		       groupid, _cur_grffile->spritegroups_count);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3008
		return;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3009
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3010
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3011
	for (uint i = 0; i < idcount; i++) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3012
		uint8 id = buf[3 + i];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3013
		IndustryTileSpec *indtsp = _cur_grffile->indtspec[id];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3014
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3015
		if (indtsp == NULL) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3016
			grfmsg(1, "IndustrytileMapSpriteGroup: Too many industry tiles defined, skipping");
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3017
			return;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3018
		}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3019
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3020
		indtsp->grf_prop.spritegroup = _cur_grffile->spritegroups[groupid];
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3021
	}
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3022
}
6691
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3023
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3024
static void CargoMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3025
{
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3026
	byte *bp = &buf[4 + idcount + cidcount * 3];
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3027
	uint16 groupid = grf_load_word(&bp);
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3028
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3029
	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3030
		grfmsg(1, "CargoMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
6691
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3031
		       groupid, _cur_grffile->spritegroups_count);
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3032
		return;
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3033
	}
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3034
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3035
	for (uint i = 0; i < idcount; i++) {
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3036
		CargoID cid = buf[3 + i];
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3037
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3038
		if (cid >= NUM_CARGO) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3039
			grfmsg(1, "CargoMapSpriteGroup: Cargo ID %d out of range, skipping");
6691
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3040
			continue;
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3041
		}
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3042
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3043
		CargoSpec *cs = &_cargo[cid];
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3044
		cs->grfid = _cur_grffile->grfid;
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3045
		cs->group = _cur_grffile->spritegroups[groupid];
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3046
	}
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3047
}
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3048
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3049
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3050
/* Action 0x03 */
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3051
static void FeatureMapSpriteGroup(byte *buf, int len)
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3052
{
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3053
	/* <03> <feature> <n-id> <ids>... <num-cid> [<cargo-type> <cid>]... <def-cid>
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3054
	 * id-list    := [<id>] [id-list]
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3055
	 * cargo-list := <cargo-type> <cid> [cargo-list]
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3056
	 *
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3057
	 * B feature       see action 0
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3058
	 * B n-id          bits 0-6: how many IDs this definition applies to
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3059
	 *                 bit 7: if set, this is a wagon override definition (see below)
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3060
	 * B ids           the IDs for which this definition applies
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3061
	 * B num-cid       number of cargo IDs (sprite group IDs) in this definition
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3062
	 *                 can be zero, in that case the def-cid is used always
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3063
	 * B cargo-type    type of this cargo type (e.g. mail=2, wood=7, see below)
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3064
	 * W cid           cargo ID (sprite group ID) for this type of cargo
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3065
	 * W def-cid       default cargo ID (sprite group ID) */
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3066
9040
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3067
	if (_cur_grffile->spritegroups == 0) {
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3068
		grfmsg(1, "FeatureMapSpriteGroup: No sprite groups to work on! Skipping");
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3069
		return;
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3070
	}
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3071
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3072
	if (!check_length(len, 6, "FeatureMapSpriteGroup")) return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3073
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3074
	uint8 feature = buf[1];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3075
	uint8 idcount = buf[2] & 0x7F;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3076
	bool wagover = (buf[2] & 0x80) == 0x80;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3077
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3078
	if (!check_length(len, 3 + idcount, "FeatureMapSpriteGroup")) return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3079
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3080
	/* If idcount is zero, this is a feature callback */
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3081
	if (idcount == 0) {
9040
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3082
		byte *bp = &buf[4];
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3083
		uint16 groupid = grf_load_word(&bp);
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3084
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3085
		grfmsg(6, "FeatureMapSpriteGroup: Adding generic feature callback for feature %d", feature);
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3086
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  3087
		AddGenericCallback(feature, _cur_grffile, _cur_grffile->spritegroups[groupid]);
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3088
		return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3089
	}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3090
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3091
	uint8 cidcount = buf[3 + idcount];
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3092
	if (!check_length(len, 4 + idcount + cidcount * 3, "FeatureMapSpriteGroup")) return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3093
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3094
	grfmsg(6, "FeatureMapSpriteGroup: Feature %d, %d ids, %d cids, wagon override %d",
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3095
			feature, idcount, cidcount, wagover);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3096
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3097
	switch (feature) {
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3098
		case GSF_TRAIN:
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3099
		case GSF_ROAD:
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3100
		case GSF_SHIP:
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3101
		case GSF_AIRCRAFT:
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3102
			VehicleMapSpriteGroup(buf, feature, idcount, cidcount, wagover);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3103
			return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3104
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  3105
		case GSF_CANAL:
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  3106
			CanalMapSpriteGroup(buf, idcount, cidcount);
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  3107
			return;
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  3108
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3109
		case GSF_STATION:
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3110
			StationMapSpriteGroup(buf, idcount, cidcount);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3111
			return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3112
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3113
		case GSF_TOWNHOUSE:
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3114
			TownHouseMapSpriteGroup(buf, idcount, cidcount);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3115
			return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3116
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3117
		case GSF_INDUSTRIES:
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3118
			IndustryMapSpriteGroup(buf, idcount, cidcount);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3119
			return;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3120
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3121
		case GSF_INDUSTRYTILES:
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3122
			IndustrytileMapSpriteGroup(buf, idcount, cidcount);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3123
			return;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  3124
6691
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3125
		case GSF_CARGOS:
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3126
			CargoMapSpriteGroup(buf, idcount, cidcount);
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3127
			return;
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6689
diff changeset
  3128
6689
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3129
		default:
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3130
			grfmsg(1, "FeatureMapSpriteGroup: Unsupported feature %d, skipping", feature);
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3131
			return;
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3132
	}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3133
}
dc89785a5bee (svn r9416) -Codechange: Split NewGRF Action 3 handler into separate functions for each feature (vehicles are common, though)
peter1138
parents: 6687
diff changeset
  3134
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  3135
/* Action 0x04 */
3879
3e9cd6403d73 (svn r4928) CodeChange : Rename functions referring to "Vehicle" for "Feature".
belugas
parents: 3875
diff changeset
  3136
static void FeatureNewName(byte *buf, int len)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3137
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3138
	/* <04> <veh-type> <language-id> <num-veh> <offset> <data...>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3139
	 *
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3140
	 * B veh-type      see action 0 (as 00..07, + 0A
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3141
	 *                 But IF veh-type = 48, then generic text
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3142
	 * B language-id   If bit 6 is set, This is the extended language scheme,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3143
	                   with up to 64 language.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3144
	                   Otherwise, it is a mapping where set bits have meaning
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3145
	                   0 = american, 1 = english, 2 = german, 3 = french, 4 = spanish
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3146
	                   Bit 7 set means this is a generic text, not a vehicle one (or else)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3147
	 * B num-veh       number of vehicles which are getting a new name
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3148
	 * B/W offset      number of the first vehicle that gets a new name
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3149
	 *                 Byte : ID of vehicle to change
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3150
	 *                 Word : ID of string to change/add
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3151
	 * S data          new texts, each of them zero-terminated, after
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3152
	 *                 which the next name begins. */
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3153
3643
5d1f3fe61036 (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
  3154
	bool new_scheme = _cur_grffile->grf_version >= 7;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3155
5841
b36d6b560aaa (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: 5838
diff changeset
  3156
	if (!check_length(len, 6, "FeatureNewName")) return;
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3157
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3158
	uint8 feature  = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3159
	uint8 lang     = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3160
	uint8 num      = grf_load_byte(&buf);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  3161
	bool generic   = HasBit(lang, 7);
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3162
	uint16 id      = generic ? grf_load_word(&buf) : grf_load_byte(&buf);
4992
6d0a80c5c654 (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
  3163
8425
72a71d480c5f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 8424
diff changeset
  3164
	ClrBit(lang, 7);
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3165
3760
10a6f762e754 (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
  3166
	if (feature <= GSF_AIRCRAFT && id < _vehcounts[feature]) {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3167
		id += _vehshifts[feature];
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3168
	}
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3169
	uint16 endid = id + num;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3170
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3171
	grfmsg(6, "FeatureNewName: About to rename engines %d..%d (feature %d) in language 0x%02X",
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  3172
	               id, endid, feature, lang);
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  3173
4992
6d0a80c5c654 (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
  3174
	len -= generic ? 6 : 5;
6d0a80c5c654 (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
  3175
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3176
	for (; id < endid && len > 0; id++) {
6416
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
  3177
		const char *name   = grf_load_string(&buf, len);
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
  3178
		size_t name_length = strlen(name) + 1;
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
  3179
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
  3180
		len -= (int)name_length;
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
  3181
7103
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3182
		grfmsg(8, "FeatureNewName: 0x%04X <- %s", id, name);
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3183
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3184
		switch (feature) {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3185
			case GSF_TRAIN:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3186
			case GSF_ROAD:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3187
			case GSF_SHIP:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3188
			case GSF_AIRCRAFT:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3189
				if (id < TOTAL_NUM_ENGINES) {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3190
					StringID string = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_8000_KIRBY_PAUL_TANK_STEAM + id);
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  3191
					EngineInfo *ei = &_engine_info[id];
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  3192
					ei->string_id = string;
7103
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3193
				} else {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3194
					AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, id);
3614
2c75299f54bd (svn r4510) - NewGRF bounds checking:
peter1138
parents: 3604
diff changeset
  3195
				}
7103
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3196
				break;
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3197
7678
8c61d49f4447 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7670
diff changeset
  3198
			case GSF_INDUSTRIES: {
8c61d49f4447 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7670
diff changeset
  3199
				AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
8c61d49f4447 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7670
diff changeset
  3200
				break;
8c61d49f4447 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7670
diff changeset
  3201
			}
8c61d49f4447 (svn r10456) -Codechange: Enable loading newgrf strings for Industries
belugas
parents: 7670
diff changeset
  3202
7103
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3203
			case GSF_TOWNHOUSE:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3204
			default:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3205
				switch (GB(id, 8, 8)) {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3206
					case 0xC4: // Station class name
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3207
						if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3208
							grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3209
						} else {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3210
							StationClassID sclass = _cur_grffile->stations[GB(id, 0, 8)]->sclass;
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3211
							SetStationClassName(sclass, AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED));
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  3212
						}
7103
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3213
						break;
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3214
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3215
					case 0xC5: // Station name
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3216
						if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3217
							grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3218
						} else {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3219
							_cur_grffile->stations[GB(id, 0, 8)]->name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3220
						}
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3221
						break;
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3222
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3223
					case 0xC9: // House name
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3224
						if (_cur_grffile->housespec == NULL || _cur_grffile->housespec[GB(id, 0, 8)] == NULL) {
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3225
							grfmsg(1, "FeatureNewName: Attempt to name undefined house 0x%X, ignoring.", GB(id, 0, 8));
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3226
						} else {
8794
ccb35d65645b (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: 8778
diff changeset
  3227
							_cur_grffile->housespec[GB(id, 0, 8)]->building_name = GRFMappedStringID(AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED), 0);
7103
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3228
						}
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3229
						break;
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3230
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3231
					case 0xD0:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3232
					case 0xDC:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3233
						AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3234
						break;
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3235
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3236
					default:
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3237
						grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3238
						break;
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3239
				}
8c91ce192058 (svn r9827) -Codechange/Fix: [NewGRF] Text strings of 1 character are perfectly valid... (fixes dbsetxl refits again...)
peter1138
parents: 7102
diff changeset
  3240
				break;
3642
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3641
diff changeset
  3241
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3641
diff changeset
  3242
#if 0
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3243
				case GSF_CANAL :
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3244
				case GSF_BRIDGE :
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3245
					AddGRFString(_cur_spriteid, id, lang, name);
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6977
diff changeset
  3246
					switch (GB(id, 8, 8)) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  3247
						case 0xC9: // House name
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3248
						default:
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3249
							grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3250
					}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3251
					break;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3252
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3253
				default :
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3254
					grfmsg(7, "FeatureNewName: Unsupported feature (0x%02X)", feature);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3255
					break;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  3256
#endif
379
4605aa187b18 (svn r568) -newgrf: Make @wagover bool, simplifying stuff. (pasky)
celestar
parents: 378
diff changeset
  3257
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3258
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3259
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3260
8378
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3261
/**
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3262
 * Sanitize incoming sprite offsets for Action 5 graphics replacements.
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3263
 * @param num         the number of sprites to load.
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3264
 * @param offset      offset from the base.
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3265
 * @param max_sprites the maximum number of sprites that can be loaded in this action 5.
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3266
 * @param name        used for error warnings.
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3267
 * @return the number of sprites that is going to be skipped
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3268
 */
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3269
static uint16 SanitizeSpriteOffset(uint16& num, uint16 offset, int max_sprites, const char *name)
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3270
{
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3271
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3272
	if (offset >= max_sprites) {
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3273
		grfmsg(1, "GraphicsNew: %s sprite offset must be less than %i, skipping", name, max_sprites);
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3274
		uint orig_num = num;
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3275
		num = 0;
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3276
		return orig_num;
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3277
	}
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3278
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3279
	if (offset + num > max_sprites) {
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3280
		grfmsg(4, "GraphicsNew: %s sprite overflow, truncating...", name);
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3281
		uint orig_num = num;
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3282
		num = max(max_sprites - offset, 0);
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3283
		return orig_num - num;
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3284
	}
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3285
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3286
	return 0;
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3287
}
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3288
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  3289
/* Action 0x05 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3290
static void GraphicsNew(byte *buf, int len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3291
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3292
	/* <05> <graphics-type> <num-sprites> <other data...>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3293
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3294
	 * B graphics-type What set of graphics the sprites define.
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3295
	 * E num-sprites   How many sprites are in this set?
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3296
	 * V other data    Graphics type specific data.  Currently unused. */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3297
	/* TODO */
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  3298
8739
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3299
	enum Action5BlockType {
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3300
		A5BLOCK_FIXED,                ///< Only allow replacing a whole block of sprites. (TTDP compatible)
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3301
		A5BLOCK_ALLOW_OFFSET,         ///< Allow replacing any subset by specifiing an offset.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3302
		A5BLOCK_INVALID,              ///< unknown/not-implemented type
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3303
	};
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3304
	struct Action5Type {
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3305
		Action5BlockType block_type;  ///< How is this Action5 type processed?
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3306
		SpriteID sprite_base;         ///< Load the sprites starting from this sprite.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3307
		uint16 min_sprites;           ///< If the Action5 contains less sprites, the whole block will be ignored.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3308
		uint16 max_sprites;           ///< If the Action5 contains more sprites, only the first max_sprites sprites will be used.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3309
		const char *name;             ///< Name for error messages.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3310
	};
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3311
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3312
	static const Action5Type action5_types[] = {
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3313
		/* Note: min_sprites should not be changed. Therefore these constants are directly here and not in sprites.h */
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3314
		/* 0x00 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x00"             },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3315
		/* 0x01 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x01"             },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3316
		/* 0x02 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x02"             },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3317
		/* 0x03 */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "Type 0x03"             },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3318
		/* 0x04 */ { A5BLOCK_FIXED,        SPR_SIGNALS_BASE,   48, PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT,    "Signal graphics"       },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3319
		/* 0x05 */ { A5BLOCK_FIXED,        SPR_ELRAIL_BASE,    48, ELRAIL_SPRITE_COUNT,                         "Catenary graphics"     },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3320
		/* 0x06 */ { A5BLOCK_FIXED,        SPR_SLOPES_BASE,    74, NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT, "Foundation graphics"   },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3321
		/* 0x07 */ { A5BLOCK_INVALID,      0,                  75, 0,                                           "TTDP GUI graphics"     }, // Not used by OTTD.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3322
		/* 0x08 */ { A5BLOCK_FIXED,        SPR_CANALS_BASE,    65, CANALS_SPRITE_COUNT,                         "Canal graphics"        },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3323
		/* 0x09 */ { A5BLOCK_FIXED,        SPR_ONEWAY_BASE,     6, ONEWAY_SPRITE_COUNT,                         "One way road graphics" },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3324
		/* 0x0A */ { A5BLOCK_FIXED,        SPR_2CCMAP_BASE,   256, TWOCCMAP_SPRITE_COUNT,                       "2CC colour maps"       },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3325
		/* 0x0B */ { A5BLOCK_FIXED,        SPR_TRAMWAY_BASE,  113, TRAMWAY_SPRITE_COUNT,                        "Tramway graphics"      },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3326
		/* 0x0C */ { A5BLOCK_INVALID,      0,                 133, 0,                                           "Snowy temperate tree"  }, // Not yet used by OTTD.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3327
		/* 0x0D */ { A5BLOCK_FIXED,        SPR_SHORE_BASE,     16, SPR_SHORE_SPRITE_COUNT,                      "Shore graphics"        },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3328
		/* 0x0E */ { A5BLOCK_INVALID,      0,                   0, 0,                                           "New Signals graphics"  }, // Not yet used by OTTD.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3329
		/* 0x0F */ { A5BLOCK_INVALID,      0,                  12, 0,                                           "Sloped rail track"     }, // Not yet used by OTTD.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3330
		/* 0x10 */ { A5BLOCK_FIXED,        SPR_AIRPORTX_BASE,  15, AIRPORTX_SPRITE_COUNT,                       "Airport graphics"      },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3331
		/* 0x11 */ { A5BLOCK_FIXED,        SPR_ROADSTOP_BASE,   8, ROADSTOP_SPRITE_COUNT,                       "Road stop graphics"    },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3332
		/* 0x12 */ { A5BLOCK_INVALID,      0,                   8, 0,                                           "Aqueduct graphics"     }, // Not yet used by OTTD.
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3333
		/* 0x13 */ { A5BLOCK_FIXED,        SPR_AUTORAIL_BASE,  55, AUTORAIL_SPRITE_COUNT,                       "Autorail graphics"     },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3334
		/* 0x14 */ { A5BLOCK_ALLOW_OFFSET, SPR_FLAGS_BASE,      1, FLAGS_SPRITE_COUNT,                          "Flag graphics"         },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3335
		/* 0x15 */ { A5BLOCK_ALLOW_OFFSET, SPR_OPENTTD_BASE,    1, OPENTTD_SPRITE_COUNT,                        "OpenTTD GUI graphics"  },
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3336
	};
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  3337
5841
b36d6b560aaa (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: 5838
diff changeset
  3338
	if (!check_length(len, 2, "GraphicsNew")) return;
2346
7e88b66abdbd (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  3339
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3340
	uint8 type = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3341
	uint16 num = grf_load_extended(&buf);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  3342
	uint16 offset = HasBit(type, 7) ? grf_load_extended(&buf) : 0;
8425
72a71d480c5f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 8424
diff changeset
  3343
	ClrBit(type, 7); // Clear the high bit as that only indicates whether there is an offset.
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  3344
8739
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3345
	if ((type == 0x0D) && (num == 10) && _cur_grffile->is_ottdfile) {
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3346
		/* Special not-TTDP-compatible case used in openttd(d/w).grf
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3347
		 * Missing shore sprites and initialisation of SPR_SHORE_BASE */
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3348
		grfmsg(2, "GraphicsNew: Loading 10 missing shore sprites from openttd(d/w).grf.");
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3349
		LoadNextSprite(       SPR_SHORE_BASE          +  0, _file_index, _nfo_line++); // SLOPE_STEEP_S
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3350
		LoadNextSprite(       SPR_SHORE_BASE          +  5, _file_index, _nfo_line++); // SLOPE_STEEP_W
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3351
		LoadNextSprite(       SPR_SHORE_BASE          +  7, _file_index, _nfo_line++); // SLOPE_WSE
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3352
		LoadNextSprite(       SPR_SHORE_BASE          + 10, _file_index, _nfo_line++); // SLOPE_STEEP_N
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3353
		LoadNextSprite(       SPR_SHORE_BASE          + 11, _file_index, _nfo_line++); // SLOPE_NWS
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3354
		LoadNextSprite(       SPR_SHORE_BASE          + 13, _file_index, _nfo_line++); // SLOPE_ENW
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3355
		LoadNextSprite(       SPR_SHORE_BASE          + 14, _file_index, _nfo_line++); // SLOPE_SEN
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3356
		LoadNextSprite(       SPR_SHORE_BASE          + 15, _file_index, _nfo_line++); // SLOPE_STEEP_E
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3357
		LoadNextSprite(       SPR_SHORE_BASE          + 16, _file_index, _nfo_line++); // SLOPE_EW
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3358
		LoadNextSprite(       SPR_SHORE_BASE          + 17, _file_index, _nfo_line++); // SLOPE_NS
8899
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3359
		if (_loaded_newgrf_features.shore == SHORE_REPLACE_NONE) _loaded_newgrf_features.shore = SHORE_REPLACE_ONLY_NEW;
8739
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3360
		return;
3638
6e0b43d905d4 (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
  3361
	}
6e0b43d905d4 (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
  3362
8739
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3363
	/* Supported type? */
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3364
	if ((type >= lengthof(action5_types)) || (action5_types[type].block_type == A5BLOCK_INVALID)) {
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3365
		grfmsg(2, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring)", type, num);
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3366
		_skip_sprites = num;
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3367
		return;
3708
1c548218151c (svn r4651) - NewGRF: support loading of catenary sprites from NewGRF files. This actually works by replacing our hardcoded sprites.
peter1138
parents: 3707
diff changeset
  3368
	}
3638
6e0b43d905d4 (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
  3369
8739
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3370
	const Action5Type *action5_type = &action5_types[type];
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3371
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3372
	/* Ignore offset if not allowed */
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3373
	if ((action5_type->block_type != A5BLOCK_ALLOW_OFFSET) && (offset != 0)) {
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3374
		grfmsg(1, "GraphicsNew: %s (type 0x%02X) do not allow an <offset> field. Ignoring offset.", action5_type->name, type);
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3375
		offset = 0;
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3376
	}
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3377
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3378
	/* Ignore action5 if too few sprites are specified. (for TTDP compatibility)
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3379
	 * This does not make sense, if <offset> is allowed */
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3380
	if ((action5_type->block_type == A5BLOCK_FIXED) && (num < action5_type->min_sprites)) {
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3381
		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);
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3382
		_skip_sprites = num;
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3383
		return;
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3384
	}
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3385
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3386
	/* Load at most max_sprites sprites. Skip remaining sprites. (for compatibility with TTDP and future extentions) */
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3387
	uint16 skip_num = SanitizeSpriteOffset(num, offset, action5_type->max_sprites, action5_type->name);
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3388
	SpriteID replace = action5_type->sprite_base + offset;
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3389
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3390
	/* Load <num> sprites starting from <replace>, then skip <skip_num> sprites. */
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3391
	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);
4ae8f4bbc065 (svn r11807) -Codechange: Make Action5 handler more upwards- and TTDP-compatible by allowing specifiing more sprites than needed.
frosch
parents: 8735
diff changeset
  3392
3638
6e0b43d905d4 (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
  3393
	for (; num > 0; num--) {
8449
c5759019cbcd (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: 8437
diff changeset
  3394
		_nfo_line++;
7404
fc0559157f16 (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: 7390
diff changeset
  3395
		LoadNextSprite(replace == 0 ? _cur_spriteid++ : replace++, _file_index, _nfo_line);
3638
6e0b43d905d4 (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
  3396
	}
8378
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3397
8899
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3398
	if (type == 0x0D) _loaded_newgrf_features.shore = SHORE_REPLACE_ACTION_5;
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3399
8378
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8375
diff changeset
  3400
	_skip_sprites = skip_num;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3401
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3402
7025
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3403
/* Action 0x05 (SKIP) */
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3404
static void SkipAct5(byte *buf, int len)
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3405
{
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3406
	if (!check_length(len, 2, "SkipAct5")) return;
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3407
	buf++;
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3408
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3409
	/* Ignore type byte */
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3410
	grf_load_byte(&buf);
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3411
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3412
	/* Skip the sprites of this action */
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3413
	_skip_sprites = grf_load_extended(&buf);
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3414
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3415
	grfmsg(3, "SkipAct5: Skipping %d sprites", _skip_sprites);
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3416
}
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3417
9042
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3418
/**
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3419
 * Reads a variable common to VarAction2 and Action7/9/D.
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3420
 *
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3421
 * Returns VarAction2 variable 'param' resp. Action7/9/D variable '0x80 + param'.
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3422
 * If a variable is not accessible from all four actions, it is handled in the action specific functions.
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3423
 *
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3424
 * @param param variable number (as for VarAction2, for Action7/9/D you have to subtract 0x80 first).
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3425
 * @param value returns the value of the variable.
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3426
 * @return true iff the variable is known and the value is returned in 'value'.
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3427
 */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3428
bool GetGlobalVariable(byte param, uint32 *value)
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3429
{
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3430
	switch (param) {
9042
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3431
		case 0x00: // current date
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3432
			*value = max(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0);
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3433
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3434
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3435
		case 0x01: // current year
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3436
			*value = Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3437
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3438
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3439
		case 0x02: // current month
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3440
			*value = _cur_month;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3441
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3442
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3443
		case 0x03: // current climate, 0=temp, 1=arctic, 2=trop, 3=toyland
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3444
			*value = _opt.landscape;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3445
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3446
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3447
		case 0x06: // road traffic side, bit 4 clear=left, set=right
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3448
			*value = _opt.road_side << 4;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3449
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3450
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3451
		case 0x09: // date fraction
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3452
			*value = _date_fract;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3453
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3454
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3455
		case 0x0A: // animation counter
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3456
			*value = _tick_counter;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3457
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3458
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3459
		case 0x0B: { // TTDPatch version
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3460
			uint major    = 2;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3461
			uint minor    = 6;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3462
			uint revision = 1; // special case: 2.0.1 is 2.0.10
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3463
			uint build    = 1382;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3464
			*value = (major << 24) | (minor << 20) | (revision << 16) | build;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3465
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3466
		}
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3467
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3468
		case 0x0D: // TTD Version, 00=DOS, 01=Windows
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3469
			*value = !_use_dos_palette;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3470
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3471
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3472
		case 0x0E: // Y-offset for train sprites
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3473
			*value = _traininfo_vehicle_pitch;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3474
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3475
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3476
		case 0x0F: // Rail track type cost factors
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3477
			*value = 0;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3478
			SB(*value, 0, 8, _railtype_cost_multiplier[0]); // normal rail
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3479
			if (_patches.disable_elrails) {
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3480
				/* skip elrail multiplier - disabled */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3481
				SB(*value, 8, 8, _railtype_cost_multiplier[2]); // monorail
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3482
			} else {
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3483
				SB(*value, 8, 8, _railtype_cost_multiplier[1]); // electified railway
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3484
				/* Skip monorail multiplier - no space in result */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3485
			}
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3486
			SB(*value, 16, 8, _railtype_cost_multiplier[3]); // maglev
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3487
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3488
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3489
		case 0x11: // current rail tool type
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3490
			*value = 0;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3491
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3492
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3493
		case 0x12: // Game mode
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3494
			*value = _game_mode;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3495
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3496
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3497
		/* case 0x13: // Tile refresh offset to left    not implemented */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3498
		/* case 0x14: // Tile refresh offset to right   not implemented */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3499
		/* case 0x15: // Tile refresh offset upwards    not implemented */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3500
		/* case 0x16: // Tile refresh offset downwards  not implemented */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3501
		/* case 0x17: // temperate snow line            not implemented */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3502
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3503
		case 0x1A: // Always -1
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3504
			*value = UINT_MAX;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3505
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3506
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3507
		case 0x1B: // Display options
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3508
			*value = GB(_display_opt, 0, 6);
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3509
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3510
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3511
		case 0x1D: // TTD Platform, 00=TTDPatch, 01=OpenTTD
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3512
			*value = 1;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3513
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3514
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3515
		case 0x1E: // Miscellaneous GRF features
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3516
			*value = _misc_grf_features;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3517
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3518
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3519
		/* case 0x1F: // locale dependent settings not implemented */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3520
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3521
		case 0x20: // snow line height
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3522
			*value = _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3523
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3524
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3525
		case 0x21: { // OpenTTD version
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3526
			extern uint32 _openttd_newgrf_version;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3527
			*value = _openttd_newgrf_version;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3528
			return true;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3529
		}
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3530
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3531
		default: return false;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3532
	}
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3533
}
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3534
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3535
static uint32 GetParamVal(byte param, uint32 *cond_val)
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3536
{
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3537
	/* First handle variable common with VarAction2 */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3538
	uint32 value;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3539
	if (GetGlobalVariable(param - 0x80, &value)) return value;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3540
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3541
	/* Non-common variable */
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3542
	switch (param) {
7309
bc9f31c4ab97 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 7302
diff changeset
  3543
		case 0x84: { // GRF loading stage
bc9f31c4ab97 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 7302
diff changeset
  3544
			uint32 res = 0;
bc9f31c4ab97 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 7302
diff changeset
  3545
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  3546
			if (_cur_stage > GLS_INIT) SetBit(res, 0);
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  3547
			if (_cur_stage == GLS_RESERVE) SetBit(res, 8);
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  3548
			if (_cur_stage == GLS_ACTIVATION) SetBit(res, 9);
7309
bc9f31c4ab97 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 7302
diff changeset
  3549
			return res;
bc9f31c4ab97 (svn r10052) -Codechange: Support reserve/activate stage bits of action 7/9 variable 84.
peter1138
parents: 7302
diff changeset
  3550
		}
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3551
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  3552
		case 0x85: // TTDPatch flags, only for bit tests
3811
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3553
			if (cond_val == NULL) {
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3554
				/* Supported in Action 0x07 and 0x09, not 0x0D */
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3555
				return 0;
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3556
			} else {
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3557
				uint32 param_val = _ttdpatch_flags[*cond_val / 0x20];
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3558
				*cond_val %= 0x20;
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3559
				return param_val;
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  3560
			}
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3561
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  3562
		case 0x88: // GRF ID check
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3563
			return 0;
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3564
9042
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  3565
		/* case 0x99: Global ID offest not implemented */
8276
1fe8700644de (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: 8268
diff changeset
  3566
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3567
		default:
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3568
			/* GRF Parameter */
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3569
			if (param < 0x80) return _cur_grffile->param[param];
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3570
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3571
			/* In-game variable. */
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3572
			grfmsg(1, "Unsupported in-game variable 0x%02X", param);
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  3573
			return UINT_MAX;
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3574
	}
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3575
}
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3576
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3577
/* Action 0x06 */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3578
static void CfgApply(byte *buf, int len)
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3579
{
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3580
	/* <06> <param-num> <param-size> <offset> ... <FF>
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3581
	 *
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3582
	 * B param-num     Number of parameter to substitute (First = "zero")
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3583
	 *                 Ignored if that parameter was not specified in newgrf.cfg
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3584
	 * B param-size    How many bytes to replace.  If larger than 4, the
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3585
	 *                 bytes of the following parameter are used.  In that
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3586
	 *                 case, nothing is applied unless *all* parameters
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3587
	 *                 were specified.
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3588
	 * B offset        Offset into data from beginning of next sprite
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3589
	 *                 to place where parameter is to be stored. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3590
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3591
	/* Preload the next sprite */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3592
	uint32 pos = FioGetPos();
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3593
	uint16 num = FioReadWord();
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3594
	uint8 type = FioReadByte();
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3595
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3596
	/* Check if the sprite is a pseudo sprite. We can't operate on real sprites. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3597
	if (type == 0xFF) {
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  3598
		_preload_sprite = MallocT<byte>(num);
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3599
		FioReadBlock(_preload_sprite, num);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3600
	}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3601
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3602
	/* Reset the file position to the start of the next sprite */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3603
	FioSeekTo(pos, SEEK_SET);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3604
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3605
	if (type != 0xFF) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3606
		grfmsg(2, "CfgApply: Ignoring (next sprite is real, unsupported)");
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3607
		return;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3608
	}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3609
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3610
	/* Now perform the Action 0x06 on our data. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3611
	buf++;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3612
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3613
	for (;;) {
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3614
		uint i;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3615
		uint param_num;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3616
		uint param_size;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3617
		uint offset;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3618
		bool add_value;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3619
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3620
		/* Read the parameter to apply. 0xFF indicates no more data to change. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3621
		param_num = grf_load_byte(&buf);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3622
		if (param_num == 0xFF) break;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3623
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3624
		/* Get the size of the parameter to use. If the size covers multiple
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3625
		 * double words, sequential parameter values are used. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3626
		param_size = grf_load_byte(&buf);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3627
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3628
		/* Bit 7 of param_size indicates we should add to the original value
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3629
		 * instead of replacing it. */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  3630
		add_value  = HasBit(param_size, 7);
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3631
		param_size = GB(param_size, 0, 7);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3632
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3633
		/* Where to apply the data to within the pseudo sprite data. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3634
		offset     = grf_load_extended(&buf);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3635
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3636
		/* If the parameter is a GRF parameter (not an internal variable) check
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3637
		 * if it (and all further sequential parameters) has been defined. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3638
		if (param_num < 0x80 && (param_num + (param_size - 1) / 4) >= _cur_grffile->param_end) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3639
			grfmsg(2, "CfgApply: Ignoring (param %d not set)", (param_num + (param_size - 1) / 4));
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3640
			break;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3641
		}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3642
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3643
		grfmsg(8, "CfgApply: Applying %u bytes from parameter 0x%02X at offset 0x%04X", param_size, param_num, offset);
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3644
7148
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3645
		bool carry = false;
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3646
		for (i = 0; i < param_size; i++) {
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3647
			uint32 value = GetParamVal(param_num + i / 4, NULL);
7148
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3648
			/* Reset carry flag for each iteration of the variable (only really
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3649
			 * matters if param_size is greater than 4) */
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3650
			if (i == 0) carry = false;
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3651
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3652
			if (add_value) {
7148
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3653
				uint new_value = _preload_sprite[offset + i] + GB(value, (i % 4) * 8, 8) + (carry ? 1 : 0);
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3654
				_preload_sprite[offset + i] = GB(new_value, 0, 8);
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3655
				/* Check if the addition overflowed */
8de751a801a8 (svn r9883) -Fix (r4965): [NewGRF] Check for overflow and carry over when adding to the existing value.
peter1138
parents: 7145
diff changeset
  3656
				carry = new_value >= 256;
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3657
			} else {
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3658
				_preload_sprite[offset + i] = GB(value, (i % 4) * 8, 8);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3659
			}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3660
		}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3661
	}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3662
}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  3663
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  3664
/* Action 0x07 */
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  3665
/* Action 0x09 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3666
static void SkipIf(byte *buf, int len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3667
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3668
	/* <07/09> <param-num> <param-size> <condition-type> <value> <num-sprites>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3669
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3670
	 * B param-num
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3671
	 * B param-size
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3672
	 * B condition-type
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3673
	 * V value
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3674
	 * B num-sprites */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3675
	/* TODO: More params. More condition types. */
2336
48ace1344af0 (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
  3676
	uint32 cond_val = 0;
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3677
	uint32 mask = 0;
360
ff657281ae48 (svn r548) -newgrf: minor style changes, and application of boolean type
darkvater
parents: 359
diff changeset
  3678
	bool result;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3679
5841
b36d6b560aaa (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: 5838
diff changeset
  3680
	if (!check_length(len, 6, "SkipIf")) return;
3714
402f02b01241 (svn r4657) - NewGRF: use grf_load_byte() in favour of array accesses
peter1138
parents: 3712
diff changeset
  3681
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3682
	uint8 param     = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3683
	uint8 paramsize = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3684
	uint8 condtype  = grf_load_byte(&buf);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3685
359
f0ee94d705ed (svn r547) -newgrf: Enhanced support for action 0x7 and 0x9 (skips). Killer mixture mixed from octo's patch and pasky's old patch (pasky & octo).
darkvater
parents: 357
diff changeset
  3686
	if (condtype < 2) {
1611
bf352a87ef51 (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3687
		/* Always 1 for bit tests, the given value should be ignored. */
359
f0ee94d705ed (svn r547) -newgrf: Enhanced support for action 0x7 and 0x9 (skips). Killer mixture mixed from octo's patch and pasky's old patch (pasky & octo).
darkvater
parents: 357
diff changeset
  3688
		paramsize = 1;
f0ee94d705ed (svn r547) -newgrf: Enhanced support for action 0x7 and 0x9 (skips). Killer mixture mixed from octo's patch and pasky's old patch (pasky & octo).
darkvater
parents: 357
diff changeset
  3689
	}
f0ee94d705ed (svn r547) -newgrf: Enhanced support for action 0x7 and 0x9 (skips). Killer mixture mixed from octo's patch and pasky's old patch (pasky & octo).
darkvater
parents: 357
diff changeset
  3690
1611
bf352a87ef51 (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3691
	switch (paramsize) {
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3692
		case 4: cond_val = grf_load_dword(&buf); mask = 0xFFFFFFFF; break;
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3693
		case 2: cond_val = grf_load_word(&buf);  mask = 0x0000FFFF; break;
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3694
		case 1: cond_val = grf_load_byte(&buf);  mask = 0x000000FF; break;
1611
bf352a87ef51 (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3695
		default: break;
bf352a87ef51 (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  3696
	}
359
f0ee94d705ed (svn r547) -newgrf: Enhanced support for action 0x7 and 0x9 (skips). Killer mixture mixed from octo's patch and pasky's old patch (pasky & octo).
darkvater
parents: 357
diff changeset
  3697
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3698
	if (param < 0x80 && _cur_grffile->param_end <= param) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3699
		grfmsg(7, "SkipIf: Param %d undefined, skipping test", param);
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3700
		return;
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3701
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3702
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3703
	uint32 param_val = GetParamVal(param, &cond_val);
3806
dbbfd0c2331b (svn r4816) - NewGRF: action 7/9 improvements:
peter1138
parents: 3803
diff changeset
  3704
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3705
	grfmsg(7, "SkipIf: Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3706
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3707
	/*
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3708
	 * Parameter (variable in specs) 0x88 can only have GRF ID checking
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3709
	 * conditions, except conditions 0x0B and 0x0C (cargo availability)
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3710
	 * as those ignore the parameter. So, when the condition type is
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3711
	 * either of those, the specific variable 0x88 code is skipped, so
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3712
	 * the "general" code for the cargo availability conditions kicks in.
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3713
	 */
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3714
	if (param == 0x88 && condtype != 0x0B && condtype != 0x0C) {
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3715
		/* GRF ID checks */
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3716
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3717
		const GRFConfig *c = GetGRFConfig(cond_val);
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3718
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3719
		if (condtype != 10 && c == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3720
			grfmsg(7, "SkipIf: GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3721
			return;
5234
91b7def5e4b2 (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
  3722
		}
91b7def5e4b2 (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
  3723
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3724
		switch (condtype) {
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3725
			/* Tests 0x06 to 0x0A are only for param 0x88, GRFID checks */
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3726
			case 0x06: // Is GRFID active?
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  3727
				result = c->status == GCS_ACTIVATED;
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3728
				break;
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3729
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3730
			case 0x07: // Is GRFID non-active?
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  3731
				result = c->status != GCS_ACTIVATED;
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3732
				break;
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3733
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3734
			case 0x08: // GRFID is not but will be active?
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  3735
				result = c->status == GCS_INITIALISED;
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3736
				break;
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3737
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3738
			case 0x09: // GRFID is or will be active?
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  3739
				result = c->status == GCS_ACTIVATED || c->status == GCS_INITIALISED;
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3740
				break;
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3741
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3742
			case 0x0A: // GRFID is not nor will be active
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3743
				/* This is the only condtype that doesn't get ignored if the GRFID is not found */
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  3744
				result = c == NULL || c->flags == GCS_DISABLED || c->status == GCS_NOT_FOUND;
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3745
				break;
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3746
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3747
			default: grfmsg(1, "SkipIf: Unsupported GRF condition type %02X. Ignoring", condtype); return;
5234
91b7def5e4b2 (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
  3748
		}
5703
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3749
	} else {
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3750
		/* Parameter or variable tests */
3f848403a814 (svn r7711) -Fix (r7354): NewGRF Action 7, GRF check condition 10 didn't ignore unknown GRF IDs. Also separate GRF ID conditions
peter1138
parents: 5681
diff changeset
  3751
		switch (condtype) {
8304
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3752
			case 0x00: result = !!(param_val & (1 << cond_val));
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3753
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3754
			case 0x01: result = !(param_val & (1 << cond_val));
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3755
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3756
			case 0x02: result = (param_val & mask) == cond_val;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3757
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3758
			case 0x03: result = (param_val & mask) != cond_val;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3759
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3760
			case 0x04: result = (param_val & mask) < cond_val;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3761
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3762
			case 0x05: result = (param_val & mask) > cond_val;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3763
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3764
			case 0x0B: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3765
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3766
			case 0x0C: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3767
				break;
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3768
eb927ead85bf (svn r11358) -Fix: condition types 0x0B and 0x0C are also valid for variable 0x88 in action 7/9.
rubidium
parents: 8301
diff changeset
  3769
			default: grfmsg(1, "SkipIf: Unsupported condition type %02X. Ignoring", condtype); return;
5234
91b7def5e4b2 (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
  3770
		}
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3771
	}
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3772
1607
320079c7ac28 (svn r2111) So, result is bool therefore no need for this horrible == 0 thing.
pasky
parents: 1606
diff changeset
  3773
	if (!result) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3774
		grfmsg(2, "SkipIf: Not skipping sprites, test was false");
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3775
		return;
359
f0ee94d705ed (svn r547) -newgrf: Enhanced support for action 0x7 and 0x9 (skips). Killer mixture mixed from octo's patch and pasky's old patch (pasky & octo).
darkvater
parents: 357
diff changeset
  3776
	}
f0ee94d705ed (svn r547) -newgrf: Enhanced support for action 0x7 and 0x9 (skips). Killer mixture mixed from octo's patch and pasky's old patch (pasky & octo).
darkvater
parents: 357
diff changeset
  3777
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3778
	uint8 numsprites = grf_load_byte(&buf);
3561
29c95ab685c0 (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
  3779
29c95ab685c0 (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
  3780
	/* numsprites can be a GOTO label if it has been defined in the GRF
29c95ab685c0 (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
  3781
	 * file. The jump will always be the first matching label that follows
29c95ab685c0 (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
  3782
	 * the current nfo_line. If no matching label is found, the first matching
29c95ab685c0 (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
  3783
	 * label in the file is used. */
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3784
	GRFLabel *choice = NULL;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3785
	for (GRFLabel *label = _cur_grffile->label; label != NULL; label = label->next) {
3561
29c95ab685c0 (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
  3786
		if (label->label != numsprites) continue;
29c95ab685c0 (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
  3787
29c95ab685c0 (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
  3788
		/* Remember a goto before the current line */
29c95ab685c0 (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
  3789
		if (choice == NULL) choice = label;
29c95ab685c0 (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
  3790
		/* If we find a label here, this is definitely good */
29c95ab685c0 (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
  3791
		if (label->nfo_line > _nfo_line) {
29c95ab685c0 (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
  3792
			choice = label;
29c95ab685c0 (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
  3793
			break;
29c95ab685c0 (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
  3794
		}
29c95ab685c0 (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
  3795
	}
29c95ab685c0 (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
  3796
29c95ab685c0 (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
  3797
	if (choice != NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3798
		grfmsg(2, "SkipIf: Jumping to label 0x%0X at line %d, test was true", choice->label, choice->nfo_line);
3561
29c95ab685c0 (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
  3799
		FioSeekTo(choice->pos, SEEK_SET);
29c95ab685c0 (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
  3800
		_nfo_line = choice->nfo_line;
29c95ab685c0 (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
  3801
		return;
29c95ab685c0 (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
  3802
	}
29c95ab685c0 (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
  3803
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3804
	grfmsg(2, "SkipIf: Skipping %d sprites, test was true", numsprites);
357
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3805
	_skip_sprites = numsprites;
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3806
	if (_skip_sprites == 0) {
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3807
		/* Zero means there are no sprites to skip, so
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3808
		 * we use -1 to indicate that all further
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3809
		 * sprites should be skipped. */
912b71f33867 (svn r545) -newgrf: repaired indendation (pasky & octo)
celestar
parents: 356
diff changeset
  3810
		_skip_sprites = -1;
6422
14794ebde68e (svn r8831) -Feature: If an action 7/9 leads to skipping the rest of the file, disable the
maedhros
parents: 6421
diff changeset
  3811
14794ebde68e (svn r8831) -Feature: If an action 7/9 leads to skipping the rest of the file, disable the
maedhros
parents: 6421
diff changeset
  3812
		/* If an action 8 hasn't been encountered yet, disable the grf. */
8585
6579b0a2ba0e (svn r11650) -Fix: 'initialised' NewGRFs could still be deactivated in the later 'activation' pass.
rubidium
parents: 8580
diff changeset
  3813
		if (_cur_grfconfig->status != GCS_ACTIVATED) {
7421
094cf7e66ba8 (svn r10178) -Fix: Don't deactivate newgrf files when skipping the rest of the file during the initialisation stage.
maedhros
parents: 7410
diff changeset
  3814
			_cur_grfconfig->status = GCS_DISABLED;
094cf7e66ba8 (svn r10178) -Fix: Don't deactivate newgrf files when skipping the rest of the file during the initialisation stage.
maedhros
parents: 7410
diff changeset
  3815
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3816
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3817
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3818
5317
e235a3a573e3 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3819
5753
788f8d55eb54 (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: 5727
diff changeset
  3820
/* Action 0x08 (GLS_FILESCAN) */
788f8d55eb54 (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: 5727
diff changeset
  3821
static void ScanInfo(byte *buf, int len)
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3822
{
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3823
	if (!check_length(len, 8, "Info")) return;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3824
	buf++;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3825
	grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3826
	uint32 grfid  = grf_load_dword(&buf);
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3827
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3828
	_cur_grfconfig->grfid = grfid;
5317
e235a3a573e3 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3829
5329
2b117d8652f0 (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
  3830
	/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  3831
	if (GB(grfid, 24, 8) == 0xFF) SetBit(_cur_grfconfig->flags, GCF_SYSTEM);
5329
2b117d8652f0 (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
  3832
5317
e235a3a573e3 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3833
	len -= 6;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3834
	const char *name = grf_load_string(&buf, len);
6512
8625c30bd63d (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6474
diff changeset
  3835
	_cur_grfconfig->name = TranslateTTDPatchCodes(name);
8625c30bd63d (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6474
diff changeset
  3836
8625c30bd63d (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6474
diff changeset
  3837
	len -= strlen(name) + 1;
8625c30bd63d (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6474
diff changeset
  3838
	if (len > 0) {
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3839
		const char *info = grf_load_string(&buf, len);
6512
8625c30bd63d (svn r8964) -Codechange: use grf_load_string to read action 8 strings instead of trying to do the same manually.
rubidium
parents: 6474
diff changeset
  3840
		_cur_grfconfig->info = TranslateTTDPatchCodes(info);
5317
e235a3a573e3 (svn r7475) -Fix (r7348): sanity check NewGRF action 8 strings for null terminator
peter1138
parents: 5306
diff changeset
  3841
	}
5329
2b117d8652f0 (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
  3842
2b117d8652f0 (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
  3843
	/* GLS_INFOSCAN only looks for the action 8, so we can skip the rest of the file */
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3844
	_skip_sprites = -1;
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3845
}
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  3846
3640
b73687dd2b62 (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3847
/* Action 0x08 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3848
static void GRFInfo(byte *buf, int len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3849
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3850
	/* <08> <version> <grf-id> <name> <info>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3851
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3852
	 * B version       newgrf version, currently 06
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3853
	 * 4*B grf-id      globally unique ID of this .grf file
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3854
	 * S name          name of this .grf set
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3855
	 * S info          string describing the set, and e.g. author and copyright */
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3856
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3857
	if (!check_length(len, 8, "GRFInfo")) return;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3858
	buf++;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3859
	uint8 version    = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3860
	uint32 grfid     = grf_load_dword(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3861
	const char *name = grf_load_string(&buf, len - 6);
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  3862
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  3863
	_cur_grffile->grfid = grfid;
3640
b73687dd2b62 (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3864
	_cur_grffile->grf_version = version;
7302
7aa974539f27 (svn r10045) -Codechange: Process Action 8 during GLS_RESERVATION to allow Action 7/Action 9s to work properly
peter1138
parents: 7301
diff changeset
  3865
	_cur_grfconfig->status = _cur_stage < GLS_RESERVE ? GCS_INITIALISED : GCS_ACTIVATED;
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  3866
3711
4a0d1c635b56 (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
  3867
	/* Do swap the GRFID for displaying purposes since people expect that */
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  3868
	DEBUG(grf, 1, "GRFInfo: Loaded GRFv%d set %08lX - %s", version, BSWAP32(grfid), name);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3869
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3870
3640
b73687dd2b62 (svn r4549) - NewGRF: store the grf version from Action 0x08.
peter1138
parents: 3638
diff changeset
  3871
/* Action 0x0A */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3872
static void SpriteReplace(byte *buf, int len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3873
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3874
	/* <0A> <num-sets> <set1> [<set2> ...]
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3875
	 * <set>: <num-sprites> <first-sprite>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3876
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3877
	 * B num-sets      How many sets of sprites to replace.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3878
	 * Each set:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3879
	 * B num-sprites   How many sprites are in this set
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3880
	 * W first-sprite  First sprite number to replace */
361
ad7a042ee0eb (svn r549) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 360
diff changeset
  3881
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  3882
	buf++; // skip action byte
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3883
	uint8 num_sets = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3884
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3885
	for (uint i = 0; i < num_sets; i++) {
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  3886
		uint8 num_sprites = grf_load_byte(&buf);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  3887
		uint16 first_sprite = grf_load_word(&buf);
398
20f8a2faf809 (svn r590) -newgrf: Instead of a bunch of statinfo arrays, use station-array of struct StationSpec-s (pasky).
darkvater
parents: 397
diff changeset
  3888
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  3889
		grfmsg(2, "SpriteReplace: [Set %d] Changing %d sprites, beginning with %d",
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  3890
			i, num_sprites, first_sprite
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  3891
		);
361
ad7a042ee0eb (svn r549) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 360
diff changeset
  3892
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  3893
		for (uint j = 0; j < num_sprites; j++) {
8679
2bc4cefab729 (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: 8661
diff changeset
  3894
			int load_index = first_sprite + j;
8449
c5759019cbcd (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: 8437
diff changeset
  3895
			_nfo_line++;
8679
2bc4cefab729 (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: 8661
diff changeset
  3896
			LoadNextSprite(load_index, _file_index, _nfo_line); // XXX
2bc4cefab729 (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: 8661
diff changeset
  3897
8899
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3898
			/* Shore sprites now located at different addresses.
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3899
			 * So detect when the old ones get replaced. */
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3900
			if (IsInsideMM(load_index, SPR_ORIGINALSHORE_START, SPR_ORIGINALSHORE_END + 1)) {
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3901
				if (_loaded_newgrf_features.shore != SHORE_REPLACE_ACTION_5) _loaded_newgrf_features.shore = SHORE_REPLACE_ACTION_A;
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  3902
			}
361
ad7a042ee0eb (svn r549) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 360
diff changeset
  3903
		}
ad7a042ee0eb (svn r549) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 360
diff changeset
  3904
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3905
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3906
7025
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3907
/* Action 0x0A (SKIP) */
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3908
static void SkipActA(byte *buf, int len)
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3909
{
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3910
	buf++;
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3911
	uint8 num_sets = grf_load_byte(&buf);
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3912
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3913
	for (uint i = 0; i < num_sets; i++) {
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3914
		/* Skip the sprites this replaces */
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3915
		_skip_sprites += grf_load_byte(&buf);
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3916
		/* But ignore where they go */
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3917
		grf_load_word(&buf);
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3918
	}
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3919
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3920
	grfmsg(3, "SkipActA: Skipping %d sprites", _skip_sprites);
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3921
}
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  3922
3715
dd9807bf5927 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  3923
/* Action 0x0B */
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3924
static void GRFLoadError(byte *buf, int len)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3925
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3926
	/* <0B> <severity> <language-id> <message-id> [<message...> 00] [<data...>] 00 [<parnum>]
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3927
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3928
	 * B severity      00: notice, contine loading grf file
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3929
	 *                 01: warning, continue loading grf file
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3930
	 *                 02: error, but continue loading grf file, and attempt
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3931
	 *                     loading grf again when loading or starting next game
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3932
	 *                 03: error, abort loading and prevent loading again in
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3933
	 *                     the future (only when restarting the patch)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3934
	 * B language-id   see action 4, use 1F for built-in error messages
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3935
	 * B message-id    message to show, see below
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3936
	 * S message       for custom messages (message-id FF), text of the message
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3937
	 *                 not present for built-in messages.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3938
	 * V data          additional data for built-in (or custom) messages
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3939
	 * B parnum        parameter numbers to be shown in the message (maximum of 2) */
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3940
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3941
	static const StringID msgstr[] = {
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3942
		STR_NEWGRF_ERROR_VERSION_NUMBER,
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3943
		STR_NEWGRF_ERROR_DOS_OR_WINDOWS,
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3944
		STR_NEWGRF_ERROR_UNSET_SWITCH,
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3945
		STR_NEWGRF_ERROR_INVALID_PARAMETER,
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3946
		STR_NEWGRF_ERROR_LOAD_BEFORE,
8276
1fe8700644de (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: 8268
diff changeset
  3947
		STR_NEWGRF_ERROR_LOAD_AFTER,
1fe8700644de (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: 8268
diff changeset
  3948
		STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3949
	};
5567
2af6b4aa2833 (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5557
diff changeset
  3950
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3951
	static const StringID sevstr[] = {
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3952
		STR_NEWGRF_ERROR_MSG_INFO,
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3953
		STR_NEWGRF_ERROR_MSG_WARNING,
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3954
		STR_NEWGRF_ERROR_MSG_ERROR,
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3955
		STR_NEWGRF_ERROR_MSG_FATAL
5567
2af6b4aa2833 (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5557
diff changeset
  3956
	};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  3957
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3958
	if (!check_length(len, 6, "GRFLoadError")) return;
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3959
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3960
	/* For now we can only show one message per newgrf file. */
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3961
	if (_cur_grfconfig->error != NULL) return;
6416
be4399248c60 (svn r8825) -Fix: Make sure strings read from newgrf files are 0 terminated and 0
maedhros
parents: 6388
diff changeset
  3962
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  3963
	buf++; // Skip the action byte.
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3964
	byte severity   = grf_load_byte(&buf);
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3965
	byte lang       = grf_load_byte(&buf);
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3966
	byte message_id = grf_load_byte(&buf);
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3967
	len -= 4;
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3968
7369
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  3969
	/* Skip the error if it isn't valid for the current language. */
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  3970
	if (!CheckGrfLangID(lang, _cur_grffile->grf_version)) return;
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  3971
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3972
	/* Skip the error until the activation stage unless bit 7 of the severity
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3973
	 * is set. */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  3974
	if (!HasBit(severity, 7) && _cur_stage == GLS_INIT) {
7301
0e314c60f7a0 (svn r10044) -Fix: Minor NewGRF debug message fixes, and skip sprites of an unsupported Action 5 feature.
peter1138
parents: 7277
diff changeset
  3975
		grfmsg(7, "GRFLoadError: Skipping non-fatal GRFLoadError in stage %d", _cur_stage);
441
892cb9999501 (svn r650) Pasky fix #4. (Misc fixes to get USSet going)
miham
parents: 440
diff changeset
  3976
		return;
3588
a1adf8a40756 (svn r4474) - NewGRF: Skip non-fatal errors when not in stage 2.
peter1138
parents: 3577
diff changeset
  3977
	}
8425
72a71d480c5f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 8424
diff changeset
  3978
	ClrBit(severity, 7);
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3979
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3980
	if (severity >= lengthof(sevstr)) {
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3981
		grfmsg(7, "GRFLoadError: Invalid severity id %d. Setting to 2 (non-fatal error).", severity);
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3982
		severity = 2;
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3983
	} else if (severity == 3) {
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3984
		/* This is a fatal error, so make sure the GRF is deactivated and no
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3985
		 * more of it gets loaded. */
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  3986
		_cur_grfconfig->status = GCS_DISABLED;
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3987
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3988
		_skip_sprites = -1;
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3989
	}
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3990
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3991
	if (message_id >= lengthof(msgstr) && message_id != 0xFF) {
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3992
		grfmsg(7, "GRFLoadError: Invalid message id.");
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3993
		return;
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3994
	}
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3995
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3996
	if (len <= 1) {
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  3997
		grfmsg(7, "GRFLoadError: No message data supplied.");
6421
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3998
		return;
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  3999
	}
48a6f5c43920 (svn r8830) -Feature: Stop loading and disable the current newgrf if a fatal error message
maedhros
parents: 6417
diff changeset
  4000
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4001
	GRFError *error = CallocT<GRFError>(1);
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4002
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4003
	error->severity = sevstr[severity];
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4004
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4005
	if (message_id == 0xFF) {
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4006
		/* This is a custom error message. */
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4007
		const char *message = grf_load_string(&buf, len);
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4008
		len -= (strlen(message) + 1);
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4009
7369
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  4010
		error->custom_message = TranslateTTDPatchCodes(message);
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4011
	} else {
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4012
		error->message = msgstr[message_id];
6429
02c062eb2c74 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6422
diff changeset
  4013
	}
02c062eb2c74 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6422
diff changeset
  4014
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4015
	if (len > 0) {
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4016
		const char *data = grf_load_string(&buf, len);
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4017
		len -= (strlen(data) + 1);
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4018
7369
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  4019
		error->data = TranslateTTDPatchCodes(data);
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4020
	}
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4021
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4022
	/* Only two parameter numbers can be used in the string. */
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4023
	uint i = 0;
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4024
	for (; i < 2 && len > 0; i++) {
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4025
		error->param_number[i] = grf_load_byte(&buf);
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4026
		len--;
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4027
	}
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4028
	error->num_params = i;
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4029
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6454
diff changeset
  4030
	_cur_grfconfig->error = error;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4031
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4032
3715
dd9807bf5927 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  4033
/* Action 0x0C */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4034
static void GRFComment(byte *buf, int len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4035
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4036
	/* <0C> [<ignored...>]
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4037
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4038
	 * V ignored       Anything following the 0C is ignored */
3561
29c95ab685c0 (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
  4039
29c95ab685c0 (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
  4040
	if (len == 1) return;
29c95ab685c0 (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
  4041
6433
84cd6e4262fd (svn r8843) -Fix
tron
parents: 6429
diff changeset
  4042
	int text_len = len - 1;
84cd6e4262fd (svn r8843) -Fix
tron
parents: 6429
diff changeset
  4043
	const char *text = (const char*)(buf + 1);
84cd6e4262fd (svn r8843) -Fix
tron
parents: 6429
diff changeset
  4044
	grfmsg(2, "GRFComment: %.*s", text_len, text);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4045
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4046
5776
d80e79a2e71b (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: 5753
diff changeset
  4047
/* Action 0x0D (GLS_SAFETYSCAN) */
d80e79a2e71b (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: 5753
diff changeset
  4048
static void SafeParamSet(byte *buf, int len)
d80e79a2e71b (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: 5753
diff changeset
  4049
{
5841
b36d6b560aaa (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: 5838
diff changeset
  4050
	if (!check_length(len, 5, "SafeParamSet")) return;
5776
d80e79a2e71b (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: 5753
diff changeset
  4051
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4052
	uint8 target = grf_load_byte(&buf);
5776
d80e79a2e71b (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: 5753
diff changeset
  4053
d80e79a2e71b (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: 5753
diff changeset
  4054
	/* Only writing GRF parameters is considered safe */
d80e79a2e71b (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: 5753
diff changeset
  4055
	if (target < 0x80) return;
d80e79a2e71b (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: 5753
diff changeset
  4056
d80e79a2e71b (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: 5753
diff changeset
  4057
	/* GRM could be unsafe, but as here it can only happen after other GRFs
d80e79a2e71b (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: 5753
diff changeset
  4058
	 * are loaded, it should be okay. If the GRF tried to use the slots it
d80e79a2e71b (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: 5753
diff changeset
  4059
	 * reserved, it would be marked unsafe anyway. GRM for (e.g. bridge)
d80e79a2e71b (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: 5753
diff changeset
  4060
	 * sprites  is considered safe. */
d80e79a2e71b (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: 5753
diff changeset
  4061
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  4062
	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
5776
d80e79a2e71b (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: 5753
diff changeset
  4063
d80e79a2e71b (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: 5753
diff changeset
  4064
	/* Skip remainder of GRF */
d80e79a2e71b (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: 5753
diff changeset
  4065
	_skip_sprites = -1;
d80e79a2e71b (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: 5753
diff changeset
  4066
}
d80e79a2e71b (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: 5753
diff changeset
  4067
7011
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4068
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4069
static uint32 GetPatchVariable(uint8 param)
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4070
{
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4071
	switch (param) {
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4072
		/* start year - 1920 */
7075
7d7fa1ff2b18 (svn r9793) -Fix (r9701): Action D 'TTDPatch variable' 0x0B should be the starting year, not the current year.
maedhros
parents: 7072
diff changeset
  4073
		case 0x0B: return max(_patches.starting_year, ORIGINAL_BASE_YEAR) - ORIGINAL_BASE_YEAR;
8887
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4074
7011
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4075
		/* freight trains weight factor */
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4076
		case 0x0E: return _patches.freight_trains;
8887
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4077
7011
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4078
		/* empty wagon speed increase */
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4079
		case 0x0F: return 0;
8887
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4080
7011
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4081
		/* plane speed factor */
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4082
		case 0x10: return 4;
8887
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4083
7011
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4084
		/* 2CC colormap base sprite */
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4085
		case 0x11: return SPR_2CCMAP_BASE;
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4086
8887
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4087
		/* map size: format = -MABXYSS
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4088
		 * M  : the type of map
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4089
		 *       bit 0 : set   : squared map. Bit 1 is now not relevant
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4090
		 *               clear : rectangle map. Bit 1 will indicate the bigger edge of the map
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4091
		 *       bit 1 : set   : Y is the bigger edge. Bit 0 is clear
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4092
		 *               clear : X is the bigger edge.
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4093
		 * A  : minimum edge(log2) of the map
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4094
		 * B  : maximum edge(log2) of the map
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4095
		 * XY : edges(log2) of each side of the map.
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4096
		 * SS : combination of both X and Y, thus giving the size(log2) of the map
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4097
		 */
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4098
		case 0x13: {
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4099
			byte map_bits = 0;
8889
a3633be104ff (svn r11963) -Fix(r11961): Forgot to specify the meaning of the magical 6 substraction
belugas
parents: 8887
diff changeset
  4100
			byte log_X = MapLogX() - 6; // substraction is required to make the minimal size (64) zero based
8887
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4101
			byte log_Y = MapLogY() - 6;
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4102
			byte max_edge = max(log_X, log_Y);
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4103
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4104
			if (log_X == log_Y) { // we have a squared map, since both edges are identical
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4105
				SetBit(map_bits ,0);
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4106
			} else {
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4107
				if (max_edge == log_Y) SetBit(map_bits, 1); // edge Y been the biggest, mark it
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4108
			}
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4109
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4110
			return (map_bits << 24) | (min(log_X, log_Y) << 20) | (max_edge << 16) |
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4111
				(log_X << 12) | (log_Y << 8) | (log_X + log_Y);
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4112
		}
4bc5c9811562 (svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents: 8868
diff changeset
  4113
7011
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4114
		default:
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4115
			grfmsg(2, "ParamSet: Unknown Patch variable 0x%02X.", param);
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4116
			return 0;
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4117
	}
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4118
}
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4119
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4120
7277
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4121
static uint32 PerformGRM(uint32 *grm, uint16 num_ids, uint16 count, uint8 op, uint8 target, const char *type)
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4122
{
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4123
	uint start = 0;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4124
	uint size  = 0;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4125
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4126
	if (op == 6) {
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4127
		/* Return GRFID of set that reserved ID */
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4128
		return grm[_cur_grffile->param[target]];
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4129
	}
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4130
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4131
	/* With an operation of 2 or 3, we want to reserve a specific block of IDs */
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4132
	if (op == 2 || op == 3) start = _cur_grffile->param[target];
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4133
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4134
	for (uint i = start; i < num_ids; i++) {
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4135
		if (grm[i] == 0) {
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4136
			size++;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4137
		} else {
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4138
			if (op == 2 || op == 3) break;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4139
			start = i + 1;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4140
			size = 0;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4141
		}
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4142
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4143
		if (size == count) break;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4144
	}
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4145
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4146
	if (size == count) {
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4147
		/* Got the slot... */
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4148
		if (op == 0 || op == 3) {
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4149
			grfmsg(2, "ParamSet: GRM: Reserving %d %s at %d", count, type, start);
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4150
			for (uint i = 0; i < count; i++) grm[start + i] = _cur_grffile->grfid;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4151
		}
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4152
		return start;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4153
	}
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4154
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4155
	/* Unable to allocate */
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4156
	if (op != 4 && op != 5) {
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4157
		/* Deactivate GRF */
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4158
		grfmsg(0, "ParamSet: GRM: Unable to allocate %d %s, deactivating", count, type);
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4159
		_cur_grfconfig->status = GCS_DISABLED;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4160
		_skip_sprites = -1;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4161
		return UINT_MAX;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4162
	}
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4163
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4164
	grfmsg(1, "ParamSet: GRM: Unable to allocate %d %s", count, type);
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4165
	return UINT_MAX;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4166
}
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4167
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4168
356
e3721e481b38 (svn r544) -newgrf: codechange for better handling (pasky and octo__)
celestar
parents: 193
diff changeset
  4169
/* Action 0x0D */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4170
static void ParamSet(byte *buf, int len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4171
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4172
	/* <0D> <target> <operation> <source1> <source2> [<data>]
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4173
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4174
	 * B target        parameter number where result is stored
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4175
	 * B operation     operation to perform, see below
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4176
	 * B source1       first source operand
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4177
	 * B source2       second source operand
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4178
	 * D data          data to use in the calculation, not necessary
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4179
	 *                 if both source1 and source2 refer to actual parameters
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4180
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4181
	 * Operations
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4182
	 * 00      Set parameter equal to source1
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4183
	 * 01      Addition, source1 + source2
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4184
	 * 02      Subtraction, source1 - source2
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4185
	 * 03      Unsigned multiplication, source1 * source2 (both unsigned)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4186
	 * 04      Signed multiplication, source1 * source2 (both signed)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4187
	 * 05      Unsigned bit shift, source1 by source2 (source2 taken to be a
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4188
	 *         signed quantity; left shift if positive and right shift if
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4189
	 *         negative, source1 is unsigned)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4190
	 * 06      Signed bit shift, source1 by source2
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4191
	 *         (source2 like in 05, and source1 as well)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4192
	 */
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4193
5841
b36d6b560aaa (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: 5838
diff changeset
  4194
	if (!check_length(len, 5, "ParamSet")) return;
418
67457dd7e5bc (svn r615) Fix the same bug in ParamSet action loading, pointer out by Bjarni too. (pasky)
bjarni
parents: 416
diff changeset
  4195
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4196
	uint8 target = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4197
	uint8 oper   = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4198
	uint32 src1  = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4199
	uint32 src2  = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4200
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4201
	uint32 data = 0;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4202
	if (len >= 8) data = grf_load_dword(&buf);
398
20f8a2faf809 (svn r590) -newgrf: Instead of a bunch of statinfo arrays, use station-array of struct StationSpec-s (pasky).
darkvater
parents: 397
diff changeset
  4203
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4204
	/* You can add 80 to the operation to make it apply only if the target
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4205
	 * is not defined yet.  In this respect, a parameter is taken to be
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4206
	 * defined if any of the following applies:
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4207
	 * - it has been set to any value in the newgrf(w).cfg parameter list
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4208
	 * - it OR A PARAMETER WITH HIGHER NUMBER has been set to any value by
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4209
	 *   an earlier action D */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  4210
	if (HasBit(oper, 7)) {
3807
927ac7827a28 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  4211
		if (target < 0x80 && target < _cur_grffile->param_end) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  4212
			grfmsg(7, "ParamSet: Param %u already defined, skipping", target);
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4213
			return;
3807
927ac7827a28 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  4214
		}
927ac7827a28 (svn r4817) - NewGRF: allow partial support for parameter retrieval in action D.
peter1138
parents: 3806
diff changeset
  4215
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4216
		oper = GB(oper, 0, 7);
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4217
	}
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4218
3808
332b9b202afb (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
  4219
	if (src2 == 0xFE) {
332b9b202afb (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
  4220
		if (GB(data, 0, 8) == 0xFF) {
332b9b202afb (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
  4221
			if (data == 0x0000FFFF) {
332b9b202afb (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
  4222
				/* Patch variables */
7011
9a7685426523 (svn r9701) -Codechange: Add support for returning 'ttdpatch variables' - http://wiki.ttdpatch.net/tiki-index.php?page=ActionDSpecialVariables
peter1138
parents: 7003
diff changeset
  4223
				src1 = GetPatchVariable(src1);
3808
332b9b202afb (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
  4224
			} else {
332b9b202afb (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
  4225
				/* GRF Resource Management */
5225
52ddcedcc6f7 (svn r7345) -Codechange: enumification of NewGRF loading stage, and move enum definition to header for future use.
peter1138
parents: 5211
diff changeset
  4226
				if (_cur_stage != GLS_ACTIVATION) {
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4227
					/* Ignore GRM during initialization */
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4228
					src1 = 0;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4229
				} else {
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4230
					uint8  op      = src1;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4231
					uint8  feature = GB(data, 8, 8);
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4232
					uint16 count   = GB(data, 16, 16);
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4233
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4234
					switch (feature) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4235
						case 0x00: // Trains
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4236
						case 0x01: // Road Vehicles
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4237
						case 0x02: // Ships
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4238
						case 0x03: // Aircraft
7277
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4239
							src1 = PerformGRM(&_grm_engines[_vehshifts[feature]], _vehcounts[feature], count, op, target, "vehicles");
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4240
							if (_skip_sprites == -1) return;
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4241
							break;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4242
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4243
						case 0x08: // General sprites
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4244
							switch (op) {
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4245
								case 0:
6140
22c9279c3bbd (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 6126
diff changeset
  4246
									/* Check if the allocated sprites will fit below the original sprite limit */
22c9279c3bbd (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 6126
diff changeset
  4247
									if (_cur_spriteid + count >= 16384) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  4248
										grfmsg(0, "ParamSet: GRM: Unable to allocate %d sprites; try changing NewGRF order", count);
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  4249
										_cur_grfconfig->status = GCS_DISABLED;
6140
22c9279c3bbd (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 6126
diff changeset
  4250
22c9279c3bbd (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 6126
diff changeset
  4251
										_skip_sprites = -1;
22c9279c3bbd (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 6126
diff changeset
  4252
										return;
22c9279c3bbd (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 6126
diff changeset
  4253
									}
22c9279c3bbd (svn r8505) -Codechange: Ensure GRM allocated sprites will be below the original 16384 sprite limit. If not, fail and disable the NewGRF.
peter1138
parents: 6126
diff changeset
  4254
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4255
									/* 'Reserve' space at the current sprite ID */
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4256
									src1 = _cur_spriteid;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4257
									_cur_spriteid += count;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4258
									break;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4259
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4260
								case 1:
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4261
									src1 = _cur_spriteid;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4262
									break;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4263
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4264
								default:
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  4265
									grfmsg(1, "ParamSet: GRM: Unsupported operation %d for general sprites", op);
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4266
									return;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4267
							}
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4268
							break;
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4269
7277
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4270
						case 0x0B: // Cargo
8186
a5c489500f23 (svn r11224) -Fix: GRM for cargos has registration entries for both cargo IDs and cargo bitmasks, not only cargo IDs.
rubidium
parents: 8170
diff changeset
  4271
							/* There are two ranges: one for cargo IDs and one for cargo bitmasks */
a5c489500f23 (svn r11224) -Fix: GRM for cargos has registration entries for both cargo IDs and cargo bitmasks, not only cargo IDs.
rubidium
parents: 8170
diff changeset
  4272
							src1 = PerformGRM(_grm_cargos, NUM_CARGO * 2, count, op, target, "cargos");
7277
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4273
							if (_skip_sprites == -1) return;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4274
							break;
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  4275
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  4276
						default: grfmsg(1, "ParamSet: GRM: Unsupported feature 0x%X", feature); return;
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4277
					}
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  4278
				}
3808
332b9b202afb (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
  4279
			}
332b9b202afb (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
  4280
		} else {
332b9b202afb (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
  4281
			/* Read another GRF File's parameter */
332b9b202afb (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
  4282
			const GRFFile *file = GetFileByGRFID(data);
332b9b202afb (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
  4283
			if (file == NULL || src1 >= file->param_end) {
332b9b202afb (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
  4284
				src1 = 0;
332b9b202afb (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
  4285
			} else {
332b9b202afb (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
  4286
				src1 = file->param[src1];
332b9b202afb (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
  4287
			}
332b9b202afb (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
  4288
		}
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4289
	} else {
3808
332b9b202afb (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
  4290
		/* The source1 and source2 operands refer to the grf parameter number
332b9b202afb (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
  4291
		 * like in action 6 and 7.  In addition, they can refer to the special
332b9b202afb (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
  4292
		 * variables available in action 7, or they can be FF to use the value
332b9b202afb (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
  4293
		 * of <data>.  If referring to parameters that are undefined, a value
332b9b202afb (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
  4294
		 * of 0 is used instead.  */
3811
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  4295
		src1 = (src1 == 0xFF) ? data : GetParamVal(src1, NULL);
7324eb563ae0 (svn r4821) - NewGRF: simplify parameter retrieval in Action 0x0D
peter1138
parents: 3808
diff changeset
  4296
		src2 = (src2 == 0xFF) ? data : GetParamVal(src2, NULL);
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4297
	}
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4298
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4299
	/* TODO: You can access the parameters of another GRF file by using
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4300
	 * source2=FE, source1=the other GRF's parameter number and data=GRF
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4301
	 * ID.  This is only valid with operation 00 (set).  If the GRF ID
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4302
	 * cannot be found, a value of 0 is used for the parameter value
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4303
	 * instead. */
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4304
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4305
	uint32 res;
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4306
	switch (oper) {
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4307
		case 0x00:
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4308
			res = src1;
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4309
			break;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4310
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4311
		case 0x01:
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4312
			res = src1 + src2;
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4313
			break;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4314
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4315
		case 0x02:
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4316
			res = src1 - src2;
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4317
			break;
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4318
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4319
		case 0x03:
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4320
			res = src1 * src2;
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4321
			break;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4322
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4323
		case 0x04:
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4324
			res = (int32)src1 * (int32)src2;
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4325
			break;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4326
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4327
		case 0x05:
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4328
			if ((int32)src2 < 0) {
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4329
				res = src1 >> -(int32)src2;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4330
			} else {
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4331
				res = src1 << src2;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4332
			}
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4333
			break;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4334
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4335
		case 0x06:
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4336
			if ((int32)src2 < 0) {
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4337
				res = (int32)src1 >> -(int32)src2;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4338
			} else {
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4339
				res = (int32)src1 << src2;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 3997
diff changeset
  4340
			}
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4341
			break;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4342
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4343
		case 0x07: // Bitwise AND
2442
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4344
			res = src1 & src2;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4345
			break;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4346
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4347
		case 0x08: // Bitwise OR
2442
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4348
			res = src1 | src2;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4349
			break;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4350
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4351
		case 0x09: // Unsigned division
2442
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4352
			if (src2 == 0) {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4353
				res = src1;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4354
			} else {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4355
				res = src1 / src2;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4356
			}
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4357
			break;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4358
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4359
		case 0x0A: // Signed divison
2442
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4360
			if (src2 == 0) {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4361
				res = src1;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4362
			} else {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4363
				res = (int32)src1 / (int32)src2;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4364
			}
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4365
			break;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4366
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4367
		case 0x0B: // Unsigned modulo
2442
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4368
			if (src2 == 0) {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4369
				res = src1;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4370
			} else {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4371
				res = src1 % src2;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4372
			}
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4373
			break;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4374
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4375
		case 0x0C: // Signed modulo
2442
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4376
			if (src2 == 0) {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4377
				res = src1;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4378
			} else {
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4379
				res = (int32)src1 % (int32)src2;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4380
			}
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4381
			break;
da9a2075c747 (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  4382
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4383
		default: grfmsg(0, "ParamSet: Unknown operation %d, skipping", oper); return;
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4384
	}
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4385
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4386
	switch (target) {
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4387
		case 0x8E: // Y-Offset for train sprites
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4388
			_traininfo_vehicle_pitch = res;
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4389
			break;
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4390
8226
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4391
		case 0x8F: // Rail track type cost factors
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4392
			_railtype_cost_multiplier[0] = GB(res, 0, 8);
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4393
			if (_patches.disable_elrails) {
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4394
				_railtype_cost_multiplier[1] = GB(res, 0, 8);
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4395
				_railtype_cost_multiplier[2] = GB(res, 8, 8);
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4396
			} else {
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4397
				_railtype_cost_multiplier[1] = GB(res, 8, 8);
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4398
				_railtype_cost_multiplier[2] = GB(res, 16, 8);
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4399
			}
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4400
			_railtype_cost_multiplier[3] = GB(res, 16, 8);
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4401
			break;
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4402
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4403
		/* @todo implement */
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4404
		case 0x93: // Tile refresh offset to left
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4405
		case 0x94: // Tile refresh offset to right
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4406
		case 0x95: // Tile refresh offset upwards
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4407
		case 0x96: // Tile refresh offset downwards
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4408
		case 0x97: // Snow line height
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4409
		case 0x99: // Global ID offset
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4410
			grfmsg(7, "ParamSet: Skipping unimplemented target 0x%02X", target);
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4411
			break;
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4412
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4413
		case 0x9E: // Miscellaneous GRF features
3814
d0b901dfc313 (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  4414
			_misc_grf_features = res;
3845
c3cd4b825c2f (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  4415
			/* Set train list engine width */
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 7029
diff changeset
  4416
			_traininfo_vehicle_width = HasGrfMiscBit(GMB_TRAIN_WIDTH_32_PIXELS) ? 32 : 29;
3814
d0b901dfc313 (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  4417
			break;
d0b901dfc313 (svn r4824) - NewGRF: add support for getting/setting miscellaneous grf flags (param 0x9E)
peter1138
parents: 3811
diff changeset
  4418
9042
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  4419
		case 0x9F: // locale-dependent settings
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  4420
			grfmsg(7, "ParamSet: Skipping unimplemented target 0x%02X", target);
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  4421
			break;
28aab5504e15 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 9040
diff changeset
  4422
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4423
		default:
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4424
			if (target < 0x80) {
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4425
				_cur_grffile->param[target] = res;
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4426
				if (target + 1U > _cur_grffile->param_end) _cur_grffile->param_end = target + 1;
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4427
			} else {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4428
				grfmsg(7, "ParamSet: Skipping unknown target 0x%02X", target);
2345
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4429
			}
8a14ff5d4851 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  4430
			break;
362
bd9bc9c072ba (svn r550) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents: 361
diff changeset
  4431
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4432
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4433
5753
788f8d55eb54 (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: 5727
diff changeset
  4434
/* Action 0x0E (GLS_SAFETYSCAN) */
788f8d55eb54 (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: 5727
diff changeset
  4435
static void SafeGRFInhibit(byte *buf, int len)
788f8d55eb54 (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: 5727
diff changeset
  4436
{
788f8d55eb54 (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: 5727
diff changeset
  4437
	/* <0E> <num> <grfids...>
788f8d55eb54 (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: 5727
diff changeset
  4438
	 *
788f8d55eb54 (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: 5727
diff changeset
  4439
	 * B num           Number of GRFIDs that follow
788f8d55eb54 (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: 5727
diff changeset
  4440
	 * D grfids        GRFIDs of the files to deactivate */
788f8d55eb54 (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: 5727
diff changeset
  4441
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4442
	if (!check_length(len, 2, "GRFInhibit")) return;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4443
	buf++;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4444
	uint8 num = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4445
	if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4446
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4447
	for (uint i = 0; i < num; i++) {
5753
788f8d55eb54 (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: 5727
diff changeset
  4448
		uint32 grfid = grf_load_dword(&buf);
788f8d55eb54 (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: 5727
diff changeset
  4449
788f8d55eb54 (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: 5727
diff changeset
  4450
		/* GRF is unsafe it if tries to deactivate other GRFs */
788f8d55eb54 (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: 5727
diff changeset
  4451
		if (grfid != _cur_grfconfig->grfid) {
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  4452
			SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
5753
788f8d55eb54 (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: 5727
diff changeset
  4453
788f8d55eb54 (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: 5727
diff changeset
  4454
			/* Skip remainder of GRF */
788f8d55eb54 (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: 5727
diff changeset
  4455
			_skip_sprites = -1;
788f8d55eb54 (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: 5727
diff changeset
  4456
788f8d55eb54 (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: 5727
diff changeset
  4457
			return;
788f8d55eb54 (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: 5727
diff changeset
  4458
		}
788f8d55eb54 (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: 5727
diff changeset
  4459
	}
788f8d55eb54 (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: 5727
diff changeset
  4460
}
788f8d55eb54 (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: 5727
diff changeset
  4461
3715
dd9807bf5927 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  4462
/* Action 0x0E */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4463
static void GRFInhibit(byte *buf, int len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4464
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4465
	/* <0E> <num> <grfids...>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4466
	 *
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4467
	 * B num           Number of GRFIDs that follow
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4468
	 * D grfids        GRFIDs of the files to deactivate */
367
d0d895bd4972 (svn r555) -newgrf: Preliminary support for action 0xE. Inhibit another GRF file by ID. It won't really work until we get stages support (pasky & octo).
darkvater
parents: 366
diff changeset
  4469
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4470
	if (!check_length(len, 2, "GRFInhibit")) return;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4471
	buf++;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4472
	uint8 num = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4473
	if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4474
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4475
	for (uint i = 0; i < num; i++) {
367
d0d895bd4972 (svn r555) -newgrf: Preliminary support for action 0xE. Inhibit another GRF file by ID. It won't really work until we get stages support (pasky & octo).
darkvater
parents: 366
diff changeset
  4476
		uint32 grfid = grf_load_dword(&buf);
5333
8e7d68b06399 (svn r7495) -Fix (r7354): [NewGRF] Deactivate the target GRF, not the current GRF.
peter1138
parents: 5329
diff changeset
  4477
		GRFConfig *file = GetGRFConfig(grfid);
367
d0d895bd4972 (svn r555) -newgrf: Preliminary support for action 0xE. Inhibit another GRF file by ID. It won't really work until we get stages support (pasky & octo).
darkvater
parents: 366
diff changeset
  4478
d0d895bd4972 (svn r555) -newgrf: Preliminary support for action 0xE. Inhibit another GRF file by ID. It won't really work until we get stages support (pasky & octo).
darkvater
parents: 366
diff changeset
  4479
		/* Unset activation flag */
5557
dc2402eb851b (svn r7554) -Fix (r7496): In Action 0xE, don't deactivate the current GRF (to be ported to 0.5)
peter1138
parents: 5340
diff changeset
  4480
		if (file != NULL && file != _cur_grfconfig) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4481
			grfmsg(2, "GRFInhibit: Deactivating file '%s'", file->filename);
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  4482
			file->status = GCS_DISABLED;
367
d0d895bd4972 (svn r555) -newgrf: Preliminary support for action 0xE. Inhibit another GRF file by ID. It won't really work until we get stages support (pasky & octo).
darkvater
parents: 366
diff changeset
  4483
		}
d0d895bd4972 (svn r555) -newgrf: Preliminary support for action 0xE. Inhibit another GRF file by ID. It won't really work until we get stages support (pasky & octo).
darkvater
parents: 366
diff changeset
  4484
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4485
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  4486
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4487
/* Action 0x0F */
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4488
static void FeatureTownName(byte *buf, int len)
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4489
{
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4490
	/* <0F> <id> <style-name> <num-parts> <parts>
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4491
	 *
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4492
	 * B id          ID of this definition in bottom 7 bits (final definition if bit 7 set)
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4493
	 * V style-name  Name of the style (only for final definition)
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4494
	 * B num-parts   Number of parts in this definition
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4495
	 * V parts       The parts */
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4496
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4497
	if (!check_length(len, 1, "FeatureTownName: definition ID")) return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4498
	buf++; len--;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4499
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4500
	uint32 grfid = _cur_grffile->grfid;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4501
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4502
	GRFTownName *townname = AddGRFTownName(grfid);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4503
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4504
	byte id = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4505
	len--;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4506
	grfmsg(6, "FeatureTownName: definition 0x%02X", id & 0x7F);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4507
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  4508
	if (HasBit(id, 7)) {
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4509
		/* Final definition */
8425
72a71d480c5f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 8424
diff changeset
  4510
		ClrBit(id, 7);
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4511
		bool new_scheme = _cur_grffile->grf_version >= 7;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4512
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4513
		if (!check_length(len, 1, "FeatureTownName: lang_id")) return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4514
		byte lang = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4515
		len--;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4516
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4517
		byte nb_gen = townname->nb_gen;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4518
		do {
8425
72a71d480c5f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 8424
diff changeset
  4519
			ClrBit(lang, 7);
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4520
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4521
			if (!check_length(len, 1, "FeatureTownName: style name")) return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4522
			const char *name = grf_load_string(&buf, len);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4523
			len -= strlen(name) + 1;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4524
			grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, TranslateTTDPatchCodes(name));
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4525
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4526
			townname->name[nb_gen] = AddGRFString(grfid, id, lang, new_scheme, name, STR_UNDEFINED);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4527
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4528
			if (!check_length(len, 1, "FeatureTownName: lang_id")) return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4529
			lang = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4530
			len--;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4531
		} while (lang != 0);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4532
		townname->id[nb_gen] = id;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4533
		townname->nb_gen++;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4534
	}
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4535
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4536
	if (!check_length(len, 1, "FeatureTownName: number of parts")) return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4537
	byte nb = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4538
	len--;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4539
	grfmsg(6, "FeatureTownName: %d parts", nb, nb);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4540
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4541
	townname->nbparts[id] = nb;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4542
	townname->partlist[id] = CallocT<NamePartList>(nb);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4543
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4544
	for (int i = 0; i < nb; i++) {
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4545
		if (!check_length(len, 3, "FeatureTownName: parts header")) return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4546
		byte nbtext =  grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4547
		townname->partlist[id][i].bitstart  = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4548
		townname->partlist[id][i].bitcount  = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4549
		townname->partlist[id][i].maxprob   = 0;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4550
		townname->partlist[id][i].partcount = nbtext;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4551
		townname->partlist[id][i].parts     = CallocT<NamePart>(nbtext);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4552
		len -= 3;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4553
		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);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4554
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4555
		for (int j = 0; j < nbtext; j++) {
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4556
			if (!check_length(len, 2, "FeatureTownName: part")) return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4557
			byte prob = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4558
			len--;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4559
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  4560
			if (HasBit(prob, 7)) {
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4561
				byte ref_id = grf_load_byte(&buf);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4562
				len--;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4563
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4564
				if (townname->nbparts[ref_id] == 0) {
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4565
					grfmsg(0, "FeatureTownName: definition 0x%02X doesn't exist, deactivating", ref_id);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4566
					DelGRFTownName(grfid);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4567
					_cur_grfconfig->status = GCS_DISABLED;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4568
					_skip_sprites = -1;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4569
					return;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4570
				}
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4571
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4572
				grfmsg(6, "FeatureTownName: part %d, text %d, uses intermediate definition 0x%02X (with probability %d)", i, j, ref_id, prob & 0x7F);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4573
				townname->partlist[id][i].parts[j].data.id = ref_id;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4574
			} else {
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4575
				const char *text = grf_load_string(&buf, len);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4576
				len -= strlen(text) + 1;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4577
				townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(text);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4578
				grfmsg(6, "FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[id][i].parts[j].data.text, prob);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4579
			}
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4580
			townname->partlist[id][i].parts[j].prob = prob;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4581
			townname->partlist[id][i].maxprob += GB(prob, 0, 7);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4582
		}
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4583
		grfmsg(6, "FeatureTownName: part %d, total probability %d", i, townname->partlist[id][i].maxprob);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4584
	}
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4585
}
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4586
3715
dd9807bf5927 (svn r4658) - NewGRF: add Action 0xNN comments before each action handler. This mainly aids code navigation...
peter1138
parents: 3714
diff changeset
  4587
/* Action 0x10 */
3561
29c95ab685c0 (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
  4588
static void DefineGotoLabel(byte *buf, int len)
29c95ab685c0 (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
  4589
{
29c95ab685c0 (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
  4590
	/* <10> <label> [<comment>]
29c95ab685c0 (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
  4591
	 *
29c95ab685c0 (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
  4592
	 * B label      The label to define
29c95ab685c0 (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
  4593
	 * V comment    Optional comment - ignored */
29c95ab685c0 (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
  4594
5841
b36d6b560aaa (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: 5838
diff changeset
  4595
	if (!check_length(len, 1, "DefineGotoLabel")) return;
3561
29c95ab685c0 (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
  4596
	buf++; len--;
29c95ab685c0 (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
  4597
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4598
	GRFLabel *label = MallocT<GRFLabel>(1);
3561
29c95ab685c0 (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
  4599
	label->label    = grf_load_byte(&buf);
29c95ab685c0 (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
  4600
	label->nfo_line = _nfo_line;
29c95ab685c0 (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
  4601
	label->pos      = FioGetPos();
29c95ab685c0 (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
  4602
	label->next     = NULL;
29c95ab685c0 (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
  4603
29c95ab685c0 (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
  4604
	/* Set up a linked list of goto targets which we will search in an Action 0x7/0x9 */
29c95ab685c0 (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
  4605
	if (_cur_grffile->label == NULL) {
29c95ab685c0 (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
  4606
		_cur_grffile->label = label;
29c95ab685c0 (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
  4607
	} else {
29c95ab685c0 (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
  4608
		/* Attach the label to the end of the list */
29c95ab685c0 (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
  4609
		GRFLabel *l;
29c95ab685c0 (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
  4610
		for (l = _cur_grffile->label; l->next != NULL; l = l->next);
29c95ab685c0 (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
  4611
		l->next = label;
29c95ab685c0 (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
  4612
	}
29c95ab685c0 (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
  4613
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4614
	grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", label->label);
3561
29c95ab685c0 (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
  4615
}
363
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
  4616
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4617
/* Action 0x11 */
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4618
static void GRFSound(byte *buf, int len)
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4619
{
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4620
	/* <11> <num>
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4621
	 *
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4622
	 * W num      Number of sound files that follow */
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4623
5841
b36d6b560aaa (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: 5838
diff changeset
  4624
	if (!check_length(len, 1, "GRFSound")) return;
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4625
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4626
	uint16 num = grf_load_word(&buf);
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4627
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4628
	_grf_data_blocks = num;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4629
	_grf_data_type   = GDT_SOUND;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4630
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4631
	if (_cur_grffile->sound_offset == 0) _cur_grffile->sound_offset = GetNumSounds();
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4632
}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4633
8927
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4634
/* Action 0x11 (SKIP) */
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4635
static void SkipAct11(byte *buf, int len)
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4636
{
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4637
	/* <11> <num>
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4638
	 *
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4639
	 * W num      Number of sound files that follow */
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4640
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4641
	if (!check_length(len, 1, "SkipAct11")) return;
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4642
	buf++;
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4643
	_skip_sprites = grf_load_word(&buf);
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4644
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4645
	grfmsg(3, "SkipAct11: Skipping %d sprites", _skip_sprites);
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4646
}
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4647
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4648
static void ImportGRFSound(byte *buf, int len)
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4649
{
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4650
	const GRFFile *file;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4651
	FileEntry *se = AllocateFileEntry();
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4652
	uint32 grfid = grf_load_dword(&buf);
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4653
	uint16 sound = grf_load_word(&buf);
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4654
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4655
	file = GetFileByGRFID(grfid);
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4656
	if (file == NULL || file->sound_offset == 0) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4657
		grfmsg(1, "ImportGRFSound: Source file not available");
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4658
		return;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4659
	}
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4660
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4661
	if (file->sound_offset + sound >= GetNumSounds()) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4662
		grfmsg(1, "ImportGRFSound: Sound effect %d is invalid", sound);
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4663
		return;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4664
	}
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4665
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4666
	grfmsg(2, "ImportGRFSound: Copying sound %d (%d) from file %X", sound, file->sound_offset + sound, grfid);
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4667
5024
f13f2f2d43f9 (svn r7065) Use simple assignment instead of memcpy()
tron
parents: 5011
diff changeset
  4668
	*se = *GetSound(file->sound_offset + sound);
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4669
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4670
	/* Reset volume and priority, which TTDPatch doesn't copy */
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4671
	se->volume   = 128;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4672
	se->priority = 0;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4673
}
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4674
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4675
/* 'Action 0xFE' */
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4676
static void GRFImportBlock(byte *buf, int len)
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4677
{
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4678
	if (_grf_data_blocks == 0) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4679
		grfmsg(2, "GRFImportBlock: Unexpected import block, skipping");
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4680
		return;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4681
	}
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4682
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4683
	buf++;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4684
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4685
	_grf_data_blocks--;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4686
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4687
	/* XXX 'Action 0xFE' isn't really specified. It is only mentioned for
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4688
	 * importing sounds, so this is probably all wrong... */
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4689
	if (grf_load_byte(&buf) != _grf_data_type) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4690
		grfmsg(1, "GRFImportBlock: Import type mismatch");
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4691
	}
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4692
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4693
	switch (_grf_data_type) {
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4694
		case GDT_SOUND: ImportGRFSound(buf, len - 1); break;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4695
		default: NOT_REACHED(); break;
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4696
	}
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4697
}
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  4698
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4699
static void LoadGRFSound(byte *buf, int len)
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4700
{
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4701
	byte *buf_start = buf;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4702
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4703
	/* Allocate a sound entry. This is done even if the data is not loaded
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4704
	 * so that the indices used elsewhere are still correct. */
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4705
	FileEntry *se = AllocateFileEntry();
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4706
5567
2af6b4aa2833 (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5557
diff changeset
  4707
	if (grf_load_dword(&buf) != BSWAP32('RIFF')) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4708
		grfmsg(1, "LoadGRFSound: Missing RIFF header");
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4709
		return;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4710
	}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4711
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4712
	/* Size of file -- we ignore this */
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4713
	grf_load_dword(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4714
5567
2af6b4aa2833 (svn r7564) -Codechange: Some newgrf changes. FFIR/EVAW endian-swapping, functionalize
Darkvater
parents: 5557
diff changeset
  4715
	if (grf_load_dword(&buf) != BSWAP32('WAVE')) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4716
		grfmsg(1, "LoadGRFSound: Invalid RIFF type");
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4717
		return;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4718
	}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4719
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4720
	for (;;) {
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4721
		uint32 tag  = grf_load_dword(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4722
		uint32 size = grf_load_dword(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4723
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4724
		switch (tag) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4725
			case ' tmf': // 'fmt '
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4726
				/* Audio format, must be 1 (PCM) */
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4727
				if (grf_load_word(&buf) != 1) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4728
					grfmsg(1, "LoadGRFSound: Invalid audio format");
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4729
					return;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4730
				}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4731
				se->channels = grf_load_word(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4732
				se->rate = grf_load_dword(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4733
				grf_load_dword(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4734
				grf_load_word(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4735
				se->bits_per_sample = grf_load_word(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4736
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4737
				/* Consume any extra bytes */
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4738
				for (; size > 16; size--) grf_load_byte(&buf);
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4739
				break;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4740
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  4741
			case 'atad': // 'data'
8066
7acd480e05c9 (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: 7955
diff changeset
  4742
				se->file_size   = size;
7acd480e05c9 (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: 7955
diff changeset
  4743
				se->file_offset = FioGetPos() - (len - (buf - buf_start)) + 1;
7acd480e05c9 (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: 7955
diff changeset
  4744
				se->file_slot   = _file_index;
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4745
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4746
				/* Set default volume and priority */
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4747
				se->volume = 0x80;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4748
				se->priority = 0;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4749
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4750
				grfmsg(2, "LoadGRFSound: channels %u, sample rate %u, bits per sample %u, length %u", se->channels, se->rate, se->bits_per_sample, size);
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4751
				return;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4752
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4753
			default:
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4754
				se->file_size = 0;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4755
				return;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4756
		}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4757
	}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4758
}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4759
5108
dc67d70b5a45 (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
  4760
/* Action 0x12 */
dc67d70b5a45 (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
  4761
static void LoadFontGlyph(byte *buf, int len)
dc67d70b5a45 (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
  4762
{
dc67d70b5a45 (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
  4763
	/* <12> <num_def> <font_size> <num_char> <base_char>
dc67d70b5a45 (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
  4764
	 *
dc67d70b5a45 (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
  4765
	 * B num_def      Number of definitions
dc67d70b5a45 (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
  4766
	 * B font_size    Size of font (0 = normal, 1 = small, 2 = large)
dc67d70b5a45 (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
  4767
	 * B num_char     Number of consecutive glyphs
dc67d70b5a45 (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
  4768
	 * W base_char    First character index */
dc67d70b5a45 (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
  4769
dc67d70b5a45 (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
  4770
	buf++; len--;
5841
b36d6b560aaa (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: 5838
diff changeset
  4771
	if (!check_length(len, 1, "LoadFontGlyph")) return;
5108
dc67d70b5a45 (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
  4772
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4773
	uint8 num_def = grf_load_byte(&buf);
5108
dc67d70b5a45 (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
  4774
5841
b36d6b560aaa (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: 5838
diff changeset
  4775
	if (!check_length(len, 1 + num_def * 4, "LoadFontGlyph")) return;
5108
dc67d70b5a45 (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
  4776
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4777
	for (uint i = 0; i < num_def; i++) {
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  4778
		FontSize size    = (FontSize)grf_load_byte(&buf);
5108
dc67d70b5a45 (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
  4779
		uint8  num_char  = grf_load_byte(&buf);
dc67d70b5a45 (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
  4780
		uint16 base_char = grf_load_word(&buf);
dc67d70b5a45 (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
  4781
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4782
		grfmsg(7, "LoadFontGlyph: Loading %u glyph(s) at 0x%04X for size %u", num_char, base_char, size);
5108
dc67d70b5a45 (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
  4783
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4784
		for (uint c = 0; c < num_char; c++) {
5108
dc67d70b5a45 (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
  4785
			SetUnicodeGlyph(size, base_char + c, _cur_spriteid);
8449
c5759019cbcd (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: 8437
diff changeset
  4786
			_nfo_line++;
7404
fc0559157f16 (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: 7390
diff changeset
  4787
			LoadNextSprite(_cur_spriteid++, _file_index, _nfo_line);
5108
dc67d70b5a45 (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
  4788
		}
dc67d70b5a45 (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
  4789
	}
dc67d70b5a45 (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
  4790
}
dc67d70b5a45 (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
  4791
8927
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4792
/* Action 0x12 (SKIP) */
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4793
static void SkipAct12(byte *buf, int len)
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4794
{
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4795
	/* <12> <num_def> <font_size> <num_char> <base_char>
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4796
	 *
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4797
	 * B num_def      Number of definitions
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4798
	 * B font_size    Size of font (0 = normal, 1 = small, 2 = large)
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4799
	 * B num_char     Number of consecutive glyphs
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4800
	 * W base_char    First character index */
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4801
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4802
	buf++; len--;
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4803
	if (!check_length(len, 1, "SkipAct12")) return;
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4804
	uint8 num_def = grf_load_byte(&buf);
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4805
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4806
	if (!check_length(len, 1 + num_def * 4, "SkipAct12")) return;
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4807
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4808
	for (uint i = 0; i < num_def; i++) {
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4809
		/* Ignore 'size' byte */
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4810
		grf_load_byte(&buf);
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4811
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4812
		/* Sum up number of characters */
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4813
		_skip_sprites += grf_load_byte(&buf);
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4814
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4815
		/* Ignore 'base_char' word */
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4816
		grf_load_word(&buf);
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4817
	}
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4818
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4819
	grfmsg(3, "SkipAct12: Skipping %d sprites", _skip_sprites);
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4820
}
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  4821
6560
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4822
/* Action 0x13 */
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4823
static void TranslateGRFStrings(byte *buf, int len)
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4824
{
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4825
	/* <13> <grfid> <num-ent> <offset> <text...>
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4826
	 *
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4827
	 * 4*B grfid     The GRFID of the file whose texts are to be translated
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4828
	 * B   num-ent   Number of strings
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4829
	 * W   offset    First text ID
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4830
	 * S   text...   Zero-terminated strings */
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4831
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4832
	buf++; len--;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4833
	if (!check_length(len, 7, "TranslateGRFString")) return;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4834
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4835
	uint32 grfid = grf_load_dword(&buf);
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4836
	const GRFConfig *c = GetGRFConfig(grfid);
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4837
	if (c == NULL || (c->status != GCS_INITIALISED && c->status != GCS_ACTIVATED)) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  4838
		grfmsg(7, "TranslateGRFStrings: GRFID 0x%08x unknown, skipping action 13", BSWAP32(grfid));
6560
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4839
		return;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4840
	}
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4841
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4842
	if (c->status == GCS_INITIALISED) {
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4843
		/* If the file is not active but will be activated later, give an error
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4844
		 * and disable this file. */
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4845
		GRFError *error = CallocT<GRFError>(1);
7369
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  4846
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  4847
		char tmp[256];
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  4848
		GetString(tmp, STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE, lastof(tmp));
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  4849
		error->data = strdup(tmp);
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  4850
6560
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4851
		error->message  = STR_NEWGRF_ERROR_LOAD_AFTER;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4852
		error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4853
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4854
		if (_cur_grfconfig->error != NULL) free(_cur_grfconfig->error);
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4855
		_cur_grfconfig->error = error;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4856
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4857
		_cur_grfconfig->status = GCS_DISABLED;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4858
		_skip_sprites = -1;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4859
		return;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4860
	}
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4861
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4862
	byte num_strings = grf_load_byte(&buf);
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4863
	uint16 first_id  = grf_load_word(&buf);
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4864
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4865
	if (!((first_id >= 0xD000 && first_id + num_strings <= 0xD3FF) || (first_id >= 0xDC00 && first_id + num_strings <= 0xDCFF))) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  4866
		grfmsg(7, "TranslateGRFStrings: Attempting to set out-of-range string IDs in action 13 (first: 0x%4X, number: 0x%2X)", first_id, num_strings);
6560
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4867
		return;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4868
	}
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4869
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4870
	len -= 7;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4871
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4872
	for (uint i = 0; i < num_strings && len > 0; i++) {
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4873
		const char *string   = grf_load_string(&buf, len);
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4874
		size_t string_length = strlen(string) + 1;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4875
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4876
		len -= (int)string_length;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4877
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4878
		if (string_length == 1) {
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4879
			grfmsg(7, "TranslateGRFString: Ignoring empty string.");
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4880
			continue;
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4881
		}
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4882
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4883
		/* Since no language id is supplied this string has to be added as a
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4884
		 * generic string, thus the language id of 0x7F. For this to work
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4885
		 * new_scheme has to be true as well. A language id of 0x7F will be
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4886
		 * overridden by a non-generic id, so this will not change anything if
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4887
		 * a string has been provided specifically for this language. */
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4888
		AddGRFString(grfid, first_id + i, 0x7F, true, string, STR_UNDEFINED);
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4889
	}
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4890
}
ff59c862deae (svn r9037) -Feature: [NewGRF] Add support for Action 13, which allows you to translate
maedhros
parents: 6555
diff changeset
  4891
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4892
/* 'Action 0xFF' */
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4893
static void GRFDataBlock(byte *buf, int len)
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4894
{
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4895
	if (_grf_data_blocks == 0) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4896
		grfmsg(2, "GRFDataBlock: unexpected data block, skipping");
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4897
		return;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4898
	}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4899
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4900
	buf++;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4901
	uint8 name_len = grf_load_byte(&buf);
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  4902
	const char *name = (const char *)buf;
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4903
	buf += name_len + 1;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4904
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  4905
	grfmsg(2, "GRFDataBlock: block name '%s'...", name);
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4906
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4907
	_grf_data_blocks--;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4908
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4909
	switch (_grf_data_type) {
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4910
		case GDT_SOUND: LoadGRFSound(buf, len - name_len - 2); break;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4911
		default: NOT_REACHED(); break;
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4912
	}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4913
}
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  4914
5329
2b117d8652f0 (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
  4915
2b117d8652f0 (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
  4916
/* Used during safety scan on unsafe actions */
2b117d8652f0 (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
  4917
static void GRFUnsafe(byte *buf, int len)
2b117d8652f0 (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
  4918
{
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  4919
	SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
5329
2b117d8652f0 (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
  4920
5753
788f8d55eb54 (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: 5727
diff changeset
  4921
	/* Skip remainder of GRF */
788f8d55eb54 (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: 5727
diff changeset
  4922
	_skip_sprites = -1;
5329
2b117d8652f0 (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
  4923
}
2b117d8652f0 (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
  4924
2b117d8652f0 (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
  4925
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6560
diff changeset
  4926
static void InitializeGRFSpecial()
363
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
  4927
{
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4928
	_ttdpatch_flags[0] =  ((_patches.always_small_airport ? 1 : 0) << 0x0C)  // keepsmallairport
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4929
	                   |                                        (1 << 0x0D)  // newairports
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4930
	                   |                                        (1 << 0x0E)  // largestations
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4931
	                   |           ((_patches.longbridges ? 1 : 0) << 0x0F)  // longbridges
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4932
	                   |                                        (0 << 0x10)  // loadtime
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4933
	                   |                                        (1 << 0x12)  // presignals
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4934
	                   |                                        (1 << 0x13)  // extpresignals
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4935
	                   | ((_patches.never_expire_vehicles ? 1 : 0) << 0x16)  // enginespersist
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4936
	                   |                                        (1 << 0x1B)  // multihead
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4937
	                   |                                        (1 << 0x1D)  // lowmemory
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4938
	                   |                                        (1 << 0x1E); // generalfixes
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4939
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4940
	_ttdpatch_flags[1] =                                        (0 << 0x07)  // moreairports - based on units of noise
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4941
	                   |        ((_patches.mammoth_trains ? 1 : 0) << 0x08)  // mammothtrains
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4942
	                   |                                        (1 << 0x09)  // trainrefit
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4943
	                   |                                        (0 << 0x0B)  // subsidiaries
5801
7d14e62bc9f3 (svn r7930) -Fix: [FS#520] Wrong GRF flag set for gradual loading (mart3p)
Darkvater
parents: 5776
diff changeset
  4944
	                   |       ((_patches.gradual_loading ? 1 : 0) << 0x0C)  // gradualloading
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4945
	                   |                                        (1 << 0x12)  // unifiedmaglevmode - set bit 0 mode. Not revelant to OTTD
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4946
	                   |                                        (1 << 0x13)  // unifiedmaglevmode - set bit 1 mode
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4947
	                   |                                        (1 << 0x14)  // bridgespeedlimits
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4948
	                   |                                        (1 << 0x16)  // eternalgame
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4949
	                   |                                        (1 << 0x17)  // newtrains
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4950
	                   |                                        (1 << 0x18)  // newrvs
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4951
	                   |                                        (1 << 0x19)  // newships
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4952
	                   |                                        (1 << 0x1A)  // newplanes
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4953
	                   |           ((_patches.signal_side ? 1 : 0) << 0x1B)  // signalsontrafficside
8226
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4954
	                   |       ((_patches.disable_elrails ? 0 : 1) << 0x1C); // electrifiedrailway
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4955
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4956
	_ttdpatch_flags[2] =                                        (1 << 0x01)  // loadallgraphics - obsolote
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4957
	                   |                                        (1 << 0x03)  // semaphores
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4958
	                   |                                        (0 << 0x0B)  // enhancedgui
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4959
	                   |                                        (0 << 0x0C)  // newagerating
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4960
	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x0D)  // buildonslopes
7003
002f14bf45e0 (svn r9690) -Codechange: Update another couple of NewGRF TTDPatch flags
peter1138
parents: 6999
diff changeset
  4961
	                   |         ((_patches.full_load_any ? 1 : 0) << 0x0E)  // fullloadany
7390
00eb344ff13f (svn r10141) -Fix (FS#848, r8973): Set the newgrf bit for realistic plane speeds (bulb)
celestar
parents: 7381
diff changeset
  4962
	                   |                                        (1 << 0x0F)  // planespeed - TODO depends on patch when implemented
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4963
	                   |                                        (0 << 0x10)  // moreindustriesperclimate - obsolete
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4964
	                   |                                        (0 << 0x11)  // moretoylandfeatures
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4965
	                   |                                        (1 << 0x12)  // newstations
8226
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  4966
	                   |                                        (1 << 0x13)  // tracktypecostdiff
6999
e0f7feb68658 (svn r9686) -Codechange: Update a couple of NewGRF TTDPatch flags
peter1138
parents: 6988
diff changeset
  4967
	                   |                                        (1 << 0x14)  // manualconvert
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4968
	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x15)  // buildoncoasts
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4969
	                   |                                        (1 << 0x16)  // canals
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4970
	                   |                                        (1 << 0x17)  // newstartyear
6999
e0f7feb68658 (svn r9686) -Codechange: Update a couple of NewGRF TTDPatch flags
peter1138
parents: 6988
diff changeset
  4971
	                   |    ((_patches.freight_trains > 1 ? 1 : 0) << 0x18)  // freighttrains
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  4972
	                   |                                        (1 << 0x19)  // newhouses
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4973
	                   |                                        (1 << 0x1A)  // newbridges
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  4974
	                   |                                        (1 << 0x1B)  // newtownnames
8190
efd1f3b110a2 (svn r11228) -Codechange: implement the "moreanimation" feature of TTDP, so we can properly support newindustries.
rubidium
parents: 8186
diff changeset
  4975
	                   |                                        (1 << 0x1C)  // moreanimation
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4976
	                   |    ((_patches.wagon_speed_limits ? 1 : 0) << 0x1D)  // wagonspeedlimits
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4977
	                   |                                        (1 << 0x1E)  // newshistory
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4978
	                   |                                        (0 << 0x1F); // custombridgeheads
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4979
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4980
	_ttdpatch_flags[3] =                                        (0 << 0x00)  // newcargodistribution
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4981
	                   |                                        (1 << 0x01)  // windowsnap
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4982
	                   |                                        (0 << 0x02)  // townbuildnoroad
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4983
	                   |                                        (0 << 0x03)  // pathbasedsignalling. To enable if ever pbs is back
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4984
	                   |                                        (0 << 0x04)  // aichoosechance
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4985
	                   |                                        (1 << 0x05)  // resolutionwidth
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4986
	                   |                                        (1 << 0x06)  // resolutionheight
8169
38b56ae08de9 (svn r11204) -Feature: [NewGRF] Add support for Action 00 for Industries and IndustryTiles.
belugas
parents: 8168
diff changeset
  4987
	                   |                                        (1 << 0x07)  // newindustries
7119
8ec832426743 (svn r9843) -Fix (r9838): tell the newgrfs that we now support proper FIFO loading.
rubidium
parents: 7103
diff changeset
  4988
	                   |         ((_patches.improved_load ? 1 : 0) << 0x08)  // fifoloading
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4989
	                   |                                        (0 << 0x09)  // townroadbranchprob
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4990
	                   |                                        (0 << 0x0A)  // tempsnowline
6959
0066ab0d9b93 (svn r9638) -Feature: Increase cargo types from 12 to 32 and enable newcargo flag in NewGRF loader.
peter1138
parents: 6957
diff changeset
  4991
	                   |                                        (1 << 0x0B)  // newcargo
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4992
	                   |                                        (1 << 0x0C)  // enhancemultiplayer
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4993
	                   |                                        (1 << 0x0D)  // onewayroads
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4994
	                   |   ((_patches.nonuniform_stations ? 1 : 0) << 0x0E)  // irregularstations
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4995
	                   |                                        (1 << 0x0F)  // statistics
4657
188335e8d316 (svn r6533) - Fix (r6532): Somebody forgot to add newsounds to the ttdpatch flags...
peter1138
parents: 4656
diff changeset
  4996
	                   |                                        (1 << 0x10)  // newsounds
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4997
	                   |                                        (1 << 0x11)  // autoreplace
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4998
	                   |                                        (1 << 0x12)  // autoslope
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  4999
	                   |                                        (0 << 0x13)  // followvehicle
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7182
diff changeset
  5000
	                   |                                        (1 << 0x14)  // trams
4381
c1af6c934040 (svn r6131) -Codechange : Complete all missing _ttdpatch_flags entries
belugas
parents: 4377
diff changeset
  5001
	                   |                                        (0 << 0x15)  // enhancetunnels
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7344
diff changeset
  5002
	                   |                                        (1 << 0x16)  // shortrvs
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7344
diff changeset
  5003
	                   |                                        (1 << 0x17)  // articulatedrvs
7003
002f14bf45e0 (svn r9690) -Codechange: Update another couple of NewGRF TTDPatch flags
peter1138
parents: 6999
diff changeset
  5004
	                   |                                        (1 << 0x1E); // variablerunningcosts
363
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
  5005
}
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
  5006
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6560
diff changeset
  5007
static void ResetCustomStations()
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5008
{
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5009
	for (GRFFile *file = _first_grffile; file != NULL; file = file->next) {
3768
46d328178509 (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
  5010
		if (file->stations == NULL) continue;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5011
		for (uint i = 0; i < MAX_STATIONS; i++) {
3768
46d328178509 (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
  5012
			if (file->stations[i] == NULL) continue;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5013
			StationSpec *statspec = file->stations[i];
3740
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5014
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5015
			/* Release renderdata, if it wasn't copied from another custom station spec  */
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5016
			if (!statspec->copied_renderdata) {
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5017
				for (uint t = 0; t < statspec->tiles; t++) {
3740
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5018
					free((void*)statspec->renderdata[t].seq);
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5019
				}
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5020
				free(statspec->renderdata);
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5021
			}
00a9594628b1 (svn r4722) - Newstations: release station sprite layout data when uninitializing NewGRF data.
peter1138
parents: 3738
diff changeset
  5022
5061
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5023
			/* Release platforms and layouts */
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5024
			if (!statspec->copied_layouts) {
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5025
				for (uint l = 0; l < statspec->lengths; l++) {
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5026
					for (uint p = 0; p < statspec->platforms[l]; p++) {
5061
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5027
						free(statspec->layouts[l][p]);
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5028
					}
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5029
					free(statspec->layouts[l]);
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5030
				}
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5031
				free(statspec->layouts);
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5032
				free(statspec->platforms);
cb097749d18f (svn r7114) -Codechange: [NewStations] Free up custom station layouts
peter1138
parents: 5060
diff changeset
  5033
			}
3768
46d328178509 (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
  5034
46d328178509 (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
  5035
			/* Release this station */
46d328178509 (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
  5036
			free(statspec);
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5037
		}
3501
cf7d2c33e7fc (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
  5038
cf7d2c33e7fc (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
  5039
		/* Free and reset the station data */
cf7d2c33e7fc (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
  5040
		free(file->stations);
cf7d2c33e7fc (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
  5041
		file->stations = NULL;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5042
	}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5043
}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5044
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5045
static void ResetCustomHouses()
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5046
{
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5047
	GRFFile *file;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5048
	uint i;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5049
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5050
	for (file = _first_grffile; file != NULL; file = file->next) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5051
		if (file->housespec == NULL) continue;
7344
72e3e8607419 (svn r10088) -Codechange: A typo and a code-style
belugas
parents: 7330
diff changeset
  5052
		for (i = 0; i < HOUSE_MAX; i++) {
72e3e8607419 (svn r10088) -Codechange: A typo and a code-style
belugas
parents: 7330
diff changeset
  5053
			free(file->housespec[i]);
72e3e8607419 (svn r10088) -Codechange: A typo and a code-style
belugas
parents: 7330
diff changeset
  5054
		}
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5055
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5056
		free(file->housespec);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5057
		file->housespec = NULL;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5058
	}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5059
}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5060
7255
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5061
static void ResetCustomIndustries()
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5062
{
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5063
	GRFFile *file;
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5064
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5065
	for (file = _first_grffile; file != NULL; file = file->next) {
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5066
		uint i;
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5067
		/* We are verifiying both tiles and industries specs loaded from the grf file
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5068
		 * First, let's deal with industryspec */
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5069
		if (file->industryspec != NULL) {
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5070
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5071
			for (i = 0; i < NUM_INDUSTRYTYPES; i++) {
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5072
				IndustrySpec *ind = file->industryspec[i];
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5073
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5074
				if (ind != NULL) {
7261
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5075
					/* We need to remove the sounds array */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  5076
					if (HasBit(ind->cleanup_flag, CLEAN_RANDOMSOUNDS)) {
7261
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5077
						free((void*)ind->random_sounds);
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5078
					}
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5079
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5080
					/* We need to remove the tiles layouts */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  5081
					if (HasBit(ind->cleanup_flag, CLEAN_TILELSAYOUT) && ind->table != NULL) {
7261
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5082
						for (int j = 0; j < ind->num_table; j++) {
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5083
							/* remove the individual layouts */
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5084
							if (ind->table[j] != NULL) {
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5085
								free((IndustryTileTable*)ind->table[j]);
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5086
							}
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5087
						}
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5088
						/* remove the layouts pointers */
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5089
						free((IndustryTileTable**)ind->table);
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5090
						ind->table = NULL;
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5091
					}
a75c5668b75b (svn r10001) -Codechange: Add support for removing dynamically allocated newgrf data
belugas
parents: 7260
diff changeset
  5092
7255
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5093
					free(ind);
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5094
					ind = NULL;
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5095
				}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5096
			}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5097
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5098
			free(file->industryspec);
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5099
			file->industryspec = NULL;
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5100
		}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5101
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5102
		if (file->indtspec != NULL) {
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5103
			for (i = 0; i < NUM_INDUSTRYTILES; i++) {
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5104
				if (file->indtspec[i] != NULL) {
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5105
					free(file->indtspec[i]);
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5106
					file->indtspec[i] = NULL;
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5107
				}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5108
			}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5109
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5110
			free(file->indtspec);
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5111
			file->indtspec = NULL;
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5112
		}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5113
	}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5114
}
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5115
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6560
diff changeset
  5116
static void ResetNewGRF()
4953
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5117
{
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5118
	GRFFile *next;
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5119
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5120
	for (GRFFile *f = _first_grffile; f != NULL; f = next) {
4953
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5121
		next = f->next;
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5122
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5123
		free(f->filename);
7180
6ecf06dd7299 (svn r9916) -Codechange: Free memory used by cargo translation tables
peter1138
parents: 7155
diff changeset
  5124
		free(f->cargo_list);
4953
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5125
		free(f);
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5126
	}
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5127
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5128
	_first_grffile = NULL;
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5129
	_cur_grffile   = NULL;
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5130
}
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5131
7366
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5132
static void ResetNewGRFErrors()
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5133
{
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5134
	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  5135
		if (!HasBit(c->flags, GCF_COPY) && c->error != NULL) {
7369
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  5136
			free(c->error->custom_message);
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7366
diff changeset
  5137
			free(c->error->data);
7366
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5138
			free(c->error);
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5139
			c->error = NULL;
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5140
		}
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5141
	}
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5142
}
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5143
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  5144
/**
2463
de2605ed3758 (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
  5145
 * Reset all NewGRF loaded data
de2605ed3758 (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
  5146
 * TODO
de2605ed3758 (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
  5147
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6560
diff changeset
  5148
static void ResetNewGRFData()
2463
de2605ed3758 (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
  5149
{
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  5150
	CleanUpStrings();
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  5151
	CleanUpGRFTownNames();
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3595
diff changeset
  5152
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5153
	/* Copy/reset original engine info data */
8717
de56e5ec3aec (svn r11784) -Codechange: set up initial engine data in one place
peter1138
parents: 8710
diff changeset
  5154
	SetupEngines();
2478
16b05f1de6bb (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
  5155
8985
2f7b495d5807 (svn r12064) -Codechange : Give grf bridges their own ResetBridges function, and put bridge spec in table/bridge_land.h, where it should be.
belugas
parents: 8980
diff changeset
  5156
	/* Copy/reset original bridge info data */
2f7b495d5807 (svn r12064) -Codechange : Give grf bridges their own ResetBridges function, and put bridge spec in table/bridge_land.h, where it should be.
belugas
parents: 8980
diff changeset
  5157
	ResetBridges();
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  5158
6675
5e9d65c32e60 (svn r9387) -Fix (r9385): termination of a comment forgotten.
rubidium
parents: 6674
diff changeset
  5159
	/* Reset refit/cargo class data */
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5160
	memset(&cargo_allowed, 0, sizeof(cargo_allowed));
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5161
	memset(&cargo_disallowed, 0, sizeof(cargo_disallowed));
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5162
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5163
	/* Reset GRM reservations */
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  5164
	memset(&_grm_engines, 0, sizeof(_grm_engines));
7277
eddd0a777e8b (svn r10019) -Codechange: Implement GRM for newcargos
peter1138
parents: 7265
diff changeset
  5165
	memset(&_grm_cargos, 0, sizeof(_grm_cargos));
4961
0ba3cfeaff61 (svn r6960) - Feature: NewGRF: Implement some support for GRF Resource Management (GRM)
peter1138
parents: 4953
diff changeset
  5166
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5167
	/* Unload sprite group data */
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  5168
	UnloadWagonOverrides();
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
  5169
	UnloadCustomEngineSprites();
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  5170
	ResetEngineListOrder();
2506
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  5171
9040
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  5172
	/* Reset generic feature callback lists */
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  5173
	ResetGenericCallbacks();
7d9d63315d91 (svn r12122) -Codechange: Add framework for generic feature callbacks, along with some parts for AI use.
peter1138
parents: 9037
diff changeset
  5174
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5175
	/* Reset price base data */
2506
777ac2d9a98a (svn r3032) -NewGRF, Feature: Add support for changing base prices.
peter1138
parents: 2491
diff changeset
  5176
	ResetPriceBaseMultipliers();
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5177
4377
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  5178
	/* Reset the curencies array */
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  5179
	ResetCurrencies();
0fb9077b8173 (svn r6108) -NewGRF Feature: Implement currencies replacment via grf file.
belugas
parents: 4322
diff changeset
  5180
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5181
	/* Reset the house array */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5182
	ResetCustomHouses();
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5183
	ResetHouses();
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5184
7239
68e722150cba (svn r9976) -Codechange: Declare a writable array of specs for industry and industry tiles.
belugas
parents: 7187
diff changeset
  5185
	/* Reset the industries structures*/
7255
8b6f5524dfbc (svn r9994) -Codechange: Add pointers for Industry and Industry Tiles in the grf file.
belugas
parents: 7239
diff changeset
  5186
	ResetCustomIndustries();
7239
68e722150cba (svn r9976) -Codechange: Declare a writable array of specs for industry and industry tiles.
belugas
parents: 7187
diff changeset
  5187
	ResetIndustries();
68e722150cba (svn r9976) -Codechange: Declare a writable array of specs for industry and industry tiles.
belugas
parents: 7187
diff changeset
  5188
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5189
	/* Reset station classes */
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5190
	ResetStationClasses();
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents: 2624
diff changeset
  5191
	ResetCustomStations();
2812
f250489941f9 (svn r3360) Fix initialization of engines for precalculation of default refit mask.
peter1138
parents: 2769
diff changeset
  5192
8868
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  5193
	/* Reset canal sprite groups and flags */
822816ce1fcb (svn r11938) -Codechange: support loading of canal/river properties (though still ignored)
peter1138
parents: 8819
diff changeset
  5194
	memset(_water_feature, 0, sizeof(_water_feature));
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 7077
diff changeset
  5195
6669
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6668
diff changeset
  5196
	/* Reset the snowline table. */
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6668
diff changeset
  5197
	ClearSnowLine();
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6668
diff changeset
  5198
4953
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5199
	/* Reset NewGRF files */
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5200
	ResetNewGRF();
6c40b2b16164 (svn r6948) - Codechange: Clear out all NewGRF file data before loading files again
peter1138
parents: 4952
diff changeset
  5201
7366
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5202
	/* Reset NewGRF errors. */
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5203
	ResetNewGRFErrors();
3a76f142e0ab (svn r10110) -Fix: Reset NewGRF errors along with all the other NewGRF data so that errors get loaded again when pressing "Apply".
maedhros
parents: 7353
diff changeset
  5204
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6416
diff changeset
  5205
	/* Set up the default cargo types */
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6416
diff changeset
  5206
	SetupCargoForClimate(_opt.landscape);
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6416
diff changeset
  5207
3845
c3cd4b825c2f (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  5208
	/* Reset misc GRF features and train list display variables */
c3cd4b825c2f (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  5209
	_misc_grf_features = 0;
c3cd4b825c2f (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  5210
	_traininfo_vehicle_pitch = 0;
c3cd4b825c2f (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  5211
	_traininfo_vehicle_width = 29;
7265
74148c363f9d (svn r10005) -Codechange: Merge two flags (2cc and newhouses) indicating some newgrf features have been loaded, and introduce the newindustry one.
belugas
parents: 7261
diff changeset
  5212
8226
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  5213
	/* Reset track cost multipliers. */
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  5214
	memcpy(&_railtype_cost_multiplier, &_default_railtype_cost_multiplier, sizeof(_default_railtype_cost_multiplier));
c66a40c8e9bf (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 8214
diff changeset
  5215
7410
358b83972e29 (svn r10167) -Codechange: Change the flagging system of grf loaded feature from a bitset to a bool evaluation.
belugas
parents: 7404
diff changeset
  5216
	_loaded_newgrf_features.has_2CC           = false;
358b83972e29 (svn r10167) -Codechange: Change the flagging system of grf loaded feature from a bitset to a bool evaluation.
belugas
parents: 7404
diff changeset
  5217
	_loaded_newgrf_features.has_newhouses     = false;
8157
e2506892a70f (svn r11192) -Fix: Little typo with bigger consequences when trying to remove a newindustries aware grf
belugas
parents: 8156
diff changeset
  5218
	_loaded_newgrf_features.has_newindustries = false;
8899
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5219
	_loaded_newgrf_features.shore             = SHORE_REPLACE_NONE;
3845
c3cd4b825c2f (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3825
diff changeset
  5220
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  5221
	InitializeSoundPool();
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5222
	InitializeSpriteGroupPool();
2463
de2605ed3758 (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
  5223
}
de2605ed3758 (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
  5224
3561
29c95ab685c0 (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
  5225
/** Reset all NewGRFData that was used only while processing data */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6560
diff changeset
  5226
static void ClearTemporaryNewGRFData()
3561
29c95ab685c0 (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
  5227
{
29c95ab685c0 (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
  5228
	/* Clear the GOTO labels used for GRF processing */
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5229
	for (GRFLabel *l = _cur_grffile->label; l != NULL;) {
3561
29c95ab685c0 (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
  5230
		GRFLabel *l2 = l->next;
29c95ab685c0 (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
  5231
		free(l);
29c95ab685c0 (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
  5232
		l = l2;
29c95ab685c0 (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
  5233
	}
29c95ab685c0 (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
  5234
	_cur_grffile->label = NULL;
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5235
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5236
	/* Clear the list of spritegroups */
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5237
	free(_cur_grffile->spritegroups);
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5238
	_cur_grffile->spritegroups = NULL;
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3593
diff changeset
  5239
	_cur_grffile->spritegroups_count = 0;
3561
29c95ab685c0 (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
  5240
}
29c95ab685c0 (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
  5241
6473
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5242
static void BuildCargoTranslationMap()
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5243
{
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5244
	memset(_cur_grffile->cargo_map, 0xFF, sizeof(_cur_grffile->cargo_map));
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5245
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5246
	for (CargoID c = 0; c < NUM_CARGO; c++) {
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5247
		const CargoSpec *cs = GetCargo(c);
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5248
		if (!cs->IsValid()) continue;
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5249
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5250
		if (_cur_grffile->cargo_max == 0) {
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5251
			/* Default translation table, so just a straight mapping to bitnum */
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5252
			_cur_grffile->cargo_map[c] = cs->bitnum;
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5253
		} else {
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5254
			/* Check the translation table for this cargo's label */
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5255
			for (uint i = 0; i < _cur_grffile->cargo_max; i++) {
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5256
				if (cs->label == _cur_grffile->cargo_list[i]) {
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5257
					_cur_grffile->cargo_map[c] = i;
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5258
					break;
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5259
				}
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5260
			}
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5261
		}
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5262
	}
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5263
}
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5264
3628
bd4a6601e5a2 (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
  5265
static void InitNewGRFFile(const GRFConfig *config, int sprite_offset)
368
32aad6ad36e1 (svn r556) -newgrf: Some seemingly proper support for loading stages of grf files (octo & pasky).
darkvater
parents: 367
diff changeset
  5266
{
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5267
	GRFFile *newfile = GetFileByFilename(config->filename);
490
83455cd1cc55 (svn r772) Whoops, I know. Do not consider pointer to be a boolean value. Sorry 'bout that, sirs.
pasky
parents: 489
diff changeset
  5268
	if (newfile != NULL) {
489
9c8e1806935e (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
  5269
		/* We already loaded it once. */
9c8e1806935e (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
  5270
		newfile->sprite_offset = sprite_offset;
9c8e1806935e (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
  5271
		_cur_grffile = newfile;
9c8e1806935e (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
  5272
		return;
9c8e1806935e (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
  5273
	}
9c8e1806935e (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
  5274
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  5275
	newfile = CallocT<GRFFile>(1);
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5276
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5277
	if (newfile == NULL) error ("Out of memory");
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5278
7530
31257d744079 (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: 7452
diff changeset
  5279
	newfile->filename = strdup(config->filename);
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5280
	newfile->sprite_offset = sprite_offset;
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5281
3628
bd4a6601e5a2 (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
  5282
	/* Copy the initial parameter list */
bd4a6601e5a2 (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
  5283
	assert(lengthof(newfile->param) == lengthof(config->param) && lengthof(config->param) == 0x80);
bd4a6601e5a2 (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
  5284
	newfile->param_end = config->num_params;
5681
7b237b4958d6 (svn r7636) -Cleanup: Remove unused window classes (sorry WC-mess) and use sizeof(array) instead
Darkvater
parents: 5664
diff changeset
  5285
	memcpy(newfile->param, config->param, sizeof(newfile->param));
3628
bd4a6601e5a2 (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
  5286
366
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5287
	if (_first_grffile == NULL) {
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5288
		_cur_grffile = newfile;
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5289
		_first_grffile = newfile;
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5290
	} else {
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5291
		_cur_grffile->next = newfile;
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5292
		_cur_grffile = newfile;
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5293
	}
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5294
}
9d2630b8b4de (svn r554) -newgrf: Keep track of GRF files. Remember them all in a linked list, this already enables tests for an already loaded GRF file in SkipIf(). Patch by octo, heavily re-hammered by pasky
darkvater
parents: 363
diff changeset
  5295
5037
7d956200ee71 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5296
6471
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5297
/** List of what cargo labels are refittable for the given the vehicle-type.
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5298
 * Only currently active labels are applied. */
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5299
static const CargoLabel _default_refitmasks_rail[] = {
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5300
	'PASS', 'COAL', 'MAIL', 'LVST', 'GOOD', 'GRAI', 'WHEA', 'MAIZ', 'WOOD',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5301
	'IORE', 'STEL', 'VALU', 'GOLD', 'DIAM', 'PAPR', 'FOOD', 'FRUT', 'CORE',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5302
	'WATR', 'SUGR', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5303
	'PLST', 'FZDR',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5304
	0 };
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5305
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5306
static const CargoLabel _default_refitmasks_road[] = {
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5307
	0 };
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5308
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5309
static const CargoLabel _default_refitmasks_ships[] = {
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5310
	'COAL', 'MAIL', 'LVST', 'GOOD', 'GRAI', 'WHEA', 'MAIZ', 'WOOD', 'IORE',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5311
	'STEL', 'VALU', 'GOLD', 'DIAM', 'PAPR', 'FOOD', 'FRUT', 'CORE', 'WATR',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5312
	'RUBR', 'SUGR', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5313
	'PLST', 'FZDR',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5314
	0 };
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5315
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5316
static const CargoLabel _default_refitmasks_aircraft[] = {
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5317
	'PASS', 'MAIL', 'GOOD', 'VALU', 'GOLD', 'DIAM', 'FOOD', 'FRUT', 'SUGR',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5318
	'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR',
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5319
	0 };
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5320
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5321
static const CargoLabel *_default_refitmasks[] = {
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5322
	_default_refitmasks_rail,
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5323
	_default_refitmasks_road,
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5324
	_default_refitmasks_ships,
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5325
	_default_refitmasks_aircraft,
5037
7d956200ee71 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5326
};
7d956200ee71 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5327
7d956200ee71 (svn r7079) -Codechange: Move an array to the only place it is used.
peter1138
parents: 5024
diff changeset
  5328
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5329
/**
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5330
 * Precalculate refit masks from cargo classes for all vehicles.
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5331
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6560
diff changeset
  5332
static void CalculateRefitMasks()
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5333
{
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5334
	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5335
		uint32 mask = 0;
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5336
		uint32 not_mask = 0;
6610
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5337
		uint32 xor_mask = 0;
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5338
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5339
		if (_engine_info[engine].refit_mask != 0) {
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5340
			const GRFFile *file = GetEngineGRF(engine);
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5341
			if (file != NULL && file->cargo_max != 0) {
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5342
				/* Apply cargo translation table to the refit mask */
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5343
				uint num_cargo = min(32, file->cargo_max);
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5344
				for (uint i = 0; i < num_cargo; i++) {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  5345
					if (!HasBit(_engine_info[engine].refit_mask, i)) continue;
6610
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5346
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5347
					CargoID c = GetCargoIDByLabel(file->cargo_list[i]);
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5348
					if (c == CT_INVALID) continue;
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5349
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  5350
					SetBit(xor_mask, c);
6610
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5351
				}
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5352
			} else {
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5353
				/* No cargo table, so use the cargo bitnum values */
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5354
				for (CargoID c = 0; c < NUM_CARGO; c++) {
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5355
					const CargoSpec *cs = GetCargo(c);
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5356
					if (!cs->IsValid()) continue;
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5357
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  5358
					if (HasBit(_engine_info[engine].refit_mask, cs->bitnum)) SetBit(xor_mask, c);
6610
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5359
				}
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5360
			}
ecaea43b2238 (svn r9102) -Codechange: (NewGRF) Apply cargo translation table to vehicle refit masks
peter1138
parents: 6608
diff changeset
  5361
		}
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5362
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5363
		if (cargo_allowed[engine] != 0) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5364
			/* Build up the list of cargo types from the set cargo classes. */
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5365
			for (CargoID i = 0; i < NUM_CARGO; i++) {
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6433
diff changeset
  5366
				const CargoSpec *cs = GetCargo(i);
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  5367
				if (cargo_allowed[engine]    & cs->classes) SetBit(mask,     i);
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  5368
				if (cargo_disallowed[engine] & cs->classes) SetBit(not_mask, i);
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5369
			}
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5370
		} else {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5371
			/* Don't apply default refit mask to wagons or engines with no capacity */
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5372
			if (xor_mask == 0 && (
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
  5373
						GetEngine(engine)->type != VEH_TRAIN || (
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5374
							RailVehInfo(engine)->capacity != 0 &&
6119
b47985557d1e (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: 6106
diff changeset
  5375
							RailVehInfo(engine)->railveh_type != RAILVEH_WAGON
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5376
						)
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5377
					)) {
6471
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5378
				const CargoLabel *cl = _default_refitmasks[GetEngine(engine)->type];
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5379
				for (uint i = 0;; i++) {
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5380
					if (cl[i] == 0) break;
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5381
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5382
					CargoID cargo = GetCargoIDByLabel(cl[i]);
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5383
					if (cargo == CT_INVALID) continue;
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5384
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  5385
					SetBit(xor_mask, cargo);
6471
d0e79064c324 (svn r8888) -Codechange: Replace hardcoded default cargo bitmasks with a list of cargo labels.
peter1138
parents: 6469
diff changeset
  5386
				}
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 3026
diff changeset
  5387
			}
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5388
		}
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6433
diff changeset
  5389
		_engine_info[engine].refit_mask = ((mask & ~not_mask) ^ xor_mask) & _cargo_mask;
6468
29a9bd549d0b (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: 6465
diff changeset
  5390
29a9bd549d0b (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: 6465
diff changeset
  5391
		/* Check if this engine's cargo type is valid. If not, set to the first refittable
29a9bd549d0b (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: 6465
diff changeset
  5392
		 * cargo type. Apparently cargo_type isn't a common property... */
29a9bd549d0b (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: 6465
diff changeset
  5393
		switch (GetEngine(engine)->type) {
7134
c5a90dd41166 (svn r9869) -Codechange: replace some bytes with VehicleType, i.e. more type strictness.
rubidium
parents: 7125
diff changeset
  5394
			default: NOT_REACHED();
c5a90dd41166 (svn r9869) -Codechange: replace some bytes with VehicleType, i.e. more type strictness.
rubidium
parents: 7125
diff changeset
  5395
			case VEH_AIRCRAFT: break;
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
  5396
			case VEH_TRAIN: {
6468
29a9bd549d0b (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: 6465
diff changeset
  5397
				RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
29a9bd549d0b (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: 6465
diff changeset
  5398
				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
6608
80bc656cc6fb (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: 6607
diff changeset
  5399
				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
6468
29a9bd549d0b (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: 6465
diff changeset
  5400
				break;
29a9bd549d0b (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: 6465
diff changeset
  5401
			}
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
  5402
			case VEH_ROAD: {
6468
29a9bd549d0b (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: 6465
diff changeset
  5403
				RoadVehicleInfo *rvi = &_road_vehicle_info[engine - ROAD_ENGINES_INDEX];
29a9bd549d0b (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: 6465
diff changeset
  5404
				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
6608
80bc656cc6fb (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: 6607
diff changeset
  5405
				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
6468
29a9bd549d0b (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: 6465
diff changeset
  5406
				break;
29a9bd549d0b (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: 6465
diff changeset
  5407
			}
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
  5408
			case VEH_SHIP: {
6468
29a9bd549d0b (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: 6465
diff changeset
  5409
				ShipVehicleInfo *svi = &_ship_vehicle_info[engine - SHIP_ENGINES_INDEX];
29a9bd549d0b (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: 6465
diff changeset
  5410
				if (svi->cargo_type == CT_INVALID) svi->cargo_type = FindFirstRefittableCargo(engine);
6608
80bc656cc6fb (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: 6607
diff changeset
  5411
				if (svi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
6468
29a9bd549d0b (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: 6465
diff changeset
  5412
				break;
29a9bd549d0b (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: 6465
diff changeset
  5413
			}
29a9bd549d0b (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: 6465
diff changeset
  5414
		}
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5415
	}
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5416
}
363
cf3cee5f33b4 (svn r551) -newgrf: Preliminary support for TTDPatch flags checking (we just pretend that a bunch of things are on and the rest is off and that's it). Patch by octo, small cleanup by pasky.
darkvater
parents: 362
diff changeset
  5417
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5418
/** Add all new houses to the house array. House properties can be set at any
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5419
 * time in the GRF file, so we can only add a house spec to the house array
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5420
 * after the file has finished loading. We also need to check the dates, due to
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5421
 * the TTDPatch behaviour described below that we need to emulate. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5422
static void FinaliseHouseArray()
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5423
{
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5424
	/* If there are no houses with start dates before 1930, then all houses
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5425
	 * with start dates of 1930 have them reset to 0. This is in order to be
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5426
	 * compatible with TTDPatch, where if no houses have start dates before
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5427
	 * 1930 and the date is before 1930, the game pretends that this is 1930.
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5428
	 * If there have been any houses defined with start dates before 1930 then
8661
18e70c2e086e (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: 8660
diff changeset
  5429
	 * the dates are left alone.
18e70c2e086e (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: 8660
diff changeset
  5430
	 * On the other hand, why 1930? Just 'fix' the houses with the lowest
18e70c2e086e (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: 8660
diff changeset
  5431
	 * minimum introduction date to 0.
18e70c2e086e (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: 8660
diff changeset
  5432
	 */
18e70c2e086e (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: 8660
diff changeset
  5433
	Year min_date = MAX_YEAR;
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5434
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5435
	for (GRFFile *file = _first_grffile; file != NULL; file = file->next) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5436
		if (file->housespec == NULL) continue;
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5437
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5438
		for (int i = 0; i < HOUSE_MAX; i++) {
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5439
			HouseSpec *hs = file->housespec[i];
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5440
			if (hs != NULL) {
8794
ccb35d65645b (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: 8778
diff changeset
  5441
				hs->building_name.MapString();
7125
4ce0c7a12a3f (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents: 7119
diff changeset
  5442
				_house_mngr.SetEntitySpec(hs);
8661
18e70c2e086e (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: 8660
diff changeset
  5443
				if (hs->min_date < min_date) min_date = hs->min_date;
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5444
			}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5445
		}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5446
	}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5447
8661
18e70c2e086e (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: 8660
diff changeset
  5448
	if (min_date != 0) {
18e70c2e086e (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: 8660
diff changeset
  5449
		for (int i = 0; i < HOUSE_MAX; i++) {
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5450
			HouseSpec *hs = GetHouseSpecs(i);
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5451
8661
18e70c2e086e (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: 8660
diff changeset
  5452
			if (hs->enabled && hs->min_date == min_date) hs->min_date = 0;
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5453
		}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5454
	}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5455
}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5456
7679
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5457
/** Add all new industries to the industry array. Industry properties can be set at any
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5458
 * time in the GRF file, so we can only add a industry spec to the industry array
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5459
 * after the file has finished loading. */
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5460
static void FinaliseIndustriesArray()
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5461
{
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5462
	for (GRFFile *file = _first_grffile; file != NULL; file = file->next) {
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5463
		if (file->industryspec != NULL) {
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5464
			for (int i = 0; i < NUM_INDUSTRYTYPES; i++) {
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5465
				IndustrySpec *indsp = file->industryspec[i];
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5466
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5467
				if (indsp != NULL && indsp->enabled) {
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5468
					StringID strid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5469
					/* process the conversion of text at the end, so to be sure everything will be fine
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5470
					 * and available.  Check if it does not return undefind marker, which is a very good sign of a
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5471
					 * substitute industry who has not changed the string been examined, thus using it as such */
8794
ccb35d65645b (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: 8778
diff changeset
  5472
					indsp->name.MapString();
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5473
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->name);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5474
					if (strid != STR_UNDEFINED) indsp->name = strid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5475
8794
ccb35d65645b (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: 8778
diff changeset
  5476
					indsp->closure_text.MapString();
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5477
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->closure_text);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5478
					if (strid != STR_UNDEFINED) indsp->closure_text = strid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5479
8794
ccb35d65645b (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: 8778
diff changeset
  5480
					indsp->production_up_text.MapString();
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5481
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->production_up_text);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5482
					if (strid != STR_UNDEFINED) indsp->production_up_text = strid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5483
8794
ccb35d65645b (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: 8778
diff changeset
  5484
					indsp->production_down_text.MapString();
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5485
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->production_down_text);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5486
					if (strid != STR_UNDEFINED) indsp->production_down_text = strid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5487
8794
ccb35d65645b (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: 8778
diff changeset
  5488
					indsp->new_industry_text.MapString();
7713
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5489
					strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->new_industry_text);
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5490
					if (strid != STR_UNDEFINED) indsp->new_industry_text = strid;
051fca48d12b (svn r10495) -Codechange: Add the Action 00 property handlers for Industries and Industry tiles
belugas
parents: 7679
diff changeset
  5491
8966
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5492
					indsp->station_name.MapString();
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5493
					if (indsp->station_name != STR_NULL) {
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5494
						/* STR_NULL (0) can be set by grf.  It has a meaning regarding assignation of the
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5495
						 * station's name. Don't wont to loose the value, therefor, do not process. */
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5496
						strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->station_name);
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5497
						if (strid != STR_UNDEFINED) indsp->station_name = strid;
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5498
					}
19ceef337cb6 (svn r12041) -Codechange: Add the loader and the property for action 00 industries, prop 24, nearby station name.
belugas
parents: 8945
diff changeset
  5499
7679
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5500
					_industry_mngr.SetEntitySpec(indsp);
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5501
					_loaded_newgrf_features.has_newindustries = true;
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5502
				}
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5503
			}
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5504
		}
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5505
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5506
		if (file->indtspec != NULL) {
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5507
			for (int i = 0; i < NUM_INDUSTRYTILES; i++) {
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5508
				IndustryTileSpec *indtsp = file->indtspec[i];
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5509
				if (indtsp != NULL) {
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5510
					_industile_mngr.SetEntitySpec(indtsp);
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5511
				}
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5512
			}
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5513
		}
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5514
	}
7729
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5515
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5516
	for (uint j = 0; j < NUM_INDUSTRYTYPES; j++) {
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5517
		IndustrySpec *indsp = &_industry_specs[j];
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5518
		if (indsp->enabled && indsp->grf_prop.grffile != NULL) {
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5519
			for (uint i = 0; i < 3; i++) {
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5520
				indsp->conflicting[i] = MapNewGRFIndustryType(indsp->conflicting[i], indsp->grf_prop.grffile->grfid);
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5521
			}
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5522
		}
21b3ddd80928 (svn r10514) -Codechange: add support for getting the nearest industry with a given type.
rubidium
parents: 7725
diff changeset
  5523
	}
7679
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5524
}
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5525
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5526
/** Each cargo string needs to be mapped from TTDPatch to OpenTTD string IDs.
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5527
 * This is done after loading so that strings from Action 4 will be mapped
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5528
 * properly. */
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5529
static void MapNewCargoStrings()
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5530
{
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5531
	for (CargoID c = 0; c < NUM_CARGO; c++) {
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5532
		CargoSpec *cs = &_cargo[c];
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5533
		/* Don't map if the cargo is unavailable or not from NewGRF */
8214
854acef589c8 (svn r11253) -Fix (r9411): industries can still use cargo they define, even if these cargo are disabled by a grf loaded later
glx
parents: 8213
diff changeset
  5534
		if (cs->grfid == 0) continue;
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5535
8794
ccb35d65645b (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: 8778
diff changeset
  5536
		cs->name.MapString();
ccb35d65645b (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: 8778
diff changeset
  5537
		cs->name_single.MapString();
ccb35d65645b (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: 8778
diff changeset
  5538
		cs->units_volume.MapString();
ccb35d65645b (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: 8778
diff changeset
  5539
		cs->quantifier.MapString();
ccb35d65645b (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: 8778
diff changeset
  5540
		cs->abbrev.MapString();
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5541
	}
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5542
}
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5543
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5544
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5545
/* Here we perform initial decoding of some special sprites (as are they
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5546
 * described at http://www.ttdpatch.net/src/newgrf.txt, but this is only a very
368
32aad6ad36e1 (svn r556) -newgrf: Some seemingly proper support for loading stages of grf files (octo & pasky).
darkvater
parents: 367
diff changeset
  5547
 * partial implementation yet). */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5548
/* XXX: We consider GRF files trusted. It would be trivial to exploit OTTD by
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5549
 * a crafted invalid GRF file. We should tell that to the user somehow, or
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5550
 * better make this more robust in the future. */
5008
f95f0bd55c34 (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
  5551
static void DecodeSpecialSprite(uint num, GrfLoadingStage stage)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5552
{
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  5553
	/* XXX: There is a difference between staged loading in TTDPatch and
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  5554
	 * here.  In TTDPatch, for some reason actions 1 and 2 are carried out
3561
29c95ab685c0 (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
  5555
	 * during stage 1, whilst action 3 is carried out during stage 2 (to
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  5556
	 * "resolve" cargo IDs... wtf). This is a little problem, because cargo
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  5557
	 * IDs are valid only within a given set (action 1) block, and may be
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  5558
	 * overwritten after action 3 associates them. But overwriting happens
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  5559
	 * in an earlier stage than associating, so...  We just process actions
3561
29c95ab685c0 (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
  5560
	 * 1 and 2 in stage 2 now, let's hope that won't get us into problems.
389
2d394eeba5e5 (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 381
diff changeset
  5561
	 * --pasky */
3561
29c95ab685c0 (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
  5562
	/* We need a pre-stage to set up GOTO labels of Action 0x10 because the grf
29c95ab685c0 (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
  5563
	 * is not in memory and scanning the file every time would be too expensive.
29c95ab685c0 (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
  5564
	 * In other stages we skip action 0x10 since it's already dealt with. */
5008
f95f0bd55c34 (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
  5565
	static const SpecialSpriteHandler handlers[][GLS_END] = {
8395
f59a33543bf8 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 8388
diff changeset
  5566
		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       NULL,           ReserveChangeInfo, FeatureChangeInfo, },
7072
973b998c5cfe (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: 7066
diff changeset
  5567
		/* 0x01 */ { SkipAct1, SkipAct1,  SkipAct1,        SkipAct1,       SkipAct1,          NewSpriteSet, },
973b998c5cfe (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: 7066
diff changeset
  5568
		/* 0x02 */ { NULL,     NULL,      NULL,            NULL,           NULL,              NewSpriteGroup, },
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5569
		/* 0x03 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              FeatureMapSpriteGroup, },
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5570
		/* 0x04 */ { NULL,     NULL,      NULL,            NULL,           NULL,              FeatureNewName, },
7025
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  5571
		/* 0x05 */ { SkipAct5, SkipAct5,  SkipAct5,        SkipAct5,       SkipAct5,          GraphicsNew, },
6699
ff3ea89c64e4 (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: 6691
diff changeset
  5572
		/* 0x06 */ { NULL,     NULL,      NULL,            CfgApply,       CfgApply,          CfgApply, },
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5573
		/* 0x07 */ { NULL,     NULL,      NULL,            NULL,           SkipIf,            SkipIf, },
7302
7aa974539f27 (svn r10045) -Codechange: Process Action 8 during GLS_RESERVATION to allow Action 7/Action 9s to work properly
peter1138
parents: 7301
diff changeset
  5574
		/* 0x08 */ { ScanInfo, NULL,      NULL,            GRFInfo,        GRFInfo,           GRFInfo, },
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5575
		/* 0x09 */ { NULL,     NULL,      NULL,            SkipIf,         SkipIf,            SkipIf, },
7025
8504c5cfa1e5 (svn r9717) -Codechange: (NewGRF) Skip Action 5 & A sprites in all loading stages except activation.
peter1138
parents: 7011
diff changeset
  5576
		/* 0x0A */ { SkipActA, SkipActA,  SkipActA,        SkipActA,       SkipActA,          SpriteReplace, },
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5577
		/* 0x0B */ { NULL,     NULL,      NULL,            GRFLoadError,   GRFLoadError,      GRFLoadError, },
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5578
		/* 0x0C */ { NULL,     NULL,      NULL,            GRFComment,     NULL,              GRFComment, },
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5579
		/* 0x0D */ { NULL,     SafeParamSet, NULL,         ParamSet,       ParamSet,          ParamSet, },
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5580
		/* 0x0E */ { NULL,     SafeGRFInhibit, NULL,       GRFInhibit,     GRFInhibit,        GRFInhibit, },
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  5581
		/* 0x0F */ { NULL,     GRFUnsafe, NULL,            FeatureTownName, NULL,             NULL, },
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5582
		/* 0x10 */ { NULL,     NULL,      DefineGotoLabel, NULL,           NULL,              NULL, },
8927
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  5583
		/* 0x11 */ { SkipAct11,GRFUnsafe, SkipAct11,       SkipAct11,      SkipAct11,         GRFSound, },
8c38efc3987a (svn r12001) -Fix: When skipping Action 11 or 12, also skip belonging sprites.
frosch
parents: 8899
diff changeset
  5584
		/* 0x12 */ { SkipAct12, SkipAct12, SkipAct12,      SkipAct12,      SkipAct12,         LoadFontGlyph, },
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5585
		/* 0x13 */ { NULL,     NULL,      NULL,            NULL,           NULL,              TranslateGRFStrings, },
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5586
	};
368
32aad6ad36e1 (svn r556) -newgrf: Some seemingly proper support for loading stages of grf files (octo & pasky).
darkvater
parents: 367
diff changeset
  5587
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5588
	byte* buf;
368
32aad6ad36e1 (svn r556) -newgrf: Some seemingly proper support for loading stages of grf files (octo & pasky).
darkvater
parents: 367
diff changeset
  5589
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5590
	if (_preload_sprite == NULL) {
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5591
		/* No preloaded sprite to work with; allocate and read the
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5592
		 * pseudo sprite content. */
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5844
diff changeset
  5593
		buf = MallocT<byte>(num);
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5594
		FioReadBlock(buf, num);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5595
	} else {
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5596
		/* Use the preloaded sprite data. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5597
		buf = _preload_sprite;
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5598
		_preload_sprite = NULL;
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  5599
		grfmsg(7, "DecodeSpecialSprite: Using preloaded pseudo sprite data");
3895
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5600
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5601
		/* Skip the real (original) content of this action. */
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5602
		FioSeekTo(num, SEEK_CUR);
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5603
	}
a67d4451a1df (svn r4965) - NewGRF: add support for action 0x06 (modify sprite data) for pseudo sprites
peter1138
parents: 3879
diff changeset
  5604
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5605
	byte action = buf[0];
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5606
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  5607
	if (action == 0xFF) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5608
		grfmsg(7, "DecodeSpecialSprite: Handling data block in stage %d", stage);
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  5609
		GRFDataBlock(buf, num);
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  5610
	} else if (action == 0xFE) {
8395
f59a33543bf8 (svn r11450) -Fix [FS#1432](r8886): cargo translation table was loaded too early
glx
parents: 8388
diff changeset
  5611
		grfmsg(7, "DecodeSpecialSprite: Handling import block in stage %d", stage);
4818
1625f49f708d (svn r6742) - Newsounds: Add support for importing sounds from previously loaded GRF files.
peter1138
parents: 4817
diff changeset
  5612
		GRFImportBlock(buf, num);
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4625
diff changeset
  5613
	} else if (action >= lengthof(handlers)) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5614
		grfmsg(7, "DecodeSpecialSprite: Skipping unknown action 0x%02X", action);
5008
f95f0bd55c34 (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
  5615
	} else if (handlers[action][stage] == NULL) {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5616
		grfmsg(7, "DecodeSpecialSprite: Skipping action 0x%02X in stage %d", action, stage);
2645
964bd8fe3ce2 (svn r3187) Simplify overly complicated ifs, especially if (foo) return false; else return true; is confusing
tron
parents: 2628
diff changeset
  5617
	} else {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5618
		grfmsg(7, "DecodeSpecialSprite: Handling action 0x%02X in stage %d", action, stage);
5008
f95f0bd55c34 (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
  5619
		handlers[action][stage](buf, num);
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5620
	}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5621
	free(buf);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5622
}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5623
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5624
8690
49dffe46a866 (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: 8681
diff changeset
  5625
void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage)
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5626
{
7530
31257d744079 (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: 7452
diff changeset
  5627
	const char *filename = config->filename;
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5628
	uint16 num;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5629
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5630
	/* A .grf file is activated only if it was active when the game was
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5631
	 * started.  If a game is loaded, only its active .grfs will be
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5632
	 * reactivated, unless "loadallgraphics on" is used.  A .grf file is
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5633
	 * considered active if its action 8 has been processed, i.e. its
c19fb4f2df30 (svn 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
	 * action 8 hasn't been skipped using an action 7.
c19fb4f2df30 (svn 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
	 *
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5636
	 * During activation, only actions 0, 1, 2, 3, 4, 5, 7, 8, 9, 0A and 0B are
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5637
	 * carried out.  All others are ignored, because they only need to be
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5638
	 * processed once at initialization.  */
5329
2b117d8652f0 (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
  5639
	if (stage != GLS_FILESCAN && stage != GLS_SAFETYSCAN && stage != GLS_LABELSCAN) {
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5640
		_cur_grffile = GetFileByFilename(filename);
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5567
diff changeset
  5641
		if (_cur_grffile == NULL) error("File '%s' lost in cache.\n", filename);
7302
7aa974539f27 (svn r10045) -Codechange: Process Action 8 during GLS_RESERVATION to allow Action 7/Action 9s to work properly
peter1138
parents: 7301
diff changeset
  5642
		if (stage == GLS_RESERVE && config->status != GCS_INITIALISED) return;
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  5643
		if (stage == GLS_ACTIVATION && !HasBit(config->flags, GCF_RESERVED)) return;
8690
49dffe46a866 (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: 8681
diff changeset
  5644
		_cur_grffile->is_ottdfile = config->IsOpenTTDBaseGRF();
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5645
	}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5646
8301
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5647
	if (file_index > LAST_GRF_SLOT) {
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5648
		DEBUG(grf, 0, "'%s' is not loaded as the maximum number of GRFs has been reached", filename);
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5649
		config->status = GCS_DISABLED;
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5650
		config->error  = CallocT<GRFError>(1);
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5651
		config->error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5652
		config->error->message  = STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED;
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5653
		return;
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5654
	}
47e8f031a6ab (svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents: 8292
diff changeset
  5655
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5656
	FioOpenFile(file_index, filename);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5657
	_file_index = file_index; // XXX
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5658
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  5659
	_cur_grfconfig = config;
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  5660
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5661
	DEBUG(grf, 2, "LoadNewGRFFile: Reading NewGRF-file '%s'", filename);
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5662
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5663
	/* Skip the first sprite; we don't care about how many sprites this
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5664
	 * does contain; newest TTDPatches and George's longvehicles don't
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5665
	 * neither, apparently. */
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5666
	if (FioReadWord() == 4 && FioReadByte() == 0xFF) {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5667
		FioReadDword();
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5668
	} else {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5669
		DEBUG(grf, 7, "LoadNewGRFFile: Custom .grf has invalid format");
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  5670
		return;
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5671
	}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5672
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5673
	_skip_sprites = 0; // XXX
3557
5d12a78ce141 (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  5674
	_nfo_line = 0;
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5675
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5676
	while ((num = FioReadWord()) != 0) {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5677
		byte type = FioReadByte();
3557
5d12a78ce141 (svn r4431) - NewGRF: rename nfo_line to _nfo_line, to avoid confusing Darkvater ;)
peter1138
parents: 3555
diff changeset
  5678
		_nfo_line++;
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5679
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5680
		if (type == 0xFF) {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5681
			if (_skip_sprites == 0) {
2958
3f8946daf55f (svn r3520) Remove unused parameters from some functions
tron
parents: 2935
diff changeset
  5682
				DecodeSpecialSprite(num, stage);
5011
23f0b424a1be (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
  5683
23f0b424a1be (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
  5684
				/* Stop all processing if we are to skip the remaining sprites */
23f0b424a1be (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
  5685
				if (_skip_sprites == -1) break;
23f0b424a1be (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
  5686
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5687
				continue;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5688
			} else {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5689
				FioSkipBytes(num);
1611
bf352a87ef51 (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  5690
			}
368
32aad6ad36e1 (svn r556) -newgrf: Some seemingly proper support for loading stages of grf files (octo & pasky).
darkvater
parents: 367
diff changeset
  5691
		} else {
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5692
			if (_skip_sprites == 0) grfmsg(7, "LoadNewGRFFile: Skipping unexpected sprite");
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5693
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5694
			FioSkipBytes(7);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5695
			num -= 8;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5696
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5697
			if (type & 2) {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5698
				FioSkipBytes(num);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5699
			} else {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5700
				while (num > 0) {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5701
					int8 i = FioReadByte();
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5702
					if (i >= 0) {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5703
						num -= i;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5704
						FioSkipBytes(i);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5705
					} else {
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5706
						i = -(i >> 3);
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5707
						num -= i;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5708
						FioReadByte();
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5709
					}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5710
				}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5711
			}
368
32aad6ad36e1 (svn r556) -newgrf: Some seemingly proper support for loading stages of grf files (octo & pasky).
darkvater
parents: 367
diff changeset
  5712
		}
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5713
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5714
		if (_skip_sprites > 0) _skip_sprites--;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5715
	}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5716
}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5717
8899
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5718
/**
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5719
 * Relocates the old shore sprites at new positions.
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5720
 *
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5721
 * 1. If shore sprites are neither loaded by Action5 nor ActionA, the extra sprites from openttd(w/d).grf are used. (SHORE_REPLACE_ONLY_NEW)
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5722
 * 2. If a newgrf replaces some shore sprites by ActionA. The (maybe also replaced) grass tiles are used for corner shores. (SHORE_REPLACE_ACTION_A)
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5723
 * 3. If a newgrf replaces shore sprites by Action5 any shore replacement by ActionA has no effect. (SHORE_REPLACE_ACTION_5)
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5724
 */
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5725
static void ActivateOldShore()
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5726
{
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5727
	/* Use default graphics, if no shore sprites were loaded.
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5728
	 * Should not happen, as openttd(w/d).grf includes some. */
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5729
	if (_loaded_newgrf_features.shore == SHORE_REPLACE_NONE) _loaded_newgrf_features.shore = SHORE_REPLACE_ACTION_A;
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5730
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5731
	if (_loaded_newgrf_features.shore != SHORE_REPLACE_ACTION_5) {
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5732
		DupSprite(SPR_ORIGINALSHORE_START +  1, SPR_SHORE_BASE +  1); // SLOPE_W
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5733
		DupSprite(SPR_ORIGINALSHORE_START +  2, SPR_SHORE_BASE +  2); // SLOPE_S
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5734
		DupSprite(SPR_ORIGINALSHORE_START +  6, SPR_SHORE_BASE +  3); // SLOPE_SW
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5735
		DupSprite(SPR_ORIGINALSHORE_START     , SPR_SHORE_BASE +  4); // SLOPE_E
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5736
		DupSprite(SPR_ORIGINALSHORE_START +  4, SPR_SHORE_BASE +  6); // SLOPE_SE
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5737
		DupSprite(SPR_ORIGINALSHORE_START +  3, SPR_SHORE_BASE +  8); // SLOPE_N
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5738
		DupSprite(SPR_ORIGINALSHORE_START +  7, SPR_SHORE_BASE +  9); // SLOPE_NW
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5739
		DupSprite(SPR_ORIGINALSHORE_START +  5, SPR_SHORE_BASE + 12); // SLOPE_NE
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5740
	}
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5741
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5742
	if (_loaded_newgrf_features.shore == SHORE_REPLACE_ACTION_A) {
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5743
		DupSprite(SPR_FLAT_GRASS_TILE + 16, SPR_SHORE_BASE +  0); // SLOPE_STEEP_S
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5744
		DupSprite(SPR_FLAT_GRASS_TILE + 17, SPR_SHORE_BASE +  5); // SLOPE_STEEP_W
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5745
		DupSprite(SPR_FLAT_GRASS_TILE +  7, SPR_SHORE_BASE +  7); // SLOPE_WSE
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5746
		DupSprite(SPR_FLAT_GRASS_TILE + 15, SPR_SHORE_BASE + 10); // SLOPE_STEEP_N
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5747
		DupSprite(SPR_FLAT_GRASS_TILE + 11, SPR_SHORE_BASE + 11); // SLOPE_NWS
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5748
		DupSprite(SPR_FLAT_GRASS_TILE + 13, SPR_SHORE_BASE + 13); // SLOPE_ENW
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5749
		DupSprite(SPR_FLAT_GRASS_TILE + 14, SPR_SHORE_BASE + 14); // SLOPE_SEN
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5750
		DupSprite(SPR_FLAT_GRASS_TILE + 18, SPR_SHORE_BASE + 15); // SLOPE_STEEP_E
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5751
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5752
		/* XXX - SLOPE_EW, SLOPE_NS are currently not used.
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5753
		 *       If they would be used somewhen, then these grass tiles will most like not look as needed */
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5754
		DupSprite(SPR_FLAT_GRASS_TILE +  5, SPR_SHORE_BASE + 16); // SLOPE_EW
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5755
		DupSprite(SPR_FLAT_GRASS_TILE + 10, SPR_SHORE_BASE + 17); // SLOPE_NS
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5756
	}
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5757
}
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5758
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6560
diff changeset
  5759
void InitDepotWindowBlockSizes();
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5760
8819
86c6ce890d61 (svn r11888) -Codechange: simplify sorting of the strings in town names dropdown
glx
parents: 8794
diff changeset
  5761
extern void InitGRFTownGeneratorNames();
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  5762
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5763
static void AfterLoadGRFs()
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5764
{
7182
644a1d06f2be (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 7180
diff changeset
  5765
	/* Update the bitmasks for the vehicle lists */
644a1d06f2be (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 7180
diff changeset
  5766
	Player *p;
644a1d06f2be (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 7180
diff changeset
  5767
	FOR_ALL_PLAYERS(p) {
644a1d06f2be (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 7180
diff changeset
  5768
		p->avail_railtypes = GetPlayerRailtypes(p->index);
644a1d06f2be (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 7180
diff changeset
  5769
		p->avail_roadtypes = GetPlayerRoadtypes(p->index);
644a1d06f2be (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 7180
diff changeset
  5770
	}
644a1d06f2be (svn r9918) -Fix: the available roadtypes/railtypes were not updated on GRF updates.
rubidium
parents: 7180
diff changeset
  5771
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5772
	/* Pre-calculate all refit masks after loading GRF files. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5773
	CalculateRefitMasks();
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5774
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5775
	/* Set the block size in the depot windows based on vehicle sprite sizes */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5776
	InitDepotWindowBlockSizes();
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5777
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5778
	/* Add all new houses to the house array. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5779
	FinaliseHouseArray();
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5780
7679
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5781
	/* Add all new industries to the industry array. */
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5782
	FinaliseIndustriesArray();
c3c44a572f6e (svn r10457) -Codechange: Load the newly read definitions of Industries and Industry tiles.
belugas
parents: 7678
diff changeset
  5783
7029
209e4b2e1180 (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: 7025
diff changeset
  5784
	/* Create dynamic list of industry legends for smallmap_gui.cpp */
209e4b2e1180 (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: 7025
diff changeset
  5785
	BuildIndustriesLegend();
209e4b2e1180 (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: 7025
diff changeset
  5786
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5787
	/* Map cargo strings. This is a separate step because cargos are
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5788
	 * loaded before strings... */
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
  5789
	MapNewCargoStrings();
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  5790
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7423
diff changeset
  5791
	/* Update the townname generators list */
8819
86c6ce890d61 (svn r11888) -Codechange: simplify sorting of the strings in town names dropdown
glx
parents: 8794
diff changeset
  5792
	InitGRFTownGeneratorNames();
8899
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5793
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5794
	/* Load old shore sprites in new position, if they were replaced by ActionA */
b622d34771a9 (svn r11973) -Fix (r11726, r11947)[FS#1683]: Use grass tiles for corner shores, if shores got replaced by ActionA.
frosch
parents: 8889
diff changeset
  5795
	ActivateOldShore();
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5796
}
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5797
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5798
void LoadNewGRF(uint load_index, uint file_index)
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5799
{
2930
a3bfaa5a9222 (svn r3486) - NewGRF fix: Always reinitialize the ttdpatch flags as patch settings may have changed.
peter1138
parents: 2895
diff changeset
  5800
	InitializeGRFSpecial();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5801
2463
de2605ed3758 (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
  5802
	ResetNewGRFData();
de2605ed3758 (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
  5803
8655
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5804
	/*
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5805
	 * Reset the status of all files, so we can 'retry' to load them.
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5806
	 * This is needed when one for example rearranges the NewGRFs in-game
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5807
	 * and a previously disabled NewGRF becomes useable. If it would not
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5808
	 * be reset, the NewGRF would remain disabled even though it should
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5809
	 * have been enabled.
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5810
	 */
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5811
	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5812
		if (c->status != GCS_NOT_FOUND) c->status = GCS_UNKNOWN;
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5813
	}
5113b6256c42 (svn r11721) -Fix: do not disable NewGRFs for 'eternity' during games.
rubidium
parents: 8654
diff changeset
  5814
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5815
	/* Load newgrf sprites
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5816
	 * in each loading stage, (try to) open each file specified in the config
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5817
	 * and load information from it. */
8326
f52b35031c5a (svn r11380) -Revert (r11191, r11196): it worked, but broke cargo loading
glx
parents: 8304
diff changeset
  5818
	for (GrfLoadingStage stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; stage++) {
2400
0b51bc385750 (svn r2926) -Fix: Use the same file slots in both initialisation stages when loading a patch grf
tron
parents: 2346
diff changeset
  5819
		uint slot = file_index;
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5820
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5821
		_cur_stage = stage;
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5822
		_cur_spriteid = load_index;
6607
b4f6595855c4 (svn r9093) -Codechange: variable scope / type
peter1138
parents: 6606
diff changeset
  5823
		for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6519
diff changeset
  5824
			if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND) continue;
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  5825
			if (stage > GLS_INIT && HasBit(c->flags, GCF_INIT_ONLY)) continue;
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5225
diff changeset
  5826
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6669
diff changeset
  5827
			/* @todo usererror() */
7530
31257d744079 (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: 7452
diff changeset
  5828
			if (!FioCheckFileExists(c->filename)) error("NewGRF file is missing '%s'", c->filename);
3628
bd4a6601e5a2 (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
  5829
5008
f95f0bd55c34 (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
  5830
			if (stage == GLS_LABELSCAN) InitNewGRFFile(c, _cur_spriteid);
8690
49dffe46a866 (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: 8681
diff changeset
  5831
			LoadNewGRFFile(c, slot++, stage);
7316
7c38e04b95c5 (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: 7309
diff changeset
  5832
			if (stage == GLS_RESERVE) {
8427
143b0be22af1 (svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents: 8425
diff changeset
  5833
				SetBit(c->flags, GCF_RESERVED);
8326
f52b35031c5a (svn r11380) -Revert (r11191, r11196): it worked, but broke cargo loading
glx
parents: 8304
diff changeset
  5834
			} else if (stage == GLS_ACTIVATION) {
8425
72a71d480c5f (svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents: 8424
diff changeset
  5835
				ClrBit(c->flags, GCF_RESERVED);
5727
0fd7e97094e2 (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: 5726
diff changeset
  5836
				ClearTemporaryNewGRFData();
6473
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6471
diff changeset
  5837
				BuildCargoTranslationMap();
6973
100d41c32546 (svn r9653) -Codechange: Indicate the proper function names in the GRF messages
belugas
parents: 6966
diff changeset
  5838
				DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur_spriteid);
5727
0fd7e97094e2 (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: 5726
diff changeset
  5839
			}
2342
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5840
		}
c19fb4f2df30 (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  5841
	}
2611
65b5313bc525 (svn r3148) -NewGRF, Feature: Add support for cargo refitting specification by cargo classes.
peter1138
parents: 2582
diff changeset
  5842
6658
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5843
	/* Call any functions that should be run after GRFs have been loaded. */
59048224be55 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6614
diff changeset
  5844
	AfterLoadGRFs();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  5845
}
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 7029
diff changeset
  5846
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 7029
diff changeset
  5847
bool HasGrfMiscBit(GrfMiscBit bit)
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 7029
diff changeset
  5848
{
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8418
diff changeset
  5849
	return HasBit(_misc_grf_features, bit);
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 7029
diff changeset
  5850
}
8794
ccb35d65645b (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: 8778
diff changeset
  5851
ccb35d65645b (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: 8778
diff changeset
  5852
void GRFMappedStringID::MapString()
ccb35d65645b (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: 8778
diff changeset
  5853
{
ccb35d65645b (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: 8778
diff changeset
  5854
	if (this->grfid == 0) return;
ccb35d65645b (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: 8778
diff changeset
  5855
ccb35d65645b (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: 8778
diff changeset
  5856
	this->string = MapGRFStringID(this->grfid, this->string);
ccb35d65645b (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: 8778
diff changeset
  5857
	this->grfid = 0;
ccb35d65645b (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: 8778
diff changeset
  5858
}