X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_playermodel.pas;h=be268e299d7d87f7e8aaef28d64b9b3a2a90c40b;hb=1bddfaf7b6421f1659a6f211dfdb1dfaef5d5173;hp=9e42436ec5a4440f619ec289298c2cf20444f451;hpb=a4f25c41dfd783a925aa2dab4b9b84753d5c3f18;p=d2df-sdl.git diff --git a/src/game/g_playermodel.pas b/src/game/g_playermodel.pas index 9e42436..be268e2 100644 --- a/src/game/g_playermodel.pas +++ b/src/game/g_playermodel.pas @@ -1,4 +1,4 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* 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 @@ -20,7 +20,8 @@ unit g_playermodel; interface uses - MAPDEF, g_textures, g_basic, g_weapons, e_graphics, wadreader; + {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} + MAPDEF, g_textures, g_basic, g_weapons, e_graphics, utils; const A_STAND = 0; @@ -79,16 +80,16 @@ type TGibsArray = Array of TGibSprite; TWeaponPoints = Array [WP_FIRST + 1..WP_LAST] of Array [A_STAND..A_LAST] of - Array [D_LEFT..D_RIGHT] of Array of TDFPoint; + Array [TDirection.D_LEFT..TDirection.D_RIGHT] of Array of TDFPoint; - TPlayerModel = class (TObject) + TPlayerModel = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} private FName: String; FDirection: TDirection; FColor: TRGB; FCurrentAnimation: Byte; - FAnim: Array [D_LEFT..D_RIGHT] of Array [A_STAND..A_LAST] of TAnimation; - FMaskAnim: Array [D_LEFT..D_RIGHT] of Array [A_STAND..A_LAST] of TAnimation; + 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; FWeaponPoints: TWeaponPoints; FPainSounds: TModelSoundArray; FDieSounds: TModelSoundArray; @@ -129,17 +130,18 @@ type procedure g_PlayerModel_LoadData(); procedure g_PlayerModel_FreeData(); function g_PlayerModel_Load(FileName: String): Boolean; -function g_PlayerModel_GetNames(): SArray; +function g_PlayerModel_GetNames(): SSArray; function g_PlayerModel_GetInfo(ModelName: String): TModelInfo; 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; + implementation uses g_main, g_sound, g_console, SysUtils, g_player, CONFIG, - GL, GLExt, e_sound, g_options, g_map, Math, e_log; + GL, GLExt, e_sound, g_options, g_map, Math, e_log, wadreader; type TPlayerModelInfo = record @@ -258,7 +260,7 @@ begin begin X := X - WEAPONBASE[weapon].X; Y := Y - WEAPONBASE[weapon].Y; - if dir = D_LEFT then + if dir = TDirection.D_LEFT then X := -X; end; end; @@ -305,7 +307,7 @@ begin begin for W := WP_FIRST + 1 to WP_LAST do begin - for D := D_LEFT to D_RIGHT do + for D := TDirection.D_LEFT to TDirection.D_RIGHT do begin SetLength(WeaponPoints[W, AIdx, D], Length(WeaponPoints[W, OIdx, D])); for I := 0 to High(WeaponPoints[W, AIdx, D]) do @@ -327,7 +329,7 @@ var prefix: string; ok, chk: Boolean; begin - e_WriteLog(Format('Loading player model: %s', [ExtractFileName(FileName)]), MSG_NOTIFY); + e_WriteLog(Format('Loading player model: %s', [ExtractFileName(FileName)]), TMsgType.Notify); Result := False; @@ -397,7 +399,7 @@ begin for aa := WP_FIRST + 1 to WP_LAST do for bb := A_STAND to A_LAST do - for cc := D_LEFT to D_RIGHT do + for cc := TDirection.D_LEFT to TDirection.D_RIGHT do begin f := config.ReadInt(AnimNames[bb], 'frames', 1); if config.ReadBool(AnimNames[bb], 'backanim', False) then @@ -478,69 +480,69 @@ begin for bb := A_STAND to A_LAST do if not (bb in [A_DIE1, A_DIE2, A_PAIN]) then begin - chk := GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[aa]+'_points', ''), aa, bb, D_RIGHT, + chk := GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[aa]+'_points', ''), aa, bb, TDirection.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, + chk := GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[WEAPON_PLASMA]+'_points', ''), aa, bb, TDirection.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 + for f := 0 to High(WeaponPoints[aa, bb, TDirection.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); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X, 6); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].Y, 8); end; A_WALKATTACK, A_WALK: begin - Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 9); - Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 9); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X, 9); + Dec(WeaponPoints[aa, bb, TDirection.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); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X, 5); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].Y, 8); end; A_WALKSEEUP, A_SEEUP: begin - Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 5); - Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 16); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X, 5); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].Y, 16); end; A_WALKSEEDOWN, A_SEEDOWN: begin - Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 6); - Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 5); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X, 6); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].Y, 5); end; A_WALKATTACKUP, A_ATTACKUP: begin - Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 5); - Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 16); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X, 5); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].Y, 16); end; A_WALKATTACKDOWN, A_ATTACKDOWN: begin - Dec(WeaponPoints[aa, bb, D_RIGHT, f].X, 6); - Dec(WeaponPoints[aa, bb, D_RIGHT, f].Y, 4); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X, 6); + Dec(WeaponPoints[aa, bb, TDirection.D_RIGHT, f].Y, 4); end; end; end; end; ok := ok and (chk or (bb > A_LASTBASE)); - if not GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[aa]+'2_points', ''), aa, bb, D_LEFT, + if not GetWeapPoints(config.ReadStr(AnimNames[bb], WeapNames[aa]+'2_points', ''), aa, bb, TDirection.D_LEFT, config.ReadInt(AnimNames[bb], 'frames', 0), config.ReadBool(AnimNames[bb], 'backanim', False), WeaponPoints) then - for f := 0 to High(WeaponPoints[aa, bb, D_RIGHT]) do + for f := 0 to High(WeaponPoints[aa, bb, TDirection.D_RIGHT]) do begin - WeaponPoints[aa, bb, D_LEFT, f].X := -WeaponPoints[aa, bb, D_RIGHT, f].X; - WeaponPoints[aa, bb, D_LEFT, f].Y := WeaponPoints[aa, bb, D_RIGHT, f].Y; + WeaponPoints[aa, bb, TDirection.D_LEFT, f].X := -WeaponPoints[aa, bb, TDirection.D_RIGHT, f].X; + WeaponPoints[aa, bb, TDirection.D_LEFT, f].Y := WeaponPoints[aa, bb, TDirection.D_RIGHT, f].Y; end; if not ok then Break; @@ -590,18 +592,18 @@ begin Exit; end; - Result.FAnim[D_RIGHT][b] := TAnimation.Create(ID, b in [A_STAND, A_WALK], ModelSpeed[b]); + Result.FAnim[TDirection.D_RIGHT][b] := TAnimation.Create(ID, b in [A_STAND, A_WALK], ModelSpeed[b]); - Result.FMaskAnim[D_RIGHT][b] := TAnimation.Create(ID2, b in [A_STAND, A_WALK], ModelSpeed[b]); + Result.FMaskAnim[TDirection.D_RIGHT][b] := TAnimation.Create(ID2, b in [A_STAND, A_WALK], ModelSpeed[b]); if g_Frames_Exists(Info.Name+'_LEFTANIM'+IntToStr(b)) and g_Frames_Exists(Info.Name+'_LEFTANIM'+IntToStr(b)+'_MASK') then if g_Frames_Get(ID, Info.Name+'_LEFTANIM'+IntToStr(b)) and g_Frames_Get(ID2, Info.Name+'_LEFTANIM'+IntToStr(b)+'_MASK') then begin - Result.FAnim[D_LEFT][b] := TAnimation.Create(ID, b in [A_STAND, A_WALK], ModelSpeed[b]); + Result.FAnim[TDirection.D_LEFT][b] := TAnimation.Create(ID, b in [A_STAND, A_WALK], ModelSpeed[b]); - Result.FMaskAnim[D_LEFT][b] := TAnimation.Create(ID2, b in [A_STAND, A_WALK], ModelSpeed[b]); + Result.FMaskAnim[TDirection.D_LEFT][b] := TAnimation.Create(ID2, b in [A_STAND, A_WALK], ModelSpeed[b]); end; end; @@ -691,7 +693,7 @@ begin end; end; -function g_PlayerModel_GetNames(): SArray; +function g_PlayerModel_GetNames(): SSArray; var i: DWORD; begin @@ -731,7 +733,7 @@ begin for c := W_ACT_NORMAL to W_ACT_FIRE do e_DeleteTexture(WeaponID[a][b][c]); - e_WriteLog('Releasing models...', MSG_NOTIFY); + e_WriteLog('Releasing models...', TMsgType.Notify); if PlayerModelsArray = nil then Exit; @@ -773,17 +775,17 @@ begin FCurrentAnimation := Animation; - if (FDirection = D_LEFT) and - (FAnim[D_LEFT][FCurrentAnimation] <> nil) and - (FMaskAnim[D_LEFT][FCurrentAnimation] <> nil) then + if (FDirection = TDirection.D_LEFT) and + (FAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) and + (FMaskAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) then begin - FAnim[D_LEFT][FCurrentAnimation].Reset; - FMaskAnim[D_LEFT][FCurrentAnimation].Reset; + FAnim[TDirection.D_LEFT][FCurrentAnimation].Reset; + FMaskAnim[TDirection.D_LEFT][FCurrentAnimation].Reset; end else begin - FAnim[D_RIGHT][FCurrentAnimation].Reset; - FMaskAnim[D_RIGHT][FCurrentAnimation].Reset; + FAnim[TDirection.D_RIGHT][FCurrentAnimation].Reset; + FMaskAnim[TDirection.D_RIGHT][FCurrentAnimation].Reset; end; end; @@ -793,10 +795,10 @@ var begin for a := A_STAND to A_LAST do begin - FAnim[D_LEFT][a].Free(); - FMaskAnim[D_LEFT][a].Free(); - FAnim[D_RIGHT][a].Free(); - FMaskAnim[D_RIGHT][a].Free(); + FAnim[TDirection.D_LEFT][a].Free(); + FMaskAnim[TDirection.D_LEFT][a].Free(); + FAnim[TDirection.D_RIGHT][a].Free(); + FMaskAnim[TDirection.D_RIGHT][a].Free(); end; inherited; @@ -809,29 +811,29 @@ var p: TDFPoint; begin // Ôëàãè: - if Direction = D_LEFT then - Mirror := M_NONE + if Direction = TDirection.D_LEFT then + Mirror := TMirrorType.None else - Mirror := M_HORIZONTAL; + Mirror := TMirrorType.Horizontal; if (FFlag <> FLAG_NONE) and (FFlagAnim <> nil) and (not (FCurrentAnimation in [A_DIE1, A_DIE2])) then begin - p.X := IfThen(Direction = D_LEFT, + p.X := IfThen(Direction = TDirection.D_LEFT, FLAG_BASEPOINT.X, 64-FLAG_BASEPOINT.X); p.Y := FLAG_BASEPOINT.Y; - FFlagAnim.DrawEx(X+IfThen(Direction = D_LEFT, FFlagPoint.X-1, 2*FLAG_BASEPOINT.X-FFlagPoint.X+1)-FLAG_BASEPOINT.X, + FFlagAnim.DrawEx(X+IfThen(Direction = TDirection.D_LEFT, FFlagPoint.X-1, 2*FLAG_BASEPOINT.X-FFlagPoint.X+1)-FLAG_BASEPOINT.X, Y+FFlagPoint.Y-FLAG_BASEPOINT.Y+1, Mirror, p, - IfThen(FDirection = D_RIGHT, FFlagAngle, -FFlagAngle)); + IfThen(FDirection = TDirection.D_RIGHT, FFlagAngle, -FFlagAngle)); end; // Îðóæèå: - if Direction = D_RIGHT then - Mirror := M_NONE + if Direction = TDirection.D_RIGHT then + Mirror := TMirrorType.None else - Mirror := M_HORIZONTAL; + Mirror := TMirrorType.Horizontal; if FDrawWeapon and (not (FCurrentAnimation in [A_DIE1, A_DIE2, A_PAIN])) and @@ -854,38 +856,38 @@ begin if Alpha < 201 then e_Draw(WeaponID[FCurrentWeapon][pos][act], X+FWeaponPoints[FCurrentWeapon, FCurrentAnimation, FDirection, - FAnim[D_RIGHT][FCurrentAnimation].CurrentFrame].X, + FAnim[TDirection.D_RIGHT][FCurrentAnimation].CurrentFrame].X, Y+FWeaponPoints[FCurrentWeapon, FCurrentAnimation, FDirection, - FAnim[D_RIGHT][FCurrentAnimation].CurrentFrame].Y, + FAnim[TDirection.D_RIGHT][FCurrentAnimation].CurrentFrame].Y, 0, True, False, Mirror); end; // Ìîäåëü: - if (FDirection = D_LEFT) and - (FAnim[D_LEFT][FCurrentAnimation] <> nil) then + if (FDirection = TDirection.D_LEFT) and + (FAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) then begin - FAnim[D_LEFT][FCurrentAnimation].Alpha := Alpha; - FAnim[D_LEFT][FCurrentAnimation].Draw(X, Y, M_NONE); + FAnim[TDirection.D_LEFT][FCurrentAnimation].Alpha := Alpha; + FAnim[TDirection.D_LEFT][FCurrentAnimation].Draw(X, Y, TMirrorType.None); end else begin - FAnim[D_RIGHT][FCurrentAnimation].Alpha := Alpha; - FAnim[D_RIGHT][FCurrentAnimation].Draw(X, Y, Mirror); + FAnim[TDirection.D_RIGHT][FCurrentAnimation].Alpha := Alpha; + FAnim[TDirection.D_RIGHT][FCurrentAnimation].Draw(X, Y, Mirror); end; // Ìàñêà ìîäåëè: e_Colors := FColor; - if (FDirection = D_LEFT) and - (FMaskAnim[D_LEFT][FCurrentAnimation] <> nil) then + if (FDirection = TDirection.D_LEFT) and + (FMaskAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) then begin - FMaskAnim[D_LEFT][FCurrentAnimation].Alpha := Alpha; - FMaskAnim[D_LEFT][FCurrentAnimation].Draw(X, Y, M_NONE); + FMaskAnim[TDirection.D_LEFT][FCurrentAnimation].Alpha := Alpha; + FMaskAnim[TDirection.D_LEFT][FCurrentAnimation].Draw(X, Y, TMirrorType.None); end else begin - FMaskAnim[D_RIGHT][FCurrentAnimation].Alpha := Alpha; - FMaskAnim[D_RIGHT][FCurrentAnimation].Draw(X, Y, Mirror); + FMaskAnim[TDirection.D_RIGHT][FCurrentAnimation].Alpha := Alpha; + FMaskAnim[TDirection.D_RIGHT][FCurrentAnimation].Draw(X, Y, Mirror); end; e_Colors.R := 255; @@ -895,18 +897,18 @@ end; function TPlayerModel.GetCurrentAnimation: TAnimation; begin - if (FDirection = D_LEFT) and (FAnim[D_LEFT][FCurrentAnimation] <> nil) then - Result := FAnim[D_LEFT][FCurrentAnimation] + if (FDirection = TDirection.D_LEFT) and (FAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) then + Result := FAnim[TDirection.D_LEFT][FCurrentAnimation] else - Result := FAnim[D_RIGHT][FCurrentAnimation]; + Result := FAnim[TDirection.D_RIGHT][FCurrentAnimation]; end; function TPlayerModel.GetCurrentAnimationMask: TAnimation; begin - if (FDirection = D_LEFT) and (FMaskAnim[D_LEFT][FCurrentAnimation] <> nil) then - Result := FMaskAnim[D_LEFT][FCurrentAnimation] + if (FDirection = TDirection.D_LEFT) and (FMaskAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) then + Result := FMaskAnim[TDirection.D_LEFT][FCurrentAnimation] else - Result := FMaskAnim[D_RIGHT][FCurrentAnimation]; + Result := FMaskAnim[TDirection.D_RIGHT][FCurrentAnimation]; end; function TPlayerModel.PlaySound(SoundType, Level: Byte; X, Y: Integer): Boolean; @@ -973,7 +975,7 @@ procedure TPlayerModel.SetFire(Fire: Boolean); begin FFire := Fire; - if FFire then FFireCounter := FAnim[D_RIGHT, A_ATTACK].Speed*FAnim[D_RIGHT, A_ATTACK].TotalFrames + if FFire then FFireCounter := FAnim[TDirection.D_RIGHT, A_ATTACK].Speed*FAnim[TDirection.D_RIGHT, A_ATTACK].TotalFrames else FFireCounter := 0; end; @@ -1002,11 +1004,11 @@ end; procedure TPlayerModel.Update(); begin - if (FDirection = D_LEFT) and (FAnim[D_LEFT][FCurrentAnimation] <> nil) then - FAnim[D_LEFT][FCurrentAnimation].Update else FAnim[D_RIGHT][FCurrentAnimation].Update; + if (FDirection = TDirection.D_LEFT) and (FAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) then + FAnim[TDirection.D_LEFT][FCurrentAnimation].Update else FAnim[TDirection.D_RIGHT][FCurrentAnimation].Update; - if (FDirection = D_LEFT) and (FMaskAnim[D_LEFT][FCurrentAnimation] <> nil) then - FMaskAnim[D_LEFT][FCurrentAnimation].Update else FMaskAnim[D_RIGHT][FCurrentAnimation].Update; + if (FDirection = TDirection.D_LEFT) and (FMaskAnim[TDirection.D_LEFT][FCurrentAnimation] <> nil) then + FMaskAnim[TDirection.D_LEFT][FCurrentAnimation].Update else FMaskAnim[TDirection.D_RIGHT][FCurrentAnimation].Update; if FFlagAnim <> nil then FFlagAnim.Update;