From bf0e5690a31d4c3cecd2ba512729a0b73989bbda Mon Sep 17 00:00:00 2001 From: Oxore Date: Mon, 25 Jun 2018 15:50:58 +0300 Subject: Major refactoring Fix memleak in KeyMap, fix memleak caused by loading a yaml file in main.c. Change Copyright information. Rename functions.c and .h to engine.c and .h. Take field and shape related functions to separate file (still not all of them) and refactor them a lot. Refactor collision detection. Add more warnings. Add sanitizer option commented out. --- src/field.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 src/field.c (limited to 'src/field.c') diff --git a/src/field.c b/src/field.c new file mode 100644 index 0000000..dcb332d --- /dev/null +++ b/src/field.c @@ -0,0 +1,235 @@ +#include +#include +#include + +#include "field.h" +#include "tet_conf.h" + +/* Shapes maps */ +extern char arrShapeL[4][4]; +extern char arrShapeRL[4][4]; +extern char arrShapeZ[4][4]; +extern char arrShapeS[4][4]; +extern char arrShapeB[4][4]; +extern char arrShapeI[4][4]; +extern char arrShapeT[4][4]; + +static void rotate_shape_left(struct shape *shape); +static void rotate_shape_right(struct shape *shape); +static int out_of_bounds(struct field *fld, struct shape *active); + +void init_field(struct field *fld) +{ + sfVector2f fldCPos[22][10]; + for (int j = 0; j < fld->size.y; j++) { + for (int i = 0; i < fld->size.x; i++) { + fld->c[j][i].a = 0; // Inactive = empty + fldCPos[j][i].x + = fld->pos.x + (i * (fld->cSize.x + 2 * fld->cOutThick)); + fldCPos[j][i].y + = fld->pos.y - (j * (fld->cSize.y + 2 * fld->cOutThick)); + fld->p[j][i] = sfRectangleShape_create(); + sfRectangleShape_setFillColor(fld->p[j][i], UIBGCOLOR); + sfRectangleShape_setSize(fld->p[j][i], fld->cSize); + sfRectangleShape_setPosition(fld->p[j][i], fldCPos[j][i]); + sfRectangleShape_setOutlineColor(fld->p[j][i], UIFGACTIVECOLOR); + sfRectangleShape_setOutlineThickness(fld->p[j][i], fld->cOutThick); + } + } +} + +void colorize_field(struct field *fld) +{ + for (int j = 0; j < fld->size.y; j++) + for (int i = 0; i < fld->size.x; i++) + if (fld->c[j][i].a) { + sfRectangleShape_setFillColor(fld->p[j][i], fld->c[j][i].fColor); + sfRectangleShape_setOutlineColor(fld->p[j][i], UIFGACTIVECOLOR); + } else { + sfRectangleShape_setFillColor(fld->p[j][i], UIBGCOLOR); + sfRectangleShape_setOutlineColor(fld->p[j][i], UIFGINACTIVECOLOR); + } +} + +void colorize_field_random(struct field *fld) +{ + int a; + for (int j = 0; j < fld->size.y; j++) { + for (int i = 0; i < fld->size.x; i++) { + a = rand() % 7 + 1; + switch (a) { + case 1 : + sfRectangleShape_setFillColor(fld->p[j][i], LCOLOR); + break; + case 2 : + sfRectangleShape_setFillColor(fld->p[j][i], RLCOLOR); + break; + case 3 : + sfRectangleShape_setFillColor(fld->p[j][i], ZCOLOR); + break; + case 4 : + sfRectangleShape_setFillColor(fld->p[j][i], SCOLOR); + break; + case 5 : + sfRectangleShape_setFillColor(fld->p[j][i], BCOLOR); + break; + case 6 : + sfRectangleShape_setFillColor(fld->p[j][i], ICOLOR); + break; + case 7 : + sfRectangleShape_setFillColor(fld->p[j][i], TCOLOR); + break; + } + sfRectangleShape_setOutlineColor(fld->p[j][i], UIFGACTIVECOLOR); + } + } +} + +void init_next_shape_field(struct shape *next) +{ + sfVector2f nsPos; + for (int j = 0; j < 4; j++) { + for (int i = 0; i < 4; i++) { + nsPos.x = next->x + i *(next->cSize.x + 2 * next->cOutThick); + nsPos.y = next->y - j *(next->cSize.y + 2 * next->cOutThick); + next->p[j][i] = sfRectangleShape_create(); + sfRectangleShape_setSize(next->p[j][i], next->cSize); + sfRectangleShape_setPosition(next->p[j][i], nsPos); + sfRectangleShape_setOutlineThickness(next->p[j][i], next->cOutThick); + } + } +} + +/* + * Inserts shape into field, runs filled lines searching, puts new shape + * into the game at the top. + * + */ +void putShape(struct field *fld, struct shape *active) +{ + for (int j = 0; j < 4; j++) + for (int i = 0; i < 4; i++) + if (active->c[j][i]) { + fld->c[j+active->y][i+active->x].a = active->c[j][i]; + fld->c[j+active->y][i+active->x].fColor = active->fColor; + } +} + +int out_of_field(struct field *fld, struct shape *active) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + if (active->c[i][j] && active->y + i >= fld->size.y) + return 1; + return 0; +} + +void load_shape(struct shape *shape) +{ + switch (shape->t) { // Copy cell active/inactive state + case 1 : + memcpy(&shape->c[0][0], &arrShapeL[0][0], sizeof(char)*4*4); + shape->fColor = LCOLOR; + break; + case 2 : + memcpy(&shape->c[0][0], &arrShapeRL[0][0], sizeof(char)*4*4); + shape->fColor = RLCOLOR; + break; + case 3 : + memcpy(&shape->c[0][0], &arrShapeZ[0][0], sizeof(char)*4*4); + shape->fColor = ZCOLOR; + break; + case 4 : + memcpy(&shape->c[0][0], &arrShapeS[0][0], sizeof(char)*4*4); + shape->fColor = SCOLOR; + break; + case 5 : + memcpy(&shape->c[0][0], &arrShapeB[0][0], sizeof(char)*4*4); + shape->fColor = BCOLOR; + break; + case 6 : + memcpy(&shape->c[0][0], &arrShapeI[0][0], sizeof(char)*4*4); + shape->fColor = ICOLOR; + break; + case 7 : + memcpy(&shape->c[0][0], &arrShapeT[0][0], sizeof(char)*4*4); + shape->fColor = TCOLOR; + break; + } +} + +void resetActiveShape(struct field *fld, struct shape *active) +{ + load_shape(active); + active->x = 3; + if (active->t == 6) + active->y = 19; + else + active->y = 18; + while (collide(fld, active)) { + active->y++; + } +} + +int collide(struct field *fld, struct shape *active) +{ + if (out_of_bounds(fld, active)) + return 1; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + if (active->c[i][j] && fld->c[i + active->y][j + active->x].a) + return 1; + return 0; +} + +static int out_of_bounds(struct field *fld, struct shape *active) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + if (active->c[i][j]) + if (active->x + j >= fld->bound.x || active->x + j < 0 + || active->y + i >= fld->bound.y || active->y + i < 0) + return 1; + return 0; +} + +static void rotate_shape_left(struct shape *shape) +{ + char arr[4][4]; + memcpy(&arr[0][0], &shape->c[0][0], sizeof(char)*4*4); + if (shape->t == 5) + return; + if (shape->t == 6) { + for (int j = 3; j >= 0; j--) + for (int i = 0; i < 4; i++) + shape->c[j][i] = arr[3-i][3-j]; + return; + } + for (int j = 3; j > 0; j--) + for (int i = 0; i < 3; i++) + shape->c[j][i] = arr[3-i][j-1]; +} + +static void rotate_shape_right(struct shape *shape) +{ + char arr[4][4]; + memcpy(&arr[0][0], &shape->c[0][0], sizeof(char)*4*4); + if (shape->t == 5) + return; + if (shape->t == 6) { + for (int j = 3; j >= 0; j--) + for (int i = 0; i < 4; i++) + shape->c[j][i] = arr[3-i][3-j]; + return; + } + for (int j = 3; j > 0; j--) + for (int i = 0; i < 3; i++) + shape->c[j][i] = arr[i+1][3-j]; +} + +void rotate_shape(struct field *fld, struct shape *shape) +{ + rotate_shape_right(shape); + if (collide(fld, shape)) + rotate_shape_left(shape); +} -- cgit v1.2.3