Commit eadb31ed authored by alistert's avatar alistert

Added support for start position, one-way and spike events to JJ2 levels.

parent 0faba79b
...@@ -46,6 +46,8 @@ BaseLevel::BaseLevel () { ...@@ -46,6 +46,8 @@ BaseLevel::BaseLevel () {
smoothfps = 50.0f; smoothfps = 50.0f;
paletteEffects = NULL; paletteEffects = NULL;
tileSet = NULL;
spriteSet = NULL;
paused = false; paused = false;
...@@ -65,9 +67,9 @@ BaseLevel::~BaseLevel () { ...@@ -65,9 +67,9 @@ BaseLevel::~BaseLevel () {
if (paletteEffects) delete paletteEffects; if (paletteEffects) delete paletteEffects;
SDL_FreeSurface(tileSet); if (tileSet) SDL_FreeSurface(tileSet);
delete[] spriteSet; if (spriteSet) delete[] spriteSet;
return; return;
......
...@@ -62,6 +62,9 @@ JJ2Level::~JJ2Level () { ...@@ -62,6 +62,9 @@ JJ2Level::~JJ2Level () {
int count; int count;
delete[] *events;
delete[] events;
for (count = 0; count < LAYERS; count++) delete layers[count]; for (count = 0; count < LAYERS; count++) delete layers[count];
delete[] mask; delete[] mask;
...@@ -82,19 +85,15 @@ JJ2Level::~JJ2Level () { ...@@ -82,19 +85,15 @@ JJ2Level::~JJ2Level () {
bool JJ2Level::checkMaskUp (fixed x, fixed y) { bool JJ2Level::checkMaskUp (fixed x, fixed y) {
JJ2GridElement *ge;
// Anything off the edge of the map is solid // 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) || (x >= TTOF(layers[3]->getWidth())) || (y >= TTOF(layers[3]->getHeight())))
return true; return true;
ge = layers[3]->grid[FTOT(y)] + FTOT(x); // Event 1 is one-way
if (events[FTOT(y)][FTOT(x)].type == 1) return false;
// Event 122 is one-way
//if (ge->event == 122) return false;
// Check the mask in the tile in question // Check the mask in the tile in question
return mask[(ge->tile << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)]; return mask[(layers[3]->grid[FTOT(y)][FTOT(x)].tile << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
} }
...@@ -113,19 +112,15 @@ bool JJ2Level::checkMaskDown (fixed x, fixed y) { ...@@ -113,19 +112,15 @@ bool JJ2Level::checkMaskDown (fixed x, fixed y) {
bool JJ2Level::checkSpikes (fixed x, fixed y) { bool JJ2Level::checkSpikes (fixed x, fixed y) {
JJ2GridElement *ge;
// Anything off the edge of the map is not spikes // 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()))) if ((x < 0) || (y < 0) || (x > TTOF(layers[3]->getWidth())) || (y > TTOF(layers[3]->getHeight())))
return false; return false;
ge = layers[3]->grid[FTOT(y)] + FTOT(x); // Event 2 is spikes
if (events[FTOT(y)][FTOT(x)].type != 2) return false;
// Event 126 is spikes
//if (ge->event != 126) return false;
// Check the mask in the tile in question // Check the mask in the tile in question
//return mask[(ge->tile << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)]; return mask[(layers[3]->grid[FTOT(y)][FTOT(x)].tile << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
return false; return false;
......
...@@ -54,6 +54,13 @@ typedef struct { ...@@ -54,6 +54,13 @@ typedef struct {
} JJ2GridElement; } JJ2GridElement;
typedef struct {
unsigned char type;
unsigned char data[3];
} JJ2Event;
// Classes // Classes
...@@ -88,6 +95,8 @@ class JJ2Level : public BaseLevel { ...@@ -88,6 +95,8 @@ class JJ2Level : public BaseLevel {
char* mask; char* mask;
int soundMap[32]; int soundMap[32];
JJ2Layer* layers[LAYERS]; JJ2Layer* layers[LAYERS];
JJ2Event** events;
int width, height;
unsigned char difficulty; unsigned char difficulty;
fixed waterLevel; fixed waterLevel;
fixed waterLevelTarget; fixed waterLevelTarget;
......
...@@ -88,7 +88,7 @@ int JJ2Level::step () { ...@@ -88,7 +88,7 @@ int JJ2Level::step () {
void JJ2Level::draw () { void JJ2Level::draw () {
int count, energy; int x, y;
unsigned int change; unsigned int change;
...@@ -98,25 +98,45 @@ void JJ2Level::draw () { ...@@ -98,25 +98,45 @@ void JJ2Level::draw () {
// Ensure the new viewport is within the level // Ensure the new viewport is within the level
if (viewX < 0) viewX = 0; if (viewX < 0) viewX = 0;
if (FTOI(viewX) + viewW >= TTOI(layers[3]->getWidth())) viewX = ITOF(TTOI(layers[3]->getWidth()) - viewW); if (FTOI(viewX) + viewW >= TTOI(width)) viewX = ITOF(TTOI(width) - viewW);
if (viewY < 0) viewY = 0; if (viewY < 0) viewY = 0;
if (FTOI(viewY) + viewH >= TTOI(layers[3]->getHeight())) viewY = ITOF(TTOI(layers[3]->getHeight()) - viewH); if (FTOI(viewY) + viewH >= TTOI(height)) viewY = ITOF(TTOI(height) - viewH);
// Show background layers // Show background layers
for (count = 7; count >= 3; count--) layers[count]->draw(tileSet); for (x = 7; x >= 3; x--) layers[x]->draw(tileSet);
// Calculate change since last step // Calculate change since last step
change = paused? 0: ticks - prevStepTicks; change = paused? 0: ticks - prevStepTicks;
// Show the events
/*for (y = 0; y < ITOT(viewH); y++) {
for (x = 0; x < ITOT(viewW ); x++) {
if (events[y + FTOT(viewY)][x + FTOT(viewX)].type > 2)
drawRect(8 + TTOI(x) - (FTOI(viewX) & 31), 8 + TTOI(y) - (FTOI(viewY) & 31), 16, 16, events[y + FTOT(viewY)][x + FTOT(viewX)].type);
}
}*/
// Show the players // Show the players
for (count = 0; count < nPlayers; count++) players[count].getJJ2LevelPlayer()->draw(ticks, change); for (x = 0; x < nPlayers; x++) {
players[x].getJJ2LevelPlayer()->draw(ticks, change);
// Show type of overlapping event
//panelBigFont->showNumber(events[FTOT(players[x].getJJ2LevelPlayer()->getY() + PYO_MID)][FTOT(players[x].getJJ2LevelPlayer()->getX() + PXO_MID)].type, viewW >> 1, viewH >> 1);
}
// Show foreground layers // Show foreground layers
for (count = 2; count >= 0; count--) layers[count]->draw(tileSet); for (x = 2; x >= 0; x--) layers[x]->draw(tileSet);
// Temporary lines showing the water level // Temporary lines showing the water level
...@@ -135,11 +155,11 @@ void JJ2Level::draw () { ...@@ -135,11 +155,11 @@ void JJ2Level::draw () {
// Draw hearts // Draw hearts
energy = localPlayer->getJJ2LevelPlayer()->getEnergy(); x = localPlayer->getJJ2LevelPlayer()->getEnergy();
for (count = 1; count <= energy; count++) { for (y = 1; y <= x; y++) {
drawRect(viewW - (count * 12), 4, 8, 8, 48); drawRect(viewW - (y * 12), 4, 8, 8, 48);
} }
......
...@@ -363,6 +363,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -363,6 +363,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
unsigned char *buffer; unsigned char *buffer;
char *string; char *string;
unsigned char* aBuffer; unsigned char* aBuffer;
unsigned char* bBuffer;
unsigned char* cBuffer; unsigned char* cBuffer;
unsigned char* dBuffer; unsigned char* dBuffer;
int aCLength, bCLength, cCLength, dCLength; int aCLength, bCLength, cCLength, dCLength;
...@@ -371,7 +372,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -371,7 +372,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
int count, x, y; int count, x, y;
unsigned char tileQuad[8]; unsigned char tileQuad[8];
short int* quadRefs; short int* quadRefs;
int width, pitch, height; int layerWidth, pitch, layerHeight;
int worldNum; int worldNum;
unsigned char startX, startY; unsigned char startX, startY;
...@@ -439,7 +440,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -439,7 +440,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
dLength = file->loadInt(); dLength = file->loadInt();
aBuffer = file->loadLZ(aCLength, aLength); aBuffer = file->loadLZ(aCLength, aLength);
file->seek(bCLength, false); // Don't use this block yet bBuffer = file->loadLZ(bCLength, bLength);
cBuffer = file->loadLZ(cCLength, cLength); cBuffer = file->loadLZ(cCLength, cLength);
dBuffer = file->loadLZ(dCLength, dLength); dBuffer = file->loadLZ(dCLength, dLength);
...@@ -453,6 +454,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -453,6 +454,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
delete[] dBuffer; delete[] dBuffer;
delete[] cBuffer; delete[] cBuffer;
delete[] bBuffer;
delete[] aBuffer; delete[] aBuffer;
delete font; delete font;
...@@ -479,17 +481,24 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -479,17 +481,24 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
for (count = 0; count < LAYERS; count++) { for (count = 0; count < LAYERS; count++) {
width = ((int *)(aBuffer + 8443 + 8))[count]; layerWidth = ((int *)(aBuffer + 8443 + 8))[count];
pitch = ((int *)(aBuffer + 8443 + 40))[count]; pitch = ((int *)(aBuffer + 8443 + 40))[count];
height = ((int *)(aBuffer + 8443 + 72))[count]; layerHeight = ((int *)(aBuffer + 8443 + 72))[count];
if (count == 3) {
width = layerWidth;
height = layerHeight;
}
if (aBuffer[8443 + count]) { if (aBuffer[8443 + count]) {
layers[count] = new JJ2Layer(width, height); layers[count] = new JJ2Layer(layerWidth, layerHeight);
for (y = 0; y < height; y++) { for (y = 0; y < layerHeight; y++) {
for (x = 0; x < layers[count]->getWidth(); x++) { for (x = 0; x < layerWidth; x++) {
if ((x & 3) == 0) memcpy(tileQuad, cBuffer + (quadRefs[x >> 2] << 3), 8); if ((x & 3) == 0) memcpy(tileQuad, cBuffer + (quadRefs[x >> 2] << 3), 8);
...@@ -515,6 +524,41 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -515,6 +524,41 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
} }
// Load events
startX = 0;
startY = 0;
events = new JJ2Event *[height];
*events = new JJ2Event[width * height];
for (y = 0; y < height; y++) {
events[y] = events[0] + (y * width);
for (x = 0; x < width; x++) {
events[y][x].type = bBuffer[((y * width) + x) << 2];
events[y][x].data[0] = bBuffer[(((y * width) + x) << 2) + 1];
events[y][x].data[1] = bBuffer[(((y * width) + x) << 2) + 2];
events[y][x].data[2] = bBuffer[(((y * width) + x) << 2) + 3];
if (events[y][x].type == 29) {
startX = x;
startY = y;
}
}
}
delete[] dBuffer;
delete[] cBuffer;
delete[] bBuffer;
delete[] aBuffer;
// Open JJ1 level file for remaining data // Open JJ1 level file for remaining data
...@@ -542,14 +586,15 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -542,14 +586,15 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
delete[] string; delete[] string;
delete[] musicFile; delete[] *events;
delete[] nextLevel; delete[] events;
SDL_FreeSurface(tileSet); for (count = 0; count < LAYERS; count++) delete layers[count];
delete[] dBuffer; delete[] mask;
delete[] cBuffer;
delete[] aBuffer; delete[] musicFile;
delete[] nextLevel;
delete font; delete font;
...@@ -574,14 +619,15 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -574,14 +619,15 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
delete file; delete file;
delete[] musicFile; delete[] *events;
delete[] nextLevel; delete[] events;
SDL_FreeSurface(tileSet); for (x = 0; x < LAYERS; x++) delete layers[x];
delete[] dBuffer; delete[] mask;
delete[] cBuffer;
delete[] aBuffer; delete[] musicFile;
delete[] nextLevel;
delete font; delete font;
...@@ -720,9 +766,6 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -720,9 +766,6 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
} }
// Set the players' initial values // Set the players' initial values
startX = 10;
startY = 5;
if (game) { if (game) {
if (!checkpoint) game->setCheckpoint(startX, startY); if (!checkpoint) game->setCheckpoint(startX, startY);
......
...@@ -512,7 +512,6 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -512,7 +512,6 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
if (count < 0) { if (count < 0) {
SDL_FreeSurface(tileSet);
delete file; delete file;
delete font; delete font;
......
...@@ -685,17 +685,12 @@ void JJ2LevelPlayer::draw (unsigned int ticks, int change) { ...@@ -685,17 +685,12 @@ void JJ2LevelPlayer::draw (unsigned int ticks, int change) {
// Show the player // Show the player
// Flash red if hurt, otherwise use player colour // Use player colour
if ((reaction == JJ2PR_HURT) && (!((ticks / 30) & 3)))
an->flashPalette(36);
else {
an->setPalette(palette, 23, 41); an->setPalette(palette, 23, 41);
an->setPalette(palette, 88, 8); an->setPalette(palette, 88, 8);
} // Flash on and off if hurt
if ((reaction != JJ2PR_HURT) || ((ticks / 30) & 2)) {
// Draw "motion blur" // Draw "motion blur"
if (fastFeetTime > ticks) an->draw(drawX - (dx >> 6), drawY); if (fastFeetTime > ticks) an->draw(drawX - (dx >> 6), drawY);
...@@ -703,9 +698,7 @@ void JJ2LevelPlayer::draw (unsigned int ticks, int change) { ...@@ -703,9 +698,7 @@ void JJ2LevelPlayer::draw (unsigned int ticks, int change) {
// Draw player // Draw player
an->draw(drawX, drawY); an->draw(drawX, drawY);
}
// Remove red flash or player colour from sprite
an->restorePalette();
// Uncomment the following to see the area of the player // Uncomment the following to see the area of the player
......
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