diff options
Diffstat (limited to 'src/field.c')
| -rw-r--r-- | src/field.c | 235 | 
1 files changed, 235 insertions, 0 deletions
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 <stdlib.h> +#include <string.h> +#include <SFML/Graphics/RectangleShape.h> + +#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); +}  | 
