Commit fe5f4bab authored by alistert's avatar alistert

Implemented flipped tiles.

parent 351f3bec
......@@ -46,7 +46,6 @@ BaseLevel::BaseLevel () {
smoothfps = 50.0f;
paletteEffects = NULL;
tileSet = NULL;
spriteSet = NULL;
paused = false;
......@@ -67,8 +66,6 @@ BaseLevel::~BaseLevel () {
if (paletteEffects) delete paletteEffects;
if (tileSet) SDL_FreeSurface(tileSet);
if (spriteSet) delete[] spriteSet;
return;
......
......@@ -69,7 +69,6 @@ class BaseLevel {
SetupMenu setupMenu;
protected:
SDL_Surface* tileSet;
Sprite* spriteSet;
PaletteEffect* paletteEffects;
SDL_Color palette[256];
......
......@@ -374,6 +374,8 @@ Bonus::~Bonus () {
// Restore panelBigFont palette
panelBigFont->restorePalette();
SDL_FreeSurface(tileSet);
delete font;
return;
......
......@@ -57,6 +57,7 @@ class Font;
class Bonus : public BaseLevel {
private:
SDL_Surface* tileSet;
SDL_Surface* background;
Font* font;
Anim animSet[BANIMS];
......
......@@ -73,6 +73,17 @@ JJ2Layer::~JJ2Layer () {
}
bool JJ2Layer::getFlipped (int x, int y) {
// Get flipped. We aim to offend!
if ((x < 0) || (y < 0) || (x >= width) || (y >= height)) return false;
return grid[y][x].flipped;
}
int JJ2Layer::getHeight () {
return height;
......@@ -96,7 +107,47 @@ int JJ2Layer::getWidth () {
}
void JJ2Layer::draw (SDL_Surface* tileSet) {
void JJ2Layer::setFrame (unsigned char x, unsigned char y, unsigned char frame) {
grid[y][x].frame = frame;
return;
}
void JJ2Layer::setTile (unsigned char x, unsigned char y, unsigned short int tile, int tiles) {
JJ2GridElement* ge;
ge = grid[y] + x;
if (tiles > 0) {
ge->flipped = tile & 0x400;
ge->tile = tile & 0x3FF;
if (ge->tile > tiles) ge->tile = 0;
} else {
// TSF
ge->flipped = tile & 0x1000;
ge->tile = tile & 0xFFF;
if (ge->tile > -tiles) ge->tile = 0;
}
ge->frame = 0;
return;
}
void JJ2Layer::draw (SDL_Surface* tileSet, SDL_Surface* flippedTileSet) {
SDL_Rect src, dst;
int vX, vY;
......@@ -128,7 +179,7 @@ void JJ2Layer::draw (SDL_Surface* tileSet) {
dst.x = TTOI(x) - (vX & 31);
dst.y = TTOI(y) - (vY & 31);
src.y = TTOI(getTile(x + ITOT(vX), y + ITOT(vY)));
if (src.y) SDL_BlitSurface(tileSet, &src, canvas, &dst);
if (src.y) SDL_BlitSurface(getFlipped(x + ITOT(vX), y + ITOT(vY))? flippedTileSet: tileSet, &src, canvas, &dst);
}
......
......@@ -67,11 +67,15 @@ JJ2Level::~JJ2Level () {
for (count = 0; count < LAYERS; count++) delete layers[count];
delete[] flippedMask;
delete[] mask;
delete[] musicFile;
delete[] nextLevel;
SDL_FreeSurface(flippedTileSet);
SDL_FreeSurface(tileSet);
delete font;
// Restore panel font palette
......@@ -85,44 +89,56 @@ JJ2Level::~JJ2Level () {
bool JJ2Level::checkMaskUp (fixed x, fixed y) {
int tX, tY;
tX = FTOT(x);
tY = FTOT(y);
// Anything off the edge of the map is solid
if ((x < 0) || (y < 0) || (x >= TTOF(layers[3]->getWidth())) || (y >= TTOF(layers[3]->getHeight())))
if ((x < 0) || (y < 0) || (tX >= layer->getWidth()) || (tY >= layer->getHeight()))
return true;
// Event 1 is one-way
if (events[FTOT(y)][FTOT(x)].type == 1) return false;
if (events[tY][tX].type == 1) return false;
// Check the mask in the tile in question
return mask[(layers[3]->grid[FTOT(y)][FTOT(x)].tile << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
return (layer->getFlipped(tX, tY)? flippedMask: mask)[(layer->getTile(tX, tY) << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
}
bool JJ2Level::checkMaskDown (fixed x, fixed y) {
int tX, tY;
tX = FTOT(x);
tY = FTOT(y);
// Anything off the edge of the map is solid
if ((x < 0) || (y < 0) || (x >= TTOF(layers[3]->getWidth())) || (y >= TTOF(layers[3]->getHeight())))
if ((x < 0) || (y < 0) || (tX >= layer->getWidth()) || (tY >= layer->getHeight()))
return true;
// Check the mask in the tile in question
return mask[(layers[3]->grid[FTOT(y)][FTOT(x)].tile << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
return (layer->getFlipped(tX, tY)? flippedMask: mask)[(layer->getTile(tX, tY) << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
}
bool JJ2Level::checkSpikes (fixed x, fixed y) {
int tX, tY;
tX = FTOT(x);
tY = FTOT(y);
// Anything off the edge of the map is not spikes
if ((x < 0) || (y < 0) || (x > TTOF(layers[3]->getWidth())) || (y > TTOF(layers[3]->getHeight())))
return false;
// JJ2Layer::getTile while return the blank tile for these cases, so do not need to do anything
// Event 2 is spikes
if (events[FTOT(y)][FTOT(x)].type != 2) return false;
if (events[tY][tX].type != 2) return false;
// Check the mask in the tile in question
return mask[(layers[3]->grid[FTOT(y)][FTOT(x)].tile << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
return false;
return (layer->getFlipped(tX, tY)? flippedMask: mask)[(layer->getTile(tX, tY) << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
}
......@@ -155,7 +171,7 @@ void JJ2Level::setFrame (unsigned char gridX, unsigned char gridY, unsigned char
unsigned char buffer[MTL_L_GRID];
layers[3]->grid[gridY][gridX].frame = frame;
layer->setFrame(gridX, gridY, frame);
if (gameMode) {
......@@ -242,7 +258,7 @@ void JJ2Level::receive (unsigned char* buffer) {
case MT_L_GRID:
if (buffer[4] == 0) layers[3]->grid[buffer[3]][buffer[2]].frame = buffer[5];
if (buffer[4] == 0) layer->setFrame(buffer[2], buffer[3], buffer[5]);
break;
......
......@@ -51,6 +51,7 @@ typedef struct {
unsigned short int tile; // Indexes the tile set
unsigned char frame; // Current frame being used (for animated tiles)
bool flipped;
} JJ2GridElement;
......@@ -69,34 +70,41 @@ class Font;
class JJ2Layer {
private:
JJ2GridElement** grid;
int width, height;
public:
JJ2GridElement** grid;
JJ2Layer ();
JJ2Layer (int newWidth, int newHeight);
~JJ2Layer ();
bool getFlipped (int x, int y);
int getHeight ();
int getTile (int x, int y);
int getWidth ();
void setFrame (unsigned char x, unsigned char y, unsigned char frame);
void setTile (unsigned char x, unsigned char y, unsigned short int tile, int tiles);
void draw (SDL_Surface* tileSet);
void draw (SDL_Surface* tileSet, SDL_Surface* flippedTileSet);
};
class JJ2Level : public BaseLevel {
private:
SDL_Surface* tileSet;
SDL_Surface* flippedTileSet;
char* mask;
char* flippedMask;
char* musicFile;
char* nextLevel;
Anim animSet[128];
char* mask;
int soundMap[32];
JJ2Layer* layers[LAYERS];
JJ2Layer* layer;
JJ2Event** events;
int width, height;
bool TSF;
unsigned char difficulty;
fixed waterLevel;
fixed waterLevelTarget;
......
......@@ -104,7 +104,7 @@ void JJ2Level::draw () {
// Show background layers
for (x = 7; x >= 3; x--) layers[x]->draw(tileSet);
for (x = 7; x >= 3; x--) layers[x]->draw(tileSet, flippedTileSet);
// Calculate change since last step
......@@ -136,7 +136,7 @@ void JJ2Level::draw () {
// Show foreground layers
for (x = 2; x >= 0; x--) layers[x]->draw(tileSet);
for (x = 2; x >= 0; x--) layers[x]->draw(tileSet, flippedTileSet);
// Temporary lines showing the water level
......
......@@ -304,6 +304,22 @@ int JJ2Level::loadTiles (char* fileName) {
tileSet = createSurface(tileBuffer, TTOI(1), TTOI(tiles));
SDL_SetColorKey(tileSet, SDL_SRCCOLORKEY, 0);
// Flip tiles
for (count = 0; count < tiles * 32; count++) {
for (x = 0; x < 16; x++) {
y = tileBuffer[(count * 32) + x];
tileBuffer[(count * 32) + x] = tileBuffer[(count * 32) + 31 - x];
tileBuffer[(count * 32) + 31 - x] = y;
}
}
flippedTileSet = createSurface(tileBuffer, TTOI(1), TTOI(tiles));
SDL_SetColorKey(flippedTileSet, SDL_SRCCOLORKEY, 0);
delete[] tileBuffer;
......@@ -323,6 +339,19 @@ int JJ2Level::loadTiles (char* fileName) {
}
flippedMask = new char[tiles << 10];
// Unpack bits
for (count = 0; count < tiles; count++) {
for (y = 0; y < 32; y++) {
for (x = 0; x < 32; x++)
flippedMask[(count << 10) + (y << 5) + x] = (dBuffer[((int *)aBuffer)[257 + ((maxTiles * 11) >> 1) + count] + (y << 2) + (x >> 3)] >> (x & 7)) & 1;
}
}
delete[] dBuffer;
delete[] bBuffer;
......@@ -333,6 +362,7 @@ int JJ2Level::loadTiles (char* fileName) {
graphics during gameplay */
/*if (SDL_MUSTLOCK(tileSet)) SDL_LockSurface(tileSet);
if (SDL_MUSTLOCK(flippedTileSet)) SDL_LockSurface(flippedTileSet);
for (count = 0; count < tiles; count++) {
......@@ -341,7 +371,10 @@ int JJ2Level::loadTiles (char* fileName) {
for (x = 0; x < 32; x++) {
if (mask[(count << 10) + (y << 5) + x] == 1)
((char *)(tileSet->pixels))[(count << 10) + (y << 5) + x] = 88;
((char *)(tileSet->pixels))[(count << 10) + (y << 5) + x] = 43;
if (flippedMask[(count << 10) + (y << 5) + x] == 1)
((char *)(flippedTileSet->pixels))[(count << 10) + (y << 5) + x] = 88;
}
......@@ -349,10 +382,11 @@ int JJ2Level::loadTiles (char* fileName) {
}
if (SDL_MUSTLOCK(tileSet)) SDL_UnlockSurface(tileSet);*/
if (SDL_MUSTLOCK(tileSet)) SDL_UnlockSurface(tileSet);
if (SDL_MUSTLOCK(flippedTileSet)) SDL_UnlockSurface(flippedTileSet);*/
return tiles;
return tiles | (maxTiles << 16);
}
......@@ -463,6 +497,9 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
}
TSF = tiles >> 28;
tiles = tiles & 0xFFFF;
// Next level
nextLevel = createString((char *)aBuffer + 115);
......@@ -502,10 +539,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
if ((x & 3) == 0) memcpy(tileQuad, cBuffer + (quadRefs[x >> 2] << 3), 8);
layers[count]->grid[y][x].tile = tileQuad[(x & 3) << 1] + (tileQuad[((x & 3) << 1) + 1] << 8);
layers[count]->grid[y][x].frame = 0;
if (layers[count]->grid[y][x].tile > tiles) layers[count]->grid[y][x].tile = 0;
layers[count]->setTile(x, y, tileQuad[(x & 3) << 1] + (tileQuad[((x & 3) << 1) + 1] << 8), TSF? -tiles: tiles);
}
......@@ -523,6 +557,8 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
}
layer = layers[3];
// Load events
startX = 0;
......@@ -591,11 +627,15 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
for (count = 0; count < LAYERS; count++) delete layers[count];
delete[] flippedMask;
delete[] mask;
delete[] musicFile;
delete[] nextLevel;
SDL_FreeSurface(flippedTileSet);
SDL_FreeSurface(tileSet);
delete font;
return e;
......@@ -624,11 +664,15 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
for (x = 0; x < LAYERS; x++) delete layers[x];
delete[] flippedMask;
delete[] mask;
delete[] musicFile;
delete[] nextLevel;
SDL_FreeSurface(flippedTileSet);
SDL_FreeSurface(tileSet);
delete font;
return count;
......
......@@ -116,6 +116,8 @@ Level::~Level () {
delete[] sceneFile;
delete[] musicFile;
SDL_FreeSurface(tileSet);
deletePanel();
delete font;
......
......@@ -94,6 +94,7 @@ class Scene;
class Level : public BaseLevel {
private:
SDL_Surface* tileSet;
SDL_Surface* panel;
SDL_Surface* panelAmmo[5];
char* musicFile;
......
......@@ -619,6 +619,7 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
if (count < 0) {
SDL_FreeSurface(tileSet);
delete file;
deletePanel();
delete font;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment