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