Changeset - r27253:40edbcd483e2
[Not reviewed]
master
0 1 0
Peter Nelson - 14 months ago 2023-04-30 09:00:43
peter1138@openttd.org
Change: Read Action 3 IDs as extended-bytes for all features.

This can be done because previous the value 0xFF (which indicates an
extended byte) was reserved for this purpose. Other features which may
not have mentioned reserving 0xFF do not allow this many IDs anyway.

This makes Action 3 consistent across all features. The allowable limits
for each feature do not change.
1 file changed with 23 insertions and 23 deletions:
0 comments (0 inline, 0 general)
src/newgrf.cpp
Show inline comments
 
@@ -5639,16 +5639,16 @@ static void VehicleMapSpriteGroup(ByteRe
 
	}
 
}
 

	
 

	
 
static void CanalMapSpriteGroup(ByteReader *buf, uint8 idcount)
 
{
 
	std::vector<CanalFeature> cfs;
 
	std::vector<uint16_t> cfs;
 
	cfs.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		cfs.push_back((CanalFeature)buf->ReadByte());
 
		cfs.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	uint8 cidcount = buf->ReadByte();
 
	buf->Skip(cidcount * 3);
 

	
 
	uint16 groupid = buf->ReadWord();
 
@@ -5670,16 +5670,16 @@ static void StationMapSpriteGroup(ByteRe
 
{
 
	if (_cur.grffile->stations.empty()) {
 
		GrfMsg(1, "StationMapSpriteGroup: No stations defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> stations;
 
	std::vector<uint16_t> stations;
 
	stations.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		stations.push_back(buf->ReadByte());
 
		stations.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	uint8 cidcount = buf->ReadByte();
 
	for (uint c = 0; c < cidcount; c++) {
 
		uint8 ctype = buf->ReadByte();
 
		uint16 groupid = buf->ReadWord();
 
@@ -5728,16 +5728,16 @@ static void TownHouseMapSpriteGroup(Byte
 
{
 
	if (_cur.grffile->housespec.empty()) {
 
		GrfMsg(1, "TownHouseMapSpriteGroup: No houses defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> houses;
 
	std::vector<uint16_t> houses;
 
	houses.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		houses.push_back(buf->ReadByte());
 
		houses.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	/* Skip the cargo type section, we only care about the default group */
 
	uint8 cidcount = buf->ReadByte();
 
	buf->Skip(cidcount * 3);
 

	
 
@@ -5760,16 +5760,16 @@ static void IndustryMapSpriteGroup(ByteR
 
{
 
	if (_cur.grffile->industryspec.empty()) {
 
		GrfMsg(1, "IndustryMapSpriteGroup: No industries defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> industries;
 
	std::vector<uint16_t> industries;
 
	industries.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		industries.push_back(buf->ReadByte());
 
		industries.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	/* Skip the cargo type section, we only care about the default group */
 
	uint8 cidcount = buf->ReadByte();
 
	buf->Skip(cidcount * 3);
 

	
 
@@ -5792,16 +5792,16 @@ static void IndustrytileMapSpriteGroup(B
 
{
 
	if (_cur.grffile->indtspec.empty()) {
 
		GrfMsg(1, "IndustrytileMapSpriteGroup: No industry tiles defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> indtiles;
 
	std::vector<uint16_t> indtiles;
 
	indtiles.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		indtiles.push_back(buf->ReadByte());
 
		indtiles.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	/* Skip the cargo type section, we only care about the default group */
 
	uint8 cidcount = buf->ReadByte();
 
	buf->Skip(cidcount * 3);
 

	
 
@@ -5819,16 +5819,16 @@ static void IndustrytileMapSpriteGroup(B
 
		indtsp->grf_prop.spritegroup[0] = _cur.spritegroups[groupid];
 
	}
 
}
 

	
 
static void CargoMapSpriteGroup(ByteReader *buf, uint8 idcount)
 
{
 
	std::vector<CargoID> cargoes;
 
	std::vector<uint16_t> cargoes;
 
	cargoes.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		cargoes.push_back((CargoID)buf->ReadByte());
 
		cargoes.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	/* Skip the cargo type section, we only care about the default group */
 
	uint8 cidcount = buf->ReadByte();
 
	buf->Skip(cidcount * 3);
 

	
 
@@ -5851,16 +5851,16 @@ static void ObjectMapSpriteGroup(ByteRea
 
{
 
	if (_cur.grffile->objectspec.empty()) {
 
		GrfMsg(1, "ObjectMapSpriteGroup: No object tiles defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> objects;
 
	std::vector<uint16_t> objects;
 
	objects.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		objects.push_back(buf->ReadByte());
 
		objects.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	uint8 cidcount = buf->ReadByte();
 
	for (uint c = 0; c < cidcount; c++) {
 
		uint8 ctype = buf->ReadByte();
 
		uint16 groupid = buf->ReadWord();
 
@@ -5905,13 +5905,13 @@ static void ObjectMapSpriteGroup(ByteRea
 

	
 
static void RailTypeMapSpriteGroup(ByteReader *buf, uint8 idcount)
 
{
 
	std::vector<uint8> railtypes;
 
	railtypes.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		uint8 id = buf->ReadByte();
 
		uint16_t id = buf->ReadExtendedByte();
 
		railtypes.push_back(id < RAILTYPE_END ? _cur.grffile->railtype_map[id] : INVALID_RAILTYPE);
 
	}
 

	
 
	uint8 cidcount = buf->ReadByte();
 
	for (uint c = 0; c < cidcount; c++) {
 
		uint8 ctype = buf->ReadByte();
 
@@ -5939,13 +5939,13 @@ static void RoadTypeMapSpriteGroup(ByteR
 
{
 
	RoadType *type_map = (rtt == RTT_TRAM) ? _cur.grffile->tramtype_map : _cur.grffile->roadtype_map;
 

	
 
	std::vector<uint8> roadtypes;
 
	roadtypes.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		uint8 id = buf->ReadByte();
 
		uint16_t id = buf->ReadExtendedByte();
 
		roadtypes.push_back(id < ROADTYPE_END ? type_map[id] : INVALID_ROADTYPE);
 
	}
 

	
 
	uint8 cidcount = buf->ReadByte();
 
	for (uint c = 0; c < cidcount; c++) {
 
		uint8 ctype = buf->ReadByte();
 
@@ -5973,16 +5973,16 @@ static void AirportMapSpriteGroup(ByteRe
 
{
 
	if (_cur.grffile->airportspec.empty()) {
 
		GrfMsg(1, "AirportMapSpriteGroup: No airports defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> airports;
 
	std::vector<uint16_t> airports;
 
	airports.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		airports.push_back(buf->ReadByte());
 
		airports.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	/* Skip the cargo type section, we only care about the default group */
 
	uint8 cidcount = buf->ReadByte();
 
	buf->Skip(cidcount * 3);
 

	
 
@@ -6005,16 +6005,16 @@ static void AirportTileMapSpriteGroup(By
 
{
 
	if (_cur.grffile->airtspec.empty()) {
 
		GrfMsg(1, "AirportTileMapSpriteGroup: No airport tiles defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> airptiles;
 
	std::vector<uint16_t> airptiles;
 
	airptiles.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		airptiles.push_back(buf->ReadByte());
 
		airptiles.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	/* Skip the cargo type section, we only care about the default group */
 
	uint8 cidcount = buf->ReadByte();
 
	buf->Skip(cidcount * 3);
 

	
 
@@ -6037,16 +6037,16 @@ static void RoadStopMapSpriteGroup(ByteR
 
{
 
	if (_cur.grffile->roadstops.empty()) {
 
		GrfMsg(1, "RoadStopMapSpriteGroup: No roadstops defined, skipping");
 
		return;
 
	}
 

	
 
	std::vector<uint8> roadstops;
 
	std::vector<uint16_t> roadstops;
 
	roadstops.reserve(idcount);
 
	for (uint i = 0; i < idcount; i++) {
 
		roadstops.push_back(buf->ReadByte());
 
		roadstops.push_back(buf->ReadExtendedByte());
 
	}
 

	
 
	uint8 cidcount = buf->ReadByte();
 
	for (uint c = 0; c < cidcount; c++) {
 
		uint8 ctype = buf->ReadByte();
 
		uint16 groupid = buf->ReadWord();
 
@@ -6097,13 +6097,13 @@ static void FeatureMapSpriteGroup(ByteRe
 
	 * id-list    := [<id>] [id-list]
 
	 * cargo-list := <cargo-type> <cid> [cargo-list]
 
	 *
 
	 * B feature       see action 0
 
	 * B n-id          bits 0-6: how many IDs this definition applies to
 
	 *                 bit 7: if set, this is a wagon override definition (see below)
 
	 * B ids           the IDs for which this definition applies
 
	 * E ids           the IDs for which this definition applies
 
	 * B num-cid       number of cargo IDs (sprite group IDs) in this definition
 
	 *                 can be zero, in that case the def-cid is used always
 
	 * B cargo-type    type of this cargo type (e.g. mail=2, wood=7, see below)
 
	 * W cid           cargo ID (sprite group ID) for this type of cargo
 
	 * W def-cid       default cargo ID (sprite group ID) */
 

	
0 comments (0 inline, 0 general)