www.pudn.com > Client599.rar > ClFunc.pas


unit ClFunc; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  DXDraws, DirectX, DXClass, Grobal2, ScktComp, ExtCtrls, HUtil32, EdCode; 
 
 
const 
   DR_0      = 0; 
   DR_1      = 1; 
   DR_2      = 2; 
   DR_3      = 3; 
   DR_4      = 4; 
   DR_5      = 5; 
   DR_6      = 6; 
   DR_7      = 7; 
   DR_8      = 8; 
   DR_9      = 9; 
   DR_10      = 10; 
   DR_11      = 11; 
   DR_12      = 12; 
   DR_13      = 13; 
   DR_14      = 14; 
   DR_15      = 15; 
 
type 
   TDynamicObject = record  //¹Ù´Ú¿¡ ÈçÀû 
      X: integer;  //ij¸¯ ÁÂÇ¥°è 
      Y: integer; 
      px: integer;  //shiftx ,y 
      py: integer; 
      DSurface: TDirectDrawSurface; 
   end; 
   PTDynamicObject = ^TDynamicObject; 
 
 
var 
   DropItems: TList;  //lsit of TClientItem 
 
function  fmStr (str: string; len: integer): string; 
function  GetGoldStr (gold: integer): string; 
procedure SaveBags (flname: string; pbuf: Pbyte); 
procedure Loadbags (flname: string; pbuf: Pbyte); 
procedure ClearBag; 
function  AddItemBag (cu: TClientItem): Boolean; 
function AddMakeItem (ci: TClientItem): Boolean; // Á¦Á¶ 
function SearchOverlapItem (ci: TClientItem): Boolean; 
function MakeStrMakeItem (): string; 
function  ChangeItemCount ( mindex :integer; Count, MsgNum :word; iname :string ): Boolean; 
function  SellItemProg (remain, sellcnt :word): Boolean; 
function  UpdateItemBag (cu: TClientItem): Boolean; 
function  DelItemBag (iname: string; iindex: integer): Boolean; 
function  DelCountItemBag (iname: string; iindex: integer; Count: word): Boolean; 
procedure ArrangeItemBag; 
procedure AddDropItem (ci: TClientItem); 
function  GetDropItem (iname: string; MakeIndex: integer): PTClientItem; 
procedure DelDropItem (iname: string; MakeIndex: integer); 
procedure AddDealItem (ci: TClientItem); 
procedure ResultDealItem (ci: TClientItem; mIndex: integer; Count: word); 
procedure DelDealItem (ci: TClientItem); 
procedure MoveMakeItemToBag; 
procedure DelMakingItem (ci: TClientItem); 
procedure MoveDealItemToBag; 
procedure AddDealRemoteItem (ci: TClientItem); 
procedure DelDealRemoteItem (ci: TClientItem); 
function  GetDistance (sx, sy, dx, dy: integer): integer; 
procedure GetNextPosXY (dir: byte; var x, y:Integer); 
procedure GetNextRunXY (dir: byte; var x, y:Integer); 
function  GetNextDirection (sx, sy, dx, dy: Integer): byte; 
function  GetBack (dir: integer): integer; 
procedure GetBackPosition (sx, sy, dir: integer; var newx, newy: integer); 
procedure GetFrontPosition (sx, sy, dir: integer; var newx, newy: integer); 
function  GetFlyDirection (sx, sy, ttx, tty: integer): Integer; 
function  GetFlyDirection16 (sx, sy, ttx, tty: integer): Integer; 
function  PrivDir (ndir: integer): integer; 
function  NextDir (ndir: integer): integer; 
procedure BoldTextOut (surface: TDirectDrawSurface; x, y, fcolor, bcolor: integer; str: string); 
function  GetTakeOnPosition (smode: integer): integer; 
function  IsKeyPressed (key: byte): Boolean; 
 
procedure AddChangeFace (recogid: integer); 
procedure DelChangeFace (recogid: integer); 
function  IsChangingFace (recogid: integer): Boolean; 
 
implementation 
 
uses 
   clMain; 
 
 
function fmStr (str: string; len: integer): string; 
var i: integer; 
begin 
try 
   Result := str + ' '; 
   for i:=1 to len - Length(str)-1 do 
      Result := Result + ' '; 
except 
	Result := str + ' '; 
end; 
end; 
 
function  GetGoldStr (gold: integer): string; 
var 
   i, n: integer; 
   str: string; 
begin 
   str := IntToStr (gold); 
   n := 0; 
   Result := ''; 
   for i:=Length(str) downto 1 do begin 
      if n = 3 then begin 
         Result := str[i] + ',' + Result; 
         n := 1; 
      end else begin 
         Result := str[i] + Result; 
         Inc(n); 
      end; 
   end; 
end; 
 
procedure SaveBags (flname: string; pbuf: Pbyte); 
var 
   fhandle: integer; 
begin 
   if FileExists (flname) then 
      fhandle := FileOpen (flname, fmOpenWrite or fmShareDenyNone) 
   else fhandle := FileCreate (flname); 
   if fhandle > 0 then begin 
      FileWrite (fhandle, pbuf^, sizeof(TClientItem) * MAXBAGITEMCL); 
      FileClose (fhandle); 
   end; 
end; 
 
procedure Loadbags (flname: string; pbuf: Pbyte); 
var 
   fhandle: integer; 
begin 
   if FileExists (flname) then begin 
      fhandle := FileOpen (flname, fmOpenRead or fmShareDenyNone); 
      if fhandle > 0 then begin 
         FileRead (fhandle, pbuf^, sizeof(TClientItem) * MAXBAGITEMCL); 
         FileClose (fhandle); 
      end; 
   end; 
end; 
 
procedure ClearBag; 
var 
   i: integer; 
begin 
   for i:=0 to MAXBAGITEMCL-1 do 
      ItemArr[i].S.Name := ''; 
end; 
 
function  AddItemBag (cu: TClientItem): Boolean; 
var 
   i : integer; 
   InputCheck : Boolean; 
begin 
   Result := FALSE; 
   InputCheck := False; 
   for i:=0 to MAXBAGITEMCL-1 do begin 
      if (ItemArr[i].MakeIndex = cu.MakeIndex) and (ItemArr[i].S.Name = cu.S.Name) and 
         (ItemArr[i].S.OverlapItem < 1) then begin 
         exit;  //ˆȗ.. 
      end; 
   end; 
 
   if cu.S.Name = '' then exit; 
   if cu.S.StdMode <= 3 then begin //Æ÷¼Ç, À½½Ä, ½ºÅ©·Ñ 
      for i:=0 to 5 do 
         if ItemArr[i].S.Name = '' then begin 
            ItemArr[i] := cu; 
            Result := TRUE; 
            exit; 
         end; 
   end; 
 
   for i:=6 to MAXBAGITEMCL-1 do begin 
      if (ItemArr[i].S.OverlapItem > 0) and (ItemArr[i].S.Name = cu.S.Name) and 
          (ItemArr[i].MakeIndex = cu.MakeIndex) then begin 
//          ItemArr[i].S.ItemCount := ItemArr[i].S.ItemCount + cu.S.ItemCount; 
          ItemArr[i].Dura := ItemArr[i].Dura + cu.Dura; 
          cu.Dura := 0; 
          InputCheck := True; 
//          DScreen.AddSysMsg ('InputCheck := True;'); 
      end; 
   end; 
 
   if not InputCheck then begin 
      for i:=6 to MAXBAGITEMCL-1 do begin 
         if ItemArr[i].S.Name = '' then begin 
            ItemArr[i] := cu; 
            Result := TRUE; 
            break; 
         end; 
      end; 
   end; 
   ArrangeItembag; 
end; 
function  ChangeItemCount ( mindex :integer; Count, MsgNum :word; iname :string ): Boolean; 
var 
   i : integer; 
begin 
 
   Result := False; 
 
   // 2004/03/23 ³ë²öÀ϶§ ó¸® 
   if MovingItem.Item.S.StdMode = 7 then FrmMain.MainCancelItemMoving; 
 
   for i:=6 to MAXBAGITEMCL-1 do begin 
      if (ItemArr[i].MakeIndex = mindex) and (ItemArr[i].S.Name = iname) and 
         (ItemArr[i].S.OverlapItem > 0)  then begin 
         if Count < 1 then begin 
            ItemArr[i].S.Name := ''; 
            Count := 0; 
         end; 
         ItemArr[i].Dura := Count; 
         Result := True; 
         Break; 
      end; 
   end; 
   ArrangeItembag; 
 
   if (Result = False) and (not BoDealEnd) then begin 
      for i:=0 to 10-1 do begin 
         if (DealItems[i].S.Name = iname) and (DealItems[i].S.OverlapItem > 0) and 
            ( DealItems[i].MakeIndex = mindex ) then begin 
            if Count < 1 then begin 
               DealItems[i].S.Name := ''; 
               Count := 0; 
            end; 
            DealItems[i].Dura := Count; 
            Result := True; 
            Break; 
         end; 
      end; 
   end; 
 
   if (Result = False) and (not BoDealEnd) then begin 
      for i:=0 to 19 do begin 
         if (DealRemoteItems[i].S.Name = iname) and (DealRemoteItems[i].S.OverlapItem > 0) and 
            ( DealRemoteItems[i].MakeIndex = mindex ) then begin 
            if Count < 1 then begin 
               DealRemoteItems[i].S.Name := ''; 
               Count := 0; 
            end; 
            DealRemoteItems[i].Dura := Count; 
            Result := True; 
            Break; 
         end; 
      end; 
   end; 
 
   if MsgNum = 1 then DScreen.AddSysMsg (iname + ' found.'); 
 
end; 
 
function  SellItemProg (remain, sellcnt :word): Boolean; 
var 
   i : integer; 
begin 
 
   Result := False; 
   for i:=0 to MAXBAGITEMCL-1 do begin 
      if (ItemArr[i].MakeIndex = SellDlgItemSellWait.MakeIndex) and 
         (ItemArr[i].S.Name = SellDlgItemSellWait.S.Name) and 
         (ItemArr[i].S.OverlapItem > 0)  then begin 
         if remain < 1 then begin 
            ItemArr[i].S.Name := ''; 
            remain := 0; 
         end; 
         ItemArr[i].Dura := remain; 
         Result := True; 
      end; 
   end; 
 
end; 
 
 
function  UpdateItemBag (cu: TClientItem): Boolean; 
var 
   i: integer; 
begin 
   Result := FALSE; 
   for i:=MAXBAGITEMCL-1 downto 0 do begin 
      if (ItemArr[i].S.Name = cu.S.Name) and (ItemArr[i].MakeIndex = cu.MakeIndex) then begin 
         ItemArr[i] := cu;  //¾÷µ¥ÀÌÆ® 
         Result := TRUE; 
         break; 
      end; 
   end; 
end; 
 
function  DelItemBag (iname: string; iindex: integer): Boolean; 
var 
   i: integer; 
begin 
   Result := FALSE; 
   for i:=MAXBAGITEMCL-1 downto 0 do begin 
      if (ItemArr[i].S.Name = iname) and (ItemArr[i].MakeIndex = iindex) then begin 
         FillChar (ItemArr[i], sizeof(TClientItem), #0); 
         Result := TRUE; 
         break; 
      end; 
   end; 
   ArrangeItembag; 
end; 
 
function  DelCountItemBag (iname: string; iindex: integer; Count: word): Boolean; 
var 
   i: integer; 
begin 
   Result := FALSE; 
   for i:=MAXBAGITEMCL-1 downto 0 do begin 
      if ItemArr[i].S.Name = iname  then begin 
         if ItemArr[i].S.OverlapItem > 0 then begin 
            ItemArr[i].Dura := ItemArr[i].Dura - Count; 
            if ItemArr[i].Dura <= 0 then begin 
               ItemArr[i].S.Name := ''; 
               ItemArr[i].Dura := 0; 
            end; 
         end 
         else if ItemArr[i].MakeIndex = iindex then begin 
            FillChar (ItemArr[i], sizeof(TClientItem), #0); 
            Result := TRUE; 
            break; 
         end; 
      end; 
   end; 
   ArrangeItembag; 
end; 
procedure ArrangeItemBag; 
var 
   i, k: integer; 
begin 
   //Áߺ¹µÈ ¾ÆÀÌÅÛÀÌ ÀÖÀ¸¸é ¾ø¾Ø´Ù. 
   for i:=0 to MAXBAGITEMCL-1 do begin 
      if ItemArr[i].S.Name <> '' then begin 
         for k:=i+1 to MAXBAGITEMCL-1 do begin 
            if (ItemArr[i].S.Name = ItemArr[k].S.Name) and (ItemArr[i].MakeIndex = ItemArr[k].MakeIndex) then begin 
               if ItemArr[i].S.OverlapItem > 0 then begin 
                  ItemArr[i].Dura := ItemArr[i].Dura + ItemArr[k].Dura; 
                  FillChar (ItemArr[k], sizeof(TClientItem), #0); 
               end 
               else begin 
                  FillChar (ItemArr[k], sizeof(TClientItem), #0); 
               end; 
            end; 
         end; 
         if (ItemArr[i].S.Name = MovingItem.Item.S.Name) and (ItemArr[i].MakeIndex = MovingItem.Item.MakeIndex) and 
            (ItemArr[i].S.OverlapItem < 1) then begin 
            MovingItem.Index := 0; 
            MovingItem.Item.S.Name := ''; 
         end; 
      end; 
   end; 
 
   //°¡¹æÀÇ ¾Èº¸ÀÌ´Â ºÎºÐ¿¡ ÀÖÀ¸¸é ²ø¾î ¿Ã¸°´Ù. 
   for i:=46 to MAXBAGITEMCL-1 do begin 
      if ItemArr[i].S.Name <> '' then begin 
         for k:=6 to 45 do begin 
            if ItemArr[k].S.Name = '' then begin 
               ItemArr[k] := ItemArr[i]; 
               ItemArr[i].S.Name := ''; 
               break; 
            end; 
         end; 
      end; 
   end; 
end; 
 
{----------------------------------------------------------} 
 
procedure AddDropItem (ci: TClientItem); 
var 
   pc: PTClientItem; 
begin 
   new (pc); 
   pc^ := ci; 
   DropItems.Add (pc); 
end; 
 
function  GetDropItem (iname: string; MakeIndex: integer): PTClientItem; 
var 
   i: integer; 
begin 
   Result := nil; 
   for i:=0 to DropItems.Count-1 do begin 
      if (PTClientItem(DropItems[i]).S.Name = iname) and (PTClientItem(DropItems[i]).MakeIndex = MakeIndex) then begin 
         Result := PTClientItem(DropItems[i]); 
         break; 
      end; 
   end; 
end; 
 
procedure DelDropItem (iname: string; MakeIndex: integer); 
var 
   i: integer; 
begin 
   for i:=0 to DropItems.Count-1 do begin 
      if (PTClientItem(DropItems[i]).S.Name = iname) and (PTClientItem(DropItems[i]).MakeIndex = MakeIndex) then begin 
         Dispose (PTClientItem(DropItems[i])); 
         DropItems.Delete (i); 
         break; 
      end; 
   end; 
end; 
 
{----------------------------------------------------------} 
 
procedure ResultDealItem (ci: TClientItem; mIndex: integer; Count: word); 
var 
   i: integer; 
begin 
   for i:=0 to 10-1 do begin 
 
      if (DealItems[i].S.Name = ci.S.Name) and (DealItems[i].S.OverlapItem > 0) then begin 
         if (DealItems[i].S.Name = ci.S.Name) and (DealItems[i].MakeIndex = mIndex) then 
         DealItems[i].Dura := DealItems[i].Dura + ci.Dura; 
            DealItems[i].MakeIndex := mIndex; 
         break; 
      end 
      else if DealItems[i].S.Name = '' then begin 
         DealItems[i] := ci; 
         DealItems[i].MakeIndex := mIndex; 
         break; 
      end; 
   end; 
 
   for i:=0 to MAXBAGITEMCL-1 do begin 
      if  (ItemArr[i].S.Name = ci.S.Name) and (ItemArr[i].S.OverlapItem > 0) and 
          (ItemArr[i].MakeIndex = ci.MakeIndex) then begin 
         if Count < 1 then begin 
            ItemArr[i].S.Name := ''; 
            Count := 0; 
         end; 
         ItemArr[i].Dura := Count; 
      end; 
   end; 
 
end; 
{procedure AddDealItem (ci: TClientItem); 
var 
   i: integer; 
begin 
   for i:=0 to 10-1 do begin 
      if DealItems[i].S.Name = '' then begin 
         DealItems[i] := ci; 
         break; 
      end; 
   end; 
end;} 
// ±³È¯=>°ãÄ¡±â 
procedure AddDealItem (ci: TClientItem); 
var 
   i: integer; 
begin 
   for i:=0 to 10-1 do begin 
      if (DealItems[i].S.Name = ci.S.Name) and (DealItems[i].S.OverlapItem > 0) then begin 
         DealItems[i].Dura := DealItems[i].Dura + ci.Dura; 
         break; 
      end 
      else if DealItems[i].S.Name = '' then begin 
         DealItems[i] := ci; 
         break; 
      end; 
   end; 
end; 
 
 
function AddMakeItem (ci: TClientItem): Boolean; 
var 
   i: integer; 
begin 
   Result := False; 
   for i:=0 to 5 do begin 
      if (MakeItemArr[i].S.Name = ci.S.Name) and (MakeItemArr[i].S.OverlapItem > 0) then begin 
         MakeItemArr[i].Dura := MakeItemArr[i].Dura + ci.Dura; 
         Result := True; 
         break; 
      end 
      else if MakeItemArr[i].S.Name = '' then begin 
         MakeItemArr[i] := ci; 
         if MakeItemArr[i].S.OverlapItem < 1 then begin 
            MovingItem.Item.S.Name := ''; 
            ItemMoving := FALSE; 
         end; 
         Result := True; 
         break; 
      end; 
   end; 
end; 
 
function SearchOverlapItem (ci: TClientItem): Boolean; 
var 
   i: integer; 
begin 
   Result := False; 
   for i:=0 to 5 do begin 
      if (MakeItemArr[i].S.Name = ci.S.Name) and (MakeItemArr[i].S.OverlapItem > 0) then begin 
         Result := True; 
         Break; 
      end 
   end; 
end; 
 
function MakeStrMakeItem (): string; 
var 
   i: integer; 
   data : string; 
begin 
   data := ''; 
   for i:=0 to 5 do begin 
      if MakeItemArr[i].S.Name <> ''  then begin 
         data := data + IntToStr( MakeItemArr[i].MakeIndex ) + ':'; 
         data := data + MakeItemArr[i].S.Name + ':'; 
         if MakeItemArr[i].S.OverlapItem > 0 then data := data + IntToStr( MakeItemArr[i].Dura ) + '/' 
         else data := data + '1/'; 
      end; 
   end; 
   Result := data; 
end; 
 
procedure MoveMakeItemToBag; 
var 
   i: integer; 
begin 
   for i:=0 to 5 do begin 
      if MakeItemArr[i].S.Name <> '' then 
         AddItemBag (MakeItemArr[i]); 
         MakeItemArr[i].S.Name := ''; 
   end; 
//   FrmDlg.CancelItemMoving; 
//   FillChar (DealItems, sizeof(TClientItem)*10, #0); 
end; 
 
 
procedure DelDealItem (ci: TClientItem); 
var 
   i: integer; 
begin 
   for i:=0 to 10-1 do begin 
      if (DealItems[i].S.Name = ci.S.Name) and (DealItems[i].MakeIndex = ci.MakeIndex) then begin 
         FillChar (DealItems[i], sizeof(TClientItem), #0); 
         break; 
      end; 
   end; 
end; 
 
procedure DelMakingItem (ci: TClientItem); 
var 
   i: integer; 
begin 
   for i:=0 to 5 do begin 
      if (MakeItemArr[i].S.Name = ci.S.Name) and (MakeItemArr[i].MakeIndex = ci.MakeIndex) then begin 
         FillChar (MakeItemArr[i], sizeof(TClientItem), #0); 
         break; 
      end; 
   end; 
end; 
procedure MoveDealItemToBag; 
var 
   i: integer; 
begin 
   for i:=0 to 10-1 do begin 
      if (DealItems[i].S.Name <> '') then 
         if DealItems[i].S.OverlapItem <= 0 then AddItemBag (DealItems[i]); 
   end; 
   FillChar (DealItems, sizeof(TClientItem)*10, #0); 
end; 
 
procedure AddDealRemoteItem (ci: TClientItem); 
var 
   i: integer; 
begin 
   for i:=0 to 20-1 do begin 
      if (DealRemoteItems[i].S.Name = ci.S.Name) and (ci.S.OverlapItem > 0) then begin 
         DealRemoteItems[i].MakeIndex := ci.MakeIndex; 
 
      end 
      else if DealRemoteItems[i].S.Name = '' then begin 
         DealRemoteItems[i] := ci; 
         break; 
      end; 
   end; 
end; 
 
procedure DelDealRemoteItem (ci: TClientItem); 
var 
   i: integer; 
begin 
   for i:=0 to 20-1 do begin 
      if (DealRemoteItems[i].S.Name = ci.S.Name) and (DealRemoteItems[i].MakeIndex = ci.MakeIndex) then begin 
         FillChar (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; 
 
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: 
         Result := U_DRESS; 
      15,16: 
         Result := U_HELMET; 
      19,20,21: 
         Result := U_NECKLACE; 
      22,23: 
         Result := U_RINGL; 
      24, 26: 
         Result := U_ARMRINGR; 
      // 2003/03/15 ¾ÆÀÌÅÛ Àκ¥Å丮 È®Àå 25->26 
//    26: 
//       Result := U_ARMRINGL; 
      30: 
         Result := U_RIGHTHAND; 
      // 2003/03/15 ¾ÆÀÌÅÛ Àκ¥Å丮 È®Àå 
      25: 
         Result := U_BUJUK; 
      54: 
         Result := U_BELT; 
      52: 
         Result := U_BOOTS; 
      53: 
         Result := U_CHARM; 
 
   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 
   ChangeFaceReadyList.Add (pointer(recogid)); 
end; 
 
procedure DelChangeFace (recogid: integer); 
var 
   i: integer; 
begin 
   for i:=0 to ChangeFaceReadyList.Count-1 do begin 
      if integer(ChangeFaceReadyList[i]) = recogid then begin 
         ChangeFaceReadyList.Delete (i); 
         break; 
      end; 
   end; 
end; 
 
function  IsChangingFace (recogid: integer): Boolean; 
var 
   i: integer; 
begin 
   Result := FALSE; 
   for i:=0 to ChangeFaceReadyList.Count-1 do begin 
      if integer(ChangeFaceReadyList[i]) = recogid then begin 
         Result := TRUE; 
         break; 
      end; 
   end; 
end; 
 
 
Initialization 
DropItems := TList.Create; 
 
Finalization 
DropItems.Free; 
 
 
end.