📄 objmon.pas
字号:
inherited ;
exit;
end; //004A93A6
if (m_nTargetX <> -1) and ((m_boApproach) or (m_Master <> nil)) then begin
GotoTargetXY(); //004A93B5 0FFEF
end else begin
if m_TargetCret = nil then Wondering();// FFEE //Jacky
end; //004A93D8
end;
end; //004A93D8
inherited;
end;
{ TChickenDeer }
constructor TChickenDeer.Create;//004A93E8
begin
inherited;
m_nViewRange:=5;
end;
destructor TChickenDeer.Destroy;
begin
inherited;
end;
procedure TChickenDeer.Run;//004A9438
var
I:Integer;
n10,nC,nDir:Integer;
BaseObject1C,BaseObject:TBaseObject;
begin
n10:=9999;
BaseObject:=nil;
BaseObject1C:=nil;
if not bo554 and CanMove then begin
if (GetCurrentTime - m_dwWalkTick > GetWalkSpeed) 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
(GetCurrentTime - m_dwWalkTick > GetWalkSpeed) then begin
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 6) and (abs(m_nCurrX - BaseObject.m_nCurrX) <= 6) then begin
nDir:=GetNextDirection(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY,m_nCurrX,m_nCurrY); //25/07 Damian
m_PEnvir.GetNextPosition(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY,nDir,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 bo554 and CanMove then begin
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) 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;
i,k,nX,nY,nDamage:Integer;
BaseObject:TBaseObject;
begin
m_btDirection:=btDir;
WAbil:=@m_WAbil;
nDamage:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
if nDamage <= 0 then exit;
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
for i:=0 to 4 do begin
for k:=0 to 4 do begin
if (g_Config.SpitMap[btDir,i,k] = 1) then begin
nX := m_nCurrX - 2 + k;
nY := m_nCurrY - 2 + i;
BaseObject:=m_PEnvir.GetMovingObject(nX,nY,True);
if (BaseObject <> nil) and
(BaseObject <> Self) and
(IsProperTarget(BaseObject)) and
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) then begin
nDamage:=BaseObject.GetMagStruckDamage(Self,nDamage);
if nDamage > 0 then begin
BaseObject.StruckDamage(nDamage);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,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;
end;
end;
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 GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
m_dwHitTick:=GetCurrentTime;
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 }
constructor THighRiskSpider.Create;//004A9B64
begin
inherited;
m_boAnimal:=False;
m_boUsePoison:=False;
end;
destructor THighRiskSpider.Destroy;
begin
inherited;
end;
{ TDoubleCriticalMonster }
constructor TDoubleCriticalMonster.Create;
begin
inherited;
m_n7A0:=0;
end;
destructor TDoubleCriticalMonster.Destroy;
begin
inherited;
end;
procedure TDoubleCriticalMonster.Run;
begin
inherited;
end;
procedure TDoubleCriticalMonster.Attack(Target:TBaseObject; nDir:Integer);
var
WAbil:pTAbility;
nPower:Integer;
n18:Integer;
begin
WAbil:=@m_WAbil;
nPower:=GetAttackPower(LoWord(WAbil.DC),SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
Inc(m_n7A0);
if (m_n7A0 > 5) or (Random(10) = 0) then begin
m_n7A0 := 0;
{CODE:0050AEE6 fild [ebp+nPower]
CODE:0050AEE9 mov eax, [ebp+WAbil]
CODE:0050AEEC movzx eax, word ptr [eax+4Ah]
CODE:0050AEF0 mov [ebp+var_18], eax
CODE:0050AEF3 fild [ebp+var_18]
CODE:0050AEF6 fdiv 10
CODE:0050AEFC fmulp st(1), st
CODE:0050AEFE call @@ROUND
CODE:0050AF03 mov [ebp+nPower], eax
CODE:0050AF06 mov cl, [ebp+var_9]
CODE:0050AF09 mov edx, [ebp+nPower]
CODE:0050AF0C mov eax, [ebp+WAbil]}
Run;
end else
HitMagAttackTarget(Target,0,nPower,True);
end;
{function TDoubleCriticalMonster.AttackTarget: Boolean;
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if TargetInSpitRange(m_TargetCret,btDir) then begin
if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
m_dwHitTick:=GetCurrentTime;
m_dwTargetFocusTick:=GetTickCount();
DoubleAttack(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;
procedure TDoubleCriticalMonster.DoubleAttack(btDir:Byte);
var
WAbil:pTAbility;
i,k,nX,nY,nDamage:Integer;
BaseObject:TBaseObject;
begin
m_btDirection:=btDir;
WAbil:=@m_WAbil;
nDamage:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
if nDamage <= 0 then exit;
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
for i:=0 to 4 do begin
for k:=0 to 4 do begin
if (g_Config.SpitMap[btDir,i,k] = 1) then begin
nX := m_nCurrX - 2 + k;
nY := m_nCurrY - 2 + i;
BaseObject:=m_PEnvir.GetMovingObject(nX,nY,True);
if (BaseObject <> nil) and
(BaseObject <> Self) and
(IsProperTarget(BaseObject)) and
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) then begin
nDamage:=BaseObject.GetHitStruckDamage(Self,nDamage);
if nDamage > 0 then begin
BaseObject.StruckDamage(nDamage);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,m_WAbil.HP,m_WAbil.MaxHP,Integer(Self),'',300);
end;
end;
end;
end;
end;
end;}
{ TBigPoisionSpider }
constructor TBigPoisionSpider.Create;//004A9BBC
begin
inherited;
m_boAnimal:=False;
m_boUsePoison:=True;
end;
destructor TBigPoisionSpider.Destroy;
begin
inherited;
end;
{ TGasAttackMonster }
constructor TGasAttackMonster.Create; //004A9C14
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
m_boAnimal:=True;
end;
destructor TGasAttackMonster.Destroy;
begin
inherited;
end;
function TGasAttackMonster.sub_4A9C78(bt05: Byte):TBaseObject;
var
WAbil:pTAbility;
n10:integer;
BaseObject:TBaseObject;
begin
Result:=nil;
m_btDirection:=bt05;
WAbil:=@m_WAbil;
n10:=Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC);
if n10 > 0 then begin
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
BaseObject:=GetPoseCreate();
if (BaseObject <> nil) and
IsProperTarget(BaseObject) and
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) then begin
n10:=BaseObject.GetMagStruckDamage(Self,n10);
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),'',300);
if Random(BaseObject.m_btAntiPoison + 20) = 0 then begin
BaseObject.MakePosion(POISON_STONE,5,0)
end;
Result:=BaseObject;
end;
end;
end;
end;
function TGasAttackMonster.AttackTarget():Boolean;//004A9DD4
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if GetAttackDir(m_TargetCret,btDir) then begin
if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
m_dwHitTick:=GetCurrentTime;
m_dwTargetFocusTick:=GetTickCount();
sub_4A9C78(btDir);
BreakHolySeizeMode();
end;
Result:=True;
end else begin
if m_TargetCret.m_PEnvir = m_PEnvir then begin
SetTargetXY(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
end else begin
DelTargetCreat();
end;
end;
end;
{ TCowMonster }
constructor TCowMonster.Create;//004A9EB4
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
end;
destructor TCowMonster.Destroy;
begin
inherited;
end;
{ TMagCowMonster }
constructor TMagCowMonster.Create;//004A9F10
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
end;
destructor TMagCowMonster.Destroy;
begin
inherited;
end;
procedure TMagCowMonster.sub_4A9F6C(btDir: Byte);
var
WAbil:pTAbility;
n10:integer;
BaseObject:TBaseObject;
begin
m_btDirection:=btDir;
WAbil:=@m_WAbil;
n10:=Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC);
if n10 > 0 then begin
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
BaseObject:=GetPoseCreate();
if (BaseObject <> nil) and
IsProperTarget(BaseObject) and
(m_nAntiMagic >= 0) then begin
n10:=BaseObject.GetMagStruckDamage(Self,n10);
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),'',300);
end;
end;
end;
end;
function TMagCowMonster.AttackTarget: Boolean;//004AA084
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if GetAttackDir(m_TargetCret,btDir) then begin
if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
m_dwHitTick:=GetCurrentTime;
m_dwTargetFocusTick:=GetTickCount();
sub_4A9F6C(btDir);
BreakHolySeizeMode();
end;
Result:=True;
end else begin
if m_TargetCret.m_PEnvir = m_PEnvir then begin
SetTargetXY(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
end else begin
DelTargetCreat();
end;
end;
end;
{ TCowKingMonster }
constructor TCowKingMonster.Create;//004AA160
begin
inherited;
m_dwSearchTime:=Random(1500) + 500;
dw558:=GetTickCount();
bo2BF:=True;
n560:=0;
bo55C:=False;
bo55D:=False;
end;
destructor TCowKingMonster.Destroy;
begin
inherited;
end;
procedure TCowKingMonster.Attack(TargeTBaseObject: TBaseObject; nDir: Integer); //004AA1F0
var
WAbil:pTAbility;
nPower:integer;
begin
WAbil:=@m_WAbil;
nPower:=GetAttackPower(LoWord(WAbil.DC),SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -