📄 envir.pas
字号:
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;
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(MapCellArray);
Pointer(MapCellArray) := nil;
inherited;
end;
function TEnvirnoment.LoadMapData(sMapFile: string): Boolean; //004B54E0
var
fHandle: Integer;
nMapSize: Integer;
n24, nW, nH: Integer;
MapBuffer: pTMap;
Point: Integer;
Door: pTDoorInfo;
i, j: Integer;
MapCellInfo: pTMapCellinfo;
begin
Result := False;
if FileExists(sMapFile) then
begin
fHandle := FileOpen(sMapFile, fmOpenRead or fmShareExclusive);
if fHandle > 0 then
begin
FileRead(fHandle, Header, SizeOf(TMapHeader));
Initialize(Header.wWidth, Header.wHeight);
nMapSize := Header.wWidth * SizeOf(TMapUnitInfo) * Header.wHeight;
MapBuffer := AllocMem(nMapSize);
FileRead(fHandle, MapBuffer^, nMapSize);
j := 0;
for nW := 0 to Header.wWidth - 1 do
begin
n24 := nW * Header.wHeight;
for nH := 0 to Header.wHeight - 1 do
begin
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.n08 := 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]).n08 = 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;
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(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, nFlag: Integer; var snx: Integer; var sny: Integer): Boolean;
begin
snx := sX;
sny := sY;
case nDir of
DR_UP: if sny > nFlag - 1 then Dec(sny, nFlag);
DR_DOWN: if sny < (Header.wWidth - nFlag) then Inc(sny, nFlag);
DR_LEFT: if snx > nFlag - 1 then Dec(snx, nFlag);
DR_RIGHT: if snx < (Header.wWidth - nFlag) then Inc(snx, nFlag);
DR_UPLEFT:
begin
if (snx > nFlag - 1) and (sny > nFlag - 1) then
begin
Dec(snx, nFlag);
Dec(sny, nFlag);
end;
end;
DR_UPRIGHT:
begin //004B2B77
if (snx > nFlag - 1) and (sny < (Header.wHeight - nFlag)) then
begin
Inc(snx, nFlag);
Dec(sny, nFlag);
end;
end;
DR_DOWNLEFT:
begin //004B2BAC
if (snx < (Header.wWidth - nFlag)) and (sny > nFlag - 1) then
begin
Dec(snx, nFlag);
Inc(sny, nFlag);
end;
end;
DR_DOWNRIGHT:
begin
if (snx < (Header.wWidth - nFlag)) and (sny < (Header.wHeight - nFlag)) then
begin
Inc(snx, nFlag);
Inc(sny, nFlag);
end;
end;
end;
if (snx = sX) and (sny = sY) then Result := False
else Result := True;
end;
function TEnvirnoment.CanSafeWalk(nX, nY: Integer): Boolean; //004B609C
var
i: Integer;
MapCellInfo: pTMapCellinfo;
OSObject: pTOSObject;
begin
Result := True;
if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
begin
for i := MapCellInfo.ObjList.Count - 1 downto 0 do
begin
OSObject := MapCellInfo.ObjList.Items[i];
if OSObject.btType = OS_EVENTOBJECT then
begin
if TEvent(OSObject.CellObj).m_nDamage > 0 then Result := False;
end;
end;
end;
end;
function TEnvirnoment.ArroundDoorOpened(nX, nY: Integer): Boolean; //004B6B48
var
i: Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -