⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objmon.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 4 页
字号:
        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 + -