From 76e01bd65fd627b1e2333f8a48ea3de573a4a994 Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Fri, 28 Sep 2018 00:51:35 +0300 Subject: [PATCH] Added blood color to player's model description --- src/game/g_player.pas | 14 ++++++++----- src/game/g_playermodel.pas | 42 +++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/game/g_player.pas b/src/game/g_player.pas index 94c2871..3785553 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -1611,11 +1611,13 @@ procedure g_Player_CreateGibs(fX, fY: Integer; ModelName: string; fColor: TRGB); var a: Integer; GibsArray: TGibsArray; + Blood: TModelBlood; begin if (gGibs = nil) or (Length(gGibs) = 0) then Exit; if not g_PlayerModel_GetGibs(ModelName, GibsArray) then Exit; + Blood := g_PlayerModel_GetBlood(ModelName); for a := 0 to High(GibsArray) do with gGibs[CurrentGib] do @@ -1634,7 +1636,7 @@ begin if gBloodCount > 0 then g_GFX_Blood(fX, fY, 16*gBloodCount+Random(5*gBloodCount), -16+Random(33), -16+Random(33), - Random(48), Random(48), 150, 0, 0); + Random(48), Random(48), Blood.R, Blood.G, Blood.B, Blood.Kind); if CurrentGib >= High(gGibs) then CurrentGib := 0 @@ -3518,11 +3520,11 @@ begin g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)+8, FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2), Count div 2, 3, -1, 16, (PLAYER_RECT.Height*2 div 3), - 150, 0, 0); + FModel.Blood.R, FModel.Blood.G, FModel.Blood.B, FModel.Blood.Kind); g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-8, FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2), Count div 2, -3, -1, 16, (PLAYER_RECT.Height*2) div 3, - 150, 0, 0); + FModel.Blood.R, FModel.Blood.G, FModel.Blood.B, FModel.Blood.Kind); end; procedure TPlayer.MakeBloodVector(Count: Word; VelX, VelY: Integer); @@ -3530,7 +3532,7 @@ begin g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2), FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2), Count, VelX, VelY, 16, (PLAYER_RECT.Height*2) div 3, - 150, 0, 0); + FModel.Blood.R, FModel.Blood.G, FModel.Blood.B, FModel.Blood.Kind); end; procedure TPlayer.QueueWeaponSwitch(Weapon: Byte); @@ -6317,6 +6319,7 @@ end; procedure TCorpse.Damage(Value: Word; vx, vy: Integer); var pm: TPlayerModel; + Blood: TModelBlood; begin if FState = CORPSE_STATE_REMOVEME then Exit; @@ -6349,12 +6352,13 @@ begin end else begin + Blood := g_PlayerModel_GetBlood(FModelName); FObj.Vel.X := FObj.Vel.X + vx; FObj.Vel.Y := FObj.Vel.Y + vy; g_GFX_Blood(FObj.X+PLAYER_CORPSERECT.X+(PLAYER_CORPSERECT.Width div 2), FObj.Y+PLAYER_CORPSERECT.Y+(PLAYER_CORPSERECT.Height div 2), Value, vx, vy, 16, (PLAYER_CORPSERECT.Height*2) div 3, - 150, 0, 0); + Blood.R, Blood.G, Blood.B, Blood.Kind); end; end; diff --git a/src/game/g_playermodel.pas b/src/game/g_playermodel.pas index af85837..acc89b2 100644 --- a/src/game/g_playermodel.pas +++ b/src/game/g_playermodel.pas @@ -21,7 +21,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 @@ -65,6 +65,10 @@ type HaveWeapon: Boolean; end; + TModelBlood = record + R, G, B, Kind: Byte; + end; + TModelSound = record ID: DWORD; Level: Byte; @@ -88,6 +92,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 +131,7 @@ type public property Color: TRGB read FColor write FColor; + property Blood: TModelBlood read FBlood; end; procedure g_PlayerModel_LoadData(); @@ -133,6 +139,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; @@ -156,6 +163,7 @@ type PainSounds: TModelSoundArray; DieSounds: TModelSoundArray; SlopSound: Byte; + Blood: TModelBlood; end; const @@ -432,6 +440,19 @@ 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_SPARKS; + else + Blood.Kind := BLOOD_NORMAL + end + end; + for b := A_STAND to A_LAST do begin aname := s+'_RIGHTANIM'+IntToStr(b); @@ -643,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 @@ -785,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; -- 2.29.2