DEADSOFTWARE

Reserved key range for virtual keyboard + alternative virtkbd layout
[d2df-sdl.git] / src / game / g_touch.pas
index 0a02e577bf040487632ffbcbf09fd1e52540b38f..20aacd4bafa2fca0fd16b7ede30796302a953467 100644 (file)
@@ -31,39 +31,13 @@ implementation
     SysUtils,
     e_log, e_graphics, e_input, g_options, g_game, g_main, g_weapons, g_console;
 
-  const
-    CTL_NONE  = 0;
-    CTL_LEFT  = 1;
-    CTL_RIGHT = 2;
-    CTL_UP    = 3;
-    CTL_DOWN  = 4;
-    CTL_FIRE  = 5;
-    CTL_OPEN  = 6;
-    CTL_JUMP  = 7;
-    CTL_CHAT  = 8;
-    CTL_ESC   = 9;
-    CTL_W0    = 10;
-    CTL_W1    = 11;
-    CTL_W2    = 12;
-    CTL_W3    = 13;
-    CTL_W4    = 14;
-    CTL_W5    = 15;
-    CTL_W6    = 16;
-    CTL_W7    = 17;
-    CTL_W8    = 18;
-    CTL_W9    = 19;
-    CTL_W10   = 20;
-    CTL_CON   = 21;
-    CTL_STAT  = 22;
-    CTL_TCHAT = 23;
-    CTL_LAST  = 23;
-
   var
+    jab: Boolean;
     size: Single;
     enabled: Boolean;
-    keyFinger: array [1..CTL_LAST] of Integer;
+    keyFinger: array [VK_FIRSTKEY..VK_LASTKEY] of Integer;
 
-  procedure GetControlRect(control: Integer; out x, y, w, h: Integer; out founded: Boolean);
+  procedure GetKeyRect(key: Word; out x, y, w, h: Integer; out founded: Boolean);
      var
        sw, sh, sz: Integer;
        dpi: Single;
@@ -73,133 +47,117 @@ implementation
 
     founded := true;
     sz := Trunc(size * dpi);
-    x := 0; y := 0; w := sz; h := sz;
     sw := gScreenWidth; sh := gScreenHeight;
-    case control of
-      CTL_LEFT:  begin x := 0;            y := sh div 2 - h div 2; end;
-      CTL_RIGHT: begin x := w;            y := sh div 2 - h div 2; end;
-      CTL_UP:    begin x := sw - w - 1;   y := sh div 2 - h div 2 - h; end;
-      CTL_DOWN:  begin x := sw - w - 1;   y := sh div 2 - h div 2 + h; end;
-      CTL_FIRE:  begin x := sw - 1*w - 1; y := sh div 2 - h div 2; end;
-      CTL_OPEN:  begin x := sw - 3*w - 1; y := sh div 2 - h div 2; end;
-      CTL_JUMP:  begin x := sw - 2*w - 1; y := sh div 2 - h div 2; end;
-    else
-      w := sz div 2; h := sz div 2;
-      case control of
-        CTL_W0:    begin x := sw div 2 - w div 2 - 5*w - 1; y := sh - 1*h - 1; end;
-        CTL_W1:    begin x := sw div 2 - w div 2 - 4*w - 1; y := sh - 1*h - 1; end;
-        CTL_W2:    begin x := sw div 2 - w div 2 - 3*w - 1; y := sh - 1*h - 1; end;
-        CTL_W3:    begin x := sw div 2 - w div 2 - 2*w - 1; y := sh - 1*h - 1; end;
-        CTL_W4:    begin x := sw div 2 - w div 2 - 1*w - 1; y := sh - 1*h - 1; end;
-        CTL_W5:    begin x := sw div 2 - w div 2 + 0*w - 1; y := sh - 1*h - 1; end;
-        CTL_W6:    begin x := sw div 2 - w div 2 + 1*w - 1; y := sh - 1*h - 1; end;
-        CTL_W7:    begin x := sw div 2 - w div 2 + 2*w - 1; y := sh - 1*h - 1; end;
-        CTL_W8:    begin x := sw div 2 - w div 2 + 3*w - 1; y := sh - 1*h - 1; end;
-        CTL_W9:    begin x := sw div 2 - w div 2 + 4*w - 1; y := sh - 1*h - 1; end;
-        CTL_W10:   begin x := sw div 2 - w div 2 + 5*w - 1; y := sh - 1*h - 1; end;
-        CTL_CHAT:  begin x := sw div 2 - w div 2 - 2*w - 1; y := sh - 2*h - 1; end;
-        CTL_ESC:   begin x := sw div 2 - w div 2 - 1*w - 1; y := sh - 2*h - 1; end;
-        CTL_CON:   begin x := sw div 2 - w div 2 + 0*w - 1; y := sh - 2*h - 1; end;
-        CTL_STAT:  begin x := sw div 2 - w div 2 + 1*w - 1; y := sh - 2*h - 1; end;
-        CTL_TCHAT: begin x := sw div 2 - w div 2 + 2*w - 1; y := sh - 2*h - 1; end;
+    if jab then
+    begin
+      w := sz div 2; h := sz div 3;
+      case key of
+        VK_CONSOLE: begin x := 0;                y := 0 end;
+        VK_ESCAPE:  begin x := sw - w - 1;       y := 0 end;
+        VK_CHAT:    begin x := sw div 2 - w - 4; y := 0 end;
+        VK_TEAM:    begin x := sw div 2 + 0 + 4; y := 0 end;
       else
-        founded := false
+        w := sz; h := sz * 2;
+        case key of
+          VK_LEFT:  begin x := 0; y := sh - h - 1 end;
+          VK_RIGHT: begin x := w; y := sh - h - 1 end;
+        else
+          w := sz; h := sz;
+          case key of
+            VK_OPEN: begin h := sz;       x := sw - 1*w - 1; y := sh - 1*h - 1 end;
+            VK_JUMP: begin h := sz;       x := sw - 1*w - 1; y := sh - 2*h - 1 end;
+            VK_UP:   begin h := sz div 2; x := sw - 2*w - 1; y := sh - 2*sz - 1 end;
+            VK_FIRE: begin h := sz;       x := sw - 2*w - 1; y := sh - sz div 2 - sz - 1 end;
+            VK_DOWN: begin h := sz div 2; x := sw - 2*w - 1; y := sh - sz div 2 - 1 end;
+            VK_PREV: begin h := sz div 2; x := 0;            y := sh - 3*sz - 1 end;
+            VK_NEXT: begin h := sz div 2; x := sw - w - 1;   y := sh - 3*sz - 1 end;
+          else
+            founded := false
+          end
+        end
       end
     end
-  end;
-
-  function GetMenuKey(control: Integer): Word;
-  begin
-    case control of
-      CTL_LEFT:  result := IK_LEFT;
-      CTL_RIGHT: result := IK_RIGHT;
-      CTL_UP:    result := IK_UP;
-      CTL_DOWN:  result := IK_DOWN;
-      CTL_OPEN:  result := IK_ENTER;
-      CTL_FIRE:  result := IK_ENTER;
-      CTL_JUMP:  result := IK_SPACE;
-      CTL_ESC:   result := IK_ESCAPE;
-      CTL_W0:    result := SDL_SCANCODE_0;
-      CTL_W1:    result := SDL_SCANCODE_1;
-      CTL_W2:    result := SDL_SCANCODE_2;
-      CTL_W3:    result := SDL_SCANCODE_3;
-      CTL_W4:    result := SDL_SCANCODE_4;
-      CTL_W5:    result := SDL_SCANCODE_5;
-      CTL_W6:    result := SDL_SCANCODE_6;
-      CTL_W7:    result := SDL_SCANCODE_7;
-      CTL_W8:    result := SDL_SCANCODE_8;
-      CTL_W9:    result := SDL_SCANCODE_9;
-      CTL_CON:   result := IK_GRAVE;
-    else
-      result := IK_INVALID;
-    end
-  end;
-
-  function GetPlayerKey(control: Integer): Word;
-  begin
-    case control of
-      CTL_LEFT:  result := gGameControls.P1Control.KeyLeft;
-      CTL_RIGHT: result := gGameControls.P1Control.KeyRight;
-      CTL_UP:    result := gGameControls.P1Control.KeyUp;
-      CTL_DOWN:  result := gGameControls.P1Control.KeyDown;
-      CTL_OPEN:  result := gGameControls.P1Control.KeyOpen;
-      CTL_FIRE:  result := gGameControls.P1Control.KeyFire;
-      CTL_JUMP:  result := gGameControls.P1Control.KeyJump;
-      CTL_CHAT:  result := gGameControls.GameControls.Chat;
-      CTL_ESC:   result := IK_ESCAPE;
-      CTL_W0:    result := gGameControls.P1Control.KeyWeapon[WEAPON_KASTET];
-      CTL_W1:    result := gGameControls.P1Control.KeyWeapon[WEAPON_SAW];
-      CTL_W2:    result := gGameControls.P1Control.KeyWeapon[WEAPON_PISTOL];
-      CTL_W3:    result := gGameControls.P1Control.KeyWeapon[WEAPON_SHOTGUN1];
-      CTL_W4:    result := gGameControls.P1Control.KeyWeapon[WEAPON_SHOTGUN2];
-      CTL_W5:    result := gGameControls.P1Control.KeyWeapon[WEAPON_CHAINGUN];
-      CTL_W6:    result := gGameControls.P1Control.KeyWeapon[WEAPON_ROCKETLAUNCHER];
-      CTL_W7:    result := gGameControls.P1Control.KeyWeapon[WEAPON_PLASMA];
-      CTL_W8:    result := gGameControls.P1Control.KeyWeapon[WEAPON_BFG];
-      CTL_W9:    result := gGameControls.P1Control.KeyWeapon[WEAPON_SUPERPULEMET];
-      CTL_W10:   result := gGameControls.P1Control.KeyWeapon[WEAPON_FLAMETHROWER];
-      CTL_CON:   result := IK_GRAVE;
-      CTL_STAT:  result := gGameControls.GameControls.Stat;
-      CTL_TCHAT: result := gGameControls.GameControls.TeamChat;
     else
-      result := IK_INVALID
+    begin
+      x := 0; y := 0; w := sz; h := sz;
+      case key of
+        VK_LEFT:  begin x := 0;            y := sh div 2 - h div 2; end;
+        VK_RIGHT: begin x := w;            y := sh div 2 - h div 2; end;
+        VK_UP:    begin x := sw - w - 1;   y := sh div 2 - h div 2 - h; end;
+        VK_DOWN:  begin x := sw - w - 1;   y := sh div 2 - h div 2 + h; end;
+        VK_FIRE:  begin x := sw - 1*w - 1; y := sh div 2 - h div 2; end;
+        VK_OPEN:  begin x := sw - 3*w - 1; y := sh div 2 - h div 2; end;
+        VK_JUMP:  begin x := sw - 2*w - 1; y := sh div 2 - h div 2; end;
+      else
+        w := sz div 2; h := sz div 2;
+        case key of
+          VK_0:       begin x := sw div 2 - w div 2 - 5*w - 1; y := sh - 1*h - 1; end;
+          VK_1:       begin x := sw div 2 - w div 2 - 4*w - 1; y := sh - 1*h - 1; end;
+          VK_2:       begin x := sw div 2 - w div 2 - 3*w - 1; y := sh - 1*h - 1; end;
+          VK_3:       begin x := sw div 2 - w div 2 - 2*w - 1; y := sh - 1*h - 1; end;
+          VK_4:       begin x := sw div 2 - w div 2 - 1*w - 1; y := sh - 1*h - 1; end;
+          VK_5:       begin x := sw div 2 - w div 2 + 0*w - 1; y := sh - 1*h - 1; end;
+          VK_6:       begin x := sw div 2 - w div 2 + 1*w - 1; y := sh - 1*h - 1; end;
+          VK_7:       begin x := sw div 2 - w div 2 + 2*w - 1; y := sh - 1*h - 1; end;
+          VK_8:       begin x := sw div 2 - w div 2 + 3*w - 1; y := sh - 1*h - 1; end;
+          VK_9:       begin x := sw div 2 - w div 2 + 4*w - 1; y := sh - 1*h - 1; end;
+          VK_A:      begin x := sw div 2 - w div 2 + 5*w - 1; y := sh - 1*h - 1; end;
+          VK_CHAT:    begin x := sw div 2 - w div 2 - 2*w - 1; y := sh - 2*h - 1; end;
+          VK_ESCAPE:  begin x := sw div 2 - w div 2 - 1*w - 1; y := sh - 2*h - 1; end;
+          VK_CONSOLE: begin x := sw div 2 - w div 2 + 0*w - 1; y := sh - 2*h - 1; end;
+          VK_STATUS:  begin x := sw div 2 - w div 2 + 1*w - 1; y := sh - 2*h - 1; end;
+          VK_TEAM:    begin x := sw div 2 - w div 2 + 2*w - 1; y := sh - 2*h - 1; end;
+        else
+          founded := false
+        end
+      end
     end
   end;
 
-  function GetControlName(control: Integer): String;
+  function GetKeyName(key: Word): String;
   begin
-    case control of
-      CTL_LEFT:  result := 'LEFT';
-      CTL_RIGHT: result := 'RIGHT';
-      CTL_UP:    result := 'UP';
-      CTL_DOWN:  result := 'DOWN';
-      CTL_OPEN:  result := 'OPEN';
-      CTL_FIRE:  result := 'FIRE';
-      CTL_JUMP:  result := 'JUMP';
-      CTL_CHAT:  result := 'CHAT';
-      CTL_ESC:   result := 'ESC';
-      CTL_W0:    result := '0';
-      CTL_W1:    result := '1';
-      CTL_W2:    result := '2';
-      CTL_W3:    result := '3';
-      CTL_W4:    result := '4';
-      CTL_W5:    result := '5';
-      CTL_W6:    result := '6';
-      CTL_W7:    result := '7';
-      CTL_W8:    result := '8';
-      CTL_W9:    result := '9';
-      CTL_W10:   result := '10';
-      CTL_CON:   result := 'CON';
-      CTL_STAT:  result := 'STAT';
-      CTL_TCHAT: result := 'TEAM';
+    case key of
+      VK_LEFT:    result := 'LEFT';
+      VK_RIGHT:   result := 'RIGHT';
+      VK_UP:      result := 'UP';
+      VK_DOWN:    result := 'DOWN';
+      VK_FIRE:    result := 'FIRE';
+      VK_OPEN:    result := 'OPEN';
+      VK_JUMP:    result := 'JUMP';
+      VK_CHAT:    result := 'CHAT';
+      VK_ESCAPE:  result := 'ESC';
+      VK_0:       result := '0';
+      VK_1:       result := '1';
+      VK_2:       result := '2';
+      VK_3:       result := '3';
+      VK_4:       result := '4';
+      VK_5:       result := '5';
+      VK_6:       result := '6';
+      VK_7:       result := '7';
+      VK_8:       result := '8';
+      VK_9:       result := '9';
+      VK_A:       result := '10';
+      VK_B:       result := '11';
+      VK_C:       result := '12';
+      VK_D:       result := '13';
+      VK_E:       result := '14';
+      VK_F:       result := '15';
+      VK_CONSOLE: result := 'CON';
+      VK_STATUS:  result := 'STAT';
+      VK_TEAM:    result := 'TEAM';
+      VK_PREV:    result := '<PREV';
+      VK_NEXT:    result := 'NEXT>';
     else
-      result := '(WAT?)'
+      if (key > 0) and (key < e_MaxInputKeys) then
+        result := e_KeyNames[key]
+      else
+       result := '<' + IntToStr(key) + '>'
     end
   end;
 
   procedure DrawRect(x, y, w, h: Integer);
   begin
-    e_DrawQuad(x, y, x + w, y + h, 0, 255, 0, 127);
+    e_DrawQuad(x, y, x + w, y + h, 0, 255, 0, 63);
   end;
 
   function IntersectControl(ctl, xx, yy: Integer): Boolean;
@@ -207,7 +165,7 @@ implementation
       x, y, w, h: Integer;
       founded: Boolean;
   begin
-    GetControlRect(ctl, x, y, w, h, founded);
+    GetKeyRect(ctl, x, y, w, h, founded);
     result := founded and (xx >= x) and (yy >= y) and (xx <= x + w) and (yy <= y + h);
   end;
 
@@ -237,7 +195,7 @@ implementation
     x := Trunc(ev.x * gScreenWidth);
     y := Trunc(ev.y * gScreenHeight);
 
-    for i := 1 to CTL_LAST do
+    for i := VK_FIRSTKEY to VK_LASTKEY do
     begin
       if IntersectControl(i, x, y) then
       begin
@@ -247,7 +205,7 @@ implementation
           keyFinger[i] := finger
         else if ev.type_ = SDL_FINGERDOWN then
           begin
-            KeyPress(GetMenuKey(i));
+            KeyPress(i); // Menu events
             keyFinger[i] := finger;
           end
       end
@@ -259,8 +217,7 @@ implementation
           keyFinger[i] := 0
       end;
 
-      e_KeyUpDown(GetPlayerKey(i), keyFinger[i] <> 0);
-      e_KeyUpDown(GetMenuKey(i), keyFinger[i] <> 0);
+      e_KeyUpDown(i, keyFinger[i] <> 0);
     end;
   end;
 
@@ -275,13 +232,13 @@ implementation
     if SDL_IsTextInputActive() = SDL_True then
       Exit;
 
-    for i := 1 to CTL_LAST do
+    for i := VK_FIRSTKEY to VK_LASTKEY do
     begin
-      GetControlRect(i, x, y, w, h, founded);
+      GetKeyRect(i, x, y, w, h, founded);
       if founded then
       begin
         DrawRect(x, y, w, h);
-        e_TextureFontPrint(x, y, GetControlName(i), gStdFont)
+        e_TextureFontPrint(x, y, GetKeyName(i), gStdFont)
       end;
     end;
 {$ENDIF}
@@ -294,6 +251,7 @@ initialization
   size := 1;
   conRegVar('touch_enable', @enabled, 'enable/disable virtual buttons', 'draw buttons');
   conRegVar('touch_size', @size, 0.1, 10, 'size of virtual buttons', 'button size');
+  conRegVar('touch_alt', @jab, 'althernative virtual buttons layout', 'althernative layout');
 end.