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

📄 objplaymon.pas

📁 飞尔传奇世界的引擎代码可直接编译M2Engine 请使用Delphi编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                  Result := True;
                end;
              end;
          end;
        end;
    end;
  end;

  function GetUnbindItemName(nShape: Integer): string;
  var
    I: Integer;
  begin
    Result := '';
    for I := 0 to g_UnbindList.Count - 1 do begin
      if Integer(g_UnbindList.Objects[I]) = nShape then begin
        Result := g_UnbindList.Strings[I];
        Break;
      end;
    end;
  end;

  function GetUnBindItems(sItemName: string; nCount: Integer): Boolean;
  var
    I: Integer;
    UserItem: pTUserItem;
  begin
    Result := False;
    for I := 0 to nCount - 1 do begin
      New(UserItem);
      if UserEngine.CopyToUserItemFromName(sItemName, UserItem) then begin
        m_ItemList.Add(UserItem);
        Result := True;
      end else begin
        Dispose(UserItem);
        Break;
      end;
    end;
  end;

  function FoundUserItem(nItemIdx: Integer): Boolean;
  var
    I: Integer;
    UserItem: pTUserItem;
  begin
    Result := False;
    for I := 0 to m_ItemList.Count - 1 do begin
      UserItem := m_ItemList.Items[I];
      if UserItem = nil then Continue;
      if (UserItem <> nil) and (UserItem.MakeIndex = nItemIdx) then begin
        Result := True;
        Break;
      end;
    end;
  end;

  function FoundAddHealthItem(ItemType: Byte): 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];
      if UserItem <> nil then begin
        StdItem := UserEngine.GetStdItem(UserItem.wIndex);
        if StdItem <> nil then begin
          case ItemType of
            0: begin //红药
                if (StdItem.StdMode = 0) and (StdItem.Shape = 0) and (StdItem.AC > 0) then begin
                  Result := I;
                  Break;
                end;
              end;
            1: begin //蓝药
                if (StdItem.StdMode = 0) and (StdItem.Shape = 0) and (StdItem.MAC > 0) then begin
                  Result := I;
                  Break;
                end;
              end;
            2: begin //太阳水
                if (StdItem.StdMode = 0) and (StdItem.Shape = 1) and (StdItem.AC > 0) and (StdItem.MAC > 0) then begin
                  Result := I;
                  Break;
                end;
              end;
            3: begin //红药包
                if (StdItem.StdMode = 31) and (GetBindItemType(StdItem.Shape) = 0) then begin
                  Result := I;
                  Break;
                end;
              end;
            4: begin //蓝药包
                if (StdItem.StdMode = 31) and (GetBindItemType(StdItem.Shape) = 1) then begin
                  Result := I;
                  Break;
                end;
              end;
          end;
        end;
      end;
    end;
  end;

  function UseAddHealthItem(nItemIdx: Integer): Boolean;
  var
    UserItem: pTUserItem;
    StdItem: pTStdItem;
  begin
    Result := False;
    UserItem := m_ItemList.Items[nItemIdx];
    if UserItem <> nil then begin
      StdItem := UserEngine.GetStdItem(UserItem.wIndex);
      if StdItem <> nil then begin
        if not m_PEnvir.AllowStdItems(UserItem.wIndex) then begin
          Exit;
        end;
        case StdItem.StdMode of
          0 {, 1, 2, 3}: begin //药
              if EatItems(StdItem) then begin
                if UserItem <> nil then Dispose(UserItem);
                m_ItemList.Delete(nItemIdx);
                //m_WAbil.Weight := RecalcBagWeight();
                Result := True;
              end;
            end;
          31: begin //解包物品
              //MainOutMessage('解包物品 ' + IntToStr(GetBindItemType(StdItem.Shape)));
              if (StdItem.AniCount = 0) and (GetBindItemType(StdItem.Shape) >= 0) then begin
                //if (m_ItemList.Count + 6 - 1) <= MAXBAGITEM then begin
                Dispose(UserItem);
                m_ItemList.Delete(nItemIdx);
                GetUnBindItems(GetUnbindItemName(StdItem.Shape), 6);
                Result := True;
              end;
            end;
        end;
      end;
    end;
  end;

var
  nItemIdx: Integer;
  boEatOK: Boolean;
  UserItem: pTUserItem;
  StdItem: pTStdItem;
  UserItem34: TUserItem;
begin
  boEatOK := False;
  StdItem := nil;
  if not m_boDeath then begin
    nItemIdx := FoundAddHealthItem(btItemType);
    if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
      Result := UseAddHealthItem(nItemIdx);
    end else begin
      case btItemType of //查找解包物品
        0: begin
            nItemIdx := FoundAddHealthItem(3);
            if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
              Result := UseAddHealthItem(nItemIdx);
            end else begin
              nItemIdx := FoundAddHealthItem(2);
              if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
                Result := UseAddHealthItem(nItemIdx);
              end;
            end;
          end;
        1: begin
            nItemIdx := FoundAddHealthItem(4);
            if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
              Result := UseAddHealthItem(nItemIdx);
            end else begin
              nItemIdx := FoundAddHealthItem(2);
              if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
                Result := UseAddHealthItem(nItemIdx);
              end;
            end;
          end;
      end;
    end;
  end;
end;

function TPlayMonster.AllowGotoTargetXY(): Boolean;
begin
  Result := True;
  if (m_btJob = 0) or (not m_boDoSpellMagic) or (m_TargetCret = nil) then Exit;
  Result := False;
end;

function TPlayMonster.AllowFireHitSkill(): Boolean;
begin
  Result := False;
  if (GetTickCount - m_dwLatestFireHitTick) > 10 * 1000 then begin
    m_dwLatestFireHitTick := GetTickCount();
    m_boFireHitSkill := True;
    Result := True;
  end;
end;

function TPlayMonster.StartAutoAvoid(): Boolean;
begin
  Result := False;
  if (m_btJob > 0) and ((GetTickCount - m_dwAutoAvoidTick) > 1 * 1000) and (m_TargetCret <> nil) and (not m_TargetCret.m_boDeath) then begin
    m_dwAutoAvoidTick := GetTickCount();
    Result := True;
  end;
end;

function TPlayMonster.GetSpellPoint(UserMagic: pTUserMagic): Integer;
begin
  Result := Round(UserMagic.MagicInfo.wSpell / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1)) + UserMagic.MagicInfo.btDefSpell;
end;

function TPlayMonster.DoSpellMagic(wMagIdx: Word): Boolean; //使用魔法
  function DoSpell(UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
  var
    nSpellPoint: Integer;
    boSpellFail: Boolean;
    boSpellFire: Boolean;
    n10: Integer;
    n14: Integer;
    n18: Integer;
    n1C: Integer;
    nDir: Integer;
    nPower: Integer;
    WAbil: pTAbility;
    nAmuletIdx: Integer;
    function MPow(UserMagic: pTUserMagic): Integer;
    begin
      Result := UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
    end;
    function GetPower(nPower: Integer): Integer;
    begin
      Result := Round(nPower / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1)) + (UserMagic.MagicInfo.btDefPower + Random(UserMagic.MagicInfo.btDefMaxPower - UserMagic.MagicInfo.btDefPower));
    end;
    function GetPower13(nInt: Integer): Integer;
    var
      d10: Double;
      d18: Double;
    begin
      d10 := nInt / 3.0;
      d18 := nInt - d10;
      Result := Round(d18 / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1) + d10 + (UserMagic.MagicInfo.btDefPower + Random(UserMagic.MagicInfo.btDefMaxPower - UserMagic.MagicInfo.btDefPower)));
    end;
    procedure DelUseItem();
    begin
      if m_UseItems[U_BUJUK].Dura < 100 then begin
        m_UseItems[U_BUJUK].Dura := 0;
        m_UseItems[U_BUJUK].wIndex := 0;
      end;
    end;
  begin
    Result := False;
    boSpellFail := False;
    boSpellFire := True;
    nPower := 0;
    if (abs(m_nCurrX - nTargetX) > g_Config.nMagicAttackRage) or (abs(m_nCurrY - nTargetY) > g_Config.nMagicAttackRage) then begin
      Exit;
    end;
    SendRefMsg(RM_SPELL, UserMagic.MagicInfo.btEffect, nTargetX, nTargetY, UserMagic.MagicInfo.wMagicId, '');
    if (TargeTBaseObject <> nil) and (TargeTBaseObject.m_boDeath) then TargeTBaseObject := nil;
    case wMagIdx of
      SKILL_LIGHTENING {11}: begin {雷电术}
          nSpellPoint := GetSpellPoint(UserMagic);
          if nSpellPoint > 0 then begin
            if m_WAbil.MP < nSpellPoint then Exit;
            DamageSpell(nSpellPoint);
            //HealthSpellChanged();
          end;
          if m_TargetCret <> nil then begin
            if IsProperTarget(TargeTBaseObject) then begin
              if (Random(10) >= TargeTBaseObject.m_nAntiMagic) then begin
                nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC),
                  SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1);
                if TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD then
                  nPower := Round(nPower * 1.5);
                SendDelayMsg(Self, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '', 600);
                Result := True
              end else TargeTBaseObject := nil
            end else TargeTBaseObject := nil;
          end;
        end;
      SKILL_SHIELD {31}: begin //魔法盾
          if MagBubbleDefenceUp(UserMagic.btLevel, GetPower(GetRPow(m_WAbil.MC) + 15)) then Result := True;
        end;
      SKILL_SNOWWIND {33}: begin // 冰咆哮
          if MagicManager.MagBigExplosion(Self,
            GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1),
            nTargetX,
            nTargetY,
            g_Config.nSnowWindRange) then
            Result := True;
        end;
      SKILL_LIGHTFLOWER {24}: begin //地狱雷光
          if MagicManager.MagElecBlizzard(Self, GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1)) then
            Result := True;
        end;
      SKILL_47: begin //火龙气焰
          if MagicManager.MagBigExplosion(Self,
            GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1),
            nTargetX,
            nTargetY,
            g_Config.nFireBoomRage {1}) then
            Result := True;
        end;
      {道士}
      SKILL_AMYOUNSUL {6}: begin //施毒术
          if MagicManager.MagLightening(Self, UserMagic, nTargetX, nTargetY, TargeTBaseObject, boSpellFail) then
            Result := True;
        end;
      SKILL_FIRECHARM {13},
        SKILL_HANGMAJINBUB {14},
        SKILL_DEJIWONHO {15}: begin
          boSpellFail := True;
          if CheckAmulet(Self, 1, 1, nAmuletIdx) then begin
            UseAmulet(Self, 1, 1, nAmuletIdx);
            case wMagIdx of
              SKILL_FIRECHARM {13}: begin //灵魂火符
                  if MagicManager.MagMakeFireCharm(Self,
                    UserMagic,
                    nTargetX,
                    nTargetY,
                    TargeTBaseObject) then Result := True;
                end;
              SKILL_HANGMAJINBUB {14}: begin //幽灵盾
                  nPower := GetAttackPower(GetPower13(60) + LoWord(m_WAbil.SC) * 10, SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) + 1);
                  if MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower, 1, True) > 0 then
                    Result := True;
                end;
              SKILL_DEJIWONHO {15}: begin //神圣战甲术
                  nPower := GetAttackPower(GetPower13(60) + LoWord(m_WAbil.SC) * 10, SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) + 1);
                  if MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower, 0, True) > 0 then
                    Result := True;
                end;
            end;
            boSpellFail := False;
            DelUseItem();
          end;
        end;
      SKILL_GROUPAMYOUNSUL {38 群体施毒术}: begin
          boSpellFail := True;
          if CheckAmulet(Self, 1, 2, nAmuletIdx) then begin
            UseAmulet(Self, 1, 2, nAmuletIdx);
            if MagicManager.MagGroupAmyounsul(Self, UserMagic, nTargetX, nTargetY, TargeTBaseObject) then
              Result := True;
            boSpellFail := False;
            DelUseItem();
          end;
        end;
      SKILL_BIGHEALLING {29}: begin //群体治疗术
          nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.SC) * 2,
            SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) * 2 + 1);
          if MagicManager.MagBigHealing(Self, nPower, nTargetX, nTargetY) then Result := True;
        end;
    end;
    if boSpellFire then begin
      SendRefMsg(RM_MAGICFIRE, 0,
        MakeWord(UserMagic.MagicInfo.btEffectType, UserMagic.MagicInfo.btEffect),
        MakeLong(nTargetX, nTargetY),
        Integer(TargeTBaseObject),
        '');
    end;
  end;
var
  BaseObject: TBaseObject;
  I: Integer;
  nSpellPoint: Integer;
  UserMagic: pTUserMagic;
  nNewTargetX: Integer;
  nNewTargetY: Integer;
begin
  Result := False;
  case wMagIdx of

⌨️ 快捷键说明

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