DEADSOFTWARE

Add flamethrower weapon, item and ammo
[d2df-sdl.git] / src / game / g_playermodel.pas
index 7f939fb44a5c50f3343ea1824b6f36a24608baf4..f3e1f8d79e5c7652ba9a002d1216f422016c8198 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_playermodel;
 
@@ -43,7 +58,7 @@ type
 
   TModelSoundArray = Array of TModelSound;
   TGibsArray = Array of TGibSprite;
-  TWeaponPoints = Array [WEAPON_SAW..WEAPON_SUPERPULEMET] of
+  TWeaponPoints = Array [WP_FIRST + 1..WP_LAST] of
                   Array [A_STAND..A_PAIN] of
                   Array [D_LEFT..D_RIGHT] of Array of TPoint;
 
@@ -128,18 +143,19 @@ const
   FLAG_BASEPOINT: TPoint = (X:16; Y:43);
   FLAG_DEFPOINT:  TPoint = (X:32; Y:16);
   FLAG_DEFANGLE = -20;
-  WEAPONBASE: Array [WEAPON_SAW..WEAPON_SUPERPULEMET] of TPoint =
+  WEAPONBASE: Array [WP_FIRST + 1..WP_LAST] of TPoint =
               ((X:8; Y:4), (X:8; Y:8), (X:16; Y:16), (X:16; Y:24),
-               (X:16; Y:16), (X:24; Y:24), (X:16; Y:16), (X:24; Y:24), (X:16; Y:16));
+               (X:16; Y:16), (X:24; Y:24), (X:16; Y:16), (X:24; Y:24),
+               (X:16; Y:16), (X:8; Y:8));
 
   AnimNames: Array [A_STAND..A_PAIN] of String =
              ('StandAnim','WalkAnim','Die1Anim','Die2Anim','AttackAnim',
               'SeeUpAnim','SeeDownAnim','AttackUpAnim','AttackDownAnim','PainAnim');
-  WeapNames: Array [WEAPON_SAW..WEAPON_SUPERPULEMET] of String =
-             ('csaw', 'hgun', 'sg', 'ssg', 'mgun', 'rkt', 'plz', 'bfg', 'spl');
+  WeapNames: Array [WP_FIRST + 1..WP_LAST] of String =
+             ('csaw', 'hgun', 'sg', 'ssg', 'mgun', 'rkt', 'plz', 'bfg', 'spl', 'flm');
 
 var
-  WeaponID: Array [WEAPON_SAW..WEAPON_SUPERPULEMET] of
+  WeaponID: Array [WP_FIRST + 1..WP_LAST] of
             Array [W_POS_NORMAL..W_POS_DOWN] of
             Array [W_ACT_NORMAL..W_ACT_FIRE] of DWORD;
   PlayerModelsArray: Array of TPlayerModelInfo;
@@ -148,7 +164,7 @@ procedure g_PlayerModel_LoadData();
 var
   a: Integer;
 begin
-  for a := WEAPON_SAW to WEAPON_SUPERPULEMET do
+  for a := WP_FIRST + 1 to WP_LAST do
   begin
     g_Texture_CreateWAD(WeaponID[a][W_POS_NORMAL][W_ACT_NORMAL], GameWAD+':WEAPONS\'+UpperCase(WeapNames[a]));
     g_Texture_CreateWAD(WeaponID[a][W_POS_NORMAL][W_ACT_FIRE], GameWAD+':WEAPONS\'+UpperCase(WeapNames[a])+'_FIRE');
@@ -238,7 +254,7 @@ var
   WAD: TWADFile;
   s: string;
   prefix: string;
-  ok: Boolean;
+  ok, chk: Boolean;
 begin
   e_WriteLog(Format('Loading player model: %s', [ExtractFileName(FileName)]), MSG_NOTIFY);
 
@@ -298,7 +314,7 @@ begin
       Exit;
     end;
 
-    for aa := WEAPON_SAW to WEAPON_SUPERPULEMET do
+    for aa := WP_FIRST + 1 to WP_LAST do
       for bb := A_STAND to A_PAIN do
         for cc := D_LEFT to D_RIGHT do
         begin
@@ -376,14 +392,64 @@ begin
     end;
 
     ok := True;
-    for aa := WEAPON_SAW to WEAPON_SUPERPULEMET do
+    for aa := WP_FIRST + 1 to WP_LAST do
       for bb := A_STAND to A_PAIN do
         if not (bb in [A_DIE1, A_DIE2, A_PAIN]) then
         begin
-          ok := ok and GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[aa]+'_points', ''), aa, bb, D_RIGHT,
-                                     config.ReadInt(AnimNames[bb], 'frames', 0),
-                                     config.ReadBool(AnimNames[bb], 'backanim', False),
-                                     WeaponPoints);
+          chk := GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[aa]+'_points', ''), aa, bb, D_RIGHT,
+                               config.ReadInt(AnimNames[bb], 'frames', 0),
+                               config.ReadBool(AnimNames[bb], 'backanim', False),
+                               WeaponPoints);
+          if ok and (not chk) and (aa = WEAPON_FLAMETHROWER) then
+          begin
+            // workaround for flamethrower
+            chk := GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[WEAPON_PLASMA]+'_points', ''), aa, bb, D_RIGHT,
+                                 config.ReadInt(AnimNames[bb], 'frames', 0),
+                                 config.ReadBool(AnimNames[bb], 'backanim', False),
+                                 WeaponPoints);
+            if chk then
+            for f := 0 to High(WeaponPoints[aa, bb, D_RIGHT]) do
+            begin
+              case bb of
+                A_STAND, A_PAIN:
+                begin
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 6);
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 8);
+                end;
+                A_WALK:
+                begin
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 9);
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 9);
+                end;
+                A_ATTACK:
+                begin
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 5);
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 8);
+                end;
+                A_SEEUP:
+                begin
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 5);
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 16);
+                end;
+                A_SEEDOWN:
+                begin
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 6);
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 5);
+                end;
+                A_ATTACKUP:
+                begin
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 5);
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 16);
+                end;
+                A_ATTACKDOWN:
+                begin
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 6);
+                  Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 4);
+                end;
+              end;
+            end;
+          end;
+          ok := ok and chk;
 
           if not GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[aa]+'2_points', ''), aa, bb, D_LEFT,
                                config.ReadInt(AnimNames[bb], 'frames', 0),
@@ -579,7 +645,7 @@ var
   i: DWORD;
   a, b, c: Integer;
 begin
-  for a := WEAPON_SAW to WEAPON_SUPERPULEMET do
+  for a := WP_FIRST + 1 to WP_LAST do
     for b := W_POS_NORMAL to W_POS_DOWN do
       for c := W_ACT_NORMAL to W_ACT_FIRE do
         e_DeleteTexture(WeaponID[a][b][c]);
@@ -688,7 +754,7 @@ begin
 
   if FDrawWeapon and
     (not (FCurrentAnimation in [A_DIE1, A_DIE2, A_PAIN])) and
-    (FCurrentWeapon in [WEAPON_SAW..WEAPON_SUPERPULEMET]) then
+    (FCurrentWeapon in [WP_FIRST + 1..WP_LAST]) then
   begin
     if FCurrentAnimation in [A_SEEUP, A_ATTACKUP] then
       pos := W_POS_UP
@@ -783,7 +849,7 @@ begin
   end
   else
   begin
-    if (Level in [2, 3]) and (FSlopSound > 0) then
+    if (Level in [2, 3, 5]) and (FSlopSound > 0) then
     begin
       g_Sound_PlayExAt('SOUND_MONSTER_SLOP', X, Y);
       if FSlopSound = 1 then
@@ -800,6 +866,12 @@ begin
         SetLength(TempArray, Length(TempArray)+1);
         TempArray[High(TempArray)] := FDieSounds[a].ID;
       end;
+    if (TempArray = nil) and (Level = 5) then
+    begin
+      g_Sound_PlayExAt('SOUND_MONSTER_SLOP', X, Y);
+      Result := True;
+      Exit;
+    end;
   end;
 
   if TempArray = nil then Exit;