X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_playermodel.pas;h=f3e1f8d79e5c7652ba9a002d1216f422016c8198;hb=f0c98dc86657bdc08f6049872f12b554e1654fa4;hp=8345e785c504fa6b621aeb77bb7c979dc19f2bb7;hpb=8f815647c61a98e32b85066bf245b262694ac634;p=d2df-sdl.git diff --git a/src/game/g_playermodel.pas b/src/game/g_playermodel.pas index 8345e78..f3e1f8d 100644 --- a/src/game/g_playermodel.pas +++ b/src/game/g_playermodel.pas @@ -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 . + *) {$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); @@ -253,7 +269,7 @@ begin Exit; end; - if not WAD.GetResource('TEXT', 'MODEL', pData, len) then + if not WAD.GetResource('TEXT/MODEL', pData, len) then begin WAD.Free(); Exit; @@ -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 @@ -358,8 +374,8 @@ begin SetLength(Gibs, ReadInt('Gibs', 'count', 0)); if (Gibs <> nil) and - (WAD.GetResource('TEXTURES', config.ReadStr('Gibs', 'resource', 'GIBS'), pData, lenpd)) and - (WAD.GetResource('TEXTURES', config.ReadStr('Gibs', 'mask', 'GIBSMASK'), pData2, lenpd2)) 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, lenpd, Gibs[a].ID, a*32, 0, 32, 32) and @@ -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;