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