diff --git a/media/lang/ba_BA.txt b/media/lang/ba_BA.txt new file mode 100644 index 0000000..7220071 --- /dev/null +++ b/media/lang/ba_BA.txt @@ -0,0 +1,116 @@ +## 0 - MENU DEL TITULO +JUGAR +## 1 - MENU DEL TITULO +OPCIONS +## 2 - MENU DEL TITULO +INSTRUCCIONS +## 3 - MENU DEL TITULO +EIXIR +## 4 - MENU DE OPCIONES +FINESTRA +## 5 - MENU DE OPCIONES +PANTALLA COMPLETA +## 6 - MENU DE OPCIONES +PANTALLA COMPLETA FALSA +## 7 - MENU DE OPCIONES +TAMANY DE FINESTRA +## 8 - MENU DE OPCIONES +IDIOMA +## 9 - MENU DE OPCIONES +[ ACEPTAR ] +## 10 - MENU DE OPCIONES +[ CANCELAR ] +## 11 - INSTRUCCIONES +OBJECTIU +## 12 - INSTRUCCIONES +HAS D'EXPLOTAR +## 13 - INSTRUCCIONES +TANTS GLOBUS COM PUGUES +## 14 - INSTRUCCIONES +LA DIFICULTAT AUGMENTA +## 15 - INSTRUCCIONES +A MESURA QUE VAS PUNTUANT +## 16 - INSTRUCCIONES +OBJECTES +## 17 - INSTRUCCIONES +1.000 PUNTS +## 18 - INSTRUCCIONES +2.500 PUNTS +## 19 - INSTRUCCIONES +5.000 PUNTS +## 20 - INSTRUCCIONES +PARA EL TEMPS +## 21 - INSTRUCCIONES +VIDA EXTRA +## 22 - INSTRUCCIONES +PREM UNA TECLA PER A TORNAR +## 23 - TITULO +PREM QUALSEVOL TECLA +## 24 - MENU SELECCION DE IDIOMA +ESPA^OL (ESPANYOL) +## 25 - MENU SELECCION DE IDIOMA +BALOONCIA +## 26 - MENU SELECCION DE IDIOMA +ENGLISH (ANGLES) +## 27 - INTRO +Un dia qualsevol de l'any 2000 +## 28 - INTRO +Tot esta tranquil a la UPV +## 29 - INTRO +Fins que un desaprensiu... +## 30 - INTRO +HEY! ME ANE A FERME UN CORTAET... +## 31 - INTRO +UAAAAAAAAAAAAA!!! +## 32 - INTRO +Espera un moment... +## 33 - INTRO +Si resulta que no tinc solt! +## 34 - INTRO +MERDA DE MAQUINA! +## 35 - INTRO +Blop... blop... blop... +## 36 - TEXTOS DEL JUEGO +Temps detes: +## 37 - TEXTOS DEL JUEGO +D E M O +## 38 - TEXTOS DEL JUEGO +PANTALLA +## 39 - MARCADOR +PUNTS +## 40 - MARCADOR +MAX.PUNT. +## 41 - MARCADOR +MULT +## 42 - MARCADOR +PANTALLA +## 43 - PANTALLA DE GAME OVER +FI DEL JOC +## 44 - PANTALLA DE GAME OVER +ELS TEUS PUNTS: +## 45 - PANTALLA DE GAME OVER +REINTENTAR? +## 46 - MENU DE PAUSA +CONTINUAR +## 47 - MENU DE PAUSA +EIXIR DEL JOC +## 48 - MENU GAME OVER +SI +## 49 - MENU GAME OVER +NO +## 50 - TEXTO DE COMPLETAR EL JUEGO +FELICITATS!! +## 51 - MENU DEL TITULO +1 JUGADOR +## 52 - MENU DEL TITULO +2 JUGADORS +## 53 MARCADOR +jugador 2 +## 54 MARCADOR +jugador 2 +## 55 MARCADOR +mult - +## 56 MARCADOR +max. puntuacio - +## 57 MARCADOR +nivell \ No newline at end of file diff --git a/media/lang/en_UK.txt b/media/lang/en_UK.txt new file mode 100644 index 0000000..9e828bf --- /dev/null +++ b/media/lang/en_UK.txt @@ -0,0 +1,116 @@ +## 0 - MENU DEL TITULO +PLAY +## 1 - MENU DEL TITULO +OPTIONS +## 2 - MENU DEL TITULO +HOW TO PLAY +## 3 - MENU DEL TITULO +QUIT +## 4 - MENU DE OPCIONES +WINDOW +## 5 - MENU DE OPCIONES +FULLSCREEN +## 6 - MENU DE OPCIONES +FAKE FULLSCREEN +## 7 - MENU DE OPCIONES +WINDOW SIZE +## 8 - MENU DE OPCIONES +LANGUAGE +## 9 - MENU DE OPCIONES +[ ACCEPT ] +## 10 - MENU DE OPCIONES +[ CANCEL ] +## 11 - INSTRUCCIONES +OBJECTIVE +## 12 - INSTRUCCIONES +YOU HAVE TO POP AS MANY +## 13 - INSTRUCCIONES +BALLOONS AS YOU CAN +## 14 - INSTRUCCIONES +DIFFICULTY WILL BE INCREASED +## 15 - INSTRUCCIONES +AS YOU SCORE POINTS +## 16 - INSTRUCCIONES +ITEMS +## 17 - INSTRUCCIONES +1.000 POINTS +## 18 - INSTRUCCIONES +2.500 POINTS +## 19 - INSTRUCCIONES +5.000 POINTS +## 20 - INSTRUCCIONES +TIME STOPPER +## 21 - INSTRUCCIONES +EXTRA HIT +## 22 - INSTRUCCIONES +PRESS ANY KEY TO RETURN +## 23 - TITULO +PRESS ANY KEY +## 24 - MENU SELECCION DE IDIOMA +ESPA^OL (SPANISH) +## 25 - MENU SELECCION DE IDIOMA +BALOONCIA (VALENCIAN) +## 26 - MENU SELECCION DE IDIOMA +ENGLISH +## 27 - INTRO +Any day of the year 2000 +## 28 - INTRO +Everything is quiet at the UPV +## 29 - INTRO +Until a bastard arrives... +## 30 - INTRO + YO! GONNA TAKE A CAFELITO... +## 31 - INTRO +AAAAAAAARGHHHH!!! +## 32 - INTRO +Wait a moment... +## 33 - INTRO + I don't have any loose! +## 34 - INTRO +FUCKING MACHINE! +## 35 - INTRO +Blop... blop... blop... +## 36 - TEXTOS DEL JUEGO +Time Stopped: +## 37 - TEXTOS DEL JUEGO +D E M O +## 38 - TEXTOS DEL JUEGO +STAGE +## 39 - MARCADOR +SCORE +## 40 - MARCADOR +HI-SCORE +## 41 - MARCADOR +MULT +## 42 - MARCADOR +STAGE +## 43 - PANTALLA DE GAME OVER +GAME OVER +## 44 - PANTALLA DE GAME OVER +YOUR SCORE: +## 45 - PANTALLA DE GAME OVER +RETRY? +## 46 - MENU DE PAUSA +CONTINUE +## 47 - MENU DE PAUSA +LEAVE GAME +## 48 - MENU GAME OVER +YES +## 49 - MENU GAME OVER +NO +## 50 - TEXTO DE COMPLETAR EL JUEGO +NICE!! +## 51 - MENU DEL TITULO +1 PLAYER +## 52 - MENU DEL TITULO +2 PLAYERS +## 53 MARCADOR +player 1 +## 54 MARCADOR +player 2 +## 55 MARCADOR +mult - +## 56 MARCADOR +high score - +## 57 MARCADOR +stage \ No newline at end of file diff --git a/media/lang/es_ES.txt b/media/lang/es_ES.txt new file mode 100644 index 0000000..284a761 --- /dev/null +++ b/media/lang/es_ES.txt @@ -0,0 +1,116 @@ +## 0 - MENU DEL TITULO +JUGAR +## 1 - MENU DEL TITULO +OPCIONES +## 2 - MENU DEL TITULO +INSTRUCCIONES +## 3 - MENU DEL TITULO +SALIR +## 4 - MENU DE OPCIONES +VENTANA +## 5 - MENU DE OPCIONES +PANTALLA COMPLETA +## 6 - MENU DE OPCIONES +PANTALLA COMPLETA FALSA +## 7 - MENU DE OPCIONES +TAMA^O DE VENTANA +## 8 - MENU DE OPCIONES +IDIOMA +## 9 - MENU DE OPCIONES +[ ACEPTAR ] +## 10 - MENU DE OPCIONES +[ CANCELAR ] +## 11 - INSTRUCCIONES +OBJETIVO +## 12 - INSTRUCCIONES +TIENES QUE EXPLOTAR +## 13 - INSTRUCCIONES +TANTOS GLOBOS COMO PUEDAS +## 14 - INSTRUCCIONES +LA DIFICULTAD SE INCREMENTA +## 15 - INSTRUCCIONES +A MEDIDA QUE VAS PUNTUANDO +## 16 - INSTRUCCIONES +OBJETOS +## 17 - INSTRUCCIONES +1.000 PUNTOS +## 18 - INSTRUCCIONES +2.500 PUNTOS +## 19 - INSTRUCCIONES +5.000 PUNTOS +## 20 - INSTRUCCIONES +DETIENE EL TIEMPO +## 21 - INSTRUCCIONES +VIDA EXTRA +## 22 - INSTRUCCIONES +PULSA UNA TECLA PARA VOLVER +## 23 - TITULO +PULSA CUALQUIER TECLA +## 24 - MENU SELECCION DE IDIOMA +ESPA^OL +## 25 - MENU SELECCION DE IDIOMA +BALOONCIA (VALENCIANO) +## 26 - MENU SELECCION DE IDIOMA +ENGLISH (INGLES) +## 27 - INTRO +Un dia cualquiera del a^o 2000 +## 28 - INTRO +Todo esta tranquilo en la UPV +## 29 - INTRO +Hasta que un desaprensivo... +## 30 - INTRO +HEY! VOY A SACARME UN TALLADET... +## 31 - INTRO +UAAAAAAAAAAAAA!!! +## 32 - INTRO +Espera un momento... +## 33 - INTRO +Si no llevo suelto encima! +## 34 - INTRO +MIERDA DE MAQUINA! +## 35 - INTRO +Blop... blop... blop... +## 36 - TEXTOS DEL JUEGO +Tiempo: +## 37 - TEXTOS DEL JUEGO +D E M O +## 38 - TEXTOS DEL JUEGO +FASE +## 39 - MARCADOR +PUNTOS +## 40 - MARCADOR +MAX.PUNT. +## 41 - MARCADOR +MULT +## 42 - MARCADOR +FASE +## 43 - PANTALLA DE GAME OVER +FIN DE JUEGO +## 44 - PANTALLA DE GAME OVER +TU PUNTUACION: +## 45 - PANTALLA DE GAME OVER +REINTENTAR? +## 46 - MENU DE PAUSA +CONTINUAR +## 47 - MENU DE PAUSA +SALIR DEL JUEGO +## 48 - MENU GAME OVER +SI +## 49 - MENU GAME OVER +NO +## 50 - TEXTO DE COMPLETAR EL JUEGO +FELICIDADES!! +## 51 - MENU DEL TITULO +1 JUGADOR +## 52 - MENU DEL TITULO +2 JUGADORES +## 53 MARCADOR +jugador 1 +## 54 MARCADOR +jugador 2 +## 55 MARCADOR +mult - +## 56 MARCADOR +max. puntuacion - +## 57 MARCADOR +fase \ No newline at end of file diff --git a/source/director.cpp b/source/director.cpp index 9b44dca..3c54887 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -21,6 +21,9 @@ Director::Director(std::string path) if (!checkFileList()) section = PROG_SECTION_QUIT; + // Inicializa el objeto de idioma + mLang = new Lang(mFileList); + // Crea el objeto y carga el fichero de configuración mOptions = new options_t; if (!loadConfigFile()) @@ -73,9 +76,13 @@ Director::~Director() delete mInput1; mInput1 = nullptr; + delete mInput2; mInput2 = nullptr; + delete mLang; + mLang = nullptr; + delete mOptions; mOptions = nullptr; @@ -95,7 +102,7 @@ void Director::init(Uint8 name) mSection.subsection = 0; // Textos - initTextStrings(mTextStrings, mOptions->language); + mLang->setLang(mOptions->language); // Teclado mInput1->bindKey(INPUT_UP, SDL_SCANCODE_UP); @@ -194,7 +201,7 @@ bool Director::initSDL() void Director::setFileList() { // Inicializa el vector - for (int i = 0; i < 100; i++) + for (int i = 0; i < MAX_FILE_LIST; i++) mFileList[i] = ""; // Ficheros binarios @@ -259,6 +266,11 @@ void Director::setFileList() mFileList[47] = mExecutablePath + "/" + "../media/font/smb2_big.txt"; mFileList[30] = mExecutablePath + "/" + "../media/font/smb2.png"; mFileList[48] = mExecutablePath + "/" + "../media/font/smb2.txt"; + + // Textos + mFileList[49] = mExecutablePath + "/" + "../media/lang/es_ES.txt"; + mFileList[50] = mExecutablePath + "/" + "../media/lang/en_UK.txt"; + mFileList[51] = mExecutablePath + "/" + "../media/lang/ba_BA.txt"; } // Comprueba que todos los ficheros existen @@ -274,7 +286,7 @@ bool Director::checkFileList() // Comprueba los ficheros de musica printf(">> MUSIC FILES\n"); if (success) - for (int i = 3; i < 100; i++) + for (int i = 3; i < MAX_FILE_LIST; i++) { if (mFileList[i].find("/media/music/") != std::string::npos) { @@ -298,7 +310,7 @@ bool Director::checkFileList() // Comprueba los ficheros de sonidos printf("\n>> SOUND FILES\n"); if (success) - for (int i = 3; i < 100; i++) + for (int i = 3; i < MAX_FILE_LIST; i++) { if (mFileList[i].find("/media/sound/") != std::string::npos) { @@ -322,7 +334,7 @@ bool Director::checkFileList() // Comprueba los ficheros con graficos printf("\n>> BITMAP FILES\n"); if (success) - for (int i = 3; i < 100; i++) + for (int i = 3; i < MAX_FILE_LIST; i++) { if (mFileList[i].find("/media/gfx/") != std::string::npos) { @@ -346,7 +358,7 @@ bool Director::checkFileList() // Comprueba los ficheros con fuentes de texto printf("\n>> FONT FILES\n"); if (success) - for (int i = 3; i < 100; i++) + for (int i = 3; i < MAX_FILE_LIST; i++) { if (mFileList[i].find("/media/font/") != std::string::npos) { @@ -367,6 +379,30 @@ bool Director::checkFileList() } } + // Comprueba los ficheros con textos en diferentes idiomas + printf("\n>> LANG FILES\n"); + if (success) + for (int i = 3; i < 100; i++) + { + if (mFileList[i].find("/media/lang/") != std::string::npos) + { + p = mFileList[i].c_str(); + filename = p.substr(p.find_last_of("\\/") + 1); + file = SDL_RWFromFile(p.c_str(), "r+b"); + if (file != NULL) + { + printf("Checking file %-20s [OK]\n", filename.c_str()); + } + else + { + printf("Checking file %-20s [ERROR]\n", filename.c_str()); + success = false; + break; + } + SDL_RWclose(file); + } + } + // Resultado if (success) printf("\n** All files OK.\n\n"); @@ -453,7 +489,7 @@ bool Director::loadConfigFile() // Aplica las opciones SDL_SetWindowFullscreen(mWindow, mOptions->fullScreenMode); SDL_SetWindowSize(mWindow, SCREEN_WIDTH * mOptions->windowSize, SCREEN_HEIGHT * mOptions->windowSize); - initTextStrings(mTextStrings, mOptions->language); + mLang->setLang(mOptions->language); // Cierra el fichero SDL_RWclose(file); @@ -526,14 +562,14 @@ void Director::runLogo() void Director::runIntro() { - mIntro = new Intro(mRenderer, mFileList, mTextStrings); + mIntro = new Intro(mRenderer, mFileList, mLang); setSection(mIntro->run()); delete mIntro; } void Director::runTitle() { - mTitle = new Title(mWindow, mRenderer, mInput1, mFileList, mOptions, mTextStrings); + mTitle = new Title(mWindow, mRenderer, mInput1, mFileList, mOptions, mLang); setSection(mTitle->run(mSection.subsection)); delete mTitle; } @@ -541,9 +577,9 @@ void Director::runTitle() void Director::runGame() { if (mSection.subsection == GAME_SECTION_PLAY_1P) - mGame = new Game(1, mRenderer, mFileList, mTextStrings, mInput1, mInput2, false); + mGame = new Game(1, mRenderer, mFileList, mLang, mInput1, mInput2, false); if (mSection.subsection == GAME_SECTION_PLAY_2P) - mGame = new Game(2, mRenderer, mFileList, mTextStrings, mInput1, mInput2, false); + mGame = new Game(2, mRenderer, mFileList, mLang, mInput1, mInput2, false); setSection(mGame->run()); delete mGame; } diff --git a/source/director.h b/source/director.h index b3e2cc3..30ae0ca 100644 --- a/source/director.h +++ b/source/director.h @@ -25,6 +25,8 @@ #ifndef DIRECTOR_H #define DIRECTOR_H +#define MAX_FILE_LIST 100 + // Director class Director { @@ -39,10 +41,10 @@ private: Intro *mIntro; // Objeto para la sección de la intro Title *mTitle; // Objeto para la sección del titulo y el menu de opciones Game *mGame; // Objeto para la sección del juego + Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas - std::string mFileList[100]; // Vector con las rutas a los ficheros de recursos - struct options_t *mOptions; // Variable con todas las opciones del programa - std::string mTextStrings[MAX_TEXT_STRINGS]; // Vector con los textos del juego + std::string mFileList[MAX_FILE_LIST]; // Vector con las rutas a los ficheros de recursos + struct options_t *mOptions; // Variable con todas las opciones del programa std::string mExecutablePath; // Path del ejecutable section_t mSection; // Sección y subsección actual del programa; diff --git a/source/game.cpp b/source/game.cpp index bfb5f81..e9f56a3 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -5,12 +5,12 @@ #endif // Constructor -Game::Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, std::string *textStrings, Input *input1, Input *input2, bool demo) +Game::Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, Lang *lang, Input *input1, Input *input2, bool demo) { // Copia los punteros mRenderer = renderer; mFileList = filelist; - mTextStrings = textStrings; + mLang = lang; mInput[0] = input1; mInput[1] = input2; mDemo.enabled = demo; @@ -361,8 +361,8 @@ void Game::init() // Inicializa el objeto con el menu de pausa mMenuPause->init("PAUSE", 0, 12 * BLOCK, MENU_BACKGROUND_SOLID); - mMenuPause->addItem(mTextStrings[46]); - mMenuPause->addItem(mTextStrings[47]); + mMenuPause->addItem(mLang->getText(46)); + mMenuPause->addItem(mLang->getText(47)); mMenuPause->setDefaultActionWhenCancel(0); mMenuPause->setBackgroundColor(0x29, 0x39, 0x41, 240); mMenuPause->setSelectorColor(0xFF, 0x7A, 0x00, 255); @@ -372,8 +372,8 @@ void Game::init() // Inicializa el objeto con el menu de la pantalla de game over mMenuGameOver->init("GAME OVER", 0, PLAY_AREA_CENTER_Y + BLOCK * 4, MENU_BACKGROUND_TRANSPARENT); - mMenuGameOver->addItem(mTextStrings[48]); - mMenuGameOver->addItem(mTextStrings[49]); + mMenuGameOver->addItem(mLang->getText(48)); + mMenuGameOver->addItem(mLang->getText(49)); mMenuGameOver->setDefaultActionWhenCancel(1); mMenuGameOver->setBackgroundColor(0, 0, 0, 255); mMenuGameOver->setSelectorColor(0x54, 0x6e, 0x7a, 255); @@ -1568,16 +1568,16 @@ void Game::renderScoreBoard() mSpriteScoreBoard->render(); /* // SCORE - mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_WORD_Y - 6, mTextStrings[39], 0); + mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_WORD_Y - 6, mLang->getText(39), 0); mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y - 6, updateScoreText(mPlayer[0]->getScore()), 0); // HI-SCORE - mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_WORD_Y - 6, mTextStrings[40], 0); + mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_WORD_Y - 6, mLang->getText(40), 0); mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_NUMBER_Y - 6, updateScoreText(mHiScore), 0); // MULT color.g = 255; - mText->writeColored(MULTIPLIER_WORD_X, MULTIPLIER_WORD_Y - 6, mTextStrings[41], color); + mText->writeColored(MULTIPLIER_WORD_X, MULTIPLIER_WORD_Y - 6, mLang->getText(41), color); color.g = 192; mTextX2->writeShadowed(PLAY_AREA_CENTER_X - 16, SCORE_WORD_Y + 5, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(0, 1), color, 1); @@ -1585,7 +1585,7 @@ void Game::renderScoreBoard() mText->writeShadowed(PLAY_AREA_CENTER_X + 4, SCORE_WORD_Y + 12, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(2, 1), color); // STAGE - mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y + 4, mTextStrings[42] + std::to_string(mStage[mCurrentStage].number), 0); + mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y + 4, mLang->getText(42) + std::to_string(mStage[mCurrentStage].number), 0); // POWER mSpritePowerMeter->setSpriteClip(256, 184, 40, 8); @@ -1599,33 +1599,33 @@ void Game::renderScoreBoard() const int offset3 = offset2 + 8; //const int offset4 = offset3 + 8; // PLAYER1 - SCORE - mTextScoreBoard->writeCentered(PLAY_AREA_LEFT + 30, offset1, mTextStrings[53]); + mTextScoreBoard->writeCentered(PLAY_AREA_LEFT + 30, offset1, mLang->getText(53)); mTextScoreBoard->writeCentered(PLAY_AREA_LEFT + 30, offset2, updateScoreText(mPlayer[0]->getScore())); // PLAYER1 - MULT - mTextScoreBoard->writeCentered(PLAY_AREA_LEFT + 30, offset3, mTextStrings[55] + std::to_string(mPlayer[0]->getScoreMultiplier()).substr(0, 3)); + mTextScoreBoard->writeCentered(PLAY_AREA_LEFT + 30, offset3, mLang->getText(55) + std::to_string(mPlayer[0]->getScoreMultiplier()).substr(0, 3)); if (mNumPlayers == 2) { // PLAYER2 - SCORE - mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset1, mTextStrings[54]); + mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset1, mLang->getText(54)); mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset2, updateScoreText(mPlayer[1]->getScore())); // PLAYER2 - MULT - mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset3, mTextStrings[55] + std::to_string(mPlayer[1]->getScoreMultiplier()).substr(0, 3)); + mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset3, mLang->getText(55) + std::to_string(mPlayer[1]->getScoreMultiplier()).substr(0, 3)); } else { // PLAYER2 - SCORE - mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset1, mTextStrings[54]); + mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset1, mLang->getText(54)); mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset2, "0000000"); // PLAYER2 - MULT - mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset3, mTextStrings[55] + "1.0"); + mTextScoreBoard->writeCentered(PLAY_AREA_RIGHT - 30, offset3, mLang->getText(55) + "1.0"); } // STAGE - mTextScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset1 - 1, mTextStrings[57] + std::to_string(mStage[mCurrentStage].number)); + mTextScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset1 - 1, mLang->getText(57) + std::to_string(mStage[mCurrentStage].number)); // POWER mSpritePowerMeter->setSpriteClip(256, 184, 40, 8); @@ -1635,7 +1635,7 @@ void Game::renderScoreBoard() mSpritePowerMeter->render(); // HI-SCORE - mTextScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset3 + 1, mTextStrings[56] + updateScoreText(mHiScore)); + mTextScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset3 + 1, mLang->getText(56) + updateScoreText(mHiScore)); } // Actualiza las variables del jugador @@ -2907,7 +2907,7 @@ void Game::renderMessages() { if ((mTimeStoppedCounter > 100) || (mTimeStoppedCounter % 10 > 4)) //mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, "Time Stopped: " + std::to_string(mTimeStoppedCounter / 10)); - mText->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, mTextStrings[36] + std::to_string(mTimeStoppedCounter / 10), 1, noColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, mLang->getText(36) + std::to_string(mTimeStoppedCounter / 10), 1, noColor, 1, shdwTxtColor); if (mTimeStoppedCounter > 100) { @@ -2924,12 +2924,12 @@ void Game::renderMessages() // D E M O if (mDemo.enabled) if (mDemo.counter % 30 > 14) - mTextBig->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, mTextStrings[37], 0, noColor, 2, shdwTxtColor); + mTextBig->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, mLang->getText(37), 0, noColor, 2, shdwTxtColor); // STAGE NUMBER - std::string text = mTextStrings[38] + std::to_string(mStage[mCurrentStage].number); + std::string text = mLang->getText(38) + std::to_string(mStage[mCurrentStage].number); if (mGameCompleted) // Texto de juego completado - text = mTextStrings[50]; + text = mLang->getText(50); if (mStageBitmapCounter < STAGE_COUNTER) mTextBig->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, mStageBitmapPath[mStageBitmapCounter], text, 1, noColor, 2, shdwTxtColor); @@ -3258,9 +3258,9 @@ void Game::runGameOverScreen() SDL_RenderClear(mRenderer); // Dibuja los objetos - mTextBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 4), mTextStrings[43]); - mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 1), mTextStrings[44] + std::to_string(mPlayer[0]->getScore())); - mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y + BLOCK * 2, mTextStrings[45]); + mTextBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 4), mLang->getText(43)); + mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 1), mLang->getText(44) + std::to_string(mPlayer[0]->getScore())); + mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y + BLOCK * 2, mLang->getText(45)); mMenuGameOver->render(); mFade->render(); diff --git a/source/game.h b/source/game.h index 8ae0149..7102feb 100644 --- a/source/game.h +++ b/source/game.h @@ -81,7 +81,7 @@ private: SDL_Renderer *mRenderer; // El renderizador de la ventana std::string *mFileList; // Lista de ficheros con los recursos - std::string *mTextStrings; // Vector con los textos del juego + Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas int mNumPlayers; // Numero de jugadores Player *mPlayer[2]; // Vector con los jugadores jugador @@ -209,7 +209,7 @@ private: public: // Constructor - Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, std::string *textStrings, Input *input1, Input *input2, bool demo); + Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, Lang *lang, Input *input1, Input *input2, bool demo); // Destructor ~Game(); diff --git a/source/instructions.cpp b/source/instructions.cpp index e8782b7..ad3771a 100644 --- a/source/instructions.cpp +++ b/source/instructions.cpp @@ -7,12 +7,12 @@ const Uint8 SELF = 0; // Constructor -Instructions::Instructions(SDL_Renderer *renderer, std::string *fileList, std::string *textStrings) +Instructions::Instructions(SDL_Renderer *renderer, std::string *fileList, Lang *lang) { // Copia los punteros mRenderer = renderer; mFileList = fileList; - mTextStrings = textStrings; + mLang = lang; // Reserva memoria para los punteros mEventHandler = new SDL_Event(); @@ -156,21 +156,21 @@ void Instructions::run(Uint8 mode) SDL_RenderClear(mRenderer); // Escribe el texto - mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 8, mTextStrings[11], 1, orangeColor, 1, shdwTxtColor); - mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 24, mTextStrings[12], 1, noColor, 1, shdwTxtColor); - mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 34, mTextStrings[13], 1, noColor, 1, shdwTxtColor); - mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 48, mTextStrings[14], 1, noColor, 1, shdwTxtColor); - mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 58, mTextStrings[15], 1, noColor, 1, shdwTxtColor); - mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 75, mTextStrings[16], 1, orangeColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 8, mLang->getText(11), 1, orangeColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 24, mLang->getText(12), 1, noColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 34, mLang->getText(13), 1, noColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 48, mLang->getText(14), 1, noColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 58, mLang->getText(15), 1, noColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 75, mLang->getText(16), 1, orangeColor, 1, shdwTxtColor); - mText->writeShadowed(84, 92, mTextStrings[17], shdwTxtColor); - mText->writeShadowed(84, 108, mTextStrings[18], shdwTxtColor); - mText->writeShadowed(84, 124, mTextStrings[19], shdwTxtColor); - mText->writeShadowed(84, 140, mTextStrings[20], shdwTxtColor); - mText->writeShadowed(84, 156, mTextStrings[21], shdwTxtColor); + mText->writeShadowed(84, 92, mLang->getText(17), shdwTxtColor); + mText->writeShadowed(84, 108, mLang->getText(18), shdwTxtColor); + mText->writeShadowed(84, 124, mLang->getText(19), shdwTxtColor); + mText->writeShadowed(84, 140, mLang->getText(20), shdwTxtColor); + mText->writeShadowed(84, 156, mLang->getText(21), shdwTxtColor); if ((mode == INSTRUCTIONS_MODE_MANUAL) && (mCounter % 50 > 14)) - mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, SCREEN_HEIGHT - 12, mTextStrings[22], 1, orangeColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, SCREEN_HEIGHT - 12, mLang->getText(22), 1, orangeColor, 1, shdwTxtColor); // Disquito mSprite->init(destRect1, mItemTexture, mRenderer); diff --git a/source/instructions.h b/source/instructions.h index 6f4b73f..b3cc7b1 100644 --- a/source/instructions.h +++ b/source/instructions.h @@ -14,20 +14,20 @@ class Instructions { private: - LTexture *mItemTexture; // Textura con los graficos - LTexture *mTextTexture; // Textura con los graficos - SDL_Event *mEventHandler; // Manejador de eventos - SDL_Renderer *mRenderer; // El renderizador de la ventana - SDL_Texture *mBackbuffer; // Textura para usar como backbuffer - Sprite *mSprite; // Sprite con la textura de las instrucciones - std::string *mFileList; // Lista de ficheros - std::string *mTextStrings; // Vector con los textos del juego - Text *mText; // Objeto para escribir texto - Uint16 mCounter; // Contador - section_t mSection; // Estado del bucle principal para saber si continua o se sale - Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa - Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa - bool mManualQuit; // Indica si se quiere salir del modo manual + LTexture *mItemTexture; // Textura con los graficos + LTexture *mTextTexture; // Textura con los graficos + SDL_Event *mEventHandler; // Manejador de eventos + SDL_Renderer *mRenderer; // El renderizador de la ventana + SDL_Texture *mBackbuffer; // Textura para usar como backbuffer + Sprite *mSprite; // Sprite con la textura de las instrucciones + std::string *mFileList; // Lista de ficheros + Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas + Text *mText; // Objeto para escribir texto + Uint16 mCounter; // Contador + section_t mSection; // Estado del bucle principal para saber si continua o se sale + Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa + Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa + bool mManualQuit; // Indica si se quiere salir del modo manual // Carga los recursos bool loadMedia(); @@ -43,7 +43,7 @@ private: public: // Constructor - Instructions(SDL_Renderer *renderer, std::string *fileList, std::string *textStrings); + Instructions(SDL_Renderer *renderer, std::string *fileList, Lang *lang); // Destructor ~Instructions(); diff --git a/source/intro.cpp b/source/intro.cpp index 7fa40ad..b194fad 100644 --- a/source/intro.cpp +++ b/source/intro.cpp @@ -5,12 +5,12 @@ #endif // Constructor -Intro::Intro(SDL_Renderer *renderer, std::string *fileList, std::string *textStrings) +Intro::Intro(SDL_Renderer *renderer, std::string *fileList, Lang *lang) { // Copia los punteros mRenderer = renderer; mFileList = fileList; - mTextStrings = textStrings; + mLang = lang; // Reserva memoria para los punteros mEventHandler = new SDL_Event(); @@ -144,39 +144,39 @@ void Intro::init() } // Un dia qualsevol de l'any 2000 - mText[0]->setCaption(mTextStrings[27]); + mText[0]->setCaption(mLang->getText(27)); mText[0]->setWrittingSpeed(10); // Tot esta tranquil a la UPV - mText[1]->setCaption(mTextStrings[28]); + mText[1]->setCaption(mLang->getText(28)); mText[1]->setWrittingSpeed(10); // Fins que un desaprensiu... - mText[2]->setCaption(mTextStrings[29]); + mText[2]->setCaption(mLang->getText(29)); mText[2]->setWrittingSpeed(15); // HEY! ME ANE A FERME UN CORTAET... - mText[3]->setCaption(mTextStrings[30]); + mText[3]->setCaption(mLang->getText(30)); mText[3]->setWrittingSpeed(10); // UAAAAAAAAAAAAA!!! - mText[4]->setCaption(mTextStrings[31]); + mText[4]->setCaption(mLang->getText(31)); mText[4]->setWrittingSpeed(1); // Espera un moment... - mText[5]->setCaption(mTextStrings[32]); + mText[5]->setCaption(mLang->getText(32)); mText[5]->setWrittingSpeed(20); // Si resulta que no tinc solt! - mText[6]->setCaption(mTextStrings[33]); + mText[6]->setCaption(mLang->getText(33)); mText[6]->setWrittingSpeed(2); // MERDA DE MAQUINA! - mText[7]->setCaption(mTextStrings[34]); + mText[7]->setCaption(mLang->getText(34)); mText[7]->setWrittingSpeed(3); // Blop... blop... blop... - mText[8]->setCaption(mTextStrings[35]); + mText[8]->setCaption(mLang->getText(35)); mText[8]->setWrittingSpeed(20); for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) diff --git a/source/intro.h b/source/intro.h index 9d5ff7e..3595bc6 100644 --- a/source/intro.h +++ b/source/intro.h @@ -19,7 +19,7 @@ private: SDL_Event *mEventHandler; // Manejador de eventos SDL_Renderer *mRenderer; // El renderizador de la ventana std::string *mFileList; // Lista de ficheros - std::string *mTextStrings; // Vector con los textos del juego + Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas section_t mSection; // Estado del bucle principal para saber si continua o se sale Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa @@ -30,7 +30,7 @@ private: public: // Constructor - Intro(SDL_Renderer *renderer, std::string *fileList, std::string *textStrings); + Intro(SDL_Renderer *renderer, std::string *fileList, Lang *lang); // Destructor ~Intro(); diff --git a/source/lang.cpp b/source/lang.cpp index 0d4ebaf..c739dd3 100644 --- a/source/lang.cpp +++ b/source/lang.cpp @@ -1,10 +1,73 @@ #include "lang.h" +#include +#include + +// Constructor +Lang::Lang(std::string *fileList) +{ + mFileList = fileList; +} + +// Destructor +Lang::~Lang() +{ +} // Inicializa los textos del juego en el idioma seleccionado -void initTextStrings(std::string *textStrings, Uint8 lang) +bool Lang::setLang(Uint8 lang) { - if ((lang < 0) || (lang > MAX_LANGUAGES)) - lang = en_UK; + std::string file; + + switch (lang) + { + case es_ES: + file = mFileList[49]; + break; + + case en_UK: + file = mFileList[50]; + break; + + case ba_BA: + file = mFileList[51]; + break; + + default: + file = mFileList[50]; + break; + } + for (int i = 0; i < MAX_TEXT_STRINGS; i++) - textStrings[i] = gTextStrings[i][lang].c_str(); + mTextStrings[i] = ""; + + bool success = false; + + std::ifstream rfile(file); + if (rfile.is_open() && rfile.good()) + { + success = true; + std::string buffer; + + // lee el resto de datos del fichero + int index = 0; + int line_read = 0; + while (std::getline(rfile, buffer)) + { + // Almacena solo las lineas impares + if (line_read % 2 == 1) + mTextStrings[index++] = buffer; + + // Limpia el buffer + buffer.clear(); + line_read++; + }; + } + + return success; +} + +// Obtiene la cadena de texto del indice +std::string Lang::getText(int index) +{ + return mTextStrings[index]; } \ No newline at end of file diff --git a/source/lang.h b/source/lang.h index cbdb8f7..228e1c9 100644 --- a/source/lang.h +++ b/source/lang.h @@ -5,7 +5,7 @@ #ifndef LANG_H #define LANG_H -// iso codes +// Lang codes #define es_ES 0 #define ba_BA 1 #define en_UK 2 @@ -13,302 +13,25 @@ // Textos #define MAX_TEXT_STRINGS 100 -const std::string gTextStrings[MAX_TEXT_STRINGS][3] = - { - // 0 - TITULO E INSTRUCCIONES - {"JUGAR", - "JUGAR", - "PLAY"}, - // 1 - {"OPCIONES", - "OPCIONS", - "OPTIONS"}, +// Clase Lang +class Lang +{ +private: + std::string *mFileList; // Lista de ficheros con los recursos + std::string mTextStrings[MAX_TEXT_STRINGS]; - // 2 - {"INSTRUCCIONES", - "INSTRUCCIONS", - "HOW TO PLAY"}, +public: + // Constructor + Lang(std::string *fileList); - // 3 - {"SALIR", - "EIXIR", - "QUIT"}, + // Destructor + ~Lang(); - // 4 - {"VENTANA", - "FINESTRA", - "WINDOW"}, - - // 5 - {"PANTALLA COMPLETA", - "PANTALLA COMPLETA", - "FULLSCREEN"}, - - // 6 - {"PANTALLA COMPLETA FALSA", - "PANTALLA COMPLETA FALSA", - "FAKE FULLSCREEN"}, - - // 7 - {"TAMA^O DE VENTANA", - "TAMANY DE FINESTRA", - "WINDOW SIZE"}, - - // 8 - {"IDIOMA", - "IDIOMA", - "LANGUAGE"}, - - // 9 - {"[ ACEPTAR ]", - "[ ACEPTAR ]", - "[ ACCEPT ]"}, - - // 10 - {"[ CANCELAR ]", - "[ CANCELAR ]", - "[ CANCEL ]"}, - - // 11 - {"OBJETIVO", - "OBJECTIU", - "OBJECTIVE"}, - - // 12 - {"TIENES QUE EXPLOTAR", - "HAS D'EXPLOTAR", - "YOU HAVE TO POP AS MANY"}, - - // 13 - {"TANTOS GLOBOS COMO PUEDAS", - "TANTS GLOBUS COM PUGUES", - "BALLOONS AS YOU CAN"}, - - // 14 - {"LA DIFICULTAD SE INCREMENTA", - "LA DIFICULTAT AUGMENTA", - "DIFFICULTY WILL BE INCREASED"}, - - // 15 - {"A MEDIDA QUE VAS PUNTUANDO", - "A MESURA QUE VAS PUNTUANT", - "AS YOU SCORE POINTS"}, - - // 16 - {"OBJETOS", - "OBJECTES", - "ITEMS"}, - - // 17 - {"1.000 PUNTOS", - "1.000 PUNTS", - "1.000 POINTS"}, - - // 18 - {"2.500 PUNTOS", - "2.500 PUNTS", - "2.500 POINTS"}, - - // 19 - {"5.000 PUNTOS", - "5.000 PUNTS", - "5.000 POINTS"}, - - // 20 - {"DETIENE EL TIEMPO", - "PARA EL TEMPS", - "TIME STOPPER"}, - - // 21 - {"VIDA EXTRA", - "VIDA EXTRA", - "EXTRA HIT"}, - - // 22 - {"PULSA UNA TECLA PARA VOLVER", - "PREM UNA TECLA PER A TORNAR", - "PRESS ANY KEY TO RETURN"}, - - // 23 - {"PULSA CUALQUIER TECLA", - "PREM QUALSEVOL TECLA", - "PRESS ANY KEY"}, - - // 24 - {"ESPA^OL", - "ESPA^OL (ESPANYOL)", - "ESPA^OL (SPANISH)"}, - - // 25 - {"BALOONCIA (VALENCIANO)", - "BALOONCIA", - "BALOONCIA (VALENCIAN)"}, - - // 26 - {"ENGLISH (INGLES)", - "ENGLISH (ANGLES)", - "ENGLISH"}, - - // 27 - INTRO - {"Un dia cualquiera del a^o 2000", - "Un dia qualsevol de l'any 2000", - "Any day of the year 2000"}, - - // 28 - {"Todo esta tranquilo en la UPV", - "Tot esta tranquil a la UPV", - "Everything is quiet at the UPV"}, - - // 29 - {"Hasta que un desaprensivo...", - "Fins que un desaprensiu...", - "Until a bastard arrives..."}, - - // 30 - {"HEY! VOY A SACARME UN TALLADET...", - "HEY! ME ANE A FERME UN CORTAET...", - " YO! GONNA TAKE A CAFELITO... "}, - - // 31 - {"UAAAAAAAAAAAAA!!!", - "UAAAAAAAAAAAAA!!!", - "AAAAAAAARGHHHH!!!"}, - - // 32 - {"Espera un momento...", - "Espera un moment...", - "Wait a moment..."}, - - // 33 - {"Si no llevo suelto encima!", - "Si resulta que no tinc solt!", - " I don't have any loose! "}, - - // 34 - {"MIERDA DE MAQUINA!", - "MERDA DE MAQUINA!", - "FUCKING MACHINE!"}, - - // 35 - {"Blop... blop... blop...", - "Blop... blop... blop...", - "Blop... blop... blop..."}, - - // 36 - TEXTOS DEL JUEGO - {"Tiempo: ", - "Temps detes: ", - "Time Stopped: "}, - - // 37 - {"D E M O", - "D E M O", - "D E M O"}, - - // 38 - {"FASE ", - "PANTALLA ", - "STAGE "}, - - // 39 - MARCADOR - {"PUNTOS", - "PUNTS", - "SCORE"}, - - // 40 - {"MAX.PUNT.", - "MAX.PUNT.", - "HI-SCORE"}, - - // 41 - {"MULT", - "MULT", - "MULT"}, - - // 42 - {"FASE ", - "PANTALLA ", - "STAGE "}, - - // 43 - PANTALLA DE GAME OVER - {"FIN DE JUEGO", - "FI DEL JOC", - "GAME OVER"}, - - // 44 - {"TU PUNTUACION: ", - "ELS TEUS PUNTS: ", - "YOUR SCORE: "}, - - // 45 - {"REINTENTAR?", - "REINTENTAR?", - "RETRY?"}, - - // 46 - MENU DE PAUSA - {"CONTINUAR", - "CONTINUAR", - "CONTINUE"}, - - // 47 - {"SALIR DEL JUEGO ", - "EIXIR DEL JOC", - "LEAVE GAME"}, - - // 48 - MENU GAME OVER - {"SI", - "SI", - "YES"}, - - // 49 - {"NO", - "NO", - "NO"}, - - // 50 - TEXTO DE COMPLETAR EL JUEGO - {"FELICIDADES!!", - "FELICITATS!!", - "NICE!!"}, - - // 51 - MENU DEL TITULO (1 JUGADOR) - {"1 JUGADOR", - "1 JUGADOR", - "1 PLAYER"}, - - // 52 - MENU DEL TITULO (2 JUGADORES) - {"2 JUGADORES", - "2 JUGADORS", - "2 PLAYERS"}, - - // MARCADOR - - // 53 - JUGADOR 1 - {"jugador 1", - "jugador 2", - "player 1"}, - - // 54 - JUGADOR 2 - {"jugador 2", - "jugador 2", - "player 2"}, - - // 55 - MULTIPLICADOR - {"mult - ", - "mult - ", - "mult - "}, - - // 56 - MAXIMA PUNTUACION - {"max. puntuacion - ", - "max. puntuacio - ", - "high score - "}, - - // 57 - FASE - {"fase ", - "nivell ", - "stage "}, + // Inicializa los textos del juego en el idioma seleccionado + bool setLang(Uint8 lang); + // Obtiene la cadena de texto del indice + std::string getText(int index); }; - -void initTextStrings(std::string *textStrings, Uint8 lang); - #endif \ No newline at end of file diff --git a/source/text.cpp b/source/text.cpp index 0620952..bbd204a 100644 --- a/source/text.cpp +++ b/source/text.cpp @@ -2,7 +2,6 @@ #include "text.h" #include #include -//#include // Constructor Text::Text(std::string file, LTexture *texture, SDL_Renderer *renderer) @@ -20,11 +19,6 @@ Text::~Text() mSprite = nullptr; } -// en el constructor se le pasa la ruta del fichero de descripcion -// el fichero tendra el alto y ancho del cuadrado donde esta cada letra -// y el listado de anchos de cada una -// el init ya no necesita type ni size - // Inicializador void Text::init() { @@ -138,12 +132,10 @@ void Text::initOffsetFromFile() std::getline(rfile, buffer); std::getline(rfile, buffer); mBoxWidth = std::stoi(buffer); - //printf("mBoxWidth: %i\n", mBoxWidth); std::getline(rfile, buffer); std::getline(rfile, buffer); mBoxHeight = std::stoi(buffer); - //printf("mBoxHeight: %i\n", mBoxHeight); // lee el resto de datos del fichero int index = 32; @@ -152,11 +144,9 @@ void Text::initOffsetFromFile() { // Almacena solo las lineas impares if (line_read % 2 == 1) - { - //printf("%i - %i - %s\n", line_read, index, buffer.c_str()); mOffset[index++].w = std::stoi(buffer); - } - //Then clear the buffer once you're done with it. + + // Limpia el buffer buffer.clear(); line_read++; }; diff --git a/source/title.cpp b/source/title.cpp index 3b9e65f..eada0b4 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -5,7 +5,7 @@ #endif // Constructor -Title::Title(SDL_Window *window, SDL_Renderer *renderer, Input *input, std::string *fileList, options_t *options, std::string *textStrings) +Title::Title(SDL_Window *window, SDL_Renderer *renderer, Input *input, std::string *fileList, options_t *options, Lang *lang) { // Copia las direcciones de los punteros mWindow = window; @@ -13,7 +13,7 @@ Title::Title(SDL_Window *window, SDL_Renderer *renderer, Input *input, std::stri mInput = input; mFileList = fileList; mOptions = options; - mTextStrings = textStrings; + mLang = lang; // Reserva memoria para los punteros propios mEventHandler = new SDL_Event(); @@ -50,6 +50,9 @@ Title::~Title() delete mText2; mText2 = nullptr; + delete mLang; + mLang = nullptr; + delete mFade; mFade = nullptr; @@ -243,11 +246,11 @@ void Title::init(bool demo, Uint8 subsection) // Inicializa los objetos de menu mMenu.title->init("TITLE", 0, 14 * BLOCK, MENU_BACKGROUND_TRANSPARENT); - mMenu.title->addItem(mTextStrings[51]); // 1 PLAYER - mMenu.title->addItem(mTextStrings[52], 0, 5); // 2 PLAYERS - mMenu.title->addItem(mTextStrings[1], 0, 5); // OPTIONS - //mMenu.title->addItem(mTextStrings[2], 0, 5); // HOW TO PLAY - mMenu.title->addItem(mTextStrings[3]); // QUIT + mMenu.title->addItem(mLang->getText(51)); // 1 PLAYER + mMenu.title->addItem(mLang->getText(52), 0, 5); // 2 PLAYERS + mMenu.title->addItem(mLang->getText(1), 0, 5); // OPTIONS + //mMenu.title->addItem(mLang->getText(2), 0, 5); // HOW TO PLAY + mMenu.title->addItem(mLang->getText(3)); // QUIT mMenu.title->setDefaultActionWhenCancel(3); mMenu.title->setBackgroundColor(0x30, 0x30, 0x40, 192); //mMenu.title->setSelectorColor(0xe5, 0x1c, 0x23, 255); @@ -258,11 +261,11 @@ void Title::init(bool demo, Uint8 subsection) mMenu.title->centerMenuElements(); //mMenu.options->init("OPTIONS", 0, 14 * BLOCK, MENU_BACKGROUND_SOLID); - //mMenu.options->addItem(mTextStrings[4]); - //mMenu.options->addItem(mTextStrings[7]); - //mMenu.options->addItem(mTextStrings[8], 0, 5); - //mMenu.options->addItem(mTextStrings[9]); - //mMenu.options->addItem(mTextStrings[10]); + //mMenu.options->addItem(mLang->getText(4)); + //mMenu.options->addItem(mLang->getText(7)); + //mMenu.options->addItem(mLang->getText(8), 0, 5); + //mMenu.options->addItem(mLang->getText(9)); + //mMenu.options->addItem(mLang->getText(10)); //mMenu.options->setDefaultActionWhenCancel(4); //mMenu.options->setBackgroundColor(0x30, 0x30, 0x40, 192); //mMenu.options->setSelectorColor(0xe5, 0x1c, 0x23, 255); @@ -271,11 +274,11 @@ void Title::init(bool demo, Uint8 subsection) //mMenu.options->centerMenuElements(); mMenu.options->init("OPTIONS", 0, BLOCK, MENU_BACKGROUND_SOLID); - mMenu.options->addItem(mTextStrings[4]); // WINDOW - mMenu.options->addItem(mTextStrings[7]); - mMenu.options->addItem(mTextStrings[8], 0, 5); - mMenu.options->addItem(mTextStrings[9]); // ACCEPT - mMenu.options->addItem(mTextStrings[10]); // CANCEL + mMenu.options->addItem(mLang->getText(4)); // WINDOW + mMenu.options->addItem(mLang->getText(7)); + mMenu.options->addItem(mLang->getText(8), 0, 5); + mMenu.options->addItem(mLang->getText(9)); // ACCEPT + mMenu.options->addItem(mLang->getText(10)); // CANCEL mMenu.options->setDefaultActionWhenCancel(4); mMenu.options->setBackgroundColor(0x30, 0x30, 0x40, 192); mMenu.options->setSelectorColor(0xe5, 0x1c, 0x23, 255); @@ -335,46 +338,46 @@ void Title::updateMenuLabels() switch (mOptions->fullScreenMode) { case 0: - mMenu.options->setItemCaption(0, mTextStrings[4]); // WINDOW + mMenu.options->setItemCaption(0, mLang->getText(4)); // WINDOW break; case SDL_WINDOW_FULLSCREEN: - mMenu.options->setItemCaption(0, mTextStrings[5]); // FULLSCREEN + mMenu.options->setItemCaption(0, mLang->getText(5)); // FULLSCREEN break; case SDL_WINDOW_FULLSCREEN_DESKTOP: - mMenu.options->setItemCaption(0, mTextStrings[6]); // FAKE FULLSCREEN + mMenu.options->setItemCaption(0, mLang->getText(6)); // FAKE FULLSCREEN break; default: - mMenu.options->setItemCaption(0, mTextStrings[4]); // WINDOW + mMenu.options->setItemCaption(0, mLang->getText(4)); // WINDOW break; } - mMenu.options->setItemCaption(1, mTextStrings[7] + " x" + std::to_string(mOptions->windowSize)); // WINDOW SIZE + mMenu.options->setItemCaption(1, mLang->getText(7) + " x" + std::to_string(mOptions->windowSize)); // WINDOW SIZE switch (mOptions->language) { case es_ES: - mMenu.options->setItemCaption(2, mTextStrings[8] + " " + mTextStrings[24]); + mMenu.options->setItemCaption(2, mLang->getText(8) + " " + mLang->getText(24)); break; case ba_BA: - mMenu.options->setItemCaption(2, mTextStrings[8] + " " + mTextStrings[25]); + mMenu.options->setItemCaption(2, mLang->getText(8) + " " + mLang->getText(25)); break; case en_UK: - mMenu.options->setItemCaption(2, mTextStrings[8] + " " + mTextStrings[26]); + mMenu.options->setItemCaption(2, mLang->getText(8) + " " + mLang->getText(26)); break; } - mMenu.options->setItemCaption(3, mTextStrings[9]); - mMenu.options->setItemCaption(4, mTextStrings[10]); + mMenu.options->setItemCaption(3, mLang->getText(9)); + mMenu.options->setItemCaption(4, mLang->getText(10)); mMenu.options->centerMenu(SCREEN_CENTER_X); mMenu.options->centerMenuElements(); - mMenu.title->setItemCaption(0, mTextStrings[51]); // 1 PLAYER - mMenu.title->setItemCaption(1, mTextStrings[52]); // 2 PLAYERS - mMenu.title->setItemCaption(2, mTextStrings[1]); // OPTIONS - //mMenu.title->setItemCaption(3, mTextStrings[2]); // HOW TO PLAY - mMenu.title->setItemCaption(3, mTextStrings[3]); // QUIT + mMenu.title->setItemCaption(0, mLang->getText(51)); // 1 PLAYER + mMenu.title->setItemCaption(1, mLang->getText(52)); // 2 PLAYERS + mMenu.title->setItemCaption(2, mLang->getText(1)); // OPTIONS + //mMenu.title->setItemCaption(3, mLang->getText(2)); // HOW TO PLAY + mMenu.title->setItemCaption(3, mLang->getText(3)); // QUIT mMenu.title->centerMenu(SCREEN_CENTER_X); mMenu.title->centerMenuElements(); @@ -385,7 +388,8 @@ void Title::applyOptions() { SDL_SetWindowFullscreen(mWindow, mOptions->fullScreenMode); SDL_SetWindowSize(mWindow, SCREEN_WIDTH * mOptions->windowSize, SCREEN_HEIGHT * mOptions->windowSize); - initTextStrings(mTextStrings, mOptions->language); + mLang->setLang(mOptions->language); + updateMenuLabels(); } @@ -701,7 +705,7 @@ section_t Title::run(Uint8 subsection) // PRESS ANY KEY! if ((mCounter % 50 > 14) && (mMenuVisible == false)) - mText->writeDX(TXT_CENTER | TXT_SHADOW, SCREEN_CENTER_X, PLAY_AREA_THIRD_QUARTER_Y + BLOCK, mTextStrings[23], 1, noColor, 1, shdwTxtColor); + mText->writeDX(TXT_CENTER | TXT_SHADOW, SCREEN_CENTER_X, PLAY_AREA_THIRD_QUARTER_Y + BLOCK, mLang->getText(23), 1, noColor, 1, shdwTxtColor); // Texto con el copyright y versión mText2->writeDX(TXT_CENTER | TXT_SHADOW, SCREEN_CENTER_X, SCREEN_HEIGHT - (BLOCK * 2), TEXT_COPYRIGHT, 1, noColor, 1, shdwTxtColor); @@ -739,7 +743,7 @@ section_t Title::run(Uint8 subsection) // Ejecuta la parte donde se muestran las instrucciones void Title::runInstructions(Uint8 mode) { - mInstructions = new Instructions(mRenderer, mFileList, mTextStrings); + mInstructions = new Instructions(mRenderer, mFileList, mLang); mInstructions->run(mode); delete mInstructions; } @@ -747,7 +751,7 @@ void Title::runInstructions(Uint8 mode) // Ejecuta el juego en modo demo void Title::runDemoGame() { - mDemoGame = new Game(1, mRenderer, mFileList, mTextStrings, mInput, mInput, true); + mDemoGame = new Game(1, mRenderer, mFileList, mLang, mInput, mInput, true); mDemoGame->run(); delete mDemoGame; } \ No newline at end of file diff --git a/source/title.h b/source/title.h index c8b2811..fa85bbe 100644 --- a/source/title.h +++ b/source/title.h @@ -43,7 +43,7 @@ private: Sprite *mTile; // Sprite para dibujar el fondo de pantalla del título Sprite *mGradient; // Sprite para dibujar el degradado del titulo std::string *mFileList; // Lista de ficheros - std::string *mTextStrings; // Vector con los textos del juego + Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas Uint16 mBackgroundCounter; // Temporizador para el fondo de tiles de la pantalla de titulo Uint16 mCounter; // Temporizador para la pantalla de titulo Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa @@ -92,7 +92,7 @@ private: public: // Constructor - Title(SDL_Window *window, SDL_Renderer *renderer, Input *input, std::string *fileList, options_t *options, std::string *textStrings); + Title(SDL_Window *window, SDL_Renderer *renderer, Input *input, std::string *fileList, options_t *options, Lang *lang); // Destructor ~Title();