| /******************************************************************************************* | |
| * | |
| *   SKULLY ESCAPE [KING GAME JAM 2015] | |
| * | |
| *   This game has been created using raylib 1.6 (www.raylib.com) | |
| *   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | |
| * | |
| *   Copyright (c) 2014 Ramon Santamaria (@raysan5) | |
| * | |
| ********************************************************************************************/ | |
| 
 | |
| #include "raylib.h" | |
| #include "screens/screens.h"    // NOTE: Defines global variable: currentScreen | |
|  | |
| #include "player.h" | |
|  | |
| #if defined(PLATFORM_ANDROID) | |
|     #include "android_native_app_glue.h" | |
| #endif | |
|  | |
| #if defined(PLATFORM_WEB) | |
|     #include <emscripten/emscripten.h> | |
| #endif | |
|  | |
| //---------------------------------------------------------------------------------- | |
| // Global Variables Definition (local to this module) | |
| //---------------------------------------------------------------------------------- | |
| const int screenWidth = 1280; | |
| const int screenHeight = 720; | |
| 
 | |
| // Required variables to manage screen transitions (fade-in, fade-out) | |
| float transAlpha = 0; | |
| bool onTransition = false; | |
| bool transFadeOut = false; | |
| int transFromScreen = -1; | |
| int transToScreen = -1; | |
| 
 | |
| static int framesCounter = 0; | |
| 
 | |
| Music music; | |
|      | |
| //---------------------------------------------------------------------------------- | |
| // Local Functions Declaration | |
| //---------------------------------------------------------------------------------- | |
| void TransitionToScreen(int screen); | |
| void ChangeToScreen(int screen);    // No transition effect | |
| void UpdateTransition(void); | |
| void DrawTransition(void); | |
| 
 | |
| void UpdateDrawFrame(void);         // Update and Draw one frame | |
|  | |
| //---------------------------------------------------------------------------------- | |
| // Main entry point | |
| //---------------------------------------------------------------------------------- | |
| #if defined(PLATFORM_ANDROID) | |
| void android_main(struct android_app *app)  | |
| #else | |
| int main(void) | |
| #endif | |
| { | |
| 	// Initialization | |
| 	//--------------------------------------------------------- | |
| #if defined(PLATFORM_ANDROID) | |
|     InitWindow(screenWidth, screenHeight, app); | |
| #else | |
|     InitWindow(screenWidth, screenHeight, "SKULLY ESCAPE [KING GAMEJAM]"); | |
| #endif | |
|  | |
|     // Global data loading (assets that must be available in all screens, i.e. fonts) | |
|     InitAudioDevice(); | |
|      | |
|     music = LoadMusicStream("resources/audio/come_play_with_me.ogg"); | |
|     PlayMusicStream(music); | |
|      | |
|     font = LoadSpriteFont("resources/textures/alagard.png"); | |
| 	doors = LoadTexture("resources/textures/doors.png"); | |
|     sndDoor = LoadSound("resources/audio/door.ogg"); | |
|     sndScream = LoadSound("resources/audio/scream.ogg"); | |
| 	 | |
|     InitPlayer(); | |
|      | |
|     // Setup and Init first screen | |
|     currentScreen = LOGO; | |
|     InitLogoScreen(); | |
| 
 | |
| #if defined(PLATFORM_WEB) | |
|     emscripten_set_main_loop(UpdateDrawFrame, 0, 1); | |
| #else | |
|     SetTargetFPS(60);   // Set our game to run at 60 frames-per-second | |
|     //-------------------------------------------------------------------------------------- | |
|  | |
|     // Main game loop | |
|     while (!WindowShouldClose())    // Detect window close button or ESC key | |
|     { | |
|         UpdateDrawFrame(); | |
|     } | |
| #endif | |
|  | |
|     // De-Initialization | |
|     //-------------------------------------------------------------------------------------- | |
|      | |
|     // Unload all global loaded data (i.e. fonts) here! | |
| 	UnloadPlayer(); | |
|     UnloadSpriteFont(font); | |
|     UnloadTexture(doors); | |
|     UnloadSound(sndDoor); | |
|     UnloadSound(sndScream); | |
|      | |
|     UnloadMusicStream(music); | |
|      | |
|     CloseAudioDevice(); | |
|      | |
|     CloseWindow();        // Close window and OpenGL context | |
|     //-------------------------------------------------------------------------------------- | |
| #if !defined(PLATFORM_ANDROID) | |
|     return 0; | |
| #endif | |
| } | |
| 
 | |
| void TransitionToScreen(int screen) | |
| { | |
|     onTransition = true; | |
|     transFromScreen = currentScreen; | |
|     transToScreen = screen; | |
| } | |
| 
 | |
| void ChangeToScreen(int screen) | |
| { | |
|     switch (currentScreen) | |
|     { | |
|         case LOGO: UnloadLogoScreen(); break; | |
|         case LOGO_RL: rlUnloadLogoScreen(); break; | |
|         case TITLE: UnloadTitleScreen(); break; | |
|         case ATTIC: UnloadAtticScreen(); break; | |
|         case AISLE01: UnloadAisle01Screen();break; | |
|         case AISLE02: UnloadAisle02Screen();break; | |
|         case ARMORY: UnloadArmoryScreen();break; | |
|         case LIVINGROOM: UnloadLivingroomScreen();break; | |
|         case KITCHEN: UnloadKitchenScreen(); break; | |
|         case BATHROOM: UnloadBathroomScreen(); break; | |
|         case ENDING: UnloadEndingScreen(); break; | |
|         default: break; | |
|     } | |
|      | |
|     switch (screen) | |
|     { | |
|         case LOGO: InitLogoScreen(); break; | |
|         case LOGO_RL: rlInitLogoScreen(); break; | |
|         case TITLE: InitTitleScreen(); break; | |
|         case ATTIC: InitAtticScreen(); break; | |
|         case AISLE01: InitAisle01Screen();break; | |
|         case AISLE02: InitAisle02Screen();break; | |
|         case ARMORY: InitArmoryScreen();break; | |
|         case LIVINGROOM: InitLivingroomScreen();break; | |
|         case KITCHEN: InitKitchenScreen(); break; | |
|         case BATHROOM: InitBathroomScreen(); break; | |
|         case ENDING: InitEndingScreen(); break; | |
|         default: break; | |
|     } | |
|      | |
|     currentScreen = screen; | |
| } | |
| 
 | |
| void UpdateTransition(void) | |
| { | |
|     if (!transFadeOut) | |
|     { | |
|         transAlpha += 0.05f; | |
| 
 | |
|         if (transAlpha >= 1.0) | |
|         { | |
|             transAlpha = 1.0; | |
|          | |
|             switch (transFromScreen) | |
|             { | |
|                 case LOGO: UnloadLogoScreen(); break; | |
|                 case LOGO_RL: rlUnloadLogoScreen(); break; | |
|                 case TITLE: UnloadTitleScreen(); break; | |
|                 case ATTIC: UnloadAtticScreen(); break; | |
|                 case AISLE01: UnloadAisle01Screen();break; | |
|                 case AISLE02: UnloadAisle02Screen();break; | |
|                 case ARMORY: UnloadArmoryScreen();break; | |
|                 case LIVINGROOM: UnloadLivingroomScreen();break; | |
|                 case KITCHEN: UnloadKitchenScreen(); break; | |
|                 case BATHROOM: UnloadBathroomScreen(); break; | |
|                 case ENDING: UnloadEndingScreen(); break; | |
|                 default: break; | |
|             } | |
|              | |
|             switch (transToScreen) | |
|             { | |
|                 case LOGO: | |
|                 { | |
|                     InitLogoScreen();  | |
|                     currentScreen = LOGO;  | |
|                 } break; | |
|                 case LOGO_RL: | |
|                 { | |
|                     rlInitLogoScreen(); | |
|                     currentScreen = LOGO_RL; | |
|                 } break; | |
|                 case TITLE:  | |
|                 { | |
|                     InitTitleScreen(); | |
|                     currentScreen = TITLE;                   | |
|                 } break; | |
|                 case ATTIC: | |
|                 { | |
|                     InitAtticScreen();  | |
|                     currentScreen = ATTIC; | |
|                 } break; | |
|                 case AISLE01: | |
|                 { | |
|                     InitAisle01Screen();  | |
|                     currentScreen = AISLE01; | |
|                 } break; | |
|                 case AISLE02: | |
|                 { | |
|                     InitAisle02Screen();  | |
|                     currentScreen = AISLE02; | |
|                 } break; | |
|                 case BATHROOM: | |
|                 { | |
|                     InitBathroomScreen();  | |
|                     currentScreen = BATHROOM; | |
|                 } break; | |
|                 case LIVINGROOM: | |
|                 { | |
|                     InitLivingroomScreen();  | |
|                     currentScreen = LIVINGROOM; | |
|                 } break; | |
|                 case KITCHEN: | |
|                 { | |
|                     InitKitchenScreen();  | |
|                     currentScreen = KITCHEN; | |
|                 } break; | |
|                 case ARMORY: | |
|                 { | |
|                     InitArmoryScreen();  | |
|                     currentScreen = ARMORY; | |
|                 } break; | |
|                 case ENDING: | |
|                 { | |
|                     InitEndingScreen();  | |
|                     currentScreen = ENDING; | |
|                 } break; | |
|                 default: break; | |
|             } | |
|              | |
|             transFadeOut = true; | |
|         } | |
|     } | |
|     else  // Transition fade out logic | |
|     { | |
|         transAlpha -= 0.05f; | |
|          | |
|         if (transAlpha <= 0) | |
|         { | |
|             transAlpha = 0; | |
|             transFadeOut = false; | |
|             onTransition = false; | |
|             transFromScreen = -1; | |
|             transToScreen = -1; | |
|         } | |
|     } | |
| } | |
| 
 | |
| void DrawTransition(void) | |
| { | |
|     DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, transAlpha)); | |
| } | |
| 
 | |
| // Update and draw game frame | |
| void UpdateDrawFrame(void) | |
| { | |
|     // Update | |
|     //---------------------------------------------------------------------------------- | |
|     if (!onTransition) | |
|     { | |
|         if (player.dead) | |
|         { | |
|             framesCounter++; | |
|              | |
|             if (framesCounter > 80) | |
|             { | |
|                 framesCounter = 0; | |
|                 player.dead = false; | |
|                 player.numLifes = 4; | |
|                  | |
|                 TransitionToScreen(TITLE); | |
|             } | |
|         } | |
|          | |
|         switch(currentScreen)  | |
|         { | |
|             case LOGO:  | |
|             { | |
|                 UpdateLogoScreen(); | |
|                  | |
|                 if (FinishLogoScreen()) ChangeToScreen(LOGO_RL); | |
|                  | |
|             } break; | |
|             case LOGO_RL:  | |
|             { | |
|                 rlUpdateLogoScreen(); | |
|                  | |
|                 if (rlFinishLogoScreen()) TransitionToScreen(TITLE); | |
|                  | |
|             } break; | |
|             case TITLE:  | |
|             { | |
|                 UpdateTitleScreen(); | |
|                  | |
|                 if (FinishTitleScreen() == 1) TransitionToScreen(ATTIC); | |
| 
 | |
|             } break; | |
|             case ATTIC: | |
|             {  | |
|                 UpdateAtticScreen(); | |
|                  | |
|                 if (FinishAtticScreen() == 1) TransitionToScreen(AISLE01); | |
| 
 | |
|             } break; | |
|             case AISLE01: | |
|             {  | |
|                 UpdateAisle01Screen(); | |
|                  | |
|                 if (FinishAisle01Screen() == 1) TransitionToScreen(BATHROOM); | |
|                 else if(FinishAisle01Screen() == 2) TransitionToScreen(KITCHEN); | |
|                 else if(FinishAisle01Screen() == 3) TransitionToScreen(LIVINGROOM); | |
| 
 | |
|             } break; | |
|             case BATHROOM: | |
|             {  | |
|                 UpdateBathroomScreen(); | |
|                  | |
|                 if (FinishBathroomScreen() == 1) TransitionToScreen(AISLE01); | |
| 
 | |
|             } break; | |
|             case LIVINGROOM: | |
|             {  | |
|                 UpdateLivingroomScreen(); | |
|                  | |
|                 if (FinishLivingroomScreen() == 1) TransitionToScreen(AISLE01); | |
|                 else if(FinishLivingroomScreen() == 2)TransitionToScreen(AISLE02); | |
| 
 | |
|             } break; | |
|             case AISLE02: | |
|             {  | |
|                 UpdateAisle02Screen(); | |
|                  | |
|                 if (FinishAisle02Screen() == 1) TransitionToScreen(KITCHEN); | |
| 
 | |
|             } break; | |
|             case KITCHEN: | |
|             {  | |
|                 UpdateKitchenScreen(); | |
|                  | |
|                 if (FinishKitchenScreen() == 1) TransitionToScreen(ARMORY); | |
|                 else if(FinishKitchenScreen() == 2)TransitionToScreen(AISLE02); | |
| 
 | |
|             } break; | |
|             case ARMORY: | |
|             {  | |
|                 UpdateArmoryScreen(); | |
|                  | |
|                 if(FinishArmoryScreen() == 1) TransitionToScreen(ENDING); | |
|                 else if(FinishArmoryScreen() == 2) TransitionToScreen(KITCHEN); | |
| 
 | |
|             } break; | |
|             case ENDING:  | |
|             { | |
|                 UpdateEndingScreen(); | |
|                  | |
|                 if (FinishEndingScreen()) TransitionToScreen(TITLE); | |
| 
 | |
|             } break; | |
|             default: break; | |
|         } | |
|     } | |
|     else | |
|     { | |
|         // Update transition (fade-in, fade-out) | |
|         UpdateTransition(); | |
|     } | |
|      | |
|     UpdateMusicStream(music); | |
|     //---------------------------------------------------------------------------------- | |
|      | |
|     // Draw | |
|     //---------------------------------------------------------------------------------- | |
|     BeginDrawing(); | |
|      | |
|         ClearBackground(RAYWHITE); | |
|          | |
|         switch(currentScreen)  | |
|         { | |
|             case LOGO: DrawLogoScreen(); break; | |
|             case LOGO_RL: rlDrawLogoScreen(); break; | |
|             case TITLE: DrawTitleScreen(); break; | |
|             case ATTIC: DrawAtticScreen(); break; | |
|             case AISLE01: DrawAisle01Screen();break; | |
|             case AISLE02: DrawAisle02Screen();break; | |
|             case BATHROOM: DrawBathroomScreen();break; | |
|             case LIVINGROOM: DrawLivingroomScreen();break; | |
|             case KITCHEN: DrawKitchenScreen();break; | |
|             case ARMORY: DrawArmoryScreen();break; | |
|             case ENDING: DrawEndingScreen(); break; | |
|             default: break; | |
|         } | |
| 	 | |
|         if (onTransition) DrawTransition(); | |
|      | |
|         //DrawFPS(10, 10); | |
|      | |
|     EndDrawing(); | |
|     //---------------------------------------------------------------------------------- | |
| } | |
| 
 |