DEADSOFTWARE

Merge FGSFDS branch, fix build
[d2df-sdl.git] / src / game / g_netmsg.pas
index 9b0614dd1dede069f2297c84a61919fe5fbe3bc0..58b008f1d0edd09769d4a06c69d8c27d49c0a39e 100644 (file)
@@ -1,3 +1,18 @@
+(* 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *)
 {$MODE DELPHI}
 unit g_netmsg;
 
@@ -131,7 +146,7 @@ procedure MH_SEND_Everything(CreatePlayers: Boolean = False; ID: Integer = NET_E
 procedure MH_SEND_Info(ID: Byte);
 procedure MH_SEND_Chat(Txt: string; Mode: Byte; ID: Integer = NET_EVERYONE);
 procedure MH_SEND_Effect(X, Y: Integer; Ang: SmallInt; Kind: Byte; ID: Integer = NET_EVERYONE);
-procedure MH_SEND_Sound(X, Y: Integer; Name: string; ID: Integer = NET_EVERYONE);
+procedure MH_SEND_Sound(X, Y: Integer; Name: string; Pos: Boolean = True; ID: Integer = NET_EVERYONE);
 procedure MH_SEND_CreateShot(Proj: LongInt; ID: Integer = NET_EVERYONE);
 procedure MH_SEND_UpdateShot(Proj: LongInt; ID: Integer = NET_EVERYONE);
 procedure MH_SEND_DeleteShot(Proj: LongInt; X, Y: LongInt; Loud: Boolean = True; ID: Integer = NET_EVERYONE);
@@ -648,14 +663,22 @@ begin
     for I := Low(gRenderForegrounds) to High(gRenderForegrounds) do
       if gRenderForegrounds[I] <> nil then
         with gRenderForegrounds[I] do
+        begin
           if (GetTextureCount > 1) then
             MH_SEND_PanelTexture(PanelType, I, LastAnimLoop, ID);
+          if Moved then
+            MH_SEND_PanelState(PanelType, I, ID);
+        end;
   if gRenderBackgrounds <> nil then
     for I := Low(gRenderBackgrounds) to High(gRenderBackgrounds) do
       if gRenderBackgrounds[I] <> nil then
         with gRenderBackgrounds[I] do
-          if GetTextureCount > 1 then
+        begin
+          if (GetTextureCount > 1) then
             MH_SEND_PanelTexture(PanelType, I, LastAnimLoop, ID);
+          if Moved then
+            MH_SEND_PanelState(PanelType, I, ID);
+        end;
   if gWater <> nil then
     for I := Low(gWater) to High(gWater) do
       if gWater[I] <> nil then
@@ -815,12 +838,18 @@ begin
   g_Net_Host_Send(ID, False, NET_CHAN_GAME);
 end;
 
-procedure MH_SEND_Sound(X, Y: Integer; Name: string; ID: Integer = NET_EVERYONE);
+procedure MH_SEND_Sound(X, Y: Integer; Name: string; Pos: Boolean = True; ID: Integer = NET_EVERYONE);
 begin
   e_Buffer_Write(@NetOut, Byte(NET_MSG_SND));
   e_Buffer_Write(@NetOut, Name);
-  e_Buffer_Write(@NetOut, X);
-  e_Buffer_Write(@NetOut, Y);
+  if Pos then
+  begin
+    e_Buffer_Write(@NetOut, Byte(1));
+    e_Buffer_Write(@NetOut, X);
+    e_Buffer_Write(@NetOut, Y);
+  end
+  else
+    e_Buffer_Write(@NetOut, Byte(0));
 
   g_Net_Host_Send(ID, False, NET_CHAN_GAME);
 end;
@@ -1208,6 +1237,16 @@ begin
       TP := gWalls[PID];
     PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT:
       TP := gLifts[PID];
+    PANEL_BACK:
+    begin
+      TP := gRenderBackgrounds[PID];
+      TP.Moved := True;
+    end;
+    PANEL_FORE:
+    begin
+      TP := gRenderForegrounds[PID];
+      TP.Moved := True;
+    end;
     else
       Exit;
   end;
@@ -1217,6 +1256,8 @@ begin
   e_Buffer_Write(@NetOut, PID);
   e_Buffer_Write(@NetOut, Byte(TP.Enabled));
   e_Buffer_Write(@NetOut, TP.LiftType);
+  e_Buffer_Write(@NetOut, TP.X);
+  e_Buffer_Write(@NetOut, TP.Y);
 
   g_Net_Host_Send(ID, True, NET_CHAN_LARGEDATA);
 end;
@@ -1520,11 +1561,18 @@ procedure MC_RECV_Sound(P: Pointer);
 var
   Name: string;
   X, Y: Integer;
+  Pos: Boolean;
 begin
   Name := e_Raw_Read_String(P);
-  X := e_Raw_Read_LongInt(P);
-  Y := e_Raw_Read_LongInt(P);
-  g_Sound_PlayExAt(Name, X, Y);
+  Pos := e_Raw_Read_Byte(P) <> 0;
+  if Pos then
+  begin
+    X := e_Raw_Read_LongInt(P);
+    Y := e_Raw_Read_LongInt(P);
+    g_Sound_PlayExAt(Name, X, Y);
+  end
+  else
+    g_Sound_PlayEx(Name);
 end;
 
 procedure MC_RECV_CreateShot(P: Pointer);
@@ -2412,12 +2460,15 @@ var
   E: Boolean;
   Lift: Byte;
   PType: Word;
+  X, Y: Integer;
 begin
   if not gGameOn then Exit;
   PType := e_Raw_Read_Word(P);
   ID := e_Raw_Read_LongWord(P);
   E := (e_Raw_Read_Byte(P) <> 0);
   Lift := e_Raw_Read_Byte(P);
+  X := e_Raw_Read_LongInt(P);
+  Y := e_Raw_Read_LongInt(P);
 
   case PType of
     PANEL_WALL, PANEL_OPENDOOR, PANEL_CLOSEDOOR:
@@ -2428,6 +2479,18 @@ begin
 
     PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT:
       g_Map_SetLift(ID, Lift);
+
+    PANEL_BACK:
+    begin
+      gRenderBackgrounds[ID].X := X;
+      gRenderBackgrounds[ID].Y := Y;
+    end;
+
+    PANEL_FORE:
+    begin
+      gRenderForegrounds[ID].X := X;
+      gRenderForegrounds[ID].Y := Y;
+    end;      
   end;
 end;