mirror of
https://github.com/thepigeongenerator/tetris_clone.git
synced 2025-12-17 14:05:45 +01:00
reduce memory footprint of tetromino plock location data
This commit is contained in:
@@ -1,7 +1,5 @@
|
|||||||
#include "shapes.h"
|
#include "shapes.h"
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "../../io/colour/colour8.h"
|
#include "../../io/colour/colour8.h"
|
||||||
#include "../../util/types.h"
|
#include "../../util/types.h"
|
||||||
#include "../../util/vec.h"
|
#include "../../util/vec.h"
|
||||||
@@ -41,54 +39,60 @@
|
|||||||
|
|
||||||
void shape_getblocks(u8 id, i8vec2* restrict out) {
|
void shape_getblocks(u8 id, i8vec2* restrict out) {
|
||||||
struct blockdat {
|
struct blockdat {
|
||||||
i8vec2 memb[4];
|
u8 ax : 2, ay : 2;
|
||||||
};
|
u8 bx : 2, by : 2;
|
||||||
struct blockdat dat;
|
u8 cx : 2, cy : 2;
|
||||||
|
u8 dx : 2, dy : 2;
|
||||||
|
} dat;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
// O tetromino
|
// O tetromino
|
||||||
case TETROMINO_O | TETROMINO_ROTATED_0:
|
case TETROMINO_O | TETROMINO_ROTATED_0:
|
||||||
case TETROMINO_O | TETROMINO_ROTATED_90:
|
case TETROMINO_O | TETROMINO_ROTATED_90:
|
||||||
case TETROMINO_O | TETROMINO_ROTATED_180:
|
case TETROMINO_O | TETROMINO_ROTATED_180:
|
||||||
case TETROMINO_O | TETROMINO_ROTATED_270: dat = (struct blockdat){{{1, 1}, {2, 1}, {1, 2}, {2, 2}}}; break;
|
case TETROMINO_O | TETROMINO_ROTATED_270: dat = (struct blockdat){1, 1, 2, 1, 1, 2, 2, 2}; break;
|
||||||
|
|
||||||
// I tetromino
|
// I tetromino
|
||||||
case TETROMINO_I | TETROMINO_ROTATED_0: dat = (struct blockdat){{{0, 1}, {1, 1}, {2, 1}, {3, 1}}}; break;
|
case TETROMINO_I | TETROMINO_ROTATED_0: dat = (struct blockdat){0, 1, 1, 1, 2, 1, 3, 1}; break;
|
||||||
case TETROMINO_I | TETROMINO_ROTATED_90: dat = (struct blockdat){{{2, 0}, {2, 1}, {2, 2}, {2, 3}}}; break;
|
case TETROMINO_I | TETROMINO_ROTATED_90: dat = (struct blockdat){2, 0, 2, 1, 2, 2, 2, 3}; break;
|
||||||
case TETROMINO_I | TETROMINO_ROTATED_180: dat = (struct blockdat){{{0, 2}, {1, 2}, {2, 2}, {3, 2}}}; break;
|
case TETROMINO_I | TETROMINO_ROTATED_180: dat = (struct blockdat){0, 2, 1, 2, 2, 2, 3, 2}; break;
|
||||||
case TETROMINO_I | TETROMINO_ROTATED_270: dat = (struct blockdat){{{1, 0}, {1, 1}, {1, 2}, {1, 3}}}; break;
|
case TETROMINO_I | TETROMINO_ROTATED_270: dat = (struct blockdat){1, 0, 1, 1, 1, 2, 1, 3}; break;
|
||||||
|
|
||||||
// S tetromino
|
// S tetromino
|
||||||
case TETROMINO_S | TETROMINO_ROTATED_0: dat = (struct blockdat){{{1, 0}, {2, 0}, {0, 1}, {1, 1}}}; break;
|
case TETROMINO_S | TETROMINO_ROTATED_0: dat = (struct blockdat){1, 0, 2, 0, 0, 1, 1, 1}; break;
|
||||||
case TETROMINO_S | TETROMINO_ROTATED_90: dat = (struct blockdat){{{1, 0}, {1, 1}, {2, 1}, {2, 2}}}; break;
|
case TETROMINO_S | TETROMINO_ROTATED_90: dat = (struct blockdat){1, 0, 1, 1, 2, 1, 2, 2}; break;
|
||||||
case TETROMINO_S | TETROMINO_ROTATED_180: dat = (struct blockdat){{{1, 1}, {2, 1}, {0, 2}, {1, 2}}}; break;
|
case TETROMINO_S | TETROMINO_ROTATED_180: dat = (struct blockdat){1, 1, 2, 1, 0, 2, 1, 2}; break;
|
||||||
case TETROMINO_S | TETROMINO_ROTATED_270: dat = (struct blockdat){{{0, 0}, {0, 1}, {1, 1}, {1, 2}}}; break;
|
case TETROMINO_S | TETROMINO_ROTATED_270: dat = (struct blockdat){0, 0, 0, 1, 1, 1, 1, 2}; break;
|
||||||
|
|
||||||
// Z tetromino
|
// Z tetromino
|
||||||
case TETROMINO_Z | TETROMINO_ROTATED_0: dat = (struct blockdat){{{0, 0}, {1, 0}, {1, 1}, {2, 1}}}; break;
|
case TETROMINO_Z | TETROMINO_ROTATED_0: dat = (struct blockdat){0, 0, 1, 0, 1, 1, 2, 1}; break;
|
||||||
case TETROMINO_Z | TETROMINO_ROTATED_90: dat = (struct blockdat){{{2, 0}, {1, 1}, {2, 1}, {1, 2}}}; break;
|
case TETROMINO_Z | TETROMINO_ROTATED_90: dat = (struct blockdat){2, 0, 1, 1, 2, 1, 1, 2}; break;
|
||||||
case TETROMINO_Z | TETROMINO_ROTATED_180: dat = (struct blockdat){{{0, 1}, {1, 1}, {1, 2}, {2, 2}}}; break;
|
case TETROMINO_Z | TETROMINO_ROTATED_180: dat = (struct blockdat){0, 1, 1, 1, 1, 2, 2, 2}; break;
|
||||||
case TETROMINO_Z | TETROMINO_ROTATED_270: dat = (struct blockdat){{{1, 0}, {0, 1}, {1, 1}, {0, 2}}}; break;
|
case TETROMINO_Z | TETROMINO_ROTATED_270: dat = (struct blockdat){1, 0, 0, 1, 1, 1, 0, 2}; break;
|
||||||
|
|
||||||
// T tetromino
|
// T tetromino
|
||||||
case TETROMINO_T | TETROMINO_ROTATED_0: dat = (struct blockdat){{{0, 1}, {1, 1}, {2, 1}, {1, 2}}}; break;
|
case TETROMINO_T | TETROMINO_ROTATED_0: dat = (struct blockdat){0, 1, 1, 1, 2, 1, 1, 2}; break;
|
||||||
case TETROMINO_T | TETROMINO_ROTATED_90: dat = (struct blockdat){{{1, 0}, {0, 1}, {1, 1}, {1, 2}}}; break;
|
case TETROMINO_T | TETROMINO_ROTATED_90: dat = (struct blockdat){1, 0, 0, 1, 1, 1, 1, 2}; break;
|
||||||
case TETROMINO_T | TETROMINO_ROTATED_180: dat = (struct blockdat){{{1, 0}, {0, 1}, {1, 1}, {2, 1}}}; break;
|
case TETROMINO_T | TETROMINO_ROTATED_180: dat = (struct blockdat){1, 0, 0, 1, 1, 1, 2, 1}; break;
|
||||||
case TETROMINO_T | TETROMINO_ROTATED_270: dat = (struct blockdat){{{1, 0}, {1, 1}, {2, 1}, {1, 2}}}; break;
|
case TETROMINO_T | TETROMINO_ROTATED_270: dat = (struct blockdat){1, 0, 1, 1, 2, 1, 1, 2}; break;
|
||||||
|
|
||||||
// L tetromino
|
// L tetromino
|
||||||
case TETROMINO_L | TETROMINO_ROTATED_0: dat = (struct blockdat){{{1, 0}, {1, 1}, {1, 2}, {2, 2}}}; break;
|
case TETROMINO_L | TETROMINO_ROTATED_0: dat = (struct blockdat){1, 0, 1, 1, 1, 2, 2, 2}; break;
|
||||||
case TETROMINO_L | TETROMINO_ROTATED_90: dat = (struct blockdat){{{0, 1}, {1, 1}, {2, 1}, {0, 2}}}; break;
|
case TETROMINO_L | TETROMINO_ROTATED_90: dat = (struct blockdat){0, 1, 1, 1, 2, 1, 0, 2}; break;
|
||||||
case TETROMINO_L | TETROMINO_ROTATED_180: dat = (struct blockdat){{{0, 0}, {1, 0}, {1, 1}, {1, 2}}}; break;
|
case TETROMINO_L | TETROMINO_ROTATED_180: dat = (struct blockdat){0, 0, 1, 0, 1, 1, 1, 2}; break;
|
||||||
case TETROMINO_L | TETROMINO_ROTATED_270: dat = (struct blockdat){{{2, 0}, {0, 1}, {1, 1}, {2, 1}}}; break;
|
case TETROMINO_L | TETROMINO_ROTATED_270: dat = (struct blockdat){2, 0, 0, 1, 1, 1, 2, 1}; break;
|
||||||
|
|
||||||
// J tetromino
|
// J tetromino
|
||||||
case TETROMINO_J | TETROMINO_ROTATED_0: dat = (struct blockdat){{{1, 0}, {1, 1}, {0, 2}, {1, 2}}}; break;
|
case TETROMINO_J | TETROMINO_ROTATED_0: dat = (struct blockdat){1, 0, 1, 1, 0, 2, 1, 2}; break;
|
||||||
case TETROMINO_J | TETROMINO_ROTATED_90: dat = (struct blockdat){{{0, 0}, {0, 1}, {1, 1}, {2, 1}}}; break;
|
case TETROMINO_J | TETROMINO_ROTATED_90: dat = (struct blockdat){0, 0, 0, 1, 1, 1, 2, 1}; break;
|
||||||
case TETROMINO_J | TETROMINO_ROTATED_180: dat = (struct blockdat){{{1, 0}, {2, 0}, {1, 1}, {1, 2}}}; break;
|
case TETROMINO_J | TETROMINO_ROTATED_180: dat = (struct blockdat){1, 0, 2, 0, 1, 1, 1, 2}; break;
|
||||||
case TETROMINO_J | TETROMINO_ROTATED_270: dat = (struct blockdat){{{0, 1}, {1, 1}, {2, 1}, {2, 2}}}; break;
|
case TETROMINO_J | TETROMINO_ROTATED_270: dat = (struct blockdat){0, 1, 1, 1, 2, 1, 2, 2}; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(out, dat.memb, sizeof(i8vec2[4]));
|
out[0] = (i8vec2){dat.ax, dat.ay};
|
||||||
|
out[1] = (i8vec2){dat.bx, dat.by};
|
||||||
|
out[2] = (i8vec2){dat.cx, dat.cy};
|
||||||
|
out[3] = (i8vec2){dat.dx, dat.dy};
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 shape_from_id(u8 id) {
|
u16 shape_from_id(u8 id) {
|
||||||
|
|||||||
Reference in New Issue
Block a user