/* - Avoid ~ a game by Canneddonuts - Filename ~ Gameplay.c - Author ~ Return0ne - 2022 - *no license* */ #include "../include/raylib.h" #include "Screens.h" #include "Controls.h" #include "Options.h" #include "Gameplay.h" #include "Score.h" #include "Timers.h" #include "Textures.h" int score = 0, bestscore = 0, finishfromGameplayScreen = 0; Levels level = 0; void SetEnemyLevel(void) { switch (level) { case LEVEL1: enemy.speed *= 1.0f; break; case LEVEL2: enemy.speed *= 2.0f; break; case LEVEL3: enemy.speed *= 2.0f; break; } } void LoadGamplayScreen(void) { fxhit = LoadSound("assets/sfx/hit.wav"); player_sprite = LoadTexture("assets/gfx/player.png"); enemy_sprite = LoadTexture("assets/gfx/enemy.png"); fxfeather = LoadSound("assets/sfx/feather.wav"); feather_sprite = LoadTexture("assets/gfx/feather.png"); attack_sprite = LoadTexture("assets/gfx/attack.png"); firework_sprite = LoadTexture("assets/gfx/firework.png"); fxboom = LoadSound("assets/sfx/boom.wav"); } void InitGameplayScreen(void) { finishfromGameplayScreen = 0; level = LEVEL1; globalTimer = 0; player.currentframe = 0; player.speed = 300.0f; player.hp = PLAYER_HP; if (GI_callcount < 1) { player.frameRec = (Rectangle) { player.hitbox.x, player.hitbox.y, (float) player_sprite.width/3, (float) player_sprite.height }; } player.hitbox = (Rectangle) { 0, 100, (float) player_sprite.width/3, (float) player_sprite.height/2 +5 }; player_iframeTimer = 0; player_in = false; player.color = RAYWHITE; enemy.currentframe = 0; enemy.hp = 5; enemy.speed = 2.0f; if (GI_callcount < 1) { enemy.frameRec = (Rectangle) { enemy.hitbox.x, enemy.hitbox.y, (float) enemy_sprite.width/2, (float) enemy_sprite.height }; } enemy.hitbox = (Rectangle) { 690, 10, (float) enemy_sprite.width/2, (float) enemy_sprite.height }; enemy.color = RAYWHITE; enemy_hurt = false; enemy_iframetimer = 0; feather.hitbox = (Rectangle) { GetRandomValue(0, GetScreenWidth() - feather_sprite.width), GetRandomValue(0, GetScreenHeight() - feather_sprite.height), (float) feather_sprite.width, (float) feather_sprite.height }; feather.active = true; feather.power = 0; for (int i = 0; i < MAX_FIREWORKS; i++) { fireworks[i].active = 0; fireworks[i].hitbox = (Rectangle) { 630, GetRandomValue(0, GetScreenHeight()), (float) firework_sprite.width/2 + 10, (float) firework_sprite.height }; fireworks[i].color = RAYWHITE; } for (int i = 0; i < MAX_SHOOTS; i++) { shoot[i].hitbox = (Rectangle) { player.hitbox.x, player.hitbox.y, (float) attack_sprite.width, (float) attack_sprite.height }; shoot[i].speed.x = 500.f; shoot[i].speed.y = 0; shoot[i].active = false; shoot[i].color = RED; } ammo = 0; pause = 0; DebugMode = 0; pauseTimer = 0; score = 0; GI_callcount++; } void DamagePlayer(void) { if (!player_in) { player.hp--; if (!mute) PlaySoundMulti(fxhit); player_in = true; } player.currentframe = 1; } void UpdateTimers(void) { score++; globalTimer++; if (player_in) { player_iframeTimer++; player.currentframe = 1; if (globalTimer % 2 == 0) player.color = BLANK; else player.color = RAYWHITE; if (player_iframeTimer >= 60) { player_in = false; player_iframeTimer = 0; } } else { player.color = RAYWHITE; player.currentframe = 0; } if (enemy_hurt) { enemy_iframetimer++; enemy.currentframe = 1; if (globalTimer % 2 == 0) enemy.color = BLANK; else enemy.color = RAYWHITE; if (enemy_iframetimer >= 60) { enemy_hurt = false; enemy_iframetimer = 0; } } else { enemy.color = RAYWHITE; enemy.currentframe = 0; } } void UpdateGameplayScreen(void) { if (INPUT_OPTION_PRESSED) pause = !pause; if (level > 2) finishfromGameplayScreen = 3; if (!pause) { if (INPUT_LEFT_DOWN) player.hitbox.x -= GetFrameTime() * player.speed; if (INPUT_RIGHT_DOWN) player.hitbox.x += GetFrameTime() * player.speed; if (INPUT_UP_DOWN) player.hitbox.y -= GetFrameTime() * player.speed; if (INPUT_DOWN_DOWN) player.hitbox.y += GetFrameTime() * player.speed; if (INPUT_DASH_DOWN) { player.speed = 600.0f; if (player.currentframe != 1) player.currentframe = 2; } else player.speed = 300.0f; if (INPUT_FIRE_PRESSED) { if (ammo > 0) { for (int i = 0; i < MAX_SHOOTS; i++) { if (!shoot[i].active) { ammo--; shoot[i].hitbox.x = player.hitbox.x; shoot[i].hitbox.y = player.hitbox.y + player.hitbox.height/4; shoot[i].active = true; break; } } } } player.sprite_pos = (Vector2){ player.hitbox.x, player.hitbox.y }; player.frameRec.x = (float)player.currentframe*(float)player_sprite.width/3; feather.sprite_pos = (Vector2){ feather.hitbox.x, feather.hitbox.y }; enemy.sprite_pos = (Vector2){ enemy.hitbox.x, enemy.hitbox.y }; enemy.frameRec.x = (float)enemy.currentframe*(float)enemy_sprite.width/2; for (int i = 0; i < MAX_FIREWORKS; i++) { fireworks[i].sprite_pos = (Vector2){ fireworks[i].hitbox.x, fireworks[i].hitbox.y }; } for (int i = 0; i < MAX_SHOOTS; i++) { shoot[i].sprite_pos = (Vector2){ shoot[i].hitbox.x, shoot[i].hitbox.y }; } // Player to da wallz collies if ((player.hitbox.x + player.hitbox.width) >= GetScreenWidth()) player.hitbox.x = GetScreenWidth() - player.hitbox.width; else if (player.hitbox.x <= 0) player.hitbox.x = 0; if ((player.hitbox.y + player.hitbox.height) >= GetScreenHeight()) player.hitbox.y = GetScreenHeight() - player.hitbox.height; else if (player.hitbox.y <= 0) player.hitbox.y = 0; UpdateTimers(); if (score >= bestscore) bestscore = score; if (IsKeyPressed(KEY_D)) DebugMode = !DebugMode; if (IsKeyPressed(KEY_NINE)) ammo = 99; if (IsKeyPressed(KEY_ZERO)) ammo = 0; if (IsKeyPressed(KEY_R)) finishfromGameplayScreen = 2; if (IsKeyPressed(KEY_W)) finishfromGameplayScreen = 3; if (player.hp <= 0) finishfromGameplayScreen = 1; for (int i = 0; i < MAX_SHOOTS; i++) { if (shoot[i].active) { shoot[i].hitbox.x += shoot[i].speed.x * GetFrameTime(); } if (CheckCollisionRecs(shoot[i].hitbox, enemy.hitbox) && shoot[i].active) { if (!enemy_hurt) enemy.hp--; enemy_hurt = true; score += 300; if (!mute) PlaySoundMulti(fxboom); shoot[i].active = false; } if (shoot[i].hitbox.x + shoot[i].hitbox.width >= GetScreenWidth() + attack_sprite.width) shoot[i].active = false; } switch (feather.power) { case 0: feather.color = GREEN; break; case 1: feather.color = RED; break; } if (CheckCollisionRecs(player.hitbox, feather.hitbox)) { switch (feather.power) { case 0: player.hp++; feather.power = 1; break; case 1: ammo++; if (player.hp < 5) feather.power = 0; else feather.power = 1; break; } if (!mute && player.hp < 5) PlaySoundMulti(fxfeather); feather.hitbox.x = GetRandomValue(0, 600); feather.hitbox.y = GetRandomValue(0, GetScreenHeight() - feather_sprite.height); } if (level < 3) { if (((enemy.hitbox.y + enemy.hitbox.height) >= GetScreenHeight() || (enemy.hitbox.y <= 0))) enemy.speed *= -1.0f; enemy.hitbox.y += enemy.speed; if (CheckCollisionRecs(player.hitbox, enemy.hitbox)) DamagePlayer(); if (enemy.hp < 1) { level++; enemy.hp = 5; SetEnemyLevel(); } } for (int i = 0; i < MAX_FIREWORKS; i++) { if (CheckCollisionRecs(player.hitbox, fireworks[i].hitbox)) { DamagePlayer(); fireworks[i].active = 0; } switch (fireworks[i].active) { case 0: fireworks[i].hitbox.x = enemy.hitbox.x - 20; fireworks[i].hitbox.y = enemy.hitbox.y - 20; if (GetRandomValue(0, 50) == 50) { fireworks[i].active = 1; fireworks[i].hitbox.y += enemy.hitbox.height/2; } break; case 1: fireworks[i].hitbox.x += GetFrameTime() * -fireworks[i].speed.x; if (((fireworks[i].hitbox.x + -firework_sprite.width) > GetScreenWidth() || (fireworks[i].hitbox.x <= -firework_sprite.width))) fireworks[i].active = 0; break; } switch (level) { case LEVEL1: fireworks[i].speed.x = 300.0f; break; case LEVEL2: fireworks[i].speed.x = 600.0f; break; case LEVEL3: fireworks[i].speed.x = 900.0f; break; } } } else pauseTimer++; } void DrawGameplayScreen(void) { switch (level) { case LEVEL1: DrawTexture(background, 0, 0, RAYWHITE); break; case LEVEL2: DrawTexture(background, 0, 0, ORANGE); break; case LEVEL3: DrawTexture(background, 0, 0, RED); break; } DrawFPS(10, 430); if (DebugMode) { DrawRectangleRec(player.hitbox, BLUE); DrawRectangleRec(feather.hitbox, WHITE); DrawRectangleRec(enemy.hitbox, BLACK); for (int i = 0; i < MAX_FIREWORKS; i++) { DrawRectangleRec(fireworks[i].hitbox, BLACK); } for (int i = 0; i < MAX_SHOOTS; i++) { DrawRectangleRec(shoot[i].hitbox, GREEN); } DrawText(TextFormat("enemy.hitbox.y: %f", enemy.hitbox.y), 10, 200, 20, GREEN); DrawText(TextFormat("enemy.speed: %f", enemy.speed), 10, 220, 20, GREEN); DrawText(TextFormat("globalTimer: %i", globalTimer), 10, 240, 20, GREEN); DrawText(TextFormat("firework_sprite.width: %d", firework_sprite.width), 10, 260, 20, GREEN); DrawText(TextFormat("player_iframeTimer: %d", player_iframeTimer), 10, 280, 20, GREEN); DrawText(TextFormat("player_in: %d", player_in), 10, 300, 20, GREEN); } if (feather.active) DrawTexture(feather_sprite, feather.sprite_pos.x, feather.sprite_pos.y, feather.color); DrawTextureRec(enemy_sprite, enemy.frameRec, enemy.sprite_pos, enemy.color); for (int i = 0; i < MAX_FIREWORKS; i++) { DrawTexture(firework_sprite, fireworks[i].sprite_pos.x, fireworks[i].sprite_pos.y, fireworks[i].color); } for (int i = 0; i < MAX_SHOOTS; i++) { if (shoot[i].active) DrawTexture(attack_sprite, shoot[i].sprite_pos.x, shoot[i].sprite_pos.y, shoot[i].color); } DrawTextureRec(player_sprite, player.frameRec, player.sprite_pos, player.color); DrawTexture(feather_sprite, 0, 0, GREEN); DrawText(TextFormat("= %i", player.hp), 30, 30, 20, GREEN); DrawTexture(feather_sprite, 70, 0, RED); DrawText(TextFormat("= %i", ammo), 100, 30, 20, RED); DrawText(TextFormat("ENEMY HP: %i", enemy.hp), GetScreenWidth() - 150, 10, 20, RED); if (score >= 10000) DrawText(TextFormat("SCORE: %i", score), 10, 65, 20, (Color){ 222, 181, 0, 255 }); else DrawText(TextFormat("SCORE: %i", score), 10, 65, 20, BLUE); if (pause && ((pauseTimer/30)%2)) DrawText("PAUSED", 330, 190, 30, WHITE); } void UnloadGameplayScreen() { UnloadSound(fxhit); UnloadSound(fxfeather); UnloadSound(fxboom); UnloadTexture(player_sprite); UnloadTexture(feather_sprite); UnloadTexture(enemy_sprite); UnloadTexture(firework_sprite); UnloadTexture(attack_sprite); } int FinishGameplayScreen(void) { return finishfromGameplayScreen; }