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

📄 objhero.pas

📁 飞尔传奇世界的引擎代码可直接编译M2Engine 请使用Delphi编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      m_sCharName + #9 +
      '0' + #9 +
      '0' + #9 +
      '1' + #9 +
      '0'); }
    IncHealthSpell(2000, 2000);
  end;
end;

function THeroObject.RunToTargetXY(nTargetX, nTargetY: Integer): Boolean;
var
  nDir: Integer;
  n10: Integer;
  n14: Integer;
begin
  Result := False;
  n10 := nTargetX;
  n14 := nTargetY;
  dwTick3F4 := GetTickCount();
  nDir := DR_DOWN;
  if n10 > m_nCurrX then begin
    nDir := DR_RIGHT;
    if n14 > m_nCurrY then nDir := DR_DOWNRIGHT;
    if n14 < m_nCurrY then nDir := DR_UPRIGHT;
  end else begin
    if n10 < m_nCurrX then begin
      nDir := DR_LEFT;
      if n14 > m_nCurrY then nDir := DR_DOWNLEFT;
      if n14 < m_nCurrY then nDir := DR_UPLEFT;
    end else begin
      if n14 > m_nCurrY then nDir := DR_DOWN
      else if n14 < m_nCurrY then nDir := DR_UP;
    end;
  end;
  if not RunTo(nDir, False, nTargetX, nTargetY) then begin
    Result := WalkToTargetXY(nTargetX, nTargetY);
  end else begin
    if (abs(nTargetX - m_nCurrX) <= 1) and (abs(nTargetY - m_nCurrY) <= 1) then begin
      Result := True;
    end;
  end;
end;

function THeroObject.WalkToTargetXY(nTargetX, nTargetY: Integer): Boolean;
var
  I: Integer;
  nDir: Integer;
  n10: Integer;
  n14: Integer;
  n20: Integer;
  nOldX: Integer;
  nOldY: Integer;
  n16: Integer;
begin
  Result := False;
  if (abs(nTargetX - m_nCurrX) > 1) or (abs(nTargetY - m_nCurrY) > 1) then begin
    n10 := nTargetX;
    n14 := nTargetY;
    dwTick3F4 := GetTickCount();
    nDir := DR_DOWN;
    if n10 > m_nCurrX then begin
      nDir := DR_RIGHT;
      if n14 > m_nCurrY then nDir := DR_DOWNRIGHT;
      if n14 < m_nCurrY then nDir := DR_UPRIGHT;
    end else begin
      if n10 < m_nCurrX then begin
        nDir := DR_LEFT;
        if n14 > m_nCurrY then nDir := DR_DOWNLEFT;
        if n14 < m_nCurrY then nDir := DR_UPLEFT;
      end else begin
        if n14 > m_nCurrY then nDir := DR_DOWN
        else if n14 < m_nCurrY then nDir := DR_UP;
      end;
    end;
    nOldX := m_nCurrX;
    nOldY := m_nCurrY;
    WalkTo(nDir, False);
    if (abs(nTargetX - m_nCurrX) <= 1) and (abs(nTargetY - m_nCurrY) <= 1) then Result := True;
    if not Result then begin
      n20 := Random(3);
      for I := DR_UP to DR_UPLEFT do begin
        if (nOldX = m_nCurrX) and (nOldY = m_nCurrY) then begin
          if n20 <> 0 then Inc(nDir)
          else if nDir > 0 then Dec(nDir)
          else nDir := DR_UPLEFT;
          if (nDir > DR_UPLEFT) then nDir := DR_UP;
          WalkTo(nDir, False);
          if (abs(nTargetX - m_nCurrX) <= 1) and (abs(nTargetY - m_nCurrY) <= 1) then begin
            Result := True;
            Break;
          end;
        end;
      end;
    end;
  end;
end;

function THeroObject.WalkToTargetXY2(nTargetX, nTargetY: Integer): Boolean;
var
  I: Integer;
  nDir: Integer;
  n10: Integer;
  n14: Integer;
  n20: Integer;
  nOldX: Integer;
  nOldY: Integer;
  n16: Integer;
begin
  Result := False;
  if (nTargetX <> m_nCurrX) or (nTargetY <> m_nCurrY) then begin
    n10 := nTargetX;
    n14 := nTargetY;
    dwTick3F4 := GetTickCount();
    nDir := DR_DOWN;
    if n10 > m_nCurrX then begin
      nDir := DR_RIGHT;
      if n14 > m_nCurrY then nDir := DR_DOWNRIGHT;
      if n14 < m_nCurrY then nDir := DR_UPRIGHT;
    end else begin
      if n10 < m_nCurrX then begin
        nDir := DR_LEFT;
        if n14 > m_nCurrY then nDir := DR_DOWNLEFT;
        if n14 < m_nCurrY then nDir := DR_UPLEFT;
      end else begin
        if n14 > m_nCurrY then nDir := DR_DOWN
        else if n14 < m_nCurrY then nDir := DR_UP;
      end;
    end;
    nOldX := m_nCurrX;
    nOldY := m_nCurrY;
    WalkTo(nDir, False);
    if (nTargetX = m_nCurrX) and (nTargetY = m_nCurrY) then Result := True;
    if not Result then begin
      n20 := Random(3);
      for I := DR_UP to DR_UPLEFT do begin
        if (nOldX = m_nCurrX) and (nOldY = m_nCurrY) then begin
          if n20 <> 0 then Inc(nDir)
          else if nDir > 0 then Dec(nDir)
          else nDir := DR_UPLEFT;
          if (nDir > DR_UPLEFT) then nDir := DR_UP;
          WalkTo(nDir, False);
          if (nTargetX = m_nCurrX) and (nTargetY = m_nCurrY) then begin
            Result := True;
            Break;
          end;
        end;
      end;
    end;
  end;
end;

function THeroObject.GotoTargetXY(nTargetX, nTargetY: Integer): Boolean;
begin
  if (abs(m_nCurrX - nTargetX) >= 3) or (abs(m_nCurrY - nTargetY) >= 3) then begin
    Result := RunToTargetXY(nTargetX, nTargetY);
  end else begin
    Result := WalkToTargetXY2(nTargetX, nTargetY);
  end;
end;

function THeroObject.Operate(ProcessMsg: pTProcessMessage): Boolean;
begin
  //  Result:=False;
  case ProcessMsg.wIdent of
    RM_STRUCK: begin
        if (ProcessMsg.BaseObject = Self) and (TBaseObject(ProcessMsg.nParam3 {AttackBaseObject}) <> nil) then begin
          SetLastHiter(TBaseObject(ProcessMsg.nParam3 {AttackBaseObject}));
          Struck(TBaseObject(ProcessMsg.nParam3 {AttackBaseObject})); {0FFEC}
          BreakHolySeizeMode();
          if (m_Master <> nil) and
            (TBaseObject(ProcessMsg.nParam3) <> m_Master) and
            (TBaseObject(ProcessMsg.nParam3).m_btRaceServer = RC_PLAYOBJECT) then begin
            m_Master.SetPKFlag(TBaseObject(ProcessMsg.nParam3));
          end;
          if g_Config.boMonSayMsg then MonsterSayMsg(TBaseObject(ProcessMsg.nParam3), s_UnderFire);
        end;
        Result := True;
      end;
  else begin
      Result := inherited Operate(ProcessMsg);
    end;
  end;
end;

function THeroObject.CompareHP(BaseObject1, BaseObject2: TBaseObject): Boolean;
var
  HP1, HP2: Integer;
begin
  HP1 := BaseObject1.m_WAbil.HP * 100 div BaseObject1.m_WAbil.MaxHP;
  HP2 := BaseObject2.m_WAbil.HP * 100 div BaseObject2.m_WAbil.MaxHP;
  Result := HP1 > HP2;
end;
function THeroObject.CompareLevel(BaseObject1, BaseObject2: TBaseObject): Boolean;
begin
  Result := BaseObject1.m_WAbil.Level < BaseObject2.m_WAbil.Level;
end;
function THeroObject.CompareXY(BaseObject1, BaseObject2: TBaseObject): Boolean;
var
  nXY1, nXY2: Integer;
begin
  nXY1 := abs(BaseObject1.m_nCurrX - m_nCurrX) + abs(BaseObject1.m_nCurrY - m_nCurrY);
  nXY2 := abs(BaseObject2.m_nCurrX - m_nCurrX) + abs(BaseObject2.m_nCurrY - m_nCurrY);
  Result := nXY1 > nXY2;
end;

procedure THeroObject.Struck(hiter: TBaseObject);
var
  btDir: Byte;
begin
  if not m_boTarget then begin
    m_dwStruckTick := GetTickCount;
    if hiter <> nil then begin
      if (m_TargetCret = nil) or GetAttackDir(m_TargetCret, btDir) or (Random(6) = 0) then begin
        if IsProperTarget(hiter) then
          SetTargetCreat(hiter);
      end;
    end;
    if m_boAnimal then begin
      m_nMeatQuality := m_nMeatQuality - Random(300);
      if m_nMeatQuality < 0 then m_nMeatQuality := 0;
    end;
  end;
  m_dwHitTick := m_dwHitTick + LongWord(150 - _MIN(130, m_Abil.Level * 4));
end;

procedure THeroObject.Attack(TargeTBaseObject: TBaseObject; nDir: Integer);
begin
  inherited AttackDir(TargeTBaseObject, m_wHitMode, nDir);
end;

procedure THeroObject.DelTargetCreat;
begin
  inherited;
  m_nTargetX := -1;
  m_nTargetY := -1;
end;

procedure THeroObject.SearchTarget;
var
  BaseObject, BaseObject18: TBaseObject;
  I, nC, n10: Integer;
begin
  if (m_TargetCret = nil) and m_boTarget then m_boTarget := False;
  if (m_TargetCret <> nil) and m_TargetCret.m_boDeath and m_boTarget then m_boTarget := False;
  if (m_btStatus = 1) and not m_boProtectStatus and not m_boTarget then begin
    BaseObject18 := nil;
    n10 := 9999;
    for I := 0 to m_VisibleActors.Count - 1 do begin
      BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
      if BaseObject <> nil then begin
        if not BaseObject.m_boDeath then begin
          if IsProperTarget(BaseObject) and
            (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;
              BaseObject18 := BaseObject;
            end;
          end;
        end;
      end;
    end;
    if BaseObject18 <> nil then begin
      SetTargetCreat(BaseObject18);
      {if (m_TargetCret <> nil) and (m_TargetCret.m_boDeath) then m_TargetCret := nil;
      if m_TargetCret <> nil then begin
        if CompareHP(m_TargetCret, BaseObject18) and CompareLevel(m_TargetCret, BaseObject18) and CompareXY(m_TargetCret, BaseObject18) then begin
          SetTargetCreat(BaseObject18);
        end;
      end else SetTargetCreat(BaseObject18); }
    end;
  end;
end;

procedure THeroObject.SetTargetXY(nX, nY: Integer);
begin
  m_nTargetX := nX;
  m_nTargetY := nY;
end;

procedure THeroObject.Wondering;
begin
  if (Random(10) = 0) then
    if (Random(4) = 1) then TurnTo(Random(8))
    else WalkTo(m_btDirection, False);
end;

function THeroObject.IsAllowUseMagic(wMagIdx: Word): Boolean;
var
  UserMagic: pTUserMagic;
begin
  Result := False;
  UserMagic := CheckUserMagic(wMagIdx);
  if UserMagic <> nil then begin
    if GetSpellPoint(UserMagic) < m_WAbil.MP then Result := True;
  end;
end;

function THeroObject.SelectMagic(): Integer;
var
  wHitMode: Word;
  UserMagic: pTUserMagic;
begin
  Result := 0;
  case m_btJob of
    0: begin //战士
        if IsAllowUseMagic(26) and (not m_boFireHitSkill) and ((GetTickCount - m_dwLatestFireHitTick) > 10 * 1000) then begin {烈火}
          AllowFireHitSkill;
          Result := 26;
          Exit;
        end;
        if CheckTargetXYCount(m_nCurrX, m_nCurrY, 2) >= 4 then begin //被怪物包围
          if IsAllowUseMagic(41) and (GetTickCount - m_SkillUseTick[41] > 1000 * 10) then begin
            m_SkillUseTick[41] := GetTickCount; //狮子吼
            Result := 41;
            Exit;
          end else
            if IsAllowUseMagic(39) and (GetTickCount - m_SkillUseTick[39] > 1000 * 10) then begin
            m_SkillUseTick[39] := GetTickCount; //英雄彻地钉
            Result := 39;
            Exit;
          end else
            if IsAllowUseMagic(40) then begin //英雄抱月刀法
            if not m_boCrsHitkill then begin
              SkillCrsOnOff(True);
            end;
            Result := 40;
            Exit;
          end else begin
            if (m_wLastHP - m_WAbil.HP) > (m_WAbil.MaxHP div 5) then begin
              if IsAllowUseMagic(12) then begin //英雄刺杀剑术
                if not m_boUseThrusting then begin
                  ThrustingOnOff(True);
                end;
                Result := 12;
              end else
                if IsAllowUseMagic(25) then begin
                if not m_boUseHalfMoon then begin
                  HalfMoonOnOff(True);
                end;
                Result := 25;
              end else
                if IsAllowUseMagic(40) then begin //英雄抱月刀法
                if not m_boCrsHitkill then begin
                  SkillCrsOnOff(True);
                end;
                Result := 40;
              end else
                if IsAllowUseMagic(39) and (GetTickCount - m_SkillUseTick[39] > 1000 * 10) then begin
                m_SkillUseTick[39] := GetTickCount; //英雄彻地钉
                Result := 39;
                Exit;
              end;
              m_wLastHP := m_WAbil.HP;
       

⌨️ 快捷键说明

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