DEADSOFTWARE

e_input cleanup
[d2df-sdl.git] / src / game / g_main.pas
index 4e10356760d4b2e00a0e23d08083328120139343..7f5d5b95c13739b6037e226450e11aa3b618a705 100644 (file)
@@ -1,4 +1,4 @@
-(* Copyright (C)  DooM 2D:Forever Developers
+(* Copyright (C)  Doom 2D: Forever Developers
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,13 +18,13 @@ unit g_main;
 
 interface
 
-procedure Main();
-procedure Init();
-procedure Release();
-procedure Update();
-procedure Draw();
-procedure KeyPress(K: Word);
-procedure CharPress(C: Char);
+procedure Main ();
+procedure Init ();
+procedure Release ();
+procedure Update ();
+procedure Draw ();
+procedure KeyPress (K: Word);
+procedure CharPress (C: AnsiChar);
 
 var
   GameDir: string;
@@ -32,23 +32,33 @@ var
   MapsDir: string;
   ModelsDir: string;
   GameWAD: string;
+  gSkipFirstChar: Boolean; (* hack for console/chat input *)
 
 implementation
 
 uses
-  SDL2, GL, GLExt, wadreader, e_log, g_window,
+{$INCLUDE ../nogl/noGLuses.inc}
+{$IFDEF ENABLE_HOLMES}
+  g_holmes, fui_wadread, fui_style, fui_gfx_gl,
+{$ENDIF}
+  SDL2, wadreader, e_log, g_window,
   e_graphics, e_input, g_game, g_console, g_gui,
-  e_sound, g_options, g_sound, g_player,
+  e_sound, g_options, g_sound, g_player, g_basic,
   g_weapons, SysUtils, g_triggers, MAPDEF, g_map,
-  g_menu, g_language, g_net,
-  utils, conbuf, envvars;
+  g_menu, g_language, g_net, g_touch,
+  utils, conbuf, envvars,
+  xparser;
+
 
 var
-  charbuff: Array [0..15] of Char;
+  charbuff: packed array [0..15] of AnsiChar;
 
 procedure Main();
 var
   sdlflags: LongWord;
+{$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
+  flexloaded: Boolean;
+{$ENDIF}
 begin
   e_InitWritelnDriver();
 
@@ -60,21 +70,21 @@ begin
 
   e_InitLog(GameDir + '/' + LOG_FILENAME, TWriteMode.WM_NEWFILE);
 
-  e_WriteLog('Read config file', TMsgType.Notify);
-  g_Options_Read(GameDir + '/' + CONFIG_FILENAME);
+  e_WriteLog(
+    'Doom 2D: Forever version ' + GAME_VERSION +
+    ' proto ' + IntToStr(NET_PROTOCOL_VER),
+    TMsgType.Notify
+  );
+  e_WriteLog(
+    'Build date: ' + GAME_BUILDDATE + ' ' + GAME_BUILDTIME,
+    TMsgType.Notify
+  );
 
 {$IFDEF HEADLESS}
   conbufDumpToStdOut := true;
 {$ENDIF}
   e_WriteToStdOut := False; //{$IFDEF HEADLESS}True;{$ELSE}False;{$ENDIF}
 
-  //GetSystemDefaultLCID()
-
-  //e_WriteLog('Read language file', MSG_NOTIFY);
-  //g_Language_Load(DataDir + gLanguage + '.txt');
-  e_WriteLog(gLanguage, TMsgType.Notify);
-  g_Language_Set(gLanguage);
-
 {$IFDEF HEADLESS}
  {$IFDEF USE_SDLMIXER}
   sdlflags := SDL_INIT_TIMER or SDL_INIT_AUDIO or $00004000;
@@ -85,17 +95,78 @@ begin
  {$ENDIF}
 {$ELSE}
  {$IFDEF USE_SDLMIXER}
-  sdlflags := SDL_INIT_EVERYTHING;
+  {*sdlflags := SDL_INIT_EVERYTHING;*}
+  sdlflags := SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO;
  {$ELSE}
   sdlflags := SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO;
  {$ENDIF}
 {$ENDIF}
+
+  SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, '0');
+
   if SDL_Init(sdlflags) < 0 then
     raise Exception.Create('SDL: Init failed: ' + SDL_GetError());
 
-{$IFDEF HEADLESS}
+  e_WriteLog('Read config file', TMsgType.Notify);
+  g_Options_Read(GameDir + '/' + CONFIG_FILENAME);
+
+  //GetSystemDefaultLCID()
+
+  //e_WriteLog('Read language file', MSG_NOTIFY);
+  //g_Language_Load(DataDir + gLanguage + '.txt');
+  e_WriteLog(gLanguage, TMsgType.Notify);
+  g_Language_Set(gLanguage);
+
+{$IFNDEF HEADLESS}
+{$IFNDEF ANDROID}
   SDL_StartTextInput();
 {$ENDIF}
+{$ENDIF}
+
+{$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
+  flexloaded := true;
+  if not fuiAddWad('flexui.wad') then
+  begin
+    if not fuiAddWad('./data/flexui.wad') then fuiAddWad('./flexui.wad');
+  end;
+  try
+    fuiGfxLoadFont('win8', 'flexui/fonts/win8.fuifont');
+    fuiGfxLoadFont('win14', 'flexui/fonts/win14.fuifont');
+    fuiGfxLoadFont('win16', 'flexui/fonts/win16.fuifont');
+    fuiGfxLoadFont('dos8', 'flexui/fonts/dos8.fuifont');
+    fuiGfxLoadFont('msx6', 'flexui/fonts/msx6.fuifont');
+  except on e: Exception do
+    begin
+      writeln('ERROR loading FlexUI fonts');
+      flexloaded := false;
+      //raise;
+    end;
+  else
+    begin
+      flexloaded := false;
+      //raise;
+    end;
+  end;
+  if (flexloaded) then
+  begin
+    try
+      e_LogWriteln('FlexUI: loading stylesheet...');
+      uiLoadStyles('flexui/widgets.wgs');
+    except on e: TParserException do
+      begin
+        writeln('ERROR at (', e.tokLine, ',', e.tokCol, '): ', e.message);
+        //raise;
+        flexloaded := false;
+      end;
+    else
+      begin
+        //raise;
+        flexloaded := false;
+      end;
+    end;
+  end;
+  g_holmes_imfunctional := not flexloaded;
+{$ENDIF}
 
   e_WriteLog('Entering SDLMain', TMsgType.Notify);
 
@@ -103,7 +174,7 @@ begin
   SDLMain();
 {$WARNINGS ON}
 
-{$IFDEF HEADLESS}
+{$IFNDEF HEADLESS}
   SDL_StopTextInput();
 {$ENDIF}
 
@@ -113,7 +184,6 @@ end;
 
 procedure Init();
 var
-  a: Integer;
   NoSound: Boolean;
 begin
   Randomize;
@@ -130,11 +200,14 @@ begin
 
   e_WriteLog('Init Input', TMsgType.Notify);
   e_InitInput();
+  g_Touch_Init;
 
+(*
   if (e_JoysticksAvailable > 0) then
     e_WriteLog('Input: Joysticks available.', TMsgType.Notify)
   else
     e_WriteLog('Input: No Joysticks.', TMsgType.Notify);
+*)
 
   if (not gNoSound) then
   begin
@@ -145,9 +218,10 @@ begin
   e_WriteLog('Init game', TMsgType.Notify);
   g_Game_Init();
 
-  for a := 0 to 15 do charbuff[a] := ' ';
+  FillChar(charbuff, sizeof(charbuff), ' ');
 end;
 
+
 procedure Release();
 begin
   e_WriteLog('Releasing engine', TMsgType.Notify);
@@ -163,22 +237,26 @@ begin
   end;
 end;
 
-procedure Update();
+
+procedure Update ();
 begin
   g_Game_Update();
 end;
 
-procedure Draw();
+
+procedure Draw ();
 begin
   g_Game_Draw();
 end;
 
-function Translit(S: String): String;
+
+function Translit (const S: AnsiString): AnsiString;
 var
   i: Integer;
 begin
   Result := S;
   for i := 1 to Length(Result) do
+  begin
     case Result[i] of
       'É': Result[i] := 'Q';
       'Ö': Result[i] := 'W';
@@ -213,6 +291,7 @@ begin
       'Á': Result[i] := ','; //Chr(188);
       'Þ': Result[i] := '.'; //Chr(190);
     end;
+  end;
 end;
 
 
@@ -243,7 +322,7 @@ begin
 end;
 
 
-procedure Cheat();
+procedure Cheat ();
 const
   CHEAT_DAMAGE = 500;
 label
@@ -318,9 +397,7 @@ begin
   begin
     if g_Map_Exist(MapsDir+gGameSettings.WAD+':\MAP'+s2) then
     begin
-      c := 'MAP00';
-      c[3] := s2[1];
-      c[4] := s2[2];
+      c := 'MAP'+s2;
       g_Game_ExitLevel(c);
     end;
     goto Cheated;
@@ -408,23 +485,24 @@ Cheated:
   g_Sound_PlayEx(s);
 end;
 
-procedure KeyPress(K: Word);
+
+procedure KeyPress (K: Word);
 var
   Msg: g_gui.TMessage;
 begin
   case K of
     IK_PAUSE: // <Pause/Break>:
       begin
-        if (g_ActiveWindow = nil) then
-          g_Game_Pause(not gPause);
+        if (g_ActiveWindow = nil) then g_Game_Pause(not gPause);
       end;
 
-    IK_BACKQUOTE: // <`/~/¨/¸>:
+    IK_BACKQUOTE, VK_CONSOLE: // <`/~/¨/¸>:
       begin
-        g_Console_Switch();
+        if not gChatShow then
+          g_Console_Switch()
       end;
 
-    IK_ESCAPE: // <Esc>:
+    IK_ESCAPE, VK_ESCAPE: // <Esc>:
       begin
         if gChatShow then
         begin
@@ -433,63 +511,54 @@ begin
         end;
 
         if gConsoleShow then
-          g_Console_Switch()
-        else
-          if g_ActiveWindow <> nil then
+        begin
+          g_Console_Switch();
+        end
+        else if (g_ActiveWindow <> nil) then
+        begin
+          Msg.Msg := WM_KEYDOWN;
+          Msg.WParam := IK_ESCAPE;
+          g_ActiveWindow.OnMessage(Msg);
+          if (not g_Game_IsNet) and (g_ActiveWindow = nil) then g_Game_Pause(false); //Fn loves to do this
+        end
+        else if (gState <> STATE_FOLD) then
+        begin
+          if gGameOn or (gState = STATE_INTERSINGLE) or (gState = STATE_INTERCUSTOM) then
+          begin
+            g_Game_InGameMenu(True);
+          end
+          else if (gExit = 0) and (gState <> STATE_SLIST) then
+          begin
+            if (gState <> STATE_MENU) then
             begin
-              Msg.Msg := WM_KEYDOWN;
-              Msg.WParam := IK_ESCAPE;
-              g_ActiveWindow.OnMessage(Msg);
-            end
-          else
-            if gState <> STATE_FOLD then
-              if gGameOn
-              or (gState = STATE_INTERSINGLE)
-              or (gState = STATE_INTERCUSTOM)
-              then
-                g_Game_InGameMenu(True)
-              else
-                if (gExit = 0) and (gState <> STATE_SLIST) then
-                  begin
-                    if gState <> STATE_MENU then
-                      if NetMode <> NET_NONE then
-                      begin
-                        g_Game_StopAllSounds(True);
-                        g_Game_Free;
-                        gState := STATE_MENU;
-                        Exit;
-                      end;
-
-                    g_GUI_ShowWindow('MainMenu');
-                    g_Sound_PlayEx('MENU_OPEN');
-                  end;
+              if (NetMode <> NET_NONE) then
+              begin
+                g_Game_StopAllSounds(True);
+                g_Game_Free;
+                gState := STATE_MENU;
+                Exit;
+              end;
+            end;
+            g_GUI_ShowWindow('MainMenu');
+            g_Sound_PlayEx('MENU_OPEN');
+          end;
+        end;
       end;
 
     IK_F2, IK_F3, IK_F4, IK_F5, IK_F6, IK_F7, IK_F10:
       begin // <F2> .. <F6> � <F12>
         if gGameOn and (not gConsoleShow) and (not gChatShow) then
         begin
-          while g_ActiveWindow <> nil do
-            g_GUI_HideWindow(False);
-
-          if (not g_Game_IsNet) then
-            g_Game_Pause(True);
-
+          while (g_ActiveWindow <> nil) do g_GUI_HideWindow(False);
+          if (not g_Game_IsNet) then g_Game_Pause(True);
           case K of
-            IK_F2:
-              g_Menu_Show_SaveMenu();
-            IK_F3:
-              g_Menu_Show_LoadMenu();
-            IK_F4:
-              g_Menu_Show_GameSetGame();
-            IK_F5:
-              g_Menu_Show_OptionsVideo();
-            IK_F6:
-              g_Menu_Show_OptionsSound();
-            IK_F7:
-              g_Menu_Show_EndGameMenu();
-            IK_F10:
-              g_Menu_Show_QuitGameMenu();
+            IK_F2: g_Menu_Show_SaveMenu();
+            IK_F3: g_Menu_Show_LoadMenu();
+            IK_F4: g_Menu_Show_GameSetGame();
+            IK_F5: g_Menu_Show_OptionsVideo();
+            IK_F6: g_Menu_Show_OptionsSound();
+            IK_F7: g_Menu_Show_EndGameMenu();
+            IK_F10: g_Menu_Show_QuitGameMenu();
           end;
         end;
       end;
@@ -498,49 +567,55 @@ begin
       begin
         gJustChatted := False;
         if gConsoleShow or gChatShow then
-          g_Console_Control(K)
-        else
-          if g_ActiveWindow <> nil then
-          begin
-            Msg.Msg := WM_KEYDOWN;
-            Msg.WParam := K;
-            g_ActiveWindow.OnMessage(Msg);
-          end
-          else
-          begin
-            if (gState = STATE_MENU) then
-            begin
-              g_GUI_ShowWindow('MainMenu');
-              g_Sound_PlayEx('MENU_OPEN');
-            end;
-          end;
+        begin
+          g_Console_Control(K);
+        end
+        else if (g_ActiveWindow <> nil) then
+        begin
+          Msg.Msg := WM_KEYDOWN;
+          Msg.WParam := K;
+          g_ActiveWindow.OnMessage(Msg);
+        end
+        else if (gState = STATE_MENU) then
+        begin
+          g_GUI_ShowWindow('MainMenu');
+          g_Sound_PlayEx('MENU_OPEN');
+        end;
       end;
   end;
 end;
 
-procedure CharPress(C: Char);
+
+procedure CharPress (C: AnsiChar);
 var
   Msg: g_gui.TMessage;
   a: Integer;
 begin
-  if (not gChatShow) and ((C = '`') or (C = '~') or (C = '¸') or (C = '¨')) then
-    Exit;
+  if gSkipFirstChar then
+  begin
+    gSkipFirstChar := False;
+    Exit
+  end;
+
+  if (not gChatShow) and ((C = '`') or (C = '~') or (C = '¸') or (C = '¨')) then Exit;
 
   if gConsoleShow or gChatShow then
-    g_Console_Char(C)
+  begin
+    g_Console_Char(C);
+  end
+  else if (g_ActiveWindow <> nil) then
+  begin
+    Msg.Msg := WM_CHAR;
+    Msg.WParam := Ord(C);
+    g_ActiveWindow.OnMessage(Msg);
+  end
   else
-    if g_ActiveWindow <> nil then
-    begin
-      Msg.Msg := WM_CHAR;
-      Msg.WParam := Ord(C);
-      g_ActiveWindow.OnMessage(Msg);
-    end
-    else
-    begin
-      for a := 0 to 14 do charbuff[a] := charbuff[a+1];
-      charbuff[15] := UpCase1251(C);
-      Cheat();
-    end;
+  begin
+    for a := 0 to 14 do charbuff[a] := charbuff[a+1];
+    charbuff[15] := upcase1251(C);
+    Cheat();
+  end;
 end;
 
+
 end.