123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- #include "palcommon.h"
- #include "map.h"
- LPPALMAP
- PAL_LoadMap(
- INT iMapNum,
- FILE *fpMapMKF,
- FILE *fpGopMKF
- )
- {
- LPBYTE buf;
- INT size, i, j;
- LPPALMAP map;
-
-
-
- if (iMapNum >= PAL_MKFGetChunkCount(fpMapMKF) ||
- iMapNum >= PAL_MKFGetChunkCount(fpGopMKF) ||
- iMapNum <= 0)
- {
- return NULL;
- }
-
-
-
- size = PAL_MKFGetChunkSize(iMapNum, fpMapMKF);
-
-
-
- buf = (LPBYTE)malloc(size);
- if (buf == NULL)
- {
- return NULL;
- }
-
-
-
- map = (LPPALMAP)malloc(sizeof(PALMAP));
- if (map == NULL)
- {
- return NULL;
- }
-
-
-
- if (PAL_MKFReadChunk(buf, size, iMapNum, fpMapMKF) < 0)
- {
- free(buf);
- free(map);
- return NULL;
- }
-
-
-
- if (Decompress(buf, (LPBYTE)(map->Tiles), sizeof(map->Tiles)) < 0)
- {
- free(map);
- free(buf);
- return NULL;
- }
-
-
-
- free(buf);
-
-
-
- for (i = 0; i < 128; i++)
- {
- for (j = 0; j < 64; j++)
- {
- map->Tiles[i][j][0] = SWAP32(map->Tiles[i][j][0]);
- map->Tiles[i][j][1] = SWAP32(map->Tiles[i][j][1]);
- }
- }
-
-
-
- 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;
- }
-
-
-
- map->iMapNum = iMapNum;
- return map;
- }
- VOID
- PAL_FreeMap(
- LPPALMAP lpMap
- )
- {
-
-
-
- if (lpMap == NULL)
- {
- return;
- }
-
-
-
- if (lpMap->pTileSprite != NULL)
- {
- free(lpMap->pTileSprite);
- }
-
-
-
- free(lpMap);
- }
- LPCBITMAPRLE
- PAL_MapGetTileBitmap(
- BYTE x,
- BYTE y,
- BYTE h,
- BYTE ucLayer,
- LPCPALMAP lpMap
- )
- {
- DWORD d;
-
-
-
- if (x >= 64 || y >= 128 || h > 1 || lpMap == NULL)
- {
- return NULL;
- }
-
-
-
- d = lpMap->Tiles[y][x][h];
- if (ucLayer == 0)
- {
-
-
-
- return PAL_SpriteGetFrame(lpMap->pTileSprite, (d & 0xFF) | ((d >> 4) & 0x100));
- }
- else
- {
-
-
-
- d >>= 16;
- return PAL_SpriteGetFrame(lpMap->pTileSprite, ((d & 0xFF) | ((d >> 4) & 0x100)) - 1);
- }
- }
- BOOL
- PAL_MapTileIsBlocked(
- BYTE x,
- BYTE y,
- BYTE h,
- LPCPALMAP lpMap
- )
- {
-
-
-
- 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
- )
- {
- DWORD d;
-
-
-
- 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
- )
- {
- int sx, sy, dx, dy, x, y, h, xPos, yPos;
- LPCBITMAPRLE lpBitmap = NULL;
-
-
-
- sy = lpSrcRect->y / 16 - 1;
- dy = (lpSrcRect->y + lpSrcRect->h) / 16 + 2;
- sx = lpSrcRect->x / 32 - 1;
- dx = (lpSrcRect->x + lpSrcRect->w) / 32 + 2;
-
-
-
- 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));
- }
- }
- }
- }
|