index 393e07d6fa7f426cfad03d5b3f83f82033ed89bf..86d5b5a8be9b8d124ad79aa872302319d3d5c076 100644 (file)
interface
interface
-uses
- MAPDEF, g_textures, g_base, g_basic, g_weapons, r_graphics, utils, g_gfx,
- ImagingTypes, Imaging, ImagingUtility;
+ uses MAPDEF, g_textures, g_base, g_basic, g_weapons, utils, g_gfx;
const
A_STAND = 0;
const
A_STAND = 0;
R, G, B, Kind: Byte;
end;
R, G, B, Kind: Byte;
end;
- TModelInfo = record
- Name: String;
- Author: String;
- Description: String;
- HaveWeapon: Boolean;
- end;
-
TModelSound = record
ID: DWORD;
Level: Byte;
end;
TModelSound = record
ID: DWORD;
Level: Byte;
end;
- TGibSprite = record
- ID: DWORD;
- MaskID: DWORD;
- Rect: TRectWH;
- OnlyOne: Boolean;
- end;
-
TModelSoundArray = Array of TModelSound;
TModelSoundArray = Array of TModelSound;
- TGibsArray = Array of TGibSprite;
+
+ TGibsArray = Array of Integer;
TPlayerModel = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
TPlayerModel = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
procedure g_PlayerModel_FreeData();
function g_PlayerModel_Load(FileName: String): Boolean;
function g_PlayerModel_GetNames(): SSArray;
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_GetBlood(ModelName: String): TModelBlood;
function g_PlayerModel_Get(ModelName: String): TPlayerModel;
-function g_PlayerModel_GetAnim(ModelName: String; AnimTyp: Byte; var _Anim, _Mask: TAnimation): Boolean;
-function g_PlayerModel_GetGibs(ModelName: String; var Gibs: TGibsArray): Boolean;
+function g_PlayerModel_GetGibs (ModelID: Integer; var Gibs: TGibsArray): Boolean;
+function g_PlayerModel_GetIndex (ModelName: String): Integer;
+
+procedure g_PlayerModel_LoadFake (ModelName, FileName: String);
(* --- private data --- *)
type
TPlayerModelInfo = record
(* --- private data --- *)
type
TPlayerModelInfo = record
- Info: TModelInfo;
+ Name: String;
+ Author: String;
+ Description: String;
+ HaveWeapon: Boolean;
ModelSpeed: Array [A_STAND..A_PAIN] of Byte;
FlagPoint: TDFPoint;
FlagAngle: SmallInt;
WeaponPoints: TWeaponPoints;
ModelSpeed: Array [A_STAND..A_PAIN] of Byte;
FlagPoint: TDFPoint;
FlagAngle: SmallInt;
WeaponPoints: TWeaponPoints;
- Gibs: TGibsArray; // !!! move to render
PainSounds: TModelSoundArray;
DieSounds: TModelSoundArray;
SlopSound: Byte;
PainSounds: TModelSoundArray;
DieSounds: TModelSoundArray;
SlopSound: Byte;
implementation
uses
implementation
uses
- g_sound, g_console, SysUtils, g_player, CONFIG, r_textures, r_animations,
+ g_sound, g_console, SysUtils, g_player, CONFIG,
e_sound, g_options, g_map, Math, e_log, wadreader;
const
e_sound, g_options, g_map, Math, e_log, wadreader;
const
WeapNames: Array [WP_FIRST + 1..WP_LAST] of String =
('csaw', 'hgun', 'sg', 'ssg', 'mgun', 'rkt', 'plz', 'bfg', 'spl', 'flm');
WeapNames: Array [WP_FIRST + 1..WP_LAST] of String =
('csaw', 'hgun', 'sg', 'ssg', 'mgun', 'rkt', 'plz', 'bfg', 'spl', 'flm');
+ function g_PlayerModel_GetIndex (ModelName: String): Integer;
+ var i: Integer;
+ begin
+ Result := -1;
+ if PlayerModelsArray <> nil then
+ begin
+ i := 0;
+ while (i < Length(PlayerModelsArray)) and (PlayerModelsArray[i].Name <> ModelName) do
+ Inc(i);
+ if i < Length(PlayerModelsArray) then
+ Result := i
+ end
+ end;
+
function GetPoint(var str: String; var point: TDFPoint): Boolean;
var
a, x, y: Integer;
function GetPoint(var str: String; var point: TDFPoint): Boolean;
var
a, x, y: Integer;
end;
end;
end;
end;
-function g_PlayerModel_CalcGibSize (pData: Pointer; dataSize, x, y, w, h: Integer): TRectWH;
- var i, j: Integer; done: Boolean; img: TImageData;
-
- function IsVoid (i, j: Integer): Boolean;
- begin
- result := Byte((PByte(img.bits) + (y+j)*img.width*4 + (x+i)*4 + 3)^) = 0
- end;
-
-begin
- InitImage(img);
- assert(LoadImageFromMemory(pData, dataSize, img));
-
- (* trace x from right to left *)
- done := false; i := 0;
- while not done and (i < w) do
- begin
- j := 0;
- while (j < h) and IsVoid(i, j) do inc(j);
- done := (j < h) and (IsVoid(i, j) = false);
- result.x := i;
- inc(i);
- end;
-
- (* trace y from up to down *)
- done := false; j := 0;
- while not done and (j < h) do
- begin
- i := 0;
- while (i < w) and IsVoid(i, j) do inc(i);
- done := (i < w) and (IsVoid(i, j) = false);
- result.y := j;
- inc(j);
- end;
-
- (* trace x from right to left *)
- done := false; i := w - 1;
- while not done and (i >= 0) do
- begin
- j := 0;
- while (j < h) and IsVoid(i, j) do inc(j);
- done := (j < h) and (IsVoid(i, j) = false);
- result.width := i - result.x + 1;
- dec(i);
- end;
-
- (* trace y from down to up *)
- done := false; j := h - 1;
- while not done and (j >= 0) do
+ procedure g_PlayerModel_LoadFake (ModelName, FileName: String);
+ var id: Integer;
begin
begin
- i := 0;
- while (i < w) and IsVoid(i, j) do inc(i);
- done := (i < w) and (IsVoid(i, j) = false);
- result.height := j - result.y + 1;
- dec(j);
+ SetLength(PlayerModelsArray, Length(PlayerModelsArray) + 1);
+ id := High(PlayerModelsArray);
+ PlayerModelsArray[id].Name := ModelName;
+ PlayerModelsArray[id].HaveWeapon := False;
+ PlayerModelsArray[id].FileName := FileName;
end;
end;
- FreeImage(img);
-end;
-
function g_PlayerModel_Load(FileName: string): Boolean;
var
ID: DWORD;
function g_PlayerModel_Load(FileName: string): Boolean;
var
ID: DWORD;
- a, b, len, lenpd, lenpd2, aa, bb, f: Integer;
+ a, b, len, aa, bb, f: Integer;
cc: TDirection;
config: TConfig;
cc: TDirection;
config: TConfig;
- pData, pData2: Pointer;
+ pData: Pointer;
WAD: TWADFile;
s: string;
prefix: string;
WAD: TWADFile;
s: string;
prefix: string;
prefix := FileName+':TEXTURES\';
prefix := FileName+':TEXTURES\';
- with PlayerModelsArray[ID].Info do
- begin
- Name := s;
- Author := config.ReadStr('Model', 'author', '');
- Description := config.ReadStr('Model', 'description', '');
- end;
-
+ PlayerModelsArray[ID].Name := s;
+ PlayerModelsArray[ID].Author := config.ReadStr('Model', 'author', '');
+ PlayerModelsArray[ID].Description := config.ReadStr('Model', 'description', '');
PlayerModelsArray[ID].FileName := FileName;
with PlayerModelsArray[ID] do
begin
PlayerModelsArray[ID].FileName := FileName;
with PlayerModelsArray[ID] do
begin
GibsMask := config.ReadStr('Gibs', 'mask', 'GIBSMASK');
GibsOnce := config.ReadInt('Gibs', 'once', -1);
GibsMask := config.ReadStr('Gibs', 'mask', 'GIBSMASK');
GibsOnce := config.ReadInt('Gibs', 'once', -1);
- SetLength(Gibs, GibsCount); // !!! remove load
- if (Gibs <> nil) and
- (WAD.GetResource('TEXTURES/' + GibsResource, pData, lenpd)) and
- (WAD.GetResource('TEXTURES/' + 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
- e_CreateTextureMemEx(pData2, lenpd2, Gibs[a].MaskID, a*32, 0, 32, 32) then
- begin
- //Gibs[a].Rect := e_GetTextureSize2(Gibs[a].ID);
- Gibs[a].Rect := g_PlayerModel_CalcGibSize(pData, lenpd, a*32, 0, 32, 32);
- with Gibs[a].Rect do
- if Height > 3 then Height := Height-1-Random(2);
- Gibs[a].OnlyOne := GibsOnce = a + 1;
- end;
-
- FreeMem(pData);
- FreeMem(pData2);
- end;
-
ok := True;
for aa := WP_FIRST + 1 to WP_LAST do
for bb := A_STAND to A_LAST do
ok := True;
for aa := WP_FIRST + 1 to WP_LAST do
for bb := A_STAND to A_LAST do
end;
{if ok then g_Console_Add(Info.Name+' weapon points ok')
else g_Console_Add(Info.Name+' weapon points fail');}
end;
{if ok then g_Console_Add(Info.Name+' weapon points ok')
else g_Console_Add(Info.Name+' weapon points fail');}
- Info.HaveWeapon := ok;
+ PlayerModelsArray[ID].HaveWeapon := ok;
s := config.ReadStr('Model', 'flag_point', '');
if not GetPoint(s, FlagPoint) then
s := config.ReadStr('Model', 'flag_point', '');
if not GetPoint(s, FlagPoint) then
Result := True;
end;
Result := True;
end;
-function g_PlayerModel_Get(ModelName: String): TPlayerModel;
+function g_PlayerModel_Get (ModelName: String): TPlayerModel;
var a: Integer;
begin
Result := nil;
var a: Integer;
begin
Result := nil;
for a := 0 to High(PlayerModelsArray) do
begin
for a := 0 to High(PlayerModelsArray) do
begin
- if AnsiLowerCase(PlayerModelsArray[a].Info.Name) = AnsiLowerCase(ModelName) then
+ if AnsiLowerCase(PlayerModelsArray[a].Name) = AnsiLowerCase(ModelName) then
begin
Result := TPlayerModel.Create;
begin
Result := TPlayerModel.Create;
end;
end;
end;
end;
-function g_PlayerModel_GetAnim(ModelName: string; AnimTyp: Byte; var _Anim, _Mask: TAnimation): Boolean;
-var
- a: Integer;
- c: Boolean;
- ID: DWORD;
-begin
- Result := False;
+ function g_PlayerModel_GetGibs (ModelID: Integer; var Gibs: TGibsArray): Boolean;
+ var i, b: Integer; c: Boolean;
+ begin
+ Gibs := nil;
+ Result := False;
+ if (PlayerModelsArray = nil) or (gGibsCount = 0) then
+ Exit;
- if PlayerModelsArray = nil then Exit;
- for a := 0 to High(PlayerModelsArray) do
- if PlayerModelsArray[a].Info.Name = ModelName then
- with PlayerModelsArray[a] do
+ c := False;
+ SetLength(Gibs, gGibsCount);
+ for i := 0 to High(Gibs) do
+ begin
+ if c and (PlayerModelsArray[ModelID].GibsCount = 1) then
begin
begin
- if AnimTyp in [A_STAND, A_WALK] then c := True else c := False;
-
- if not g_Frames_Get(ID, Info.Name+'_RIGHTANIM'+IntToStr(AnimTyp)) then
- if not g_Frames_Get(ID, Info.Name+'_LEFTANIM'+IntToStr(AnimTyp)) then Exit;
-
- _Anim := TAnimation.Create(ID, c, ModelSpeed[AnimTyp]);
- _Anim.Speed := ModelSpeed[AnimTyp];
-
- if not g_Frames_Get(ID, Info.Name+'_RIGHTANIM'+IntToStr(AnimTyp)+'_MASK') then
- if not g_Frames_Get(ID, Info.Name+'_LEFTANIM'+IntToStr(AnimTyp)+'_MASK') then Exit;
-
- _Mask := TAnimation.Create(ID, c, ModelSpeed[AnimTyp]);
- _Mask.Speed := ModelSpeed[AnimTyp];
-
+ SetLength(Gibs, i);
Break;
end;
Break;
end;
- Result := True;
-end;
-
-function g_PlayerModel_GetGibs(ModelName: string; var Gibs: TGibsArray): Boolean;
-var
- a, i, b: Integer;
- c: Boolean;
-begin
- Result := False;
-
- if PlayerModelsArray = nil then Exit;
- if gGibsCount = 0 then Exit;
+ repeat
+ b := Random(PlayerModelsArray[ModelID].GibsCount);
+ until not ((PlayerModelsArray[ModelID].GibsOnce = b + 1) and c);
- c := False;
+ Gibs[i] := b;
- SetLength(Gibs, gGibsCount);
-
- for a := 0 to High(PlayerModelsArray) do
- if PlayerModelsArray[a].Info.Name = ModelName then
- begin
- for i := 0 to High(Gibs) do
- begin
- if c and (Length(PlayerModelsArray[a].Gibs) = 1) then
- begin
- SetLength(Gibs, i);
- Break;
- end;
-
- repeat
- b := Random(Length(PlayerModelsArray[a].Gibs));
- until not (PlayerModelsArray[a].Gibs[b].OnlyOne and c);
-
- Gibs[i] := PlayerModelsArray[a].Gibs[b];
-
- if Gibs[i].OnlyOne then c := True;
- end;
-
- Result := True;
- Break;
+ c := PlayerModelsArray[ModelID].GibsOnce = b + 1;
end;
end;
-end;
+ Result := True;
+ end;
function g_PlayerModel_GetNames(): SSArray;
var
function g_PlayerModel_GetNames(): SSArray;
var
for i := 0 to High(PlayerModelsArray) do
begin
SetLength(Result, Length(Result)+1);
for i := 0 to High(PlayerModelsArray) do
begin
SetLength(Result, Length(Result)+1);
- Result[High(Result)] := PlayerModelsArray[i].Info.Name;
+ Result[High(Result)] := PlayerModelsArray[i].Name;
end;
end;
end;
end;
-function g_PlayerModel_GetInfo(ModelName: string): TModelInfo;
-var
- a: Integer;
-begin
- FillChar(Result, SizeOf(Result), 0);
- if PlayerModelsArray = nil then Exit;
-
- for a := 0 to High(PlayerModelsArray) do
- if PlayerModelsArray[a].Info.Name = ModelName then
- begin
- Result := PlayerModelsArray[a].Info;
- Break;
- end;
-end;
-
function g_PlayerModel_GetBlood(ModelName: string): TModelBlood;
var
a: Integer;
function g_PlayerModel_GetBlood(ModelName: string): TModelBlood;
var
a: Integer;
if PlayerModelsArray = nil then Exit;
for a := 0 to High(PlayerModelsArray) do
if PlayerModelsArray = nil then Exit;
for a := 0 to High(PlayerModelsArray) do
- if PlayerModelsArray[a].Info.Name = ModelName then
+ if PlayerModelsArray[a].Name = ModelName then
begin
Result := PlayerModelsArray[a].Blood;
Break;
begin
Result := PlayerModelsArray[a].Blood;
Break;
procedure TPlayerModel.SetFire (Fire: Boolean);
begin
if Fire then
procedure TPlayerModel.SetFire (Fire: Boolean);
begin
if Fire then
- FFireCounter := PlayerModelsArray[FID].ModelSpeed[A_ATTACK] * PlayerModelsArray[FID].Anim[TDirection.D_RIGHT, A_ATTACK].Frames
+ FFireCounter := PlayerModelsArray[FID].ModelSpeed[A_ATTACK] * PlayerModelsArray[FID].Anim[TDirection.D_RIGHT, A_ATTACK].Frames + 1
else
FFireCounter := 0
end;
else
FFireCounter := 0
end;
function TPlayerModel.GetName (): String;
begin
function TPlayerModel.GetName (): String;
begin
- Result := PlayerModelsArray[FID].Info.Name
+ Result := PlayerModelsArray[FID].Name
end;
procedure TPlayerModel.Update;
end;
procedure TPlayerModel.Update;