Skip to content

Commit c8bed0a

Browse files
committed
Save map by tile type (experimental)
1 parent ab68e36 commit c8bed0a

1 file changed

Lines changed: 73 additions & 9 deletions

File tree

src/saveload/map_sl.cpp

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ struct MAPHChunkHandler : ChunkHandler {
121121
};
122122

123123
struct MAPOChunkHandler : ChunkHandler {
124-
MAPOChunkHandler() : ChunkHandler('MAPO', CH_RIFF) {}
124+
MAPOChunkHandler() : ChunkHandler('MAPO', CH_READONLY) {}
125125

126126
void Load() const override
127127
{
@@ -148,7 +148,7 @@ struct MAPOChunkHandler : ChunkHandler {
148148
};
149149

150150
struct MAP2ChunkHandler : ChunkHandler {
151-
MAP2ChunkHandler() : ChunkHandler('MAP2', CH_RIFF) {}
151+
MAP2ChunkHandler() : ChunkHandler('MAP2', CH_READONLY) {}
152152

153153
void Load() const override
154154
{
@@ -178,7 +178,7 @@ struct MAP2ChunkHandler : ChunkHandler {
178178
};
179179

180180
struct M3LOChunkHandler : ChunkHandler {
181-
M3LOChunkHandler() : ChunkHandler('M3LO', CH_RIFF) {}
181+
M3LOChunkHandler() : ChunkHandler('M3LO', CH_READONLY) {}
182182

183183
void Load() const override
184184
{
@@ -205,7 +205,7 @@ struct M3LOChunkHandler : ChunkHandler {
205205
};
206206

207207
struct M3HIChunkHandler : ChunkHandler {
208-
M3HIChunkHandler() : ChunkHandler('M3HI', CH_RIFF) {}
208+
M3HIChunkHandler() : ChunkHandler('M3HI', CH_READONLY) {}
209209

210210
void Load() const override
211211
{
@@ -232,7 +232,7 @@ struct M3HIChunkHandler : ChunkHandler {
232232
};
233233

234234
struct MAP5ChunkHandler : ChunkHandler {
235-
MAP5ChunkHandler() : ChunkHandler('MAP5', CH_RIFF) {}
235+
MAP5ChunkHandler() : ChunkHandler('MAP5', CH_READONLY) {}
236236

237237
void Load() const override
238238
{
@@ -259,7 +259,7 @@ struct MAP5ChunkHandler : ChunkHandler {
259259
};
260260

261261
struct MAPEChunkHandler : ChunkHandler {
262-
MAPEChunkHandler() : ChunkHandler('MAPE', CH_RIFF) {}
262+
MAPEChunkHandler() : ChunkHandler('MAPE', CH_READONLY) {}
263263

264264
void Load() const override
265265
{
@@ -299,7 +299,7 @@ struct MAPEChunkHandler : ChunkHandler {
299299
};
300300

301301
struct MAP7ChunkHandler : ChunkHandler {
302-
MAP7ChunkHandler() : ChunkHandler('MAP7', CH_RIFF) {}
302+
MAP7ChunkHandler() : ChunkHandler('MAP7', CH_READONLY) {}
303303

304304
void Load() const override
305305
{
@@ -326,7 +326,7 @@ struct MAP7ChunkHandler : ChunkHandler {
326326
};
327327

328328
struct MAP8ChunkHandler : ChunkHandler {
329-
MAP8ChunkHandler() : ChunkHandler('MAP8', CH_RIFF) {}
329+
MAP8ChunkHandler() : ChunkHandler('MAP8', CH_READONLY) {}
330330

331331
void Load() const override
332332
{
@@ -352,6 +352,69 @@ struct MAP8ChunkHandler : ChunkHandler {
352352
}
353353
};
354354

355+
356+
struct MAPZChunkHandler : ChunkHandler {
357+
MAPZChunkHandler() : ChunkHandler('MAPZ', CH_RIFF) {}
358+
359+
void Load() const override
360+
{
361+
std::array<uint8_t, MAP_SL_BUF_SIZE * 10> buf;
362+
uint size = Map::Size();
363+
364+
uint j = MAP_SL_BUF_SIZE * 10;
365+
366+
for (uint8_t type = 0; type < 0x10; type++) {
367+
for (TileIndex i{}; i != size; i++) {
368+
if ((Tile(i).type() >> 4) != type) continue;
369+
370+
if (j == MAP_SL_BUF_SIZE * 10) {
371+
SlCopy(buf.data(), MAP_SL_BUF_SIZE * 10, SLE_UINT8);
372+
j = 0;
373+
}
374+
375+
Tile(i).m1() = buf[j];
376+
Tile(i).m2() = buf[j + 1] | ((uint16_t)buf[j + 2] << 8);
377+
Tile(i).m3() = buf[j + 3];
378+
Tile(i).m4() = buf[j + 4];
379+
Tile(i).m5() = buf[j + 5];
380+
Tile(i).m6() = buf[j + 6];
381+
Tile(i).m7() = buf[j + 7];
382+
Tile(i).m8() = buf[j + 8] | ((uint16_t)buf[j + 9] << 8);
383+
j += 10;
384+
}
385+
}
386+
}
387+
388+
void Save() const override
389+
{
390+
std::array<uint8_t, MAP_SL_BUF_SIZE * 10> buf;
391+
uint size = Map::Size();
392+
uint j = 0;
393+
394+
SlSetLength(static_cast<uint32_t>(size) * 10);
395+
for (uint8_t type = 0; type < 0x10; type++) {
396+
for (TileIndex i{}; i != size; i++) {
397+
if ((Tile(i).type() >> 4) != type) continue;
398+
buf[j] = Tile(i).m1();
399+
buf[j + 1] = Tile(i).m2() & 0xFF;
400+
buf[j + 2] = Tile(i).m2() >> 8;
401+
buf[j + 3] = Tile(i).m3();
402+
buf[j + 4] = Tile(i).m4();
403+
buf[j + 5] = Tile(i).m5();
404+
buf[j + 6] = Tile(i).m6();
405+
buf[j + 7] = Tile(i).m7();
406+
buf[j + 8] = Tile(i).m8() & 0xFF;
407+
buf[j + 9] = Tile(i).m8() >> 8;
408+
j += 10;
409+
if (j == MAP_SL_BUF_SIZE * 10) {
410+
SlCopy(buf.data(), MAP_SL_BUF_SIZE * 10, SLE_UINT8);
411+
j = 0;
412+
}
413+
}
414+
}
415+
}
416+
};
417+
355418
static const MAPSChunkHandler MAPS;
356419
static const MAPTChunkHandler MAPT;
357420
static const MAPHChunkHandler MAPH;
@@ -363,6 +426,7 @@ static const MAP5ChunkHandler MAP5;
363426
static const MAPEChunkHandler MAPE;
364427
static const MAP7ChunkHandler MAP7;
365428
static const MAP8ChunkHandler MAP8;
429+
static const MAPZChunkHandler MAPZ;
366430
static const ChunkHandlerRef map_chunk_handlers[] = {
367431
MAPS,
368432
MAPT,
@@ -375,6 +439,6 @@ static const ChunkHandlerRef map_chunk_handlers[] = {
375439
MAPE,
376440
MAP7,
377441
MAP8,
442+
MAPZ,
378443
};
379-
380444
extern const ChunkHandlerTable _map_chunk_handlers(map_chunk_handlers);

0 commit comments

Comments
 (0)