summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine.c102
-rw-r--r--src/main.c5
-rw-r--r--src/text.c5
3 files changed, 96 insertions, 16 deletions
diff --git a/src/engine.c b/src/engine.c
index a087fd2..d9cfe98 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -20,6 +20,7 @@
#define LEFT (1 << 3)
#define RIGHTHOLD (1 << 4)
#define HARDDROP (1 << 5)
+#define PAUSE (1 << 6)
#define LEFTHOLD (1 << 7)
int level_move_latency[] = {
@@ -67,7 +68,7 @@ int rmlines_score[] = {
extern struct game game;
extern struct field fld, nxt;
extern struct idlist *texts;
-extern char arrKeys;
+char arrKeys = 0;
static void render_score_value(void *obj)
{
@@ -140,6 +141,20 @@ static void show_game_text(void *obj)
text->attr &= ~TXT_ATTR_INVISIBLE;
}
+static void hide_pause_text(void *obj)
+{
+ struct text *text = obj;
+ if (!strcmp(text->scene, "game") && !strcmp(text->type, "pause"))
+ text->attr |= TXT_ATTR_INVISIBLE;
+}
+
+static void show_pause_text(void *obj)
+{
+ struct text *text = obj;
+ if (!strcmp(text->scene, "game") && !strcmp(text->type, "pause"))
+ text->attr &= ~TXT_ATTR_INVISIBLE;
+}
+
static void update_menu_text(void *obj)
{
struct text *text = obj;
@@ -156,7 +171,7 @@ static void update_game_text(void *obj)
static void transition_game_over()
{
- game.isStarted = 0;
+ game.started = 0;
game.scoreCurrent = 0;
game.level = 1;
game.moveLatency = get_level_latency(game.level);
@@ -207,9 +222,30 @@ static void transition_put_shape()
level_up(&game);
}
+static void transition_pause()
+{
+ game.paused = 1;
+ int elapsed = sfClock_getElapsedTime(game.gameTick).microseconds;
+ if (game.moveLatency - elapsed >= 0)
+ game.moveLatency -= elapsed;
+ else
+ game.moveLatency = get_level_latency(game.level);
+ sfClock_restart(game.gameTick);
+ list_foreach(texts, show_pause_text);
+}
+
+static void transition_unpause()
+{
+ game.paused = 0;
+ sfClock_restart(game.gameTick);
+ list_foreach(texts, hide_pause_text);
+}
+
static void game_tick()
{
sfClock_restart(game.gameTick);
+
+ game.moveLatency = get_level_latency(game.level);
if (field_move_shape_down(&fld, 1)) {
project_ghost_shape(&fld, 1, 0);
sfClock_restart(game.putTick);
@@ -221,6 +257,11 @@ static void game_tick()
transition_put_shape();
sfClock_restart(game.putTick);
}
+
+ list_foreach(texts, render_score_value);
+ list_foreach(texts, render_level_value);
+ painter_update_field(fld.id, &fld);
+ painter_update_field(nxt.id, &nxt);
}
static void signal_up()
@@ -267,8 +308,27 @@ static void signal_right()
}
}
+static void signal_pause()
+{
+ if (game.paused)
+ transition_unpause();
+ else
+ transition_pause();
+ sfClock_restart(game.putTick);
+}
+
static void game_keys()
{
+ /* PAUSE */
+ if (sfKeyboard_isKeyPressed(sfKeyP)) {
+ if (!(arrKeys & PAUSE)) {
+ arrKeys = arrKeys | PAUSE;
+ signal_pause();
+ }
+ } else {
+ arrKeys = arrKeys & ~PAUSE;
+ }
+
/* UP */
if (sfKeyboard_isKeyPressed(sfKeyUp)) {
if (!(arrKeys & UP)) {
@@ -344,6 +404,19 @@ static void game_keys()
}
}
+static void pause_keys()
+{
+ /* PAUSE */
+ if (sfKeyboard_isKeyPressed(sfKeyP)) {
+ if (!(arrKeys & PAUSE)) {
+ arrKeys = arrKeys | PAUSE;
+ signal_pause();
+ }
+ } else {
+ arrKeys = arrKeys & ~PAUSE;
+ }
+}
+
static void menuTick()
{
sfClock_restart(game.mTick);
@@ -361,7 +434,8 @@ void transition_init(void)
static void transition_game_start()
{
- game.isStarted = 1;
+ game.started = 1;
+ game.paused = 0;
field_clear(&fld);
shape_gen_random(&fld.shape[1]);
field_reset_walking_shape(&fld, 1);
@@ -372,8 +446,11 @@ static void transition_game_start()
nxt.attr &= ~FLD_ATTR_INVISIBLE;
list_foreach(texts, hide_menu_text);
list_foreach(texts, show_game_text);
+ list_foreach(texts, hide_pause_text);
list_foreach(texts, update_menu_text);
list_foreach(texts, update_game_text);
+ painter_update_field(fld.id, &fld);
+ painter_update_field(nxt.id, &nxt);
sfClock_restart(game.gameTick);
}
@@ -382,7 +459,6 @@ static void menu_loop() {
menuTick();
if (sfKeyboard_isKeyPressed(sfKeyS) == 1)
transition_game_start();
- painter_draw();
}
static void game_loop() {
@@ -391,17 +467,25 @@ static void game_loop() {
game_tick();
list_foreach(texts, render_score_value);
list_foreach(texts, render_level_value);
+ list_foreach(texts, update_game_text);
painter_update_field(fld.id, &fld);
painter_update_field(nxt.id, &nxt);
- list_foreach(texts, update_game_text);
- painter_draw();
+}
+
+static void pause_loop() {
+ pause_keys();
}
void main_loop()
{
- if (game.isStarted)
- game_loop();
- else
+ if (game.started) {
+ if (game.paused)
+ pause_loop();
+ else
+ game_loop();
+ } else {
menu_loop();
+ }
+ painter_draw();
}
diff --git a/src/main.c b/src/main.c
index 89754ff..bf9014a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,15 +21,14 @@ struct idlist *texts;
struct field fld, nxt;
struct game game = {
- .isStarted = 0,
+ .started = 0,
+ .paused = 0,
.scoreCurrent = 0,
.level = 1,
.moveLatency = L00LATENCY,
.lines = 0
};
-char arrKeys = 0;
-
static void handleWindowEvents() {
sfEvent event;
while (sfRenderWindow_pollEvent(window, &event))
diff --git a/src/text.c b/src/text.c
index 6d7cc83..46304ae 100644
--- a/src/text.c
+++ b/src/text.c
@@ -43,20 +43,17 @@ void utf8to32_strcpy(wchar_t *dest, char *src)
int clen = utf8_char_len(*c);
if (clen == 1) {
dc[len] = c[0] & 0x7f;
- c += 1;
} else if (clen == 2) {
dc[len] = ((c[0] & 0x1f) << 6) | ((c[1] & 0x3f) << 0);
- c += 2;
} else if (clen == 3) {
dc[len] = ((c[0] & 0x0f) << 12) | ((c[1] & 0x3f) << 6) | ((c[2] & 0x3f) << 0);
- c += 3;
} else if (clen == 4) {
dc[len] = ((c[0] & 0x07) << 18) | ((c[1] & 0x3f) << 12) | ((c[2] & 0x3f) << 6) | ((c[3] & 0x3f) << 0);
- c += 4;
} else {
dc[len] = 0;
return;
}
+ c += clen;
++len;
}
dc[len] = 0;