diff options
Diffstat (limited to 'games/transmission/screens/screen_mission.c')
| -rw-r--r-- | games/transmission/screens/screen_mission.c | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/games/transmission/screens/screen_mission.c b/games/transmission/screens/screen_mission.c new file mode 100644 index 00000000..0f996502 --- /dev/null +++ b/games/transmission/screens/screen_mission.c @@ -0,0 +1,293 @@ +/********************************************************************************************** +* +* raylib - transmission mission +* +* +* Copyright (c) 2014-2018 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 <string.h> +#include <stdlib.h> + +#define MISSION_MAX_LENGTH 256 +#define KEYWORD_MAX_LENGTH 32 +#define MAX_LINE_CHAR 75 + +//---------------------------------------------------------------------------------- +// Global Variables Definition (local to this module) +//---------------------------------------------------------------------------------- + +// Mission screen global variables +static int framesCounter; +static int finishScreen; + +static Texture2D texBackground; + +static Texture2D texBackline; //mission_backline +static Rectangle sourceRecBackLine; +static Rectangle destRecBackLine; +static float fadeBackLine; + +static Vector2 numberPosition; +static Color numberColor; + +//static char textMission[MISSION_MAX_LENGTH]; +static Vector2 missionPosition; +static int missionSize; +static Color missionColor; +static int missionLenght; +static bool missionMaxLength; +static int missionSpeed; + +//static char textKeyword[KEYWORD_MAX_LENGTH]; +static Vector2 keywordPosition; +static Color keywordColor; + +static int showMissionWaitFrames; +static int showNumberWaitFrames; +static int showKeywordWaitFrames; + +static bool startWritting; +static bool writeMission; +static bool writeNumber; +static bool writeKeyword; +static bool writeEnd; + +static bool writtingMission; + +static int blinkFrames; +static bool blinkKeyWord = true; + +static bool showButton = false; + +static Mission *missions = NULL; + +static Sound fxTransmit; +static Music musMission; + +//---------------------------------------------------------------------------------- +// Mission Screen Functions Definition +//---------------------------------------------------------------------------------- +static void WriteMissionText(); +static void EndWritting(); +static void BlinkKeyword(); + +// Mission Screen Initialization logic +void InitMissionScreen(void) +{ + framesCounter = 0; + finishScreen = 0; + + fadeButton = 0.80f; + + texBackground = LoadTexture("resources/textures/mission_background.png"); + + texBackline = LoadTexture("resources/textures/mission_backline.png"); + sourceRecBackLine = (Rectangle){0,0,GetScreenWidth(), texBackline.height}; + destRecBackLine = (Rectangle){0,0,sourceRecBackLine.width, sourceRecBackLine.height}; + fadeBackLine = 0; + + fxTransmit = LoadSound("resources/audio/fx_message.ogg"); + musMission = LoadMusicStream("resources/audio/music_mission.ogg"); + + PlayMusicStream(musMission); + + // Initialize missions + missions = LoadMissions("resources/missions.txt"); + + missionMaxLength = strlen(missions[currentMission].brief); + + // Insert line breaks every MAX_LINE_CHAR + int currentLine = 1; + int i = currentLine * MAX_LINE_CHAR; + + while (i < missionMaxLength) + { + if (missions[currentMission].brief[i] == ' ') + { + missions[currentMission].brief[i] = '\n'; + currentLine++; + i = currentLine*MAX_LINE_CHAR; + } + else i++; + } + + missionSize = 30; + missionLenght = 0; + missionSpeed = 1; + + numberColor = RAYWHITE; + missionColor = LIGHTGRAY; + keywordColor = (Color){198, 49, 60, 255}; //RED + + numberPosition = (Vector2){150, 185}; + missionPosition = (Vector2){numberPosition.x, numberPosition.y + 60}; + keywordPosition = (Vector2){missionPosition.x, missionPosition.y + MeasureTextEx(fontMission, missions[currentMission].brief, missionSize, 0).y + 60}; + + startWritting = false; + writeNumber = false; + writeMission = false; + writeKeyword = false; + writeEnd = false; + + writtingMission = false; + + showNumberWaitFrames = 30; + showMissionWaitFrames = 60; + showKeywordWaitFrames = 60; + + blinkKeyWord = true; + blinkFrames = 15; + + PlaySound(fxTransmit); +} + +// Mission Screen Update logic +void UpdateMissionScreen(void) +{ + UpdateMusicStream(musMission); + + if (!writeEnd) WriteMissionText(); + else BlinkKeyword(); + + if (showButton) + { + if (IsKeyPressed(KEY_ENTER) || IsButtonPressed()) + { + if (!writeEnd) EndWritting(); + else + { + finishScreen = true; + showButton = false; + } + } + } +} + +// Mission Screen Draw logic +void DrawMissionScreen(void) +{ + // TODO: Draw MISSION screen here! + DrawTexture(texBackground, 0,0, WHITE); + DrawTexturePro(texBackline, sourceRecBackLine, destRecBackLine, (Vector2){0,0},0, Fade(WHITE, fadeBackLine)); + + if (writeNumber) DrawTextEx(fontMission, FormatText("Filtración #%02i ", currentMission + 1), numberPosition, missionSize + 10, 0, numberColor); + DrawTextEx(fontMission, SubText(missions[currentMission].brief, 0, missionLenght), missionPosition, missionSize, 0, missionColor); + if (writeKeyword && blinkKeyWord) DrawTextEx(fontMission, FormatText("Keyword: %s", missions[currentMission].key), keywordPosition, missionSize + 10, 0, keywordColor); + + if (showButton) + { + if (!writeEnd) DrawButton("saltar"); + else DrawButton("codificar"); + } +} + +// Mission Screen Unload logic +void UnloadMissionScreen(void) +{ + // TODO: Unload MISSION screen variables here! + UnloadTexture(texBackground); + UnloadTexture(texBackline); + UnloadSound(fxTransmit); + UnloadMusicStream(musMission); + free(missions); +} + +// Mission Screen should finish? +int FinishMissionScreen(void) +{ + return finishScreen; +} + +static void WriteMissionText() +{ + if(!startWritting) + { + framesCounter++; + if(framesCounter % 60 == 0) + { + framesCounter = 0; + startWritting = true; + } + } + else if(!writeNumber) + { + framesCounter++; + fadeBackLine += 0.020f; + if(framesCounter % showNumberWaitFrames == 0) + { + framesCounter = 0; + writeNumber = true; + showButton = true; + } + } + else if(!writeMission) + { + framesCounter ++; + if(framesCounter % showMissionWaitFrames == 0) + { + framesCounter = 0; + writeMission = true; + writtingMission = true; + } + } + else if(writeMission && writtingMission) + { + framesCounter++; + if(framesCounter % missionSpeed == 0) + { + framesCounter = 0; + missionLenght++; + + if(missionLenght == missionMaxLength) + { + writtingMission = false; + } + } + } + else if(!writeKeyword) + { + framesCounter++; + if(framesCounter % showKeywordWaitFrames == 0) + { + framesCounter = 0; + writeKeyword = true; + writeEnd = true; + } + } +} +static void EndWritting() +{ + writeEnd = true; + writeKeyword = true; + writeNumber = true; + missionLenght = missionMaxLength; +} +static void BlinkKeyword() +{ + framesCounter++; + if(framesCounter % blinkFrames == 0) + { + framesCounter = 0; + blinkKeyWord = !blinkKeyWord; + } +} |
