diff options
| author | raysan5 <[email protected]> | 2020-04-13 13:31:45 +0200 |
|---|---|---|
| committer | raysan5 <[email protected]> | 2020-04-13 13:31:45 +0200 |
| commit | fd5d1dfcb6d740728f21cdd08ba8387b0ee2f899 (patch) | |
| tree | 6884674e4585aeef46346e0f8868b0e25c634efd /games/light_my_ritual/screens/screen_gameplay.c | |
| parent | eb04be8141c5e70f99d8104c44a61fb71779a55a (diff) | |
| download | raylib-fd5d1dfcb6d740728f21cdd08ba8387b0ee2f899.tar.gz raylib-fd5d1dfcb6d740728f21cdd08ba8387b0ee2f899.zip | |
WARNING: REMOVED raylib/games - Moved to raysan5/raylib-games
Move raylib games to another repo. It will reduce repo size for new clones.
I considered also removing the related history with [`git filter-repo`](https://github.com/newren/git-filter-repo) (the current sane alternative to the deprecated `filter-branch`) but it has some implications: It would had made a new repository with distinct history and checksums. If the repo was previously published,
the history of the new one won't have been compatible with the history others have pulled.
Diffstat (limited to 'games/light_my_ritual/screens/screen_gameplay.c')
| -rw-r--r-- | games/light_my_ritual/screens/screen_gameplay.c | 825 |
1 files changed, 0 insertions, 825 deletions
diff --git a/games/light_my_ritual/screens/screen_gameplay.c b/games/light_my_ritual/screens/screen_gameplay.c deleted file mode 100644 index 09124402..00000000 --- a/games/light_my_ritual/screens/screen_gameplay.c +++ /dev/null @@ -1,825 +0,0 @@ -/********************************************************************************************** -* -* raylib - Advance Game template -* -* Gameplay Screen Functions Definitions (Init, Update, Draw, Unload) -* -* Copyright (c) 2014 Ramon Santamaria (@raysan5) -* -* This software is provided "as-is", without any express or implied warranty. In no event -* will the authors be held liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, including commercial -* applications, and to alter it and redistribute it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not claim that you -* wrote the original software. If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not be misrepresented -* as being the original software. -* -* 3. This notice may not be removed or altered from any source distribution. -* -**********************************************************************************************/ - -#include "raylib.h" -#include "screens.h" - -#include <math.h> - -#define MAX_LIGHTS_I 8 -#define MAX_LIGHTS_II 12 -#define MAX_LIGHTS_III 20 - -#define MAX_ENEMIES 8 - -#define MAX_PLAYER_ENERGY 40.0f -#define ENERGY_REFILL_RATIO 0.2f - -#define GAMEPAD_SENSITIVITY 4.0f // More sensitivity, more speed :P - -#define LIGHT_ANIM_FRAMES 7 - -//---------------------------------------------------------------------------------- -// Types and Structures Definition -//---------------------------------------------------------------------------------- -typedef struct Player { - Vector2 position; - Vector2 speed; - int radius; - Color color; - float lightEnergy; -} Player; - -typedef struct Enemy { - Vector2 position; - Vector2 targetPos; // light target position - int targetNum; // light target number - float speed; // scalar value - int radius; - int active; - int awakeFramesDelay; - int framesCounter; - Color color; -} Enemy; - -typedef struct LightSpot { - Vector2 position; - int radius; - int requiredEnergy; - bool active; - Color color; - - int framesCounter; - int currentFrame; - Rectangle frameRec; -} LightSpot; - -typedef enum { LEVEL_I, LEVEL_II, LEVEL_III, LEVEL_FINISHED } LightedLevel; - -//---------------------------------------------------------------------------------- -// Global Variables Definition (local to this module) -//---------------------------------------------------------------------------------- - -// Gameplay screen global variables -static int framesCounter; -static int finishScreen; - -//static Texture2D background; - -static bool pause; - -static Player player; - -static LightSpot lightsI[MAX_LIGHTS_I]; -static LightSpot lightsII[MAX_LIGHTS_II]; -static LightSpot lightsIII[MAX_LIGHTS_III]; - -static Enemy enemies[MAX_ENEMIES]; - -static int ritualLevel; -static int previousLightedLevel; -static int currentLightedLevel; - -static Vector2 lighterPosition; - -static int maxLightEnergy; -static int currentLightEnergy; - -static float ritualTime; -static bool startRitual; -static float alphaRitual; - -static bool timeOver; -static int nextStarsAlignment; - -static Texture2D background; -static Texture2D foregroundI; -static Texture2D foregroundII; -static Texture2D foregroundIII; -static Texture2D texPlayer; -static Texture2D texEnemy; -static Texture2D texLight; -static Texture2D lightGlow; -static Texture2D lightRay; -static Texture2D book; -static Texture2D texRitual; -static Texture2D texTimeOver; -static Texture2D circleIoff, circleIIoff, circleIIIoff; -static Texture2D circleIon, circleIIon, circleIIIon; - -static Rectangle lightOff, lightOn; - -static Sound fxLightOn, fxLightOff; - -static Music music; - -// Debug variables -static bool enemiesStopped; - -//------------------------------------------------------------------------------------ -// Module Functions Declaration (local) -//------------------------------------------------------------------------------------ -static bool ColorEqual(Color col1, Color col2); // Check if two colors are equal -static Vector2 Vector2Subtract(Vector2 v1, Vector2 v2); -static void Vector2Normalize(Vector2 *v); -static void EnemyReset(Enemy *enemy); - -//---------------------------------------------------------------------------------- -// Gameplay Screen Functions Definition -//---------------------------------------------------------------------------------- - -// Gameplay Screen Initialization logic -void InitGameplayScreen(void) -{ - framesCounter = 0; - finishScreen = 0; - pause = false; - - // Textures loading - background = LoadTexture("resources/textures/background.png"); - foregroundI = LoadTexture("resources/textures/foreground_level_i.png"); - foregroundII = LoadTexture("resources/textures/foreground_level_ii.png"); - foregroundIII = LoadTexture("resources/textures/foreground_level_iii.png"); - texPlayer = LoadTexture("resources/textures/player.png"); - texEnemy = LoadTexture("resources/textures/enemy.png"); - texLight = LoadTexture("resources/textures/light.png"); - lightGlow = LoadTexture("resources/textures/light_glow.png"); - lightRay = LoadTexture("resources/textures/light_ray.png"); - book = LoadTexture("resources/textures/book.png"); - texRitual = LoadTexture("resources/textures/msg_ritual.png"); - texTimeOver = LoadTexture("resources/textures/time_over.png"); - - circleIoff = LoadTexture("resources/textures/circle_level_i_off.png"); - circleIIoff = LoadTexture("resources/textures/circle_level_ii_off.png"); - circleIIIoff = LoadTexture("resources/textures/circle_level_iii_off.png"); - circleIon = LoadTexture("resources/textures/circle_level_i_on.png"); - circleIIon = LoadTexture("resources/textures/circle_level_ii_on.png"); - circleIIIon = LoadTexture("resources/textures/circle_level_iii_on.png"); - - lightOff = (Rectangle){ 0, 0, 64, 64 }; - lightOn = (Rectangle){ 64, 0, 64, 64 }; - - fxLightOn = LoadSound("resources/audio/light_on.wav"); - fxLightOff = LoadSound("resources/audio/light_off.wav"); - - // Initialize player - player.position = (Vector2){ GetScreenWidth()/2, GetScreenHeight()/2 - 40 }; - player.radius = 20; - player.speed = (Vector2){5, 5}; - player.color = WHITE; - - // Initialize lights positions based on lights map image data - int kI = 0, kII = 0, kIII = 0; - for (int y = 0; y < lightsMapHeight; y++) - { - for (int x = 0; x < lightsMapWidth; x++) - { - if (ColorEqual(lightsMap[y*lightsMapWidth + x], (Color){ 255, 0, 0, 255 })) - { - // Store light position I - lightsI[kI].position.x = (float)x*10; - lightsI[kI].position.y = (float)y*10; - kI++; - - //printf("Light %02i position: %i, %i\n", kI, (int)lightsI[kI - 1].position.x, (int)lightsI[kI - 1].position.y); - } - else if (ColorEqual(lightsMap[y*lightsMapWidth + x], (Color){ 0, 255, 0, 255 })) - { - // Store light position II - lightsII[kII].position.x = (float)x*10; - lightsII[kII].position.y = (float)y*10; - kII++; - } - else if (ColorEqual(lightsMap[y*lightsMapWidth + x], (Color){ 0, 0, 255, 255 })) - { - // Store light position III - lightsIII[kIII].position.x = (float)x*10; - lightsIII[kIII].position.y = (float)y*10; - kIII++; - } - } - } - - // Initialize lights I - for (int i = 0; i < MAX_LIGHTS_I; i++) - { - lightsI[i].radius = 12; - lightsI[i].requiredEnergy = GetRandomValue(3, 9); - lightsI[i].active = false; - lightsI[i].color = GOLD; - - lightsI[i].framesCounter = 0; - lightsI[i].currentFrame = 0; - lightsI[i].frameRec = (Rectangle){ 0, 0, 64, 64 }; - } - - // Initialize lights II - for (int i = 0; i < MAX_LIGHTS_II; i++) - { - lightsII[i].radius = 8; - lightsII[i].requiredEnergy = GetRandomValue(3, 8); - lightsII[i].active = false; - lightsII[i].color = GOLD; - - lightsII[i].framesCounter = 0; - lightsII[i].currentFrame = 0; - lightsII[i].frameRec = (Rectangle){ 0, 0, 64, 64 }; - } - - // Initialize lights III - for (int i = 0; i < MAX_LIGHTS_III; i++) - { - lightsIII[i].radius = 8; - lightsIII[i].requiredEnergy = GetRandomValue(4, 10); - lightsIII[i].active = false; - lightsIII[i].color = GOLD; - - lightsIII[i].framesCounter = 0; - lightsIII[i].currentFrame = 0; - lightsIII[i].frameRec = (Rectangle){ 0, 0, 64, 64 }; - } - - // Initialize ritual level - ritualLevel = 0; - currentLightedLevel = LEVEL_I; - lighterPosition = (Vector2){ GetScreenWidth()/2, GetScreenHeight()/2 }; - - // Initialize enemies - for (int i = 0; i < MAX_ENEMIES; i++) EnemyReset(&enemies[i]); - - // Initialize max light energy (depends on lights randomness) - maxLightEnergy = 0; - - for (int i = 0; i < MAX_LIGHTS_I; i++) maxLightEnergy += lightsI[i].requiredEnergy; - for (int i = 0; i < MAX_LIGHTS_II; i++) maxLightEnergy += lightsII[i].requiredEnergy; - for (int i = 0; i < MAX_LIGHTS_III; i++) maxLightEnergy += lightsIII[i].requiredEnergy; - - //printf("Max light energy: %i\n", maxLightEnergy); - - // Initialize ritual variables - ritualTime = 0.0f; - startRitual = false;; - alphaRitual = 0.0f; - - timeOver = false; - nextStarsAlignment = GetRandomValue(500, 1000); - - enemiesStopped = false; - - music = LoadMusicStream("resources/audio/ritual.ogg"); - PlayMusicStream(music); -} - -// Gameplay Screen Update logic -void UpdateGameplayScreen(void) -{ - if (IsKeyPressed('P')) pause = !pause; - - if (!pause && (currentLightedLevel != LEVEL_FINISHED) && !timeOver) - { - framesCounter++; // Time starts counting to awake enemies - - // Player movement logic - if (IsKeyDown(KEY_RIGHT)) player.position.x += player.speed.x; - else if (IsKeyDown(KEY_LEFT)) player.position.x -= player.speed.x; - - if (IsKeyDown(KEY_UP)) player.position.y -= player.speed.y; - else if (IsKeyDown(KEY_DOWN)) player.position.y += player.speed.y; - - // Debug key to stop enemies - if (IsKeyPressed(KEY_S)) enemiesStopped = !enemiesStopped; - - /* - if (IsGamepadAvailable(GAMEPAD_PLAYER1)) - { - Vector2 movement = GetGamepadMovement(GAMEPAD_PLAYER1); - - player.position.x += movement.x*GAMEPAD_SENSITIVITY; - player.position.y += movement.y*GAMEPAD_SENSITIVITY; - } - */ - - // Player light energy filling logic - if (CheckCollisionCircles(player.position, player.radius, lighterPosition, 50)) - { - player.lightEnergy += ENERGY_REFILL_RATIO; - player.color = (Color){ 255, 255, 100, 255 }; - } - else player.color = WHITE; - - if (player.lightEnergy > MAX_PLAYER_ENERGY) player.lightEnergy = MAX_PLAYER_ENERGY; - - // Player vs lights collision detection (depends on lighted level) - if (currentLightedLevel == LEVEL_I) - { - for (int i = 0; i < MAX_LIGHTS_I; i++) - { - // Check player vs lightI collision - if (CheckCollisionCircles(player.position, player.radius, lightsI[i].position, lightsI[i].radius)) - { - if (!lightsI[i].active && (player.lightEnergy >= lightsI[i].requiredEnergy)) - { - lightsI[i].active = true; - lightsI[i].currentFrame = 1; - player.lightEnergy -= lightsI[i].requiredEnergy; - - PlaySound(fxLightOn); - } - } - } - } - else if (currentLightedLevel == LEVEL_II) - { - for (int i = 0; i < MAX_LIGHTS_II; i++) - { - if (CheckCollisionCircles(player.position, player.radius, lightsII[i].position, lightsII[i].radius)) - { - if (!lightsII[i].active && (player.lightEnergy >= lightsII[i].requiredEnergy)) - { - lightsII[i].active = true; - player.lightEnergy -= lightsII[i].requiredEnergy; - - PlaySound(fxLightOn); - } - } - } - } - else if (currentLightedLevel == LEVEL_III) - { - for (int i = 0; i < MAX_LIGHTS_III; i++) - { - if (CheckCollisionCircles(player.position, player.radius, lightsIII[i].position, lightsIII[i].radius)) - { - if (!lightsIII[i].active && (player.lightEnergy >= lightsIII[i].requiredEnergy)) - { - lightsIII[i].active = true; - player.lightEnergy -= lightsIII[i].requiredEnergy; - - PlaySound(fxLightOn); - } - } - } - } - - // Lights animation (it doesn't depend on currentLightedLevel) - for (int i = 0; i < MAX_LIGHTS_I; i++) - { - // Light animation - if (lightsI[i].active) - { - lightsI[i].framesCounter++; - - if (lightsI[i].framesCounter > 10) - { - lightsI[i].currentFrame++; - - if (lightsI[i].currentFrame > LIGHT_ANIM_FRAMES - 1) lightsI[i].currentFrame = 1; - - lightsI[i].framesCounter = 0; - } - } - - lightsI[i].frameRec.x = lightsI[i].currentFrame*texLight.width/LIGHT_ANIM_FRAMES; - } - - for (int i = 0; i < MAX_LIGHTS_II; i++) - { - // Light animation - if (lightsII[i].active) - { - lightsII[i].framesCounter++; - - if (lightsII[i].framesCounter > 10) - { - lightsII[i].currentFrame++; - - if (lightsII[i].currentFrame > LIGHT_ANIM_FRAMES - 1) lightsII[i].currentFrame = 1; - - lightsII[i].framesCounter = 0; - } - } - - lightsII[i].frameRec.x = lightsII[i].currentFrame*texLight.width/LIGHT_ANIM_FRAMES; - } - - for (int i = 0; i < MAX_LIGHTS_III; i++) - { - // Light animation - if (lightsIII[i].active) - { - lightsIII[i].framesCounter++; - - if (lightsIII[i].framesCounter > 10) - { - lightsIII[i].currentFrame++; - - if (lightsIII[i].currentFrame > LIGHT_ANIM_FRAMES - 1) lightsIII[i].currentFrame = 1; - - lightsIII[i].framesCounter = 0; - } - } - - lightsIII[i].frameRec.x = lightsIII[i].currentFrame*texLight.width/LIGHT_ANIM_FRAMES; - } - - // Enemies logic - if (!enemiesStopped) - { - for (int i = 0; i < MAX_ENEMIES; i++) - { - if (!enemies[i].active) enemies[i].framesCounter++; - - if (enemies[i].framesCounter > enemies[i].awakeFramesDelay) enemies[i].active = true; - - if (enemies[i].active) - { - // Move to the target - Vector2 dir = Vector2Subtract(enemies[i].targetPos, enemies[i].position); - Vector2Normalize(&dir); - - enemies[i].position.x += dir.x*enemies[i].speed; - enemies[i].position.y += dir.y*enemies[i].speed; - - if (currentLightedLevel == LEVEL_I) - { - if (CheckCollisionCircles(enemies[i].position, enemies[i].radius, enemies[i].targetPos, lightsI[enemies[i].targetNum].radius)) - { - lightsI[enemies[i].targetNum].active = false; - lightsI[enemies[i].targetNum].framesCounter = 0; - lightsI[enemies[i].targetNum].currentFrame = 0; - lightsI[enemies[i].targetNum].frameRec = (Rectangle){ 0, 0, 64, 64 }; - - EnemyReset(&enemies[i]); - - PlaySound(fxLightOff); - } - } - else if (currentLightedLevel == LEVEL_II) - { - if (CheckCollisionCircles(enemies[i].position, enemies[i].radius, enemies[i].targetPos, lightsII[enemies[i].targetNum].radius)) - { - lightsII[enemies[i].targetNum].active = false; - lightsII[enemies[i].targetNum].framesCounter = 0; - lightsII[enemies[i].targetNum].currentFrame = 0; - lightsII[enemies[i].targetNum].frameRec = (Rectangle){ 0, 0, 64, 64 }; - - EnemyReset(&enemies[i]); - - PlaySound(fxLightOff); - } - } - else if (currentLightedLevel == LEVEL_III) - { - if (CheckCollisionCircles(enemies[i].position, enemies[i].radius, enemies[i].targetPos, lightsIII[enemies[i].targetNum].radius)) - { - lightsIII[enemies[i].targetNum].active = false; - lightsIII[enemies[i].targetNum].framesCounter = 0; - lightsIII[enemies[i].targetNum].currentFrame = 0; - lightsIII[enemies[i].targetNum].frameRec = (Rectangle){ 0, 0, 64, 64 }; - - EnemyReset(&enemies[i]); - - PlaySound(fxLightOff); - } - } - } - } - } - - // Check current light energy (for right bar) - currentLightEnergy = 0; - - for (int i = 0; i < MAX_LIGHTS_I; i++) if (lightsI[i].active) currentLightEnergy += lightsI[i].requiredEnergy; - for (int i = 0; i < MAX_LIGHTS_II; i++) if (lightsII[i].active) currentLightEnergy += lightsII[i].requiredEnergy; - for (int i = 0; i < MAX_LIGHTS_III; i++) if (lightsIII[i].active) currentLightEnergy += lightsIII[i].requiredEnergy; - - // Check current lighted level - // Check ending conditions: all lights off, ritual level reached - previousLightedLevel = currentLightedLevel; - - currentLightedLevel = LEVEL_I; - - bool lightedLevel = true; - for (int i = 0; i < MAX_LIGHTS_I; i++) if (!lightsI[i].active) lightedLevel = false; - if (lightedLevel) currentLightedLevel = LEVEL_II; - - for (int i = 0; i < MAX_LIGHTS_II; i++) if (!lightsII[i].active) lightedLevel = false; - if (lightedLevel) currentLightedLevel = LEVEL_III; - - for (int i = 0; i < MAX_LIGHTS_III; i++) if (!lightsIII[i].active) lightedLevel = false; - if (lightedLevel) - { - currentLightedLevel = LEVEL_FINISHED; - - for (int i = 0; i < MAX_ENEMIES; i++) enemies[i].active = false; - } - - if (currentLightedLevel != previousLightedLevel) for (int i = 0; i < MAX_ENEMIES; i++) EnemyReset(&enemies[i]); - - ritualTime = (float)framesCounter/60; - - // Check game over condition (time run out) - if ((99.0f - ritualTime) <= 0.0f) - { - ritualTime = 99.0f; - timeOver = true; - } - } - - if (startRitual) - { - alphaRitual += 0.02f; - - SetMusicVolume(music, 1.0f - alphaRitual); - - if (alphaRitual > 1.0f) finishScreen = 1; - } - - UpdateMusicStream(music); -} - -// Gameplay Screen Draw logic -void DrawGameplayScreen(void) -{ - DrawTexture(background, 0, 0, WHITE); - - // DrawText("STARS ARE ALIGNED! NO TIME TO LOOSE! LIGHT MY RITUAL!", - - // Draw foreground and circles - if ((currentLightedLevel == LEVEL_FINISHED) || (currentLightedLevel == LEVEL_III)) DrawTexture(foregroundIII, 0, 0, WHITE); - else if (currentLightedLevel == LEVEL_II) DrawTexture(foregroundII, 0, 0, WHITE); - else if (currentLightedLevel == LEVEL_I) DrawTexture(foregroundI, 0, 0, WHITE); - - // Draw lighted circles (depends on current lighted level) - switch (currentLightedLevel) - { - case LEVEL_FINISHED: - { - DrawTexture(circleIIIon, GetScreenWidth()/2 - circleIIIon.width/2, GetScreenHeight()/2 - circleIIIon.height/2, WHITE); - DrawTexture(circleIIon, GetScreenWidth()/2 - circleIIon.width/2, GetScreenHeight()/2 - circleIIon.height/2, WHITE); - DrawTexture(circleIon, GetScreenWidth()/2 - circleIon.width/2, GetScreenHeight()/2 - circleIon.height/2, WHITE); - } break; - case LEVEL_III: - { - DrawTexture(circleIIIoff, GetScreenWidth()/2 - circleIIIoff.width/2, GetScreenHeight()/2 - circleIIIoff.height/2, WHITE); - DrawTexture(circleIIon, GetScreenWidth()/2 - circleIIon.width/2, GetScreenHeight()/2 - circleIIon.height/2, WHITE); - DrawTexture(circleIon, GetScreenWidth()/2 - circleIon.width/2, GetScreenHeight()/2 - circleIon.height/2, WHITE); - } break; - case LEVEL_II: - { - DrawTexture(circleIIoff, GetScreenWidth()/2 - circleIIoff.width/2, GetScreenHeight()/2 - circleIIoff.height/2, WHITE); - DrawTexture(circleIon, GetScreenWidth()/2 - circleIon.width/2, GetScreenHeight()/2 - circleIon.height/2, WHITE); - } break; - case LEVEL_I: - { - DrawTexture(circleIoff, GetScreenWidth()/2 - circleIoff.width/2, GetScreenHeight()/2 - circleIoff.height/2, WHITE); - } break; - default: break; - } - - // Draw lights (depends on current lighted level) - switch (currentLightedLevel) - { - case LEVEL_FINISHED: - case LEVEL_III: - { - for (int i = 0; i < MAX_LIGHTS_III; i++) - { - //if (lightsIII[i].active) DrawCircleV(lightsIII[i].position, lightsIII[i].radius, GOLD); - //else DrawCircleLines(lightsIII[i].position.x, lightsIII[i].position.y, lightsIII[i].radius, GRAY); - DrawTextureRec(texLight, lightsIII[i].frameRec, (Vector2){ lightsIII[i].position.x - 32, lightsIII[i].position.y - 32 }, WHITE); - } - - for (int i = 0; i < MAX_LIGHTS_III; i++) if (lightsIII[i].active) DrawTexture(lightGlow, lightsIII[i].position.x - lightGlow.width/2, lightsIII[i].position.y - lightGlow.height/2, Fade(WHITE, 0.3f)); - for (int i = 0; i < MAX_LIGHTS_III; i++) DrawText(FormatText("%02i", lightsIII[i].requiredEnergy), lightsIII[i].position.x - 10, lightsIII[i].position.y + 14, 20, lightsIII[i].active ? GRAY : YELLOW); - } - case LEVEL_II: - { - for (int i = 0; i < MAX_LIGHTS_II; i++) - { - //if (lightsII[i].active) DrawCircleV(lightsII[i].position, lightsII[i].radius, GOLD); - //else DrawCircleLines(lightsI[i].position.x, lightsI[i].position.y, lightsI[i].radius, GRAY); - DrawTextureRec(texLight, lightsII[i].frameRec, (Vector2){ lightsII[i].position.x - 32, lightsII[i].position.y - 32 }, WHITE); - } - - for (int i = 0; i < MAX_LIGHTS_II; i++) if (lightsII[i].active) DrawTexture(lightGlow, lightsII[i].position.x - lightGlow.width/2, lightsII[i].position.y - lightGlow.height/2, Fade(WHITE, 0.3f)); - for (int i = 0; i < MAX_LIGHTS_II; i++) DrawText(FormatText("%02i", lightsII[i].requiredEnergy), lightsII[i].position.x - 10, lightsII[i].position.y + 14, 20, lightsII[i].active ? GRAY : YELLOW); - } - case LEVEL_I: - { - for (int i = 0; i < MAX_LIGHTS_I; i++) - { - //if (lightsI[i].active) DrawCircleV(lightsI[i].position, lightsI[i].radius, GOLD); - //else DrawCircleLines(lightsI[i].position.x, lightsI[i].position.y, lightsI[i].radius, GRAY); - DrawTextureRec(texLight, lightsI[i].frameRec, (Vector2){ lightsI[i].position.x - 32, lightsI[i].position.y - 32 }, WHITE); - } - - for (int i = 0; i < MAX_LIGHTS_I; i++) if (lightsI[i].active) DrawTexture(lightGlow, lightsI[i].position.x - lightGlow.width/2, lightsI[i].position.y - lightGlow.height/2, Fade(WHITE, 0.3f)); - for (int i = 0; i < MAX_LIGHTS_I; i++) DrawText(FormatText("%02i", lightsI[i].requiredEnergy), lightsI[i].position.x - 10, lightsI[i].position.y + 14, 20, lightsI[i].active ? GRAY : YELLOW); - } - default: break; - } - - // Draw main lighter - DrawTexture(book, GetScreenWidth()/2 - book.width/2, GetScreenHeight()/2, WHITE); - DrawTexture(lightRay, GetScreenWidth()/2 - lightRay.width/2, 0, Fade(WHITE, 0.5f)); - - // Draw player - //DrawCircleV(player.position, player.radius, player.color); - DrawTexture(texPlayer, player.position.x - 32, player.position.y - 32, player.color); - - if (currentLightedLevel != LEVEL_FINISHED) - { - // Draw enemies (depends on current lighted level) - for (int i = 0; i < MAX_ENEMIES; i++) - { - if (enemies[i].active) - { - //DrawCircleV(enemies[i].position, enemies[i].radius, enemies[i].color); - DrawTextureRec(texEnemy, (Rectangle){ 0, 0, 64, 64 }, (Vector2){ enemies[i].position.x - 32, enemies[i].position.y - 32 }, WHITE); - } - } - - // Draw time left for ritual - DrawTextEx(font, FormatText("%02.2f", (99.0f - ritualTime)), (Vector2){ 560, 20 }, font.baseSize, 0, WHITE); - - // Draw light energy bar - DrawRectangle(20, 30, 400, 20, GRAY); - DrawRectangle(20, 30, (400*player.lightEnergy)/MAX_PLAYER_ENERGY, 20, GOLD); - DrawRectangleLines(20, 30, 400, 20, LIGHTGRAY); - DrawText(FormatText("%03.0f", player.lightEnergy), 430, 30, 20, WHITE); - - // Draw level lighted bar (for completion) - DrawRectangle(GetScreenWidth() - 40, 30, 20, 660, GRAY); - DrawRectangle(GetScreenWidth() - 40, 30 + 660 - 660*currentLightEnergy/maxLightEnergy, 20, 660*currentLightEnergy/maxLightEnergy, YELLOW); - DrawRectangleLines(GetScreenWidth() - 40, 30, 20, 660, LIGHTGRAY); - - // Show message: "You run out of light!!!" if player.lightEnergy <= 0 - if (player.lightEnergy < 2) - { - if ((framesCounter/20)%2) DrawTextEx(font, "YOU'RE RUNNING OUT OF LIGHT!", (Vector2){ 20, 60 }, font.baseSize/2, 0, WHITE); - } - } - else if (!timeOver) // LEVEL_FINISHED - { - DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, 0.4f)); - - // Wait some time before jumping to ending: raylib - DrawTexture(texRitual, GetScreenWidth()/2 - texRitual.width/2, 100, WHITE); - DrawTextEx(font, FormatText("BEST LIGHTING TIME: %02.2f", ritualTime), (Vector2){ 320, 340 }, 50, 0, WHITE); - DrawTextEx(font, "PRESS ENTER to START the RITUAL", (Vector2){ 160, 480 }, 60, 0, WHITE); - - if (IsKeyPressed(KEY_ENTER)) startRitual = true; - } - - if (timeOver) - { - DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, 0.4f)); - - DrawTexture(texTimeOver, GetScreenWidth()/2 - texTimeOver.width/2, 140, WHITE); - DrawTextEx(font, FormatText("NEXT STARS ALIGNMENT IN %i YEARS", nextStarsAlignment), (Vector2){ 200, 360 }, 50, 0, WHITE); - DrawTextEx(font, "PRESS ENTER to GO HOME...", (Vector2){ 260, 480 }, 60, 0, WHITE); - - if (IsKeyPressed(KEY_ENTER)) finishScreen = 2; - } - - if (startRitual) DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, alphaRitual)); - - if (pause) DrawTextEx(font, "RITUAL PAUSED", (Vector2){ GetScreenWidth()/2 - MeasureText("RITUAL PAUSED", 40)/2, 110 }, 50, 0, WHITE); -} - -// Gameplay Screen Unload logic -void UnloadGameplayScreen(void) -{ - // Unload GAMEPLAY screen variables here! - UnloadTexture(background); - UnloadTexture(foregroundI); - UnloadTexture(foregroundII); - UnloadTexture(foregroundIII); - UnloadTexture(texPlayer); - UnloadTexture(texEnemy); - UnloadTexture(texLight); - UnloadTexture(lightGlow); - UnloadTexture(lightRay); - UnloadTexture(book); - UnloadTexture(texRitual); - UnloadTexture(texTimeOver); - - // Unload circles - UnloadTexture(circleIoff); - UnloadTexture(circleIIoff); - UnloadTexture(circleIIIoff); - UnloadTexture(circleIon); - UnloadTexture(circleIIon); - UnloadTexture(circleIIIon); - - // Unload sounds - UnloadSound(fxLightOn); - UnloadSound(fxLightOff); - - UnloadMusicStream(music); -} - -// Gameplay Screen should finish? -int FinishGameplayScreen(void) -{ - return finishScreen; -} - -//------------------------------------------------------------------------------------ -// Module Functions Definitions (local) -//------------------------------------------------------------------------------------ - -// Check two colors if equal -static bool ColorEqual(Color col1, Color col2) -{ - return ((col1.r == col2.r) && (col1.g == col2.g) && (col1.b == col2.b) && (col1.a == col2.a)); -} - -// Substract two vectors -static Vector2 Vector2Subtract(Vector2 v1, Vector2 v2) -{ - Vector2 result; - - result.x = v1.x - v2.x; - result.y = v1.y - v2.y; - - return result; -} - -// Normalize provided vector -static void Vector2Normalize(Vector2 *v) -{ - float length, ilength; - - length = sqrt(v->x*v->x + v->y*v->y); - - if (length == 0) length = 1.0f; - - ilength = 1.0f/length; - - v->x *= ilength; - v->y *= ilength; -} - -// Reset enemy parameters -// NOTE: Depends on currentLightedLevel -static void EnemyReset(Enemy *enemy) -{ - enemy->active = false; - enemy->framesCounter = 0; - enemy->color = RED; - enemy->radius = 10; - - int side = GetRandomValue(0, 1); - - if (side) enemy->position = (Vector2){ GetRandomValue(50, 150), GetRandomValue(50, GetScreenHeight() - 50) }; - else enemy->position = (Vector2){ GetRandomValue(GetScreenWidth() - 150, GetScreenWidth() - 50), GetRandomValue(50, GetScreenHeight() - 50) }; - - // TODO: Choose only active lights - // TODO: if currentLightedLevel has no active lights, choose light from a lower level! - - if (currentLightedLevel == LEVEL_I) - { - enemy->targetNum = GetRandomValue(0, MAX_LIGHTS_I - 1); // LEVEL_I - enemy->targetPos = lightsI[enemy->targetNum].position; - enemy->speed = (float)GetRandomValue(15, 20)/10.0f; - enemy->awakeFramesDelay = GetRandomValue(90, 400); - } - else if (currentLightedLevel == LEVEL_II) - { - enemy->targetNum = GetRandomValue(0, MAX_LIGHTS_II - 1); // LEVEL_II - enemy->targetPos = lightsII[enemy->targetNum].position; - enemy->speed = (float)GetRandomValue(10, 20)/10.0f; - enemy->awakeFramesDelay = GetRandomValue(240, 800); - } - else if (currentLightedLevel == LEVEL_III) - { - enemy->targetNum = GetRandomValue(0, MAX_LIGHTS_III - 1); // LEVEL_III - enemy->targetPos = lightsIII[enemy->targetNum].position; - enemy->speed = (float)GetRandomValue(8, 18)/10.0f; - enemy->awakeFramesDelay = GetRandomValue(180, 1200); - } -} |
