DEADSOFTWARE

changed license to GPLv3 only; sorry, no trust to FSF anymore
[d2df-sdl.git] / src / game / g_netmsg.pas
index e84d82965bcc48850e4d971a28234fb4adbf7a18..42365d69b2763045f5434298adca1a014f73dffe 100644 (file)
@@ -2,8 +2,7 @@
  *
  * 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
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -110,6 +109,7 @@ const
   NET_EV_KILLCOMBO    = 17;
   NET_EV_PLAYER_TOUCH = 18;
   NET_EV_SECRET       = 19;
+  NET_EV_INTER_READY  = 20;
 
   NET_VE_STARTED      = 1;
   NET_VE_PASSED       = 2;
@@ -125,6 +125,7 @@ const
 
   NET_CHEAT_SUICIDE  = 1;
   NET_CHEAT_SPECTATE = 2;
+  NET_CHEAT_READY    = 3;
 
   NET_MAX_DIFFTIME = 5000 div 36;
 
@@ -511,6 +512,21 @@ begin
       else
         Pl.Spectate;
     end;
+    NET_CHEAT_READY:
+    begin
+      if gState <> STATE_INTERCUSTOM then Exit;
+      Pl.FReady := not Pl.FReady;
+      if Pl.FReady then
+      begin
+        MH_SEND_GameEvent(NET_EV_INTER_READY, Pl.UID, 'Y');
+        Inc(gInterReadyCount);
+      end
+      else
+      begin
+        MH_SEND_GameEvent(NET_EV_INTER_READY, Pl.UID, 'N');
+        Dec(gInterReadyCount);
+      end;
+    end;
   end;
 end;
 
@@ -712,6 +728,8 @@ begin
   begin
     MH_SEND_GameEvent(NET_EV_LMS_WARMUP, (gLMSRespawnTime - gTime) div 1000, 'N', ID);
   end;
+
+  g_Net_Flush();
 end;
 
 procedure MH_SEND_Info(ID: Byte);
@@ -1842,6 +1860,11 @@ begin
       end;
     end;
 
+    NET_EV_INTER_READY:
+    begin
+      pl := g_Player_Get(EvNum);
+      if pl <> nil then pl.FReady := (EvStr = 'Y');
+    end;
   end;
 end;
 
@@ -2560,7 +2583,7 @@ begin
   begin
     gMusic.SetByName(MName);
     gMusic.Play(True);
-    gMusic.SetPosition(MPos);
+    // gMusic.SetPosition(MPos);
     gMusic.SpecPause := MPaused;
   end
   else
@@ -2787,6 +2810,7 @@ var
   Predict: Boolean;
   strafeDir: Byte;
   WeaponSelect: Word = 0;
+  i: Integer;
 begin
   if not gGameOn then Exit;
   if gPlayers = nil then Exit;
@@ -2811,13 +2835,17 @@ begin
     if gPlayerAction[0, ACTION_STRAFE] then
     begin
       // new strafe mechanics
-      if (strafeDir = 0) then strafeDir := P1MoveButton; // start strafing
+      if (strafeDir = 0) then
+        strafeDir := P1MoveButton; // start strafing
       // now set direction according to strafe (reversed)
-           if (strafeDir = 2) then gPlayer1.SetDirection(TDirection.D_LEFT)
-      else if (strafeDir = 1) then gPlayer1.SetDirection(TDirection.D_RIGHT);
+      if (strafeDir = 2) then
+        gPlayer1.SetDirection(TDirection.D_LEFT)
+      else if (strafeDir = 1) then
+        gPlayer1.SetDirection(TDirection.D_RIGHT)
     end
     else
     begin
+      strafeDir := 0; // not strafing anymore
       if (P1MoveButton = 2) and gPlayerAction[0, ACTION_MOVELEFT] then
         gPlayer1.SetDirection(TDirection.D_LEFT)
       else if (P1MoveButton = 1) and gPlayerAction[0, ACTION_MOVERIGHT] then
@@ -2857,10 +2885,16 @@ begin
     if gPlayerAction[0, ACTION_WEAPNEXT] then kByte := kByte or NET_KEY_NW;
     if gPlayerAction[0, ACTION_WEAPPREV] then kByte := kByte or NET_KEY_PW;
 
-    if gSelectWeapon[0] >= 0 then
+    gPlayerAction[0, ACTION_WEAPNEXT] := False; // HACK, remove after readyweaon&pendinweapon implementation
+    gPlayerAction[0, ACTION_WEAPPREV] := False; // HACK, remove after readyweaon&pendinweapon implementation
+
+    for i := WP_FIRST to WP_LAST do
     begin
-      WeaponSelect := gSelectWeapon[0];
-      //gSelectWeapon[0] := -1
+      if gSelectWeapon[0, i] then
+      begin
+        WeaponSelect := WeaponSelect or Word(1 shl i);
+        gSelectWeapon[0, i] := False
+      end
     end;
 
     // fix movebutton state