summaryrefslogtreecommitdiff
path: root/src/main.c
blob: 731aa86bdaa618b15549fe3d5b449a8ce4e2ac13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "common.h"
#include "functions.h"
#include "text.h"

/* --- Variables --- */
Window w = {.mode = {450, 520, 32}};
Game game = {.isStarted = 0, .scoreCurrent = 0, .level = 1};
List *texts;
sfFont *fontScore;
Shape active, next;
Field fld;

uint8_t arrKeys = 0b00000000; // Arrow keys states byte container
/* --- Variables End --- */

sfClock *gameTick;
sfClock *mTick;
sfClock *repPushDown;    // Clock for repeat latency when Down arrow long push
sfClock *repKeyLeft;    // Clock for repeat latency when Left arrow long push
sfClock *repKeyRight;    // Clock for repeat latency when Left arrow long push

void prepare() {
    srand( time(NULL) );
    gameTick = sfClock_create();
    mTick = sfClock_create();
    fontScore = sfFont_createFromFile("dat/arial.ttf");
    if (!fontScore) {
        printf("dat/arial.ttf font load failed");
        exit(-1);
    }

    /*
     * Dimensions of every fld's cell
     * 23px - fill color 1px - for outline, 25 - at all
     */
    fld.cSize = (sfVector2f){.x = 23, .y = 23}; //Fld's cell size in pixels
    fld.cOutThick = 1;
    fld.pos = (sfVector2i){.x = 10, .y = 10+500-24}; // Fld bot left corner
    fld.size = (sfVector2i){.x = 10, .y = 25}; // Field's size in blocks

    next = (Shape){.x = 250+10+20, .y = 200,
        .cSize = {.x = 23, .y = 23}};

    initFld();
    texts = ListOfText_getFromListOfKeyMapOfString(ListOfKeyMapOfString_getFromYaml("dat/ya.yaml"));
    w.window = sfRenderWindow_create(w.mode,
            windowName_conf,
            sfResize | sfClose,
            NULL);
    if (!w.window)
        exit(EXIT_FAILURE);
}

void handleWindowEvents() {
    while (sfRenderWindow_pollEvent(w.window, &w.event))
        if (w.event.type == sfEvtClosed)
            sfRenderWindow_close(w.window);
}

void drawTextsAtScene(List *texts, char *scene, sfRenderWindow *window) {
    List *t = texts;
    while (t) {
        if (!strcmp(((Text *)t->obj)->scene, scene))
            sfRenderWindow_drawText(window, ((Text *)t->obj)->sfText, NULL);
        t = t->next;
    }
}

void gameLoop() {
    tTick();
    tKeyCtrl();
    valueAfterTextDisplay(game.scoreCurrent, texts, "score");
    valueAfterTextDisplay(game.level, texts, "level");
    colorizeFld();
    colorizeActive();
    drawFld(w.window);
    drawNextShape(w.window);
    drawTextsAtScene(texts, "game", w.window);
}

void menuTick()
{
    if(sfClock_getElapsedTime(mTick).microseconds >= basicLatency/game.level) {
        sfClock_restart(mTick);
        colorizeRandom(&fld);
    }
}

void menuLoop() {
    menuTick();
    drawFld(w.window);
    drawTextsAtScene(texts, "menu", w.window);
    if (sfKeyboard_isKeyPressed(sfKeyS) == 1) {
        game.isStarted = 1;
        freeFld();
        initFld();
    }
}

void mainLoop() {
    while (sfRenderWindow_isOpen(w.window)) {
        handleWindowEvents();
        sfRenderWindow_clear(w.window, sfBlack);
        if (game.isStarted) {
            gameLoop();
        } else {
            menuLoop();
        }
        sfRenderWindow_display(w.window);
    }
}

int main()
{
    prepare();
    colorizeRandom(&fld);
    mainLoop();
    /* Just senseless printf */
    printf("%d\n", game.scoreCurrent);
    freeFld();
    sfRenderWindow_destroy(w.window);
    ListOfText_free(&texts);

    return EXIT_SUCCESS;
}