Codechange: Use std::vector for NewGRF station tile sprite layouts.

This commit is contained in:
Peter Nelson
2021-05-01 20:28:23 +01:00
committed by PeterN
parent bd1a20f6ee
commit a3e49178d1
4 changed files with 26 additions and 27 deletions

View File

@@ -1904,13 +1904,13 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
break;
}
case 0x09: // Define sprite layout
statspec->tiles = buf->ReadExtendedByte();
delete[] statspec->renderdata; // delete earlier loaded stuff
statspec->renderdata = new NewGRFSpriteLayout[statspec->tiles];
case 0x09: { // Define sprite layout
uint16 tiles = buf->ReadExtendedByte();
statspec->renderdata.clear(); // delete earlier loaded stuff
statspec->renderdata.reserve(tiles);
for (uint t = 0; t < statspec->tiles; t++) {
NewGRFSpriteLayout *dts = &statspec->renderdata[t];
for (uint t = 0; t < tiles; t++) {
NewGRFSpriteLayout *dts = &statspec->renderdata.emplace_back();
dts->consistent_max_offset = UINT16_MAX; // Spritesets are unknown, so no limit.
if (buf->HasData(4) && *(uint32*)buf->Data() == 0) {
@@ -1946,6 +1946,7 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
dts->Clone(tmp_layout.data());
}
break;
}
case 0x0A: { // Copy sprite layout
byte srcid = buf->ReadByte();
@@ -1956,12 +1957,12 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
continue;
}
delete[] statspec->renderdata; // delete earlier loaded stuff
statspec->renderdata.clear(); // delete earlier loaded stuff
statspec->renderdata.reserve(srcstatspec->renderdata.size());
statspec->tiles = srcstatspec->tiles;
statspec->renderdata = new NewGRFSpriteLayout[statspec->tiles];
for (uint t = 0; t < statspec->tiles; t++) {
statspec->renderdata[t].Clone(&srcstatspec->renderdata[t]);
for (const auto &it : srcstatspec->renderdata) {
NewGRFSpriteLayout *dts = &statspec->renderdata.emplace_back();
dts->Clone(&it);
}
break;
}
@@ -2047,18 +2048,19 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
statspec->animation.triggers = buf->ReadWord();
break;
case 0x1A: // Advanced sprite layout
statspec->tiles = buf->ReadExtendedByte();
delete[] statspec->renderdata; // delete earlier loaded stuff
statspec->renderdata = new NewGRFSpriteLayout[statspec->tiles];
case 0x1A: { // Advanced sprite layout
uint16 tiles = buf->ReadExtendedByte();
statspec->renderdata.clear(); // delete earlier loaded stuff
statspec->renderdata.reserve(tiles);
for (uint t = 0; t < statspec->tiles; t++) {
NewGRFSpriteLayout *dts = &statspec->renderdata[t];
for (uint t = 0; t < tiles; t++) {
NewGRFSpriteLayout *dts = &statspec->renderdata.emplace_back();
uint num_building_sprites = buf->ReadByte();
/* On error, bail out immediately. Temporary GRF data was already freed */
if (ReadSpriteLayout(buf, num_building_sprites, false, GSF_STATIONS, true, false, dts)) return CIR_DISABLED;
}
break;
}
default:
ret = CIR_UNKNOWN;
@@ -8370,8 +8372,6 @@ static void ResetCustomStations()
if (stations[i] == nullptr) continue;
StationSpec *statspec = stations[i];
delete[] statspec->renderdata;
/* Release this station */
delete statspec;
}