X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGame.cpp;h=5465a8e96012356bda8072a3c851ac02d2bb8e26;hb=0aab437dc560d2afa982e61cc2547756ad7b0761;hp=3e6b25c8f79d1e941c615ceb48610dd32be9e745;hpb=24004d6ab1e68faaf85ece11b566449997da5013;p=lugaru.git diff --git a/Source/Game.cpp b/Source/Game.cpp index 3e6b25c..5465a8e 100644 --- a/Source/Game.cpp +++ b/Source/Game.cpp @@ -1,30 +1,37 @@ -#include "Game.h" -#include "openal_wrapper.h" -#include "SDL_thread.h" +/* +Copyright (C) 2003, 2010 - Wolfire Games +Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file) + +This file is part of Lugaru. + +Lugaru is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +Lugaru is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Lugaru. If not, see . +*/ + +#include "Game.hpp" + +#include "Audio/openal_wrapper.hpp" +#include "Level/Dialog.hpp" + +#include extern int mainmenu; -int numdialogues; -int numdialogueboxes[max_dialogues]; -int dialoguetype[max_dialogues]; -int dialogueboxlocation[max_dialogues][max_dialoguelength]; -float dialogueboxcolor[max_dialogues][max_dialoguelength][3]; -int dialogueboxsound[max_dialogues][max_dialoguelength]; -char dialoguetext[max_dialogues][max_dialoguelength][128]; -char dialoguename[max_dialogues][max_dialoguelength][64]; -XYZ dialoguecamera[max_dialogues][max_dialoguelength]; -XYZ participantlocation[max_dialogues][10]; -int participantfocus[max_dialogues][max_dialoguelength]; -int participantaction[max_dialogues][max_dialoguelength]; -float participantyaw[max_dialogues][10]; -XYZ participantfacing[max_dialogues][max_dialoguelength][10]; -float dialoguecamerayaw[max_dialogues][max_dialoguelength]; -float dialoguecamerapitch[max_dialogues][max_dialoguelength]; -int indialogue; -int whichdialogue; -int directing; -float dialoguetime; -int dialoguegonethrough[20]; +const char* pathtypenames[] = { "keepwalking", "pause" }; +const char* editortypenames[] = { + "active", "sitting", "sitting wall", "sleeping", + "dead1", "dead2", "dead3", "dead4" +}; namespace Game { @@ -55,14 +62,16 @@ int oldmousecoordh = 0; int oldmousecoordv = 0; float yaw = 0; float pitch = 0; -SkyBox *skybox = NULL; +SkyBox* skybox = NULL; bool cameramode = 0; -bool firstload = 0; +bool firstLoadDone = false; Texture hawktexture; float hawkyaw = 0; float hawkcalldelay = 0; + float leveltime = 0; +float wonleveltime = 0; float loadtime = 0; Model hawk; @@ -80,7 +89,8 @@ int musictype = 0; XYZ mapcenter; float mapradius = 0; -Text *text = NULL; +Text* text = NULL; +Text* textmono = NULL; float fps = 0; bool editorenabled = 0; @@ -102,20 +112,12 @@ bool scoreadded = 0; int numchallengelevels = 0; bool console = false; -char consoletext[15][256] = {}; -int consolechars[15] = {}; -bool chatting = 0; -char displaytext[15][256] = {}; -int displaychars[15] = {}; -float displaytime[15] = {}; -float displayblinkdelay = 0; -bool displayblink = 0; -int displayselected = 0; +std::string consoletext[15] = {}; float consoleblinkdelay = 0; bool consoleblink = 0; -int consoleselected = 0; +unsigned consoleselected = 0; -unsigned short crouchkey = 0, jumpkey = 0, forwardkey = 0, chatkey = 0, backkey = 0, leftkey = 0, rightkey = 0, drawkey = 0, throwkey = 0, attackkey = 0; +unsigned short crouchkey = 0, jumpkey = 0, forwardkey = 0, backkey = 0, leftkey = 0, rightkey = 0, drawkey = 0, throwkey = 0, attackkey = 0; unsigned short consolekey = 0; int loading = 0; @@ -125,7 +127,6 @@ int targetlevel = 0; float changedelay = 0; bool waiting = false; -Account* accountactive = NULL; } void Game::fireSound(int sound) @@ -133,139 +134,62 @@ void Game::fireSound(int sound) emit_sound_at(sound); } -void Game::inputText(char* str, int* charselected, int* nb_chars) +void Game::inputText(string& str, unsigned* charselected) { SDL_Event evenement; if (!waiting) { + SDL_StartTextInput(); waiting = true; - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); - SDL_EnableUNICODE(true); } while (SDL_PollEvent(&evenement)) { - - switch (evenement.type) { - case SDL_KEYDOWN: - if (evenement.key.keysym.sym == SDLK_ESCAPE) { - for (int i = 0; i < 255; i++) - str[i] = 0; - *nb_chars = 0; - *charselected = 0; - waiting = false; - } else if (evenement.key.keysym.sym == SDLK_BACKSPACE) { - if ((*charselected) != 0) { - for (int i = (*charselected) - 1; i < 255; i++) - str[i] = str[i + 1]; - str[255] = 0; - (*charselected)--; - (*nb_chars)--; - } - } else if (evenement.key.keysym.sym == SDLK_DELETE) { - if ((*charselected) < (*nb_chars)) { - for (int i = (*charselected); i < 255; i++) - str[i] = str[i + 1]; - str[255] = 0; - (*nb_chars)--; - } - } else if (evenement.key.keysym.sym == SDLK_HOME) { - (*charselected) = 0; - } else if (evenement.key.keysym.sym == SDLK_END) { - (*charselected) = (*nb_chars); - } else if (evenement.key.keysym.sym == SDLK_LEFT) { - if ((*charselected) != 0) - (*charselected)--; - } else if (evenement.key.keysym.sym == SDLK_RIGHT) { - if ((*charselected) < (*nb_chars)) - (*charselected)++; - } else if (evenement.key.keysym.sym == SDLK_RETURN) { - waiting = false; - } else if (evenement.key.keysym.unicode >= 32 && evenement.key.keysym.unicode < 127 && (*nb_chars) < 60) { - for (int i = 255; i >= (*charselected) + 1; i--) - str[i] = str[i - 1]; - str[*charselected] = evenement.key.keysym.unicode; - (*charselected)++; - (*nb_chars)++; - } + if (!sdlEventProc(evenement)) { + tryquit = 1; break; } - } - - if (!waiting) { - SDL_EnableKeyRepeat(0, 0); // disable key repeat - SDL_EnableUNICODE(false); - } -} - -int setKeySelected_thread(void* data) -{ - using namespace Game; - int keycode = -1; - SDL_Event evenement; - while (keycode == -1) { - SDL_WaitEvent(&evenement); switch (evenement.type) { - case SDL_KEYDOWN: - keycode = evenement.key.keysym.sym; - break; - case SDL_MOUSEBUTTONDOWN: - keycode = SDLK_LAST + evenement.button.button; - break; - default: - break; - } - } - if (keycode != SDLK_ESCAPE) { - fireSound(); - switch (keyselect) { - case 0: - forwardkey = keycode; - break; - case 1: - backkey = keycode; - break; - case 2: - leftkey = keycode; - break; - case 3: - rightkey = keycode; - break; - case 4: - crouchkey = keycode; - break; - case 5: - jumpkey = keycode; - break; - case 6: - drawkey = keycode; - break; - case 7: - throwkey = keycode; - break; - case 8: - attackkey = keycode; - break; - case 9: - consolekey = keycode; - break; - default: - break; + case SDL_TEXTEDITING: + /* FIXME - We should handle this for complete input method support */ + break; + case SDL_TEXTINPUT: + str.insert(*charselected, evenement.text.text); + (*charselected) += strlen(evenement.text.text); + break; + case SDL_KEYDOWN: + if (evenement.key.keysym.sym == SDLK_ESCAPE) { + str.clear(); + *charselected = 0; + waiting = false; + } else if (evenement.key.keysym.sym == SDLK_BACKSPACE) { + if ((*charselected) > 0) { + (*charselected)--; + str.erase(*charselected, 1); + } + } else if (evenement.key.keysym.sym == SDLK_DELETE) { + if ((*charselected) < str.size()) { + str.erase(*charselected, 1); + } + } else if (evenement.key.keysym.sym == SDLK_HOME) { + (*charselected) = 0; + } else if (evenement.key.keysym.sym == SDLK_END) { + (*charselected) = str.size(); + } else if (evenement.key.keysym.sym == SDLK_LEFT) { + if ((*charselected) != 0) { + (*charselected)--; + } + } else if (evenement.key.keysym.sym == SDLK_RIGHT) { + if ((*charselected) < str.size()) { + (*charselected)++; + } + } else if (evenement.key.keysym.sym == SDLK_RETURN) { + waiting = false; + } + break; } } - keyselect = -1; - waiting = false; - LoadMenu(); - return 0; -} -void Game::setKeySelected() -{ - waiting = true; - printf("launch thread\n"); - SDL_Thread* thread = SDL_CreateThread(setKeySelected_thread, NULL); - if ( thread == NULL ) { - fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError()); - waiting = false; - return; + if (!waiting) { + SDL_StopTextInput(); } }