summaryrefslogtreecommitdiff
path: root/src/game.c
diff options
context:
space:
mode:
authorMenase Teshale <osome3717@gmail.com>2026-08-24 10:53:14 +0300
committerMenase Teshale <osome3717@gmail.com>2026-08-24 10:53:14 +0300
commit790249cc59bdf646ee38a081ebe392c33ae5b732 (patch)
tree45ca1026b88e4d0dc7709d041cb15455ccea508d /src/game.c
parent15b194df64db5850757d195344e682bb8ec4c138 (diff)
Started working on fonts
Diffstat (limited to 'src/game.c')
-rw-r--r--src/game.c68
1 files changed, 59 insertions, 9 deletions
diff --git a/src/game.c b/src/game.c
index 61323a3..8e51dca 100644
--- a/src/game.c
+++ b/src/game.c
@@ -33,6 +33,7 @@
#define BOARD_PADDING 4
#define BACKGROUND_SCROLL_SPEED 40
+#define MAX_CLEARED_TILES_STORED 50
typedef enum {
linear_move_state,
@@ -79,10 +80,20 @@ typedef enum {
swap_animation_state
} game_scene_state;
+typedef enum {
+ timed_mode,
+ combo_mode
+} game_mode;
+
+typedef struct {
+ float time_remaining;
+} timed_mode_data;
+
typedef struct {
bool inited;
SDL_Texture* spritesheet;
game_scene_state state;
+ game_mode mode;
piece pieces[MAX_PIECES];
int num_pieces;
@@ -104,6 +115,8 @@ typedef struct {
MIX_Track* background_music_track;
MIX_Track* effect_track;
MIX_Audio* pop_audio;
+
+ timed_mode_data timed_mode_data;
} s_game;
extern SDL_Window* window;
@@ -265,6 +278,15 @@ void init_game(SDL_Renderer* renderer, MIX_Mixer* mixer) {
fill_board();
}
+void init_timed_game(SDL_Renderer* renderer, MIX_Mixer* mixer, float time_remaining) {
+ init_game(renderer, mixer);
+
+ game.mode = timed_mode;
+ game.timed_mode_data = (timed_mode_data) {
+ .time_remaining = time_remaining
+ };
+}
+
void free_game() {
SDL_DestroyTexture(game.spritesheet);
SDL_DestroyTexture(game.background_texture);
@@ -351,6 +373,9 @@ int mouse_on_piece() {
}
void update_intro_state() {
+ if (game.state != intro_state)
+ return;
+
for (int i = 0; i < game.num_pieces; i++) {
if (game.pieces[i].state != static_state && game.pieces[i].state != fall_state) {
return;
@@ -463,6 +488,9 @@ static inline void play_sound_effect(MIX_Audio* audio) {
}
void update_piece_swap_animation_state() {
+ if (game.state != swap_animation_state)
+ return;
+
for (int i = 0; i < game.num_pieces; i++) {
if (game.pieces[i].state != static_state && game.pieces[i].state != fall_state)
return;
@@ -521,27 +549,32 @@ void scroll_background(float dt) {
}
}
-void update_game(float dt, MIX_Mixer* mixer) {
+
+void delete_out_of_screen_pieces() {
int window_width, window_height;
SDL_GetWindowSizeInPixels(window, &window_width, &window_height);
for (int i = 0; i < game.num_pieces; i++) {
- update_piece(&game.pieces[i], dt);
-
if (game.pieces[i].position.y > window_height + DELETE_PIECE_OFFSET) {
delete_piece(game.pieces[i].piece_id);
}
}
+}
- handle_piece_rotation(dt);
+void update_timed_mode(float dt);
+void update_game(float dt) {
+ for (int i = 0; i < game.num_pieces; i++) {
+ update_piece(&game.pieces[i], dt);
+ }
+ delete_out_of_screen_pieces();
+ handle_piece_rotation(dt);
scroll_background(dt);
- if (game.state == intro_state) {
- update_intro_state();
- } else if (game.state == swap_animation_state) {
- update_piece_swap_animation_state();
- }
+ update_intro_state();
+ update_piece_swap_animation_state();
+
+ update_timed_mode(dt);
}
void draw_piece(SDL_Renderer* renderer, const piece* piece) {
@@ -659,6 +692,8 @@ void piece_held_event(SDL_Event* e) {
}
}
+ //If pieces are more that one tile apart or
+ //they are of the same color do nothing
if (SDL_abs(selected_x-swap_x) + SDL_abs(selected_y-swap_y) != 1 ||
retreive_piece(selected_piece_id)->piece_color == retreive_piece(swap_piece_id)->piece_color) {
game.state = neutral_state;
@@ -683,3 +718,18 @@ void game_event(SDL_Event* e) {
piece_held_event(e);
}
}
+
+
+//**********************************************
+//*****************TIMED MODE*******************
+//*********************************************/
+void update_timed_mode(float dt) {
+ timed_mode_data* timed_mode_data = &game.timed_mode_data;
+
+ timed_mode_data->time_remaining =
+ SDL_max(timed_mode_data->time_remaining - dt, 0);
+
+ if (timed_mode_data->time_remaining <= 0) {
+ SDL_Log("Time over");
+ }
+}