Commit 1fe1fc7e authored by alistert's avatar alistert

Event refactoring.

parent fe5f4bab
......@@ -9,6 +9,7 @@ objects = src/bonus/bonus.o \
src/io/gfx/scale2x/scale2x.o src/io/gfx/scale2x/scale3x.o \
src/io/gfx/scale2x/scalebit.o src/io/gfx/scale2x/simple2x.o \
src/io/controls.o src/io/file.o src/io/network.o src/io/sound.o \
src/jj2level/jj2event/jj2event.o src/jj2level/jj2event/jj2eventframe.o \
src/jj2level/jj2layer.o src/jj2level/jj2level.o \
src/jj2level/jj2levelframe.o src/jj2level/jj2levelload.o \
src/level/event/bridge.o src/level/event/guardians.o \
......
......@@ -33,6 +33,7 @@ OBJS = src/bonus/bonus.o \
src/io/gfx/scale2x/scale2x.o src/io/gfx/scale2x/scale3x.o \
src/io/gfx/scale2x/scalebit.o src/io/gfx/scale2x/simple2x.o \
src/io/controls.o src/io/file.o src/io/network.o src/io/sound.o \
src/jj2level/jj2event/jj2event.o src/jj2level/jj2event/jj2eventframe.o \
src/jj2level/jj2layer.o src/jj2level/jj2level.o \
src/jj2level/jj2levelframe.o src/jj2level/jj2levelload.o \
src/level/event/bridge.o src/level/event/guardians.o \
......
......@@ -9,6 +9,7 @@ objects = src/bonus/bonus.o \
src/io/gfx/scale2x/scale2x.o src/io/gfx/scale2x/scale3x.o \
src/io/gfx/scale2x/scalebit.o src/io/gfx/scale2x/simple2x.o \
src/io/controls.o src/io/file.o src/io/network.o src/io/sound.o \
src/jj2level/jj2event/jj2event.o src/jj2level/jj2event/jj2eventframe.o \
src/jj2level/jj2layer.o src/jj2level/jj2level.o \
src/jj2level/jj2levelframe.o src/jj2level/jj2levelload.o \
src/level/event/bridge.o src/level/event/guardians.o \
......
/*
*
* jj2event.cpp
*
* 2nd July 2010: Created jj2event.cpp from parts of jj2level.cpp
*
* Part of the OpenJazz project
*
*
* Copyright (c) 2005-2010 Alister Thomson
*
* OpenJazz is distributed under the terms of
* the GNU General Public License, version 2.0
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/*
* Deals with the creating and freeing of JJ2 events.
*
*/
#include "jj2event.h"
#include "baselevel.h"
JJ2Event::JJ2Event (JJ2Event* newNext, unsigned char gridX, unsigned char gridY, unsigned char* properties) {
x = TTOF(gridX);
y = TTOF(gridY);
dx = 0;
dy = 0;
next = newNext;
type = properties[0];
data[0] = properties[1];
data[1] = properties[2];
data[2] = properties[3];
hits = 0;
return;
}
JJ2Event::~JJ2Event () {
return;
}
/*
*
* jj2event.h
*
* 2nd July 2010: Created jj2event.h from parts of jj2level.h
*
* Part of the OpenJazz project
*
*
* Copyright (c) 2005-2010 Alister Thomson
*
* OpenJazz is distributed under the terms of
* the GNU General Public License, version 2.0
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef _JJ2EVENT_H
#define _JJ2EVENT_H
#include "level/movable.h"
// Classes
class JJ2Event : public Movable {
private:
JJ2Event* next;
unsigned char type;
unsigned char data[3];
unsigned char hits; // Number of times the event has been shot
int time; /* Point at which the event will do something, e.g. terminate */
unsigned char anim;
unsigned char frame;
unsigned int flashTime;
public:
JJ2Event (JJ2Event* newNext, unsigned char gridX, unsigned char gridY, unsigned char* properties);
~JJ2Event ();
JJ2Event* step (int msps);
void draw (int change);
};
#endif
/*
*
* jj2eventframe.cpp
*
* 2nd July 2010: Created jj2eventframe.cpp from parts of jj2level.cpp
*
* Part of the OpenJazz project
*
*
* Copyright (c) 2005-2010 Alister Thomson
*
* OpenJazz is distributed under the terms of
* the GNU General Public License, version 2.0
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/*
* Deals with the playing of JJ2 levels.
*
*/
#include "jj2event.h"
#include "io/gfx/video.h"
JJ2Event* JJ2Event::step (int msps) {
if (next) next = next->step(msps);
return this;
}
void JJ2Event::draw (int change) {
int drawX, drawY;
if (next) next->draw(change);
drawX = getDrawX(change);
drawY = getDrawY(change);
if (type > 2) drawRect(FTOI(drawX) + 8, FTOI(drawY) + 8, 16, 16, type);
return;
}
......@@ -36,8 +36,8 @@ JJ2Layer::JJ2Layer () {
width = height = 1;
grid = new JJ2GridElement *[1];
*(grid) = new JJ2GridElement[1];
grid = new JJ2Tile *[1];
*grid = new JJ2Tile[1];
(*grid)->tile = 0;
......@@ -53,10 +53,10 @@ JJ2Layer::JJ2Layer (int newWidth, int newHeight) {
width = newWidth;
height = newHeight;
grid = new JJ2GridElement *[height];
*(grid) = new JJ2GridElement[width * height];
grid = new JJ2Tile *[height];
*grid = new JJ2Tile[width * height];
for (row = 0; row < height; row++) grid[row] = *(grid) + (row * width);
for (row = 0; row < height; row++) grid[row] = *grid + (row * width);
return;
......@@ -65,7 +65,7 @@ JJ2Layer::JJ2Layer (int newWidth, int newHeight) {
JJ2Layer::~JJ2Layer () {
delete[] *(grid);
delete[] *grid;
delete[] grid;
return;
......@@ -118,7 +118,7 @@ void JJ2Layer::setFrame (unsigned char x, unsigned char y, unsigned char frame)
void JJ2Layer::setTile (unsigned char x, unsigned char y, unsigned short int tile, int tiles) {
JJ2GridElement* ge;
JJ2Tile* ge;
ge = grid[y] + x;
......
......@@ -4,6 +4,8 @@
* jj2level.cpp
*
* 29th June 2010: Created jj2level.cpp from parts of level.cpp
* 2nd July 2010: Created jj2event.cpp from parts of jj2level.cpp
* 2nd July 2010: Created jj2eventframe.cpp from parts of jj2level.cpp
*
* Part of the OpenJazz project
*
......@@ -20,7 +22,7 @@
*/
/*
* Deals with the creating, playing and freeing of levels.
* Deals with the creating, playing and freeing of JJ2 levels.
*
*/
......@@ -62,8 +64,9 @@ JJ2Level::~JJ2Level () {
int count;
delete[] *events;
delete[] events;
if (events) delete events;
delete[] *mods;
delete[] mods;
for (count = 0; count < LAYERS; count++) delete layers[count];
......@@ -99,7 +102,7 @@ bool JJ2Level::checkMaskUp (fixed x, fixed y) {
return true;
// Event 1 is one-way
if (events[tY][tX].type == 1) return false;
if (mods[tY][tX].type == 1) 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)];
......@@ -132,10 +135,11 @@ bool JJ2Level::checkSpikes (fixed x, fixed y) {
tY = FTOT(y);
// Anything off the edge of the map is not spikes
// JJ2Layer::getTile while return the blank tile for these cases, so do not need to do anything
if ((x < 0) || (y < 0) || (tX >= layer->getWidth()) || (tY >= layer->getHeight()))
return false;
// Event 2 is spikes
if (events[tY][tX].type != 2) return false;
if (mods[tY][tX].type != 2) 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)];
......
......@@ -4,6 +4,7 @@
* jj2level.h
*
* 29th June 2010: Created jj2level.h from parts of level.h
* 2nd July 2010: Created jj2event.h from parts of jj2level.h
*
* Part of the OpenJazz project
*
......@@ -28,7 +29,7 @@
#ifndef _JJ2LEVEL_H
#define _JJ2LEVEL_H
#include "baselevel.h"
#include "io/gfx/anim.h"
#include "OpenJazz.h"
......@@ -53,25 +54,25 @@ typedef struct {
unsigned char frame; // Current frame being used (for animated tiles)
bool flipped;
} JJ2GridElement;
} JJ2Tile;
typedef struct {
unsigned char type;
unsigned char data[3];
} JJ2Event;
int property;
} JJ2Modifier;
// Classes
// Classes
class Font;
class JJ2Layer {
private:
JJ2GridElement** grid;
int width, height;
JJ2Tile** grid;
int width, height;
public:
JJ2Layer ();
......@@ -89,11 +90,15 @@ class JJ2Layer {
};
class JJ2Event;
class JJ2Level : public BaseLevel {
private:
SDL_Surface* tileSet;
SDL_Surface* flippedTileSet;
JJ2Event* events;
Font* font;
char* mask;
char* flippedMask;
char* musicFile;
......@@ -102,8 +107,7 @@ class JJ2Level : public BaseLevel {
int soundMap[32];
JJ2Layer* layers[LAYERS];
JJ2Layer* layer;
JJ2Event** events;
int width, height;
JJ2Modifier** mods;
bool TSF;
unsigned char difficulty;
fixed waterLevel;
......@@ -118,8 +122,6 @@ class JJ2Level : public BaseLevel {
void draw ();
public:
Font* font;
JJ2Level (char* fileName, unsigned char diff, bool checkpoint);
~JJ2Level ();
......
......@@ -26,6 +26,7 @@
*/
#include "jj2event/jj2event.h"
#include "jj2level.h"
#include "game/game.h"
......@@ -39,9 +40,9 @@
int JJ2Level::step () {
int x;
int x, y;
int msps;
// Milliseconds per step
msps = ticks - prevStepTicks;
......@@ -50,6 +51,10 @@ int JJ2Level::step () {
// Determine the players' trajectories
for (x = 0; x < nPlayers; x++) players[x].getJJ2LevelPlayer()->control(ticks, msps);
// Process events
if (events) events = events->step(msps);
// Apply as much of those trajectories as possible, without going into the
......@@ -87,11 +92,16 @@ int JJ2Level::step () {
void JJ2Level::draw () {
int width, height;
int x, y;
unsigned int change;
width = layer->getWidth();
height = layer->getHeight();
// Calculate viewport
if (game && (stage == LS_END)) game->view(paused? 0: ((ticks - prevTicks) * 160));
else localPlayer->getJJ2LevelPlayer()->view(ticks, paused? 0: (ticks - prevTicks));
......@@ -112,16 +122,7 @@ void JJ2Level::draw () {
// 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);
}
}*/
if (events) events->draw(change);
// Show the players
......@@ -129,8 +130,8 @@ void JJ2Level::draw () {
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 type of overlapping modifier
//panelBigFont->showNumber(mods[FTOT(players[x].getJJ2LevelPlayer()->getY() + PYO_MID)][FTOT(players[x].getJJ2LevelPlayer()->getX() + PXO_MID)].type, viewW >> 1, viewH >> 1);
}
......
......@@ -26,6 +26,7 @@
*/
#include "jj2event/jj2event.h"
#include "jj2level.h"
#include "game/game.h"
......@@ -406,7 +407,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
int count, x, y;
unsigned char tileQuad[8];
short int* quadRefs;
int layerWidth, pitch, layerHeight;
int width, pitch, height;
int worldNum;
unsigned char startX, startY;
......@@ -518,24 +519,17 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
for (count = 0; count < LAYERS; count++) {
layerWidth = ((int *)(aBuffer + 8443 + 8))[count];
width = ((int *)(aBuffer + 8443 + 8))[count];
pitch = ((int *)(aBuffer + 8443 + 40))[count];
layerHeight = ((int *)(aBuffer + 8443 + 72))[count];
if (count == 3) {
width = layerWidth;
height = layerHeight;
}
height = ((int *)(aBuffer + 8443 + 72))[count];
if (aBuffer[8443 + count]) {
layers[count] = new JJ2Layer(layerWidth, layerHeight);
layers[count] = new JJ2Layer(width, height);
for (y = 0; y < layerHeight; y++) {
for (y = 0; y < height; y++) {
for (x = 0; x < layerWidth; x++) {
for (x = 0; x < width; x++) {
if ((x & 3) == 0) memcpy(tileQuad, cBuffer + (quadRefs[x >> 2] << 3), 8);
......@@ -558,30 +552,47 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
}
layer = layers[3];
width = layer->getWidth();
height = layer->getHeight();
// Load events
startX = 0;
startY = 0;
events = new JJ2Event *[height];
*events = new JJ2Event[width * height];
mods = new JJ2Modifier *[height];
*mods = new JJ2Modifier[width * height];
events = NULL;
for (y = 0; y < height; y++) {
events[y] = events[0] + (y * width);
mods[y] = *mods + (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];
count = bBuffer[((y * width) + x) << 2];
if (count < 33) {
mods[y][x].type = count;
mods[y][x].property = bBuffer[(((y * width) + x) << 2) + 1];
if (count == 29) {
// Jazz start pos
startX = x;
startY = y;
}
} else {
if (events[y][x].type == 29) {
mods[y][x].type = 0;
startX = x;
startY = y;
events = new JJ2Event(events, x, y, bBuffer + (((y * width) + x) << 2));
}
......@@ -622,8 +633,9 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
delete[] string;
delete[] *events;
delete[] events;
if (events) delete events;
delete[] *mods;
delete[] mods;
for (count = 0; count < LAYERS; count++) delete layers[count];
......@@ -659,8 +671,9 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
delete file;
delete[] *events;
delete[] events;
if (events) delete events;
delete[] *mods;
delete[] mods;
for (x = 0; x < LAYERS; x++) delete layers[x];
......
......@@ -196,7 +196,7 @@ Bullet* Bullet::step (unsigned int ticks, int msps) {
// If the bullet is TNT, hit all destructible events nearby twice
if (type == -1) {
event = level->events;
event = level->getEvents();
while (event) {
......@@ -242,7 +242,7 @@ Bullet* Bullet::step (unsigned int ticks, int msps) {
// Check if an event has been hit
event = level->events;
event = level->getEvents();
while (event) {
......
......@@ -42,7 +42,7 @@ Bridge::Bridge (unsigned char gX, unsigned char gY) {
dx = 0;
dy = 0;
next = level->events;
next = level->getEvents();
gridX = gX;
gridY = gY;
animType = E_LEFTANIM;
......
......@@ -57,7 +57,7 @@ Event::Event (unsigned char gX, unsigned char gY) {
dx = 0;
dy = 0;
next = level->events;
next = level->getEvents();
gridX = gX;
gridY = gY;
flashTime = 0;
......
......@@ -39,7 +39,7 @@ DeckGuardian::DeckGuardian (unsigned char gX, unsigned char gY) {
dx = 0;
dy = 0;
next = level->events;
next = level->getEvents();
gridX = gX;
gridY = gY;
flashTime = 0;
......
......@@ -225,6 +225,13 @@ void Level::setTile (unsigned char gridX, unsigned char gridY, unsigned char til
}
Event* Level::getEvents () {
return events;
}
signed char* Level::getEvent (unsigned char gridX, unsigned char gridY) {
int event = grid[gridY][gridX].event;
......
......@@ -97,6 +97,7 @@ class Level : public BaseLevel {
SDL_Surface* tileSet;
SDL_Surface* panel;
SDL_Surface* panelAmmo[5];
Event* events;
char* musicFile;
char* sceneFile;
Anim animSet[ANIMS];
......@@ -125,13 +126,13 @@ class Level : public BaseLevel {
int playBonus ();
protected:
Font* font;
int load (char* fileName, unsigned char diff, bool checkpoint);
int step ();
void draw ();
public:
Font* font;
Event* events;
Bullet* bullets;
EventPath path[PATHS];
......@@ -144,6 +145,7 @@ class Level : public BaseLevel {
bool checkSpikes (fixed x, fixed y);
void setNext (int nextLevel, int nextWorld);
void setTile (unsigned char gridX, unsigned char gridY, unsigned char tile);
Event* getEvents ();
signed char* getEvent (unsigned char gridX, unsigned char gridY);
unsigned char getEventHits (unsigned char gridX, unsigned char gridY);
unsigned int getEventTime (unsigned char gridX, unsigned char gridY);
......
......@@ -145,7 +145,7 @@ bool Bird::step (unsigned int ticks, int msps) {
// Check for nearby targets
target = false;
event = level->events;
event = level->getEvents();
if (player->getFacing()) {
......
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