📄 objmon3.pas
字号:
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
// sysmsg('recalling to my master',c_red,t_hint);
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_nTargetX <> -1 then
begin
GotoTargetXY(); //004A93B5 0FFEF
end else
begin
if m_TargetCret = nil then Wondering(); // FFEE //Jacky
end; //004A93D8
end; //004A93D8 if not bo510 and ((GetTickCount - m_dwWalkTick) > n4FC) then begin
end; //004A93D8
inherited;
end;
{ end }
{TFireballMonster}
constructor TFireBallMonster.Create; //004A9690
begin
inherited;
m_dwSpellTick := GetTickCount();
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TFireBallMonster.Destroy;
begin
inherited;
end;
procedure TFireBallMonster.Run; //004A9720
var
BaseObject: TBaseObject;
PlayObject: TPlayObject;
nPower: Integer;
//UserMagic: pTUserMagic;
m_DefMsg: TDefaultMessage;
n08, nAttackDir: Integer;
begin
if not m_boDeath and
not bo554 and
not m_boGhost then
begin
if m_TargetCret <> nil then
begin
if Self.MagCanHitTarget(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret) then
begin
if Self.IsProperTarget(m_TargetCret) then
begin
if (abs(m_nTargetX - m_nCurrX) <= 8) and (abs(m_nTargetY - m_nCurrY) <= 8) then
begin
nPower := Random(SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1) + LoWord(m_WAbil.MC);
if nPower > 0 then
begin
BaseObject := GetPoseCreate();
if (BaseObject <> nil) and
IsProperTarget(BaseObject) and
(m_nAntiMagic >= 0) then
begin
nPower := BaseObject.GetMagStruckDamage(Self, nPower);
if nPower > 0 then
begin
BaseObject.StruckDamage(nPower);
if (GetTickCount - m_dwSpellTick) > Self.m_nNextHitTime then
begin
m_dwSpellTick := GetTickCount();
Self.SendRefMsg(RM_SPELL, 48, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, 48, '');
Self.SendRefMsg(RM_MAGICFIRE, 0,
MakeWord(2, 48),
MakeLong(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY),
Integer(m_TargetCret),
'');
Self.SendDelayMsg(TBaseObject(RM_STRUCK), RM_DELAYMAGIC, nPower, MakeLong(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY), 2, Integer(m_TargetCret), '', 600);
end; //if npower
end; //if wait
end;
end;
end;
end;
end;
BreakHolySeizeMode();
end else
m_TargetCret := nil;
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then
begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
end;
inherited;
end;
constructor TFireMonster.Create; //004A9690
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TFireMonster.Destroy;
begin
inherited;
end;
procedure TFireMonster.Run; //004A9720
var
FireBurnEvent: TFireBurnEvent;
nX, nY, nDamage, nTime: Integer;
begin
if not m_boDeath and
not bo554 and
not m_boGhost and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
begin
// do sqaure around boss
nTime := 20;
nDamage := 10;
nX := m_nCurrX;
nY := m_nCurrY;
//bx:=bx+1;
// by:=by+1;
if m_PEnvir.GetEvent(nX, nY - 1) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX, nY - 1, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //0492CFC x //
if m_PEnvir.GetEvent(nX, nY - 2) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX, nY - 2, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //0492CFC x
if m_PEnvir.GetEvent(nX - 1, nY) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX - 1, nY, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //0492D4D //
if m_PEnvir.GetEvent(nX - 2, nY) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX - 2, nY, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //0492D4D
if m_PEnvir.GetEvent(nX, nY) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX, nY, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492D9C
if m_PEnvir.GetEvent(nX + 1, nY) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX + 1, nY, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492DED
if m_PEnvir.GetEvent(nX + 2, nY) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX + 2, nY, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492DED
if m_PEnvir.GetEvent(nX, nY + 1) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX, nY + 1, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492E3E
if m_PEnvir.GetEvent(nX, nY + 2) = nil then
begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX, nY + 2, ET_FIRE, nTime * 1000, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492E3E
{do flames behind}
{if m_PEnvir.GetEvent(bx,by) = nil then begin //behind
FireBurnEvent:=TFireBurnEvent.Create(Self,bx,by,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(bx+1,by+1) = nil then begin //behind
FireBurnEvent:=TFireBurnEvent.Create(Self,bx+1,by+1,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx,fy) = nil then begin //behind
FireBurnEvent:=TFireBurnEvent.Create(Self,fx,fy,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx+1,fy+1) = nil then begin //behind
FireBurnEvent:=TFireBurnEvent.Create(Self,fx+1,fy+1,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end; }
{if m_PEnvir.GetEvent(bx-1,by) = nil then begin //behind
FireBurnEvent:=TFireBurnEvent.Create(Self,bx-1,by,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(bx-2,by) = nil then begin //behind
FireBurnEvent:=TFireBurnEvent.Create(Self,bx-2,by,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(bx-2,by+1) = nil then begin //down left
FireBurnEvent:=TFireBurnEvent.Create(Self,bx-2,by+1,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(bx-2,by+2) = nil then begin //down left
FireBurnEvent:=TFireBurnEvent.Create(Self,bx-2,by+2,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx,fy) = nil then begin //front
FireBurnEvent:=TFireBurnEvent.Create(Self,fx,fy,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx-1,fy) = nil then begin //front
FireBurnEvent:=TFireBurnEvent.Create(Self,fx-1,fy,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx+1,fy) = nil then begin //front
FireBurnEvent:=TFireBurnEvent.Create(Self,fx+1,fy,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx+2,fy) = nil then begin //front
FireBurnEvent:=TFireBurnEvent.Create(Self,fx+2,fy,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx+2,fy-1) = nil then begin //front
FireBurnEvent:=TFireBurnEvent.Create(Self,fx+2,fy-1,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end;
if m_PEnvir.GetEvent(fx+2,fy-2) = nil then begin //front
FireBurnEvent:=TFireBurnEvent.Create(Self,fx+2,fy-2,ET_FIRE,ntime * 1000 ,ndamage);
g_EventManager.AddEvent(FireBurnEvent);
end; }
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then
begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
end;
inherited;
end;
{ TFrostTigerMonster }
constructor TFrostTiger.Create; //004A9690
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TFrostTiger.Destroy;
begin
inherited;
end;
procedure TFrostTiger.Run; //004A9720
var
BaseObject: TBaseObject;
dosay: Boolean;
begin
if not m_boDeath and
not bo554 and
not m_boGhost and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
begin
if m_TargetCret = nil then
begin
if m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] = 0 then
begin
MagicManager.MagMakePrivateTransparent(Self, 180);
end;
end else
begin
//mainoutmessage('process say');
// ProcessSayMsg('I see you ' + m_TargetCret.m_sCharName + ', you will be sorry!');
// dosay:=true;
m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] := 0;
end;
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then
begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
end;
inherited;
end;
{ TGreenMonster }
constructor TGreenMonster.Create; //004A9690
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TGreenMonster.Destroy;
begin
inherited;
end;
procedure TGreenMonster.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 m_TargetCret <> nil then
begin
m_nTargetX := m_TargetCret.m_nCurrX;
m_nTargetY := m_TargetCret.m_nCurrY;
if (abs(m_nTargetX - m_nCurrX) = 1) and (abs(m_nTargetY - m_nCurrY) = 1) then
begin
if (Random(m_TargetCret.m_btAntiPoison + 7) <= 6) and (m_TargetCret.m_wStatusTimeArr[POISON_DECHEALTH] = 0) then
begin
m_TargetCret.MakePosion(POISON_DECHEALTH, 30, 1);
end;
end;
end;
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then
begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
end;
inherited;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -