📄 envir.pas
字号:
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 + -