1 #ifndef GAME_H 2 #define GAME_H 3 4 #include <stdint.h> 5 #include "libretro.h" 6 7 #define FONT "cairo:monospace" 8 #define FONT_SIZE 20 9 #define SPACING (int)(FONT_SIZE * 0.4) 10 #define TILE_SIZE (FONT_SIZE * 4) 11 #define TILE_ANIM_SPEED 5 12 13 #define GRID_WIDTH 4 14 #define GRID_HEIGHT 4 15 #define GRID_SIZE (GRID_WIDTH * GRID_HEIGHT) 16 17 #define BOARD_WIDTH (SPACING + TILE_SIZE * GRID_WIDTH + SPACING * (GRID_WIDTH - 1) + SPACING) 18 #define BOARD_HEIGHT (SPACING + TILE_SIZE * GRID_HEIGHT + SPACING * (GRID_HEIGHT - 1) + SPACING) 19 20 #define BOARD_OFFSET_Y SPACING + TILE_SIZE + SPACING 21 22 #define SCREEN_WIDTH SPACING + BOARD_WIDTH + SPACING 23 #define SCREEN_HEIGHT BOARD_OFFSET_Y + BOARD_HEIGHT + SPACING 24 25 extern int SCREEN_PITCH; 26 27 typedef struct 28 { 29 int up; 30 int down; 31 int left; 32 int right; 33 int start; 34 int select; 35 } key_state_t; 36 37 typedef enum 38 { 39 DIR_NONE, 40 DIR_UP, 41 DIR_RIGHT, 42 DIR_DOWN, 43 DIR_LEFT 44 } direction_t; 45 46 typedef enum 47 { 48 STATE_TITLE, 49 STATE_PLAYING, 50 STATE_GAME_OVER, 51 STATE_WON, 52 STATE_PAUSED 53 } game_state_t; 54 55 typedef struct vector 56 { 57 int x; 58 int y; 59 } vector_t; 60 61 typedef struct cell { 62 int value; 63 vector_t pos; 64 vector_t old_pos; 65 float move_time; 66 float appear_time; 67 struct cell *source; 68 } cell_t; 69 70 typedef struct game { 71 int score; 72 int best_score; 73 game_state_t state; 74 key_state_t old_ks; 75 direction_t direction; 76 cell_t grid[GRID_SIZE]; 77 } game_t; 78 79 extern retro_environment_t environ_cb; 80 extern retro_video_refresh_t video_cb; 81 extern retro_log_printf_t log_cb; 82 83 void game_calculate_pitch(void); 84 85 void game_init(void); 86 void game_deinit(void); 87 void game_reset(void); 88 void game_update(float delta, key_state_t *new_ks); 89 void *game_data(void); 90 void *game_save_data(void); 91 unsigned game_data_size(void); 92 void game_render(void); 93 int game_init_pixelformat(void); 94 95 void render_playing(void); 96 void render_title(void); 97 void render_win_or_game_over(void); 98 void render_paused(void); 99 100 #endif /* GAME_H */ 101