diff options
Diffstat (limited to 'src/functions.c')
-rw-r--r-- | src/functions.c | 678 |
1 files changed, 0 insertions, 678 deletions
diff --git a/src/functions.c b/src/functions.c deleted file mode 100644 index eebbf67..0000000 --- a/src/functions.c +++ /dev/null @@ -1,678 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <SFML/System/Clock.h> -#include <SFML/Graphics/RenderWindow.h> -#include <SFML/Graphics/Text.h> -#include <SFML/Graphics/RectangleShape.h> - -#include "common.h" -#include "tet_conf.h" -#include "functions.h" - -/* Externs from main.c */ -extern Game game; -extern Shape active, next; -extern Field fld; - -extern sfFont *fontScore; - -extern char arrKeys; // Arrow keys states byte container - -extern sfClock *gameTick; -extern sfClock *putTick; -extern sfClock *mTick; -extern sfClock *repPushDown; // Clock for repeat latency when Down key held -extern sfClock *repKeyLeft; // Clock for repeat latency when Left key held -extern sfClock *repKeyRight; // Clock for repeat latency when Left key held - -/* 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]; - - -/* Field init routine */ -void initFld() -{ - sfVector2f fldCPos[22][10]; - /* Create field */ - 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); - } - } - /* Create next shape field */ - 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*fld.cOutThick); - nsPos.y = next.y-j*(next.cSize.y+2*fld.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], fld.cOutThick); - } - } - genNextShape(); - resetActiveShape(&active); -} - - -void valueAfterTextDisplay(int value, List *texts, char *type) -{ - List *l = texts; - while (l) { - Text *text = (Text *)l->obj; - if (text->type) - if (!strcmp(text->type, type)) { - char a[64]; - if (text->text) { - if (strlen(text->text) > 52) { - memset(text->text+52, '\0', 1); - strcpy(a, text->text); - } - sprintf(a, "%s%d", text->text, value); - sfText_setString(text->sfText, (char *)&a); - break; - } - } - l = l->next; - } -} - -/* - * Removes line when cells all are in row in it - * - */ -int rmLines() -{ - int k = 0; // "Filled line" indicator - int s = 0; - for (int j = 0; j < 22; j++) { - for (int i = 0; i < 10; i++) - if (fld.c[j][i].a != 0) - k++; - if (k >= 10) { // If line is full - s++; // Give scores for line - for (int n = j; n < 22; n++) { // Drop all lines down - if (n == 21) { - for (int m = 0; m < 10; m++) { - fld.c[n][m].a = 0; - fld.c[n][m].fColor = UIBGCOLOR; - } - break; - } - for (int m = 0; m < 10; m++) { - fld.c[n][m].a = fld.c[n+1][m].a; - fld.c[n][m].fColor = fld.c[n+1][m].fColor; - } - } - j--; // Do not let loop to go to next line because - // next line go down by itself =) - } - k = 0; // Clear line fill indicator - } - return s; // Return number of deleted lines -} - -/* - * Inserts shape into field, runs filled lines searching, puts new shape - * into the game at the top. - * - */ -void putShape() -{ - if (outOfFieldCheck(&fld, &active)) { - gameover(&game); - return; - } - 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]; - if ((j+active.y >= 0) && (i+active.x >= 0)) - fld.c[j+active.y][i+active.x].fColor = active.fColor; - } - int removedLines = rmLines(); - game.lines += removedLines; - switch (removedLines) { - case 1: - game.scoreCurrent += RM_1LINES_SCORE * game.level; - break; - case 2: - game.scoreCurrent += RM_2LINES_SCORE * game.level; - break; - case 3: - game.scoreCurrent += RM_3LINES_SCORE * game.level; - break; - case 4: - game.scoreCurrent += RM_4LINES_SCORE * game.level; - break; - } - resetActiveShape(&active); - checkLevelUp(&game); -} - -int outOfFieldCheck(Field *fld, 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) { - gameover(&game); - return 1; - } - } - } - return 0; -} - -void checkLevelUp(Game *game) -{ - while (game->lines >= LEVELUP_LINES) { - game->level++; - game->lines -= LEVELUP_LINES; - game->moveLatency = getMoveLatencyOfLevel(game->level); - } -} - -int getMoveLatencyOfLevel(int level) -{ - if (level >= 29) - return L29LATENCY; - else if (level >= 19) - return L19LATENCY; - else if (level >= 16) - return L16LATENCY; - else if (level >= 13) - return L13LATENCY; - else if (level >= 10) - return L10LATENCY; - else if (level == 9) - return L09LATENCY; - else if (level == 8) - return L08LATENCY; - else if (level == 7) - return L07LATENCY; - else if (level == 6) - return L06LATENCY; - else if (level == 5) - return L05LATENCY; - else if (level == 4) - return L04LATENCY; - else if (level == 3) - return L03LATENCY; - else if (level == 2) - return L02LATENCY; - else if (level == 1) - return L01LATENCY; - else if (level == 0) - return L00LATENCY; - return L00LATENCY; -} - -void resetActiveShape(Shape *active) -{ - genNextShape(); - copyShape(active); - active->x = 3; - if (active->t == 6) - active->y = 19; - else - active->y = 18; - for (;;) { - if (cellCollisionCheckHere(&fld, active)) - active->y++; - else - break; - } -} - -/* - * Game tick - * - */ -void tTick() -{ // If tick exceeds current level tick latency - if (sfClock_getElapsedTime(gameTick).microseconds - >= game.moveLatency) { - sfClock_restart(gameTick); - /* if bottom not reached */ - if ((wallCollisionCheck(DOWN) == 0) - && (cellCollisionCheck(DOWN) == 0)) { - active.y--; // Move - sfClock_restart(putTick); - } else { - if (sfClock_getElapsedTime(putTick).microseconds >= PUT_LATENCY) { - putShape(); // Just put the shape - sfClock_restart(putTick); - } - } - } -} - - -/* - * Rotate matrix left routine - * - */ -void rotateLeft() -{ - char arr[4][4]; - memcpy(&arr[0][0], &active.c[0][0], sizeof(char)*4*4); - if (active.t == 5) - return; - if (active.t == 6) { - for (int j = 3; j >= 0; j--) - for (int i = 0; i < 4; i++) - active.c[j][i] = arr[3-i][3-j]; - return; - } - for (int j = 3; j > 0; j--) - for (int i = 0; i < 3; i++) - active.c[j][i] = arr[3-i][j-1]; -} - - -/* - * Rotate matrix right routine - * - */ -void rotateRight() -{ - char arr[4][4]; - memcpy(&arr[0][0], &active.c[0][0], sizeof(char)*4*4); - if (active.t == 5) - return; - if (active.t == 6) { - for (int j = 3; j >= 0; j--) - for (int i = 0; i < 4; i++) - active.c[j][i] = arr[3-i][3-j]; - return; - } - for (int j = 3; j > 0; j--) - for (int i = 0; i < 3; i++) - active.c[j][i] = arr[i+1][3-j]; -} - - -/* - * Rotates active shape with callling collision checkers - * - */ -void rotateShape() -{ - rotateRight(); // Try rotate - if ((wallRotCollisionCheck()) - || (cellRotCollisionCheck())) - rotateLeft(); -} - -int cellRotCollisionCheck() -{ - 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) - return 1; // Collision happens - return 0; // Else it do not -} - - -int wallRotCollisionCheck() -{ - if (active.y < 0) //If shape has crossed Bottom border - for (int i = 0; i < 4; i++) - if (active.c[-1-active.y][i]) - return 1; // Collision happens - if (active.x < 0) //If shape has crossed Left border - for (int i = 0; i < 4; i++) - if (active.c[i][-1-active.x]) - return 1; // Collision happens - if (active.x > 6) //If shape has crossed Right border - for (int i = 0; i < 4; i++) - if (active.c[i][3-(active.x-7)]) - return 1; // Collision happens - return 0; // If no conditions are met collision is absent -} - -int cellCollisionCheckHere(Field *fld, Shape *active) -{ - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - if (active->y + i < fld->size.y) - if (active->c[i][j] && fld->c[i+active->y][j+active->x].a) - return 1; - return 0; -} - -int cellCollisionCheck(int dir) -{ - for (int j = 0; j < 4; j++) { - for (int i = 0; i < 4; i++) { - if ((dir & RIGHT) // Check Right - && (j+active.y >= 0) // Avoiding nonexisting fld cells - && (i+active.x+1 >= 0) // --- - && active.c[j][i] // Check activity - && fld.c[j+active.y][i+active.x+1].a) - return 1; // Collision happens - if ((dir & LEFT) // Check Left - && (j+active.y >= 0) // Avoiding nonexisting fld cells - && (i+active.x-1 >= 0) // --- - && active.c[j][i] // Check activity - && fld.c[j+active.y][i+active.x-1].a) - return 1; // Collision happens - if ((dir & DOWN) // Check Bottom - && (j+active.y-1 >= 0) // Avoiding nonexisting fld cells - && (i+active.x >= 0) // --- - && active.c[j][i] // Check activity - && fld.c[j+active.y-1][i+active.x].a) - return 1; // Collision happens - } - } - return 0; // Else it do not -} - -int wallCollisionCheck(int dir) -{ - if (dir & RIGHT) { // Right collision request - if (active.x >= 6) // If shape has reached Right boreder - for (int i = 0 ; i < 4; i++) - if (active.c[i][3-(active.x-6)]) - return 1; // Collision happens - } else if (dir & DOWN) { // Bottom collision request - if (active.y <= 0) //If shape has reached Bottom border - for (int i = 0; i < 4; i++) - if (active.c[-active.y][i]) - return 1; // Collision happens - } else if (dir & LEFT) // Left collision request - if (active.x <= 0) // If shape has reached Left border - for (int i = 0; i < 4; i++) - if (active.c[i][-active.x]) - return 1; // Collision happens - return 0; -} - - -/* - * Keys hold handler - * - */ -void tKeyCtrl() -{ - /* Up arrow key 'hold' handler */ - if (sfKeyboard_isKeyPressed(sfKeyUp)) { - if (!(arrKeys & UP)) { - arrKeys = arrKeys | UP; - rotateShape(); - } - } else { - if ((arrKeys & UP)) { - arrKeys = arrKeys & ~UP; - } - } - - /* Down Arrow Key 'hold' handler */ - if (sfKeyboard_isKeyPressed(sfKeyDown)) { - if (!(arrKeys & DOWN)) { - arrKeys = arrKeys | DOWN; - if (!wallCollisionCheck(DOWN) - && !cellCollisionCheck(DOWN)) { - active.y--; - // Avoid excess move down by gameTick - sfClock_restart(putTick); - sfClock_restart(gameTick); - game.scoreCurrent++; - } - repPushDown = sfClock_create(); - } else { - if (sfClock_getElapsedTime(repPushDown).microseconds - >= moveRepeatLatency2) - arrKeys = arrKeys & ~DOWN; - } - } else { - if ((arrKeys & DOWN)) { - arrKeys = arrKeys & ~DOWN; - } - } - - /* Left Arrow Key 'hold' handler */ - if (sfKeyboard_isKeyPressed(sfKeyLeft) - && !sfKeyboard_isKeyPressed(sfKeyRight)) { - if (!(arrKeys & LEFT)) { - arrKeys = arrKeys | LEFT; - if (!wallCollisionCheck(LEFT) - && !cellCollisionCheck(LEFT)) { - active.x--; - sfClock_restart(putTick); - } - repKeyLeft = sfClock_create(); - } else { - if (!(arrKeys & LEFTHOLD)) { - if (sfClock_getElapsedTime(repKeyLeft) - .microseconds - >= moveRepeatLatency1) { - arrKeys = arrKeys | LEFTHOLD; - arrKeys = arrKeys & ~LEFT; - } - } else { - if (sfClock_getElapsedTime(repKeyLeft) - .microseconds - >= moveRepeatLatency2) - arrKeys = arrKeys & ~LEFT; - } - } - } else if (!sfKeyboard_isKeyPressed(sfKeyLeft)) { - if ((arrKeys & LEFT)) { - arrKeys = arrKeys & ~LEFT; - arrKeys = arrKeys & ~LEFTHOLD; - } - } - - /* Right Arrow Key 'hold' handler */ - if (sfKeyboard_isKeyPressed(sfKeyRight) - && !sfKeyboard_isKeyPressed(sfKeyLeft)) { - if (!(arrKeys & RIGHT)) { - arrKeys = arrKeys | RIGHT; - if (!wallCollisionCheck(RIGHT) - && !cellCollisionCheck(RIGHT)) { - active.x++; - sfClock_restart(putTick); - } - repKeyRight = sfClock_create(); - } else { - if (!(arrKeys & RIGHTHOLD)) { - if (sfClock_getElapsedTime(repKeyRight).microseconds - >= moveRepeatLatency1) { - arrKeys = arrKeys | RIGHTHOLD; - arrKeys = arrKeys & ~RIGHT; - } - } else if (!sfKeyboard_isKeyPressed(sfKeyLeft)) { - if (sfClock_getElapsedTime(repKeyRight).microseconds - >= moveRepeatLatency2) // Wait short time - arrKeys = arrKeys & ~RIGHT; - } - } - } else { - if ((arrKeys & RIGHT)) { - arrKeys = arrKeys & ~RIGHT; - arrKeys = arrKeys & ~RIGHTHOLD; - } - } -} - - -/* - * Colorize active cells of field - * - */ -void colorizeFld() -{ - 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); - } -} - -/* - * Colorize active cells of active shape (overlay only - * active cells above background of fld) - * - */ -void colorizeActive() -{ - for (int j = 0; j < 4; j++) - for (int i = 0; i < 4; i++) - if (active.c[j][i] && j+active.y < 22) { - sfRectangleShape_setFillColor( - fld.p[j+active.y][i+active.x], - active.fColor); - sfRectangleShape_setOutlineColor( - fld.p[j+active.y][i+active.x], - UIFGACTIVECOLOR); - } -} - - -/* - * Draw all fld cells - * - */ -void drawFld(sfRenderWindow *window) -{ - for (int j = 0; j < fld.size.y; j++) - for (int i = 0; i < fld.size.x; i++) - sfRenderWindow_drawRectangleShape(window, fld.p[j][i], NULL); -} - - -void colorizeRandom(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 gameover(Game *game) -{ - game->isStarted = 0; - game->scoreCurrent = 0; - game->level = 0; - game->moveLatency = L00LATENCY; - game->lines = 0; -} - - -void genNextShape() -{ - active.t = next.t; - next.t = (rand()%7)+1; // Insert new random shape of 7 variants - copyShape(&next); - if (next.t == 5) - for (int j = 0; j < 3; j++) - for (int i = 0; i < 4; i++) - next.c[i][j] = next.c[i][j+1]; -} - - -void copyShape(Shape *localSh) -{ - switch (localSh->t) { // Copy cell active/inactive state - case 1 : - memcpy(&localSh->c[0][0], &arrShapeL[0][0], sizeof(char)*4*4); - localSh->fColor = LCOLOR; - break; - case 2 : - memcpy(&localSh->c[0][0], &arrShapeRL[0][0], sizeof(char)*4*4); - localSh->fColor = RLCOLOR; - break; - case 3 : - memcpy(&localSh->c[0][0], &arrShapeZ[0][0], sizeof(char)*4*4); - localSh->fColor = ZCOLOR; - break; - case 4 : - memcpy(&localSh->c[0][0], &arrShapeS[0][0], sizeof(char)*4*4); - localSh->fColor = SCOLOR; - break; - case 5 : - memcpy(&localSh->c[0][0], &arrShapeB[0][0], sizeof(char)*4*4); - localSh->fColor = BCOLOR; - break; - case 6 : - memcpy(&localSh->c[0][0], &arrShapeI[0][0], sizeof(char)*4*4); - localSh->fColor = ICOLOR; - break; - case 7 : - memcpy(&localSh->c[0][0], &arrShapeT[0][0], sizeof(char)*4*4); - localSh->fColor = TCOLOR; - break; - } -} - - -void drawNextShape(sfRenderWindow *window) -{ - for (int j = 0; j < 4; j++) - for (int i = 0; i < 4; i++) - if (next.c[j][i]) { - sfRectangleShape_setFillColor(next.p[j][i], next.fColor); - sfRectangleShape_setOutlineColor(next.p[j][i], UIFGACTIVECOLOR); - sfRenderWindow_drawRectangleShape(window, next.p[j][i], NULL); - } -} - -void freeFld() { - for (int j = 0; j < fld.size.y; j++) - for (int i = 0; i < fld.size.x; i++) - sfRectangleShape_destroy(fld.p[j][i]); - for (int j = 0; j < 4; j++) - for (int i = 0; i < 4; i++) - sfRectangleShape_destroy(next.p[j][i]); -} |