Commit f1bbcd3a authored by alistert's avatar alistert

More JJ2 events.

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