DEADSOFTWARE

get rid of "rulez", "kastet" and "pulemet" in symbols; also some cosmetics and small...
[d2df-sdl.git] / src / game / g_playermodel.pas
index 5400de6b9b67c34df657353b8f7a09be33f382bd..6ba81745efde669846f1f91ad94c9593174d7b59 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
@@ -21,7 +20,7 @@ interface
 
 uses
   {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
-  MAPDEF, g_textures, g_basic, g_weapons, e_graphics, utils,
+  MAPDEF, g_textures, g_basic, g_weapons, e_graphics, utils, g_gfx,
   ImagingTypes, Imaging, ImagingUtility;
 
 const
@@ -36,22 +35,22 @@ const
   A_ATTACKDOWN = 8;
   A_PAIN       = 9;
   // EXTENDED
-  A_WALKATTACK     = 10;
-  A_WALKSEEUP      = 11;
-  A_WALKSEEDOWN    = 12;
-  A_WALKATTACKUP   = 13;
-  A_WALKATTACKDOWN = 14;
-  A_FISTSTAND      = 15;
-  A_FISTWALK       = 16;
-  A_FISTATTACK     = 17;
-  A_FISTWALKATTACK = 18;
-  A_FISTSEEUP      = 19;
-  A_FISTSEEDOWN    = 20;
-  A_FISTATTACKUP   = 21;
-  A_FISTATTACKDOWN = 22;
+  A_WALKATTACK      = 10;
+  A_WALKSEEUP       = 11;
+  A_WALKSEEDOWN     = 12;
+  A_WALKATTACKUP    = 13;
+  A_WALKATTACKDOWN  = 14;
+  A_MELEESTAND      = 15;
+  A_MELEEWALK       = 16;
+  A_MELEEATTACK     = 17;
+  A_MELEEWALKATTACK = 18;
+  A_MELEESEEUP      = 19;
+  A_MELEESEEDOWN    = 20;
+  A_MELEEATTACKUP   = 21;
+  A_MELEEATTACKDOWN = 22;
 
   A_LASTBASE = A_PAIN;
-  A_LASTEXT  = A_FISTATTACKDOWN;
+  A_LASTEXT  = A_MELEEATTACKDOWN;
   A_LAST     = A_LASTEXT;
 
   MODELSOUND_PAIN = 0;
@@ -65,6 +64,10 @@ type
     HaveWeapon:  Boolean;
   end;
 
+  TModelBlood = record
+    R, G, B, Kind: Byte;
+  end;
+
   TModelSound = record
     ID:    DWORD;
     Level: Byte;
@@ -88,6 +91,7 @@ type
     FName:             String;
     FDirection:        TDirection;
     FColor:            TRGB;
+    FBlood:            TModelBlood;
     FCurrentAnimation: Byte;
     FAnim:             Array [TDirection.D_LEFT..TDirection.D_RIGHT] of Array [A_STAND..A_LAST] of TAnimation;
     FMaskAnim:         Array [TDirection.D_LEFT..TDirection.D_RIGHT] of Array [A_STAND..A_LAST] of TAnimation;
@@ -126,6 +130,7 @@ type
 
   public
     property    Color: TRGB read FColor write FColor;
+    property    Blood: TModelBlood read FBlood;
   end;
 
 procedure g_PlayerModel_LoadData();
@@ -133,6 +138,7 @@ 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; Anim: Byte; var _Anim, _Mask: TAnimation): Boolean;
 function  g_PlayerModel_GetGibs(ModelName: String; var Gibs: TGibsArray): Boolean;
@@ -141,11 +147,7 @@ function  g_PlayerModel_GetGibs(ModelName: String; var Gibs: TGibsArray): Boolea
 implementation
 
 uses
-{$IFDEF USE_NANOGL}
-  nanoGL,
-{$ELSE}
-  GL, GLExt,
-{$ENDIF}
+  {$INCLUDE ../nogl/noGLuses.inc}
   g_main, g_sound, g_console, SysUtils, g_player, CONFIG,
   e_sound, g_options, g_map, Math, e_log, wadreader;
 
@@ -160,6 +162,7 @@ type
     PainSounds:   TModelSoundArray;
     DieSounds:    TModelSoundArray;
     SlopSound:    Byte;
+    Blood:        TModelBlood;
   end;
 
 const
@@ -183,9 +186,9 @@ const
               'SeeUpAnim','SeeDownAnim','AttackUpAnim','AttackDownAnim','PainAnim',
               // EXTENDED
               'WalkAttackAnim', 'WalkSeeUpAnim', 'WalkSeeDownAnim',
-              'WalkAttackUpAnim', 'WalkAttackDownAnim', 'FistStandAnim', 'FistWalkAnim',
-              'FistAttackAnim', 'FistWalkAttackAnim', 'FistSeeUpAnim', 'FistSeeDownAnim',
-              'FistAttackUpAnim', 'FistAttackDownAnim');
+              'WalkAttackUpAnim', 'WalkAttackDownAnim', 'MeleeStandAnim', 'MeleeWalkAnim',
+              'MeleeAttackAnim', 'MeleeWalkAttackAnim', 'MeleeSeeUpAnim', 'MeleeSeeDownAnim',
+              'MeleeAttackUpAnim', 'MeleeAttackDownAnim');
   WeapNames: Array [WP_FIRST + 1..WP_LAST] of String =
              ('csaw', 'hgun', 'sg', 'ssg', 'mgun', 'rkt', 'plz', 'bfg', 'spl', 'flm');
 
@@ -394,7 +397,7 @@ var
   prefix: string;
   ok, chk: Boolean;
 begin
-  e_WriteLog(Format('Loading player model: %s', [ExtractFileName(FileName)]), TMsgType.Notify);
+  e_WriteLog(Format('Loading player model "%s"...', [FileName]), TMsgType.Notify);
 
   Result := False;
 
@@ -436,6 +439,20 @@ begin
     Description := config.ReadStr('Model', 'description', '');
   end;
 
+  with PlayerModelsArray[ID] do
+  begin
+    Blood.R := MAX(0, MIN(255, config.ReadInt('Blood', 'R', 150)));
+    Blood.G := MAX(0, MIN(255, config.ReadInt('Blood', 'G', 0)));
+    Blood.B := MAX(0, MIN(255, config.ReadInt('Blood', 'B', 0)));
+    case config.ReadStr('Blood', 'Kind', 'NORMAL') of
+      'NORMAL': Blood.Kind := BLOOD_NORMAL;
+      'SPARKS': Blood.Kind := BLOOD_CSPARKS;
+      'COMBINE': Blood.Kind := BLOOD_COMBINE;
+    else
+      Blood.Kind := BLOOD_NORMAL
+    end
+  end;
+
   for b := A_STAND to A_LAST do
   begin
     aname := s+'_RIGHTANIM'+IntToStr(b);
@@ -647,6 +664,7 @@ begin
       with PlayerModelsArray[a] do
       begin
         Result.FName := Info.Name;
+        Result.FBlood := Blood;
 
         for b := A_STAND to A_LAST do
         begin
@@ -789,6 +807,24 @@ begin
     end;
 end;
 
+function g_PlayerModel_GetBlood(ModelName: string): TModelBlood;
+var
+  a: Integer;
+begin
+  Result.R := 150;
+  Result.G := 0;
+  Result.B := 0;
+  Result.Kind := BLOOD_NORMAL;
+  if PlayerModelsArray = nil then Exit;
+
+  for a := 0 to High(PlayerModelsArray) do
+    if PlayerModelsArray[a].Info.Name = ModelName then
+    begin
+      Result := PlayerModelsArray[a].Blood;
+      Break;
+    end;
+end;
+
 procedure g_PlayerModel_FreeData();
 var
   i: DWORD;