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

📄 objplaymon.pas

📁 飞尔传奇世界的引擎代码可直接编译M2Engine 请使用Delphi编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    SKILL_ERGUM {12}: begin //刺杀剑法
        if m_MagicErgumSkill <> nil then begin
          if not m_boUseThrusting then begin
            m_boUseThrusting := True;
          end else begin
            m_boUseThrusting := False;
          end;
        end;
        Result := True;
      end;
    SKILL_BANWOL {25}: begin //半月弯刀
        if m_MagicBanwolSkill <> nil then begin
          if not m_boUseHalfMoon then begin
            m_boUseHalfMoon := True;
          end else begin
            m_boUseHalfMoon := False;
          end;
        end;
        Result := True;
        Exit;
      end;
    SKILL_FIRESWORD {26}: begin //烈火剑法
        if m_MagicFireSwordSkill <> nil then begin
          if AllowFireHitSkill then begin
            nSpellPoint := GetSpellPoint(m_MagicFireSwordSkill);
            if m_WAbil.MP >= nSpellPoint then begin
              if nSpellPoint > 0 then begin
                DamageSpell(nSpellPoint);
                //HealthSpellChanged();
              end;
            end;
          end;
        end;
        Result := True;
        Exit;
      end;
  else begin {使用魔法}
      for I := 0 to m_MagicList.Count - 1 do begin
        UserMagic := m_MagicList.Items[I];
        if (UserMagic <> nil) and (UserMagic.wMagIdx = wMagIdx) then begin
          m_btDirection := GetNextDirection(m_nCurrX, m_nCurrY, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
          BaseObject := nil;
          nNewTargetX := m_TargetCret.m_nCurrX;
          nNewTargetY := m_TargetCret.m_nCurrY;
            //检查目标角色,与目标座标误差范围,如果在误差范围内则修正目标座标
          if CretInNearXY(m_TargetCret, nNewTargetX, nNewTargetY) then begin
            BaseObject := m_TargetCret;
            nNewTargetX := BaseObject.m_nCurrX;
            nNewTargetY := BaseObject.m_nCurrY;
          end;
            (*if wMagIdx = SKILL_DEJIWONHO then begin {如果是 神圣战甲术 目标为自己}
              BaseObject := Self;
              nNewTargetX := m_nCurrX;
              nNewTargetY := m_nCurrY;
            end;*)
          Result := DoSpell(UserMagic, nNewTargetX, nNewTargetY, BaseObject);
          Break;
        end;
      end;
    end;
  end;
end;

function TPlayMonster.WarrAttackTarget(wHitMode: Word): Boolean; {物理攻击}
var
  bt06: Byte;
begin
  Result := False;
  if m_TargetCret <> nil then begin
    if GetAttackDir(m_TargetCret, bt06) then begin
      m_dwTargetFocusTick := GetTickCount();
      Attack(m_TargetCret, bt06);
      BreakHolySeizeMode();
      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;
end;

procedure TPlayMonster.EatMedicine(); {吃药}
var
  n01: Integer;
begin
  if (m_nCopyHumanLevel > 0) and (m_ItemList.Count > 0) then begin
    if m_WAbil.HP < (m_WAbil.MaxHP * g_Config.nCopyHumAddHPRate) div 100 then begin
      n01 := 0;
      while m_WAbil.HP < m_WAbil.MaxHP do begin {增加连续吃三瓶}
        if n01 > 3 then Break;
        EatUseItems(0);
        if m_ItemList.Count = 0 then Break;
        Inc(n01);
      end;
    end;
    if m_WAbil.MP < (m_WAbil.MaxMP * g_Config.nCopyHumAddMPRate) div 100 then begin
      n01 := 0;
      while m_WAbil.MP < m_WAbil.MaxMP do begin {增加连续吃三瓶}
        if n01 > 3 then Break;
        EatUseItems(1);
        if m_ItemList.Count = 0 then Break;
        Inc(n01);
      end;
    end;
    if (m_ItemList.Count = 0) or (m_WAbil.HP < (m_WAbil.MaxHP * 20) div 100) or (m_WAbil.MP < (m_WAbil.MaxMP * 20) div 100) then begin
      if m_VisibleItems.Count > 0 then begin
        m_boPickUpItemOK := False;
        SearchPickUpItem(500);
      end;
    end
  end;
end;

{检测指定方向和范围内坐标的怪物数量}
function TPlayMonster.CheckTargetXYCountOfDirection(nX, nY, nDir, nRange: Integer): Integer;
var
  BaseObject: TBaseObject;
  I, nC, n10: Integer;
begin
  Result := 0;
  n10 := 2;
  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
          case nDir of
            DR_UP: begin
                if (abs(nX - BaseObject.m_nCurrX) <= nRange) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
              end;
            DR_UPRIGHT: begin
                if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
              end;
            DR_RIGHT: begin
                if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and (abs(nY - BaseObject.m_nCurrY) <= nRange) then Inc(Result);
              end;
            DR_DOWNRIGHT: begin
                if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
              end;
            DR_DOWN: begin
                if (abs(nX - BaseObject.m_nCurrX) <= nRange) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
              end;
            DR_DOWNLEFT: begin
                if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
              end;
            DR_LEFT: begin
                if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and (abs(nY - BaseObject.m_nCurrY) <= nRange) then Inc(Result);
              end;
            DR_UPLEFT: begin
                if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
              end;
          end;
          if Result > 2 then Break;
        end;
      end;
    end;
  end;
end;

function TPlayMonster.WarrorAttackTarget(): Boolean; {战士攻击}
var
  wHitMode: Word;
begin
  Result := False;
  m_wHitMode := 0;
  if m_WAbil.MP > 0 then begin
    if wSkill_13 > 0 then begin
      if CheckTargetXYCountOfDirection(m_nCurrX, m_nCurrY, m_btDirection, 1) >= 2 then begin
        if not m_boUseHalfMoon then DoSpellMagic(SKILL_BANWOL {25}); //打开半月
        if (wSkill_12 > 0) and (m_boUseThrusting) then DoSpellMagic(SKILL_ERGUM); //关闭刺杀
      end else begin
        if m_boUseHalfMoon then DoSpellMagic(SKILL_BANWOL {25}); //关闭半月
        if (wSkill_12 > 0) and (not m_boUseThrusting) then DoSpellMagic(SKILL_ERGUM); //打开刺杀
      end;
    end else begin
      if (wSkill_12 > 0) and (not m_boUseThrusting) then DoSpellMagic(SKILL_ERGUM); //打开刺杀
    end;
    if wSkill_11 > 0 then DoSpellMagic(SKILL_FIRESWORD {26}); //使用烈火
    if m_boUseThrusting then m_wHitMode := 4; //使用刺杀
    if m_boUseHalfMoon then m_wHitMode := 5; //使用半月
    if m_boFireHitSkill then m_wHitMode := 7; //使用烈火
  end;
  Result := WarrAttackTarget(m_wHitMode);
end;

function TPlayMonster.CheckUserMagic(wMagIdx: Word): Integer;
var
  UserMagic: pTUserMagic;
  I: Integer;
begin
  Result := 0;
  for I := 0 to m_MagicList.Count - 1 do begin
    UserMagic := m_MagicList.Items[I];
    if UserMagic.MagicInfo.wMagicId = wMagIdx then begin
      Result := wMagIdx;
      Break;
    end;
  end;
end;

function TPlayMonster.CheckTargetXYCount(nX, nY, nRange: Integer): Integer;
var
  BaseObject: TBaseObject;
  I, nC, n10: Integer;
begin
  Result := 0;
  n10 := nRange;
  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(nX - BaseObject.m_nCurrX) + abs(nY - BaseObject.m_nCurrY);
          if nC <= n10 then begin
            Inc(Result);
            if Result > 2 then Break;
          end;
        end;
      end;
    end;
  end;
end;

function TPlayMonster.WizardAttackTarget(): Boolean; {法师攻击}
  function SearchDoSpell: Integer;
  begin
    Result := 0;
    if (wSkill_05 > 0) and (m_wStatusTimeArr[STATE_BUBBLEDEFENCEUP {0x76}] = 0) then begin {使用 魔法盾}
      Result := wSkill_05;
      Exit;
    end;
    if CheckTargetXYCount(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, 3) > 1 then begin
      if (abs(m_TargetCret.m_nCurrX - m_nCurrX) <= 1) and (abs(m_TargetCret.m_nCurrY - m_nCurrY) <= 1) then begin
        if wSkill_02 > 0 then Result := wSkill_02
        else if wSkill_03 > 0 then Result := wSkill_03
        else if wSkill_04 > 0 then Result := wSkill_04
        else if wSkill_01 > 0 then Result := wSkill_01;
        Exit;
      end else begin
        if (wSkill_03 > 0) and (wSkill_04 > 0) then begin
          if Random(8) > 3 then begin
            Result := wSkill_03;
          end else begin
            Result := wSkill_04;
          end;
          Exit;
        end else begin
          if wSkill_03 > 0 then Result := wSkill_03
          else if wSkill_04 > 0 then Result := wSkill_04
          else if wSkill_01 > 0 then Result := wSkill_01;
          Exit;
        end;
      end;
    end else begin
      if wSkill_01 > 0 then Result := wSkill_01
      else if wSkill_03 > 0 then Result := wSkill_03
      else if wSkill_04 > 0 then Result := wSkill_04;
    end;
  end;
var
  nMagicID: Integer;
begin
  Result := False;
  m_wHitMode := 0;
  if m_boDoSpellMagic then begin
    nMagicID := SearchDoSpell;
    if nMagicID > 0 then begin
      if not DoSpellMagic(nMagicID) then begin
        SendRefMsg(RM_MAGICFIREFAIL, 0, 0, 0, 0, '');
      end;
      Result := True;
    end;
  end else begin
    Result := WarrAttackTarget(m_wHitMode);
  end;
end;

{道士}
function TPlayMonster.CheckItemType(nItemType: Integer; StdItem: pTStdItem): Boolean;
begin
  Result := False;
  case nItemType of
    1: begin
        if (StdItem.StdMode = 25) and (StdItem.Shape = 5) then Result := True;
      end;
    2: begin
        if (StdItem.StdMode = 25) and (StdItem.Shape <= 2) then Result := True;
      end;
  end;
end;

function TPlayMonster.CheckUserItemType(nItemType: Integer): Boolean;
var
  UserItem: pTUserItem;
  StdItem: pTStdItem;
begin
  Result := False;
  if m_UseItems[U_BUJUK].wIndex > 0 then begin
    StdItem := UserEngine.GetStdItem(m_UseItems[U_BUJUK].wIndex);
    if StdItem <> nil then begin
      Result := CheckItemType(nItemType, StdItem);
    end;
  end;
end;

function TPlayMonster.UseItem(nItemType, nIndex: Integer): Boolean; //自动换毒符
var
  UserItem: pTUserItem;
  AddUserItem: pTUserItem;
  StdItem: pTStdItem;
begin
  Result := False;
  if (nIndex >= 0) and (nIndex < m_ItemList.Count) then begin
    UserItem := m_ItemList.Items[nIndex];
    if m_UseItems[U_BUJUK].wIndex > 0 then begin
      StdItem := UserEngine.GetStdItem(m_UseItems[U_BUJUK].wIndex);
      if StdItem <> nil then begin
        if CheckItemType(nItemType, StdItem) then begin
          Result := True;
        end else begin
          m_ItemList.Delete(nIndex);
          New(AddUserItem);
          AddUserItem^ := m_UseItems[U_BUJUK];
          m_ItemList.Add(AddUserItem);
          m_UseItems[U_BUJUK] := UserItem^;
          Dispose(UserItem);
          Result := True;
        end;
      end else begin
        m_ItemList.Delete(nIndex);
        m_UseItems[U_BUJUK] := UserItem^;
        Dispose(UserItem);
        Result := True;
      end;
    end else begin
      m_ItemList.Delete(nIndex);
      m_UseItems[U_BUJUK] := UserItem^;
      Dispose(UserItem);
      Result := True;
    end;
  end;
end;

//检测包裹中是否有符和毒
//nType 为指定类型 1 为护身符 2 为毒药
function TPlayMonster.GetUserItemList(nItemType: Integer): Integer;
var
  I: Integer;
  UserItem: pTUserItem;
  StdItem: pTStdItem;
begin
  Result := -1;
  for I := 0 to m_ItemList.Count - 1 do begin
    UserItem := m_ItemList.Items[I];
    StdItem := UserEngine.GetStdItem(UserItem.wIndex);
    if StdItem <> nil then begin
      if CheckItemType(nItemType, StdItem) then begin
        Result := I;
        Break;
      end;
    end;
  end;
end;

function TPlayMonster.TaoistAttackTarget(): Boolean; {道士攻击}
  function SearchDoSpell: Integer;
    function GetMagic01: Integer;
    begin
      Re

⌨️ 快捷键说明

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