DEADSOFTWARE

Merge FGSFDS branch, fix build
[d2df-sdl.git] / src / game / g_map.pas
index 6c35e4e00af20320d07888af5b21590dbd3ae7a0..9cc29e34dfd3e2e0db4e340896bd3d32d1b07e0d 100644 (file)
@@ -55,7 +55,6 @@ type
     Direction:   TDirection;
   end;
 
-
 function  g_Map_Load(Res: String): Boolean;
 function  g_Map_GetMapInfo(Res: String): TMapInfo;
 function  g_Map_GetMapsList(WADName: String): SArray;
@@ -82,6 +81,8 @@ function  g_Map_HaveFlagPoints(): Boolean;
 procedure g_Map_ResetFlag(Flag: Byte);
 procedure g_Map_DrawFlags();
 
+function g_Map_PanelForPID(PanelID: Integer; var PanelArrayID: Integer): PPanel;
+
 procedure g_Map_SaveState(Var Mem: TBinMemoryWriter);
 procedure g_Map_LoadState(Var Mem: TBinMemoryReader);
 
@@ -133,7 +134,7 @@ uses
   GL, GLExt, g_weapons, g_game, g_sound, e_sound, CONFIG,
   g_options, MAPREADER, g_triggers, g_player, MAPDEF,
   Math, g_monsters, g_saveload, g_language, g_netmsg,
-  utils, sfs,
+  utils, sfs, g_scripts,
   ImagingTypes, Imaging, ImagingUtility,
   ImagingGif, ImagingNetworkGraphics;
 
@@ -142,7 +143,14 @@ const
   MUSIC_SIGNATURE = $4953554D; // 'MUSI'
   FLAG_SIGNATURE = $47414C46; // 'FLAG'
 
+type
+  TPanelID = record
+    PWhere: ^TPanelArray;
+    PArrID: Integer;
+  end;
+
 var
+  PanelById:     array of TPanelID;
   Textures:      TLevelTextureArray;
   RespawnPoints: Array of TRespawnPoint;
   FlagPoints:    Array [FLAG_RED..FLAG_BLUE] of PFlagPoint;
@@ -362,6 +370,11 @@ begin
     panels^[len].SaveIt := True;
 
   Result := len;
+
+  len := Length(PanelByID);
+  SetLength(PanelByID, len + 1);
+  PanelByID[len].PWhere := panels;
+  PanelByID[len].PArrID := Result;
 end;
 
 function CreateNullTexture(RecName: String): Integer;
@@ -907,9 +920,9 @@ var
                            DoorPanel: Integer;
                            ShotPanel: Integer;
                           end;
-  FileName, mapResName, s, TexName: String;
-  Data: Pointer;
-  Len: Integer;
+  FileName, mapResName, s, TexName, ScrStr: String;
+  Data, ScrText: Pointer;
+  Len, ScrLen: Integer;
   ok, isAnim, trigRef: Boolean;
   CurTex, ntn: Integer;
 begin
@@ -940,6 +953,19 @@ begin
       WAD.Free();
       Exit;
     end;
+    
+    // try to load the map script
+    g_Scripts_Reset(RESET_MAP);
+    ScrText := nil;
+    ScrLen := 0;
+    if WAD.GetResource('SCRIPTS/'+mapResName, ScrText, ScrLen) then
+    begin
+      g_Console_Add('SCRIPT: Found script for this map. Loading...');
+      SetString(ScrStr, ScrText, ScrLen);
+      g_Scripts_Load(ScrStr);
+      FreeMem(ScrText);
+    end;
+
     WAD.Free();
 
   // Çàãðóçêà êàðòû:
@@ -1572,6 +1598,8 @@ begin
 
   gDoorMap := nil;
   gLiftMap := nil;
+
+  PanelByID := nil;
 end;
 
 procedure g_Map_Update();
@@ -2287,4 +2315,15 @@ begin
 ///// /////
 end;
 
+function g_Map_PanelForPID(PanelID: Integer; var PanelArrayID: Integer): PPanel;
+var
+  Arr: TPanelArray;
+begin
+  Result := nil;
+  if (PanelID < 0) or (PanelID > High(PanelByID)) then Exit;
+  Arr := PanelByID[PanelID].PWhere^;
+  PanelArrayID := PanelByID[PanelID].PArrID;
+  Result := Addr(Arr[PanelByID[PanelID].PArrID]);
+end;
+
 end.