eb508bf75f
Game developed in the GGJ18, it has some bugs and ending screen is incomplete... I'll try to keep working a bit more on it.
294 lines
8.1 KiB
C
294 lines
8.1 KiB
C
/**********************************************************************************************
|
|
*
|
|
* 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;
|
|
}
|
|
}
|