📄 objmon.pas
字号:
end;
nCheckCode:=35;
end; //004B9B38
end;
end; //004B9B38 if OSObject.btType = OS_ITEMOBJECT then begin
// end; //m_btRaceServer=202
////
Inc(nIdx);
end;
end;
end;
end;
except
on e: Exception do begin
MainOutMessage(format(sExceptionMsg2,[n24,m_sCharName,m_sMapName,m_nCurrX,m_nCurrY,nCheckCode]));
{
MainOutMessage(m_sCharName + ',' +
m_sMapName + ',' +
IntToStr(m_nCurrX) + ',' +
IntToStr(m_nCurrY) + ',' +
' SearchViewRange 1-' +
IntToStr(n24));
}
MainOutMessage(E.Message); raise;
KickException();
end;
end;
nCheckCode:=40;
n24:=2;
try
n18:=0;
while (True) do begin
if m_VisibleActors.Count <= n18 then break;
nCheckCode:=41;
VisibleBaseObject:=m_VisibleActors.Items[n18];
nCheckCode:=42;
if VisibleBaseObject.nVisibleFlag = 0 then begin
nCheckCode:=43;
m_VisibleActors.Delete(n18);
nCheckCode:=48;
Dispose(VisibleBaseObject);
nCheckCode:=49;
Continue;
end;
nCheckCode:=50;
Inc(n18);
end;
except
on e: Exception do begin
MainOutMessage(format(sExceptionMsg2,[n24,m_sCharName,m_sMapName,m_nCurrX,m_nCurrY,nCheckCode]));
{MainOutMessage(m_sCharName + ',' +
m_sMapName + ',' +
IntToStr(m_nCurrX) + ',' +
IntToStr(m_nCurrY) + ',' +
' SearchViewRange 2');}
KickException();
end;
end;
end;
procedure TAIMAN.Run; //004A9020
var
nX,nY,i,count:Integer;
VisibleMapItem:pTVisibleMapItem;
MapItem:pTMapItem;
begin
if not m_boGhost and
not m_boDeath and
not m_boFixedHideMode and
not m_boStoneMode and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if Think then begin
inherited;
exit;
end;
if m_boWalkWaitLocked then begin
if (GetTickCount - m_dwWalkWaitTick) > m_dwWalkWait then begin
m_boWalkWaitLocked:=False;
end;
end;
if not m_boWalkWaitLocked and (Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) then begin
m_dwWalkTick:=GetTickCount();
Inc(m_nWalkCount);
if m_nWalkCount > m_nWalkStep then begin
m_nWalkCount:=0;
m_boWalkWaitLocked:=True;
m_dwWalkWaitTick:=GetTickCount();
end; //004A9151
if not m_boRunAwayMode then begin
if not m_boNoAttackMode then begin
if m_TargetCret <> nil then begin
if AttackTarget{FFEB} then begin
inherited;
exit;
end;
end else begin
m_nTargetX:=-1;
if m_boMission then begin
m_nTargetX:=m_nMissionX;
m_nTargetY:=m_nMissionY;
end; //004A91D3
end;
end; //004A91D3 if not bo2C0 then begin
if m_Master <> nil then begin
if m_TargetCret = nil then begin
m_Master.GetBackPosition(nX,nY);
if (abs(m_nTargetX - nX) > 1) or (abs(m_nTargetY - nY{nX}) > 1) then begin //004A922D
m_nTargetX:=nX;
m_nTargetY:=nY;
if (abs(m_nCurrX - nX) <= 2) and (abs(m_nCurrY - nY) <= 2) then begin
if m_PEnvir.GetMovingObject(nX,nY,True) <> nil then begin
m_nTargetX:=m_nCurrX;
m_nTargetY:=m_nCurrY;
end //004A92A5
end;
end; //004A92A5
end; //004A92A5 if m_TargetCret = nil then begin
if (not m_Master.m_boSlaveRelax) and
((m_PEnvir <> m_Master.m_PEnvir) or
(abs(m_nCurrX-m_Master.m_nCurrX) > 20) or
(abs(m_nCurrY-m_Master.m_nCurrY) > 20)) then begin
SpaceMove(m_Master.m_PEnvir.sMapName, m_nTargetX, m_nTargetY, 1);
end; // 004A937E
end;// 004A937E if m_Master <> nil then begin
end else begin //004A9344
if (m_dwRunAwayTime > 0) and ((GetTickCount - m_dwRunAwayStart) > m_dwRunAwayTime) then begin
m_boRunAwayMode:=False;
m_dwRunAwayTime:=0;
end;
end; //004A937E
if (m_Master <> nil) and m_Master.m_boSlaveRelax then begin
inherited ;
exit;
end; //004A93A6
if m_VisibleItems.Count=0 then curpos:=0;
if m_VisibleItems.Count >0 then begin
if curpos<= m_VisibleItems.Count-1 then begin
VisibleMapItem:=m_VisibleItems[curpos];
m_nTargetX:= VisibleMapItem.nX;
m_nTargetY:= VisibleMapItem.nY;
if ( m_nCurrX= VisibleMapItem.nX ) and ( m_nCurrY= VisibleMapItem.nY ) THEN begin
MapItem:=m_PEnvir.GetItem (m_nCurrX,m_nCurrY);
if (MapItem<>nil) and (m_PEnvir.DeleteFromMap (m_nCurrX,m_nCurrY, OS_ITEMOBJECT, TObject(MapItem))=1) then begin
SearchViewRange;
setpcount:=0;
Dispose(MapItem);
end
else begin //如果检起失败
inc(curpos); //检下一个 如果超过 就不再检了。
setpcount:=0;
// if curpos> m_Master.m_VisibleItems.Count-1 then
end;
end // m_nCurrX= VisibleMapItem.nX
else begin //如果走了10步还不能检取就检下一个
inc(setpcount);
if setpcount>10 then begin
if curpos< m_VisibleItems.Count then begin
inc(curpos);
// MainOutMessage(format('如果走了10步不能检取就检下一个%d 为(%d/%d)',[curpos,VisibleMapItem.nX,VisibleMapItem.nY]));
end;
setpcount:=0;
end;
end;
end; // curpos<= m_Master.m_VisibleItems.Count-1
end;
////
if m_nTargetX <> -1 then begin
GotoTargetXY(); //004A93B5 0FFEF
end else begin
if m_TargetCret = nil then Wondering1();// FFEE //Jacky
end; //004A93D8
end; //004A93D8 if not bo510 and ((GetTickCount - m_dwWalkTick) > n4FC) then begin
end; //004A93D8
inherited;
end;
///////////////////end aiman
{ TChickenDeer }
constructor TChickenDeer.Create;//004A93E8
begin
inherited;
m_nViewRange:=5;
end;
destructor TChickenDeer.Destroy;
begin
inherited;
end;
procedure TChickenDeer.Run;//004A9438
var
I:Integer;
nC,n10,n14,n1C:Integer;
BaseObject1C,BaseObject:TBaseObject;
begin
n10:=9999;
BaseObject:=nil;
BaseObject1C:=nil;
if not m_boDeath and
not bo554 and
not m_boGhost and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed then begin
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject:=TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject.m_boDeath then Continue;
if IsProperTarget(BaseObject) then begin
if not BaseObject.m_boHideMode or m_boCoolEye then begin
nC:=abs(m_nCurrX - BaseObject.m_nCurrX) + abs(m_nCurrY - BaseObject.m_nCurrY);
if nC < n10 then begin
n10:=nC;
BaseObject1C:=BaseObject;
end;
end;
end;
end; // for
if BaseObject1C <> nil then begin
m_boRunAwayMode:=True;
m_TargetCret:=BaseObject1C;
end else begin
m_boRunAwayMode:=False;
m_TargetCret:=nil;
end;
end;//
if m_boRunAwayMode and
(m_TargetCret <> nil) and
(Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed)then begin
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 6) and (abs(m_nCurry - BaseObject.m_nCurry) <= 6) then begin
n14:=GetNextDirection(m_nCurrX,m_nCurrY,m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
m_PEnvir.GetNextPosition(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY,n14,5,m_nTargetX,m_nTargetY);
end;
end;
end;
inherited;
end;
{ TATMonster }
constructor TATMonster.Create; //004A9690
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
end;
destructor TATMonster.Destroy;
begin
inherited;
end;
procedure TATMonster.Run;//004A9720
begin
if not m_boDeath and
not bo554 and
not m_boGhost and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and ((m_TargetCret = nil)or( (m_TargetCret<>nil)and(m_TargetCret.m_bohastishen) ))) then begin
m_dwSearchEnemyTick:=GetTickCount();
SearchTarget();
end;
end;
inherited;
end;
{ TSlowATMonster }
constructor TSlowATMonster.Create;//004A97AC
begin
inherited;
end;
destructor TSlowATMonster.Destroy;
begin
inherited;
end;
{ TScorpion }
constructor TScorpion.Create;//004A97F0
begin
inherited;
m_boAnimal:=True;
end;
destructor TScorpion.Destroy;
begin
inherited;
end;
{ TSpitSpider }
constructor TSpitSpider.Create;//004A983C
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
m_boAnimal:=True;
m_boUsePoison:=True;
end;
destructor TSpitSpider.Destroy;
begin
inherited;
end;
procedure TSpitSpider.SpitAttack(btDir:Byte); //004A98AC
var
WAbil:pTAbility;
nC,n10,n14,n18,n1C:Integer;
BaseObject:TBaseObject;
begin
m_btDirection:=btDir;
WAbil:=@m_WAbil;
n1C:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
if n1C <= 0 then exit;
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
nC:=0;
while (nC < 5) do begin
n10:=0;
while (n10 < 5) do begin
if g_Config.SpitMap[btDir,nC,n10] = 1 then begin
{
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 1, 0, 0),
(0, 0, 1, 0, 0)),
}
n14:=m_nCurrX - 2 + n10;
n18:=m_nCurrY - 2 + nC;
BaseObject:=m_PEnvir.GetMovingObject(n14,n18,True);
if (BaseObject <> nil) and
(BaseObject <> Self) and
(IsProperTarget(BaseObject)) and
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) then begin
n1C:=BaseObject.GetMagStruckDamage(Self,n1C);
if n1C > 0 then begin
BaseObject.StruckDamage(n1C);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,n1C,m_WAbil.HP,m_WAbil.MaxHP,Integer(Self),'',300);
if m_boUsePoison then begin
if (Random(m_btAntiPoison + 20) = 0) then
BaseObject.MakePosion(POISON_DECHEALTH,30,1);
//if Random(2) = 0 then
// BaseObject.MakePosion(POISON_STONE,5,1);
end;
end;
end;
end;
Inc(n10);
{
if n10 >= 5 then break;
}
end;
Inc(nC);
//if nC >= 5 then break;
end; // while
end;
function TSpitSpider.AttackTarget: Boolean;
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if TargetInSpitRange(m_TargetCret,btDir) then begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
m_dwTargetFocusTick:=GetTickCount();
SpitAttack(btDir);
BreakHolySeizeMode();
end;
Result:=True;
exit;
end;
if m_TargetCret.m_PEnvir = m_PEnvir then begin
SetTargetXY(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
end else begin
DelTargetCreat();
end;
end;
{ THighRiskSpider }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -