raylib/games/transmission/screens/screen_mission.c

294 lines
8.1 KiB
C
Raw Normal View History

/**********************************************************************************************
*
* 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;
}
}