414 lines
9.8 KiB
Diff
414 lines
9.8 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 9831a3a..482f39c 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -2,12 +2,12 @@
|
|
MANDIR=$(DESTDIR)/usr/share/man/man6/
|
|
BINDIR=$(DESTDIR)/usr/games/
|
|
|
|
-CC=gcc
|
|
+CC=arm-buildroot-linux-musleabi-gcc
|
|
MKDIR=mkdir -p
|
|
INSTALL=install
|
|
|
|
-CFLAGS=-Wall -fomit-frame-pointer -O3
|
|
-LIBS=-lm -lncurses
|
|
+CFLAGS=-Wall -fomit-frame-pointer -O3 -I/home/moi/tp/lib/ncurses/buildNcurse/usr/include
|
|
+LIBS=-L/home/moi/tp/lib/ncurses/buildNcurse/usr/lib -lm -lncursesw
|
|
|
|
OBJS=ctris.o game.o screen.o brick.o highscore.o
|
|
OUTPUT=ctris
|
|
diff --git a/brick.o b/brick.o
|
|
new file mode 100644
|
|
index 0000000..8a0e376
|
|
Binary files /dev/null and b/brick.o differ
|
|
diff --git a/config.h b/config.h
|
|
new file mode 100644
|
|
index 0000000..8b13789
|
|
--- /dev/null
|
|
+++ b/config.h
|
|
@@ -0,0 +1 @@
|
|
+
|
|
diff --git a/ctris b/ctris
|
|
new file mode 100755
|
|
index 0000000..9ed491c
|
|
Binary files /dev/null and b/ctris differ
|
|
diff --git a/ctris.o b/ctris.o
|
|
new file mode 100644
|
|
index 0000000..5972bc7
|
|
Binary files /dev/null and b/ctris.o differ
|
|
diff --git a/game.c b/game.c
|
|
index 7a2bea0..b3d4a45 100644
|
|
--- a/game.c
|
|
+++ b/game.c
|
|
@@ -16,6 +16,20 @@ void init_board(char board[BOARD_HEIGHT][BOARD_WIDTH])
|
|
}
|
|
}
|
|
|
|
+// NEW CODE
|
|
+#define PATH_MODULE "/dev/mylab1_joystick"
|
|
+int fd;
|
|
+int buffer[5] = {1,1,1,1,1};
|
|
+int read_err;
|
|
+int init_mylab(){
|
|
+ fd = open(PATH_MODULE,O_RDONLY,S_IRUSR);
|
|
+ if(fd < 0){
|
|
+ printf("Could not retrieve mylab driver\n");
|
|
+ return fd;
|
|
+ }
|
|
+}
|
|
+//
|
|
+
|
|
void remove_this_row(WINDOW *win, char board[BOARD_HEIGHT][BOARD_WIDTH], unsigned char y)
|
|
{
|
|
unsigned char x;
|
|
@@ -88,6 +102,12 @@ unsigned int game_engine(bool resize)
|
|
static bool engine_stop = false;
|
|
|
|
show_headline();
|
|
+
|
|
+ // NEW CODE
|
|
+
|
|
+ init_mylab();
|
|
+
|
|
+ //
|
|
|
|
if (resize) {
|
|
if (game_state != PAUSED_STATE) {
|
|
@@ -147,7 +167,28 @@ unsigned int game_engine(bool resize)
|
|
while(game_state == RUNNING_STATE)
|
|
{
|
|
show_board_win(board_win, board, cur_brick, brick_type, x, y);
|
|
- switch(get_key(board_win))
|
|
+
|
|
+ int keyValue = get_key(board_win);
|
|
+
|
|
+ // NEW CODE
|
|
+ // Update KEY_STATE
|
|
+ read_err = read(fd,buffer,5 * sizeof(int));
|
|
+ if(read_err < 0)
|
|
+ printf("Could not read module\n");
|
|
+
|
|
+ if(!buffer[0])
|
|
+ keyValue = KEY_UP;
|
|
+ if(!buffer[1])
|
|
+ keyValue = KEY_DOWN;
|
|
+ if(!buffer[2])
|
|
+ keyValue = KEY_LEFT;
|
|
+ if(!buffer[3])
|
|
+ keyValue = KEY_RIGHT;
|
|
+ if(!buffer[4])
|
|
+ keyValue = 'p';
|
|
+ //
|
|
+
|
|
+ switch(keyValue)
|
|
{
|
|
case 's':
|
|
case KEY_DOWN:
|
|
@@ -278,5 +319,3 @@ unsigned int game_engine(bool resize)
|
|
engine_stop = true;
|
|
return score;
|
|
}
|
|
-
|
|
-
|
|
diff --git a/game.o b/game.o
|
|
new file mode 100644
|
|
index 0000000..1da7f4d
|
|
Binary files /dev/null and b/game.o differ
|
|
diff --git a/highscore.o b/highscore.o
|
|
new file mode 100644
|
|
index 0000000..44a44c1
|
|
Binary files /dev/null and b/highscore.o differ
|
|
diff --git a/oldgame.c b/oldgame.c
|
|
new file mode 100644
|
|
index 0000000..7a2bea0
|
|
--- /dev/null
|
|
+++ b/oldgame.c
|
|
@@ -0,0 +1,282 @@
|
|
+#include "ctris.h"
|
|
+#include "game.h"
|
|
+#include "brick.h"
|
|
+#include "screen.h"
|
|
+#include "highscore.h"
|
|
+
|
|
+void init_board(char board[BOARD_HEIGHT][BOARD_WIDTH])
|
|
+{
|
|
+ unsigned char i, n;
|
|
+ for(i = 0; i < BOARD_HEIGHT; i++)
|
|
+ {
|
|
+ for(n = 0; n < BOARD_WIDTH; n++)
|
|
+ {
|
|
+ board[i][n] = 0;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+void remove_this_row(WINDOW *win, char board[BOARD_HEIGHT][BOARD_WIDTH], unsigned char y)
|
|
+{
|
|
+ unsigned char x;
|
|
+ show_remove_row(win, board, y);
|
|
+ for(; y > 0; y--)
|
|
+ {
|
|
+ for(x = 0; x < BOARD_WIDTH; x++)
|
|
+ {
|
|
+ board[y][x] = board[y - 1][x];
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+void remove_rows(WINDOW *win, char board[BOARD_HEIGHT][BOARD_WIDTH], unsigned int *score, const char level)
|
|
+{
|
|
+ char removed_rows = 0;
|
|
+ unsigned char x, y;
|
|
+ unsigned int sub_score = 0;
|
|
+ for(y = 0; y < BOARD_HEIGHT; y++)
|
|
+ {
|
|
+ for(x = 0; x < BOARD_WIDTH; x++)
|
|
+ {
|
|
+ if(board[y][x] == 0)
|
|
+ {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ if(x >= BOARD_WIDTH)
|
|
+ {
|
|
+ remove_this_row(win, board, y);
|
|
+ removed_rows++;
|
|
+ sub_score += BONUS_CONST * level * removed_rows;
|
|
+ }
|
|
+ }
|
|
+ *score += sub_score;
|
|
+ if(removed_rows > 0)
|
|
+ {
|
|
+ refresh_win(win);
|
|
+ usleep(REMOVE_SPLASH_TIME);
|
|
+ }
|
|
+}
|
|
+
|
|
+void calc_level(const unsigned int score, char *level)
|
|
+{
|
|
+ while(SPEED_CONST_2 - (*level + 1) * SPEED_CONST_1 >= 0 && score / (LEVEL_CONST * (unsigned int)pow((double)*level, 2)) > 0)
|
|
+ {
|
|
+ *level += 1;
|
|
+ }
|
|
+}
|
|
+
|
|
+void pause_game()
|
|
+{
|
|
+ game_engine(true);
|
|
+}
|
|
+
|
|
+unsigned int start_game()
|
|
+{
|
|
+ return game_engine(false);
|
|
+}
|
|
+
|
|
+unsigned int game_engine(bool resize)
|
|
+{
|
|
+ static char brick_type, next_brick_type, name[40], cur_brick[4][4], board[BOARD_HEIGHT][BOARD_WIDTH], level = 1;
|
|
+ char run;
|
|
+ unsigned int score = 0;
|
|
+ static unsigned long time = 0L;
|
|
+ unsigned int tick = 0;
|
|
+ static unsigned char x, y;
|
|
+ static WINDOW *board_win, *preview_win, *score_win;
|
|
+ static bool engine_stop = false;
|
|
+
|
|
+ show_headline();
|
|
+
|
|
+ if (resize) {
|
|
+ if (game_state != PAUSED_STATE) {
|
|
+ // if the game engine is in the RUNING_STATE then
|
|
+ // the resize call below will switch the engine to PAUSED_STATE
|
|
+
|
|
+ // if the game is in the QUIT_STATE then
|
|
+ // the call below will simulate a key being pressed
|
|
+ // and that will force the highscore screen or play_again dialog to be refreshed
|
|
+ put_key('p');
|
|
+ }
|
|
+
|
|
+ if (game_state == QUIT_STATE)
|
|
+ {
|
|
+ // if the game is in the highscore screen then refresh it upon resize
|
|
+ if (!engine_stop) {
|
|
+ show_highscore(name);
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ // here we will only have RUNNING_STATE, PAUSED_STATE or GAME_OVER_STATE
|
|
+ // both states coresponds to the main screen so
|
|
+ // the main screen will be refreshed upon resize
|
|
+ show_score(score_win, score, level, time);
|
|
+ show_brick_preview(preview_win, next_brick_type);
|
|
+ show_board_win(board_win, board, cur_brick, brick_type, x, y);
|
|
+ if (game_state == PAUSED_STATE) {
|
|
+ show_pause(board_win);
|
|
+ }
|
|
+ else if (game_state == GAME_OVER_STATE) {
|
|
+ show_game_over(board_win);
|
|
+ }
|
|
+ }
|
|
+ return score;
|
|
+ }
|
|
+
|
|
+ engine_stop = false;
|
|
+ board_win = (WINDOW *)create_board_win();
|
|
+ preview_win = (WINDOW *)create_preview_win();
|
|
+ score_win = (WINDOW *)create_score_win();
|
|
+ init_board(board);
|
|
+ show_score(score_win, score, level, time);
|
|
+ next_brick_type = get_rand(7) + 1;
|
|
+ game_state = PAUSED_STATE;
|
|
+ wait_for_start(board_win);
|
|
+ game_state = RUNNING_STATE;
|
|
+ while(game_state == RUNNING_STATE)
|
|
+ {
|
|
+ brick_type = next_brick_type;
|
|
+ next_brick_type = get_rand(7) + 1;
|
|
+ show_brick_preview(preview_win, next_brick_type);
|
|
+ memcpy(cur_brick, brick_digit[brick_type - 1], sizeof(char) * 4 * 4);
|
|
+ x = BOARD_WIDTH / 2;
|
|
+ y = 0;
|
|
+ run = 1;
|
|
+ while(game_state == RUNNING_STATE)
|
|
+ {
|
|
+ show_board_win(board_win, board, cur_brick, brick_type, x, y);
|
|
+ switch(get_key(board_win))
|
|
+ {
|
|
+ case 's':
|
|
+ case KEY_DOWN:
|
|
+ if(old_style_keys != 0)
|
|
+ {
|
|
+ if(counterclockwise_rotation == 1)
|
|
+ {
|
|
+ change_direction(board, cur_brick, x, y, -1);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ change_direction(board, cur_brick, x, y, 1);
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if(check_brick(board, cur_brick, x, y + 1) == 0)
|
|
+ {
|
|
+ y++;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+ case 'w':
|
|
+ case 'k':
|
|
+ case KEY_UP:
|
|
+ if(counterclockwise_rotation == 1)
|
|
+ {
|
|
+ change_direction(board, cur_brick, x, y, 1);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ change_direction(board, cur_brick, x, y, -1);
|
|
+ }
|
|
+ break;
|
|
+ case 'd':
|
|
+ case 'l':
|
|
+ case KEY_RIGHT:
|
|
+ if(check_brick(board, cur_brick, x + 1, y) == 0)
|
|
+ {
|
|
+ x++;
|
|
+ }
|
|
+ break;
|
|
+ case 'a':
|
|
+ case 'j':
|
|
+ case KEY_LEFT:
|
|
+ if(x > 0 && check_brick(board, cur_brick, x - 1, y) == 0)
|
|
+ {
|
|
+ x--;
|
|
+ }
|
|
+ break;
|
|
+ case ' ':
|
|
+ if(old_style_keys != 0)
|
|
+ {
|
|
+ if(check_brick(board, cur_brick, x, y + 1) == 0)
|
|
+ {
|
|
+ y++;
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ while(check_brick(board, cur_brick, x, y + 1) == 0)
|
|
+ {
|
|
+ y++;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+ case 'p':
|
|
+ game_state = PAUSED_STATE;
|
|
+ show_pause(board_win);
|
|
+ while(old_get_key(board_win) != 'p');
|
|
+ game_state = RUNNING_STATE;
|
|
+ break;
|
|
+ case 'q':
|
|
+ game_state = QUIT_STATE;
|
|
+ break;
|
|
+ }
|
|
+ tick = SPEED_CONST_2 - level * SPEED_CONST_1;
|
|
+ time += tick;
|
|
+ show_score(score_win, score, level, time);
|
|
+ usleep(tick);
|
|
+ if(run > 15)
|
|
+ {
|
|
+ if(check_brick(board, cur_brick, x, y + 1) == 0)
|
|
+ {
|
|
+ y++;
|
|
+ run = 0;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if(y <= 1)
|
|
+ {
|
|
+ game_state = GAME_OVER_STATE;
|
|
+ show_game_over(board_win);
|
|
+ while(old_get_key(board_win) != ' ');
|
|
+ game_state = QUIT_STATE;
|
|
+ }
|
|
+ draw_to_board(board, cur_brick, brick_type, x, y);
|
|
+ show_board_win(board_win, board, cur_brick, brick_type, x, y);
|
|
+ remove_rows(board_win, board, &score, level);
|
|
+#ifdef EXTRA_BONUS
|
|
+ score += level;
|
|
+#endif
|
|
+ calc_level(score, &level);
|
|
+ show_score(score_win, score, level, time);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ run++;
|
|
+ }
|
|
+
|
|
+ }
|
|
+ destroy_score_win(score_win);
|
|
+ destroy_preview_win(preview_win);
|
|
+ destroy_board_win(board_win);
|
|
+ if(game_state == QUIT_STATE)
|
|
+ {
|
|
+ if(in_highscore(score) == 0)
|
|
+ {
|
|
+ add_user_to_highscore(name, score);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ strncpy(name, "-no-name-", 40);
|
|
+ }
|
|
+ show_highscore(name);
|
|
+ getch();
|
|
+ }
|
|
+ engine_stop = true;
|
|
+ return score;
|
|
+}
|
|
+
|
|
+
|
|
diff --git a/screen.o b/screen.o
|
|
new file mode 100644
|
|
index 0000000..3ea2576
|
|
Binary files /dev/null and b/screen.o differ
|