diff options
Diffstat (limited to 'engines/lab/map.cpp')
-rw-r--r-- | engines/lab/map.cpp | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/engines/lab/map.cpp b/engines/lab/map.cpp index ceddc4bdf4..a096d28326 100644 --- a/engines/lab/map.cpp +++ b/engines/lab/map.cpp @@ -188,13 +188,11 @@ static uint16 mapScaleY(uint16 y) { } - - /*****************************************************************************/ /* Loads in the map data. */ /*****************************************************************************/ static bool loadMapData() { - byte **buffer, Temp[5]; + byte **buffer; uint32 Size; Gadget *gptr; uint16 counter; @@ -254,28 +252,33 @@ static bool loadMapData() { counter++; } - uint32 bufferSize; - buffer = g_music->newOpen("Lab:Maps", bufferSize); - stealBufMem(bufferSize); /* Freeze the memory for the maps */ - readBlock(Temp, 4L, buffer); - Temp[4] = 0; + Common::File *mapFile = g_resource->openDataFile("Lab:Maps", MKTAG('M', 'A', 'P', '0')); + if (!mapFile) + error("Corrupt map file"); + g_music->updateMusic(); + if (!g_music->_doNotFilestopSoundEffect) + g_music->stopSoundEffect(); + + MaxRooms = mapFile->readUint16LE(); + Maps = new MapData[MaxRooms]; // will be freed when the user exits the map + for (int i = 0; i < MaxRooms; i++) { + Maps[i].x = mapFile->readUint16LE(); + Maps[i].y = mapFile->readUint16LE(); + Maps[i].PageNumber = mapFile->readUint16LE(); + Maps[i].SpecialID = mapFile->readUint16LE(); + Maps[i].MapFlags = mapFile->readUint32LE(); + } - if (strcmp((char *)Temp, "MAP0") == 0) { - readBlock(&MaxRooms, 2L, buffer); - swapUShortPtr(&MaxRooms, 1); - Maps = (MapData *)(*buffer); - - for (counter = 1; counter <= MaxRooms; counter++) { - swapUShortPtr(&Maps[counter].x, 4); - swapULong(&Maps[counter].MapFlags); - } - } else - return false; + delete mapFile; return true; } +static void freeMapData() { + delete[] Maps; + Maps = NULL; +} static uint16 fadeNumIn(uint16 num, uint16 res, uint16 counter) { @@ -543,7 +546,7 @@ static void getDownFloor(uint16 *Floor, bool *isfloor) { *isfloor = false; return; } else if (*Floor > UPPERFLOOR) { - /* LAB: Labyrinth specific code */ + // Labyrinth specific code if (*Floor == HEDGEMAZEFLOOR) *Floor = UPPERFLOOR; else if ((*Floor == CARNIVAL) || (*Floor == MEDMAZEFLOOR)) @@ -616,7 +619,7 @@ static void drawMap(uint16 CurRoom, uint16 CurMsg, uint16 Floor, bool fadeout, b else ghoastGadget(&downgadget, 12); - /* LAB: Labyrinth specific code */ + // Labyrinth specific code if (Floor == LOWERFLOOR) { if (onFloor(SURMAZEFLOOR)) drawImage(Maze, mapScaleX(538), mapScaleY(277)); @@ -634,7 +637,6 @@ static void drawMap(uint16 CurRoom, uint16 CurMsg, uint16 Floor, bool fadeout, b flowText(MsgFont, 0, 7, 0, true, true, true, true, mapScaleX(360), 0, mapScaleX(660), mapScaleY(450), sptr); } - switch (Floor) { case LOWERFLOOR: sptr = (char *)g_resource->getStaticText(kTextLowerFloor).c_str(); @@ -879,7 +881,7 @@ void doMap(uint16 CurRoom) { mouseHide(); setAPen(0); rectFill(0, 0, VGAScreenWidth - 1, VGAScreenHeight - 1); - freeAllStolenMem(); + freeMapData(); blackAllScreen(); mouseShow(); WSDL_UpdateScreen(); |