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

📄 objmon3.pas

📁 原版翎风(LF)引擎(M2)源码(Delphi)
💻 PAS
📖 第 1 页 / 共 4 页
字号:
unit ObjMon3;

interface

uses
  Windows, Classes, Grobal2, ObjBase, ObjMon, ObjMon2;

type

  TRonObject = class(TMonster)
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure AroundAttack;
    procedure Run; override;
  end;

  TMinorNumaObject = class(TATMonster)
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TSandMobObject = class(TStickMonster)
  private
    m_dwAppearStart: LongWord;

  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TRockManObject = class(TATMonster)
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TMagicMonObject = class(TMonster)
  private
    m_boUseMagic: Boolean;

    procedure LightingAttack(nDir: Integer);

  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TBoneKingMonster = class(TMonster)
  private
    m_nDangerLevel: Integer;
    m_SlaveObjectList: TList; //0x55C

    procedure CallSlave;
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer); override; //0FFED
    procedure Run; override;
  end;



  TPercentMonster = class(TAnimalObject)
    n54C: Integer;
    m_dwThinkTick: LongWord;
    bo554: Boolean;
    m_boDupMode: Boolean;
  private
    function Think: Boolean;
    function MakeClone(sMonName: string; OldMon: TBaseObject): TBaseObject;
  public
    constructor Create(); override;
    destructor Destroy; override;
    function Operate(ProcessMsg: pTProcessMessage): Boolean; override;
    function AttackTarget(): Boolean; virtual;
    procedure Run; override;
  end;

  TMagicMonster = class(TAnimalObject)
    n54C: Integer;
    m_dwThinkTick: LongWord;
    m_dwSpellTick: LongWord;
    bo554: Boolean;
    m_boDupMode: Boolean;
  private
    function Think: Boolean;
    function MakeClone(sMonName: string; OldMon: TBaseObject): TBaseObject;
  public
    constructor Create(); override;
    destructor Destroy; override;
    function Operate(ProcessMsg: pTProcessMessage): Boolean; override;
    function AttackTarget(): Boolean; virtual;
    procedure Run; override;
  end;

  TFireBallMonster = class(TMagicMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TFireMonster = class(TMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TFrostTiger = class(TMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TGreenMonster = class(TMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TRedMonster = class(TMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TKhazard = class(TMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TRunAway = class(TMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TTeleMonster = class(TMonster)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TDefendMonster = class(TMonster)
  private
    m_GuardObjects: TList;

    procedure CallGuard(mapmap: string; xx, yy: Integer);
  public
    callguardrun: Boolean;
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TClone = class(TMonster)
  private
    procedure LightingAttack(nDir: Integer);

  public
    constructor Create(); override;
    function Operate(ProcessMsg: pTProcessMessage): Boolean; override;
    procedure Struck(hiter: TBaseObject); virtual;
    destructor Destroy; override;
    procedure Run; override;
  end;

implementation

uses
  UsrEngn, M2Share, Event, SysUtils;




constructor TRonObject.Create;
begin
  inherited;
  m_dwSearchTime := Random(1500) + 1500;
end;

destructor TRonObject.Destroy;
begin
  inherited;
end;

procedure TRonObject.AroundAttack;
var
  xTargetList: TList;
  BaseObject: TBaseObject;
  wHitMode: Word;
  i: Integer;
begin
  wHitMode := 0;
  GetAttackDir(m_TargetCret, m_btDirection);

  xTargetList := TList.Create;
  GetMapBaseObjects(m_PEnvir, m_nCurrX, m_nCurrY, 1, xTargetList);

  if (xTargetList.Count > 0) then
  begin
    for i := xTargetList.Count - 1 downto 0 do
    begin
      BaseObject := TBaseObject(xTargetList.Items[i]);

      if (BaseObject <> nil) then
      begin
        _Attack(wHitMode, BaseObject); //CM_HIT

        xTargetList.Delete(i);
      end;
    end;
  end;
  xTargetList.Free;

  SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;

procedure TRonObject.Run;
begin
  if (not m_boDeath) and (not m_boGhost) and (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
  begin
    if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
      (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then
    begin
      m_dwSearchEnemyTick := GetTickCount();
      SearchTarget();
    end;

    if (m_TargetCret <> nil) and
      (abs(m_nCurrX - m_TargetCret.m_nCurrX) < 6) and
      (abs(m_nCurrY - m_TargetCret.m_nCurrY) < 6) and
      (Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime) then
    begin

      m_dwHitTick := GetTickCount();
      AroundAttack;
    end;
  end;

  inherited;
end;

constructor TMinorNumaObject.Create;
begin
  inherited;
end;

destructor TMinorNumaObject.Destroy;
begin
  inherited;
end;

procedure TMinorNumaObject.Run;
begin
  if (not m_boDeath) 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;

constructor TSandMobObject.Create;
begin
  inherited;
  //m_boHideMode := TRUE;
  nComeOutValue := 8;
end;

destructor TSandMobObject.Destroy;
begin
  inherited;
end;

procedure TSandMobObject.Run;
begin
  if (not m_boDeath) and (not m_boGhost) then
  begin
    if (Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) then
    begin
      m_dwWalkTick := GetTickCount;

      if (m_boFixedHideMode) then
      begin
        if (((m_WAbil.HP > (m_WAbil.MaxHP / 20)) and CheckComeOut())) then
          m_dwAppearStart := GetTickCount;
      end else
      begin
        if ((m_WAbil.HP > 0) and (m_WAbil.HP < (m_WAbil.MaxHP / 20)) and (GetTickCount - m_dwAppearStart > 3000)) then
          ComeDown
        else if (m_TargetCret <> nil) then
        begin
          if (abs(m_nCurrX - m_TargetCret.m_nCurrX) > 15) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) > 15) then
          begin
            ComeDown;
            Exit;
          end;
        end;

        if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
          SearchTarget();

        if (not m_boFixedHideMode) then
        begin
          if (AttackTarget) then
            inherited;
        end;
      end;
    end;
  end;

  inherited;
end;

constructor TRockManObject.Create;
begin
  inherited;
  //m_dwSearchTick := 2500 + Random(1500);
  //m_dwSearchTime := GetTickCount();

  m_boHideMode := True;
end;

destructor TRockManObject.Destroy;
begin
  inherited;
end;

procedure TRockManObject.Run;
begin
  {if (not m_fIsDead) and (not m_fIsGhost) then begin
  if (m_fHideMode) then begin
   if (CheckComeOut(8)) then
    ComeOut;

   m_dwWalkTime := GetTickCount + 1000;
  end else begin
   if ((GetTickCount - m_dwSearchEnemyTime > 8000) or ((GetTickCount - m_dwSearchEnemyTime > 1000) and (m_pTargetObject=nil))) then begin
    m_dwSearchEnemyTime := GetTickCount;
    MonsterNormalAttack;

    if (m_pTargetObject=nil) then
     ComeDown;
   end;
  end;
 end;}

  inherited;
end;


{ TMagicMonObject }

constructor TMagicMonObject.Create;
begin
  inherited;
  m_dwSearchTime := Random(1500) + 1500;
  m_boUseMagic := False;
end;

destructor TMagicMonObject.Destroy;
begin

  inherited;
end;

procedure TMagicMonObject.LightingAttack(nDir: Integer);
begin

end;

procedure TMagicMonObject.Run;
var
  nAttackDir: Integer;
  nX, nY: Integer;
begin
  if (not m_boDeath) and
    (not bo554) and
    (not m_boGhost) and
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
  begin

     //血量低于一半时开始用魔法攻击
    if m_WAbil.HP < m_WAbil.MaxHP div 2 then m_boUseMagic := True
    else m_boUseMagic := False;

    if ((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil) then
    begin
      m_dwSearchEnemyTick := GetTickCount();
      SearchTarget();
    end;
    if m_Master = nil then Exit;

    nX := abs(m_nCurrX - m_Master.m_nCurrX);
    nY := abs(m_nCurrY - m_Master.m_nCurrY);

    if (nX <= 5) and (nY <= 5) then
    begin
      if m_boUseMagic or ((nX = 5) or (nY = 5)) then
      begin
        if (Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime) then
        begin
          m_dwHitTick := GetTickCount();
          nAttackDir := GetNextDirection(m_nCurrX, m_nCurrY, m_Master.m_nCurrX, m_Master.m_nCurrY);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -