DEADSOFTWARE

models: remove TModelInfo
[d2df-sdl.git] / src / game / g_playermodel.pas
index 8ffb589787109f0a7ccf680e619b87c4dea97ea4..ca4b6dc6c4fc92ae6e1ef9eab5f6171cc5c36cd4 100644 (file)
@@ -80,13 +80,6 @@ type
     R, G, B, Kind: Byte;
   end;
 
-  TModelInfo = record
-    Name:        String;
-    Author:      String;
-    Description: String;
-    HaveWeapon:  Boolean;
-  end;
-
   TModelSound = record
     ID:    DWORD;
     Level: Byte;
@@ -108,15 +101,8 @@ type
     FColor:            TRGB;
     FCurrentAnimation: Byte;
     FAnimState:        TAnimationState;
-    FPainSounds:       TModelSoundArray;
-    FDieSounds:        TModelSoundArray;
-    FSlopSound:        Byte;
     FCurrentWeapon:    Byte;
     FFlag:             Byte;
-    FFlagPoint:        TDFPoint;
-    FFlagAngle:        SmallInt;
-    FFlagAnim:         TAnimation; // !!! TAnimationState
-    FFire:             Boolean;
     FFireCounter:      Byte;
     FID:               Integer;
 
@@ -126,7 +112,8 @@ type
     procedure   SetColor(Red, Green, Blue: Byte);
     procedure   SetWeapon(Weapon: Byte);
     procedure   SetFlag(Flag: Byte);
-    procedure   SetFire(Fire: Boolean);
+    procedure   SetFire (Fire: Boolean);
+    function    GetFire (): Boolean;
     function    PlaySound(SoundType, Level: Byte; X, Y: Integer): Boolean;
     procedure   Update();
 
@@ -134,24 +121,16 @@ type
     function GetName (): String;
 
   published
-    property    Fire: Boolean read FFire;
     property    Direction: TDirection read FDirection write FDirection;
     property    Animation: Byte read FCurrentAnimation;
     property    Weapon: Byte read FCurrentWeapon;
 
   public
     property    Color: TRGB read FColor write FColor;
-
     property    AnimState: TAnimationState read FAnimState;
     property    CurrentAnimation: Byte read FCurrentAnimation;
-
     property    CurrentWeapon: Byte read FCurrentWeapon;
-
     property    Flag: Byte read FFlag;
-    property    FlagAnim: TAnimation read FFlagAnim;
-    property    FlagAngle: SmallInt read FFlagAngle;
-    property    FlagPoint: TDFPoint read FFlagPoint;
-
     property    ID: Integer read FID;
   end;
 
@@ -159,17 +138,21 @@ procedure g_PlayerModel_LoadAll;
 procedure g_PlayerModel_FreeData();
 function  g_PlayerModel_Load(FileName: String): Boolean;
 function  g_PlayerModel_GetNames(): SSArray;
-function  g_PlayerModel_GetInfo(ModelName: String): TModelInfo;
 function  g_PlayerModel_GetBlood(ModelName: String): TModelBlood;
 function  g_PlayerModel_Get(ModelName: String): TPlayerModel;
 function  g_PlayerModel_GetAnim(ModelName: String; AnimTyp: Byte; var _Anim, _Mask: TAnimation): Boolean;
 function  g_PlayerModel_GetGibs(ModelName: String; var Gibs: TGibsArray): Boolean;
 
+function g_PlayerModel_GetIndex (ModelName: String): Integer;
+
 (* --- private data --- *)
 
   type
     TPlayerModelInfo = record
-      Info:         TModelInfo;
+      Name:         String;
+      Author:       String;
+      Description:  String;
+      HaveWeapon:   Boolean;
       ModelSpeed:   Array [A_STAND..A_PAIN] of Byte;
       FlagPoint:    TDFPoint;
       FlagAngle:    SmallInt;
@@ -216,6 +199,20 @@ const
   WeapNames: Array [WP_FIRST + 1..WP_LAST] of String =
              ('csaw', 'hgun', 'sg', 'ssg', 'mgun', 'rkt', 'plz', 'bfg', 'spl', 'flm');
 
+  function g_PlayerModel_GetIndex (ModelName: String): Integer;
+    var i: Integer;
+  begin
+    Result := -1;
+    if PlayerModelsArray <> nil then
+    begin
+      i := 0;
+      while (i < Length(PlayerModelsArray)) and (PlayerModelsArray[i].Name <> ModelName) do
+        Inc(i);
+      if i < Length(PlayerModelsArray) then
+        Result := i
+    end
+  end;
+
 function GetPoint(var str: String; var point: TDFPoint): Boolean;
 var
   a, x, y: Integer;
@@ -415,13 +412,9 @@ begin
 
   prefix := FileName+':TEXTURES\';
 
-  with PlayerModelsArray[ID].Info do
-  begin
-    Name := s;
-    Author := config.ReadStr('Model', 'author', '');
-    Description := config.ReadStr('Model', 'description', '');
-  end;
-
+  PlayerModelsArray[ID].Name := s;
+  PlayerModelsArray[ID].Author := config.ReadStr('Model', 'author', '');
+  PlayerModelsArray[ID].Description := config.ReadStr('Model', 'description', '');
   PlayerModelsArray[ID].FileName := FileName;
   with PlayerModelsArray[ID] do
   begin
@@ -628,7 +621,7 @@ begin
         end;
     {if ok then g_Console_Add(Info.Name+' weapon points ok')
     else g_Console_Add(Info.Name+' weapon points fail');}
-    Info.HaveWeapon := ok;
+    PlayerModelsArray[ID].HaveWeapon := ok;
 
     s := config.ReadStr('Model', 'flag_point', '');
     if not GetPoint(s, FlagPoint) then
@@ -643,7 +636,7 @@ begin
   Result := True;
 end;
 
-function g_PlayerModel_Get(ModelName: String): TPlayerModel;
+function g_PlayerModel_Get (ModelName: String): TPlayerModel;
   var a: Integer;
 begin
   Result := nil;
@@ -652,22 +645,14 @@ begin
 
   for a := 0 to High(PlayerModelsArray) do
   begin
-    if AnsiLowerCase(PlayerModelsArray[a].Info.Name) = AnsiLowerCase(ModelName) then
+    if AnsiLowerCase(PlayerModelsArray[a].Name) = AnsiLowerCase(ModelName) then
     begin
       Result := TPlayerModel.Create;
 
       with PlayerModelsArray[a] do
       begin
-        Result.FPainSounds := PainSounds;
-        Result.FDieSounds := DieSounds;
-        Result.FSlopSound := SlopSound;
-
-        Result.FFlagPoint := FlagPoint;
-        Result.FFlagAngle := FlagAngle;
         Result.FID := a;
-
         Result.ChangeAnimation(A_STAND, True);
-
         Break;
       end;
     end;
@@ -684,19 +669,20 @@ begin
 
   if PlayerModelsArray = nil then Exit;
   for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
+    if PlayerModelsArray[a].Name = ModelName then
       with PlayerModelsArray[a] do
       begin
         if AnimTyp in [A_STAND, A_WALK] then c := True else c := False;
 
-        if not g_Frames_Get(ID, Info.Name+'_RIGHTANIM'+IntToStr(AnimTyp)) then
-          if not g_Frames_Get(ID, Info.Name+'_LEFTANIM'+IntToStr(AnimTyp)) then Exit;
+        if not g_Frames_Get(ID, Name + '_RIGHTANIM' + IntToStr(AnimTyp)) then
+          if not g_Frames_Get(ID, Name + '_LEFTANIM' + IntToStr(AnimTyp)) then Exit;
 
         _Anim := TAnimation.Create(ID, c, ModelSpeed[AnimTyp]);
         _Anim.Speed := ModelSpeed[AnimTyp];
 
-        if not g_Frames_Get(ID, Info.Name+'_RIGHTANIM'+IntToStr(AnimTyp)+'_MASK') then
-          if not g_Frames_Get(ID, Info.Name+'_LEFTANIM'+IntToStr(AnimTyp)+'_MASK') then Exit;
+        if not g_Frames_Get(ID, Name + '_RIGHTANIM' + IntToStr(AnimTyp) + '_MASK') then
+          if not g_Frames_Get(ID, Name + '_LEFTANIM' + IntToStr(AnimTyp) + '_MASK') then
+            Exit;
 
         _Mask := TAnimation.Create(ID, c, ModelSpeed[AnimTyp]);
         _Mask.Speed := ModelSpeed[AnimTyp];
@@ -722,7 +708,7 @@ begin
   SetLength(Gibs, gGibsCount);
 
   for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
+    if PlayerModelsArray[a].Name = ModelName then
     begin
       for i := 0 to High(Gibs) do
       begin
@@ -757,25 +743,10 @@ begin
   for i := 0 to High(PlayerModelsArray) do
   begin
     SetLength(Result, Length(Result)+1);
-    Result[High(Result)] := PlayerModelsArray[i].Info.Name;
+    Result[High(Result)] := PlayerModelsArray[i].Name;
   end;
 end;
 
-function g_PlayerModel_GetInfo(ModelName: string): TModelInfo;
-var
-  a: Integer;
-begin
-  FillChar(Result, SizeOf(Result), 0);
-  if PlayerModelsArray = nil then Exit;
-
-  for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
-    begin
-      Result := PlayerModelsArray[a].Info;
-      Break;
-    end;
-end;
-
 function g_PlayerModel_GetBlood(ModelName: string): TModelBlood;
 var
   a: Integer;
@@ -787,7 +758,7 @@ begin
   if PlayerModelsArray = nil then Exit;
 
   for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
+    if PlayerModelsArray[a].Name = ModelName then
     begin
       Result := PlayerModelsArray[a].Blood;
       Break;
@@ -847,33 +818,33 @@ begin
 
   if SoundType = MODELSOUND_PAIN then
   begin
-    if FPainSounds = nil then Exit;
+    if PlayerModelsArray[FID].PainSounds = nil then Exit;
 
-    for a := 0 to High(FPainSounds) do
-      if FPainSounds[a].Level = Level then
+    for a := 0 to High(PlayerModelsArray[FID].PainSounds) do
+      if PlayerModelsArray[FID].PainSounds[a].Level = Level then
       begin
-        SetLength(TempArray, Length(TempArray)+1);
-        TempArray[High(TempArray)] := FPainSounds[a].ID;
+        SetLength(TempArray, Length(TempArray) + 1);
+        TempArray[High(TempArray)] := PlayerModelsArray[FID].PainSounds[a].ID;
       end;
   end
   else
   begin
-    if (Level in [2, 3, 5]) and (FSlopSound > 0) then
+    if (Level in [2, 3, 5]) and (PlayerModelsArray[FID].SlopSound > 0) then
     begin
       g_Sound_PlayExAt('SOUND_MONSTER_SLOP', X, Y);
-      if FSlopSound = 1 then
+      if PlayerModelsArray[FID].SlopSound = 1 then
       begin
         Result := True;
         Exit;
       end;
     end;
-    if FDieSounds = nil then Exit;
+    if PlayerModelsArray[FID].DieSounds = nil then Exit;
 
-    for a := 0 to High(FDieSounds) do
-      if FDieSounds[a].Level = Level then
+    for a := 0 to High(PlayerModelsArray[FID].DieSounds) do
+      if PlayerModelsArray[FID].DieSounds[a].Level = Level then
       begin
-        SetLength(TempArray, Length(TempArray)+1);
-        TempArray[High(TempArray)] := FDieSounds[a].ID;
+        SetLength(TempArray, Length(TempArray) + 1);
+        TempArray[High(TempArray)] := PlayerModelsArray[FID].DieSounds[a].ID;
       end;
     if (TempArray = nil) and (Level = 5) then
     begin
@@ -897,36 +868,27 @@ begin
   FColor.B := Blue;
 end;
 
-procedure TPlayerModel.SetFire(Fire: Boolean);
-begin
-  FFire := Fire;
-  if FFire then
-    FFireCounter := PlayerModelsArray[FID].ModelSpeed[A_ATTACK] * PlayerModelsArray[FID].Anim[TDirection.D_RIGHT, A_ATTACK].Frames
-  else
-    FFireCounter := 0
-end;
-
-procedure TPlayerModel.SetFlag(Flag: Byte);
-var
-  tid: DWORD;
-begin
-  FFlag := Flag;
-
-  FFlagAnim.Free();
-  FFlagAnim := nil;
+  procedure TPlayerModel.SetFire (Fire: Boolean);
+  begin
+    if Fire then
+      FFireCounter := PlayerModelsArray[FID].ModelSpeed[A_ATTACK] * PlayerModelsArray[FID].Anim[TDirection.D_RIGHT, A_ATTACK].Frames
+    else
+      FFireCounter := 0
+  end;
 
-  case Flag of
-    FLAG_RED: g_Frames_Get(tid, 'FRAMES_FLAG_RED');
-    FLAG_BLUE: g_Frames_Get(tid, 'FRAMES_FLAG_BLUE');
-    else Exit;
+  function TPlayerModel.GetFire (): Boolean;
+  begin
+    Result := FFireCounter > 0
   end;
 
-  FFlagAnim := TAnimation.Create(tid, True, 8);
-end;
+  procedure TPlayerModel.SetFlag (Flag: Byte);
+  begin
+    FFlag := Flag
+  end;
 
-  procedure TPlayerModel.SetWeapon(Weapon: Byte);
+  procedure TPlayerModel.SetWeapon (Weapon: Byte);
   begin
-    FCurrentWeapon := Weapon;
+    FCurrentWeapon := Weapon
   end;
 
   function TPlayerModel.GetBlood (): TModelBlood;
@@ -936,19 +898,15 @@ end;
 
   function TPlayerModel.GetName (): String;
   begin
-    Result := PlayerModelsArray[FID].Info.Name
+    Result := PlayerModelsArray[FID].Name
   end;
 
   procedure TPlayerModel.Update;
   begin
     if FAnimState <> nil then
       FAnimState.Update;
-    if FFlagAnim <> nil then
-      FFlagAnim.Update;
     if FFireCounter > 0 then
       Dec(FFireCounter)
-    else
-      FFire := False
   end;
 
   procedure g_PlayerModel_LoadAll;