+/* Process input events that impact settings, console, devtools, etc.
+ * Gameplay-related input processing is still done in Game::Tick() for now
+ * as it is tightly coupled to the game logic.
+ */
+void Game::ProcessInput()
+{
+ /* Pump SDL input events */
+ Input::Tick();
+
+ /* Menu handling (main menu, leave game) */
+ if (Input::isKeyPressed(SDL_SCANCODE_ESCAPE) &&
+ (gameon || mainmenu == 0)) {
+ selected = -1;
+ if (mainmenu == 0 && !winfreeze) {
+ mainmenu = 2; // Pause
+ } else if (mainmenu == 1 || mainmenu == 2) {
+ mainmenu = 0; // Unpause
+ }
+ // Play menu theme
+ if (musictoggle && (mainmenu == 1 || mainmenu == 2)) {
+ OPENAL_SetFrequency(OPENAL_ALL);
+ emit_stream_np(stream_menutheme);
+ pause_sound(leveltheme);
+ }
+ // On resume, play level music
+ if (!mainmenu) {
+ pause_sound(stream_menutheme);
+ resume_stream(leveltheme);
+ }
+ }
+
+ /* Challenge mode */
+ if (!campaign && !mainmenu) {
+ if ((Input::isKeyPressed(jumpkey) || Input::isKeyPressed(SDL_SCANCODE_SPACE))) {
+ if (winfreeze) {
+ winfreeze = 0;
+ }
+ }
+
+ if ((Input::isKeyDown(SDL_SCANCODE_ESCAPE)) && gameon) {
+ if (console) {
+ console = false;
+ freeze = 0;
+ } else if (winfreeze) {
+ mainmenu = 9;
+ gameon = 0;
+ }
+ }
+ }
+
+ /* Tutorial mode hotkeys */
+ if (Tutorial::active) {
+ // Skip current tutorial stage
+ if (Input::isKeyPressed(SDL_SCANCODE_TAB)) {
+ if (Tutorial::stage != 51) {
+ Tutorial::stagetime = Tutorial::maxtime;
+ }
+ emit_sound_np(consolefailsound, 128.);
+ }
+ }
+
+ /* Screenshot */
+ if (Input::isKeyPressed(SDL_SCANCODE_F1)) {
+ Screenshot();
+ }
+
+ /* Stereo video mode hotkeys */
+ if (Input::isKeyPressed(SDL_SCANCODE_F6)) {
+ if (Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
+ stereoreverse = true;
+ printf("Stereo reversed\n");
+ } else {
+ stereoreverse = false;
+ printf("Stereo unreversed\n");
+ }
+ }
+
+ if (Input::isKeyDown(SDL_SCANCODE_F7)) {
+ if (Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
+ stereoseparation -= 0.001;
+ } else {
+ stereoseparation -= 0.010;
+ }
+ printf("Stereo separation decreased to %f\n", stereoseparation);
+ }
+
+ if (Input::isKeyDown(SDL_SCANCODE_F8)) {
+ if (Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
+ stereoseparation += 0.001;
+ } else {
+ stereoseparation += 0.010;
+ }
+ printf("Stereo separation increased to %f\n", stereoseparation);
+ }
+
+ /* Devtools */
+ if (devtools && !mainmenu) {
+ /* Console */
+ if (Input::isKeyPressed(consolekey)) {
+ console = !console;
+ if (console) {
+ OPENAL_SetFrequency(OPENAL_ALL);
+ } else {
+ freeze = 0;
+ waiting = false;
+ }
+ }
+
+ /* Other devtools, disabled when the console is shown */
+ if (!console) {
+ ProcessDevInput();
+ }
+ }
+}
+
+void Game::ProcessDevInput()