📄 objmon2.pas
字号:
destructor TBigHeartMonster.Destroy;
begin
inherited;
end;
function TBigHeartMonster.AttackTarget():Boolean; //004A5FEC
var
I: Integer;
BaseObject:TBaseObject;
nPower:Integer;
WAbil:pTAbility;
begin
Result:=False;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
SendRefMsg(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
SendDelayMsg(Self,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),1,Integer(BaseObject),'',200);
SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,1{type},'');
end;
end;
end; // for
Result:=True;
end;
// inherited;
end;
procedure TBigHeartMonster.Run;//004A617C
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if m_VisibleActors.Count > 0 then
AttackTarget();
end;
inherited;
end;
constructor Tbigheatmovemonster.Create;//004A5F94
begin
inherited;
m_nViewRange:=16;
m_boAnimal:=False;
m_boBOSS:=true;
end;
destructor Tbigheatmovemonster.Destroy;
begin
inherited;
end;
function Tbigheatmovemonster.AttackTarget():Boolean; //004A5FEC
var
I: Integer;
BaseObject:TBaseObject;
nPower:Integer;
WAbil:pTAbility;
begin
Result:=False;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
SendRefMsg(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
SendDelayMsg(Self,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),1,Integer(BaseObject),'',200);
SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,1{type},'');
end;
end;
end; // for
Result:=True;
end;
// inherited;
end;
procedure Tbigheatmovemonster.Run;//004A617C
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if m_VisibleActors.Count > 0 then
AttackTarget();
end;
inherited;
end;
//Tbigheatmonsteraxe
procedure Tbigheatmonsteraxe.FlyAxeAttack(Target:TBaseObject);
var
WAbil:pTAbility;
nDamage:Integer;
begin
if m_PEnvir.CanFly(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY) then begin // true
m_btDirection:=GetNextDirection(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY);
WAbil:=@m_WAbil;
nDamage:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
if nDamage > 0 then begin
nDamage:=Target.GetHitStruckDamage(Self,nDamage);
end;
if nDamage > 0 then begin
Target.StruckDamage(nDamage);
Target.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,Target.m_WAbil.HP,Target.m_WAbil.MaxHP,Integer(Self),'',
_MAX(abs(m_nCurrX - Target.m_nCurrX),abs(m_nCurrY - Target.m_nCurrY)) * 50 + 600);
end;
SendRefMsg(RM_FLYAXE,m_btDirection,m_nCurrX,m_nCurrY,Integer(Target),'');
end;
end;
constructor Tbigheatmonsteraxe.Create;//004A5F94
begin
inherited;
m_nViewRange:=16;
m_boAnimal:=False;
m_boBOSS:=true;
// m_nNextHitTime:=1500;
end;
destructor Tbigheatmonsteraxe.Destroy;
begin
inherited;
end;
function Tbigheatmonsteraxe.AttackTarget():Boolean; //004A5FEC
var
I: Integer;
BaseObject:TBaseObject;
nPower:Integer;
WAbil:pTAbility;
begin
Result:=False;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime*2 then begin
m_dwHitTick:=GetTickCount();
SendRefMsg(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
// SendDelayMsg(Self,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),1,Integer(BaseObject),'',200);
// SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,1{type},'');
FlyAxeAttack(BaseObject);
if Random(15) = 1 then BaseObject.MakePosion(POISON_STONE,5,1);
end;
end;
end; // for
Result:=True;
end;
// inherited;
end;
procedure Tbigheatmonsteraxe.Run;//004A617C
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if m_VisibleActors.Count > 0 then
AttackTarget();
end;
inherited;
end;
////
procedure Tbigearmonsteraxe.FlyAxeAttack(Target:TBaseObject);
var
WAbil:pTAbility;
nDamage:Integer;
begin
if m_PEnvir.CanFly(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY) then begin // true
m_btDirection:=GetNextDirection(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY);
WAbil:=@m_WAbil;
nDamage:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
if nDamage > 0 then begin
nDamage:=Target.GetHitStruckDamage(Self,nDamage);
end;
if nDamage > 0 then begin
Target.StruckDamage(nDamage);
Target.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,Target.m_WAbil.HP,Target.m_WAbil.MaxHP,Integer(Self),'',
_MAX(abs(m_nCurrX - Target.m_nCurrX),abs(m_nCurrY - Target.m_nCurrY)) * 50 + 600);
end;
SendRefMsg(RM_FLYAXE,m_btDirection,m_nCurrX,m_nCurrY,Integer(Target),'ear');
end;
end;
constructor Tbigearmonsteraxe.Create;//004A5F94
begin
inherited;
m_nViewRange:=16;
m_boAnimal:=False;
// m_nNextHitTime:=1500;
end;
destructor Tbigearmonsteraxe.Destroy;
begin
inherited;
end;
function Tbigearmonsteraxe.AttackTarget():Boolean; //004A5FEC
var
I: Integer;
BaseObject:TBaseObject;
nPower:Integer;
WAbil:pTAbility;
begin
Result:=False;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime*2 then begin
m_dwHitTick:=GetTickCount();
SendRefMsg(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
// SendDelayMsg(Self,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),1,Integer(BaseObject),'',200);
// SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,1{type},'');
FlyAxeAttack(BaseObject);
// if Random(10) = 0 then BaseObject.MakePosion(POISON_STONE,5,1);
end;
end;
end; // for
Result:=True;
end;
// inherited;
end;
procedure Tbigearmonsteraxe.Run;//004A617C
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if m_VisibleActors.Count > 0 then
AttackTarget();
end;
inherited;
end;
{ TSpiderHouseMonster }
constructor TSpiderHouseMonster.Create;//004A61D0
begin
inherited;
m_nViewRange:=9;
m_nRunTime:=250;
m_dwSearchTime:=Random(1500) + 2500;
m_dwSearchTick:=0;
m_boStickMode:=True;
BBList:=TList.Create;
end;
destructor TSpiderHouseMonster.Destroy;
//004A6270
begin
BBList.Free;
inherited;
end;
procedure TSpiderHouseMonster.GenBB;//004A62B0
begin
if BBList.Count < 15 then begin
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
SendDelayMsg(Self,RM_ZEN_BEE,0,0,0,0,'',500);
end;
end;
function TSpiderHouseMonster.Operate(ProcessMsg:pTProcessMessage):Boolean;
var
BB:TBaseObject;
n08,n0C:Integer;
begin
if ProcessMsg.wIdent = RM_ZEN_BEE then begin
n08:=m_nCurrX;
n0C:=m_nCurrY + 1;
if m_PEnvir.CanWalk(n08,n0C,True) then begin
BB:=UserEngine.RegenMonsterByName(m_PEnvir.sMapName,n08,n0C,g_Config.sSpider);
if BB <> nil then begin
BB.SetTargetCreat(m_TargetCret);
BBList.Add(BB);
end;
end;
end;
Result:= inherited Operate(ProcessMsg);
end;
procedure TSpiderHouseMonster.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 GenBB();
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; // for
end;
end;
inherited;
end;
{ TExplosionSpider }
constructor TExplosionSpider.Create;
//004A6538
begin
inherited;
m_nViewRange:=5;
m_nRunTime:=250;
m_dwSearchTime:=Random(1500) + 2500;
m_dwSearchTick:=0;
dw558:=GetTickcount();
end;
destructor TExplosionSpider.Destroy;
begin
inherited;
end;
procedure TExplosionSpider.sub_4A65C4;
var
WAbil:pTAbility;
I,nPower,n10:Integer;
BaseObject:TBaseObject;
begin
m_WAbil.HP:=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) <= 1) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 1) then begin
n10:=0;
Inc(n10,BaseObject.GetHitStruckDamage(Self,nPower div 2));
Inc(n10,BaseObject.GetMagStruckDamage(Self,nPower div 2));
if n10 > 0 then begin
BaseObject.StruckDamage(n10);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,n10,BaseObject.m_WAbil.HP,BaseObject.m_WAbil.MaxHP,Integer(Self),'',700);
end;
end;
end;
end; // for
end;
function TExplosionSpider.AttackTarget: Boolean;
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if GetAttackDir(m_TargetCret,btDir) then begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
m_dwTargetFocusTick:=GetTickCount();
sub_4A65C4();
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;
procedure TExplosionSpider.Run;
begin
if not m_boDeath and not m_boGhost then
if (GetTickCount - dw558) > 60 * 1000 then begin
dw558:=GetTickcount();
sub_4A65C4();
end;
inherited;
end;
{ TGuardUnit }
procedure TGuardUnit.Struck(hiter: TBaseObject);
begin
inherited;
if m_Castle <> nil then begin
bo2B0:=True;
m_dw2B4Tick:=GetTickCount();
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -