⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 envir.~pas

📁 M2原代码 M2原代码
💻 ~PAS
📖 第 1 页 / 共 4 页
字号:
unit Envir;

interface

uses
  Windows, SysUtils, Classes, Grobal2;
type
  TMapHeader = packed record
    wWidth      :Word;
    wHeight     :Word;
    sTitle      :String[16];
    UpdateDate  :TDateTime;
    Reserved    :array[0..22] of Char;
  end;
  TMapUnitInfo = packed record
    wBkImg        :Word;  //32768 $8000 为禁止移动区域
    wMidImg       :Word;
    wFrImg        :Word;
    btDoorIndex   :Byte;  //$80 (巩娄), 巩狼 侥喊 牢郸胶
    btDoorOffset  :Byte;  //摧腮 巩狼 弊覆狼 惑措 困摹, $80 (凯覆/摧塞(扁夯))
    btAniFrame    :Byte;      //$80(Draw Alpha) +  橇贰烙 荐
    btAniTick     :Byte;
    btArea        :Byte;        //瘤开 沥焊
    btLight       :Byte;       //0..1..4 堡盔 瓤苞
  end;
  pTMapUnitInfo =^TMapUnitInfo;
  TMap = array[0..1000 * 1000 -1] of TMapUnitInfo;
  pTMap = ^TMap;
  TMapCellinfo = record
    chFlag   :Byte;
    bt1      :Byte;
    bt2      :Byte;
    bt3      :Byte;
    ObjList  :TList;
  end;
  pTMapCellinfo =^TMapCellinfo;

  TEnvirnoment = class
    sMapName           :String; //0x4
    sMapDesc           :String;
    MapCellArray       :array of TMapCellinfo; //0x0C
    nMinMap            :Integer; //0x10
    nServerIndex       :Integer; //0x14
    nRequestLevel      :Integer; //0x18 进入本地图所需等级
    m_nWidth           :Integer; //0x1C
    m_nHeight          :Integer; //0x20
    m_boDARK           :Boolean; //0x24
    m_boDAY            :Boolean; //0x25
    m_boDarkness       :Boolean;
    m_boDayLight       :Boolean;
    m_DoorList         :TList;   //0x28
    bo2C               :Boolean;
    m_boSAFE           :Boolean; //0x2D
    m_boFightZone      :Boolean; //0x2E
    m_boFight3Zone     :Boolean; //0x2F  //行会战争地图
    m_boQUIZ           :Boolean; //0x30
    m_boNORECONNECT    :Boolean; //0x31
    m_boNEEDHOLE       :Boolean; //0x32
    m_boNORECALL       :Boolean; //0x33
    m_boNOGUILDRECALL  :Boolean;
    m_boNODEARRECALL   :Boolean;
    m_boNOMASTERRECALL :Boolean;
    m_boNORANDOMMOVE   :Boolean; //0x34
    m_boNODRUG         :Boolean; //0x35
    m_boMINE           :Boolean; //0x36
    m_boNOPOSITIONMOVE :Boolean; //0x37
    sNoReconnectMap    :String;  //0x38
    QuestNPC           :TObject;  //0x3C
    nNEEDSETONFlag     :Integer;  //0x40
    nNeedONOFF         :Integer;  //0x44
    m_QuestList        :TList;   //0x48
    m_boRUNHUMAN       :Boolean;  //可以穿人
    m_boRUNMON         :Boolean;  //可以穿怪
    m_boINCHP          :Boolean;  //自动加HP值
    m_boINCGAMEGOLD    :Boolean;  //自动减游戏币
    m_boINCGAMEPOINT   :Boolean;  //自动加点
    m_boDECHP          :Boolean;  //自动减HP值
    m_boDECGAMEGOLD    :Boolean;  //自动减游戏币
    m_boDECGAMEPOINT   :Boolean;  //自动减点
    m_boMUSIC          :Boolean;  //音乐
    m_boEXPRATE        :Boolean;  //杀怪经验倍数
    m_boPKWINLEVEL     :Boolean;  //PK得等级
    m_boPKWINEXP       :Boolean;  //PK得经验
    m_boPKLOSTLEVEL    :Boolean;  //PK丢等级
    m_boPKLOSTEXP      :Boolean;  //PK丢经验
    m_nPKWINLEVEL      :Integer;  //PK得等级数
    m_nPKLOSTLEVEL     :Integer;  //PK丢等级
    m_nPKWINEXP        :Integer;  //PK得经验数
    m_nPKLOSTEXP       :Integer;  //PK丢经验
    m_nDECHPTIME       :Integer;  //减HP间隔时间
    m_nDECHPPOINT      :Integer;  //一次减点数
    m_nINCHPTIME       :Integer;  //加HP间隔时间
    m_nINCHPPOINT      :Integer;  //一次加点数
    m_nDECGAMEGOLDTIME :Integer;  //减游戏币间隔时间
    m_nDECGAMEGOLD     :Integer;  //一次减数量
    m_nDECGAMEPOINTTIME :Integer;  //减游戏点间隔时间
    m_nDECGAMEPOINT     :Integer;  //一次减数量
    m_nINCGAMEGOLDTIME :Integer;  //加游戏币间隔时间
    m_nINCGAMEGOLD     :Integer;  //一次加数量
    m_nINCGAMEPOINTTIME :Integer;  //加游戏币间隔时间
    m_nINCGAMEPOINT     :Integer;  //一次加数量
    m_nMUSICID         :Integer;  //音乐ID
    m_nEXPRATE         :Integer;  //经验倍率
    m_nMonCount        :Integer;
    m_nHumCount        :Integer;
  private
    procedure Initialize(nWidth, nHeight: Integer);
  public
    constructor Create();
    destructor Destroy; override;
    function AddToMap(nX,nY:Integer;btType:Byte;pRemoveObject:TObject):Pointer;
    function CanWalk (nX,nY:Integer;boFlag:Boolean):Boolean;
    function CanWalkOfItem (nX,nY:Integer;boFlag,boItem:Boolean):Boolean;
    function CanWalkEx (nX,nY:Integer;boFlag:Boolean):Boolean;
    function CanFly (nsX,nsY,ndX,ndY:integer):Boolean;    
    function MoveToMovingObject(nCX, nCY: integer; Cert: TObject; nX,nY: Integer; boFlag: Boolean): Integer;
    function GetItem(nX, nY: Integer): PTMapItem;
    function DeleteFromMap(nX,nY:Integer;btType:Byte;pRemoveObject:TObject):Integer;
    function IsCheapStuff():Boolean;
    procedure AddDoorToMap;
    function  AddToMapMineEvent(nX,nY:Integer;nType:Integer;Event:TObject):TObject;
    function  LoadMapData(sMapFile:String):Boolean;
    function  CreateQuest(nFlag,nValue:Integer;s24,s28,s2C:String;boGrouped:Boolean):Boolean;
    function  GetMapCellInfo(nX,nY:Integer;var MapCellInfo:pTMapCellinfo):Boolean;
    function  GetXYObjCount(nX,nY:Integer):Integer;
    function  GetNextPosition(sx, sy, ndir,nFlag:Integer;var snx:Integer;var sny:Integer):Boolean;
    function  sub_4B5FC8(nX,nY:Integer):Boolean;
    procedure VerifyMapTime(nX,nY:Integer;BaseObject:TObject);
    function  CanSafeWalk(nX,nY:Integer):Boolean;
    function  ArroundDoorOpened(nX,nY:Integer):Boolean;
    function  GetMovingObject(nX,nY:Integer;boFlag:Boolean):Pointer;
    function  GetQuestNPC(BaseObject:TObject;sCharName,sStr:String;boFlag:Boolean):TObject;
    function  GetItemEx(nX,nY:Integer;var nCount:Integer):Pointer;
    function  GetDoor(nX,nY:Integer):pTDoorInfo;
    function  IsValidObject(nX,nY:Integer;nRage:Integer;BaseObject:TObject):Boolean;
    function  GetRangeBaseObject(nX,nY:Integer;nRage:Integer;boFlag:Boolean;BaseObjectList:TList):Integer;
    function  GetBaseObjects(nX,nY:Integer;boFlag:Boolean;BaseObjectList:TList):Integer;
    function  GetEvent(nX,nY:Integer):TObject;
    procedure SetMapXYFlag(nX,nY:Integer;boFlag:Boolean);
    function  GetXYHuman(nMapX, nMapY: Integer):Boolean;
    function  GetEnvirInfo():String;
    procedure AddObject(nType:Integer);
    procedure DelObjectCount(BaseObject:TObject);
    property  MonCount:Integer read m_nMonCount;
    property  HumCount:Integer read m_nHumCount;
  end;
  TMapManager = class(TGList)  //004B52B0
  private
  public
    constructor Create();
    destructor Destroy; override;  
    procedure LoadMapDoor();
    function AddMapInfo(sMapName, sMapDesc: String; nServerNumber: Integer;MapFlag:pTMapFlag;QuestNPC: TObject):TEnvirnoment;
    function GetMapInfo(nServerIdx: Integer;sMapName: String): TEnvirnoment;
    function AddMapRoute(sSMapNO:String;nSMapX,nSMapY:Integer;sDMapNO:String;nDMapX,nDMapY:Integer):Boolean;
    function GetMapOfServerIndex(sMapName:String):Integer;
    function FindMap(sMapName:String):TEnvirnoment;
    procedure ReSetMinMap();
    procedure Run();
    procedure ProcessMapDoor();
  end;
implementation

uses ObjBase, ObjNpc, M2Share, Event, ObjMon, HUtil32, Castle;

{ TEnvirList }

//004B7038
function TMapManager.AddMapInfo(sMapName, sMapDesc: String; nServerNumber:Integer;MapFlag:pTMapFlag;QuestNPC: TObject):TEnvirnoment;
var
  Envir:TEnvirnoment;
  i:Integer;
begin
  Result:=nil;
  Envir:=TEnvirnoment.Create;
  Envir.sMapName           :=sMapName;
  Envir.sMapDesc           :=sMapDesc;
  Envir.nServerIndex       :=nServerNumber;
  Envir.m_boSAFE           :=MapFlag.boSAFE;
  Envir.m_boFightZone      :=MapFlag.boFIGHT;
  Envir.m_boFight3Zone     :=MapFlag.boFIGHT3;
  Envir.m_boDARK           :=MapFlag.boDARK;
  Envir.m_boDAY            :=MapFlag.boDAY;
  Envir.m_boQUIZ           :=MapFlag.boQUIZ;
  Envir.m_boNORECONNECT    :=MapFlag.boNORECONNECT;
  Envir.m_boNEEDHOLE       :=MapFlag.boNEEDHOLE;
  Envir.m_boNORECALL       :=MapFlag.boNORECALL;
  Envir.m_boNOGUILDRECALL  :=MapFlag.boNOGUILDRECALL;
  Envir.m_boNODEARRECALL   :=MapFlag.boNODEARRECALL;
  Envir.m_boNOMASTERRECALL :=MapFlag.boNOMASTERRECALL;
  Envir.m_boNORANDOMMOVE   :=MapFlag.boNORANDOMMOVE;
  Envir.m_boNODRUG         :=MapFlag.boNODRUG;
  Envir.m_boMINE           :=MapFlag.boMINE;
  Envir.m_boNOPOSITIONMOVE :=MapFlag.boNOPOSITIONMOVE;
  
  Envir.m_boRUNHUMAN       :=MapFlag.boRUNHUMAN;  //可以穿人
  Envir.m_boRUNMON         :=MapFlag.boRUNMON;  //可以穿怪
  Envir.m_boDECHP          :=MapFlag.boDECHP;  //自动减HP值
  Envir.m_boINCHP          :=MapFlag.boINCHP;  //自动加HP值
  Envir.m_boDECGAMEGOLD    :=MapFlag.boDECGAMEGOLD;  //自动减游戏币
  Envir.m_boDECGAMEPOINT   :=MapFlag.boDECGAMEPOINT;  //自动减游戏币
  Envir.m_boINCGAMEGOLD    :=MapFlag.boINCGAMEGOLD;  //自动加游戏币
  Envir.m_boINCGAMEPOINT   :=MapFlag.boINCGAMEPOINT;  //自动加游戏点
  Envir.m_boMUSIC          :=MapFlag.boMUSIC;  //音乐
  Envir.m_boEXPRATE        :=MapFlag.boEXPRATE;  //杀怪经验倍数
  Envir.m_boPKWINLEVEL     :=MapFlag.boPKWINLEVEL;  //PK得等级
  Envir.m_boPKWINEXP       :=MapFlag.boPKWINEXP;  //PK得经验
  Envir.m_boPKLOSTLEVEL    :=MapFlag.boPKLOSTLEVEL;
  Envir.m_boPKLOSTEXP      :=MapFlag.boPKLOSTEXP;
  Envir.m_nPKWINLEVEL      :=MapFlag.nPKWINLEVEL;  //PK得等级数
  Envir.m_nPKWINEXP        :=MapFlag.nPKWINEXP;  //PK得经验数
  Envir.m_nPKLOSTLEVEL     :=MapFlag.nPKLOSTLEVEL;
  Envir.m_nPKLOSTEXP       :=MapFlag.nPKLOSTEXP;
  Envir.m_nPKWINEXP        :=MapFlag.nPKWINEXP;  //PK得经验数
  Envir.m_nDECHPTIME       :=MapFlag.nDECHPTIME;  //减HP间隔时间
  Envir.m_nDECHPPOINT      :=MapFlag.nDECHPPOINT;  //一次减点数
  Envir.m_nINCHPTIME       :=MapFlag.nINCHPTIME;  //加HP间隔时间
  Envir.m_nINCHPPOINT      :=MapFlag.nINCHPPOINT;  //一次加点数
  Envir.m_nDECGAMEGOLDTIME :=MapFlag.nDECGAMEGOLDTIME;  //减游戏币间隔时间
  Envir.m_nDECGAMEGOLD     :=MapFlag.nDECGAMEGOLD;  //一次减数量
  Envir.m_nINCGAMEGOLDTIME :=MapFlag.nINCGAMEGOLDTIME;  //减游戏币间隔时间
  Envir.m_nINCGAMEGOLD     :=MapFlag.nINCGAMEGOLD;  //一次减数量
  Envir.m_nINCGAMEPOINTTIME :=MapFlag.nINCGAMEPOINTTIME;  //减游戏币间隔时间
  Envir.m_nINCGAMEPOINT     :=MapFlag.nINCGAMEPOINT;  //一次减数量
  Envir.m_nMUSICID         :=MapFlag.nMUSICID;  //音乐ID
  Envir.m_nEXPRATE         :=MapFlag.nEXPRATE;  //经验倍率

  Envir.sNoReconnectMap    :=MapFlag.sReConnectMap;
  Envir.QuestNPC           :=QuestNPC;
  Envir.nNEEDSETONFlag     :=MapFlag.nNEEDSETONFlag;
  Envir.nNeedONOFF         :=MapFlag.nNeedONOFF;
  
  for i:=0 to MiniMapList.Count -1 do begin
    if CompareText(MiniMapList.Strings[i],Envir.sMapName) = 0 then begin
      Envir.nMinMap:=Integer(MiniMapList.Objects[i]);
      break;
    end;
  end;
  if Envir.LoadMapData(g_Config.sMapDir + sMapName + '.map') then begin
    Result:=Envir;
    Self.Add(Envir);
  end else begin
    MainOutMessage('地图文件 ' + g_Config.sMapDir + sMapName + '.map' + ' 未找到!!!');
  end;
end;
//004B7280
function TMapManager.AddMapRoute(sSMapNO:String;nSMapX,nSMapY:Integer;sDMapNO:String;nDMapX,nDMapY:Integer):Boolean;
var
  GateObj:pTGateObj;
  SEnvir:TEnvirnoment;
  DEnvir:TEnvirnoment;
begin
  Result:=False;
  SEnvir:=FindMap(sSMapNO);
  DEnvir:=FindMap(sDMapNO);
  if (SEnvir <> nil) and (DEnvir <> nil) then begin
    New(GateObj);
    GateObj.boFlag:=False;
    GateObj.DEnvir:=DEnvir;
    GateObj.nDMapX:=nDMapX;
    GateObj.nDMapY:=nDMapY;
    SEnvir.AddToMap(nSMapX,nSMapY,OS_GATEOBJECT,TObject(GateObj));
    Result:=True;
  end;

end;
//004B63E4
function TEnvirnoment.AddToMap(nX, nY: Integer; btType: Byte;
  pRemoveObject: TObject):Pointer;
var
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  MapItem:PTMapItem;
  i:integer;
  nGoldCount:Integer;
  bo1E:Boolean;
  btRaceServer:Byte;
ResourceString
  sExceptionMsg = '[Exception] TEnvirnoment::AddToMap';
begin
  Result:=nil;
  try
    bo1E:=False;
    if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo.chFlag = 0) then begin
      if MapCellInfo.ObjList = nil then begin
        MapCellInfo.ObjList:=TList.Create;
      end else begin
        if btType = OS_ITEMOBJECT then begin
          if PTMapItem(pRemoveObject).Name = sSTRING_GOLDNAME then begin
            for i:=0 to MapCellInfo.ObjList.Count -1 do begin
              OSObject:=MapCellInfo.ObjList.Items[i];
              if OSObject.btType = OS_ITEMOBJECT then begin
                MapItem:=PTMapItem(pTOSObject(MapCellInfo.ObjList.Items[i]).CellObj);
                if MapItem.Name = sSTRING_GOLDNAME then begin
                  nGoldCount:=MapItem.Count + PTMapItem(pRemoveObject).Count;
                  if nGoldCount <= 2000 then begin
                    MapItem.Count:= nGoldCount;
                    MapItem.Looks:= GetGoldShape(nGoldCount);
                    MapItem.AniCount:=0;
                    MapItem.Reserved:=0;
                    OSObject.dwAddTime:=GetTickCount();
                    Result:=MapItem;
                    bo1E:=True;
                  end;
                end;
              end;
            end;//004B653D
          end;//004B653D
          if not bo1E and (MapCellInfo.ObjList.Count >= 5) then begin
            Result:=nil;
            bo1E:=True;
          end;//004B6558
        end;//004B6558
        if btType = OS_EVENTOBJECT then begin

        end;
      end;//004B655C
      if not bo1E then begin
        New(OSObject);
        OSObject.btType:=btType;
        OSObject.CellObj:=pRemoveObject;
        OSObject.dwAddTime:=GetTickCount();
        MapCellInfo.ObjList.Add(OSObject);
        Result:=Pointer(pRemoveObject);

        if (btType = OS_MOVINGOBJECT) and (not TBaseObject(pRemoveObject).m_boAddToMaped) then begin
          TBaseObject(pRemoveObject).m_boDelFormMaped:=False;
          TBaseObject(pRemoveObject).m_boAddToMaped:=True;
          btRaceServer:=TBaseObject(pRemoveObject).m_btRaceServer;
          if btRaceServer = RC_PLAYOBJECT then Inc(m_nHumCount);
          if btRaceServer >= RC_ANIMAL then Inc(m_nMonCount);
        end;
        
      end;//004B659F

    end;//004B659F
  except
    MainOutMessage(sExceptionMsg);
  end;
end;

procedure TEnvirnoment.AddDoorToMap(); //004B6A74
var
  i:integer;
  Door:pTDoorInfo;
begin
  for i:=0 to m_DoorList.Count -1 do begin
    Door:=m_DoorList.Items[i];
    AddToMap(Door.nX,Door.nY,OS_DOOR,TObject(Door));
  end;
end;
function TEnvirnoment.GetMapCellInfo(nX,nY:Integer;var MapCellInfo:pTMapCellinfo):Boolean;//004B57D8
begin
  if (nX >= 0) and (nX < m_nWidth) and (nY >= 0) and (nY < m_nHeight) then begin
    MapCellInfo:=@MapCellArray[nX * m_nHeight + nY];
    Result:=True;
  end else begin//004B5829
    Result:=False;
  end;
end;
function TEnvirnoment.MoveToMovingObject (nCX, nCY:integer;Cert:TObject;nX,nY:Integer;boFlag:Boolean):Integer;//004B612C
var
  MapCellInfo:pTMapCellinfo;
  BaseObject:TBaseObject;
  OSObject:pTOSObject;
  i:Integer;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -