123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- /* -*- mode: c; tab-width: 4; c-basic-offset: 4; c-file-style: "linux" -*- */
- //
- // Copyright (c) 2009-2011, Wei Mingzhi <whistler_wmz@users.sf.net>.
- // Copyright (c) 2011-2017, SDLPAL development team.
- // All rights reserved.
- //
- // This file is part of SDLPAL.
- //
- // SDLPAL is free software: you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with this program. If not, see <http://www.gnu.org/licenses/>.
- //
- #include "palcommon.h"
- #include "map.h"
- LPPALMAP
- PAL_LoadMap(
- INT iMapNum,
- FILE *fpMapMKF,
- FILE *fpGopMKF
- )
- /*++
- Purpose:
- Load the specified map from the MKF file, as well as the tile bitmaps.
- Parameters:
- [IN] iMapNum - Number of the map to load.
- [IN] fpMapMKF - Pointer to the fopen'ed map.mkf file, which
- contains the map tile data.
- [IN] fpGopMKF - Pointer to the fopen'ed gop.mkf file, which
- contains the tile bitmaps. The bitmap can be read
- by PAL_SpriteGetFrame() function.
- Return value:
- Pointer to the loaded map. NULL if failed.
- --*/
- {
- LPBYTE buf;
- INT size, i, j;
- LPPALMAP map;
- //
- // Check for invalid map number.
- //
- if (iMapNum >= PAL_MKFGetChunkCount(fpMapMKF) ||
- iMapNum >= PAL_MKFGetChunkCount(fpGopMKF) ||
- iMapNum <= 0)
- {
- return NULL;
- }
- //
- // Load the map tile data.
- //
- size = PAL_MKFGetChunkSize(iMapNum, fpMapMKF);
- //
- // Allocate a temporary buffer for the compressed data.
- //
- buf = (LPBYTE)malloc(size);
- if (buf == NULL)
- {
- return NULL;
- }
- //
- // Create the map instance.
- //
- map = (LPPALMAP)malloc(sizeof(PALMAP));
- if (map == NULL)
- {
- return NULL;
- }
- //
- // Read the map data.
- //
- if (PAL_MKFReadChunk(buf, size, iMapNum, fpMapMKF) < 0)
- {
- free(buf);
- free(map);
- return NULL;
- }
- //
- // Decompress the tile data.
- //
- if (Decompress(buf, (LPBYTE)(map->Tiles), sizeof(map->Tiles)) < 0)
- {
- free(map);
- free(buf);
- return NULL;
- }
- //
- // The compressed data is useless now; delete it.
- //
- free(buf);
- //
- // Adjust the endianness of the decompressed data.
- //
- for (i = 0; i < 128; i++)
- {
- for (j = 0; j < 64; j++)
- {
- map->Tiles[i][j][0] = SDL_SwapLE32(map->Tiles[i][j][0]);
- map->Tiles[i][j][1] = SDL_SwapLE32(map->Tiles[i][j][1]);
- }
- }
- //
- // Load the tile bitmaps.
- //
- size = PAL_MKFGetChunkSize(iMapNum, fpGopMKF);
- if (size <= 0)
- {
- free(map);
- return NULL;
- }
- map->pTileSprite = (LPSPRITE)malloc(size);
- if (map->pTileSprite == NULL)
- {
- free(map);
- return NULL;
- }
- if (PAL_MKFReadChunk(map->pTileSprite, size, iMapNum, fpGopMKF) < 0)
- {
- free(map);
- return NULL;
- }
- //
- // Done.
- //
- map->iMapNum = iMapNum;
- return map;
- }
- VOID
- PAL_FreeMap(
- LPPALMAP lpMap
- )
- /*++
- Purpose:
- Free a loaded map, as well as the tile bitmaps.
- Parameters:
- [IN] lpMap - Pointer to the loaded map structure.
- Return value:
- None.
- --*/
- {
- //
- // Check for NULL pointer.
- //
- if (lpMap == NULL)
- {
- return;
- }
- //
- // Free the tile bitmaps.
- //
- if (lpMap->pTileSprite != NULL)
- {
- free(lpMap->pTileSprite);
- }
- //
- // Delete the instance.
- //
- free(lpMap);
- }
- LPCBITMAPRLE
- PAL_MapGetTileBitmap(
- BYTE x,
- BYTE y,
- BYTE h,
- BYTE ucLayer,
- LPCPALMAP lpMap
- )
- /*++
- Purpose:
- Get the tile bitmap on the specified layer at the location (x, y, h).
- Parameters:
- [IN] x - Column number of the tile.
- [IN] y - Line number in the map.
- [IN] h - Each line in the map has two lines of tiles, 0 and 1.
- (See map.h for details.)
- [IN] ucLayer - The layer. 0 for bottom, 1 for top.
- [IN] lpMap - Pointer to the loaded map.
- Return value:
- Pointer to the bitmap. NULL if failed.
- --*/
- {
- DWORD d;
- //
- // Check for invalid parameters.
- //
- if (x >= 64 || y >= 128 || h > 1 || lpMap == NULL)
- {
- return NULL;
- }
- //
- // Get the tile data of the specified location.
- //
- d = lpMap->Tiles[y][x][h];
- if (ucLayer == 0)
- {
- //
- // Bottom layer
- //
- return PAL_SpriteGetFrame(lpMap->pTileSprite, (d & 0xFF) | ((d >> 4) & 0x100));
- }
- else
- {
- //
- // Top layer
- //
- d >>= 16;
- return PAL_SpriteGetFrame(lpMap->pTileSprite, ((d & 0xFF) | ((d >> 4) & 0x100)) - 1);
- }
- }
- BOOL
- PAL_MapTileIsBlocked(
- BYTE x,
- BYTE y,
- BYTE h,
- LPCPALMAP lpMap
- )
- /*++
- Purpose:
- Check if the tile at the specified location is blocked.
- Parameters:
- [IN] x - Column number of the tile.
- [IN] y - Line number in the map.
- [IN] h - Each line in the map has two lines of tiles, 0 and 1.
- (See map.h for details.)
- [IN] lpMap - Pointer to the loaded map.
- Return value:
- TRUE if the tile is blocked, FALSE if not.
- --*/
- {
- //
- // Check for invalid parameters.
- //
- if (x >= 64 || y >= 128 || h > 1 || lpMap == NULL)
- {
- return TRUE;
- }
- return (lpMap->Tiles[y][x][h] & 0x2000) >> 13;
- }
- BYTE
- PAL_MapGetTileHeight(
- BYTE x,
- BYTE y,
- BYTE h,
- BYTE ucLayer,
- LPCPALMAP lpMap
- )
- /*++
- Purpose:
- Get the logical height value of the specified tile. This value is used
- to judge whether the tile bitmap should cover the sprites or not.
- Parameters:
- [IN] x - Column number of the tile.
- [IN] y - Line number in the map.
- [IN] h - Each line in the map has two lines of tiles, 0 and 1.
- (See map.h for details.)
- [IN] ucLayer - The layer. 0 for bottom, 1 for top.
- [IN] lpMap - Pointer to the loaded map.
- Return value:
- The logical height value of the specified tile.
- --*/
- {
- DWORD d;
- //
- // Check for invalid parameters.
- //
- if (y >= 128 || x >= 64 || h > 1 || lpMap == NULL)
- {
- return 0;
- }
- d = lpMap->Tiles[y][x][h];
- if (ucLayer)
- {
- d >>= 16;
- }
- d >>= 8;
- return (BYTE)(d & 0xf);
- }
- VOID
- PAL_MapBlitToSurface(
- LPCPALMAP lpMap,
- SDL_Surface *lpSurface,
- const SDL_Rect *lpSrcRect,
- BYTE ucLayer
- )
- /*++
- Purpose:
- Blit the specified map area to a SDL Surface.
- Parameters:
- [IN] lpMap - Pointer to the map.
- [OUT] lpSurface - Pointer to the destination surface.
- [IN] lpSrcRect - Pointer to the source area.
- [IN] ucLayer - The layer. 0 for bottom, 1 for top.
- Return value:
- None.
- --*/
- {
- int sx, sy, dx, dy, x, y, h, xPos, yPos;
- LPCBITMAPRLE lpBitmap = NULL;
- //
- // Convert the coordinate
- //
- sy = lpSrcRect->y / 16 - 1;
- dy = (lpSrcRect->y + lpSrcRect->h) / 16 + 2;
- sx = lpSrcRect->x / 32 - 1;
- dx = (lpSrcRect->x + lpSrcRect->w) / 32 + 2;
- //
- // Do the drawing.
- //
- yPos = sy * 16 - 8 - lpSrcRect->y;
- for (y = sy; y < dy; y++)
- {
- for (h = 0; h < 2; h++, yPos += 8)
- {
- xPos = sx * 32 + h * 16 - 16 - lpSrcRect->x;
- for (x = sx; x < dx; x++, xPos += 32)
- {
- lpBitmap = PAL_MapGetTileBitmap((BYTE)x, (BYTE)y, (BYTE)h, ucLayer, lpMap);
- if (lpBitmap == NULL)
- {
- if (ucLayer)
- {
- continue;
- }
- lpBitmap = PAL_MapGetTileBitmap(0, 0, 0, ucLayer, lpMap);
- }
- PAL_RLEBlitToSurface(lpBitmap, lpSurface, PAL_XY(xPos, yPos));
- }
- }
- }
- }
|