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

📄 objmon3.pas

📁 原版翎风(LF)引擎(M2)源码(Delphi)
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    not m_boDeath and
    not m_boFixedHideMode and
    not m_boStoneMode and
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) 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 (Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) then
    begin
      m_dwWalkTick := GetTickCount();
      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; //004A93D8  if not bo510 and ((GetTickCount - m_dwWalkTick) > n4FC) then begin
  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;
  PlayObject: TPlayObject;
  nPower: Integer;
  //UserMagic: pTUserMagic;
  m_DefMsg: TDefaultMessage;
  n08, nAttackDir: Integer;
begin
  if not m_boDeath and
    not bo554 and
    not m_boGhost 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 (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 m_boDeath and
    not bo554 and
    not m_boGhost and
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) 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;
end;

destructor TFrostTiger.Destroy;
begin

  inherited;
end;

procedure TFrostTiger.Run; //004A9720
var
  BaseObject: TBaseObject;
  dosay: Boolean;
begin
  if not m_boDeath and
    not bo554 and
    not m_boGhost and
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
  begin

    if m_TargetCret = nil then
    begin
      if m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] = 0 then
      begin
        MagicManager.MagMakePrivateTransparent(Self, 180);
      end;
    end else
    begin
 //mainoutmessage('process say');
  // ProcessSayMsg('I see you ' + m_TargetCret.m_sCharName + ', you will be sorry!');
 //  dosay:=true;
      m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] := 0;
    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;

{ TGreenMonster }

constructor TGreenMonster.Create; //004A9690
begin
  inherited;
  m_dwSearchTime := Random(1500) + 1500;
end;

destructor TGreenMonster.Destroy;
begin

  inherited;
end;

procedure TGreenMonster.Run; //004A9720
begin
  if not m_boDeath and
    not bo554 and
    not m_boGhost and
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
  begin
    if m_TargetCret <> nil then
    begin
      m_nTargetX := m_TargetCret.m_nCurrX;
      m_nTargetY := m_TargetCret.m_nCurrY;
      if (abs(m_nTargetX - m_nCurrX) = 1) and (abs(m_nTargetY - m_nCurrY) = 1) then
      begin
        if (Random(m_TargetCret.m_btAntiPoison + 7) <= 6) and (m_TargetCret.m_wStatusTimeArr[POISON_DECHEALTH] = 0) then
        begin
          m_TargetCret.MakePosion(POISON_DECHEALTH, 30, 1);
        end;
      end;
    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;

⌨️ 快捷键说明

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