@@ -121,7 +121,7 @@ struct MAPHChunkHandler : ChunkHandler {
121121};
122122
123123struct 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
150150struct 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
180180struct 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
207207struct 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
234234struct 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
261261struct 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
301301struct 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
328328struct 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+
355418static const MAPSChunkHandler MAPS ;
356419static const MAPTChunkHandler MAPT ;
357420static const MAPHChunkHandler MAPH ;
@@ -363,6 +426,7 @@ static const MAP5ChunkHandler MAP5;
363426static const MAPEChunkHandler MAPE ;
364427static const MAP7ChunkHandler MAP7 ;
365428static const MAP8ChunkHandler MAP8 ;
429+ static const MAPZChunkHandler MAPZ ;
366430static 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-
380444extern const ChunkHandlerTable _map_chunk_handlers (map_chunk_handlers);
0 commit comments