diff options
author | Oxore <oxore@protonmail.com> | 2018-07-03 15:11:54 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2018-07-03 15:11:54 +0300 |
commit | ed8127a72e1a2d2703372d5b5dfa8d96703ec3bb (patch) | |
tree | 80f340c64861913f2dc648c2c7280c144b988881 /src/engine.c | |
parent | 21a0a44853451f3d791bafc80c01deab0ff4c79e (diff) |
Refactor field, refactor next shape drawing
Refactor field functions names. Transfer next shape drawing to painter.
Introduce idlist struct with foreach function. Refactor config.
Introduce color map array instead of "switch case" statement bloating
while coloring rectangles. Decouple field and shape structs from SFML
sfVector2 structs by introducing own vector2i and vector2ui structs.
Also remove sfRectangleShape members form field an shape structs.
Diffstat (limited to 'src/engine.c')
-rw-r--r-- | src/engine.c | 86 |
1 files changed, 31 insertions, 55 deletions
diff --git a/src/engine.c b/src/engine.c index 210257b..9840b34 100644 --- a/src/engine.c +++ b/src/engine.c @@ -2,32 +2,23 @@ #include <stdlib.h> #include <string.h> #include <SFML/System/Clock.h> +#include <SFML/Window/Keyboard.h> #include <SFML/Graphics/RenderWindow.h> #include <SFML/Graphics/Text.h> -#include <SFML/Graphics/RectangleShape.h> #include "common.h" #include "tet_conf.h" #include "text.h" #include "field.h" +#include "draw.h" #include "engine.h" /* Externs from main.c */ extern struct game game; -extern struct shape active, next; -extern struct field fld; - -extern sfFont *fontScore; +extern struct field fld, nxt; 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 - void valueAfterTextDisplay(int value, List *texts, char *type) { List *l = texts; @@ -59,7 +50,7 @@ void checkLevelUp(struct game *game) } } -int getMoveLatencyOfLevel(int level) +int getMoveLatencyOfLevel(unsigned int level) { if (level >= 29) return L29LATENCY; @@ -103,18 +94,22 @@ void tTick() { // If tick exceeds current level tick latency if (sfClock_getElapsedTime(game.gameTick).microseconds >= game.moveLatency) { sfClock_restart(game.gameTick); - active.y--; // try - if (collide(&fld, &active)) - active.y++; // fallback + fld.shape[0].y--; // try + if (field_shape_collision(&fld, &fld.shape[0])) + fld.shape[0].y++; // fallback else sfClock_restart(game.putTick); if (sfClock_getElapsedTime(game.putTick).microseconds >= PUT_LATENCY) { - if (out_of_field(&fld, &active)) { + if (field_shape_out_of_bounds(&fld, &fld.shape[0])) { gameover(&game); + fld.shape[0].y = fld.size.y; + field_fill_random(&fld); + nxt.attr |= FLD_ATTR_INVISIBLE; + painter_update_field(nxt.id, &nxt); return; } else { - putShape(&fld, &active); - int removedLines = rm_lines(&fld); + field_put_shape(&fld, &fld.shape[0]); + int removedLines = field_rm_lines(&fld); game.lines += removedLines; switch (removedLines) { case 1: @@ -130,9 +125,13 @@ void tTick() game.scoreCurrent += RM_4LINES_SCORE * game.level; break; } - active.t = next.t; - resetActiveShape(&fld, &active); - gen_shape(&next); + fld.shape[0].t = nxt.shape[0].t; + field_reset_walking_shape(&fld, 0); + for (unsigned int s = 0; s < nxt.shape_cnt - 1; ++s) { + nxt.shape[s] = nxt.shape[s + 1]; + nxt.shape[s].y = 4 - s * 3; + } + shape_gen_random(&nxt.shape[nxt.shape_cnt - 1]); checkLevelUp(&game); } sfClock_restart(game.putTick); @@ -150,7 +149,7 @@ void tKeyCtrl() if (sfKeyboard_isKeyPressed(sfKeyUp)) { if (!(arrKeys & UP)) { arrKeys = arrKeys | UP; - rotate_shape(&fld, &active); + field_rotate_shape(&fld, 0); } } else { if ((arrKeys & UP)) { @@ -162,9 +161,9 @@ void tKeyCtrl() if (sfKeyboard_isKeyPressed(sfKeyDown)) { if (!(arrKeys & DOWN)) { arrKeys = arrKeys | DOWN; - active.y--; - if (collide(&fld, &active)) - active.y++; + fld.shape[0].y--; + if (field_shape_collision(&fld, &fld.shape[0])) + fld.shape[0].y++; else { // Avoid excess move down by gameTick sfClock_restart(game.putTick); @@ -188,9 +187,9 @@ void tKeyCtrl() && !sfKeyboard_isKeyPressed(sfKeyRight)) { if (!(arrKeys & LEFT)) { arrKeys = arrKeys | LEFT; - active.x--; - if (collide(&fld, &active)) - active.x++; + fld.shape[0].x--; + if (field_shape_collision(&fld, &fld.shape[0])) + fld.shape[0].x++; else sfClock_restart(game.putTick); sfClock_restart(game.repKeyLeft); @@ -219,9 +218,9 @@ void tKeyCtrl() && !sfKeyboard_isKeyPressed(sfKeyLeft)) { if (!(arrKeys & RIGHT)) { arrKeys = arrKeys | RIGHT; - active.x++; - if (collide(&fld, &active)) - active.x--; + fld.shape[0].x++; + if (field_shape_collision(&fld, &fld.shape[0])) + fld.shape[0].x--; else sfClock_restart(game.putTick); sfClock_restart(game.repKeyRight); @@ -246,17 +245,6 @@ void tKeyCtrl() } } -/* - * Draw all fld cells - * - */ -void drawFld(sfRenderWindow *window, struct field *fld) -{ - 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 gameover(struct game *game) { game->isStarted = 0; @@ -265,15 +253,3 @@ void gameover(struct game *game) game->moveLatency = L00LATENCY; game->lines = 0; } - -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); - } -} - |