📄 clfunc.pas
字号:
g_DealItems[i] := ci;
break;
end;
end;
end;
procedure DelDealItem (ci: TClientItem);
var
i: integer;
begin
for i:=0 to 10-1 do begin
if (g_DealItems[i].S.Name = ci.S.Name) and (g_DealItems[i].MakeIndex = ci.MakeIndex) then begin
FillChar (g_DealItems[i], sizeof(TClientItem), #0);
break;
end;
end;
end;
procedure MoveRefineItemToBag;
var
I,II: integer;
boAdded:Boolean;
begin
for i:=0 to 10-1 do begin
if g_RefineItems[i].S.Name <> '' then begin
boAdded:=FALSE;
if g_RefineItems[i].S.StdMode = 45 then begin //only stdmode 45 stacks
for II:=0 to MAXBAGITEMCL-1 do begin
if (g_ItemArr[II].MakeIndex = g_RefineItems[I].MakeIndex) and (g_ItemArr[II].S.Name = g_RefineItems[I].S.Name) then begin
inc(g_ItemArr[II].Amount,g_RefineItems[I].Amount);
boAdded:=TRUE;
continue;
end;
end;
end;
if boAdded = FALSE then
AddItemBag (g_RefineItems[i]);
end;
end;
FillChar (g_RefineItems, sizeof(TClientItem)*16, #0);
end;
procedure MoveDealItemToBag;
var
I,II: integer;
boAdded:Boolean;
begin
for i:=0 to 10-1 do begin
if g_DealItems[i].S.Name <> '' then begin
boAdded:=FALSE;
if g_DealItems[i].S.StdMode = 45 then begin //only stdmode 45 stacks
for II:=0 to MAXBAGITEMCL-1 do begin
if (g_ItemArr[II].MakeIndex = g_DealItems[I].MakeIndex) and (g_ItemArr[II].S.Name = g_DealItems[I].S.Name) then begin
inc(g_ItemArr[II].Amount,g_DealItems[I].Amount);
boAdded:=TRUE;
continue;
end;
end;
end;
if boAdded = FALSE then
AddItemBag (g_DealItems[i]);
end;
end;
FillChar (g_DealItems, sizeof(TClientItem)*10, #0);
end;
procedure AddDealRemoteItem (ci: TClientItem);
var
i: integer;
begin
for i:=0 to 20-1 do begin
if g_DealRemoteItems[i].S.Name = '' then begin
g_DealRemoteItems[i] := ci;
break;
end;
end;
end;
procedure DelDealRemoteItem (ci: TClientItem);
var
i: integer;
begin
for i:=0 to 20-1 do begin
if (g_DealRemoteItems[i].S.Name = ci.S.Name) and (g_DealRemoteItems[i].MakeIndex = ci.MakeIndex) then begin
FillChar (g_DealRemoteItems[i], sizeof(TClientItem), #0);
break;
end;
end;
end;
{----------------------------------------------------------}
function GetDistance (sx, sy, dx, dy: integer): integer;
begin
Result := _MAX(abs(sx-dx), abs(sy-dy));
end;
procedure GetNextPosXY (dir: byte; var x, y:Integer);
begin
case dir of
DR_UP: begin x := x; y := y-1; end;
DR_UPRIGHT: begin x := x+1; y := y-1; end;
DR_RIGHT: begin x := x+1; y := y; end;
DR_DOWNRIGHT: begin x := x+1; y := y+1; end;
DR_DOWN: begin x := x; y := y+1; end;
DR_DOWNLEFT: begin x := x-1; y := y+1; end;
DR_LEFT: begin x := x-1; y := y; end;
DR_UPLEFT: begin x := x-1; y := y-1; end;
end;
end;
procedure GetNextRunXY (dir: byte; var x, y:Integer);
begin
case dir of
DR_UP: begin x := x; y := y-2; end;
DR_UPRIGHT: begin x := x+2; y := y-2; end;
DR_RIGHT: begin x := x+2; y := y; end;
DR_DOWNRIGHT: begin x := x+2; y := y+2; end;
DR_DOWN: begin x := x; y := y+2; end;
DR_DOWNLEFT: begin x := x-2; y := y+2; end;
DR_LEFT: begin x := x-2; y := y; end;
DR_UPLEFT: begin x := x-2; y := y-2; end;
end;
end;
procedure GetNextHorseRunXY (dir: byte; var x, y:Integer);
begin
case dir of
DR_UP: begin x := x; y := y-3; end;
DR_UPRIGHT: begin x := x+3; y := y-3; end;
DR_RIGHT: begin x := x+3; y := y; end;
DR_DOWNRIGHT: begin x := x+3; y := y+3; end;
DR_DOWN: begin x := x; y := y+3; end;
DR_DOWNLEFT: begin x := x-3; y := y+3; end;
DR_LEFT: begin x := x-3; y := y; end;
DR_UPLEFT: begin x := x-3; y := y-3; end;
end;
end;
function GetNextDirection (sx, sy, dx, dy: Integer): byte;
var
flagx, flagy: integer;
begin
Result := DR_DOWN;
if sx < dx then flagx := 1
else if sx = dx then flagx := 0
else flagx := -1;
if abs(sy-dy) > 2
then if (sx >= dx-1) and (sx <= dx+1) then flagx := 0;
if sy < dy then flagy := 1
else if sy = dy then flagy := 0
else flagy := -1;
if abs(sx-dx) > 2 then if (sy > dy-1) and (sy <= dy+1) then flagy := 0;
if (flagx = 0) and (flagy = -1) then Result := DR_UP;
if (flagx = 1) and (flagy = -1) then Result := DR_UPRIGHT;
if (flagx = 1) and (flagy = 0) then Result := DR_RIGHT;
if (flagx = 1) and (flagy = 1) then Result := DR_DOWNRIGHT;
if (flagx = 0) and (flagy = 1) then Result := DR_DOWN;
if (flagx = -1) and (flagy = 1) then Result := DR_DOWNLEFT;
if (flagx = -1) and (flagy = 0) then Result := DR_LEFT;
if (flagx = -1) and (flagy = -1) then Result := DR_UPLEFT;
end;
function GetBack (dir: integer): integer;
begin
Result := DR_UP;
case dir of
DR_UP: Result := DR_DOWN;
DR_DOWN: Result := DR_UP;
DR_LEFT: Result := DR_RIGHT;
DR_RIGHT: Result := DR_LEFT;
DR_UPLEFT: Result := DR_DOWNRIGHT;
DR_UPRIGHT: Result := DR_DOWNLEFT;
DR_DOWNLEFT: Result := DR_UPRIGHT;
DR_DOWNRIGHT: Result := DR_UPLEFT;
end;
end;
procedure GetBackPosition (sx, sy, dir: integer; var newx, newy: integer);
begin
newx := sx;
newy := sy;
case dir of
DR_UP: newy := newy+1;
DR_DOWN: newy := newy-1;
DR_LEFT: newx := newx+1;
DR_RIGHT: newx := newx-1;
DR_UPLEFT:
begin
newx := newx + 1;
newy := newy + 1;
end;
DR_UPRIGHT:
begin
newx := newx - 1;
newy := newy + 1;
end;
DR_DOWNLEFT:
begin
newx := newx + 1;
newy := newy - 1;
end;
DR_DOWNRIGHT:
begin
newx := newx - 1;
newy := newy - 1;
end;
end;
end;
procedure GetFrontPosition (sx, sy, dir: integer; var newx, newy: integer);
begin
newx := sx;
newy := sy;
case dir of
DR_UP: newy := newy-1;
DR_DOWN: newy := newy+1;
DR_LEFT: newx := newx-1;
DR_RIGHT: newx := newx+1;
DR_UPLEFT:
begin
newx := newx - 1;
newy := newy - 1;
end;
DR_UPRIGHT:
begin
newx := newx + 1;
newy := newy - 1;
end;
DR_DOWNLEFT:
begin
newx := newx - 1;
newy := newy + 1;
end;
DR_DOWNRIGHT:
begin
newx := newx + 1;
newy := newy + 1;
end;
end;
end;
function GetFlyDirection (sx, sy, ttx, tty: integer): Integer;
var
fx, fy: Real;
begin
fx := ttx - sx;
fy := tty - sy;
sx := 0;
sy := 0;
Result := DR_DOWN;
if fx=0 then begin
if fy < 0 then Result := DR_UP
else Result := DR_DOWN;
exit;
end;
if fy=0 then begin
if fx < 0 then Result := DR_LEFT
else Result := DR_RIGHT;
exit;
end;
if (fx > 0) and (fy < 0) then begin
if -fy > fx*2.5 then Result := DR_UP
else if -fy < fx/3 then Result := DR_RIGHT
else Result := DR_UPRIGHT;
end;
if (fx > 0) and (fy > 0) then begin
if fy < fx/3 then Result := DR_RIGHT
else if fy > fx*2.5 then Result := DR_DOWN
else Result := DR_DOWNRIGHT;
end;
if (fx < 0) and (fy > 0) then begin
if fy < -fx/3 then Result := DR_LEFT
else if fy > -fx*2.5 then Result := DR_DOWN
else Result := DR_DOWNLEFT;
end;
if (fx < 0) and (fy < 0) then begin
if -fy > -fx*2.5 then Result := DR_UP
else if -fy < -fx/3 then Result := DR_LEFT
else Result := DR_UPLEFT;
end;
end;
function GetFlyDirection16 (sx, sy, ttx, tty: integer): Integer;
var
fx, fy: Real;
begin
fx := ttx - sx;
fy := tty - sy;
sx := 0;
sy := 0;
Result := 0;
if fx=0 then begin
if fy < 0 then Result := 0
else Result := 8;
exit;
end;
if fy=0 then begin
if fx < 0 then Result := 12
else Result := 4;
exit;
end;
if (fx > 0) and (fy < 0) then begin
Result := 4;
if -fy > fx/4 then Result := 3;
if -fy > fx/1.9 then Result := 2;
if -fy > fx*1.4 then Result := 1;
if -fy > fx*4 then Result := 0;
end;
if (fx > 0) and (fy > 0) then begin
Result := 4;
if fy > fx/4 then Result := 5;
if fy > fx/1.9 then Result := 6;
if fy > fx*1.4 then Result := 7;
if fy > fx*4 then Result := 8;
end;
if (fx < 0) and (fy > 0) then begin
Result := 12;
if fy > -fx/4 then Result := 11;
if fy > -fx/1.9 then Result := 10;
if fy > -fx*1.4 then Result := 9;
if fy > -fx*4 then Result := 8;
end;
if (fx < 0) and (fy < 0) then begin
Result := 12;
if -fy > -fx/4 then Result := 13;
if -fy > -fx/1.9 then Result := 14;
if -fy > -fx*1.4 then Result := 15;
if -fy > -fx*4 then Result := 0;
end;
end;
function PrivDir (ndir: integer): integer;
begin
if ndir - 1 < 0 then Result := 7
else Result := ndir-1;
end;
function NextDir (ndir: integer): integer;
begin
if ndir + 1 > 7 then Result := 0
else Result := ndir+1;
end;
procedure BoldTextOut (surface: TDirectDrawSurface; x, y, fcolor, bcolor: integer; str: string);
begin
with surface do begin
Canvas.Font.Color := bcolor;
Canvas.TextOut (x-1, y, str);
Canvas.TextOut (x+1, y, str);
Canvas.TextOut (x, y-1, str);
Canvas.TextOut (x, y+1, str);
Canvas.Font.Color := fcolor;
Canvas.TextOut (x, y, str);
end;
end;
function GetTakeOnPosition (smode: integer): integer;
begin
Result := -1;
case smode of //StdMode
5, 6 :Result := U_WEAPON; //武器
10, 11, 12 :Result := U_DRESS;//盔甲
15,16 :Result := U_HELMET; //头盔
19,20,21 :Result := U_NECKLACE; //项链
22,23 :Result := U_RINGR; //戒指
24,26 :Result := U_ARMRINGR;
30,28,29 :Result := U_RIGHTHAND;
25,51 :Result := U_BUJUK; //符
52,62 :Result := U_BOOTS; //鞋
53,63 :Result := U_CHARM; //宝石
54,64 :Result := U_BELT; //腰带
end;
end;
function IsKeyPressed (key: byte): Boolean;
var
keyvalue: TKeyBoardState;
begin
Result := FALSE;
FillChar(keyvalue, sizeof(TKeyboardState), #0);
if GetKeyboardState (keyvalue) then
if (keyvalue[key] and $80) <> 0 then
Result := TRUE;
end;
procedure AddChangeFace (recogid: integer);
begin
g_ChangeFaceReadyList.Add (pointer(recogid));
end;
procedure DelChangeFace (recogid: integer);
var
i: integer;
begin
for i:=0 to g_ChangeFaceReadyList.Count-1 do begin
if integer(g_ChangeFaceReadyList[i]) = recogid then begin
g_ChangeFaceReadyList.Delete (i);
break;
end;
end;
end;
function IsChangingFace (recogid: integer): Boolean;
var
i: integer;
begin
Result := FALSE;
for i:=0 to g_ChangeFaceReadyList.Count-1 do begin
if integer(g_ChangeFaceReadyList[i]) = recogid then begin
Result := TRUE;
break;
end;
end;
end;
procedure LoadDecoList(); //00488CDC
var
I,n14:Integer;
s18,s20,s24:String;
LoadList:TStringList;
sFileName:String;
Decoration:pTDecoItem;
begin
g_DecoList:= TList.create;
sFileName:= 'Data\DecoItem.txt';
if FileExists(sFileName) then begin
LoadList:=TStringList.Create;
LoadList.LoadFromFile(sFileName);
s24:='';
for I := 0 to LoadList.Count - 1 do begin
s18:=Trim(LoadList.Strings[I]);
if (s18 <> '') and (s18[1] <> ';') then begin
new(Decoration);
s18:=GetValidStr3(s18,s20,[' ',#9]);
n14:=Str_ToInt(Trim(s20),0);
Decoration.Appr := n14;
s18:=GetValidStr3(s18,s20,[' ',#9]);
Decoration.Name := s20;
s18:=GetValidStr3(s18,s20,[' ',#9]);
n14:=Str_ToInt(Trim(s20),0);
Decoration.Location := n14;
n14:=Str_ToInt(Trim(s18),0);
Decoration.Price := n14;
g_DecoList.Add(Decoration);
end;
end; // for
LoadList.Free;
end;
end;
function FindDecoration(Number:integer):pTDecoItem;
var
i:integer;
begin
result := nil;
for i:= 0 to g_DecoList.count -1 do begin
if pTDecoItem(g_DecoList[i]).Appr = Number then begin
result := g_DecoList[i];
exit;
end;
end;
end;
Initialization
begin
{---- Adjust global SVN revision ----}
SVNRevision('$Id: ClFunc.pas 562 2007-01-19 16:33:33Z sean $');
DropItems := TList.Create;
end
Finalization
DropItems.Free;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -