- [NEW] Ara usa JailAudio - [NEW] Usant última versió de Respak - [NEW] Afegit lagueirtofile
149 lines
4.2 KiB
C++
149 lines
4.2 KiB
C++
#include "gamestates.h"
|
|
#include "jgame.h"
|
|
#include <string>
|
|
#include "aux_font.h"
|
|
#include "proc_mapa.h"
|
|
#include <SDL3/SDL.h>
|
|
|
|
namespace gamestate
|
|
{
|
|
namespace password
|
|
{
|
|
namespace eixir
|
|
{
|
|
const int no = 0;
|
|
const int sequence = 1;
|
|
const int menu = 2;
|
|
}
|
|
|
|
// Variables del gamestate
|
|
draw::surface *fondo = nullptr;
|
|
draw::surface *cursor = nullptr;
|
|
|
|
int exit = password::eixir::no;
|
|
char password[11] = " ";
|
|
uint8_t indice = 0;
|
|
|
|
// Mètodes del gamestate
|
|
bool loop();
|
|
const int getFaseFromPassword();
|
|
|
|
void init()
|
|
{
|
|
exit = password::eixir::no;
|
|
for (int i=0; i<10; ++i) password[i] = 32;
|
|
password[10] = 0;
|
|
indice = 0;
|
|
|
|
// Carrega el gif del fondo
|
|
fondo = draw::loadSurface("prefase.gif", true);
|
|
cursor = draw::loadSurface("cursor.gif");
|
|
|
|
// Pinta el text en el fondo
|
|
draw::setDestination(fondo);
|
|
font::selectFont(font::type::normal);
|
|
font::print(95, 80, "ESCRIU EL PASSWORD");
|
|
|
|
draw::setDestination(nullptr);
|
|
|
|
// Comencem el bucle
|
|
draw::fadein();
|
|
game::setState(gamestate::password::loop);
|
|
}
|
|
|
|
bool loop()
|
|
{
|
|
draw::draw(fondo);
|
|
font::print(123, 140, password);
|
|
|
|
draw::setSource(cursor);
|
|
draw::draw(input::mouseX(), input::mouseY());
|
|
|
|
draw::render();
|
|
|
|
if (draw::isfading()) return true;
|
|
|
|
if (exit)
|
|
{
|
|
if (!draw::isfading()) {
|
|
draw::freeSurface(fondo);
|
|
draw::freeSurface(cursor);
|
|
if (exit==password::eixir::sequence) gamestate::sequence::init();
|
|
if (exit==password::eixir::menu) gamestate::menu::init();
|
|
}
|
|
draw::render();
|
|
return true;
|
|
}
|
|
|
|
if (input::anyKeyPressed())
|
|
{
|
|
if (input::keyPressed(SDL_SCANCODE_ESCAPE))
|
|
{
|
|
draw::fadeout();
|
|
game::setConfig("fase", 0);
|
|
exit = password::eixir::menu;
|
|
return true;
|
|
}
|
|
else if (input::keyPressed(SDL_SCANCODE_BACKSPACE))
|
|
{
|
|
if (indice>0) password[--indice] = 32;
|
|
}
|
|
else
|
|
{
|
|
const uint8_t tecla = input::getKeyPressed();
|
|
if (tecla == SDL_SCANCODE_0) {
|
|
password[indice++] = '0';
|
|
}
|
|
else if (tecla >= SDL_SCANCODE_1 && tecla <= SDL_SCANCODE_9)
|
|
{
|
|
password[indice++] = tecla + 18;
|
|
}
|
|
else if (tecla >= SDL_SCANCODE_A && tecla <= SDL_SCANCODE_Z)
|
|
{
|
|
password[indice++] = tecla + 61;
|
|
}
|
|
|
|
if (indice == 10)
|
|
{
|
|
draw::fadeout();
|
|
game::setConfig("fase", password::getFaseFromPassword());
|
|
exit = password::eixir::sequence;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
const int getFaseFromPassword()
|
|
{
|
|
password[10] = 0;
|
|
int filesize = 0;
|
|
const char *buffer = file_getfilebuffer("offsets.bal", filesize);
|
|
|
|
int punter = 0;
|
|
|
|
bool salir = false;
|
|
char passFile[11] = " ";
|
|
int numPassword = 0;
|
|
|
|
while ( numPassword < 30 && !salir ) {
|
|
for (int i=0;i<10;i++) {
|
|
passFile[i] = buffer[punter++] - (101+i);
|
|
}
|
|
|
|
salir = true;
|
|
for (int i=0;i<10;i++) {
|
|
if (passFile[i] != password[i]) salir = false;
|
|
}
|
|
numPassword++;
|
|
}
|
|
|
|
if (!salir) numPassword = 0;
|
|
|
|
return numPassword;
|
|
}
|
|
}
|
|
}
|