📄 objmon3.pas
字号:
constructor TMagicMonster.Create; //004A8B74
begin
inherited;
m_boDupMode:=False;
bo554:=False;
m_dwThinkTick:=GetTickCount();
m_nViewRange:=8;
m_nRunTime:=250;
m_dwSearchTime:=3000 + Random(2000);
m_dwSearchTick:=GetTickCount();
m_btRaceServer:=215;
end;
destructor TMagicMonster.Destroy; //004A8C24
begin
inherited;
end;
{
function TMagicMonster.MakeClone(sMonName: String;OldMon:TBaseObject): TBaseObject; //004A8C58
var
ElfMon:TBaseObject;
begin
Result:=nil;
ElfMon:=UserEngine.RegenMonsterByName(m_PEnvir.sMapName,m_nCurrX,m_nCurrY,sMonName);
if ElfMon <> nil then begin
ElfMon.m_Master:=OldMon.m_Master;
ElfMon.m_dwMasterRoyaltyTick:=OldMon.m_dwMasterRoyaltyTick;
ElfMon.m_btSlaveMakeLevel:=OldMon.m_btSlaveMakeLevel;
ElfMon.m_btSlaveExpLevel:=OldMon.m_btSlaveExpLevel;
ElfMon.RecalcAbilitys;
ElfMon.RefNameColor;
if OldMon.m_Master <> nil then
OldMon.m_Master.m_SlaveList.Add(ElfMon);
ElfMon.m_WAbil:=OldMon.m_WAbil;
ElfMon.m_wStatusTimeArr:=OldMon.m_wStatusTimeArr;
ElfMon.m_TargetCret:=OldMon.m_TargetCret;
ElfMon.m_dwTargetFocusTick:=OldMon.m_dwTargetFocusTick;
ElfMon.m_LastHiter:=OldMon.m_LastHiter;
ElfMon.m_LastHiterTick:=OldMon.m_LastHiterTick;
ElfMon.m_btDirection:=OldMon.m_btDirection;
Result:=ElfMon;
end;
end;
}
function TMagicMonster.Operate(ProcessMsg: pTProcessMessage):Boolean;
begin
Result:=inherited Operate(ProcessMsg);
end;
function TMagicMonster.Think():Boolean; //004A8E54
var
nOldX,nOldY:integer;
begin
Result:=False;
if (GetTickCount - m_dwThinkTick) > 3 * 1000 then begin
m_dwThinkTick:=GetTickCount();
if m_PEnvir.GetXYObjCount(m_nCurrX,m_nCurrY) >= 2 then m_boDupMode:=True;
if not IsProperTarget{FFFF4}(m_TargetCret) then m_TargetCret:=nil;
end; //004A8ED2
if m_boDupMode then begin
nOldX:=m_nCurrX;
nOldY:=m_nCurrY;
WalkTo(Random(8),False);
if (nOldX <> m_nCurrX) or (nOldY <> m_nCurrY) then begin
m_boDupMode:=False;
Result:=True;
end;
end;
end;
function TMagicMonster.AttackTarget():Boolean; //004A8F34
var
bt06:Byte;
begin
Result:=False;
if m_TargetCret <> nil then begin
if m_TargetCret = m_Master then begin //nicky
m_TargetCret := nil;
end else begin
if GetAttackDir(m_TargetCret,bt06) then begin
if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
m_dwHitTick:=GetCurrentTime;
m_dwTargetFocusTick:=GetTickCount();
// Attack(m_TargetCret,bt06); //FFED
end;
Result:=True;
end else begin
if m_TargetCret.m_PEnvir = m_PEnvir then begin
SetTargetXY(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY); {0FFF0h}
//004A8FE3
end else begin
DelTargetCreat();{0FFF1h}
//004A9009
end;
end;
end;
end;
end;
procedure TMagicMonster.Run; //004A9020
var
nX,nY:Integer;
begin
if not m_boFixedHideMode and
not m_boStoneMode and
CanMove 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 (GetCurrentTime - m_dwWalkTick > GetWalkSpeed) then begin
m_dwWalkTick:=GetCurrentTime;
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;
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;
nPower:integer;
//UserMagic: pTUserMagic;
begin
if not bo554 and CanMove 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 Integer((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 bo554 and CanMove 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;
m_dwSpellTick:=GetTickCount();
m_dwLastWalkTick:=GetTickCount();
m_boApproach:=FALSE;
end;
destructor TFrostTiger.Destroy;
begin
inherited;
end;
procedure TFrostTiger.Run;//004A9720
begin
if (not bo554) and CanMove then begin
if m_TargetCret = nil then begin //if theres no target stay transparent
if not m_boHideMode then begin
if (gettickcount - m_dwLastWalkTick > 2000) then begin
m_dwLastWalkTick := GetTickCount();
MagicManager.MagMakePrivateTransparent(Self,180);
SendRefMsg(RM_DIGDOWN, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;
end else
m_dwLastWalkTick := GetTickCount();
end else begin
//there is a target so take of transparency
if not m_TargetCret.m_boDeath then begin
if m_boHideMode then begin
m_wStatusTimeArr[STATE_TRANSPARENT{0x70}]:=1;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;
end else
m_TargetCret := nil;
if (Integer(GetTickCount - m_dwLastWalkTick) > m_nWalkSpeed) then begin //check if we should walk closer or not and do it :p
m_dwLastWalkTick:=GetTickCount();
m_nTargetX:=m_TargetCret.m_nCurrX;
m_nTargetY:=m_TargetCret.m_nCurry;
GotoTargetXY();
end;
end;
if ((GetTickCount - m_dwSpellTick) > 3000) and (m_TargetCret <> nil) then begin
if (abs(m_TargetCret.m_nCurrX-m_nCurrX) >= 2) or (abs(m_TargetCret.m_nCurrY-m_nCurry) >= 2) then begin
m_dwSpellTick:=GetTickCount();
FrostAttack();
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -