52 #include "table/strings.h"
116 for (uint i = 0; i < GSF_END; i++) {
120 memset(this->spritegroups, 0,
sizeof(this->spritegroups));
133 assert(feature < GSF_END);
134 for (uint i = 0; i < numsets; i++) {
136 set.sprite = first_sprite + i * numents;
137 set.num_sprites = numents;
149 assert(feature < GSF_END);
162 assert(feature < GSF_END);
175 return this->
spritesets[feature].find(
set)->second.sprite;
187 return this->
spritesets[feature].find(
set)->second.num_sprites;
200 template <VehicleType T>
203 return image_index == 0xFD || IsValidImageIndex<T>(image_index);
215 ByteReader(byte *data, byte *end) : data(data), end(end) { }
217 inline byte ReadByte()
219 if (data < end)
return *(data)++;
225 uint16 val = ReadByte();
226 return val | (ReadByte() << 8);
229 uint16 ReadExtendedByte()
231 uint16 val = ReadByte();
232 return val == 0xFF ? ReadWord() : val;
237 uint32 val = ReadWord();
238 return val | (ReadWord() << 16);
241 uint32 ReadVarSize(byte size)
244 case 1:
return ReadByte();
245 case 2:
return ReadWord();
246 case 4:
return ReadDWord();
253 const char *ReadString()
255 char *
string =
reinterpret_cast<char *
>(data);
256 size_t string_length =
ttd_strnlen(
string, Remaining());
258 if (string_length == Remaining()) {
260 string[string_length - 1] =
'\0';
261 grfmsg(7,
"String was not terminated with a zero byte.");
271 inline size_t Remaining()
const
276 inline bool HasData(
size_t count = 1)
const
278 return data + count <= end;
286 inline void Skip(
size_t len)
295 typedef void (*SpecialSpriteHandler)(
ByteReader *buf);
308 uint16 cargo_allowed;
309 uint16 cargo_disallowed;
310 RailTypeLabel railtypelabel;
347 GRFLocation(uint32 grfid, uint32 nfoline) : grfid(grfid), nfoline(nfoline) { }
351 return this->grfid < other.grfid || (this->grfid == other.grfid && this->nfoline < other.nfoline);
356 return this->grfid == other.grfid && this->nfoline == other.nfoline;
360 static std::map<GRFLocation, SpriteID> _grm_sprites;
361 typedef std::map<GRFLocation, byte*> GRFLineToSpriteOverride;
362 static GRFLineToSpriteOverride _grf_line_to_action6_sprite_override;
374 void CDECL
grfmsg(
int severity,
const char *str, ...)
393 const GRFFile *
const *end = _grf_files.
End();
394 for (
GRFFile *
const *file = _grf_files.
Begin(); file != end; file++) {
395 if ((*file)->grfid == grfid)
return *file;
407 const GRFFile *
const *end = _grf_files.
End();
408 for (
GRFFile *
const *file = _grf_files.
Begin(); file != end; file++) {
409 if (strcmp((*file)->filename, filename) == 0)
return *file;
435 if (config != NULL) {
446 if (message != STR_NULL) {
447 delete config->error;
448 config->error =
new GRFError(STR_NEWGRF_ERROR_MSG_FATAL, message);
452 return config->error;
473 *target = STR_UNDEFINED;
490 static const StringID units_volume[] = {
491 STR_ITEMS, STR_PASSENGERS, STR_TONS, STR_BAGS,
492 STR_LITERS, STR_ITEMS, STR_CRATES, STR_TONS,
493 STR_TONS, STR_TONS, STR_TONS, STR_BAGS,
494 STR_TONS, STR_TONS, STR_TONS, STR_BAGS,
495 STR_TONS, STR_TONS, STR_BAGS, STR_LITERS,
496 STR_TONS, STR_LITERS, STR_TONS, STR_ITEMS,
497 STR_BAGS, STR_LITERS, STR_TONS, STR_ITEMS,
498 STR_TONS, STR_ITEMS, STR_LITERS, STR_ITEMS
504 #define TEXTID_TO_STRINGID(begin, end, stringid, stringend) \
505 assert_compile(stringend - stringid == end - begin); \
506 if (str >= begin && str <= end) return str + (stringid - begin)
509 TEXTID_TO_STRINGID(0x000E, 0x002D, STR_CARGO_PLURAL_NOTHING, STR_CARGO_PLURAL_FIZZY_DRINKS);
510 TEXTID_TO_STRINGID(0x002E, 0x004D, STR_CARGO_SINGULAR_NOTHING, STR_CARGO_SINGULAR_FIZZY_DRINK);
511 if (str >= 0x004E && str <= 0x006D)
return units_volume[str - 0x004E];
512 TEXTID_TO_STRINGID(0x006E, 0x008D, STR_QUANTITY_NOTHING, STR_QUANTITY_FIZZY_DRINKS);
513 TEXTID_TO_STRINGID(0x008E, 0x00AD, STR_ABBREV_NOTHING, STR_ABBREV_FIZZY_DRINKS);
514 TEXTID_TO_STRINGID(0x00D1, 0x00E0, STR_COLOUR_DARK_BLUE, STR_COLOUR_WHITE);
519 TEXTID_TO_STRINGID(0x200F, 0x201F, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, STR_TOWN_BUILDING_NAME_OLD_HOUSES_1);
520 TEXTID_TO_STRINGID(0x2036, 0x2041, STR_TOWN_BUILDING_NAME_COTTAGES_1, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1);
521 TEXTID_TO_STRINGID(0x2059, 0x205C, STR_TOWN_BUILDING_NAME_IGLOO_1, STR_TOWN_BUILDING_NAME_PIGGY_BANK_1);
524 TEXTID_TO_STRINGID(0x4802, 0x4826, STR_INDUSTRY_NAME_COAL_MINE, STR_INDUSTRY_NAME_SUGAR_MINE);
525 TEXTID_TO_STRINGID(0x482D, 0x482E, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_PLANTED);
526 TEXTID_TO_STRINGID(0x4832, 0x4834, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES);
527 TEXTID_TO_STRINGID(0x4835, 0x4838, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM);
528 TEXTID_TO_STRINGID(0x4839, 0x483A, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM);
531 case 0x4830:
return STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY;
532 case 0x4831:
return STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED;
533 case 0x483B:
return STR_ERROR_CAN_ONLY_BE_POSITIONED;
535 #undef TEXTID_TO_STRINGID
537 if (str == STR_NULL)
return STR_EMPTY;
539 DEBUG(grf, 0,
"Unknown StringID 0x%04X remapped to STR_EMPTY. Please open a Feature Request if you need it", str);
557 switch (
GB(str, 8, 8)) {
558 case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
562 case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
573 static std::map<uint32, uint32> _grf_id_overrides;
582 _grf_id_overrides[source_grfid] = target_grfid;
583 grfmsg(5,
"SetNewGRFOverride: Added override of 0x%X to 0x%X",
BSWAP32(source_grfid),
BSWAP32(target_grfid));
598 uint32 scope_grfid = INVALID_GRFID;
601 scope_grfid = file->grfid;
602 uint32
override = _grf_id_overrides[file->grfid];
604 scope_grfid =
override;
606 if (grf_match == NULL) {
607 grfmsg(5,
"Tried mapping from GRFID %x to %x but target is not loaded",
BSWAP32(file->grfid),
BSWAP32(
override));
614 EngineID engine = _engine_mngr.
GetID(type, internal_id, scope_grfid);
623 EngineID engine = _engine_mngr.
GetID(type, internal_id, INVALID_GRFID);
629 grfmsg(5,
"Replaced engine at index %d for GRFID %x, type %d, index %d", e->
index,
BSWAP32(file->grfid), type, internal_id);
633 if (!static_access) {
635 eid->
grfid = scope_grfid;
641 if (static_access)
return NULL;
644 grfmsg(0,
"Can't allocate any more engines");
658 eid->grfid = scope_grfid;
659 eid->internal_id = internal_id;
668 memset(_gted + engine_pool_size, 0, len);
674 grfmsg(5,
"Created new engine at index %d for GRFID %x, type %d, index %d", e->
index,
BSWAP32(file->grfid), type, internal_id);
691 uint32 scope_grfid = INVALID_GRFID;
693 scope_grfid = file->grfid;
694 uint32
override = _grf_id_overrides[file->grfid];
695 if (
override != 0) scope_grfid =
override;
698 return _engine_mngr.
GetID(type, internal_id, scope_grfid);
738 grf_sprite->
sprite = buf->ReadWord();
739 grf_sprite->
pal = buf->ReadWord();
744 bool custom_sprite =
HasBit(grf_sprite->
pal, 15) != invert_action1_flag;
748 uint index =
GB(grf_sprite->
sprite, 0, 14);
750 grfmsg(1,
"ReadSpriteLayoutSprite: Spritelayout uses undefined custom spriteset %d", index);
751 grf_sprite->
sprite = SPR_IMG_QUERY;
752 grf_sprite->
pal = PAL_NONE;
755 if (max_sprite_offset != NULL) *max_sprite_offset = use_cur_spritesets ? _cur.
GetNumEnts(feature, index) : UINT16_MAX;
760 grfmsg(1,
"ReadSpriteLayoutSprite: Spritelayout specifies var10 value for non-action-1 sprite");
761 DisableGrf(STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT);
767 uint index =
GB(grf_sprite->
pal, 0, 14);
769 grfmsg(1,
"ReadSpriteLayoutSprite: Spritelayout uses undefined custom spriteset %d for 'palette'", index);
770 grf_sprite->
pal = PAL_NONE;
773 if (max_palette_offset != NULL) *max_palette_offset = use_cur_spritesets ? _cur.
GetNumEnts(feature, index) : UINT16_MAX;
778 grfmsg(1,
"ReadSpriteLayoutRegisters: Spritelayout specifies var10 value for non-action-1 palette");
779 DisableGrf(STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT);
808 regs.delta.
parent[0] = buf->ReadByte();
809 regs.delta.
parent[1] = buf->ReadByte();
821 DisableGrf(STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT);
830 DisableGrf(STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT);
849 bool has_flags =
HasBit(num_building_sprites, 6);
850 ClrBit(num_building_sprites, 6);
853 dts->
Allocate(num_building_sprites);
855 uint16 *max_sprite_offset =
AllocaM(uint16, num_building_sprites + 1);
856 uint16 *max_palette_offset =
AllocaM(uint16, num_building_sprites + 1);
857 MemSetT(max_sprite_offset, 0, num_building_sprites + 1);
858 MemSetT(max_palette_offset, 0, num_building_sprites + 1);
865 grfmsg(1,
"ReadSpriteLayout: Spritelayout uses invalid flag 0x%x for ground sprite", flags & ~(valid_flags & ~
TLF_NON_GROUND_FLAGS));
866 DisableGrf(STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT);
873 for (uint i = 0; i < num_building_sprites; i++) {
876 flags =
ReadSpriteLayoutSprite(buf, has_flags,
false, use_cur_spritesets, feature, &seq->image, max_sprite_offset + i + 1, max_palette_offset + i + 1);
879 if (flags & ~valid_flags) {
880 grfmsg(1,
"ReadSpriteLayout: Spritelayout uses unknown flag 0x%x", flags & ~valid_flags);
881 DisableGrf(STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT);
885 seq->
delta_x = buf->ReadByte();
886 seq->delta_y = buf->ReadByte();
888 if (!no_z_position) seq->
delta_z = buf->ReadByte();
891 seq->size_x = buf->ReadByte();
892 seq->size_y = buf->ReadByte();
893 seq->size_z = buf->ReadByte();
901 bool is_consistent =
true;
903 for (uint i = 0; i < num_building_sprites + 1; i++) {
904 if (max_sprite_offset[i] > 0) {
908 is_consistent =
false;
912 if (max_palette_offset[i] > 0) {
916 is_consistent =
false;
925 if (!is_consistent || dts->registers != NULL) {
929 for (uint i = 0; i < num_building_sprites + 1; i++) {
963 if (base_pointer == 0) {
964 *index = INVALID_PRICE;
968 static const uint32 start = 0x4B34;
969 static const uint32 size = 6;
971 if (base_pointer < start || (base_pointer - start) % size != 0 || (base_pointer - start) / size >= PR_END) {
972 grfmsg(1,
"%s: Unsupported running cost base 0x%04X, ignoring", error_location, base_pointer);
976 *index = (
Price)((base_pointer - start) / size);
1005 ei->decay_speed = buf->ReadByte();
1022 ei->load_amount = buf->ReadByte();
1044 for (
int i = 0; i < numinfo; i++) {
1053 uint8 tracktype = buf->ReadByte();
1055 if (tracktype < _cur.grffile->railtype_list.Length()) {
1060 switch (tracktype) {
1061 case 0: _gted[e->
index].railtypelabel = rvi->
engclass >= 2 ? RAILTYPE_ELECTRIC_LABEL : RAILTYPE_RAIL_LABEL;
break;
1062 case 1: _gted[e->
index].railtypelabel = RAILTYPE_MONO_LABEL;
break;
1063 case 2: _gted[e->
index].railtypelabel = RAILTYPE_MAGLEV_LABEL;
break;
1065 grfmsg(1,
"RailVehicleChangeInfo: Invalid track type %d specified, ignoring", tracktype);
1078 uint16 speed = buf->ReadWord();
1079 if (speed == 0xFFFF) speed = 0;
1086 rvi->
power = buf->ReadWord();
1089 if (rvi->
power != 0) {
1107 uint8 spriteid = buf->ReadByte();
1108 uint8 orig_spriteid = spriteid;
1112 if (spriteid < 0xFD) spriteid >>= 1;
1114 if (IsValidNewGRFImageIndex<VEH_TRAIN>(spriteid)) {
1115 rvi->image_index = spriteid;
1117 grfmsg(1,
"RailVehicleChangeInfo: Invalid Sprite %d specified, ignoring", orig_spriteid);
1118 rvi->image_index = 0;
1124 uint8 dual = buf->ReadByte();
1129 rvi->railveh_type = rvi->
power == 0 ?
1141 uint8 ctype = buf->ReadByte();
1143 if (ctype == 0xFF) {
1146 }
else if (_cur.
grffile->grf_version >= 8) {
1151 ei->cargo_type = ctype;
1154 grfmsg(2,
"RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
1160 SB(rvi->
weight, 0, 8, buf->ReadByte());
1168 grfmsg(2,
"RailVehicleChangeInfo: Property 0x18 'AI rank' not used by NoAI, ignored.");
1180 uint8 traction = buf->ReadByte();
1183 if (traction <= 0x07) {
1185 }
else if (traction <= 0x27) {
1187 }
else if (traction <= 0x31) {
1189 }
else if (traction <= 0x37) {
1191 }
else if (traction <= 0x41) {
1200 if (_gted[e->
index].railtypelabel == RAILTYPE_RAIL_LABEL && engclass >=
EC_ELECTRIC) _gted[e->
index].railtypelabel = RAILTYPE_ELECTRIC_LABEL;
1201 if (_gted[e->
index].railtypelabel == RAILTYPE_ELECTRIC_LABEL && engclass <
EC_ELECTRIC) _gted[e->
index].railtypelabel = RAILTYPE_RAIL_LABEL;
1217 ei->refit_cost = buf->ReadByte();
1221 uint32 mask = buf->ReadDWord();
1259 byte weight = buf->ReadByte();
1262 grfmsg(2,
"RailVehicleChangeInfo: Nonsensical weight of %d tons, ignoring", weight << 8);
1284 _gted[e->
index].cargo_allowed = buf->ReadWord();
1290 _gted[e->
index].cargo_disallowed = buf->ReadWord();
1304 uint8 count = buf->ReadByte();
1338 for (
int i = 0; i < numinfo; i++) {
1351 rvi->running_cost = buf->ReadByte();
1359 uint8 spriteid = buf->ReadByte();
1360 uint8 orig_spriteid = spriteid;
1363 if (spriteid == 0xFF) spriteid = 0xFD;
1365 if (spriteid < 0xFD) spriteid >>= 1;
1367 if (IsValidNewGRFImageIndex<VEH_ROAD>(spriteid)) {
1368 rvi->image_index = spriteid;
1370 grfmsg(1,
"RoadVehicleChangeInfo: Invalid Sprite %d specified, ignoring", orig_spriteid);
1371 rvi->image_index = 0;
1377 rvi->capacity = buf->ReadByte();
1382 uint8 ctype = buf->ReadByte();
1384 if (ctype == 0xFF) {
1387 }
else if (_cur.
grffile->grf_version >= 8) {
1392 ei->cargo_type = ctype;
1395 grfmsg(2,
"RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
1401 rvi->cost_factor = buf->ReadByte();
1405 rvi->sfx = buf->ReadByte();
1409 rvi->
power = buf->ReadByte();
1413 rvi->
weight = buf->ReadByte();
1421 uint32 mask = buf->ReadDWord();
1441 ei->refit_cost = buf->ReadByte();
1454 _gted[e->
index].cargo_allowed = buf->ReadWord();
1460 _gted[e->
index].cargo_disallowed = buf->ReadWord();
1492 uint8 count = buf->ReadByte();
1526 for (
int i = 0; i < numinfo; i++) {
1535 uint8 spriteid = buf->ReadByte();
1536 uint8 orig_spriteid = spriteid;
1539 if (spriteid == 0xFF) spriteid = 0xFD;
1541 if (spriteid < 0xFD) spriteid >>= 1;
1543 if (IsValidNewGRFImageIndex<VEH_SHIP>(spriteid)) {
1544 svi->image_index = spriteid;
1546 grfmsg(1,
"ShipVehicleChangeInfo: Invalid Sprite %d specified, ignoring", orig_spriteid);
1547 svi->image_index = 0;
1557 svi->cost_factor = buf->ReadByte();
1566 uint8 ctype = buf->ReadByte();
1568 if (ctype == 0xFF) {
1571 }
else if (_cur.
grffile->grf_version >= 8) {
1576 ei->cargo_type = ctype;
1579 grfmsg(2,
"RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
1585 svi->capacity = buf->ReadWord();
1589 svi->running_cost = buf->ReadByte();
1593 svi->sfx = buf->ReadByte();
1597 uint32 mask = buf->ReadDWord();
1609 ei->refit_cost = buf->ReadByte();
1630 _gted[e->
index].cargo_allowed = buf->ReadWord();
1636 _gted[e->
index].cargo_disallowed = buf->ReadWord();
1664 uint8 count = buf->ReadByte();
1698 for (
int i = 0; i < numinfo; i++) {
1707 uint8 spriteid = buf->ReadByte();
1708 uint8 orig_spriteid = spriteid;
1711 if (spriteid == 0xFF) spriteid = 0xFD;
1713 if (spriteid < 0xFD) spriteid >>= 1;
1715 if (IsValidNewGRFImageIndex<VEH_AIRCRAFT>(spriteid)) {
1716 avi->image_index = spriteid;
1718 grfmsg(1,
"AircraftVehicleChangeInfo: Invalid Sprite %d specified, ignoring", orig_spriteid);
1719 avi->image_index = 0;
1725 if (buf->ReadByte() == 0) {
1733 SB(avi->
subtype, 1, 1, (buf->ReadByte() != 0 ? 1 : 0));
1737 avi->cost_factor = buf->ReadByte();
1741 avi->
max_speed = (buf->ReadByte() * 128) / 10;
1745 avi->acceleration = buf->ReadByte();
1749 avi->running_cost = buf->ReadByte();
1761 avi->sfx = buf->ReadByte();
1765 uint32 mask = buf->ReadDWord();
1777 ei->refit_cost = buf->ReadByte();
1790 _gted[e->
index].cargo_allowed = buf->ReadWord();
1796 _gted[e->
index].cargo_disallowed = buf->ReadWord();
1814 uint8 count = buf->ReadByte();
1860 for (
int i = 0; i < numinfo; i++) {
1864 if (statspec == NULL && prop != 0x08) {
1865 grfmsg(2,
"StationChangeInfo: Attempt to modify undefined station %u, ignoring", stid + i);
1874 if (*spec == NULL) *spec = CallocT<StationSpec>(1);
1877 uint32 classid = buf->ReadDWord();
1878 (*spec)->cls_id = StationClass::Allocate(
BSWAP32(classid));
1883 statspec->
tiles = buf->ReadExtendedByte();
1887 for (uint t = 0; t < statspec->
tiles; t++) {
1891 if (buf->HasData(4) && *(uint32*)buf->Data() == 0) {
1894 dts->
Clone(&_station_display_datas_rail[t % 8]);
1909 dtss->
delta_x = buf->ReadByte();
1911 dtss->delta_y = buf->ReadByte();
1912 dtss->
delta_z = buf->ReadByte();
1913 dtss->size_x = buf->ReadByte();
1914 dtss->size_y = buf->ReadByte();
1915 dtss->size_z = buf->ReadByte();
1926 byte srcid = buf->ReadByte();
1929 if (srcstatspec == NULL) {
1930 grfmsg(1,
"StationChangeInfo: Station %u is not defined, cannot copy sprite layout to %u.", srcid, stid + i);
1938 for (uint t = 0; t < statspec->
tiles; t++) {
1957 statspec->copied_layouts =
false;
1959 while (buf->HasData()) {
1960 byte length = buf->ReadByte();
1961 byte number = buf->ReadByte();
1962 StationLayout layout;
1965 if (length == 0 || number == 0)
break;
1967 if (length > statspec->lengths) {
1968 statspec->platforms =
ReallocT(statspec->platforms, length);
1969 memset(statspec->platforms + statspec->lengths, 0, length - statspec->lengths);
1971 statspec->layouts =
ReallocT(statspec->layouts, length);
1972 memset(statspec->layouts + statspec->lengths, 0,
1973 (length - statspec->lengths) *
sizeof(*statspec->layouts));
1975 statspec->lengths = length;
1979 if (number > statspec->platforms[l]) {
1980 statspec->layouts[l] =
ReallocT(statspec->layouts[l], number);
1982 memset(statspec->layouts[l] + statspec->platforms[l], 0,
1983 (number - statspec->platforms[l]) *
sizeof(**statspec->layouts));
1985 statspec->platforms[l] = number;
1989 layout = MallocT<byte>(length * number);
1991 for (l = 0; l < length; l++) {
1992 for (p = 0; p < number; p++) {
1993 layout[l * number + p] = buf->ReadByte();
2003 free(statspec->layouts[l][p]);
2004 statspec->layouts[l][p] = layout;
2009 byte srcid = buf->ReadByte();
2012 if (srcstatspec == NULL) {
2013 grfmsg(1,
"StationChangeInfo: Station %u is not defined, cannot copy tile layout to %u.", srcid, stid + i);
2017 statspec->lengths = srcstatspec->lengths;
2018 statspec->platforms = srcstatspec->platforms;
2019 statspec->layouts = srcstatspec->layouts;
2020 statspec->copied_layouts =
true;
2029 statspec->
pylons = buf->ReadByte();
2034 if (_cur.
grffile->grf_version >= 7) {
2040 statspec->
flags = buf->ReadByte();
2044 statspec->
wires = buf->ReadByte();
2048 statspec->
blocked = buf->ReadByte();
2052 statspec->animation.
frames = buf->ReadByte();
2053 statspec->animation.
status = buf->ReadByte();
2057 statspec->animation.
speed = buf->ReadByte();
2061 statspec->animation.
triggers = buf->ReadWord();
2065 statspec->
tiles = buf->ReadExtendedByte();
2069 for (uint t = 0; t < statspec->
tiles; t++) {
2071 uint num_building_sprites = buf->ReadByte();
2098 if (
id + numinfo > CF_END) {
2099 grfmsg(1,
"CanalChangeInfo: Canal feature %u is invalid, max %u, ignoring",
id + numinfo, CF_END);
2103 for (
int i = 0; i < numinfo; i++) {
2112 cp->
flags = buf->ReadByte();
2137 grfmsg(1,
"BridgeChangeInfo: Bridge %u is invalid, max %u, ignoring", brid + numinfo,
MAX_BRIDGES);
2141 for (
int i = 0; i < numinfo; i++) {
2147 byte year = buf->ReadByte();
2162 bridge->
price = buf->ReadByte();
2166 bridge->
speed = buf->ReadWord();
2170 byte tableid = buf->ReadByte();
2171 byte numtables = buf->ReadByte();
2178 for (; numtables-- != 0; tableid++) {
2180 grfmsg(1,
"BridgeChangeInfo: Table %d >= 7, skipping", tableid);
2181 for (byte sprite = 0; sprite < 32; sprite++) buf->ReadDWord();
2186 bridge->
sprite_table[tableid] = MallocT<PalSpriteID>(32);
2189 for (byte sprite = 0; sprite < 32; sprite++) {
2203 bridge->
flags = buf->ReadByte();
2212 if (newone != STR_UNDEFINED) bridge->
material = newone;
2219 if (newone != STR_UNDEFINED) bridge->
transport_name[prop - 0x11] = newone;
2224 bridge->
price = buf->ReadWord();
2281 for (uint j = 0; j < 4; j++) buf->ReadByte();
2285 byte count = buf->ReadByte();
2286 for (byte j = 0; j < count; j++) buf->ReadByte();
2310 grfmsg(1,
"TownHouseChangeInfo: Too many houses loaded (%u), max (%u). Ignoring.", hid + numinfo,
NUM_HOUSES_PER_GRF);
2315 if (_cur.
grffile->housespec == NULL) {
2319 for (
int i = 0; i < numinfo; i++) {
2322 if (prop != 0x08 && housespec == NULL) {
2325 if (cir > ret) ret = cir;
2332 byte subs_id = buf->ReadByte();
2334 if (subs_id == 0xFF) {
2337 HouseSpec::Get(hid + i)->
enabled =
false;
2341 grfmsg(2,
"TownHouseChangeInfo: Attempt to use new house %u as substitute house for %u. Ignoring.", subs_id, hid + i);
2346 if (*house == NULL) *house = CallocT<HouseSpec>(1);
2350 MemCpyT(housespec, HouseSpec::Get(subs_id));
2352 housespec->enabled =
true;
2353 housespec->grf_prop.local_id = hid + i;
2354 housespec->grf_prop.subst_id = subs_id;
2355 housespec->grf_prop.grffile = _cur.
grffile;
2356 housespec->random_colour[0] = 0x04;
2357 housespec->random_colour[1] = 0x08;
2358 housespec->random_colour[2] = 0x0C;
2359 housespec->random_colour[3] = 0x06;
2366 housespec->cargo_acceptance[2] = 0;
2378 uint16 years = buf->ReadWord();
2398 int8 goods = buf->ReadByte();
2434 byte
override = buf->ReadByte();
2438 grfmsg(2,
"TownHouseChangeInfo: Attempt to override new house %u with house id %u. Ignoring.",
override, hid + i);
2442 _house_mngr.
Add(hid + i, _cur.
grffile->grfid,
override);
2451 for (uint j = 0; j < 4; j++) housespec->
random_colour[j] = buf->ReadByte();
2473 housespec->
class_id = AllocateHouseClassID(buf->ReadByte(), _cur.
grffile->grfid);
2481 uint32 cargotypes = buf->ReadDWord();
2484 if (cargotypes == 0xFFFFFFFF)
break;
2486 for (uint j = 0; j < 3; j++) {
2488 uint8 cargo_part =
GB(cargotypes, 8 * j, 8);
2506 byte count = buf->ReadByte();
2507 for (byte j = 0; j < count; j++) {
2515 housespec->
min_year = buf->ReadWord();
2519 housespec->
max_year = buf->ReadWord();
2553 template <
typename T>
2557 grfmsg(1,
"LoadTranslationTable: %s translation table must start at zero", name);
2561 translation_table.Clear();
2562 for (
int i = 0; i < numinfo; i++) {
2563 uint32 item = buf->ReadDWord();
2564 *translation_table.Append() =
BSWAP32(item);
2594 for (
int i = 0; i < numinfo; i++) {
2597 int factor = buf->ReadByte();
2598 uint price = gvid + i;
2600 if (price < PR_END) {
2603 grfmsg(1,
"GlobalVarChangeInfo: Price %d out of range, ignoring", price);
2612 if ((newone != STR_UNDEFINED) && (curidx <
CURRENCY_END)) {
2620 uint32 rate = buf->ReadDWord();
2628 grfmsg(1,
"GlobalVarChangeInfo: Currency multipliers %d out of range, ignoring", curidx);
2635 uint16 options = buf->ReadWord();
2644 grfmsg(1,
"GlobalVarChangeInfo: Currency option %d out of range, ignoring", curidx);
2651 uint32 tempfix = buf->ReadDWord();
2657 grfmsg(1,
"GlobalVarChangeInfo: Currency symbol %d out of range, ignoring", curidx);
2664 uint32 tempfix = buf->ReadDWord();
2670 grfmsg(1,
"GlobalVarChangeInfo: Currency symbol %d out of range, ignoring", curidx);
2677 Year year_euro = buf->ReadWord();
2682 grfmsg(1,
"GlobalVarChangeInfo: Euro intro date %d out of range, ignoring", curidx);
2689 grfmsg(1,
"GlobalVarChangeInfo: The snowline can only be set once (%d)", numinfo);
2691 grfmsg(1,
"GlobalVarChangeInfo: Not enough entries set in the snowline table (" PRINTF_SIZE
")", buf->Remaining());
2697 table[i][j] = buf->ReadByte();
2698 if (_cur.
grffile->grf_version >= 8) {
2701 if (table[i][j] >= 128) {
2723 uint curidx = gvid + i;
2726 grfmsg(1,
"GlobalVarChangeInfo: Language %d is not known, ignoring", curidx);
2731 while (buf->ReadByte() != 0) {
2741 uint plural_form = buf->ReadByte();
2742 if (plural_form >= LANGUAGE_MAX_PLURAL) {
2743 grfmsg(1,
"GlobalVarChanceInfo: Plural form %d is out of range, ignoring", plural_form);
2750 byte newgrf_id = buf->ReadByte();
2751 while (newgrf_id != 0) {
2752 const char *name = buf->ReadString();
2767 grfmsg(1,
"GlobalVarChangeInfo: Gender name %s is not known, ignoring", name);
2774 grfmsg(1,
"GlobalVarChangeInfo: Case name %s is not known, ignoring", name);
2779 newgrf_id = buf->ReadByte();
2809 for (
int i = 0; i < numinfo; i++) {
2833 uint32 s = buf->ReadDWord();
2834 uint32 t = buf->ReadDWord();
2841 while (buf->ReadByte() != 0) {
2869 grfmsg(2,
"CargoChangeInfo: Cargo type %d out of range (max %d)", cid + numinfo,
NUM_CARGO - 1);
2873 for (
int i = 0; i < numinfo; i++) {
2878 cs->
bitnum = buf->ReadByte();
2916 cs->
sprite = buf->ReadWord();
2920 cs->
weight = buf->ReadByte();
2924 cs->transit_days[0] = buf->ReadByte();
2928 cs->transit_days[1] = buf->ReadByte();
2932 cs->initial_payment = buf->ReadDWord();
2936 cs->rating_colour = buf->ReadByte();
2940 cs->legend_colour = buf->ReadByte();
2948 cs->
classes = buf->ReadWord();
2952 cs->
label = buf->ReadDWord();
2957 uint8 substitute_type = buf->ReadByte();
2959 switch (substitute_type) {
2966 grfmsg(1,
"CargoChangeInfo: Unknown town growth substitute value %d, setting to none.", substitute_type);
2982 cs->
multiplier = max<uint16>(1u, buf->ReadWord());
3007 if (_cur.
grffile->sound_offset == 0) {
3008 grfmsg(1,
"SoundEffectChangeInfo: No effects defined, skipping");
3013 grfmsg(1,
"SoundEffectChangeInfo: Attemting to change undefined sound effect (%u), max (%u). Ignoring.", sid + numinfo,
ORIGINAL_SAMPLE_COUNT + _cur.
grffile->num_sounds);
3017 for (
int i = 0; i < numinfo; i++) {
3022 sound->volume = buf->ReadByte();
3026 sound->priority = buf->ReadByte();
3030 SoundID orig_sound = buf->ReadByte();
3035 SoundEntry *old_sound = GetSound(orig_sound);
3038 *old_sound = *sound;
3104 if (_cur.
grffile->indtspec == NULL) {
3108 for (
int i = 0; i < numinfo; i++) {
3111 if (prop != 0x08 && tsp == NULL) {
3113 if (cir > ret) ret = cir;
3120 byte subs_id = buf->ReadByte();
3124 grfmsg(2,
"IndustryTilesChangeInfo: Attempt to use new industry tile %u as substitute industry tile for %u. Ignoring.", subs_id, indtid + i);
3129 if (*tilespec == NULL) {
3130 *tilespec = CallocT<IndustryTileSpec>(1);
3133 memcpy(tsp, &_industry_tile_specs[subs_id],
sizeof(_industry_tile_specs[subs_id]));
3134 tsp->enabled =
true;
3142 tsp->grf_prop.local_id = indtid + i;
3143 tsp->grf_prop.subst_id = subs_id;
3144 tsp->grf_prop.grffile = _cur.
grffile;
3151 byte ovrid = buf->ReadByte();
3155 grfmsg(2,
"IndustryTilesChangeInfo: Attempt to override new industry tile %u with industry tile id %u. Ignoring.", ovrid, indtid + i);
3159 _industile_mngr.
Add(indtid + i, _cur.
grffile->grfid, ovrid);
3166 uint16 acctp = buf->ReadWord();
3252 byte num_table = buf->ReadByte();
3253 for (byte j = 0; j < num_table; j++) {
3254 for (uint k = 0;; k++) {
3255 byte x = buf->ReadByte();
3256 if (x == 0xFE && k == 0) {
3262 byte y = buf->ReadByte();
3263 if (x == 0 && y == 0x80)
break;
3265 byte gfx = buf->ReadByte();
3266 if (gfx == 0xFE) buf->ReadWord();
3273 for (byte j = 0; j < 3; j++) buf->ReadByte();
3277 byte number_of_sounds = buf->ReadByte();
3278 for (uint8 j = 0; j < number_of_sounds; j++) {
3299 for (
int i = 0; i < size - 1; i++) {
3300 for (
int j = i + 1; j < size; j++) {
3301 if (layout[i].ti.x == layout[j].ti.
x &&
3302 layout[i].ti.
y == layout[j].ti.
y) {
3314 for (
int j = 0; j < ind->
num_table; j++) {
3342 if (_cur.
grffile->industryspec == NULL) {
3346 for (
int i = 0; i < numinfo; i++) {
3349 if (prop != 0x08 && indsp == NULL) {
3351 if (cir > ret) ret = cir;
3358 byte subs_id = buf->ReadByte();
3360 if (subs_id == 0xFF) {
3363 _industry_specs[indid + i].
enabled =
false;
3367 grfmsg(2,
"_industry_specs: Attempt to use new industry %u as substitute industry for %u. Ignoring.", subs_id, indid + i);
3374 if (*indspec == NULL) {
3375 *indspec = CallocT<IndustrySpec>(1);
3378 memcpy(indsp, &_origin_industry_specs[subs_id],
sizeof(_industry_specs[subs_id]));
3379 indsp->enabled =
true;
3380 indsp->grf_prop.local_id = indid + i;
3381 indsp->grf_prop.subst_id = subs_id;
3382 indsp->grf_prop.grffile = _cur.
grffile;
3391 byte ovrid = buf->ReadByte();
3395 grfmsg(2,
"IndustriesChangeInfo: Attempt to override new industry %u with industry id %u. Ignoring.", ovrid, indid + i);
3399 _industry_mngr.
Add(indid + i, _cur.
grffile->grfid, ovrid);
3404 byte new_num_layouts = buf->ReadByte();
3410 uint32 def_num_tiles = buf->ReadDWord() / 3 + 1;
3417 for (byte j = 0; j < new_num_layouts; j++) {
3418 for (uint k = 0;; k++) {
3419 if (k >= def_num_tiles) {
3420 grfmsg(3,
"IndustriesChangeInfo: Incorrect size for industry tile layout definition for industry %u.", indid);
3423 itt = ReallocT<IndustryTileTable>(itt, def_num_tiles);
3426 itt[k].ti.x = buf->ReadByte();
3428 if (itt[k].ti.x == 0xFE && k == 0) {
3430 IndustryType type = buf->ReadByte();
3431 byte laynbr = buf->ReadByte();
3433 copy_from = _origin_industry_specs[type].table[laynbr];
3434 for (size = 1;; size++) {
3435 if (copy_from[size - 1].ti.x == -0x80 && copy_from[size - 1].ti.
y == 0)
break;
3440 itt[k].ti.
y = buf->ReadByte();
3442 if (itt[k].ti.x == 0 && itt[k].ti.y == 0x80) {
3445 itt[k].ti.x = -0x80;
3454 itt[k].gfx = buf->ReadByte();
3456 if (itt[k].gfx == 0xFE) {
3458 int local_tile_id = buf->ReadWord();
3461 int tempid = _industile_mngr.
GetID(local_tile_id, _cur.
grffile->grfid);
3464 grfmsg(2,
"IndustriesChangeInfo: Attempt to use industry tile %u with industry id %u, not yet defined. Ignoring.", local_tile_id, indid);
3467 itt[k].gfx = tempid;
3471 }
else if (itt[k].gfx == 0xFF) {
3472 itt[k].ti.
x = (int8)
GB(itt[k].ti.x, 0, 8);
3473 itt[k].ti.y = (int8)
GB(itt[k].ti.y, 0, 8);
3479 grfmsg(1,
"IndustriesChangeInfo: Invalid industry layout for industry id %u. Ignoring", indid);
3483 tile_table[j] = CallocT<IndustryTileTable>(size);
3484 memcpy(tile_table[j], copy_from,
sizeof(*copy_from) * size);
3488 for (
int i = 0; i < new_num_layouts; i++) {
3489 free(tile_table[i]);
3500 indsp->
table = tile_table;
3527 for (byte j = 0; j < 2; j++) {
3533 for (byte j = 0; j < 3; j++) {
3541 indsp->production_rate[prop - 0x12] = buf->ReadByte();
3554 sounds[j] = buf->ReadByte();
3570 for (byte j = 0; j < 3; j++) indsp->
conflicting[j] = buf->ReadByte();
3596 uint32 multiples = buf->ReadDWord();
3612 byte aflag = buf->ReadByte();
3622 uint16 str = buf->ReadWord();
3648 for (
int i = 0; i < as->
num_table; i++) {
3653 }
while ((++it)->ti.x != -0x80);
3654 table_list[i] = MallocT<AirportTileTable>(num_tiles);
3657 as->
table = table_list;
3676 grfmsg(1,
"AirportChangeInfo: Too many airports, trying id (%u), max (%u). Ignoring.", airport + numinfo,
NUM_AIRPORTS_PER_GRF);
3681 if (_cur.
grffile->airportspec == NULL) {
3685 for (
int i = 0; i < numinfo; i++) {
3688 if (as == NULL && prop != 0x08 && prop != 0x09) {
3689 grfmsg(2,
"AirportChangeInfo: Attempt to modify undefined airport %u, ignoring", airport + i);
3695 byte subs_id = buf->ReadByte();
3697 if (subs_id == 0xFF) {
3704 grfmsg(2,
"AirportChangeInfo: Attempt to use new airport %u as substitute airport for %u. Ignoring.", subs_id, airport + i);
3712 if (*spec == NULL) {
3713 *spec = MallocT<AirportSpec>(1);
3718 as->grf_prop.local_id = airport + i;
3719 as->grf_prop.subst_id = subs_id;
3720 as->grf_prop.grffile = _cur.
grffile;
3722 _airport_mngr.
Add(airport + i, _cur.
grffile->grfid, subs_id);
3732 uint32 defsize = buf->ReadDWord();
3738 for (byte j = 0; j < as->
num_table; j++) {
3740 for (
int k = 0;; k++) {
3741 att[k].ti.x = buf->ReadByte();
3742 att[k].ti.y = buf->ReadByte();
3744 if (att[k].ti.x == 0 && att[k].ti.y == 0x80) {
3747 att[k].ti.x = -0x80;
3756 att[k].
gfx = buf->ReadByte();
3758 if (att[k].gfx == 0xFE) {
3760 int local_tile_id = buf->ReadWord();
3763 uint16 tempid = _airporttile_mngr.
GetID(local_tile_id, _cur.
grffile->grfid);
3766 grfmsg(2,
"AirportChangeInfo: Attempt to use airport tile %u with airport id %u, not yet defined. Ignoring.", local_tile_id, airport + i);
3769 att[k].gfx = tempid;
3773 }
else if (att[k].gfx == 0xFF) {
3774 att[k].
ti.
x = (int8)
GB(att[k].ti.x, 0, 8);
3775 att[k].ti.y = (int8)
GB(att[k].ti.y, 0, 8);
3786 tile_table[j] = CallocT<AirportTileTable>(size);
3787 memcpy(tile_table[j], copy_from,
sizeof(*copy_from) * size);
3790 as->
table = tile_table;
3793 for (
int i = 0; i < as->
num_table; i++) {
3794 free(tile_table[i]);
3900 if (_cur.
grffile->objectspec == NULL) {
3904 for (
int i = 0; i < numinfo; i++) {
3907 if (prop != 0x08 && spec == NULL) {
3910 if (cir > ret) ret = cir;
3919 if (*ospec == NULL) {
3920 *ospec = CallocT<ObjectSpec>(1);
3921 (*ospec)->
views = 1;
3925 uint32 classid = buf->ReadDWord();
3926 (*ospec)->cls_id = ObjectClass::Allocate(
BSWAP32(classid));
3927 (*ospec)->enabled =
true;
3942 spec->
climate = buf->ReadByte();
3946 spec->
size = buf->ReadByte();
3989 spec->
height = buf->ReadByte();
3993 spec->
views = buf->ReadByte();
3995 grfmsg(2,
"ObjectChangeInfo: Invalid number of views (%u) for object id %u. Ignoring.", spec->
views,
id + i);
4028 grfmsg(1,
"RailTypeChangeInfo: Rail type %u is invalid, max %u, ignoring",
id + numinfo,
RAILTYPE_END);
4032 for (
int i = 0; i < numinfo; i++) {
4045 uint16 str = buf->ReadWord();
4047 if (_cur.
grffile->grf_version < 8) {
4077 int n = buf->ReadByte();
4078 for (
int j = 0; j != n; j++) {
4079 RailTypeLabel label = buf->ReadDWord();
4139 for (
int j = buf->ReadByte(); j != 0; j--) buf->ReadDWord();
4158 grfmsg(1,
"RailTypeReserveInfo: Rail type %u is invalid, max %u, ignoring",
id + numinfo,
RAILTYPE_END);
4162 for (
int i = 0; i < numinfo; i++) {
4166 RailTypeLabel rtl = buf->ReadDWord();
4175 _cur.
grffile->railtype_map[
id + i] = rt;
4193 int n = buf->ReadByte();
4194 for (
int j = 0; j != n; j++) {
4199 grfmsg(1,
"RailTypeReserveInfo: Ignoring property 1D for rail type %u because no label was set",
id + i);
4206 for (
int j = buf->ReadByte(); j != 0; j--) buf->ReadDWord();
4241 if (_cur.
grffile->airtspec == NULL) {
4245 for (
int i = 0; i < numinfo; i++) {
4248 if (prop != 0x08 && tsp == NULL) {
4249 grfmsg(2,
"AirportTileChangeInfo: Attempt to modify undefined airport tile %u. Ignoring.", airtid + i);
4256 byte subs_id = buf->ReadByte();
4260 grfmsg(2,
"AirportTileChangeInfo: Attempt to use new airport tile %u as substitute airport tile for %u. Ignoring.", subs_id, airtid + i);
4265 if (*tilespec == NULL) {
4266 *tilespec = CallocT<AirportTileSpec>(1);
4270 tsp->enabled =
true;
4274 tsp->grf_prop.local_id = airtid + i;
4275 tsp->grf_prop.subst_id = subs_id;
4276 tsp->grf_prop.grffile = _cur.
grffile;
4283 byte
override = buf->ReadByte();
4287 grfmsg(2,
"AirportTileChangeInfo: Attempt to override new airport tile %u with airport tile id %u. Ignoring.",
override, airtid + i);
4291 _airporttile_mngr.
Add(airtid + i, _cur.
grffile->grfid,
override);
4296 tsp->callback_mask = buf->ReadByte();
4300 tsp->animation.frames = buf->ReadByte();
4301 tsp->animation.status = buf->ReadByte();
4305 tsp->animation.speed = buf->ReadByte();
4309 tsp->animation.triggers = buf->ReadByte();
4321 static bool HandleChangeInfoResult(
const char *caller,
ChangeInfoResult cir, uint8 feature, uint8 property)
4324 default: NOT_REACHED();
4334 grfmsg(1,
"%s: Ignoring property 0x%02X of feature 0x%02X (not implemented)", caller, property, feature);
4338 grfmsg(0,
"%s: Unknown property 0x%02X of feature 0x%02X, disabling", caller, property, feature);
4351 static void FeatureChangeInfo(
ByteReader *buf)
4364 static const VCI_Handler handler[] = {
4382 AirportTilesChangeInfo,
4385 uint8 feature = buf->ReadByte();
4386 uint8 numprops = buf->ReadByte();
4387 uint numinfo = buf->ReadByte();
4388 uint engine = buf->ReadExtendedByte();
4390 grfmsg(6,
"FeatureChangeInfo: feature %d, %d properties, to apply to %d+%d",
4391 feature, numprops, engine, numinfo);
4393 if (feature >=
lengthof(handler) || handler[feature] == NULL) {
4394 if (feature != GSF_CARGOES)
grfmsg(1,
"FeatureChangeInfo: Unsupported feature %d, skipping", feature);
4401 while (numprops-- && buf->HasData()) {
4402 uint8 prop = buf->ReadByte();
4405 if (HandleChangeInfoResult(
"FeatureChangeInfo", cir, feature, prop))
return;
4412 uint8 feature = buf->ReadByte();
4413 uint8 numprops = buf->ReadByte();
4414 uint numinfo = buf->ReadByte();
4415 buf->ReadExtendedByte();
4417 if (feature == GSF_BRIDGES && numprops == 1) {
4418 uint8 prop = buf->ReadByte();
4421 if (prop == 0x0D)
return;
4422 }
else if (feature == GSF_GLOBALVAR && numprops == 1) {
4423 uint8 prop = buf->ReadByte();
4426 bool is_safe =
true;
4427 for (uint i = 0; i < numinfo; i++) {
4428 uint32 s = buf->ReadDWord();
4436 if (is_safe)
return;
4447 static void ReserveChangeInfo(
ByteReader *buf)
4449 uint8 feature = buf->ReadByte();
4451 if (feature != GSF_CARGOES && feature != GSF_GLOBALVAR && feature != GSF_RAILTYPES)
return;
4453 uint8 numprops = buf->ReadByte();
4454 uint8 numinfo = buf->ReadByte();
4455 uint8 index = buf->ReadExtendedByte();
4457 while (numprops-- && buf->HasData()) {
4458 uint8 prop = buf->ReadByte();
4462 default: NOT_REACHED();
4468 cir = GlobalVarReserveInfo(index, numinfo, prop, buf);
4472 cir = RailTypeReserveInfo(index, numinfo, prop, buf);
4476 if (HandleChangeInfoResult(
"ReserveChangeInfo", cir, feature, prop))
return;
4497 uint8 feature = buf->ReadByte();
4498 uint16 num_sets = buf->ReadByte();
4499 uint16 first_set = 0;
4501 if (num_sets == 0 && buf->HasData(3)) {
4504 first_set = buf->ReadExtendedByte();
4505 num_sets = buf->ReadExtendedByte();
4507 uint16 num_ents = buf->ReadExtendedByte();
4511 grfmsg(7,
"New sprite set at %d of type %d, consisting of %d sets with %d views each (total %d)",
4512 _cur.
spriteid, feature, num_sets, num_ents, num_sets * num_ents
4515 for (
int i = 0; i < num_sets * num_ents; i++) {
4525 uint16 num_sets = buf->ReadByte();
4527 if (num_sets == 0 && buf->HasData(3)) {
4530 buf->ReadExtendedByte();
4531 num_sets = buf->ReadExtendedByte();
4533 uint16 num_ents = buf->ReadExtendedByte();
4542 static const SpriteGroup *GetGroupFromGroupID(byte setid, byte type, uint16 groupid)
4544 if (
HasBit(groupid, 15)) {
4549 if (groupid >
MAX_SPRITEGROUP || _cur.spritegroups[groupid] == NULL) {
4550 grfmsg(1,
"GetGroupFromGroupID(0x%02X:0x%02X): Groupid 0x%04X does not exist, leaving empty", setid, type, groupid);
4554 return _cur.spritegroups[groupid];
4567 if (
HasBit(spriteid, 15)) {
4573 grfmsg(1,
"CreateGroupFromGroupID(0x%02X:0x%02X): Sprite set %u invalid", setid, type, spriteid);
4578 uint num_sprites = _cur.
GetNumEnts(feature, spriteid);
4581 assert(spriteset_start + num_sprites <= _cur.
spriteid);
4602 uint8 feature = buf->ReadByte();
4603 uint8 setid = buf->ReadByte();
4604 uint8 type = buf->ReadByte();
4627 switch (
GB(type, 2, 2)) {
4628 default: NOT_REACHED();
4629 case 0: group->size = DSG_SIZE_BYTE; varsize = 1;
break;
4630 case 1: group->size = DSG_SIZE_WORD; varsize = 2;
break;
4631 case 2: group->size = DSG_SIZE_DWORD; varsize = 4;
break;
4644 adjust->variable = buf->ReadByte();
4645 if (adjust->variable == 0x7E) {
4647 adjust->subroutine = GetGroupFromGroupID(setid, type, buf->ReadByte());
4652 varadjust = buf->ReadByte();
4653 adjust->shift_num =
GB(varadjust, 0, 5);
4654 adjust->type = (DeterministicSpriteGroupAdjustType)
GB(varadjust, 6, 2);
4655 adjust->and_mask = buf->ReadVarSize(varsize);
4657 if (adjust->type != DSGA_TYPE_NONE) {
4658 adjust->add_val = buf->ReadVarSize(varsize);
4659 adjust->divmod_val = buf->ReadVarSize(varsize);
4661 adjust->add_val = 0;
4662 adjust->divmod_val = 0;
4666 }
while (
HasBit(varadjust, 5));
4668 group->num_adjusts = adjusts.
Length();
4669 group->adjusts = MallocT<DeterministicSpriteGroupAdjust>(group->num_adjusts);
4670 MemCpyT(group->adjusts, adjusts.
Begin(), group->num_adjusts);
4672 group->num_ranges = buf->ReadByte();
4673 if (group->num_ranges > 0) group->ranges = CallocT<DeterministicSpriteGroupRange>(group->num_ranges);
4675 for (uint i = 0; i < group->num_ranges; i++) {
4676 group->ranges[i].group = GetGroupFromGroupID(setid, type, buf->ReadWord());
4677 group->ranges[i].low = buf->ReadVarSize(varsize);
4678 group->ranges[i].high = buf->ReadVarSize(varsize);
4681 group->default_group = GetGroupFromGroupID(setid, type, buf->ReadWord());
4697 group->count = buf->ReadByte();
4700 uint8 triggers = buf->ReadByte();
4701 group->triggers =
GB(triggers, 0, 7);
4702 group->
cmp_mode =
HasBit(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
4707 for (uint i = 0; i < group->
num_groups; i++) {
4708 group->
groups[i] = GetGroupFromGroupID(setid, type, buf->ReadWord());
4719 case GSF_ROADVEHICLES:
4728 byte num_loaded = type;
4729 byte num_loading = buf->ReadByte();
4732 grfmsg(0,
"NewSpriteGroup: No sprite set to work on! Skipping");
4742 if (num_loaded > 0) group->
loaded = CallocT<const SpriteGroup*>(num_loaded);
4743 if (num_loading > 0) group->
loading = CallocT<const SpriteGroup*>(num_loading);
4745 grfmsg(6,
"NewSpriteGroup: New SpriteGroup 0x%02X, %u loaded, %u loading",
4746 setid, num_loaded, num_loading);
4748 for (uint i = 0; i < num_loaded; i++) {
4749 uint16 spriteid = buf->ReadWord();
4751 grfmsg(8,
"NewSpriteGroup: + rg->loaded[%i] = subset %u", i, spriteid);
4754 for (uint i = 0; i < num_loading; i++) {
4755 uint16 spriteid = buf->ReadWord();
4757 grfmsg(8,
"NewSpriteGroup: + rg->loading[%i] = subset %u", i, spriteid);
4764 case GSF_AIRPORTTILES:
4766 case GSF_INDUSTRYTILES: {
4767 byte num_building_sprites =
max((uint8)1, type);
4774 if (
ReadSpriteLayout(buf, num_building_sprites,
true, feature,
false, type == 0, &group->dts))
return;
4778 case GSF_INDUSTRIES: {
4780 grfmsg(1,
"NewSpriteGroup: Unsupported industry production version %d, skipping", type);
4787 group->version = type;
4789 for (uint i = 0; i < 3; i++) {
4790 group->subtract_input[i] = (int16)buf->ReadWord();
4792 for (uint i = 0; i < 2; i++) {
4793 group->add_output[i] = buf->ReadWord();
4795 group->again = buf->ReadByte();
4797 for (uint i = 0; i < 3; i++) {
4798 group->subtract_input[i] = buf->ReadByte();
4800 for (uint i = 0; i < 2; i++) {
4801 group->add_output[i] = buf->ReadByte();
4803 group->again = buf->ReadByte();
4809 default:
grfmsg(1,
"NewSpriteGroup: Unsupported feature %d, skipping", feature);
4814 _cur.spritegroups[setid] = act_group;
4817 static CargoID TranslateCargo(uint8 feature, uint8 ctype)
4819 if (feature == GSF_OBJECTS) {
4824 grfmsg(1,
"TranslateCargo: Invalid cargo bitnum %d for objects, skipping.", ctype);
4829 if (feature == GSF_STATIONS && ctype == 0xFE)
return CT_DEFAULT_NA;
4830 if (ctype == 0xFF)
return CT_PURCHASE;
4835 grfmsg(1,
"TranslateCargo: Cargo bitnum %d out of range (max 31), skipping.", ctype);
4840 FOR_ALL_CARGOSPECS(cs) {
4841 if (cs->
bitnum == ctype) {
4842 grfmsg(6,
"TranslateCargo: Cargo bitnum %d mapped to cargo type %d.", ctype, cs->
Index());
4847 grfmsg(5,
"TranslateCargo: Cargo bitnum %d not available in this climate, skipping.", ctype);
4860 grfmsg(5,
"TranslateCargo: Cargo type %d not available in this climate, skipping.", ctype);
4866 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));
4870 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);
4875 static bool IsValidGroupID(uint16 groupid,
const char *
function)
4877 if (groupid >
MAX_SPRITEGROUP || _cur.spritegroups[groupid] == NULL) {
4878 grfmsg(1,
"%s: Spritegroup 0x%04X out of range or empty, skipping.",
function, groupid);
4885 static void VehicleMapSpriteGroup(
ByteReader *buf, byte feature, uint8 idcount)
4888 static uint last_engines_count;
4889 bool wagover =
false;
4892 if (
HasBit(idcount, 7)) {
4895 idcount =
GB(idcount, 0, 7);
4897 if (last_engines_count == 0) {
4898 grfmsg(0,
"VehicleMapSpriteGroup: WagonOverride: No engine to do override with");
4902 grfmsg(6,
"VehicleMapSpriteGroup: WagonOverride: %u engines, %u wagons",
4903 last_engines_count, idcount);
4905 if (last_engines_count != idcount) {
4906 last_engines =
ReallocT(last_engines, idcount);
4907 last_engines_count = idcount;
4912 for (uint i = 0; i < idcount; i++) {
4918 HandleChangeInfoResult(
"VehicleMapSpriteGroup",
CIR_INVALID_ID, 0, 0);
4922 engines[i] = e->
index;
4923 if (!wagover) last_engines[i] = engines[i];
4926 uint8 cidcount = buf->ReadByte();
4927 for (uint c = 0; c < cidcount; c++) {
4928 uint8 ctype = buf->ReadByte();
4929 uint16 groupid = buf->ReadWord();
4930 if (!IsValidGroupID(groupid,
"VehicleMapSpriteGroup"))
continue;
4932 grfmsg(8,
"VehicleMapSpriteGroup: * [%d] Cargo type 0x%X, group id 0x%02X", c, ctype, groupid);
4934 ctype = TranslateCargo(feature, ctype);
4937 for (uint i = 0; i < idcount; i++) {
4940 grfmsg(7,
"VehicleMapSpriteGroup: [%d] Engine %d...", i, engine);
4943 SetWagonOverrideSprites(engine, ctype, _cur.spritegroups[groupid], last_engines, last_engines_count);
4945 SetCustomEngineSprites(engine, ctype, _cur.spritegroups[groupid]);
4950 uint16 groupid = buf->ReadWord();
4951 if (!IsValidGroupID(groupid,
"VehicleMapSpriteGroup"))
return;
4953 grfmsg(8,
"-- Default group id 0x%04X", groupid);
4955 for (uint i = 0; i < idcount; i++) {
4959 SetWagonOverrideSprites(engine, CT_DEFAULT, _cur.spritegroups[groupid], last_engines, last_engines_count);
4961 SetCustomEngineSprites(engine, CT_DEFAULT, _cur.spritegroups[groupid]);
4968 static void CanalMapSpriteGroup(
ByteReader *buf, uint8 idcount)
4971 for (uint i = 0; i < idcount; i++) {
4975 uint8 cidcount = buf->ReadByte();
4976 buf->Skip(cidcount * 3);
4978 uint16 groupid = buf->ReadWord();
4979 if (!IsValidGroupID(groupid,
"CanalMapSpriteGroup"))
return;
4981 for (uint i = 0; i < idcount; i++) {
4985 grfmsg(1,
"CanalMapSpriteGroup: Canal subset %d out of range, skipping", cf);
4995 static void StationMapSpriteGroup(
ByteReader *buf, uint8 idcount)
4997 uint8 *stations =
AllocaM(uint8, idcount);
4998 for (uint i = 0; i < idcount; i++) {
4999 stations[i] = buf->ReadByte();
5002 uint8 cidcount = buf->ReadByte();
5003 for (uint c = 0; c < cidcount; c++) {
5004 uint8 ctype = buf->ReadByte();
5005 uint16 groupid = buf->ReadWord();
5006 if (!IsValidGroupID(groupid,
"StationMapSpriteGroup"))
continue;
5008 ctype = TranslateCargo(GSF_STATIONS, ctype);
5011 for (uint i = 0; i < idcount; i++) {
5014 if (statspec == NULL) {
5015 grfmsg(1,
"StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stations[i]);
5023 uint16 groupid = buf->ReadWord();
5024 if (!IsValidGroupID(groupid,
"StationMapSpriteGroup"))
return;
5026 for (uint i = 0; i < idcount; i++) {
5029 if (statspec == NULL) {
5030 grfmsg(1,
"StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", stations[i]);
5035 grfmsg(1,
"StationMapSpriteGroup: Station with ID 0x%02X mapped multiple times, skipping", stations[i]);
5042 StationClass::Assign(statspec);
5047 static void TownHouseMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5049 uint8 *houses =
AllocaM(uint8, idcount);
5050 for (uint i = 0; i < idcount; i++) {
5051 houses[i] = buf->ReadByte();
5055 uint8 cidcount = buf->ReadByte();
5056 buf->Skip(cidcount * 3);
5058 uint16 groupid = buf->ReadWord();
5059 if (!IsValidGroupID(groupid,
"TownHouseMapSpriteGroup"))
return;
5061 if (_cur.
grffile->housespec == NULL) {
5062 grfmsg(1,
"TownHouseMapSpriteGroup: No houses defined, skipping");
5066 for (uint i = 0; i < idcount; i++) {
5070 grfmsg(1,
"TownHouseMapSpriteGroup: House %d undefined, skipping.", houses[i]);
5078 static void IndustryMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5080 uint8 *industries =
AllocaM(uint8, idcount);
5081 for (uint i = 0; i < idcount; i++) {
5082 industries[i] = buf->ReadByte();
5086 uint8 cidcount = buf->ReadByte();
5087 buf->Skip(cidcount * 3);
5089 uint16 groupid = buf->ReadWord();
5090 if (!IsValidGroupID(groupid,
"IndustryMapSpriteGroup"))
return;
5092 if (_cur.
grffile->industryspec == NULL) {
5093 grfmsg(1,
"IndustryMapSpriteGroup: No industries defined, skipping");
5097 for (uint i = 0; i < idcount; i++) {
5100 if (indsp == NULL) {
5101 grfmsg(1,
"IndustryMapSpriteGroup: Industry %d undefined, skipping", industries[i]);
5109 static void IndustrytileMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5111 uint8 *indtiles =
AllocaM(uint8, idcount);
5112 for (uint i = 0; i < idcount; i++) {
5113 indtiles[i] = buf->ReadByte();
5117 uint8 cidcount = buf->ReadByte();
5118 buf->Skip(cidcount * 3);
5120 uint16 groupid = buf->ReadWord();
5121 if (!IsValidGroupID(groupid,
"IndustrytileMapSpriteGroup"))
return;
5123 if (_cur.
grffile->indtspec == NULL) {
5124 grfmsg(1,
"IndustrytileMapSpriteGroup: No industry tiles defined, skipping");
5128 for (uint i = 0; i < idcount; i++) {
5131 if (indtsp == NULL) {
5132 grfmsg(1,
"IndustrytileMapSpriteGroup: Industry tile %d undefined, skipping", indtiles[i]);
5140 static void CargoMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5143 for (uint i = 0; i < idcount; i++) {
5144 cargoes[i] = buf->ReadByte();
5148 uint8 cidcount = buf->ReadByte();
5149 buf->Skip(cidcount * 3);
5151 uint16 groupid = buf->ReadWord();
5152 if (!IsValidGroupID(groupid,
"CargoMapSpriteGroup"))
return;
5154 for (uint i = 0; i < idcount; i++) {
5158 grfmsg(1,
"CargoMapSpriteGroup: Cargo ID %d out of range, skipping", cid);
5164 cs->group = _cur.spritegroups[groupid];
5168 static void ObjectMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5170 if (_cur.
grffile->objectspec == NULL) {
5171 grfmsg(1,
"ObjectMapSpriteGroup: No object tiles defined, skipping");
5175 uint8 *objects =
AllocaM(uint8, idcount);
5176 for (uint i = 0; i < idcount; i++) {
5177 objects[i] = buf->ReadByte();
5180 uint8 cidcount = buf->ReadByte();
5181 for (uint c = 0; c < cidcount; c++) {
5182 uint8 ctype = buf->ReadByte();
5183 uint16 groupid = buf->ReadWord();
5184 if (!IsValidGroupID(groupid,
"ObjectMapSpriteGroup"))
continue;
5186 ctype = TranslateCargo(GSF_OBJECTS, ctype);
5189 for (uint i = 0; i < idcount; i++) {
5193 grfmsg(1,
"ObjectMapSpriteGroup: Object with ID 0x%02X undefined, skipping", objects[i]);
5201 uint16 groupid = buf->ReadWord();
5202 if (!IsValidGroupID(groupid,
"ObjectMapSpriteGroup"))
return;
5204 for (uint i = 0; i < idcount; i++) {
5208 grfmsg(1,
"ObjectMapSpriteGroup: Object with ID 0x%02X undefined, skipping", objects[i]);
5213 grfmsg(1,
"ObjectMapSpriteGroup: Object with ID 0x%02X mapped multiple times, skipping", objects[i]);
5223 static void RailTypeMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5225 uint8 *railtypes =
AllocaM(uint8, idcount);
5226 for (uint i = 0; i < idcount; i++) {
5227 railtypes[i] = _cur.
grffile->railtype_map[buf->ReadByte()];
5230 uint8 cidcount = buf->ReadByte();
5231 for (uint c = 0; c < cidcount; c++) {
5232 uint8 ctype = buf->ReadByte();
5233 uint16 groupid = buf->ReadWord();
5234 if (!IsValidGroupID(groupid,
"RailTypeMapSpriteGroup"))
continue;
5236 if (ctype >= RTSG_END)
continue;
5239 for (uint i = 0; i < idcount; i++) {
5244 rti->
group[ctype] = _cur.spritegroups[groupid];
5253 static void AirportMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5255 uint8 *airports =
AllocaM(uint8, idcount);
5256 for (uint i = 0; i < idcount; i++) {
5257 airports[i] = buf->ReadByte();
5261 uint8 cidcount = buf->ReadByte();
5262 buf->Skip(cidcount * 3);
5264 uint16 groupid = buf->ReadWord();
5265 if (!IsValidGroupID(groupid,
"AirportMapSpriteGroup"))
return;
5267 if (_cur.
grffile->airportspec == NULL) {
5268 grfmsg(1,
"AirportMapSpriteGroup: No airports defined, skipping");
5272 for (uint i = 0; i < idcount; i++) {
5276 grfmsg(1,
"AirportMapSpriteGroup: Airport %d undefined, skipping", airports[i]);
5284 static void AirportTileMapSpriteGroup(
ByteReader *buf, uint8 idcount)
5286 uint8 *airptiles =
AllocaM(uint8, idcount);
5287 for (uint i = 0; i < idcount; i++) {
5288 airptiles[i] = buf->ReadByte();
5292 uint8 cidcount = buf->ReadByte();
5293 buf->Skip(cidcount * 3);
5295 uint16 groupid = buf->ReadWord();
5296 if (!IsValidGroupID(groupid,
"AirportTileMapSpriteGroup"))
return;
5298 if (_cur.
grffile->airtspec == NULL) {
5299 grfmsg(1,
"AirportTileMapSpriteGroup: No airport tiles defined, skipping");
5303 for (uint i = 0; i < idcount; i++) {
5306 if (airtsp == NULL) {
5307 grfmsg(1,
"AirportTileMapSpriteGroup: Airport tile %d undefined, skipping", airptiles[i]);
5317 static void FeatureMapSpriteGroup(
ByteReader *buf)
5333 uint8 feature = buf->ReadByte();
5334 uint8 idcount = buf->ReadByte();
5340 uint16 groupid = buf->ReadWord();
5341 if (!IsValidGroupID(groupid,
"FeatureMapSpriteGroup"))
return;
5343 grfmsg(6,
"FeatureMapSpriteGroup: Adding generic feature callback for feature %d", feature);
5352 grfmsg(6,
"FeatureMapSpriteGroup: Feature %d, %d ids", feature, idcount);
5356 case GSF_ROADVEHICLES:
5359 VehicleMapSpriteGroup(buf, feature, idcount);
5363 CanalMapSpriteGroup(buf, idcount);
5367 StationMapSpriteGroup(buf, idcount);
5371 TownHouseMapSpriteGroup(buf, idcount);
5374 case GSF_INDUSTRIES:
5375 IndustryMapSpriteGroup(buf, idcount);
5378 case GSF_INDUSTRYTILES:
5379 IndustrytileMapSpriteGroup(buf, idcount);
5383 CargoMapSpriteGroup(buf, idcount);
5387 AirportMapSpriteGroup(buf, idcount);
5391 ObjectMapSpriteGroup(buf, idcount);
5395 RailTypeMapSpriteGroup(buf, idcount);
5398 case GSF_AIRPORTTILES:
5399 AirportTileMapSpriteGroup(buf, idcount);
5403 grfmsg(1,
"FeatureMapSpriteGroup: Unsupported feature %d, skipping", feature);
5427 bool new_scheme = _cur.
grffile->grf_version >= 7;
5429 uint8 feature = buf->ReadByte();
5430 uint8 lang = buf->ReadByte();
5431 uint8 num = buf->ReadByte();
5432 bool generic =
HasBit(lang, 7);
5435 id = buf->ReadWord();
5436 }
else if (feature <= GSF_AIRCRAFT) {
5437 id = buf->ReadExtendedByte();
5439 id = buf->ReadByte();
5444 uint16 endid =
id + num;
5446 grfmsg(6,
"FeatureNewName: About to rename engines %d..%d (feature %d) in language 0x%02X",
5447 id, endid, feature, lang);
5449 for (;
id < endid && buf->HasData();
id++) {
5450 const char *name = buf->ReadString();
5451 grfmsg(8,
"FeatureNewName: 0x%04X <- %s",
id, name);
5455 case GSF_ROADVEHICLES:
5460 if (e == NULL)
break;
5468 case GSF_INDUSTRIES: {
5475 switch (
GB(
id, 8, 8)) {
5477 if (_cur.
grffile->stations == NULL || _cur.
grffile->stations[
GB(
id, 0, 8)] == NULL) {
5478 grfmsg(1,
"FeatureNewName: Attempt to name undefined station 0x%X, ignoring",
GB(
id, 0, 8));
5486 if (_cur.
grffile->stations == NULL || _cur.
grffile->stations[
GB(
id, 0, 8)] == NULL) {
5487 grfmsg(1,
"FeatureNewName: Attempt to name undefined station 0x%X, ignoring",
GB(
id, 0, 8));
5494 if (_cur.
grffile->airtspec == NULL || _cur.
grffile->airtspec[
GB(
id, 0, 8)] == NULL) {
5495 grfmsg(1,
"FeatureNewName: Attempt to name undefined airport tile 0x%X, ignoring",
GB(
id, 0, 8));
5502 if (_cur.
grffile->housespec == NULL || _cur.
grffile->housespec[
GB(
id, 0, 8)] == NULL) {
5503 grfmsg(1,
"FeatureNewName: Attempt to name undefined house 0x%X, ignoring.",
GB(
id, 0, 8));
5518 grfmsg(7,
"FeatureNewName: Unsupported ID (0x%04X)",
id);
5537 if (offset >= max_sprites) {
5538 grfmsg(1,
"GraphicsNew: %s sprite offset must be less than %i, skipping", name, max_sprites);
5539 uint orig_num = num;
5544 if (offset + num > max_sprites) {
5545 grfmsg(4,
"GraphicsNew: %s sprite overflow, truncating...", name);
5546 uint orig_num = num;
5547 num =
max(max_sprites - offset, 0);
5548 return orig_num - num;
5577 {
A5BLOCK_ALLOW_OFFSET, SPR_SIGNALS_BASE, 1, PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT,
"Signal graphics" },
5579 {
A5BLOCK_ALLOW_OFFSET, SPR_SLOPES_BASE, 1, NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT,
"Foundation graphics" },
5610 uint8 type = buf->ReadByte();
5611 uint16 num = buf->ReadExtendedByte();
5612 uint16 offset =
HasBit(type, 7) ? buf->ReadExtendedByte() : 0;
5615 if ((type == 0x0D) && (num == 10) && _cur.
grffile->is_ottdfile) {
5618 grfmsg(2,
"GraphicsNew: Loading 10 missing shore sprites from extra grf.");
5635 grfmsg(2,
"GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring)", type, num);
5640 const Action5Type *action5_type = &_action5_types[type];
5646 grfmsg(1,
"GraphicsNew: %s (type 0x%02X) do not allow an <offset> field. Ignoring offset.", action5_type->
name, type);
5653 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);
5663 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);
5665 for (; num > 0; num--) {
5696 bool missing =
false;
5697 for (uint8 i = 0; i <
lengthof(_action5_types); i++) {
5703 DEBUG(grf, 0,
"%s sprites are missing", type->
name);
5767 *value = (major << 24) | (minor << 20) | (revision << 16) | build;
5797 *value = _game_mode;
5831 *value =
Clamp(snowline * (grffile->grf_version >= 8 ? 1 :
TILE_HEIGHT), 0, 0xFE);
5840 *value = _openttd_newgrf_version;
5855 default:
return false;
5859 static uint32 GetParamVal(byte param, uint32 *cond_val)
5877 if (cond_val == NULL) {
5896 grfmsg(1,
"Unsupported in-game variable 0x%02X", param);
5919 byte *preload_sprite = NULL;
5923 preload_sprite = MallocT<byte>(num);
5931 grfmsg(2,
"CfgApply: Ignoring (next sprite is real, unsupported)");
5932 free(preload_sprite);
5937 GRFLineToSpriteOverride::iterator it = _grf_line_to_action6_sprite_override.find(location);
5938 if (it != _grf_line_to_action6_sprite_override.end()) {
5939 free(preload_sprite);
5940 preload_sprite = _grf_line_to_action6_sprite_override[location];
5942 _grf_line_to_action6_sprite_override[location] = preload_sprite;
5955 param_num = buf->ReadByte();
5956 if (param_num == 0xFF)
break;
5960 param_size = buf->ReadByte();
5964 add_value =
HasBit(param_size, 7);
5965 param_size =
GB(param_size, 0, 7);
5968 offset = buf->ReadExtendedByte();
5972 if (param_num < 0x80 && (param_num + (param_size - 1) / 4) >= _cur.
grffile->
param_end) {
5973 grfmsg(2,
"CfgApply: Ignoring (param %d not set)", (param_num + (param_size - 1) / 4));
5977 grfmsg(8,
"CfgApply: Applying %u bytes from parameter 0x%02X at offset 0x%04X", param_size, param_num, offset);
5980 for (i = 0; i < param_size && offset + i < num; i++) {
5981 uint32 value = GetParamVal(param_num + i / 4, NULL);
5984 if (i % 4 == 0) carry =
false;
5987 uint new_value = preload_sprite[offset + i] +
GB(value, (i % 4) * 8, 8) + (carry ? 1 : 0);
5988 preload_sprite[offset + i] =
GB(new_value, 0, 8);
5990 carry = new_value >= 256;
5992 preload_sprite[offset + i] =
GB(value, (i % 4) * 8, 8);
6025 uint32 cond_val = 0;
6029 uint8 param = buf->ReadByte();
6030 uint8 paramsize = buf->ReadByte();
6031 uint8 condtype = buf->ReadByte();
6038 switch (paramsize) {
6039 case 8: cond_val = buf->ReadDWord(); mask = buf->ReadDWord();
break;
6040 case 4: cond_val = buf->ReadDWord(); mask = 0xFFFFFFFF;
break;
6041 case 2: cond_val = buf->ReadWord(); mask = 0x0000FFFF;
break;
6042 case 1: cond_val = buf->ReadByte(); mask = 0x000000FF;
break;
6046 if (param < 0x80 && _cur.grffile->param_end <= param) {
6047 grfmsg(7,
"SkipIf: Param %d undefined, skipping test", param);
6051 uint32 param_val = GetParamVal(param, &cond_val);
6053 grfmsg(7,
"SkipIf: Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
6063 if (param == 0x88 && (condtype < 0x0B || condtype > 0x0E)) {
6073 if (condtype != 10 && c == NULL) {
6074 grfmsg(7,
"SkipIf: GRFID 0x%08X unknown, skipping test",
BSWAP32(cond_val));
6101 default:
grfmsg(1,
"SkipIf: Unsupported GRF condition type %02X. Ignoring", condtype);
return;
6106 case 0x00: result = !!(param_val & (1 << cond_val));
6108 case 0x01: result = !(param_val & (1 << cond_val));
6110 case 0x02: result = (param_val & mask) == cond_val;
6112 case 0x03: result = (param_val & mask) != cond_val;
6114 case 0x04: result = (param_val & mask) < cond_val;
6116 case 0x05: result = (param_val & mask) > cond_val;
6127 default:
grfmsg(1,
"SkipIf: Unsupported condition type %02X. Ignoring", condtype);
return;
6132 grfmsg(2,
"SkipIf: Not skipping sprites, test was false");
6136 uint8 numsprites = buf->ReadByte();
6144 if (label->label != numsprites)
continue;
6147 if (choice == NULL) choice = label;
6149 if (label->nfo_line > _cur.
nfo_line) {
6155 if (choice != NULL) {
6156 grfmsg(2,
"SkipIf: Jumping to label 0x%0X at line %d, test was true", choice->label, choice->nfo_line);
6162 grfmsg(2,
"SkipIf: Skipping %d sprites, test was true", numsprites);
6181 uint8 grf_version = buf->ReadByte();
6182 uint32 grfid = buf->ReadDWord();
6183 const char *name = buf->ReadString();
6187 if (grf_version < 2 || grf_version > 8) {
6189 DEBUG(grf, 0,
"%s: NewGRF \"%s\" (GRFID %08X) uses GRF version %d, which is incompatible with this version of OpenTTD.", _cur.
grfconfig->
filename, name,
BSWAP32(grfid), grf_version);
6197 if (buf->HasData()) {
6198 const char *info = buf->ReadString();
6216 uint8 version = buf->ReadByte();
6217 uint32 grfid = buf->ReadDWord();
6218 const char *name = buf->ReadString();
6221 DisableGrf(STR_NEWGRF_ERROR_MULTIPLE_ACTION_8);
6225 if (_cur.
grffile->grfid != grfid) {
6226 DEBUG(grf, 0,
"GRFInfo: GRFID %08X in FILESCAN stage does not match GRFID %08X in INIT/RESERVE/ACTIVATION stage",
BSWAP32(_cur.
grffile->grfid),
BSWAP32(grfid));
6230 _cur.
grffile->grf_version = version;
6248 uint8 num_sets = buf->ReadByte();
6250 for (uint i = 0; i < num_sets; i++) {
6251 uint8 num_sprites = buf->ReadByte();
6252 uint16 first_sprite = buf->ReadWord();
6254 grfmsg(2,
"SpriteReplace: [Set %d] Changing %d sprites, beginning with %d",
6255 i, num_sprites, first_sprite
6258 for (uint j = 0; j < num_sprites; j++) {
6259 int load_index = first_sprite + j;
6265 if (
IsInsideMM(load_index, SPR_ORIGINALSHORE_START, SPR_ORIGINALSHORE_END + 1)) {
6275 uint8 num_sets = buf->ReadByte();
6277 for (uint i = 0; i < num_sets; i++) {
6306 STR_NEWGRF_ERROR_VERSION_NUMBER,
6307 STR_NEWGRF_ERROR_DOS_OR_WINDOWS,
6308 STR_NEWGRF_ERROR_UNSET_SWITCH,
6309 STR_NEWGRF_ERROR_INVALID_PARAMETER,
6310 STR_NEWGRF_ERROR_LOAD_BEFORE,
6311 STR_NEWGRF_ERROR_LOAD_AFTER,
6312 STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER,
6316 STR_NEWGRF_ERROR_MSG_INFO,
6317 STR_NEWGRF_ERROR_MSG_WARNING,
6318 STR_NEWGRF_ERROR_MSG_ERROR,
6319 STR_NEWGRF_ERROR_MSG_FATAL
6322 byte severity = buf->ReadByte();
6323 byte lang = buf->ReadByte();
6324 byte message_id = buf->ReadByte();
6327 if (!CheckGrfLangID(lang, _cur.
grffile->grf_version))
return;
6331 if (!
HasBit(severity, 7) && _cur.
stage == GLS_INIT) {
6332 grfmsg(7,
"GRFLoadError: Skipping non-fatal GRFLoadError in stage %d", _cur.
stage);
6337 if (severity >=
lengthof(sevstr)) {
6338 grfmsg(7,
"GRFLoadError: Invalid severity id %d. Setting to 2 (non-fatal error).", severity);
6340 }
else if (severity == 3) {
6350 if (message_id >=
lengthof(msgstr) && message_id != 0xFF) {
6351 grfmsg(7,
"GRFLoadError: Invalid message id.");
6355 if (buf->Remaining() <= 1) {
6356 grfmsg(7,
"GRFLoadError: No message data supplied.");
6365 if (message_id == 0xFF) {
6367 if (buf->HasData()) {
6368 const char *message = buf->ReadString();
6372 grfmsg(7,
"GRFLoadError: No custom message supplied.");
6376 error->
message = msgstr[message_id];
6379 if (buf->HasData()) {
6380 const char *data = buf->ReadString();
6384 grfmsg(7,
"GRFLoadError: No message data supplied.");
6390 uint param_number = buf->ReadByte();
6404 if (!buf->HasData())
return;
6406 const char *text = buf->ReadString();
6407 grfmsg(2,
"GRFComment: %s", text);
6413 uint8 target = buf->ReadByte();
6416 if (target < 0x80)
return;
6430 static uint32 GetPatchVariable(uint8 param)
6440 case 0x0F:
return 0;
6456 case 0x11:
return SPR_2CCMAP_BASE;
6473 byte max_edge =
max(log_X, log_Y);
6475 if (log_X == log_Y) {
6478 if (max_edge == log_Y)
SetBit(map_bits, 1);
6481 return (map_bits << 24) | (
min(log_X, log_Y) << 20) | (max_edge << 16) |
6482 (log_X << 12) | (log_Y << 8) | (log_X + log_Y);
6491 return SPR_SLOPES_BASE;
6498 grfmsg(2,
"ParamSet: Unknown Patch variable 0x%02X.", param);
6504 static uint32 PerformGRM(uint32 *grm, uint16 num_ids, uint16 count, uint8 op, uint8 target,
const char *type)
6517 for (uint i = start; i < num_ids; i++) {
6521 if (op == 2 || op == 3)
break;
6526 if (size == count)
break;
6529 if (size == count) {
6531 if (op == 0 || op == 3) {
6532 grfmsg(2,
"ParamSet: GRM: Reserving %d %s at %d", count, type, start);
6533 for (uint i = 0; i < count; i++) grm[start + i] = _cur.
grffile->grfid;
6539 if (op != 4 && op != 5) {
6541 grfmsg(0,
"ParamSet: GRM: Unable to allocate %d %s, deactivating", count, type);
6546 grfmsg(1,
"ParamSet: GRM: Unable to allocate %d %s", count, type);
6576 uint8 target = buf->ReadByte();
6577 uint8 oper = buf->ReadByte();
6578 uint32 src1 = buf->ReadByte();
6579 uint32 src2 = buf->ReadByte();
6582 if (buf->Remaining() >= 4) data = buf->ReadDWord();
6591 if (target < 0x80 && target < _cur.grffile->param_end) {
6592 grfmsg(7,
"ParamSet: Param %u already defined, skipping", target);
6596 oper =
GB(oper, 0, 7);
6600 if (
GB(data, 0, 8) == 0xFF) {
6601 if (data == 0x0000FFFF) {
6603 src1 = GetPatchVariable(src1);
6607 uint8 feature =
GB(data, 8, 8);
6608 uint16 count =
GB(data, 16, 16);
6610 if (_cur.
stage == GLS_RESERVE) {
6611 if (feature == 0x08) {
6615 if (_cur.
spriteid + count >= 16384) {
6616 grfmsg(0,
"ParamSet: GRM: Unable to allocate %d sprites; try changing NewGRF order", count);
6622 grfmsg(4,
"ParamSet: GRM: Allocated %d sprites at %d", count, _cur.
spriteid);
6629 }
else if (_cur.
stage == GLS_ACTIVATION) {
6658 grfmsg(4,
"ParamSet: GRM: Using pre-allocated sprites at %d", src1);
6666 grfmsg(1,
"ParamSet: GRM: Unsupported operation %d for general sprites", op);
6677 default:
grfmsg(1,
"ParamSet: GRM: Unsupported feature 0x%X", feature);
return;
6694 }
else if (src1 == 0xFE) {
6706 src1 = (src1 == 0xFF) ? data : GetParamVal(src1, NULL);
6707 src2 = (src2 == 0xFF) ? data : GetParamVal(src2, NULL);
6735 res = (int32)src1 * (int32)src2;
6739 if ((int32)src2 < 0) {
6740 res = src1 >> -(int32)src2;
6742 res = src1 << (src2 & 0x1F);
6747 if ((int32)src2 < 0) {
6748 res = (int32)src1 >> -(int32)src2;
6750 res = (int32)src1 << (src2 & 0x1F);
6774 res = (int32)src1 / (int32)src2;
6790 res = (int32)src1 % (int32)src2;
6794 default:
grfmsg(0,
"ParamSet: Unknown operation %d, skipping", oper);
return;
6823 grfmsg(7,
"ParamSet: Skipping unimplemented target 0x%02X", target);
6836 grfmsg(7,
"ParamSet: Skipping unimplemented target 0x%02X", target);
6840 if (target < 0x80) {
6841 _cur.
grffile->param[target] = res;
6845 grfmsg(7,
"ParamSet: Skipping unknown target 0x%02X", target);
6859 uint8 num = buf->ReadByte();
6861 for (uint i = 0; i < num; i++) {
6862 uint32 grfid = buf->ReadDWord();
6884 uint8 num = buf->ReadByte();
6886 for (uint i = 0; i < num; i++) {
6887 uint32 grfid = buf->ReadDWord();
6891 if (file != NULL && file != _cur.
grfconfig) {
6909 uint32 grfid = _cur.
grffile->grfid;
6913 byte
id = buf->ReadByte();
6914 grfmsg(6,
"FeatureTownName: definition 0x%02X",
id & 0x7F);
6919 bool new_scheme = _cur.
grffile->grf_version >= 7;
6921 byte lang = buf->ReadByte();
6923 byte nb_gen = townname->nb_gen;
6927 const char *name = buf->ReadString();
6930 grfmsg(6,
"FeatureTownName: lang 0x%X -> '%s'", lang, lang_name);
6933 townname->name[nb_gen] =
AddGRFString(grfid,
id, lang, new_scheme,
false, name, STR_UNDEFINED);
6935 lang = buf->ReadByte();
6936 }
while (lang != 0);
6937 townname->id[nb_gen] = id;
6941 byte nb = buf->ReadByte();
6942 grfmsg(6,
"FeatureTownName: %u parts", nb);
6944 townname->nbparts[id] = nb;
6945 townname->partlist[id] = CallocT<NamePartList>(nb);
6947 for (
int i = 0; i < nb; i++) {
6948 byte nbtext = buf->ReadByte();
6949 townname->partlist[id][i].bitstart = buf->ReadByte();
6950 townname->partlist[id][i].bitcount = buf->ReadByte();
6951 townname->partlist[id][i].maxprob = 0;
6952 townname->partlist[id][i].partcount = nbtext;
6953 townname->partlist[id][i].parts = CallocT<NamePart>(nbtext);
6954 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);
6956 for (
int j = 0; j < nbtext; j++) {
6957 byte prob = buf->ReadByte();
6960 byte ref_id = buf->ReadByte();
6962 if (townname->nbparts[ref_id] == 0) {
6963 grfmsg(0,
"FeatureTownName: definition 0x%02X doesn't exist, deactivating", ref_id);
6964 DelGRFTownName(grfid);
6969 grfmsg(6,
"FeatureTownName: part %d, text %d, uses intermediate definition 0x%02X (with probability %d)", i, j, ref_id, prob & 0x7F);
6970 townname->partlist[id][i].parts[j].data.
id = ref_id;
6972 const char *text = buf->ReadString();
6974 grfmsg(6,
"FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[
id][i].parts[j].data.
text, prob);
6976 townname->partlist[id][i].parts[j].
prob = prob;
6977 townname->partlist[id][i].maxprob +=
GB(prob, 0, 7);
6979 grfmsg(6,
"FeatureTownName: part %d, total probability %d", i, townname->partlist[
id][i].maxprob);
6991 byte nfo_label = buf->ReadByte();
6993 GRFLabel *label = MallocT<GRFLabel>(1);
6994 label->label = nfo_label;
7005 for (l = _cur.
grffile->
label; l->next != NULL; l = l->next) {}
7009 grfmsg(2,
"DefineGotoLabel: GOTO target with label 0x%02X", label->label);
7023 if (file == NULL || file->sound_offset == 0) {
7024 grfmsg(1,
"ImportGRFSound: Source file not available");
7028 if (sound_id >= file->num_sounds) {
7029 grfmsg(1,
"ImportGRFSound: Sound effect %d is invalid", sound_id);
7033 grfmsg(2,
"ImportGRFSound: Copying sound %d (%d) from file %X", sound_id, file->sound_offset + sound_id, grfid);
7035 *sound = *GetSound(file->sound_offset + sound_id);
7038 sound->volume = 128;
7039 sound->priority = 0;
7050 sound->volume = 0x80;
7051 sound->priority = 0;
7053 if (offs != SIZE_MAX) {
7056 sound->file_offset = offs;
7068 uint16 num = buf->ReadWord();
7069 if (num == 0)
return;
7072 if (_cur.
grffile->sound_offset == 0) {
7073 _cur.
grffile->sound_offset = GetNumSounds();
7074 _cur.
grffile->num_sounds = num;
7077 sound = GetSound(_cur.
grffile->sound_offset);
7080 for (
int i = 0; i < num; i++) {
7085 bool invalid = i >= _cur.
grffile->num_sounds;
7095 grfmsg(1,
"GRFSound: Sound index out of range (multiple Action 11?)");
7097 }
else if (len != 4) {
7098 grfmsg(1,
"GRFSound: Invalid sprite section import");
7108 grfmsg(1,
"GRFSound: Unexpected RealSprite found, skipping");
7115 grfmsg(1,
"GRFSound: Sound index out of range (multiple Action 11?)");
7123 if (_cur.
stage == GLS_INIT) {
7125 grfmsg(1,
"GRFSound: Inline sounds are not supported for container version >= 2");
7134 if (_cur.
stage == GLS_ACTIVATION) {
7145 grfmsg(1,
"GRFSound: Unexpected Action %x found, skipping", action);
7174 uint8 num_def = buf->ReadByte();
7176 for (uint i = 0; i < num_def; i++) {
7178 uint8 num_char = buf->ReadByte();
7179 uint16 base_char = buf->ReadWord();
7181 if (size >= FS_END) {
7182 grfmsg(1,
"LoadFontGlyph: Size %u is not supported, ignoring", size);
7185 grfmsg(7,
"LoadFontGlyph: Loading %u glyph(s) at 0x%04X for size %u", num_char, base_char, size);
7187 for (uint c = 0; c < num_char; c++) {
7205 uint8 num_def = buf->ReadByte();
7207 for (uint i = 0; i < num_def; i++) {
7231 uint32 grfid = buf->ReadDWord();
7234 grfmsg(7,
"TranslateGRFStrings: GRFID 0x%08x unknown, skipping action 13",
BSWAP32(grfid));
7244 GetString(tmp, STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE,
lastof(tmp));
7255 byte language = _cur.
grffile->grf_version >= 8 ? buf->ReadByte() : 0x7F;
7256 byte num_strings = buf->ReadByte();
7257 uint16 first_id = buf->ReadWord();
7259 if (!((first_id >= 0xD000 && first_id + num_strings <= 0xD3FF) || (first_id >= 0xDC00 && first_id + num_strings <= 0xDCFF))) {
7260 grfmsg(7,
"TranslateGRFStrings: Attempting to set out-of-range string IDs in action 13 (first: 0x%4X, number: 0x%2X)", first_id, num_strings);
7264 for (uint i = 0; i < num_strings && buf->HasData(); i++) {
7265 const char *
string = buf->ReadString();
7268 grfmsg(7,
"TranslateGRFString: Ignoring empty string.");
7272 AddGRFString(grfid, first_id + i, language,
true,
true,
string, STR_UNDEFINED);
7301 grfmsg(2,
"StaticGRFInfo: expected only 1 byte for 'INFO'->'NPAR' but got " PRINTF_SIZE
", ignoring this field", len);
7313 grfmsg(2,
"StaticGRFInfo: expected only 1 byte for 'INFO'->'PALS' but got " PRINTF_SIZE
", ignoring this field", len);
7316 char data = buf->ReadByte();
7324 grfmsg(2,
"StaticGRFInfo: unexpected value '%02x' for 'INFO'->'PALS', ignoring this field", data);
7339 grfmsg(2,
"StaticGRFInfo: expected only 1 byte for 'INFO'->'BLTR' but got " PRINTF_SIZE
", ignoring this field", len);
7342 char data = buf->ReadByte();
7348 grfmsg(2,
"StaticGRFInfo: unexpected value '%02x' for 'INFO'->'BLTR', ignoring this field", data);
7361 grfmsg(2,
"StaticGRFInfo: expected 4 bytes for 'INFO'->'VRSN' but got " PRINTF_SIZE
", ignoring this field", len);
7374 grfmsg(2,
"StaticGRFInfo: expected 4 bytes for 'INFO'->'MINV' but got " PRINTF_SIZE
", ignoring this field", len);
7379 grfmsg(2,
"StaticGRFInfo: 'MINV' defined before 'VRSN' or 'VRSN' set to 0, ignoring this field");
7410 grfmsg(2,
"StaticGRFInfo: expected 1 byte for 'INFO'->'PARA'->'TYPE' but got " PRINTF_SIZE
", ignoring this field", len);
7415 _cur_parameter->
type = type;
7417 grfmsg(3,
"StaticGRFInfo: unknown parameter type %d, ignoring this field", type);
7427 grfmsg(2,
"StaticGRFInfo: 'INFO'->'PARA'->'LIMI' is only valid for parameters with type uint/enum, ignoring this field");
7429 }
else if (len != 8) {
7430 grfmsg(2,
"StaticGRFInfo: expected 8 bytes for 'INFO'->'PARA'->'LIMI' but got " PRINTF_SIZE
", ignoring this field", len);
7433 _cur_parameter->
min_value = buf->ReadDWord();
7434 _cur_parameter->
max_value = buf->ReadDWord();
7442 if (len < 1 || len > 3) {
7443 grfmsg(2,
"StaticGRFInfo: expected 1 to 3 bytes for 'INFO'->'PARA'->'MASK' but got " PRINTF_SIZE
", ignoring this field", len);
7446 byte param_nr = buf->ReadByte();
7448 grfmsg(2,
"StaticGRFInfo: invalid parameter number in 'INFO'->'PARA'->'MASK', param %d, ignoring this field", param_nr);
7451 _cur_parameter->
param_nr = param_nr;
7452 if (len >= 2) _cur_parameter->
first_bit =
min(buf->ReadByte(), 31);
7453 if (len >= 3) _cur_parameter->
num_bit =
min(buf->ReadByte(), 32 - _cur_parameter->
first_bit);
7464 grfmsg(2,
"StaticGRFInfo: expected 4 bytes for 'INFO'->'PARA'->'DEFA' but got " PRINTF_SIZE
", ignoring this field", len);
7467 _cur_parameter->
def_value = buf->ReadDWord();
7500 this->handler.data = handler;
7512 this->handler.text = handler;
7524 this->handler.call_handler =
true;
7525 this->handler.u.branch = handler;
7537 this->handler.call_handler =
false;
7538 this->handler.u.subtags =
subtags;
7567 byte type = buf->ReadByte();
7569 uint32
id = buf->ReadDWord();
7570 if (type !=
'T' ||
id > _cur_parameter->
max_value) {
7571 grfmsg(2,
"StaticGRFInfo: all child nodes of 'INFO'->'PARA'->param_num->'VALU' should have type 't' and the value/bit number as id");
7573 type = buf->ReadByte();
7577 byte langid = buf->ReadByte();
7578 const char *name_string = buf->ReadString();
7589 type = buf->ReadByte();
7614 byte type = buf->ReadByte();
7616 uint32
id = buf->ReadDWord();
7618 grfmsg(2,
"StaticGRFInfo: all child nodes of 'INFO'->'PARA' should have type 'C' and their parameter number as id");
7620 type = buf->ReadByte();
7627 MemSetT<GRFParameterInfo *>(newdata, 0, num_to_add);
7634 if (!
HandleNodes(buf, _tags_parameters))
return false;
7635 type = buf->ReadByte();
7672 byte new_type = buf->ReadByte();
7673 while (new_type != 0) {
7676 new_type = buf->ReadByte();
7687 uint16 size = buf->ReadWord();
7711 while ((tag = &subtags[i++])->type != 0) {
7714 default: NOT_REACHED();
7717 byte langid = buf->ReadByte();
7718 return tag->handler.
text(langid, buf->ReadString());
7722 size_t len = buf->ReadWord();
7723 if (buf->Remaining() < len)
return false;
7724 return tag->handler.
data(len, buf);
7729 return tag->handler.u.branch(buf);
7735 grfmsg(2,
"StaticGRFInfo: unknown type/id combination found, type=%c, id=%x", type,
id);
7747 byte type = buf->ReadByte();
7749 uint32
id = buf->ReadDWord();
7750 if (!
HandleNode(type,
id, buf, subtags))
return false;
7751 type = buf->ReadByte();
7868 const GRFFile *
const *end = _grf_files.
End();
7869 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
7871 if (stations == NULL)
continue;
7873 if (stations[i] == NULL)
continue;
7879 if (!statspec->copied_layouts) {
7880 for (uint l = 0; l < statspec->lengths; l++) {
7881 for (uint p = 0; p < statspec->platforms[l]; p++) {
7882 free(statspec->layouts[l][p]);
7884 free(statspec->layouts[l]);
7886 free(statspec->layouts);
7887 free(statspec->platforms);
7903 const GRFFile *
const *end = _grf_files.
End();
7904 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
7905 HouseSpec **&housespec = (*file)->housespec;
7906 if (housespec == NULL)
continue;
7919 const GRFFile *
const *end = _grf_files.
End();
7920 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
7922 if (aslist != NULL) {
7928 for (
int j = 0; j < as->
num_table; j++) {
7939 (*file)->airportspec = NULL;
7943 if (airporttilespec != NULL) {
7945 free(airporttilespec[i]);
7947 free(airporttilespec);
7948 airporttilespec = NULL;
7956 const GRFFile *
const *end = _grf_files.
End();
7957 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
7963 if (industryspec != NULL) {
7966 if (ind == NULL)
continue;
7980 industryspec = NULL;
7983 if (indtspec == NULL)
continue;
7996 const GRFFile *
const *end = _grf_files.
End();
7997 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
7998 ObjectSpec **&objectspec = (*file)->objectspec;
7999 if (objectspec == NULL)
continue;
8001 free(objectspec[i]);
8012 const GRFFile *
const *end = _grf_files.
End();
8013 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
8039 CleanUpGRFTownNames();
8081 ObjectClass::Reset();
8086 StationClass::Reset();
8090 AirportClass::Reset();
8113 _loaded_newgrf_features.
has_2CC =
false;
8120 _grf_id_overrides.clear();
8122 InitializeSoundPool();
8170 if (newfile != NULL) {
8176 newfile =
new GRFFile(config);
8194 for (
Price i = PR_BEGIN; i < PR_END; i++) {
8218 free(this->filename);
8228 'PASS',
'COAL',
'MAIL',
'LVST',
'GOOD',
'GRAI',
'WHEA',
'MAIZ',
'WOOD',
8229 'IORE',
'STEL',
'VALU',
'GOLD',
'DIAM',
'PAPR',
'FOOD',
'FRUT',
'CORE',
8230 'WATR',
'SUGR',
'TOYS',
'BATT',
'SWET',
'TOFF',
'COLA',
'CTCD',
'BUBL',
8234 static const CargoLabel _default_refitmasks_road[] = {
8237 static const CargoLabel _default_refitmasks_ships[] = {
8238 'COAL',
'MAIL',
'LVST',
'GOOD',
'GRAI',
'WHEA',
'MAIZ',
'WOOD',
'IORE',
8239 'STEL',
'VALU',
'GOLD',
'DIAM',
'PAPR',
'FOOD',
'FRUT',
'CORE',
'WATR',
8240 'RUBR',
'SUGR',
'TOYS',
'BATT',
'SWET',
'TOFF',
'COLA',
'CTCD',
'BUBL',
8244 static const CargoLabel _default_refitmasks_aircraft[] = {
8245 'PASS',
'MAIL',
'GOOD',
'VALU',
'GOLD',
'DIAM',
'FOOD',
'FRUT',
'SUGR',
8246 'TOYS',
'BATT',
'SWET',
'TOFF',
'COLA',
'CTCD',
'BUBL',
'PLST',
'FZDR',
8249 static const CargoLabel *
const _default_refitmasks[] = {
8251 _default_refitmasks_road,
8252 _default_refitmasks_ships,
8253 _default_refitmasks_aircraft,
8264 FOR_ALL_ENGINES(e) {
8267 bool only_defaultcargo;
8272 uint32 not_mask = 0;
8273 uint32 xor_mask = ei->refit_mask;
8279 if (_gted[engine].cargo_allowed != 0) {
8282 FOR_ALL_CARGOSPECS(cs) {
8288 ei->refit_mask = ((mask & ~not_mask) ^ xor_mask) &
_cargo_mask;
8294 uint32 xor_mask = 0;
8299 for (uint i = 0;; i++) {
8300 if (cl[i] == 0)
break;
8312 only_defaultcargo = (ei->refit_mask == 0);
8326 if (ei->cargo_type ==
CT_INVALID && ei->refit_mask != 0) {
8328 const uint8 *cargo_map_for_first_refittable = NULL;
8331 if (file == NULL) file = e->
GetGRF();
8332 if (file != NULL && file->grf_version >= 8 && file->
cargo_list.
Length() != 0) {
8333 cargo_map_for_first_refittable = file->
cargo_map;
8337 if (cargo_map_for_first_refittable != NULL) {
8339 byte best_local_slot = 0xFF;
8341 FOR_EACH_SET_CARGO_ID(cargo_type, ei->refit_mask) {
8342 byte local_slot = cargo_map_for_first_refittable[cargo_type];
8343 if (local_slot < best_local_slot) {
8344 best_local_slot = local_slot;
8345 ei->cargo_type = cargo_type;
8367 for (uint i = 0; i < CF_END; i++) {
8380 FOR_ALL_ENGINES(e) {
8381 if (e->
GetGRF() == NULL) {
8384 e->info.
string_id = STR_NEWGRF_INVALID_ENGINE;
8417 default: NOT_REACHED();
8431 cs->
quantifier = STR_NEWGRF_INVALID_CARGO_QUANTITY;
8432 cs->
abbrev = STR_NEWGRF_INVALID_CARGO_ABBREV;
8456 if (filename != NULL)
DEBUG(grf, 1,
"FinaliseHouseArray: %s defines house %d as multitile, but no suitable tiles follow. Disabling house.", filename, hs->
grf_prop.
local_id);
8466 if (filename != NULL)
DEBUG(grf, 1,
"FinaliseHouseArray: %s defines multitile house %d with non-zero population on additional tiles. Disabling house.", filename, hs->
grf_prop.
local_id);
8474 DEBUG(grf, 1,
"FinaliseHouseArray: %s defines house %d with different house size then it's substitute type. Disabling house.", filename, hs->
grf_prop.
local_id);
8481 if (filename != NULL)
DEBUG(grf, 1,
"FinaliseHouseArray: %s defines house %d without a size but marked it as available. Disabling house.", filename, hs->
grf_prop.
local_id);
8500 if (hs == NULL || !hs->
enabled)
continue;
8505 if (min_year == 0)
return;
8509 if (hs == NULL || !hs->
enabled)
continue;
8532 const GRFFile *
const *end = _grf_files.
End();
8533 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
8534 HouseSpec **&housespec = (*file)->housespec;
8535 if (housespec == NULL)
continue;
8540 if (hs == NULL)
continue;
8542 const HouseSpec *next1 = (i + 1 < NUM_HOUSES_PER_GRF ? housespec[i + 1] : NULL);
8543 const HouseSpec *next2 = (i + 2 < NUM_HOUSES_PER_GRF ? housespec[i + 2] : NULL);
8544 const HouseSpec *next3 = (i + 3 < NUM_HOUSES_PER_GRF ? housespec[i + 3] : NULL);
8546 if (!
IsHouseSpecValid(hs, next1, next2, next3, (*file)->filename))
continue;
8554 const HouseSpec *next1 = (i + 1 < NUM_HOUSES ? HouseSpec::Get(i + 1) : NULL);
8555 const HouseSpec *next2 = (i + 2 < NUM_HOUSES ? HouseSpec::Get(i + 2) : NULL);
8556 const HouseSpec *next3 = (i + 3 < NUM_HOUSES ? HouseSpec::Get(i + 3) : NULL);
8595 const GRFFile *
const *end = _grf_files.
End();
8596 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
8599 if (industryspec != NULL) {
8603 if (indsp != NULL && indsp->
enabled) {
8609 if (strid != STR_UNDEFINED) indsp->
name = strid;
8612 if (strid != STR_UNDEFINED) indsp->
closure_text = strid;
8627 if (strid != STR_UNDEFINED) indsp->
station_name = strid;
8636 if (indtspec != NULL) {
8639 if (indtsp != NULL) {
8640 _industile_mngr.SetEntitySpec(indtsp);
8649 for (uint i = 0; i < 3; i++) {
8654 indsp->
name = STR_NEWGRF_INVALID_INDUSTRYTYPE;
8666 const GRFFile *
const *end = _grf_files.
End();
8667 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
8668 ObjectSpec **&objectspec = (*file)->objectspec;
8669 if (objectspec != NULL) {
8671 if (objectspec[i] != NULL && objectspec[i]->grf_prop.grffile != NULL && objectspec[i]->
enabled) {
8686 const GRFFile *
const *end = _grf_files.
End();
8687 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
8688 AirportSpec **&airportspec = (*file)->airportspec;
8689 if (airportspec != NULL) {
8691 if (airportspec[i] != NULL && airportspec[i]->enabled) {
8692 _airport_mngr.SetEntitySpec(airportspec[i]);
8698 if (airporttilespec != NULL) {
8700 if (airporttilespec[i] != NULL && airporttilespec[i]->enabled) {
8701 _airporttile_mngr.SetEntitySpec(airporttilespec[i]);
8714 static void DecodeSpecialSprite(byte *buf, uint num, GrfLoadingStage stage)
8728 static const SpecialSpriteHandler handlers[][GLS_END] = {
8729 { NULL, SafeChangeInfo, NULL, NULL, ReserveChangeInfo, FeatureChangeInfo, },
8730 { SkipAct1, SkipAct1, SkipAct1, SkipAct1, SkipAct1, NewSpriteSet, },
8731 { NULL, NULL, NULL, NULL, NULL, NewSpriteGroup, },
8732 { NULL,
GRFUnsafe, NULL, NULL, NULL, FeatureMapSpriteGroup, },
8733 { NULL, NULL, NULL, NULL, NULL, FeatureNewName, },
8734 { SkipAct5, SkipAct5, SkipAct5, SkipAct5, SkipAct5, GraphicsNew, },
8735 { NULL, NULL, NULL, CfgApply, CfgApply, CfgApply, },
8736 { NULL, NULL, NULL, NULL, SkipIf, SkipIf, },
8737 { ScanInfo, NULL, NULL, GRFInfo, GRFInfo, GRFInfo, },
8738 { NULL, NULL, NULL, SkipIf, SkipIf, SkipIf, },
8739 { SkipActA, SkipActA, SkipActA, SkipActA, SkipActA, SpriteReplace, },
8740 { NULL, NULL, NULL, GRFLoadError, GRFLoadError, GRFLoadError, },
8741 { NULL, NULL, NULL, GRFComment, NULL, GRFComment, },
8743 { NULL, SafeGRFInhibit, NULL, GRFInhibit, GRFInhibit, GRFInhibit, },
8746 { SkipAct11,
GRFUnsafe, SkipAct11, GRFSound, SkipAct11, GRFSound, },
8754 GRFLineToSpriteOverride::iterator it = _grf_line_to_action6_sprite_override.find(location);
8755 if (it == _grf_line_to_action6_sprite_override.end()) {
8761 buf = _grf_line_to_action6_sprite_override[location];
8762 grfmsg(7,
"DecodeSpecialSprite: Using preloaded pseudo sprite data");
8772 byte action = bufp->ReadByte();
8774 if (action == 0xFF) {
8775 grfmsg(2,
"DecodeSpecialSprite: Unexpected data block, skipping");
8776 }
else if (action == 0xFE) {
8777 grfmsg(2,
"DecodeSpecialSprite: Unexpected import block, skipping");
8778 }
else if (action >=
lengthof(handlers)) {
8779 grfmsg(7,
"DecodeSpecialSprite: Skipping unknown action 0x%02X", action);
8780 }
else if (handlers[action][stage] == NULL) {
8781 grfmsg(7,
"DecodeSpecialSprite: Skipping action 0x%02X in stage %d", action, stage);
8783 grfmsg(7,
"DecodeSpecialSprite: Handling action 0x%02X in stage %d", action, stage);
8784 handlers[action][stage](bufp);
8787 grfmsg(1,
"DecodeSpecialSprite: Tried to read past end of pseudo-sprite data");
8794 extern const byte
_grf_cont_v2_sig[8] = {
'G',
'R',
'F', 0x82, 0x0D, 0x0A, 0x1A, 0x0A};
8807 for (uint i = 0; i <
lengthof(_grf_cont_v2_sig); i++) {
8808 if (
FioReadByte() != _grf_cont_v2_sig[i])
return 0;
8828 const char *filename = config->
filename;
8839 if (stage != GLS_FILESCAN && stage != GLS_SAFETYSCAN && stage != GLS_LABELSCAN) {
8841 if (_cur.
grffile == NULL)
usererror(
"File '%s' lost in cache.\n", filename);
8848 DEBUG(grf, 0,
"'%s' is not loaded as the maximum number of GRFs has been reached", filename);
8850 config->
error =
new GRFError(STR_NEWGRF_ERROR_MSG_FATAL, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED);
8860 DEBUG(grf, 2,
"LoadNewGRFFile: Reading NewGRF-file '%s'", filename);
8864 DEBUG(grf, 7,
"LoadNewGRFFile: Custom .grf has invalid format");
8868 if (stage == GLS_INIT || stage == GLS_ACTIVATION) {
8880 if (compression != 0) {
8881 DEBUG(grf, 7,
"LoadNewGRFFile: Unsupported compression format");
8893 DEBUG(grf, 7,
"LoadNewGRFFile: Custom .grf has invalid format");
8907 DecodeSpecialSprite(buf.
Allocate(num), num, stage);
8918 grfmsg(0,
"LoadNewGRFFile: Unexpected sprite, disabling");
8919 DisableGrf(STR_NEWGRF_ERROR_UNEXPECTED_SPRITE);
8984 static const uint32 override_features = (1 << GSF_TRAINS) | (1 << GSF_ROADVEHICLES) | (1 << GSF_SHIPS) | (1 << GSF_AIRCRAFT);
8987 int num_grfs = _grf_files.
Length();
8988 int *grf_overrides =
AllocaM(
int, num_grfs);
8989 for (
int i = 0; i < num_grfs; i++) {
8990 grf_overrides[i] = -1;
8992 GRFFile *source = _grf_files[i];
8993 uint32
override = _grf_id_overrides[source->grfid];
8994 if (
override == 0)
continue;
8997 if (dest == NULL)
continue;
8999 grf_overrides[i] = _grf_files.
FindIndex(dest);
9000 assert(grf_overrides[i] >= 0);
9004 for (
int i = 0; i < num_grfs; i++) {
9005 if (grf_overrides[i] < 0 || grf_overrides[i] >= i)
continue;
9006 GRFFile *source = _grf_files[i];
9007 GRFFile *dest = _grf_files[grf_overrides[i]];
9013 for (
Price p = PR_BEGIN; p < PR_END; p++) {
9016 DEBUG(grf, 3,
"'%s' overrides price base multiplier %d of '%s'", source->filename, p, dest->filename);
9022 for (
int i = num_grfs - 1; i >= 0; i--) {
9023 if (grf_overrides[i] < 0 || grf_overrides[i] <= i)
continue;
9024 GRFFile *source = _grf_files[i];
9025 GRFFile *dest = _grf_files[grf_overrides[i]];
9031 for (
Price p = PR_BEGIN; p < PR_END; p++) {
9034 DEBUG(grf, 3,
"Price base multiplier %d from '%s' propagated to '%s'", p, source->filename, dest->filename);
9040 for (
int i = 0; i < num_grfs; i++) {
9041 if (grf_overrides[i] < 0)
continue;
9042 GRFFile *source = _grf_files[i];
9043 GRFFile *dest = _grf_files[grf_overrides[i]];
9049 for (
Price p = PR_BEGIN; p < PR_END; p++) {
9050 if (!
HasBit(features, _price_base_specs[p].grf_feature))
continue;
9052 DEBUG(grf, 3,
"Price base multiplier %d from '%s' propagated to '%s'", p, dest->filename, source->filename);
9059 const GRFFile *
const *end = _grf_files.
End();
9060 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
9061 if ((*file)->grf_version >= 8)
continue;
9062 PriceMultipliers &price_base_multipliers = (*file)->price_base_multipliers;
9063 for (
Price p = PR_BEGIN; p < PR_END; p++) {
9065 if (fallback_price != INVALID_PRICE && price_base_multipliers[p] == INVALID_PRICE_MODIFIER) {
9068 price_base_multipliers[p] = price_base_multipliers[fallback_price];
9074 for (
GRFFile **file = _grf_files.
Begin(); file != end; file++) {
9075 PriceMultipliers &price_base_multipliers = (*file)->price_base_multipliers;
9076 for (
Price p = PR_BEGIN; p < PR_END; p++) {
9077 if (price_base_multipliers[p] == INVALID_PRICE_MODIFIER) {
9079 price_base_multipliers[p] = 0;
9084 DEBUG(grf, 3,
"'%s' sets global price base multiplier %d", (*file)->filename, p);
9086 price_base_multipliers[p] = 0;
9088 DEBUG(grf, 3,
"'%s' sets local price base multiplier %d", (*file)->filename, p);
9103 _string_to_grf_mapping.
Clear();
9106 for (GRFLineToSpriteOverride::iterator it = _grf_line_to_action6_sprite_override.begin(); it != _grf_line_to_action6_sprite_override.end(); it++) {
9109 _grf_line_to_action6_sprite_override.clear();
9160 FOR_ALL_ENGINES_OF_TYPE(e,
VEH_ROAD) {
9173 e->u.rail.railtype = railtype;
9183 _grm_sprites.clear();
9231 for (GrfLoadingStage stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; stage++) {
9238 if (stage == GLS_RESERVE) {
9239 static const uint32 overrides[][2] = {
9240 { 0x44442202, 0x44440111 },
9241 { 0x6D620402, 0x6D620401 },
9242 { 0x4D656f20, 0x4D656F17 },
9244 for (
size_t i = 0; i <
lengthof(overrides); i++) {
9249 uint slot = file_index;
9258 DEBUG(grf, 0,
"NewGRF file is missing '%s'; disabling", c->
filename);
9265 if (stage == GLS_RESERVE) {
9267 }
else if (stage == GLS_ACTIVATION) {
9272 DEBUG(sprite, 2,
"LoadNewGRF: Currently %i sprites are loaded", _cur.
spriteid);