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

📄 envir.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  if m_QuestList.Count > 0 then Result:=True
  else Result:=False;    
end;

function TEnvirnoment.AddToMapMineEvent(nX,nY:Integer;nType:Integer;Event:TObject):TObject; //004B6600
var
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  bo19,bo1A:Boolean;
ResourceString
  sExceptionMsg = '[Exception] TEnvirnoment::AddToMapMineEvent ';
begin
  Result:=nil;
  try
    bo19:=GetMapCellInfo(nX,nY,MapCellInfo);
    bo1A:=False;
    if bo19 and (MapCellInfo.chFlag <> 0) then begin
      if MapCellInfo.ObjList = nil then MapCellInfo.ObjList:=TList.Create;
      if not bo1A then begin
        New(OSObject);
        OSObject.btType    := nType;
        OSObject.CellObj   := Event;
        OSObject.dwAddTime := GetTickCount();
        MapCellInfo.ObjList.Add(OSObject);
        Result:=Event;
      end;
    end;
  except
    MainOutMessage(sExceptionMsg);
  end;
end;

procedure TEnvirnoment.VerifyMapTime(nX,nY:Integer;BaseObject:TObject); //004B6980
var
  I: Integer;
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  boVerify:Boolean;
ResourceString
  sExceptionMsg = '[Exception] TEnvirnoment::VerifyMapTime';
begin
  try
    boVerify:=False;
    if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo <> nil) 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) and (OSObject.CellObj = BaseObject) then begin
          OSObject.dwAddTime:=GetTickCount();
          boVerify:=True;
          break;
        end;
      end;
    end;
    if not boVerify then
      AddToMap(nX,nY,OS_MOVINGOBJECT,BaseObject);
  except
    MainOutMessage(sExceptionMsg);
  end;
end;

constructor TEnvirnoment.Create; //004B5318
begin
  Pointer(MapCellArray):=nil;
  sMapName     := '';
  nServerIndex := 0;
  nMinMap      := 0;
  nBigMap      := 0;
  FillChar(Flag, SizeOf(TMapFlag), #0);
  {m_nWidth     := 0;
  m_nHeight    := 0;
  m_boDARK     := False;
  m_boDAY      := False;}
  m_nMonCount  := 0;
  m_nHumCount  := 0;
  m_DoorList   := TList.Create;
  m_QuestList  := TList.Create;
  m_dwWhisperTick := 0;
  end;

destructor TEnvirnoment.Destroy;
var
  I: Integer;
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  nX,nY:Integer;
  DoorInfo:pTDoorInfo;
begin
  for nX:= 0 to Header.wWidth - 1 do begin
    for nY:= 0 to Header.wHeight - 1 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];
          case OSObject.btType of
            OS_ITEMOBJECT  :Dispose(PTMapItem(OSObject.CellObj));
            OS_GATEOBJECT  :Dispose(pTGateObj(OSObject.CellObj));
            OS_EVENTOBJECT :TEvent(OSObject.CellObj).Free;
          end;
          Dispose(OSObject);
        end;
        MapCellInfo.ObjList.Free;
        MapCellInfo.ObjList:=nil;
      end;
    end;
  end;

  for I := 0 to m_DoorList.Count - 1 do begin
    DoorInfo:=m_DoorList.Items[I];
    Dec(DoorInfo.Status.nRefCount);
    if DoorInfo.Status.nRefCount <= 0 then
      Dispose(DoorInfo.Status);
      
    Dispose(DoorInfo);
  end;
  m_DoorList.Free;
  for I := 0 to m_QuestList.Count - 1 do begin
    Dispose(pTMapQuestInfo(m_QuestList.Items[I]));
  end;
  m_QuestList.Free;
  FreeMem(Pointer(MapCellArray));
  Pointer(MapCellArray):=nil;
  inherited;
end;


{my code
function TEnvirnoment.LoadMapData(sMapFile: String):Boolean;//004B54E0
var
  fHandle:Integer;
  nMapSize:Integer;
  n24,nW,nH:Integer;
  MapBuffer:pTMap;
  Point:Integer;
  Door:pTDoorInfo;
  i:Integer;
  MapCellinfo:pTMapCellinfo;
  boNewMap:boolean;
  m_nWidth,m_nHeight:Word;
  Header:TMapHeader;
  NewHeader:TNewMapHeader;
begin
  Result:=False;
  if FileExists(sMapFile) then begin
    fHandle:=FileOpen (sMapFile, fmOpenRead or fmShareExclusive);
    if fHandle > 0 then begin
      FileRead (fHandle, Header, SizeOf(TMapHeader));
        if (sMapName = 'LABY01') or (sMapName = 'LABY02') or
        (sMapName = 'LABY03') or (sMapName = 'LABY04') or
        (sMapName = 'SNAKE') then begin
         boNewMap := True;
        end;
      if (not boNewMap) then begin //original header
        FileRead(fHandle, Header, SizeOf(TMapHeader));
        m_nWidth := Header.wWidth;
        m_nHeight := Header.wHeight;
      end else begin  //new header
        FileRead(fHandle, NewHeader, SizeOf(TNewMapHeader));
        NewHeader.wWidth   := NewHeader.wWidth xor NewHeader.wXOR;
        NewHeader.wHeight  := NewHeader.wHeight xor NewHeader.wXOR;
        m_nWidth := NewHeader.wWidth;
        m_nHeight := NewHeader.wHeight;
      end;
      Initialize(Header.wWidth,Header.wHeight);
      nMapSize:=Header.wWidth * SizeOf(TMapUnitInfo) * Header.wHeight;

      MapBuffer:=AllocMem(nMapSize);
      FileRead(fHandle,MapBuffer^,nMapSize);

      for nW:=0 to m_nWidth -1 do begin
        n24:=nW * m_nHeight;
        for nH:=0 to m_nHeight -1 do begin
          if boNewMap then begin
            MapBuffer[n24 + nH].wBkImg := MapBuffer[n24 + nH].wBkImg xor NewHeader.wXOR;
            MapBuffer[n24 + nH].wMidImg := MapBuffer[n24 + nH].wMidImg xor NewHeader.wXOR;
            MapBuffer[n24 + nH].wFrImg := MapBuffer[n24 + nH].wFrImg xor NewHeader.wXOR;
          end;
          if (MapBuffer[n24 + nH].wBkImg) and $8000 <> 0 then begin
            MapCellinfo:=@MapCellArray[n24 + nH];
            MapCellinfo.chFlag:=1;
          end;//004B5601
          if MapBuffer[n24 + nH].wFrImg and $8000 <> 0 then begin
            MapCellinfo:=@MapCellArray[n24 + nH];
            MapCellinfo.chFlag:=2;
          end;//004B562C

          if MapBuffer[n24 + nH].btDoorIndex and $80 <> 0 then begin
            Point:=(MapBuffer[n24 + nH].btDoorIndex and $7F);
            if Point > 0 then begin
              New(Door);
              Door.nX:=nW;
              Door.nY:=nH;
              Door.nPoint:=Point;
              Door.Status:=nil;
              for I:=0 to m_DoorList.Count -1 do begin
                 if abs(pTDoorInfo(m_DoorList.Items[I]).nX - Door.nX) <= 10 then begin
                   if abs(pTDoorInfo(m_DoorList.Items[I]).nY - Door.nY) <= 10 then begin
                     if pTDoorInfo(m_DoorList.Items[I]).nPoint = Point then begin
                       Door.Status:=pTDoorInfo(m_DoorList.Items[I]).Status;
                       Inc(Door.Status.nRefCount);
                       Break;
                     end;
                   end;
                 end;
              end;//004B5730
              if Door.Status = nil then begin
                New(Door.Status);
                Door.Status.boOpened   := False;
                Door.Status.bo01       := False;
                Door.Status.n04        := 0;
                Door.Status.dwOpenTick := 0;
                Door.Status.nRefCount  := 1;
              end;
              m_DoorList.Add(Door);
            end;//004B5780
          end;
        end;//004B578C
      end;//004B5798
      //Dispose(MapBuffer);
      FreeMem(MapBuffer);
      FileClose(fHandle);
      Result:=True;
    end;//004B57B1
  end;//004B57B1
end;
}
function TEnvirnoment.LoadMapData(sMapFile: String):Boolean;
var
  fHandle: integer;
  nMapSize: integer;
  n24, nW, nH: integer;
  MapBuffer: pTMap;
  Point: integer;
  Door:  pTDoorInfo;
  i:     integer;
  MapCellinfo: pTMapCellinfo;
  boNewMap:Boolean;
  NewHeader:TNewMapHeader;
begin
  Result := False;
  sMapName := UpperCase(sMapName);
  boNewMap := False;
  if (sMapName = 'LABY01') or (sMapName = 'LABY02') or
     (sMapName = 'LABY03') or (sMapName = 'LABY04') or
     (sMapName = 'SNAKE') then begin
    boNewMap := True;
  end;
  if FileExists(sMapFile) then begin
    fHandle := FileOpen(sMapFile, fmOpenRead or fmShareExclusive);
    if fHandle > 0 then begin
      if (not boNewMap) then begin
        FileRead(fHandle, Header, SizeOf(TMapHeader));
      end else begin
        FileRead(fHandle, NewHeader, SizeOf(TNewMapHeader));
        NewHeader.wWidth   := NewHeader.wWidth xor NewHeader.wXOR;
        NewHeader.wHeight  := NewHeader.wHeight xor NewHeader.wXOR;
        Header.wWidth := NewHeader.wWidth;
        Header.wHeight := NewHeader.wHeight;
      end;

      Initialize(Header.wWidth, Header.wHeight);
      nMapSize := Header.wWidth * SizeOf(TMapUnitInfo) * Header.wHeight;
      MapBuffer := AllocMem(nMapSize);
      FileRead(fHandle, MapBuffer^, nMapSize);
      for nW := 0 to Header.wWidth - 1 do begin
        n24 := nW * Header.wHeight;
        for nH := 0 to Header.wHeight - 1 do begin
          if boNewMap then begin
            MapBuffer[n24 + nH].wBkImg := MapBuffer[n24 + nH].wBkImg xor NewHeader.wXOR;
            MapBuffer[n24 + nH].wMidImg := MapBuffer[n24 + nH].wMidImg xor NewHeader.wXOR;
            MapBuffer[n24 + nH].wFrImg := MapBuffer[n24 + nH].wFrImg xor NewHeader.wXOR;
          end;
          if (MapBuffer[n24 + nH].wBkImg) and $8000 <> 0 then begin
            MapCellinfo := @MapCellArray[n24 + nH];
            MapCellinfo.chFlag := 1;
          end;//004B5601
          if MapBuffer[n24 + nH].wFrImg and $8000 <> 0 then begin
            MapCellinfo := @MapCellArray[n24 + nH];
            MapCellinfo.chFlag := 2;
          end;//004B562C
          if MapBuffer[n24 + nH].btDoorIndex and $80 <> 0 then begin
            Point := (MapBuffer[n24 + nH].btDoorIndex and $7F);
            if Point > 0 then begin
              New(Door);
              Door.nX     := nW;
              Door.nY     := nH;
              Door.nPoint := Point;
              Door.Status := nil;
              for I := 0 to m_DoorList.Count - 1 do begin
                if abs(pTDoorInfo(m_DoorList.Items[i]).nX - Door.nX) <= 10 then
                begin
                  if abs(pTDoorInfo(m_DoorList.Items[i]).nY - Door.nY) <= 10 then
                  begin
                    if pTDoorInfo(m_DoorList.Items[i]).nPoint = Point then
                    begin
                      Door.Status := pTDoorInfo(m_DoorList.Items[i]).Status;
                      Inc(Door.Status.nRefCount);
                      Break;
                    end;
                  end;
                end;
              end;
              if Door.Status = nil then begin
                New(Door.Status);
                Door.Status.boOpened   := False;
                Door.Status.dwOpenTick := 0;
                Door.Status.nRefCount  := 1;
              end;
              m_DoorList.Add(Door);
            end;
          end;
        end;
      end;
      FreeMem(MapBuffer);
      FileClose(fHandle);
      Result := True;
    end;
  end;
end;

procedure TEnvirnoment.Initialize(nWidth, nHeight: Integer);//004B53FC
var
  nW,nH:Integer;
  MapCellInfo:pTMapCellinfo;
begin
  if (nWidth > 1) and (nHeight > 1) then begin
    if MapCellArray <> nil then begin
      for nW:= 0 to Header.wWidth -1 do begin
        for nH:= 0 to Header.wHeight -1 do begin
          MapCellInfo:=@MapCellArray[nW * Header.wHeight + nH];
          if MapCellInfo.ObjList <> nil then begin
            MapCellInfo.ObjList.Free;
            MapCellInfo.ObjList:=nil;
          end;
        end;
      end;
      FreeMem(Pointer(MapCellArray));
      Pointer(MapCellArray):=nil;
    end;//004B54AF
    Pointer(MapCellArray):=AllocMem((Header.wWidth * Header.wHeight) * SizeOf(TMapCellinfo));
  end;//004B54DB
end;

//nFlag,boFlag,Monster,Item,Quest,boGrouped
function TEnvirnoment.CreateQuest(nFlag, nValue: Integer; sMonName, sItem, sQuest: String;
  boGrouped: Boolean): Boolean; //004B6C3C
var
  MapQuest:pTMapQuestInfo;
  MapMerchant:TMerchant;
begin
  Result:=False;
  if nFlag < 0 then exit;
  New(MapQuest);
  MapQuest.nFlag:=nFlag;
  if nValue > 1 then nValue:=1;
  MapQuest.nValue:=nValue;
  if sMonName = '*' then sMonName:='';
  MapQuest.sMonName:=sMonName;
  if sItem = '*' then sItem:='';
  MapQuest.sItemName:=sItem;
  if sQuest = '*' then sQuest:='';
  MapQuest.boGrouped      := boGrouped;


  MapMerchant             := TMerchant.Create;
  MapMerchant.m_sMapName  := '0';
  MapMerchant.m_nCurrX    := 0;
  MapMerchant.m_nCurrY    := 0;
  MapMerchant.m_sCharName := sQuest;
  MapMerchant.m_nFlag     := 0;
  MapMerchant.m_wAppr     := 0;
  MapMerchant.m_sFilePath := 'MapQuest_def\';
  MapMerchant.m_boIsHide  := True;
  MapMerchant.m_boIsQuest := False;

  UserEngine.QuestNPCList.Add(MapMerchant);
  MapQuest.NPC:=MapMerchant;
  m_QuestList.Add(MapQuest);
  Result:=True;
end;

function TEnvirnoment.GetXYObjCount(nX, nY: Integer): Integer; //004B5DB0
var
  I: Integer;
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  BaseObject:TBaseObject;
begin
  Result:=0;
  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 and
             not BaseObject.m_boDeath and
             not BaseObject.m_boFixedHideMode and
             not BaseObject.m_boObMode then begin
            Inc(Result);
          end;
        end;
      end;
    end;
  end;
end;
//004B2A6C
function TEnvirnoment.GetNextPosition(sx, sy, ndir, ndist:Integer;var snx:Integer;var sny:Integer):Boolean;

⌨️ 快捷键说明

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