Commit f1bbcd3a authored by alistert's avatar alistert

More JJ2 events.

parent e34e2bf4
......@@ -45,11 +45,14 @@ JJ2Event* JJ2Event::step (int ticks, int msps) {
switch (type) {
case 60: // Frozen green spring
case 62: // Spring crate
case 83: // Checkpoint
case 85: // Red spring
case 86: // Green spring
case 87: // Blue spring
if (!jj2Level->checkMaskDown(x, y + F8)) y += F8;
if (!jj2Level->checkMaskDown(x, y + F1, true)) y += F1;
break;
......@@ -99,6 +102,24 @@ void JJ2Event::draw (int change) {
switch (type) {
case 60: // Frozen green spring
an = jj2Level->getAnim(35);
break;
case 62: // Spring crate
an = jj2Level->getAnim(37);
break;
case 83: // Checkpoint
an = jj2Level->getAnim(49);
break;
case 85: // Red spring
an = jj2Level->getAnim(32);
......
......@@ -102,32 +102,38 @@ bool JJ2Level::checkMaskUp (fixed x, fixed y) {
if ((x < 0) || (y < 0) || (tX >= layer->getWidth()) || (tY >= layer->getHeight()))
return true;
// Event 1 is one-way
if (mods[tY][tX].type == 1) return false;
// Event 1 is one-way
// Event 3 is vine
// Event 4 is hook
if ((mods[tY][tX].type == 1) || (mods[tY][tX].type == 3) || (mods[tY][tX].type == 4)) return false;
// Check the mask in the tile in question
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) {
bool JJ2Level::checkMaskDown (fixed x, fixed y, bool drop) {
int tX, tY;
tX = FTOT(x);
tY = FTOT(y);
// Anything off the edge of the map is solid
if ((x < 0) || (y < 0) || (tX >= layer->getWidth()) || (tY >= layer->getHeight()))
return true;
// Check the mask in the tile in question
return (layer->getFlipped(tX, tY)? flippedMask: mask)[(layer->getTile(tX, tY) << 10) + ((y >> 5) & 992) + ((x >> 10) & 31)];
}
// Anything off the edge of the map is solid
if ((x < 0) || (y < 0) || (tX >= layer->getWidth()) || (tY >= layer->getHeight()))
return true;
// Event 3 is vine
// Event 4 is hook
if (drop && ((mods[tY][tX].type == 3) || (mods[tY][tX].type == 4))) return false;
// Check the mask in the tile in question
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;
......@@ -195,6 +201,13 @@ void JJ2Level::setFrame (unsigned char gridX, unsigned char gridY, unsigned char
}
JJ2Modifier* JJ2Level::getModifier (unsigned char gridX, unsigned char gridY) {
return mods[gridY] + gridX;
}
Sprite* JJ2Level::getSprite (unsigned char sprite) {
......@@ -358,8 +371,12 @@ int JJ2Level::play () {
// The level is over, so draw gem counts
returnTime = ticks + 1000;
playSound(S_UPLOOP);
if (!returnTime) {
returnTime = ticks + 3000;
playSound(S_UPLOOP);
}
// Display statistics
......
......@@ -118,6 +118,7 @@ class JJ2Level : public BaseLevel {
int loadSprites (char* fileName);
int loadTiles (char* fileName);
int load (char* fileName, unsigned char diff, bool checkpoint);
int step ();
void draw ();
......@@ -125,17 +126,20 @@ class JJ2Level : public BaseLevel {
JJ2Level (char* fileName, unsigned char diff, bool checkpoint);
~JJ2Level ();
bool checkMaskUp (fixed x, fixed y);
bool checkMaskDown (fixed x, fixed y);
bool checkSpikes (fixed x, fixed y);
void setNext (char* fileName);
void setFrame (unsigned char gridX, unsigned char gridY, unsigned char frame);
Sprite* getSprite (unsigned char sprite);
Anim* getAnim (unsigned char anim);
void setWaterLevel (unsigned char gridY);
fixed getWaterLevel ();
void receive (unsigned char* buffer);
int play ();
bool checkMaskDown (fixed x, fixed y, bool drop);
bool checkMaskUp (fixed x, fixed y);
bool checkSpikes (fixed x, fixed y);
Anim* getAnim (unsigned char anim);
JJ2Modifier* getModifier (unsigned char gridX, unsigned char gridY);
Sprite* getSprite (unsigned char sprite);
fixed getWaterLevel ();
void setFrame (unsigned char gridX, unsigned char gridY, unsigned char frame);
void setNext (char* fileName);
void setWaterLevel (unsigned char gridY);
void receive (unsigned char* buffer);
int play ();
};
......
......@@ -503,7 +503,10 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
// Next level
nextLevel = createString((char *)aBuffer + 115);
string = (char *)aBuffer + 115;
if (fileExists(string)) nextLevel = createString(string);
else nextLevel = createString(string, ".j2l");
// Music file
......@@ -574,7 +577,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
count = bBuffer[((y * width) + x) << 2];
if (count < 33) {
if ((count < 33) || (count == 230)) {
mods[y][x].type = count;
mods[y][x].property = bBuffer[(((y * width) + x) << 2) + 1];
......
......@@ -129,6 +129,7 @@ JJ2LevelPlayer::~JJ2LevelPlayer () {
void JJ2LevelPlayer::reset (unsigned char startX, unsigned char startY) {
event = NULL;
mod = NULL;
energy = 5;
floating = false;
facing = true;
......@@ -138,7 +139,7 @@ void JJ2LevelPlayer::reset (unsigned char startX, unsigned char startY) {
jumpHeight = ITOF(92);
jumpY = TTOF(256);
fastFeetTime = 0;
warpTime = 0;
stopTime = 0;
dx = 0;
dy = 0;
x = TTOF(startX);
......@@ -317,16 +318,36 @@ bool JJ2LevelPlayer::touchEvent (JJ2Event* touched, unsigned int ticks, int msps
switch (touched->getType()) {
case 60: // Frozen green spring
jumpY = y - TTOF(14);
event = touched;
break;
case 62: // Spring crate
jumpY = y - TTOF(18);
event = touched;
break;
case 83: // Checkpoint
game->setCheckpoint(FTOT(x + PXO_MID), FTOT(y + PYO_MID));
break;
case 85: // Red spring
jumpY = y - TTOF(6);
jumpY = y - TTOF(7);
event = touched;
break;
case 86: // Green spring
jumpY = y - TTOF(12);
jumpY = y - TTOF(14);
event = touched;
break;
......
......@@ -31,6 +31,7 @@
#include "player.h"
#include "jj2level/jj2level.h"
#include "level/movable.h"
#include "OpenJazz.h"
......@@ -138,6 +139,12 @@
#define PYS_SINK ITOF(150)
#define PYS_JUMP ITOF(-350)
#define PXS_POLE ITOF(3000)
#define PYS_POLE ITOF(1000)
#define PYS_RSPRING ITOF(-500)
#define PYS_GSPRING ITOF(-600)
#define PYS_BSPRING ITOF(-700)
// Player accelerations
#define PXA_REVERSE 900
#define PXA_STOP 1000
......@@ -172,6 +179,7 @@ class JJ2LevelPlayer : public Movable {
private:
bool bird; // Placeholder for eventual JJ2Bird object
JJ2Modifier* mod;
JJ2Event* event;
SDL_Color palette[256];
char anims[PANIMS];
......@@ -187,8 +195,7 @@ class JJ2LevelPlayer : public Movable {
fixed jumpHeight;
fixed jumpY;
unsigned int fastFeetTime;
unsigned char warpX, warpY;
unsigned int warpTime;
unsigned int stopTime;
int gems[4];
public:
......
This diff is collapsed.
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