📄 objmon2.pas
字号:
Result:=True;
exit;
end;
if m_TargetCret.m_PEnvir = m_PEnvir then begin
SetTargetXY(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY); {0FFF0h}
end else begin
DelTargetCreat();{0FFF1h}
end;
end;
procedure TAXEHIDEMonster.sub_FFE9();
begin
m_boFixedHideMode:=False;
SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
end;
procedure TAXEHIDEMonster.VisbleActors();//004A53E4
var
I:Integer;
ResourceString
sExceptionMsg = '[Exception] TStickMonster::VisbleActors Dispose';
begin
SendRefMsg(RM_DIGDOWN,m_btDirection,m_nCurrX,m_nCurrY,0,'');
try
for I := 0 to m_VisibleActors.Count - 1 do begin
Dispose(pTVisibleBaseObject(m_VisibleActors.Items[I]));
end;
m_VisibleActors.Clear;
except
MainOutMessage(sExceptionMsg);
end;
m_boFixedHideMode:=True;
end;
procedure TAXEHIDEMonster.sub_FFEA();//004A53E4
var
I:Integer;
BaseObject:TBaseObject;
begin
// m_VisibleActors.Items[I].
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
if (abs(m_nCurrX - BaseObject.m_nCurrX) < n554) and (abs(m_nCurrY - BaseObject.m_nCurrY) < n554) then begin
sub_FFE9();
break;
end;
end;
end;
end; // for
end;
function TAXEHIDEMonster.Operate(ProcessMsg: pTProcessMessage):Boolean;
begin
Result:=inherited Operate(ProcessMsg);
end;
procedure TAXEHIDEMonster.Run;//004A5614
var
bo05:Boolean;
begin
if not m_boGhost and
not m_boDeath
and(m_wStatusTimeArr[POISON_STONE] = 0) then begin {5 0x6A }
if Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed then begin
m_dwWalkTick:=GetTickCount();
if m_boFixedHideMode then begin
sub_FFEA();
end else begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
SearchTarget();
end;
bo05:=False;
if m_TargetCret <> nil then begin
if (abs(m_TargetCret.m_nCurrX - m_nCurrX) > n558) or
(abs(m_TargetCret.m_nCurrY - m_nCurrY) > n558) then begin
bo05:=True;
end;
end else bo05:=True;
if bo05 then begin
VisbleActors();
end else begin
if AttackTarget then begin
inherited;
exit;
end;
end;
end;
end;
end;
inherited;
end;
{ TSoccerBall }
constructor TSoccerBall.Create;//004A764C
begin
inherited;
m_boAnimal:=False;
m_boSuperMan:=True;
n550:=0;
m_nTargetX:= -1;
end;
destructor TSoccerBall.Destroy;
begin
inherited;
end;
procedure TSoccerBall.Run;
var
n08,n0C:Integer;
bo0D:Boolean;
begin
if n550 > 0 then begin
if m_PEnvir.GetNextPosition(m_nCurrX,m_nCurrY,m_btDirection,1,n08,n0C) then begin
if m_PEnvir.CanWalk(n08,n0C,bo0D) then begin
case m_btDirection of //
0: m_btDirection:=4;
1: m_btDirection:=7;
2: m_btDirection:=6;
3: m_btDirection:=5;
4: m_btDirection:=0;
5: m_btDirection:=3;
6: m_btDirection:=2;
7: m_btDirection:=1;
end; // case
m_PEnvir.GetNextPosition(m_nCurrX,m_nCurrY,m_btDirection,n550,m_nTargetX,m_nTargetY)
end;
end;
end else begin//004A78A1
m_nTargetX:= -1;
end;
if m_nTargetX <> -1 then begin
GotoTargetXY();
if (m_nTargetX = m_nCurrX) and (m_nTargetY = m_nCurrY) then
n550:=0;
end;
inherited;
end;
procedure TSoccerBall.Struck(hiter: TBaseObject);
begin
if hiter = nil then exit;
m_btDirection:=hiter.m_btDirection;
n550:=Random(4) + (n550 + 4);
n550:=_MIN(20,n550);
m_PEnvir.GetNextPosition(m_nCurrX,m_nCurrY,m_btDirection,n550,m_nTargetX,m_nTargetY);
end;
{ TBeeQueen }
constructor TBeeQueen.Create;//004A5750
begin
inherited;
m_nViewRange:=9;
m_nRunTime:=250;
m_dwSearchTime:=Random(1500) + 2500;
m_dwSearchTick:=GetTickCount();
m_boStickMode:=True;
BBList:=TList.Create;
end;
destructor TBeeQueen.Destroy;//004A57F0
begin
BBList.Free;
inherited;
end;
procedure TBeeQueen.MakeChildBee;
begin
if BBList.Count >= 15 then exit;
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
SendDelayMsg(Self,RM_ZEN_BEE,0,0,0,0,'',500);
end;
function TBeeQueen.Operate(ProcessMsg:pTProcessMessage):Boolean;
var
BB:TBaseObject;
begin
if ProcessMsg.wIdent = RM_ZEN_BEE then begin
BB:=UserEngine.RegenMonsterByName(m_PEnvir.sMapName,m_nCurrX,m_nCurrY,g_Config.sBee);
if BB <> nil then begin
BB.SetTargetCreat(m_TargetCret);
BBList.Add(BB);
end;
end;
Result:=inherited Operate(ProcessMsg);
end;
procedure TBeeQueen.Run;
var
I: Integer;
BB:TBaseObject;
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed then begin
m_dwWalkTick:=GetTickCount();
if Integer(GetTickCount - m_dwHitTick) >= m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
SearchTarget();
if m_TargetCret <> nil then MakeChildBee();
end;
for I := BBList.Count -1 downto 0 do begin
BB:=TBaseObject(BBList.Items[I]);
if BB.m_boDeath or (BB.m_boGhost) then BBList.Delete(I);
end;
end;
end;
inherited;
end;
//////
constructor TSeeBeeQueen.Create;//004A5750
begin
inherited;
m_nViewRange:=9;
m_nRunTime:=250;
m_dwSearchTime:=Random(1500) + 2500;
m_dwSearchTick:=GetTickCount();
m_boStickMode:=True;
BBList:=TList.Create;
end;
destructor TSeeBeeQueen.Destroy;//004A57F0
begin
BBList.Free;
inherited;
end;
procedure TSeeBeeQueen.MakeChildBee;
begin
if BBList.Count >= 15 then exit;
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
SendDelayMsg(Self,RM_ZEN_BEE,0,0,0,0,'',500);
end;
function TSeeBeeQueen.Operate(ProcessMsg:pTProcessMessage):Boolean;
var
BB:TBaseObject;
seebee:string;
nsee:byte;
begin
if ProcessMsg.wIdent = RM_ZEN_BEE then begin
nsee:=random(3);
case nsee of
0,1:seebee:= g_Config.sSeeBee1;
2:seebee:= g_Config.sSeeBee2;
3:seebee:= g_Config.sSeeBee3;
end;
BB:=UserEngine.RegenMonsterByName(m_PEnvir.sMapName,m_nCurrX,m_nCurrY, SeeBee);
if BB <> nil then begin
BB.SetTargetCreat(m_TargetCret);
BBList.Add(BB);
end;
end;
Result:=inherited Operate(ProcessMsg);
end;
procedure TSeeBeeQueen.Run;
var
I: Integer;
BB:TBaseObject;
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed then begin
m_dwWalkTick:=GetTickCount();
if Integer(GetTickCount - m_dwHitTick) >= m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
SearchTarget();
if m_TargetCret <> nil then MakeChildBee();
end;
for I := BBList.Count -1 downto 0 do begin
BB:=TBaseObject(BBList.Items[I]);
if BB.m_boDeath or (BB.m_boGhost) then BBList.Delete(I);
end;
end;
end;
inherited;
end;
{ TCentipedeKingMonster }
constructor TCentipedeKingMonster.Create;//004A5A8C
begin
inherited;
m_nViewRange:=6;
n554:=4;
n558:=6;
m_boAnimal:=False;
m_dwAttickTick:=GetTickCount();
m_boBOSS:=true;
end;
destructor TCentipedeKingMonster.Destroy;
begin
inherited;
end;
function TCentipedeKingMonster.sub_4A5B0C: Boolean;
var
I:Integer;
BaseObject:TBaseObject;
begin
Result:=False;
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 (abs(m_nCurrX - BaseObject.m_nCurrX) <= m_nViewRange) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= m_nViewRange) then begin
Result:=True;
break;
end;
end;
end;
end;
function TCentipedeKingMonster.AttackTarget: Boolean; //004A5BC0
var
WAbil:pTAbility;
nPower,I:Integer;
BaseObject:TBaseObject;
begin
Result:=False;
if not sub_4A5B0C then begin
exit;
end;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
SendAttackMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0);
WAbil:=@m_WAbil;
nPower:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
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 (abs(m_nCurrX - BaseObject.m_nCurrX) < m_nViewRange) and (abs(m_nCurrY - BaseObject.m_nCurrY) < m_nViewRange) then begin
m_dwTargetFocusTick:=GetTickCount();
SendDelayMsg(Self,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),2,Integer(BaseObject),'',600);
if Random(4) = 0 then begin
if Random(3) <> 0 then begin
BaseObject.MakePosion(POISON_DECHEALTH,60,3);
end else begin
BaseObject.MakePosion(POISON_STONE,5,0);
end;
m_TargetCret:=BaseObject;
end;
end;
end;
end; // for
end;
Result:=True;
end;
procedure TCentipedeKingMonster.sub_FFE9;
begin
inherited;
m_WAbil.HP:=m_WAbil.MaxHP;
end;
procedure TCentipedeKingMonster.Run;
var
I:Integer;
BaseObject:TBaseObject;
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed then begin
m_dwWalkTick:=GetTickCount();
if m_boFixedHideMode then begin
if (GetTickCount - m_dwAttickTick) > 10000 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
if (abs(m_nCurrX - BaseObject.m_nCurrX) < n554) and (abs(m_nCurrY - BaseObject.m_nCurrY) < n554) then begin
sub_FFE9();
m_dwAttickTick:=GetTickCount();
break;
end;
end;
end;
end;
end;//004A5F86
end else begin
if (GetTickCount - m_dwAttickTick) > 3000 then begin
if AttackTarget() then begin
inherited;
exit;
end;
if (GetTickCount - m_dwAttickTick) > 10000 then begin
VisbleActors();
m_dwAttickTick:=GetTickCount();
end;
end;
end;
end;
end;
inherited;
end;
{ TBigHeartMonster }
constructor TBigHeartMonster.Create;//004A5F94
begin
inherited;
m_nViewRange:=16;
m_boAnimal:=False;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -