📄 imgman.pas
字号:
unit ImgMan;
interface
uses
Windows, Classes, SysUtils, Mmsystem, cimllib, Grobal, IMLUtil,
cimlLibB, ClUtil, Bmputil, DGC, HUtil32;
const
DATADIR = '.\Data\';
MAXMONRACE = 300;
MAXMONMEMORY = 10 * (1024 * 1000); //1付府寸 1M 10付府
HUMANFRAME = 224;
MAGEFFECTFRAME = 24;
type
TSurfaceImage = record
px, py: Integer;
Surface: TDGCSurface;
end;
PTSurfaceImage = ^TSurfaceImage;
TBufSurfaceImage = record
px, py: Integer;
Surface: TDGCSurface;
BufSize: integer; //荤侩 滚欺 农扁
UseTime: integer; //付瘤阜 荤侩 矫埃
end;
PTBufSurfaceImage = ^TBufSurfaceImage;
TBufImgInfo = record
ImageSize: integer;
LatestTime: integer;
Surface: TDGCSurface;
end;
PTBufImgInfo = ^TBufImgInfo;
TBufImgMonInfo = record
ImageSize: integer;
LatestTime: integer;
SurfaceList: TList; //阁胶磐 Surface狼 府胶飘
end;
PTBufImgMonInfo = ^TBufImgMonInfo;
TIndexTable = record
DiskPos: LongInt;
ImageSize: LongInt;
ImgHdr: TImgLibImage;
end;
PTIndexTable = ^TIndexTable;
TIndexTableArr = array[0..65535] of TIndexTable;
TBufImgArr = array[0..MaxListSize div 4] of PTBufImgInfo;
PTBufImgArr = ^TBufImgArr;
{-------------------------------------------------------------}
TScreenImages = class //亲惑 皋葛府俊 棵妨具 窍绰 捞固瘤甸...
private
ImgHeader: TImgLibHeader;
public
dScreen: TDGCScreen;
BodyFile: string;
HairFile: string;
WeaponFile: string;
MagEffectFile: string;
ScreenFile: string;
ILBody: TList;
ILHair: TList;
ILWeapon: TList;
ILMagEffect: TList;
ILScreenImage: TList;
constructor Create;
destructor Destroy; override;
procedure Initialize;
//sex 0:female 1: male
function GetHumBody (dresstype, sex, frameindex: integer): TSurfaceImage;
function GetHumHair (hairtype, sex, frameindex: integer): TSurfaceImage;
function GetHumWeapon (weapontype, sex, frameindex: integer): TSurfaceImage;
function GetMagEffect (magictype, frameindex: integer): TSurfaceImage;
function GetScreenImage (index: integer): TDgcSurface;
end;
TLoginImages = class //Load, Free 炼沥捞 啊瓷
private
ImgHeader: TImgLibHeader;
public
dScreen: TDGCScreen;
LoginImageFile: string;
ILLogin: TList;
constructor Create;
destructor Destroy; override;
procedure Initialize;
procedure LoadImages;
procedure FreeImages;
function GetImage (index: integer): TDgcSurface;
end;
TBufferingImages = class //老沥 皋葛府父怒父
private
public
dScreen: TDGCScreen;
FileName: string;
ImageArr: PTBufImgArr; //array of PTBufImgInfo
IndexList: TList; //牢郸胶
ImageCount: integer; //Image 肮荐
MemorySize: inteter;
constructor Create;
destructor Destroy; override;
procedure Initialize;
function GetSurface (index: integer): TDGCSurface;
end;
TMonsterImage = class
private
ImgHeader: TImgLibHeader;
procedure LoadMonImages (monfile: string; surlist: TList; var imgsize: integer);
public
dScreen: TDGCScreen;
MonMemorySize: integer;
MonArr: array[0..MAXMONRACE-1] of TBufImgMonInfo; //窍唱狼 颇老俊 茄 阁胶磐
constructor Create;
destructor Destroy; override;
procedure Initialize;
function MonValid (race: integer): Boolean;
function LoadMonster (race: integer): TList;
procedure FreeMonster (race: integer);
end;
implementation
constructor TScreenImages.Create;
begin
dScreen := nil;
BodyFile := '';
HairFile := '';
WeaponFile := '';
MagEffectFile := '';
ScreenFile := '';
ILBody := TList.Create;
ILHair := TList.Create;
ILWeapon := TList.Create;
ILMagEffect := TList.Create;
ILScreenImage := TList.Create;
end;
destructor TScreenImages.Destroy;
begin
ILBody.Free;
ILHair.Free;
ILWeapon.Free;
ILMagEffect.Free;
ILScreenImage.Free;
inherited Destroy;
end;
procedure TScreenImages.Initialize;
begin
if dScreen = nil then begin
ShowMessage ('Initialize Error! TScreenImages.dScreen 汲沥 救灯澜.');
exit;
end;
if (BodyFile = '') or (HairFile = '') or (WeaponFile = '') or (MagEffectFile = '') or
(ScreenFile = '') then begin
ShowMessage ('Initialize error. no filename');
exit;
end;
LoadLibrary (BodyFile, ILBody);
LoadLibrary (HairFile, ILHair);
LoadLibrary (WeaponFile, ILWeapon);
LoadLibrary (MagEffectFile, ILMagEffect);
LoadLibrary (ScreenFile, ILScreenImage);
end;
procedure TScreenImages.LoadLibrary (flname: string; ilist: TList);
var
fhandle: integer;
stream: TFileStream;
i, j: integer;
ImgHdr: TImgLibImage;
surfaceimage: PTSurfaceImage;
begin
stream := TFileStream.Create (flname, fmOpenRead or fmShareDenyNone);
if stream <> nil then begin
stream.ReadBuffer (ImgHeader, SizeOf(TImgLibHeader));
for i:=0 to ImgHeader.ImageCount - 1 do begin
stream.ReadBuffer(ImgHdr, SizeOf(TImgLibImage) - SizeOf(PByte));
GetMem (ImgHdr.Bits, WidthBytes(ImgHdr.Width) * ImgHdr.Height);
stream.ReadBuffer(ImgHdr.Bits^, WidthBytes(ImgHdr.Width) * ImgHdr.Height);
new (surfaceimage);
with surfaceimage^ do begin
Surface := CreateSurface (dScreen, ImgHdr);
px := GetX(ImgHdr);
py := GetY(ImgHdr);
end;
ilist.Add(surfaceimage);
Dispose (ImgHdr.Bits);
end;
stream.Free;
end;
end;
//sex 0:female 1: male
function TScreenImages.GetHumBody (dresstype, sex, frameindex: integer): TSurfaceImage;
var
idx: integer;
begin
Result.Surface := nil;
idx := HUMANFRAME * dresstype * 2 + sex + frameindex;
if idx < ILBody.Count then begin
Result := ILBody[idx];
end;
end;
function TScreenImages.GetHumHair (hairtype, sex, frameindex: integer): TSurfaceImage;
var
idx: integer;
begin
Result.Surface := nil;
idx := HUMANFRAME * hairtype * 2 + sex + frameindex;
if idx < ILHair.Count then begin
Result := ILHair[idx];
end;
end;
function TScreenImages.GetHumWeapon (weapontype, sex, frameindex: integer): TSurfaceImage;
var
idx: integer;
begin
Result.Surface := nil;
idx := HUMANFRAME * weapontype * 2 + sex + frameindex;
if idx < ILWeapon.Count then begin
Result := ILWeapon[idx];
end;
end;
function TScreenImages.GetMagEffect (magictype, frameindex: integer): TSurfaceImage;
var
idx: integer;
begin
Result.Surface := nil;
idx := MAGEFFECTFRAME * magictype + frameindex;
if idx < ILMagEffect.Count then begin
Result := ILMagEffect[idx];
end;
end;
function TScreenImages.GetScreenImage (index: integer): TDgcSurface;
begin
Result := nil;
if index < ILScreenImage.Count then begin
Result := ILScreenImage[index].Surface;
end;
end;
{======================================================================}
constructor TLoginImages.Create; //Load, Free 炼沥捞 啊瓷
begin
dScreen := nil;
LoginImageFile := '';
ILLogin := TList.Create;
end;
destructor TLoginImages.Destroy;
begin
ILLogin.Free;
inherited Destroy;
end;
procedure TLoginImages.Initialize;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -