mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-17 21:25:40 +00:00
(svn r9093) -Codechange: variable scope / type
This commit is contained in:
parent
e83e9b9e44
commit
f662e0f996
361
src/newgrf.cpp
361
src/newgrf.cpp
@ -100,14 +100,14 @@ enum grfspec_feature {
|
||||
|
||||
typedef void (*SpecialSpriteHandler)(byte *buf, int len);
|
||||
|
||||
static const int _vehcounts[4] = {
|
||||
static const uint _vehcounts[4] = {
|
||||
/* GSF_TRAIN */ NUM_TRAIN_ENGINES,
|
||||
/* GSF_ROAD */ NUM_ROAD_ENGINES,
|
||||
/* GSF_SHIP */ NUM_SHIP_ENGINES,
|
||||
/* GSF_AIRCRAFT */ NUM_AIRCRAFT_ENGINES
|
||||
};
|
||||
|
||||
static const int _vehshifts[4] = {
|
||||
static const uint _vehshifts[4] = {
|
||||
/* GSF_TRAIN */ 0,
|
||||
/* GSF_ROAD */ ROAD_ENGINES_INDEX,
|
||||
/* GSF_SHIP */ SHIP_ENGINES_INDEX,
|
||||
@ -881,13 +881,11 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
|
||||
switch (prop) {
|
||||
case 0x08: /* Class ID */
|
||||
FOR_EACH_OBJECT {
|
||||
uint32 classid;
|
||||
|
||||
/* Property 0x08 is special; it is where the station is allocated */
|
||||
if (statspec[i] == NULL) statspec[i] = CallocT<StationSpec>(1);
|
||||
|
||||
/* Swap classid because we read it in BE meaning WAYP or DFLT */
|
||||
classid = grf_load_dword(&buf);
|
||||
uint32 classid = grf_load_dword(&buf);
|
||||
statspec[i]->sclass = AllocateStationClass(BSWAP32(classid));
|
||||
}
|
||||
break;
|
||||
@ -895,13 +893,12 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
|
||||
case 0x09: /* Define sprite layout */
|
||||
FOR_EACH_OBJECT {
|
||||
StationSpec *statspec = _cur_grffile->stations[stid + i];
|
||||
uint t;
|
||||
|
||||
statspec->tiles = grf_load_extended(&buf);
|
||||
statspec->renderdata = CallocT<DrawTileSprites>(statspec->tiles);
|
||||
statspec->copied_renderdata = false;
|
||||
|
||||
for (t = 0; t < statspec->tiles; t++) {
|
||||
for (uint t = 0; t < statspec->tiles; t++) {
|
||||
DrawTileSprites *dts = &statspec->renderdata[t];
|
||||
uint seq_count = 0;
|
||||
|
||||
@ -1127,11 +1124,9 @@ static bool BridgeChangeInfo(uint brid, int numinfo, int prop, byte **bufp, int
|
||||
}
|
||||
|
||||
for (; numtables-- != 0; tableid++) {
|
||||
byte sprite;
|
||||
|
||||
if (tableid >= 7) { // skip invalid data
|
||||
grfmsg(1, "BridgeChangeInfo: Table %d >= 7, skipping", tableid);
|
||||
for (sprite = 0; sprite < 32; sprite++) grf_load_dword(&buf);
|
||||
for (byte sprite = 0; sprite < 32; sprite++) grf_load_dword(&buf);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1139,7 +1134,7 @@ static bool BridgeChangeInfo(uint brid, int numinfo, int prop, byte **bufp, int
|
||||
bridge->sprite_table[tableid] = MallocT<PalSpriteID>(32);
|
||||
}
|
||||
|
||||
for (sprite = 0; sprite < 32; sprite++) {
|
||||
for (byte sprite = 0; sprite < 32; sprite++) {
|
||||
SpriteID image = grf_load_word(&buf);
|
||||
SpriteID pal = grf_load_word(&buf);
|
||||
|
||||
@ -1388,10 +1383,6 @@ static void FeatureChangeInfo(byte *buf, int len)
|
||||
/* GSF_SOUNDFX */ SoundEffectChangeInfo,
|
||||
};
|
||||
|
||||
uint8 feature;
|
||||
uint8 numprops;
|
||||
uint8 numinfo;
|
||||
byte engine;
|
||||
EngineInfo *ei = NULL;
|
||||
|
||||
if (len == 1) {
|
||||
@ -1401,10 +1392,10 @@ static void FeatureChangeInfo(byte *buf, int len)
|
||||
|
||||
if (!check_length(len, 6, "FeatureChangeInfo")) return;
|
||||
buf++;
|
||||
feature = grf_load_byte(&buf);
|
||||
numprops = grf_load_byte(&buf);
|
||||
numinfo = grf_load_byte(&buf);
|
||||
engine = grf_load_byte(&buf);
|
||||
uint8 feature = grf_load_byte(&buf);
|
||||
uint8 numprops = grf_load_byte(&buf);
|
||||
uint8 numinfo = grf_load_byte(&buf);
|
||||
uint8 engine = grf_load_byte(&buf);
|
||||
|
||||
grfmsg(6, "FeatureChangeInfo: feature %d, %d properties, to apply to %d+%d",
|
||||
feature, numprops, engine, numinfo);
|
||||
@ -1461,15 +1452,17 @@ static void FeatureChangeInfo(byte *buf, int len)
|
||||
break;
|
||||
|
||||
default:
|
||||
if (handler[feature](engine, numinfo, prop, &buf, bufend - buf))
|
||||
if (handler[feature](engine, numinfo, prop, &buf, bufend - buf)) {
|
||||
ignoring = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (handler[feature](engine, numinfo, prop, &buf, bufend - buf))
|
||||
if (handler[feature](engine, numinfo, prop, &buf, bufend - buf)) {
|
||||
ignoring = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1480,11 +1473,6 @@ static void FeatureChangeInfo(byte *buf, int len)
|
||||
/* Action 0x00 (GLS_SAFETYSCAN) */
|
||||
static void SafeChangeInfo(byte *buf, int len)
|
||||
{
|
||||
uint8 feature;
|
||||
uint8 numprops;
|
||||
uint8 numinfo;
|
||||
uint8 index;
|
||||
|
||||
if (len == 1) {
|
||||
grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
|
||||
return;
|
||||
@ -1492,10 +1480,10 @@ static void SafeChangeInfo(byte *buf, int len)
|
||||
|
||||
if (!check_length(len, 6, "SafeChangeInfo")) return;
|
||||
buf++;
|
||||
feature = grf_load_byte(&buf);
|
||||
numprops = grf_load_byte(&buf);
|
||||
numinfo = grf_load_byte(&buf);
|
||||
index = grf_load_byte(&buf);
|
||||
uint8 feature = grf_load_byte(&buf);
|
||||
uint8 numprops = grf_load_byte(&buf);
|
||||
grf_load_byte(&buf);
|
||||
grf_load_byte(&buf);
|
||||
|
||||
if (feature == GSF_BRIDGE && numprops == 1) {
|
||||
uint8 prop = grf_load_byte(&buf);
|
||||
@ -1514,10 +1502,6 @@ static void SafeChangeInfo(byte *buf, int len)
|
||||
static void InitChangeInfo(byte *buf, int len)
|
||||
{
|
||||
byte *bufend = buf + len;
|
||||
uint8 feature;
|
||||
uint8 numprops;
|
||||
uint8 numinfo;
|
||||
uint8 index;
|
||||
|
||||
if (len == 1) {
|
||||
grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
|
||||
@ -1526,10 +1510,10 @@ static void InitChangeInfo(byte *buf, int len)
|
||||
|
||||
if (!check_length(len, 6, "InitChangeInfo")) return;
|
||||
buf++;
|
||||
feature = grf_load_byte(&buf);
|
||||
numprops = grf_load_byte(&buf);
|
||||
numinfo = grf_load_byte(&buf);
|
||||
index = grf_load_byte(&buf);
|
||||
uint8 feature = grf_load_byte(&buf);
|
||||
uint8 numprops = grf_load_byte(&buf);
|
||||
uint8 numinfo = grf_load_byte(&buf);
|
||||
uint8 index = grf_load_byte(&buf);
|
||||
|
||||
while (numprops-- && buf < bufend) {
|
||||
uint8 prop = grf_load_byte(&buf);
|
||||
@ -1613,19 +1597,13 @@ static void NewSpriteSet(byte *buf, int len)
|
||||
* vehicle directions in each sprite set
|
||||
* Set num-dirs=8, unless your sprites are symmetric.
|
||||
* In that case, use num-dirs=4.
|
||||
* For stations, must be 12 (hex) for the eighteen
|
||||
* different sprites that make up a station */
|
||||
/* TODO: No stations support. */
|
||||
uint8 feature;
|
||||
uint num_sets;
|
||||
uint num_ents;
|
||||
uint i;
|
||||
*/
|
||||
|
||||
if (!check_length(len, 4, "NewSpriteSet")) return;
|
||||
buf++;
|
||||
feature = grf_load_byte(&buf);
|
||||
num_sets = grf_load_byte(&buf);
|
||||
num_ents = grf_load_extended(&buf);
|
||||
uint8 feature = grf_load_byte(&buf);
|
||||
uint8 num_sets = grf_load_byte(&buf);
|
||||
uint16 num_ents = grf_load_extended(&buf);
|
||||
|
||||
_cur_grffile->spriteset_start = _cur_spriteid;
|
||||
_cur_grffile->spriteset_feature = feature;
|
||||
@ -1636,7 +1614,7 @@ static void NewSpriteSet(byte *buf, int len)
|
||||
_cur_spriteid, feature, num_sets, num_ents, num_sets * num_ents
|
||||
);
|
||||
|
||||
for (i = 0; i < num_sets * num_ents; i++) {
|
||||
for (uint i = 0; i < num_sets * num_ents; i++) {
|
||||
LoadNextSprite(_cur_spriteid++, _file_index);
|
||||
_nfo_line++;
|
||||
}
|
||||
@ -1699,18 +1677,15 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||
* otherwise it specifies a number of entries, the exact
|
||||
* meaning depends on the feature
|
||||
* V feature-specific-data (huge mess, don't even look it up --pasky) */
|
||||
uint8 feature;
|
||||
uint8 setid;
|
||||
uint8 type;
|
||||
SpriteGroup *group = NULL;
|
||||
byte *bufend = buf + len;
|
||||
|
||||
if (!check_length(len, 5, "NewSpriteGroup")) return;
|
||||
buf++;
|
||||
|
||||
feature = grf_load_byte(&buf);
|
||||
setid = grf_load_byte(&buf);
|
||||
type = grf_load_byte(&buf);
|
||||
uint8 feature = grf_load_byte(&buf);
|
||||
uint8 setid = grf_load_byte(&buf);
|
||||
uint8 type = grf_load_byte(&buf);
|
||||
|
||||
if (setid >= _cur_grffile->spritegroups_count) {
|
||||
// Allocate memory for new sprite group references.
|
||||
@ -1731,7 +1706,6 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||
{
|
||||
byte varadjust;
|
||||
byte varsize;
|
||||
uint i;
|
||||
|
||||
/* Check we can load the var size parameter */
|
||||
if (!check_length(bufend - buf, 1, "NewSpriteGroup (Deterministic) (1)")) return;
|
||||
@ -1794,7 +1768,7 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||
|
||||
if (!check_length(bufend - buf, 2 + (2 + 2 * varsize) * group->g.determ.num_ranges, "NewSpriteGroup (Deterministic)")) return;
|
||||
|
||||
for (i = 0; i < group->g.determ.num_ranges; i++) {
|
||||
for (uint i = 0; i < group->g.determ.num_ranges; i++) {
|
||||
group->g.determ.ranges[i].group = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
|
||||
group->g.determ.ranges[i].low = grf_load_var(varsize, &buf);
|
||||
group->g.determ.ranges[i].high = grf_load_var(varsize, &buf);
|
||||
@ -1808,16 +1782,13 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||
case 0x80: // Self scope
|
||||
case 0x83: // Parent scope
|
||||
{
|
||||
byte triggers;
|
||||
uint i;
|
||||
|
||||
if (!check_length(bufend - buf, 7, "NewSpriteGroup (Randomized) (1)")) return;
|
||||
|
||||
group = AllocateSpriteGroup();
|
||||
group->type = SGT_RANDOMIZED;
|
||||
group->g.random.var_scope = HASBIT(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
|
||||
|
||||
triggers = grf_load_byte(&buf);
|
||||
uint8 triggers = grf_load_byte(&buf);
|
||||
group->g.random.triggers = GB(triggers, 0, 7);
|
||||
group->g.random.cmp_mode = HASBIT(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
|
||||
group->g.random.lowest_randbit = grf_load_byte(&buf);
|
||||
@ -1826,7 +1797,7 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||
|
||||
if (!check_length(bufend - buf, 2 * group->g.random.num_groups, "NewSpriteGroup (Randomized) (2)")) return;
|
||||
|
||||
for (i = 0; i < group->g.random.num_groups; i++) {
|
||||
for (uint i = 0; i < group->g.random.num_groups; i++) {
|
||||
group->g.random.groups[i] = GetGroupFromGroupID(setid, type, grf_load_word(&buf));
|
||||
}
|
||||
|
||||
@ -1848,7 +1819,6 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||
byte sprites = _cur_grffile->spriteset_numents;
|
||||
byte num_loaded = type;
|
||||
byte num_loading = grf_load_byte(&buf);
|
||||
uint i;
|
||||
|
||||
if (_cur_grffile->spriteset_start == 0) {
|
||||
grfmsg(0, "NewSpriteGroup: No sprite set to work on! Skipping");
|
||||
@ -1868,13 +1838,13 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||
grfmsg(6, "NewSpriteGroup: New SpriteGroup 0x%02X, %u views, %u loaded, %u loading",
|
||||
setid, sprites, num_loaded, num_loading);
|
||||
|
||||
for (i = 0; i < num_loaded; i++) {
|
||||
for (uint i = 0; i < num_loaded; i++) {
|
||||
uint16 spriteid = grf_load_word(&buf);
|
||||
group->g.real.loaded[i] = CreateGroupFromGroupID(feature, setid, type, spriteid, sprites);
|
||||
grfmsg(8, "NewSpriteGroup: + rg->loaded[%i] = subset %u", i, spriteid);
|
||||
}
|
||||
|
||||
for (i = 0; i < num_loading; i++) {
|
||||
for (uint i = 0; i < num_loading; i++) {
|
||||
uint16 spriteid = grf_load_word(&buf);
|
||||
group->g.real.loading[i] = CreateGroupFromGroupID(feature, setid, type, spriteid, sprites);
|
||||
grfmsg(8, "NewSpriteGroup: + rg->loading[%i] = subset %u", i, spriteid);
|
||||
@ -1943,26 +1913,22 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
||||
|
||||
static byte *last_engines;
|
||||
static int last_engines_count;
|
||||
uint8 feature;
|
||||
uint8 idcount;
|
||||
bool wagover;
|
||||
uint8 cidcount;
|
||||
int c, i;
|
||||
|
||||
if (!check_length(len, 6, "FeatureMapSpriteGroup")) return;
|
||||
feature = buf[1];
|
||||
idcount = buf[2] & 0x7F;
|
||||
wagover = (buf[2] & 0x80) == 0x80;
|
||||
|
||||
uint8 feature = buf[1];
|
||||
uint8 idcount = buf[2] & 0x7F;
|
||||
bool wagover = (buf[2] & 0x80) == 0x80;
|
||||
|
||||
if (!check_length(len, 3 + idcount, "FeatureMapSpriteGroup")) return;
|
||||
|
||||
/* If ``n-id'' (or ``idcount'') is zero, this is a ``feature
|
||||
* callback''. */
|
||||
/* If idcount is zero, this is a feature callback */
|
||||
if (idcount == 0) {
|
||||
grfmsg(2, "FeatureMapSpriteGroup: Feature callbacks not implemented yet");
|
||||
return;
|
||||
}
|
||||
|
||||
cidcount = buf[3 + idcount];
|
||||
uint8 cidcount = buf[3 + idcount];
|
||||
if (!check_length(len, 4 + idcount + cidcount * 3, "FeatureMapSpriteGroup")) return;
|
||||
|
||||
grfmsg(6, "FeatureMapSpriteGroup: Feature %d, %d ids, %d cids, wagon override %d",
|
||||
@ -1977,12 +1943,12 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
||||
if (feature == GSF_STATION) {
|
||||
// We do things differently for stations.
|
||||
|
||||
for (i = 0; i < idcount; i++) {
|
||||
for (uint i = 0; i < idcount; i++) {
|
||||
uint8 stid = buf[3 + i];
|
||||
StationSpec *statspec = _cur_grffile->stations[stid];
|
||||
byte *bp = &buf[4 + idcount];
|
||||
|
||||
for (c = 0; c < cidcount; c++) {
|
||||
for (uint c = 0; c < cidcount; c++) {
|
||||
uint8 ctype = grf_load_byte(&bp);
|
||||
uint16 groupid = grf_load_word(&bp);
|
||||
|
||||
@ -2009,7 +1975,7 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < idcount; i++) {
|
||||
for (uint i = 0; i < idcount; i++) {
|
||||
uint8 stid = buf[3 + i];
|
||||
StationSpec *statspec = _cur_grffile->stations[stid];
|
||||
|
||||
@ -2046,7 +2012,7 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < idcount; i++) {
|
||||
for (uint i = 0; i < idcount; i++) {
|
||||
uint8 engine_id = buf[3 + i];
|
||||
uint8 engine = engine_id + _vehshifts[feature];
|
||||
byte *bp = &buf[4 + idcount];
|
||||
@ -2058,7 +2024,7 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
||||
|
||||
grfmsg(7, "FeatureMapSpriteGroup: [%d] Engine %d...", i, engine);
|
||||
|
||||
for (c = 0; c < cidcount; c++) {
|
||||
for (uint c = 0; c < cidcount; c++) {
|
||||
uint8 ctype = grf_load_byte(&bp);
|
||||
uint16 groupid = grf_load_word(&bp);
|
||||
|
||||
@ -2087,7 +2053,7 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
||||
|
||||
grfmsg(8, "-- Default group id 0x%04X", groupid);
|
||||
|
||||
for (i = 0; i < idcount; i++) {
|
||||
for (uint i = 0; i < idcount; i++) {
|
||||
uint8 engine = buf[3 + i] + _vehshifts[feature];
|
||||
|
||||
// Don't tell me you don't love duplicated code!
|
||||
@ -2132,35 +2098,23 @@ static void FeatureNewName(byte *buf, int len)
|
||||
* Word : ID of string to change/add
|
||||
* S data new texts, each of them zero-terminated, after
|
||||
* which the next name begins. */
|
||||
/* TODO: No support for changing non-vehicle text. Perhaps we shouldn't
|
||||
* implement it at all, but it could be useful for some "modpacks"
|
||||
* (completely new scenarios changing all graphics and logically also
|
||||
* factory names etc). We should then also support all languages (by
|
||||
* name), not only the original four ones. --pasky
|
||||
* All of the above are coming. In Time. Some sooner than others :)*/
|
||||
|
||||
uint8 feature;
|
||||
uint8 lang;
|
||||
uint8 num;
|
||||
uint16 id;
|
||||
uint16 endid;
|
||||
bool new_scheme = _cur_grffile->grf_version >= 7;
|
||||
bool generic;
|
||||
|
||||
if (!check_length(len, 6, "FeatureNewName")) return;
|
||||
buf++;
|
||||
feature = grf_load_byte(&buf);
|
||||
lang = grf_load_byte(&buf);
|
||||
num = grf_load_byte(&buf);
|
||||
generic = HASBIT(lang, 7);
|
||||
id = generic ? grf_load_word(&buf) : grf_load_byte(&buf);
|
||||
uint8 feature = grf_load_byte(&buf);
|
||||
uint8 lang = grf_load_byte(&buf);
|
||||
uint8 num = grf_load_byte(&buf);
|
||||
bool generic = HASBIT(lang, 7);
|
||||
uint16 id = generic ? grf_load_word(&buf) : grf_load_byte(&buf);
|
||||
|
||||
CLRBIT(lang, 7);
|
||||
|
||||
if (feature <= GSF_AIRCRAFT && id < _vehcounts[feature]) {
|
||||
id += _vehshifts[feature];
|
||||
}
|
||||
endid = id + num;
|
||||
uint16 endid = id + num;
|
||||
|
||||
grfmsg(6, "FeatureNewName: About to rename engines %d..%d (feature %d) in language 0x%02X",
|
||||
id, endid, feature, lang);
|
||||
@ -2260,14 +2214,12 @@ static void GraphicsNew(byte *buf, int len)
|
||||
* V other data Graphics type specific data. Currently unused. */
|
||||
/* TODO */
|
||||
|
||||
uint8 type;
|
||||
uint16 num;
|
||||
SpriteID replace = 0;
|
||||
|
||||
if (!check_length(len, 2, "GraphicsNew")) return;
|
||||
buf++;
|
||||
type = grf_load_byte(&buf);
|
||||
num = grf_load_extended(&buf);
|
||||
uint8 type = grf_load_byte(&buf);
|
||||
uint16 num = grf_load_extended(&buf);
|
||||
|
||||
switch (type) {
|
||||
case 0x04: /* Signal graphics */
|
||||
@ -2484,22 +2436,15 @@ static void SkipIf(byte *buf, int len)
|
||||
* V value
|
||||
* B num-sprites */
|
||||
/* TODO: More params. More condition types. */
|
||||
uint8 param;
|
||||
uint8 paramsize;
|
||||
uint8 condtype;
|
||||
uint8 numsprites;
|
||||
uint32 param_val = 0;
|
||||
uint32 cond_val = 0;
|
||||
uint32 mask = 0;
|
||||
bool result;
|
||||
GRFLabel *label;
|
||||
GRFLabel *choice = NULL;
|
||||
|
||||
if (!check_length(len, 6, "SkipIf")) return;
|
||||
buf++;
|
||||
param = grf_load_byte(&buf);
|
||||
paramsize = grf_load_byte(&buf);
|
||||
condtype = grf_load_byte(&buf);
|
||||
uint8 param = grf_load_byte(&buf);
|
||||
uint8 paramsize = grf_load_byte(&buf);
|
||||
uint8 condtype = grf_load_byte(&buf);
|
||||
|
||||
if (condtype < 2) {
|
||||
/* Always 1 for bit tests, the given value should be ignored. */
|
||||
@ -2518,7 +2463,7 @@ static void SkipIf(byte *buf, int len)
|
||||
return;
|
||||
}
|
||||
|
||||
param_val = GetParamVal(param, &cond_val);
|
||||
uint32 param_val = GetParamVal(param, &cond_val);
|
||||
|
||||
grfmsg(7, "Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
|
||||
|
||||
@ -2582,13 +2527,14 @@ static void SkipIf(byte *buf, int len)
|
||||
return;
|
||||
}
|
||||
|
||||
numsprites = grf_load_byte(&buf);
|
||||
uint8 numsprites = grf_load_byte(&buf);
|
||||
|
||||
/* numsprites can be a GOTO label if it has been defined in the GRF
|
||||
* file. The jump will always be the first matching label that follows
|
||||
* the current nfo_line. If no matching label is found, the first matching
|
||||
* label in the file is used. */
|
||||
for (label = _cur_grffile->label; label != NULL; label = label->next) {
|
||||
GRFLabel *choice = NULL;
|
||||
for (GRFLabel *label = _cur_grffile->label; label != NULL; label = label->next) {
|
||||
if (label->label != numsprites) continue;
|
||||
|
||||
/* Remember a goto before the current line */
|
||||
@ -2624,14 +2570,10 @@ static void SkipIf(byte *buf, int len)
|
||||
/* Action 0x08 (GLS_FILESCAN) */
|
||||
static void ScanInfo(byte *buf, int len)
|
||||
{
|
||||
uint8 version;
|
||||
uint32 grfid;
|
||||
const char *name;
|
||||
const char *info;
|
||||
|
||||
if (!check_length(len, 8, "Info")) return; buf++;
|
||||
version = grf_load_byte(&buf);
|
||||
grfid = grf_load_dword(&buf);
|
||||
if (!check_length(len, 8, "Info")) return;
|
||||
buf++;
|
||||
grf_load_byte(&buf);
|
||||
uint32 grfid = grf_load_dword(&buf);
|
||||
|
||||
_cur_grfconfig->grfid = grfid;
|
||||
|
||||
@ -2639,12 +2581,12 @@ static void ScanInfo(byte *buf, int len)
|
||||
if (GB(grfid, 24, 8) == 0xFF) SETBIT(_cur_grfconfig->flags, GCF_SYSTEM);
|
||||
|
||||
len -= 6;
|
||||
name = grf_load_string(&buf, len);
|
||||
const char *name = grf_load_string(&buf, len);
|
||||
_cur_grfconfig->name = TranslateTTDPatchCodes(name);
|
||||
|
||||
len -= strlen(name) + 1;
|
||||
if (len > 0) {
|
||||
info = grf_load_string(&buf, len);
|
||||
const char *info = grf_load_string(&buf, len);
|
||||
_cur_grfconfig->info = TranslateTTDPatchCodes(info);
|
||||
}
|
||||
|
||||
@ -2661,15 +2603,12 @@ static void GRFInfo(byte *buf, int len)
|
||||
* 4*B grf-id globally unique ID of this .grf file
|
||||
* S name name of this .grf set
|
||||
* S info string describing the set, and e.g. author and copyright */
|
||||
/* TODO: Check version. (We should have own versioning done somehow.) */
|
||||
uint8 version;
|
||||
uint32 grfid;
|
||||
const char *name;
|
||||
|
||||
if (!check_length(len, 8, "GRFInfo")) return; buf++;
|
||||
version = grf_load_byte(&buf);
|
||||
grfid = grf_load_dword(&buf);
|
||||
name = grf_load_string(&buf, len - 6);
|
||||
if (!check_length(len, 8, "GRFInfo")) return;
|
||||
buf++;
|
||||
uint8 version = grf_load_byte(&buf);
|
||||
uint32 grfid = grf_load_dword(&buf);
|
||||
const char *name = grf_load_string(&buf, len - 6);
|
||||
|
||||
_cur_grffile->grfid = grfid;
|
||||
_cur_grffile->grf_version = version;
|
||||
@ -2689,22 +2628,19 @@ static void SpriteReplace(byte *buf, int len)
|
||||
* Each set:
|
||||
* B num-sprites How many sprites are in this set
|
||||
* W first-sprite First sprite number to replace */
|
||||
uint8 num_sets;
|
||||
uint i;
|
||||
|
||||
buf++; /* skip action byte */
|
||||
num_sets = grf_load_byte(&buf);
|
||||
uint8 num_sets = grf_load_byte(&buf);
|
||||
|
||||
for (i = 0; i < num_sets; i++) {
|
||||
for (uint i = 0; i < num_sets; i++) {
|
||||
uint8 num_sprites = grf_load_byte(&buf);
|
||||
uint16 first_sprite = grf_load_word(&buf);
|
||||
uint j;
|
||||
|
||||
grfmsg(2, "SpriteReplace: [Set %d] Changing %d sprites, beginning with %d",
|
||||
i, num_sprites, first_sprite
|
||||
);
|
||||
|
||||
for (j = 0; j < num_sprites; j++) {
|
||||
for (uint j = 0; j < num_sprites; j++) {
|
||||
LoadNextSprite(first_sprite + j, _file_index); // XXX
|
||||
_nfo_line++;
|
||||
}
|
||||
@ -2844,11 +2780,9 @@ static void GRFComment(byte *buf, int len)
|
||||
/* Action 0x0D (GLS_SAFETYSCAN) */
|
||||
static void SafeParamSet(byte *buf, int len)
|
||||
{
|
||||
uint8 target;
|
||||
|
||||
if (!check_length(len, 5, "SafeParamSet")) return;
|
||||
buf++;
|
||||
target = grf_load_byte(&buf);
|
||||
uint8 target = grf_load_byte(&buf);
|
||||
|
||||
/* Only writing GRF parameters is considered safe */
|
||||
if (target < 0x80) return;
|
||||
@ -2889,20 +2823,14 @@ static void ParamSet(byte *buf, int len)
|
||||
* (source2 like in 05, and source1 as well)
|
||||
*/
|
||||
|
||||
byte target;
|
||||
byte oper;
|
||||
uint32 src1;
|
||||
uint32 src2;
|
||||
uint32 data = 0;
|
||||
uint32 res;
|
||||
|
||||
if (!check_length(len, 5, "ParamSet")) return;
|
||||
buf++;
|
||||
target = grf_load_byte(&buf);
|
||||
oper = grf_load_byte(&buf);
|
||||
src1 = grf_load_byte(&buf);
|
||||
src2 = grf_load_byte(&buf);
|
||||
uint8 target = grf_load_byte(&buf);
|
||||
uint8 oper = grf_load_byte(&buf);
|
||||
uint32 src1 = grf_load_byte(&buf);
|
||||
uint32 src2 = grf_load_byte(&buf);
|
||||
|
||||
uint32 data = 0;
|
||||
if (len >= 8) data = grf_load_dword(&buf);
|
||||
|
||||
/* You can add 80 to the operation to make it apply only if the target
|
||||
@ -2911,13 +2839,13 @@ static void ParamSet(byte *buf, int len)
|
||||
* - it has been set to any value in the newgrf(w).cfg parameter list
|
||||
* - it OR A PARAMETER WITH HIGHER NUMBER has been set to any value by
|
||||
* an earlier action D */
|
||||
if (oper & 0x80) {
|
||||
if (HASBIT(oper, 7)) {
|
||||
if (target < 0x80 && target < _cur_grffile->param_end) {
|
||||
grfmsg(7, "Param %u already defined, skipping", target);
|
||||
return;
|
||||
}
|
||||
|
||||
oper &= 0x7F;
|
||||
oper = GB(oper, 0, 7);
|
||||
}
|
||||
|
||||
if (src2 == 0xFE) {
|
||||
@ -2945,7 +2873,6 @@ static void ParamSet(byte *buf, int len)
|
||||
uint start = 0;
|
||||
uint size = 0;
|
||||
uint shift = _vehshifts[feature];
|
||||
int i;
|
||||
|
||||
if (op == 6) {
|
||||
/* Return GRFID of set that reserved ID */
|
||||
@ -2956,7 +2883,7 @@ static void ParamSet(byte *buf, int len)
|
||||
/* With an operation of 2 or 3, we want to reserve a specific block of IDs */
|
||||
if (op == 2 || op == 3) start = _cur_grffile->param[target];
|
||||
|
||||
for (i = start; i < _vehcounts[feature]; i++) {
|
||||
for (uint i = start; i < _vehcounts[feature]; i++) {
|
||||
if (_grm_engines[shift + i] == 0) {
|
||||
size++;
|
||||
} else {
|
||||
@ -2972,7 +2899,7 @@ static void ParamSet(byte *buf, int len)
|
||||
/* Got the slot... */
|
||||
if (op == 0 || op == 3) {
|
||||
grfmsg(2, "GRM: Reserving %d vehicles at %d", count, start);
|
||||
for (i = 0; i < count; i++) _grm_engines[shift + start + i] = _cur_grffile->grfid;
|
||||
for (uint i = 0; i < count; i++) _grm_engines[shift + start + i] = _cur_grffile->grfid;
|
||||
}
|
||||
src1 = start;
|
||||
} else {
|
||||
@ -3048,6 +2975,7 @@ static void ParamSet(byte *buf, int len)
|
||||
* cannot be found, a value of 0 is used for the parameter value
|
||||
* instead. */
|
||||
|
||||
uint32 res;
|
||||
switch (oper) {
|
||||
case 0x00:
|
||||
res = src1;
|
||||
@ -3169,15 +3097,12 @@ static void SafeGRFInhibit(byte *buf, int len)
|
||||
* B num Number of GRFIDs that follow
|
||||
* D grfids GRFIDs of the files to deactivate */
|
||||
|
||||
byte num;
|
||||
int i;
|
||||
if (!check_length(len, 2, "GRFInhibit")) return;
|
||||
buf++;
|
||||
uint8 num = grf_load_byte(&buf);
|
||||
if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
|
||||
|
||||
if (!check_length(len, 1, "GRFInhibit")) return;
|
||||
buf++, len--;
|
||||
num = grf_load_byte(&buf); len--;
|
||||
if (!check_length(len, 4 * num, "GRFInhibit")) return;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
for (uint i = 0; i < num; i++) {
|
||||
uint32 grfid = grf_load_dword(&buf);
|
||||
|
||||
/* GRF is unsafe it if tries to deactivate other GRFs */
|
||||
@ -3200,15 +3125,12 @@ static void GRFInhibit(byte *buf, int len)
|
||||
* B num Number of GRFIDs that follow
|
||||
* D grfids GRFIDs of the files to deactivate */
|
||||
|
||||
byte num;
|
||||
int i;
|
||||
if (!check_length(len, 2, "GRFInhibit")) return;
|
||||
buf++;
|
||||
uint8 num = grf_load_byte(&buf);
|
||||
if (!check_length(len, 2 + 4 * num, "GRFInhibit")) return;
|
||||
|
||||
if (!check_length(len, 1, "GRFInhibit")) return;
|
||||
buf++, len--;
|
||||
num = grf_load_byte(&buf); len--;
|
||||
if (!check_length(len, 4 * num, "GRFInhibit")) return;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
for (uint i = 0; i < num; i++) {
|
||||
uint32 grfid = grf_load_dword(&buf);
|
||||
GRFConfig *file = GetGRFConfig(grfid);
|
||||
|
||||
@ -3228,12 +3150,10 @@ static void DefineGotoLabel(byte *buf, int len)
|
||||
* B label The label to define
|
||||
* V comment Optional comment - ignored */
|
||||
|
||||
GRFLabel *label;
|
||||
|
||||
if (!check_length(len, 1, "DefineGotoLabel")) return;
|
||||
buf++; len--;
|
||||
|
||||
label = MallocT<GRFLabel>(1);
|
||||
GRFLabel *label = MallocT<GRFLabel>(1);
|
||||
label->label = grf_load_byte(&buf);
|
||||
label->nfo_line = _nfo_line;
|
||||
label->pos = FioGetPos();
|
||||
@ -3259,11 +3179,9 @@ static void GRFSound(byte *buf, int len)
|
||||
*
|
||||
* W num Number of sound files that follow */
|
||||
|
||||
uint16 num;
|
||||
|
||||
if (!check_length(len, 1, "GRFSound")) return;
|
||||
buf++;
|
||||
num = grf_load_word(&buf);
|
||||
uint16 num = grf_load_word(&buf);
|
||||
|
||||
_grf_data_blocks = num;
|
||||
_grf_data_type = GDT_SOUND;
|
||||
@ -3325,11 +3243,10 @@ static void GRFImportBlock(byte *buf, int len)
|
||||
static void LoadGRFSound(byte *buf, int len)
|
||||
{
|
||||
byte *buf_start = buf;
|
||||
FileEntry *se;
|
||||
|
||||
/* Allocate a sound entry. This is done even if the data is not loaded
|
||||
* so that the indices used elsewhere are still correct. */
|
||||
se = AllocateFileEntry();
|
||||
FileEntry *se = AllocateFileEntry();
|
||||
|
||||
if (grf_load_dword(&buf) != BSWAP32('RIFF')) {
|
||||
grfmsg(1, "LoadGRFSound: Missing RIFF header");
|
||||
@ -3394,25 +3311,21 @@ static void LoadFontGlyph(byte *buf, int len)
|
||||
* B num_char Number of consecutive glyphs
|
||||
* W base_char First character index */
|
||||
|
||||
uint8 num_def;
|
||||
uint i;
|
||||
|
||||
buf++; len--;
|
||||
if (!check_length(len, 1, "LoadFontGlyph")) return;
|
||||
|
||||
num_def = grf_load_byte(&buf);
|
||||
uint8 num_def = grf_load_byte(&buf);
|
||||
|
||||
if (!check_length(len, 1 + num_def * 4, "LoadFontGlyph")) return;
|
||||
|
||||
for (i = 0; i < num_def; i++) {
|
||||
for (uint i = 0; i < num_def; i++) {
|
||||
FontSize size = (FontSize)grf_load_byte(&buf);
|
||||
uint8 num_char = grf_load_byte(&buf);
|
||||
uint16 base_char = grf_load_word(&buf);
|
||||
uint c;
|
||||
|
||||
grfmsg(7, "LoadFontGlyph: Loading %u glyph(s) at 0x%04X for size %u", num_char, base_char, size);
|
||||
|
||||
for (c = 0; c < num_char; c++) {
|
||||
for (uint c = 0; c < num_char; c++) {
|
||||
SetUnicodeGlyph(size, base_char + c, _cur_spriteid);
|
||||
LoadNextSprite(_cur_spriteid++, _file_index);
|
||||
_nfo_line++;
|
||||
@ -3489,17 +3402,14 @@ static void TranslateGRFStrings(byte *buf, int len)
|
||||
/* 'Action 0xFF' */
|
||||
static void GRFDataBlock(byte *buf, int len)
|
||||
{
|
||||
byte name_len;
|
||||
const char *name;
|
||||
|
||||
if (_grf_data_blocks == 0) {
|
||||
grfmsg(2, "GRFDataBlock: unexpected data block, skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
buf++;
|
||||
name_len = grf_load_byte(&buf);
|
||||
name = (const char *)buf;
|
||||
uint8 name_len = grf_load_byte(&buf);
|
||||
const char *name = (const char *)buf;
|
||||
buf += name_len + 1;
|
||||
|
||||
grfmsg(2, "GRFDataBlock: block name '%s'...", name);
|
||||
@ -3604,20 +3514,15 @@ static void InitializeGRFSpecial()
|
||||
|
||||
static void ResetCustomStations()
|
||||
{
|
||||
StationSpec *statspec;
|
||||
GRFFile *file;
|
||||
uint i;
|
||||
uint t;
|
||||
|
||||
for (file = _first_grffile; file != NULL; file = file->next) {
|
||||
for (GRFFile *file = _first_grffile; file != NULL; file = file->next) {
|
||||
if (file->stations == NULL) continue;
|
||||
for (i = 0; i < MAX_STATIONS; i++) {
|
||||
for (uint i = 0; i < MAX_STATIONS; i++) {
|
||||
if (file->stations[i] == NULL) continue;
|
||||
statspec = file->stations[i];
|
||||
StationSpec *statspec = file->stations[i];
|
||||
|
||||
/* Release renderdata, if it wasn't copied from another custom station spec */
|
||||
if (!statspec->copied_renderdata) {
|
||||
for (t = 0; t < statspec->tiles; t++) {
|
||||
for (uint t = 0; t < statspec->tiles; t++) {
|
||||
free((void*)statspec->renderdata[t].seq);
|
||||
}
|
||||
free(statspec->renderdata);
|
||||
@ -3625,9 +3530,8 @@ static void ResetCustomStations()
|
||||
|
||||
/* Release platforms and layouts */
|
||||
if (!statspec->copied_layouts) {
|
||||
uint l, p;
|
||||
for (l = 0; l < statspec->lengths; l++) {
|
||||
for (p = 0; p < statspec->platforms[l]; p++) {
|
||||
for (uint l = 0; l < statspec->lengths; l++) {
|
||||
for (uint p = 0; p < statspec->platforms[l]; p++) {
|
||||
free(statspec->layouts[l][p]);
|
||||
}
|
||||
free(statspec->layouts[l]);
|
||||
@ -3648,9 +3552,9 @@ static void ResetCustomStations()
|
||||
|
||||
static void ResetNewGRF()
|
||||
{
|
||||
GRFFile *f, *next;
|
||||
GRFFile *next;
|
||||
|
||||
for (f = _first_grffile; f != NULL; f = next) {
|
||||
for (GRFFile *f = _first_grffile; f != NULL; f = next) {
|
||||
next = f->next;
|
||||
|
||||
free(f->filename);
|
||||
@ -3667,8 +3571,6 @@ static void ResetNewGRF()
|
||||
*/
|
||||
static void ResetNewGRFData()
|
||||
{
|
||||
uint i;
|
||||
|
||||
CleanUpStrings();
|
||||
|
||||
// Copy/reset original engine info data
|
||||
@ -3680,11 +3582,9 @@ static void ResetNewGRFData()
|
||||
|
||||
// Copy/reset original bridge info data
|
||||
// First, free sprite table data
|
||||
for (i = 0; i < MAX_BRIDGES; i++) {
|
||||
for (uint i = 0; i < MAX_BRIDGES; i++) {
|
||||
if (_bridge[i].sprite_table != NULL) {
|
||||
uint j;
|
||||
|
||||
for (j = 0; j < 7; j++) free(_bridge[i].sprite_table[j]);
|
||||
for (uint j = 0; j < 7; j++) free(_bridge[i].sprite_table[j]);
|
||||
free(_bridge[i].sprite_table);
|
||||
}
|
||||
}
|
||||
@ -3746,8 +3646,7 @@ static void ResetNewGRFData()
|
||||
static void ClearTemporaryNewGRFData()
|
||||
{
|
||||
/* Clear the GOTO labels used for GRF processing */
|
||||
GRFLabel *l;
|
||||
for (l = _cur_grffile->label; l != NULL;) {
|
||||
for (GRFLabel *l = _cur_grffile->label; l != NULL;) {
|
||||
GRFLabel *l2 = l->next;
|
||||
free(l);
|
||||
l = l2;
|
||||
@ -3785,9 +3684,7 @@ static void BuildCargoTranslationMap()
|
||||
|
||||
static void InitNewGRFFile(const GRFConfig *config, int sprite_offset)
|
||||
{
|
||||
GRFFile *newfile;
|
||||
|
||||
newfile = GetFileByFilename(config->filename);
|
||||
GRFFile *newfile = GetFileByFilename(config->filename);
|
||||
if (newfile != NULL) {
|
||||
/* We already loaded it once. */
|
||||
newfile->sprite_offset = sprite_offset;
|
||||
@ -3854,17 +3751,14 @@ static const CargoLabel *_default_refitmasks[] = {
|
||||
*/
|
||||
static void CalculateRefitMasks()
|
||||
{
|
||||
EngineID engine;
|
||||
|
||||
for (engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
|
||||
for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
|
||||
uint32 mask = 0;
|
||||
uint32 not_mask = 0;
|
||||
uint32 xor_mask = _engine_info[engine].refit_mask;
|
||||
byte i;
|
||||
|
||||
if (cargo_allowed[engine] != 0) {
|
||||
// Build up the list of cargo types from the set cargo classes.
|
||||
for (i = 0; i < NUM_CARGO; i++) {
|
||||
for (CargoID i = 0; i < NUM_CARGO; i++) {
|
||||
const CargoSpec *cs = GetCargo(i);
|
||||
if (cargo_allowed[engine] & cs->classes) SETBIT(mask, i);
|
||||
if (cargo_disallowed[engine] & cs->classes) SETBIT(not_mask, i);
|
||||
@ -3958,7 +3852,6 @@ static void DecodeSpecialSprite(uint num, GrfLoadingStage stage)
|
||||
};
|
||||
|
||||
byte* buf;
|
||||
byte action;
|
||||
|
||||
if (_preload_sprite == NULL) {
|
||||
/* No preloaded sprite to work with; allocate and read the
|
||||
@ -3976,7 +3869,7 @@ static void DecodeSpecialSprite(uint num, GrfLoadingStage stage)
|
||||
FioSeekTo(num, SEEK_CUR);
|
||||
}
|
||||
|
||||
action = buf[0];
|
||||
byte action = buf[0];
|
||||
|
||||
if (action == 0xFF) {
|
||||
grfmsg(7, "Handling data block in stage %d", stage);
|
||||
@ -4082,8 +3975,6 @@ void InitDepotWindowBlockSizes();
|
||||
|
||||
void LoadNewGRF(uint load_index, uint file_index)
|
||||
{
|
||||
GrfLoadingStage stage;
|
||||
|
||||
InitializeGRFSpecial();
|
||||
|
||||
ResetNewGRFData();
|
||||
@ -4091,13 +3982,12 @@ void LoadNewGRF(uint load_index, uint file_index)
|
||||
/* Load newgrf sprites
|
||||
* in each loading stage, (try to) open each file specified in the config
|
||||
* and load information from it. */
|
||||
for (stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; stage++) {
|
||||
for (GrfLoadingStage stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; stage++) {
|
||||
uint slot = file_index;
|
||||
GRFConfig *c;
|
||||
|
||||
_cur_stage = stage;
|
||||
_cur_spriteid = load_index;
|
||||
for (c = _grfconfig; c != NULL; c = c->next) {
|
||||
for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
|
||||
if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND) continue;
|
||||
|
||||
// TODO usererror()
|
||||
@ -4119,8 +4009,3 @@ void LoadNewGRF(uint load_index, uint file_index)
|
||||
/* Set the block size in the depot windows based on vehicle sprite sizes */
|
||||
InitDepotWindowBlockSizes();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user