From 790249cc59bdf646ee38a081ebe392c33ae5b732 Mon Sep 17 00:00:00 2001 From: Menase Teshale Date: Mon, 24 Aug 2026 10:53:14 +0300 Subject: Started working on fonts --- src/game.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 9 deletions(-) (limited to 'src/game.c') 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"); + } +} -- cgit v1.2.3