summaryrefslogtreecommitdiffhomepage
path: root/games/transmission/screens/screen_mission.c
diff options
context:
space:
mode:
Diffstat (limited to 'games/transmission/screens/screen_mission.c')
-rw-r--r--games/transmission/screens/screen_mission.c293
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;
+ }
+}