index a2ceab034c4c9739583be4a580241e1eeb6566ac..0d696ee0c79043f0f69dd627c1f3de196b125e0b 100644 (file)
+(* 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/>.
+ *)
+{$INCLUDE ../shared/a_modes.inc}
unit g_playermodel;
interface
uses
- g_textures, g_basic, e_graphics, WADEDITOR,
- WADSTRUCT, g_weapons;
+ g_textures, g_basic, g_weapons, e_graphics, wadreader;
const
A_STAND = 0;
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;
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;
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');
function g_PlayerModel_Load(FileName: string): Boolean;
var
ID: DWORD;
- a, b, len, aa, bb, f: Integer;
+ a, b, len, lenpd, lenpd2, aa, bb, f: Integer;
cc: TDirection;
config: TConfig;
pData, pData2: Pointer;
- WAD: TWADEditor_1;
+ WAD: TWADFile;
s: string;
prefix: string;
- ok: Boolean;
+ ok, chk: Boolean;
begin
e_WriteLog(Format('Loading player model: %s', [ExtractFileName(FileName)]), MSG_NOTIFY);
Result := False;
- WAD := TWADEditor_1.Create;
+ WAD := TWADFile.Create;
WAD.ReadFile(FileName);
- if WAD.GetLastError <> DFWAD_NOERROR then
+ if {WAD.GetLastError <> DFWAD_NOERROR} not WAD.isOpen then
begin
WAD.Free();
Exit;
end;
- if not WAD.GetResource('TEXT', 'MODEL', pData, len) then
+ if not WAD.GetResource('TEXT/MODEL', pData, len) then
begin
WAD.Free();
Exit;
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
SetLength(Gibs, ReadInt('Gibs', 'count', 0));
if (Gibs <> nil) and
- (WAD.GetResource('TEXTURES', config.ReadStr('Gibs', 'resource', 'GIBS'), pData, len)) and
- (WAD.GetResource('TEXTURES', config.ReadStr('Gibs', 'mask', 'GIBSMASK'), pData2, len)) then
+ (WAD.GetResource('TEXTURES/'+config.ReadStr('Gibs', 'resource', 'GIBS'), pData, lenpd)) and
+ (WAD.GetResource('TEXTURES/'+config.ReadStr('Gibs', 'mask', 'GIBSMASK'), pData2, lenpd2)) then
begin
for a := 0 to High(Gibs) do
- if e_CreateTextureMemEx(pData, Gibs[a].ID, a*32, 0, 32, 32) and
- e_CreateTextureMemEx(pData2, Gibs[a].MaskID, a*32, 0, 32, 32) then
+ if e_CreateTextureMemEx(pData, lenpd, Gibs[a].ID, a*32, 0, 32, 32) and
+ e_CreateTextureMemEx(pData2, lenpd2, Gibs[a].MaskID, a*32, 0, 32, 32) then
begin
Gibs[a].Rect := e_GetTextureSize2(Gibs[a].ID);
with Gibs[a].Rect do
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),
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]);
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
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
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;