#include "include.h" #include "main.h" #include "audio.h" #include "logic.h" #include "graphics.h" #include "keys.h" int pause_game(SDL_Surface *screen) { pause_bgm(); //return 1 = quit; return 0 = proceed SDL_Surface *pauseIMG = load_asset("assets/images/pause.png"); SDL_BlitSurface(pauseIMG, NULL, screen, NULL); SDL_Flip(screen); SDL_FreeSurface(pauseIMG); SDL_Event event; while (1) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: return 1; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: //select -> exit return 1; case SDLK_RETURN: //start -> continue resume_bgm(); return 0; case SDLK_BACKSPACE: //R -> reset resume_bgm(); return 2; break; case SDLK_LSHIFT: //Y -> clear best score save_best_score_to_file(0); resume_bgm(); return 2; case SDLK_SPACE: //X -> zen mode // to be implemented soon (TM) break; case SDLK_LALT: //B -> hard mode // to be implemented soon (TM) break; case SDLK_LCTRL: //A -> normal // to be implemented soon (TM) break; default: break; } } } SDL_Delay(100); } } int match(SDL_Surface *screen) { //return 1 = quit; return 0 = new game int game_over = 0; int player_x = 155; int player_y = 213; float player_speed_x = 0; float player_speed_y = 0; int player_last_x_1 = 0; int player_last_y_1 = 0; int paw1_x = 0; int paw1_y = 0; int player_last_x_2 = 0; int player_last_y_2 = 0; int paw2_x = 0; int paw2_y = 0; int lemon_x = 0; int lemon_y = 0; float lemon_speed_x = 2.5; float lemon_speed_y = 2.5; int down_keys[6] = {0}; int score = 0; int best_score = get_best_score_from_file(); int player_past_x[40] = {0}; int player_past_y[40] = {0}; long long frame = 0; long long last_point = 0; play_sound("game_start"); stop_bgm(); play_bgm("in_game"); while(!game_over) { frame++; Uint32 start = SDL_GetTicks(); SDL_Event event; // add or remove keys to the down keys array int key = 0; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: return 1; case SDL_KEYDOWN: key = internal_keycode_from_sdl(event.key.keysym.sym); if(key != -1) { down_keys[key] = 1; } break; case SDL_KEYUP: key = internal_keycode_from_sdl(event.key.keysym.sym); if(key != -1) { down_keys[key] = 0; } break; } } player_decelerate(&player_speed_x, &player_speed_y); player_cap(&player_speed_x, &player_speed_y); player_approximate(&player_speed_x, &player_speed_y); avoid_player_outside_bonds(&player_x, &player_y, &player_speed_x, &player_speed_y); // add speed according to down keys if(down_keys[0]) { player_speed_y -= 0.2; } if(down_keys[1]) { player_speed_x += 0.2; } if(down_keys[2]) { player_speed_y += 0.2; } if(down_keys[3]) { player_speed_x -= 0.2; } // add player speed to player position player_x += player_speed_x; player_y += player_speed_y; lemon_decelerate(&lemon_speed_x, &lemon_speed_y); lemon_cap(&lemon_speed_x, &lemon_speed_y); avoid_lemon_outside_bonds(&lemon_x, &lemon_y, &lemon_speed_x, &lemon_speed_y); // add lemon speed to lemon position lemon_x += lemon_speed_x; lemon_y += lemon_speed_y; if (is_player_inside_lemon(player_x, player_y, lemon_x, lemon_y)) { lemon_speed_x = lemon_speed_x + player_speed_x; lemon_speed_y = lemon_speed_y + player_speed_y; player_speed_x = -player_speed_x * 0.9; player_speed_y = -player_speed_y * 0.9; if(last_point + 30 < frame) { score++; play_sound("clap"); last_point = frame; } } clear_screen(screen); // update paw prints if(frame % 30 == 0) { if((frame / 30) % 2 == 0) { player_last_x_1 = player_past_x[0]; player_last_y_1 = player_past_y[0]; paw1_x = player_last_x_2; paw1_y = player_last_y_2; }else{ player_last_x_2 = player_past_x[0]; player_last_y_2 = player_past_y[0]; paw2_x = player_last_x_1; paw2_y = player_last_y_1; } } // TEST // SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 31, y: 79, w: 5, h: 5}, screen, &(SDL_Rect){x: player_past_x[5], y: player_past_y[5]}); if(check_player_inside_prints(player_past_x[5], player_past_y[5], paw1_x, paw1_y, paw2_x, paw2_y)) { if(frame > 180) { game_over = 1; } } // draw lemon SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 0, y: 48, w: 64, h: 64}, screen, &(SDL_Rect){x: lemon_x, y: lemon_y}); // add position to past positions and draw tail pieces int *temp_past_x; temp_past_x = player_past_x; int *temp_past_y; temp_past_y = player_past_y; int i; for(i = 0; i < 39; i++) { player_past_x[i] = temp_past_x[i+1]; player_past_y[i] = temp_past_y[i+1]; if(i % 5 == 0 && player_past_x[i] != 0 && player_past_y[i] != 0) { // draw player tail pieces SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 128 - i/5 * 16, y: 0, w: 16, h: 16}, screen, &(SDL_Rect){x: player_past_x[i], y: player_past_y[i]}); } } player_past_x[39] = player_x; player_past_y[39] = player_y; // draw player head SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 0, y: 0, w: 16, h: 16}, screen, &(SDL_Rect){x: player_x, y: player_y}); // add paw prints if(paw1_x != 0) { // make sure it isn't in the first secs of the game where random prints would appear in top left SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 0, y: 16, w: 32, h: 32}, screen, &(SDL_Rect){x: paw1_x, y: paw1_y}); SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 32, y: 16, w: 32, h: 32}, screen, &(SDL_Rect){x: paw2_x, y: paw2_y}); } // handle pause input int was_paused = 0; if(down_keys[4] || down_keys[5]) { switch(pause_game(screen)) { case 1: // request to exit return 1; case 2: // restart the game return 0; } was_paused = 1; down_keys[4] = 0; down_keys[5] = 0; } print_score(276, 204, score, screen); // current score print_score(276, 21, best_score, screen); // best score SDL_Flip(screen); // sleep so that the fps stays at abt 60fps if(!was_paused) { Uint32 end = SDL_GetTicks(); float elapsedMS = end - start; SDL_Delay(floor(16.666f - elapsedMS)); } } stop_bgm(); play_bgm("game_over"); if(score > best_score) { save_best_score_to_file(score); } SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 64, y: 32, w: 64, h: 16}, screen, &(SDL_Rect){x: 133, y: 206}); // push start SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 64, y: 16, w: 16, h: 16}, screen, &(SDL_Rect){x: player_x, y: player_y}); // caught face SDL_Flip(screen); SDL_Event event; while (1) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: return 1; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: //select -> pause menu pause_game(screen); case SDLK_RETURN: //start -> new game return 0; default: break; } } } SDL_Delay(100); } return 0; } int boot_animation(SDL_Surface *screen) { //return 1 = quit 0 = continue; SDL_Event event; SDL_Flip(screen); play_sound_and_wait("inhale"); SDL_Rect SrcR = {x: 89, y: 64, w: 35, h: 20}; SDL_Rect DestR = {x: 126, y: 51}; SDL_BlitSurface(tilesIMG, &SrcR, screen, &DestR); //Jil SDL_Flip(screen); DestR.x = 126+35; SDL_BlitSurface(tilesIMG, &SrcR, screen, &DestR); //Jil SDL_Flip(screen); play_sound_and_wait("sneeze_long"); SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 80, y: 25, w: 44, h: 7}, screen, &(SDL_Rect){x: 138, y: 121}); //Date SDL_Flip(screen); play_sound_and_wait("sneeze_short"); SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 64, y: 103, w: 55, h: 9}, screen, &(SDL_Rect){x: 133, y: 141}); //Tortoiseshell SDL_Flip(screen); //SDL_Delay(1000); play_sound_and_wait("cough_cough"); while (SDL_PollEvent(&event)) { // discard the inputs } SDL_BlitSurface(tilesIMG, &(SDL_Rect){x: 66, y: 37, w: 62, h: 10}, screen, &(SDL_Rect){x: 133, y: 166}); //Push start SDL_Flip(screen); play_sound("ronf"); while (1) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: return 1; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: //select -> pause menu if(pause_game(screen)) { return 1; } case SDLK_RETURN: //start -> continue return 0; default: break; } } } SDL_Delay(100); } }