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

📄 envir.pas

📁 原版翎风(LF)引擎(M2)源码(Delphi)
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  Door: pTDoorInfo;
resourcestring
  sExceptionMsg = '[Exception] TEnvirnoment::ArroundDoorOpened ';
begin
  Result := True;
  try
    for i := 0 to m_DoorList.Count - 1 do
    begin
      Door := m_DoorList.Items[i];
      if (abs(Door.nX - nX) <= 1) and ((abs(Door.nY - nY) <= 1)) then
      begin
        if not Door.Status.boOpened then
        begin
          Result := False;
          Break;
        end;
      end;
    end;
  except
    MainOutMessage(sExceptionMsg);
  end;
end;

function TEnvirnoment.GetMovingObject(nX, nY: Integer; boFlag: Boolean): Pointer; //004B5838
var
  i: Integer;
  MapCellInfo: pTMapCellinfo;
  OSObject: pTOSObject;
  BaseObject: TBaseObject;
begin
  Result := nil;
  if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
  begin
    for i := 0 to MapCellInfo.ObjList.Count - 1 do
    begin
      OSObject := MapCellInfo.ObjList.Items[i];
      if OSObject.btType = OS_MOVINGOBJECT then
      begin
        BaseObject := TBaseObject(OSObject.CellObj);
        if ((BaseObject <> nil) and
          (not BaseObject.m_boGhost) and
          (BaseObject.bo2B9)) and
          ((not boFlag) or (not BaseObject.m_boDeath)) then
        begin

          Result := BaseObject;
          Break;
        end;
      end;
    end;
  end;
end;

function TEnvirnoment.GetQuestNPC(BaseObject: TObject; sCharName, sItem: string; boFlag: Boolean): TObject; //004B6E4C
var
  i: Integer;
  MapQuestFlag: pTMapQuestInfo;
  nFlagValue: Integer;
  bo1D: Boolean;
begin
  Result := nil;
  for i := 0 to m_QuestList.Count - 1 do
  begin
    MapQuestFlag := m_QuestList.Items[i];
    nFlagValue := TBaseObject(BaseObject).GetQuestFalgStatus(MapQuestFlag.nFlag);

    if nFlagValue = MapQuestFlag.nValue then
    begin
      if (boFlag = MapQuestFlag.boGrouped) or (not boFlag) then
      begin
        bo1D := False;
        if (MapQuestFlag.sMonName <> '') and (MapQuestFlag.sItemName <> '') then
        begin
          if (MapQuestFlag.sMonName = sCharName) and (MapQuestFlag.sItemName = sItem) then
            bo1D := True;
        end;
        if (MapQuestFlag.sMonName <> '') and (MapQuestFlag.sItemName = '') then
        begin
          if (MapQuestFlag.sMonName = sCharName) and (sItem = '') then
            bo1D := True;
        end;
        if (MapQuestFlag.sMonName = '') and (MapQuestFlag.sItemName <> '') then
        begin
          if (MapQuestFlag.sItemName = sItem) then
            bo1D := True;
        end;
        if bo1D then
        begin
          Result := MapQuestFlag.NPC;
          Break;
        end;
      end;
    end;
  end;
end;

function TEnvirnoment.GetItemEx(nX, nY: Integer;
  var nCount: Integer): Pointer; //004B5C10
var
  i: Integer;
  MapCellInfo: pTMapCellinfo;
  OSObject: pTOSObject;
  BaseObject: TBaseObject;
begin
  Result := nil;
  nCount := 0;
  bo2C := False;
  if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.chFlag = 0) then
  begin
    bo2C := True;
    if MapCellInfo.ObjList <> nil then
    begin
      for i := 0 to MapCellInfo.ObjList.Count - 1 do
      begin
        OSObject := MapCellInfo.ObjList.Items[i];
        if OSObject.btType = OS_ITEMOBJECT then
        begin
          Result := Pointer(OSObject.CellObj);
          Inc(nCount);
        end;
        if OSObject.btType = OS_GATEOBJECT then
        begin
          bo2C := False;
        end;
        if OSObject.btType = OS_MOVINGOBJECT then
        begin
          BaseObject := TBaseObject(OSObject.CellObj);
          if not BaseObject.m_boDeath then
            bo2C := False;
        end;
      end;
    end;
  end;

end;

function TEnvirnoment.GetDoor(nX, nY: Integer): pTDoorInfo; //004B6ACC
var
  i: Integer;
  Door: pTDoorInfo;
begin
  Result := nil;
  for i := 0 to m_DoorList.Count - 1 do
  begin
    Door := m_DoorList.Items[i];
    if (Door.nX = nX) and (Door.nY = nY) then
    begin
      Result := Door;
      Exit;
    end;
  end;
end;

function TEnvirnoment.IsValidObject(nX, nY, nRage: Integer; BaseObject: TObject): Boolean; //004B5A3C
var
  nXX, nYY, i: Integer;
  MapCellInfo: pTMapCellinfo;
  OSObject: pTOSObject;
begin
  Result := False;
  for nXX := nX - nRage to nX + nRage do
  begin
    for nYY := nY - nRage to nY + nRage do
    begin
      if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
      begin
        for i := 0 to MapCellInfo.ObjList.Count - 1 do
        begin
          OSObject := MapCellInfo.ObjList.Items[i];
          if OSObject.CellObj = BaseObject then
          begin
            Result := True;
            Exit;
          end;
        end;
      end;
    end;
  end;
end;

function TEnvirnoment.GetRangeBaseObject(nX, nY, nRage: Integer; boFlag: Boolean;
  BaseObjectList: TList): Integer; //004B59C0
var
  nXX, nYY: Integer;
begin
  for nXX := nX - nRage to nX + nRage do
  begin
    for nYY := nY - nRage to nY + nRage do
    begin
      GeTBaseObjects(nXX, nYY, boFlag, BaseObjectList);
    end;
  end;
  Result := BaseObjectList.Count;
end;
//boFlag 是否包括死亡对象
//FALSE 包括死亡对象
//TRUE  不包括死亡对象
function TEnvirnoment.GeTBaseObjects(nX, nY: Integer; boFlag: Boolean;
  BaseObjectList: TList): Integer; //004B58F8
var
  i: Integer;
  MapCellInfo: pTMapCellinfo;
  OSObject: pTOSObject;
  BaseObject: TBaseObject;
begin
  if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
  begin
    for i := 0 to MapCellInfo.ObjList.Count - 1 do
    begin
      OSObject := MapCellInfo.ObjList.Items[i];
      if OSObject.btType = OS_MOVINGOBJECT then
      begin
        BaseObject := TBaseObject(OSObject.CellObj);
        if BaseObject <> nil then
        begin
          if not BaseObject.m_boGhost and BaseObject.bo2B9 then
          begin
            if not boFlag or not BaseObject.m_boDeath then
              BaseObjectList.Add(BaseObject);
          end;
        end;
      end;
    end;
  end;
  Result := BaseObjectList.Count;
end;

function TEnvirnoment.GetEvent(nX, nY: Integer): TObject; //004B5D24
var
  i: Integer;
  MapCellInfo: pTMapCellinfo;
  OSObject: pTOSObject;
begin
  Result := nil;
  bo2C := False;
  if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
  begin
    for i := 0 to MapCellInfo.ObjList.Count - 1 do
    begin
      OSObject := MapCellInfo.ObjList.Items[i];
      if OSObject.btType = OS_EVENTOBJECT then
      begin
        Result := OSObject.CellObj;
      end;
    end;
  end;
end;

procedure TEnvirnoment.SetMapXYFlag(nX, nY: Integer; boFlag: Boolean); //004B5E8C
var
  MapCellInfo: pTMapCellinfo;
begin
  if GetMapCellInfo(nX, nY, MapCellInfo) then
  begin
    if boFlag then MapCellInfo.chFlag := 0
    else MapCellInfo.chFlag := 2;
  end;
end;

function TEnvirnoment.CanFly(nSX, nSY, nDX, nDY: Integer): Boolean; //004B600C
var
  r28, r30: Real;
  n14, n18, n1C: Integer;
begin
  Result := True;
  r28 := (nDX - nSX) / 1.0E1;
  r30 := (nDY - nDX) / 1.0E1;
  n14 := 0;
  while (True) do
  begin
    n18 := Round(nSX + r28);
    n1C := Round(nSY + r30);
    if not CanWalk(n18, n1C, True) then
    begin
      Result := False;
      Break;
    end;
    Inc(n14);
    if n14 >= 10 then Break;
  end;
end;



function TEnvirnoment.GetXYHuman(nMapX, nMapY: Integer): Boolean;
var
  i: Integer;
  MapCellInfo: pTMapCellinfo;
  OSObject: pTOSObject;
  BaseObject: TBaseObject;
begin
  Result := False;
  if GetMapCellInfo(nMapX, nMapY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
  begin
    for i := 0 to MapCellInfo.ObjList.Count - 1 do
    begin
      OSObject := MapCellInfo.ObjList.Items[i];
      if OSObject.btType = OS_MOVINGOBJECT then
      begin
        BaseObject := TBaseObject(OSObject.CellObj);
        if BaseObject.m_btRaceServer = RC_PLAYOBJECT then
        begin
          Result := True;
          Break;
        end;
      end;
    end;
  end;
end;

function TEnvirnoment.IsValidCell(nX, nY: Integer): Boolean; //0x004B5FC8
var
  MapCellInfo: pTMapCellinfo;
begin
  Result := True;
  if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.chFlag = 2) then
    Result := False;
end;

function TEnvirnoment.GetEnvirInfo: string;
var
  sMsg: string;
begin
  sMsg := 'Map:%s(%s) DAY:%s DARK:%s SAFE:%s FIGHT:%s FIGHT3:%s QUIZ:%s NORECONNECT:%s(%s) MUSIC:%s(%d) EXPRATE:%s(%f) PKWINLEVEL:%s(%d) PKLOSTLEVEL:%s(%d) PKWINEXP:%s(%d) PKLOSTEXP:%s(%d) DECHP:%s(%d/%d) INCHP:%s(%d/%d)';
  sMsg := sMsg + ' DECGAMEGOLD:%s(%d/%d) INCGAMEGOLD:%s(%d/%d) INCGAMEPOINT:%s(%d/%d) RUNHUMAN:%s RUNMON:%s NEEDHOLE:%s NORECALL:%s NOGUILDRECALL:%s NODEARRECALL:%s NOMASTERRECALL:%s NODRUG:%s MINE:%s MINE2:%s NODROPITEM:%s';
  sMsg := sMsg + ' NOTHROWITEM:%s NOPOSITIONMOVE:%s NOHORSE:%s NOCHAT:%s';
  Result := Format(sMsg, [sMapName,
    sMapDesc,
      BoolToStr(Flag.boDAYLIGHT),
      BoolToStr(Flag.boDARKness),
      BoolToStr(Flag.boSAFE),
      BoolToStr(Flag.boFIGHTZone),
      BoolToStr(Flag.boFIGHT3Zone),
      BoolToStr(Flag.boQUIZ),
      BoolToStr(Flag.boNORECONNECT), Flag.sNOReConnectMap,
      BoolToStr(Flag.boMUSIC), Flag.nMUSICID,
      BoolToStr(Flag.boEXPRATE), Flag.nEXPRATE / 100,
      BoolToStr(Flag.boPKWINLEVEL), Flag.nPKWINLEVEL,
      BoolToStr(Flag.boPKLOSTLEVEL), Flag.nPKLOSTLEVEL,
      BoolToStr(Flag.boPKWINEXP), Flag.nPKWINEXP,
      BoolToStr(Flag.boPKLOSTEXP), Flag.nPKLOSTEXP,
      BoolToStr(Flag.boDECHP), Flag.nDECHPTIME, Flag.nDECHPPOINT,
      BoolToStr(Flag.boINCHP), Flag.nINCHPTIME, Flag.nINCHPPOINT,
      BoolToStr(Flag.boDECGAMEGOLD), Flag.nDECGAMEGOLDTIME, Flag.nDECGAMEGOLD,
      BoolToStr(Flag.boINCGAMEGOLD), Flag.nINCGAMEGOLDTIME, Flag.nINCGAMEGOLD,
      BoolToStr(Flag.boINCGAMEPOINT), Flag.nINCGAMEPOINTTIME, Flag.nINCGAMEPOINT,
      BoolToStr(Flag.boRUNHUMAN),
      BoolToStr(Flag.boRUNMON),
      BoolToStr(Flag.boNEEDHOLE),
      BoolToStr(Flag.boNORECALL),
      BoolToStr(Flag.boNOGUILDRECALL),
      BoolToStr(Flag.boNODEARRECALL),
      BoolToStr(Flag.boNOMASTERRECALL),
      BoolToStr(Flag.boNODRUG),
      BoolToStr(Flag.boMINE),
      BoolToStr(Flag.boMINE2),
      BoolToStr(Flag.boNODROPITEM),
      BoolToStr(Flag.boNOTHROWITEM),
      BoolToStr(Flag.boNOPOSITIONMOVE),
      BoolToStr(Flag.boNOHORSE),
      BoolToStr(Flag.boNOCHAT)
      ]);
end;

procedure TEnvirnoment.AddObject(BaseObject: TObject);
var
  btRaceServer: Byte;
begin
  btRaceServer := TBaseObject(BaseObject).m_btRaceServer;
  if btRaceServer = RC_PLAYOBJECT then Inc(m_nHumCount);
  if btRaceServer >= RC_ANIMAL then Inc(m_nMonCount);
end;

procedure TEnvirnoment.DelObjectCount(BaseObject: TObject);
var
  btRaceServer: Byte;
begin
  btRaceServer := TBaseObject(BaseObject).m_btRaceServer;
  if btRaceServer = RC_PLAYOBJECT then Inc(m_nHumCount);
  if btRaceServer >= RC_ANIMAL then Inc(m_nMonCount);
end;

procedure TMapManager.Run;
begin

end;

end.

⌨️ 快捷键说明

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