DEADSOFTWARE

add direct weapon switching
[d2df-sdl.git] / src / game / g_game.pas
index baf0f630cdbe3414543ba7107537817dbd33e31c..c3f4b589684658007dcc4e7d63a9b96a33e20c18 100644 (file)
@@ -20,7 +20,7 @@ interface
 
 uses
   g_basic, g_player, e_graphics, Classes, g_res_downloader,
-  SysUtils, g_sound, g_gui, g_scripts, MAPSTRUCT, wadreader, md5;
+  SysUtils, g_sound, g_gui, MAPSTRUCT, wadreader, md5;
 
 type
   TGameSettings = record
@@ -300,6 +300,12 @@ var
   gEvents: Array of TGameEvent;
   gDelayedEvents: Array of TDelayedEvent;
 
+  // move button values:
+  // bits 0-1: l/r state:
+  //   0: neither left, nor right pressed
+  //   1: left pressed
+  //   2: right pressed
+  // bits 4-5: l/r state when strafe was pressed
   P1MoveButton: Byte = 0;
   P2MoveButton: Byte = 0;
 
@@ -1098,9 +1104,6 @@ begin
 
     g_Game_SetLoadingText(_lc[I_LOAD_MENUS], 0, False);
     g_Menu_Init();
-    
-    g_Scripts_Init();
-    g_Scripts_Load('game.conprint("Scripts Init")');
 
     gMusic := TMusic.Create();
     gMusic.SetByName('MUSIC_MENU');
@@ -1229,9 +1232,13 @@ end;
 procedure processPlayerControls (plr: TPlayer; var ctrl: TPlayerControl; var MoveButton: Byte; p2hack: Boolean=false);
 var
   time: Word;
+  strafeDir: Byte;
+  i: Integer;
 begin
   if (plr = nil) then exit;
   if (p2hack) then time := 1000 else time := 1;
+  strafeDir := MoveButton shr 4;
+  MoveButton := MoveButton and $0F;
   with ctrl do
   begin
          if isKeyPressed(KeyLeft, KeyLeft2) and (not isKeyPressed(KeyRight, KeyRight2)) then MoveButton := 1 // Íàæàòà òîëüêî "Âëåâî"
@@ -1242,12 +1249,28 @@ begin
          if MoveButton = 1 then plr.PressKey(KEY_LEFT, time)
     else if MoveButton = 2 then plr.PressKey(KEY_RIGHT, time);
 
-    // Ðàíüøå áûëà íàæàòà "Âïðàâî", à ñåé÷àñ "Âëåâî" => áåæèì âïðàâî, ñìîòðèì âëåâî:
-         if (MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then plr.SetDirection(D_LEFT)
-    // Ðàíüøå áûëà íàæàòà "Âëåâî", à ñåé÷àñ "Âïðàâî" => áåæèì âëåâî, ñìîòðèì âïðàâî:
-    else if (MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then plr.SetDirection(D_RIGHT)
-    // ×òî-òî áûëî íàæàòî è íå èçìåíèëîñü => êóäà áåæèì, òóäà è ñìîòðèì:
-    else if MoveButton <> 0 then plr.SetDirection(TDirection(MoveButton-1));
+    // if we have "strafe" key, turn off old strafe mechanics
+    if isKeyPressed(KeyStrafe, KeyStrafe2) then
+    begin
+      // new strafe mechanics
+      if (strafeDir = 0) then strafeDir := MoveButton; // start strafing
+      // now set direction according to strafe (reversed)
+           if (strafeDir = 2) then plr.SetDirection(D_LEFT)
+      else if (strafeDir = 1) then plr.SetDirection(D_RIGHT);
+    end
+    else
+    begin
+      strafeDir := 0; // not strafing anymore
+      // Ðàíüøå áûëà íàæàòà "Âïðàâî", à ñåé÷àñ "Âëåâî" => áåæèì âïðàâî, ñìîòðèì âëåâî:
+           if (MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then plr.SetDirection(D_LEFT)
+      // Ðàíüøå áûëà íàæàòà "Âëåâî", à ñåé÷àñ "Âïðàâî" => áåæèì âëåâî, ñìîòðèì âïðàâî:
+      else if (MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then plr.SetDirection(D_RIGHT)
+      // ×òî-òî áûëî íàæàòî è íå èçìåíèëîñü => êóäà áåæèì, òóäà è ñìîòðèì:
+      else if MoveButton <> 0 then plr.SetDirection(TDirection(MoveButton-1));
+    end;
+
+    // fix movebutton state
+    MoveButton := MoveButton or (strafeDir shl 4);
 
     // Îñòàëüíûå êëàâèøè:
     if isKeyPressed(KeyJump, KeyJump2) then plr.PressKey(KEY_JUMP, time);
@@ -1257,6 +1280,13 @@ begin
     if isKeyPressed(KeyNextWeapon, KeyNextWeapon2) then plr.PressKey(KEY_NEXTWEAPON);
     if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) then plr.PressKey(KEY_PREVWEAPON);
     if isKeyPressed(KeyOpen, KeyOpen2) then plr.PressKey(KEY_OPEN);
+
+    for i := 0 to High(KeyWeapon) do
+      if isKeyPressed(KeyWeapon[i], KeyWeapon2[i]) then
+      begin
+        plr.ForceWeapon(i);
+        Break;
+      end;
   end;
 end;