Commit 583c31c2 authored by alistert's avatar alistert

Added layer tiling.

parent c63b6035
...@@ -46,7 +46,7 @@ JJ2Layer::JJ2Layer () { ...@@ -46,7 +46,7 @@ JJ2Layer::JJ2Layer () {
} }
JJ2Layer::JJ2Layer (int newWidth, int newHeight) { JJ2Layer::JJ2Layer (int newWidth, int newHeight, int flags) {
int row; int row;
...@@ -58,6 +58,11 @@ JJ2Layer::JJ2Layer (int newWidth, int newHeight) { ...@@ -58,6 +58,11 @@ JJ2Layer::JJ2Layer (int newWidth, int newHeight) {
for (row = 0; row < height; row++) grid[row] = *grid + (row * width); for (row = 0; row < height; row++) grid[row] = *grid + (row * width);
tileX = flags & 1;
tileY = flags & 2;
limit = flags & 4;
warp = flags & 8;
return; return;
} }
...@@ -93,9 +98,10 @@ int JJ2Layer::getHeight () { ...@@ -93,9 +98,10 @@ int JJ2Layer::getHeight () {
int JJ2Layer::getTile (int x, int y) { int JJ2Layer::getTile (int x, int y) {
if ((x < 0) || (y < 0) || (x >= width) || (y >= height)) return 0; if (((x < 0) || (x >= width)) && !tileX) return 0;
if (((y < 0) || (y >= height)) && !tileY) return 0;
return grid[y][x].tile; return grid[tileY? y % height: y][tileX? x % width: x].tile;
} }
......
...@@ -73,10 +73,11 @@ class JJ2Layer { ...@@ -73,10 +73,11 @@ class JJ2Layer {
private: private:
JJ2Tile** grid; JJ2Tile** grid;
int width, height; int width, height;
bool tileX, tileY, limit, warp;
public: public:
JJ2Layer (); JJ2Layer ();
JJ2Layer (int newWidth, int newHeight); JJ2Layer (int newWidth, int newHeight, int flags);
~JJ2Layer (); ~JJ2Layer ();
bool getFlipped (int x, int y); bool getFlipped (int x, int y);
......
...@@ -293,12 +293,12 @@ int JJ2Level::loadTiles (char* fileName) { ...@@ -293,12 +293,12 @@ int JJ2Level::loadTiles (char* fileName) {
// Load tiles // Load tiles
tiles = aBuffer[1024] + (aBuffer[1025] << 8); tiles = createShort(aBuffer + 1024);
tileBuffer = new unsigned char[tiles << 10]; tileBuffer = new unsigned char[tiles << 10];
for (count = 0; count < tiles; count++) { for (count = 0; count < tiles; count++) {
memcpy(tileBuffer + (count << 10), bBuffer + ((int *)aBuffer)[257 + (maxTiles >> 1) + count], 1024); memcpy(tileBuffer + (count << 10), bBuffer + createInt(aBuffer + 1028 + (maxTiles << 1) + (count << 2)), 1024);
} }
...@@ -334,7 +334,7 @@ int JJ2Level::loadTiles (char* fileName) { ...@@ -334,7 +334,7 @@ int JJ2Level::loadTiles (char* fileName) {
for (y = 0; y < 32; y++) { for (y = 0; y < 32; y++) {
for (x = 0; x < 32; x++) for (x = 0; x < 32; x++)
mask[(count << 10) + (y << 5) + x] = (dBuffer[((int *)aBuffer)[257 + ((maxTiles * 9) >> 1) + count] + (y << 2) + (x >> 3)] >> (x & 7)) & 1; mask[(count << 10) + (y << 5) + x] = (dBuffer[createInt(aBuffer + 1028 + (maxTiles * 18) + (count << 2)) + (y << 2) + (x >> 3)] >> (x & 7)) & 1;
} }
...@@ -348,7 +348,7 @@ int JJ2Level::loadTiles (char* fileName) { ...@@ -348,7 +348,7 @@ int JJ2Level::loadTiles (char* fileName) {
for (y = 0; y < 32; y++) { for (y = 0; y < 32; y++) {
for (x = 0; x < 32; x++) 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; flippedMask[(count << 10) + (y << 5) + x] = (dBuffer[createInt(aBuffer + 1028 + (maxTiles * 22) + (count << 2)) + (y << 2) + (x >> 3)] >> (x & 7)) & 1;
} }
...@@ -407,7 +407,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -407,7 +407,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 flags, width, pitch, height;
int worldNum; int worldNum;
unsigned char startX, startY; unsigned char startX, startY;
...@@ -522,13 +522,14 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -522,13 +522,14 @@ 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]; flags = aBuffer[8403 + (count << 2)];
pitch = ((int *)(aBuffer + 8443 + 40))[count]; width = createInt(aBuffer + 8403 + 48 + (count << 2));
height = ((int *)(aBuffer + 8443 + 72))[count]; pitch = createInt(aBuffer + 8403 + 80 + (count << 2));
height = createInt(aBuffer + 8403 + 112 + (count << 2));
if (aBuffer[8443 + count]) { if (aBuffer[8403 + 40 + count]) {
layers[count] = new JJ2Layer(width, height); layers[count] = new JJ2Layer(width, height, flags);
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
...@@ -536,7 +537,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -536,7 +537,7 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
if ((x & 3) == 0) memcpy(tileQuad, cBuffer + (quadRefs[x >> 2] << 3), 8); if ((x & 3) == 0) memcpy(tileQuad, cBuffer + (quadRefs[x >> 2] << 3), 8);
layers[count]->setTile(x, y, tileQuad[(x & 3) << 1] + (tileQuad[((x & 3) << 1) + 1] << 8), TSF? -tiles: tiles); layers[count]->setTile(x, y, createShort(tileQuad + ((x & 3) << 1)), TSF? -tiles: tiles);
} }
...@@ -559,10 +560,9 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -559,10 +560,9 @@ int JJ2Level::load (char *fileName, unsigned char diff, bool checkpoint) {
height = layer->getHeight(); height = layer->getHeight();
// Load events // Load events
startX = 0; startX = 1;
startY = 0; startY = 1;
mods = new JJ2Modifier *[height]; mods = new JJ2Modifier *[height];
*mods = new JJ2Modifier[width * height]; *mods = new JJ2Modifier[width * height];
......
...@@ -59,7 +59,29 @@ bool fileExists (const char * fileName) { ...@@ -59,7 +59,29 @@ bool fileExists (const char * fileName) {
return true; return true;
} }
unsigned short int createShort (unsigned char* data) {
unsigned short int val;
val = data[0] + (data[1] << 8);
return val;
}
int createInt (unsigned char* data) {
unsigned int val;
val = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24);
return *((int *)&val);
}
char * createString (const char *string) { char * createString (const char *string) {
......
...@@ -35,19 +35,21 @@ EXTERN fixed sinLut[1024]; ...@@ -35,19 +35,21 @@ EXTERN fixed sinLut[1024];
// Functions // Functions
EXTERN bool fileExists (const char *fileName); EXTERN bool fileExists (const char *fileName);
EXTERN char * createString (const char *string); EXTERN unsigned short int createShort (unsigned char* data);
EXTERN char * createString (const char *first, const char *second); EXTERN int createInt (unsigned char* data);
EXTERN char * createFileName (const char *type, int extension); EXTERN char* createString (const char *string);
EXTERN char * createFileName (const char *type, const char *extension); EXTERN char* createString (const char *first, const char *second);
EXTERN char * createFileName (const char *type, int level, int extension); EXTERN char* createFileName (const char *type, int extension);
EXTERN char * createEditableString (const char *string); EXTERN char* createFileName (const char *type, const char *extension);
EXTERN void log (const char *message); EXTERN char* createFileName (const char *type, int level, int extension);
EXTERN void log (const char *message, const char *detail); EXTERN char* createEditableString (const char *string);
EXTERN void log (const char *message, int number); EXTERN void log (const char *message);
EXTERN void logError (const char *message, const char *detail); EXTERN void log (const char *message, const char *detail);
EXTERN fixed fSin (fixed angle); EXTERN void log (const char *message, int number);
EXTERN fixed fCos (fixed angle); EXTERN void logError (const char *message, const char *detail);
EXTERN fixed fSin (fixed angle);
EXTERN fixed fCos (fixed angle);
#endif #endif
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