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

📄 magic.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      UserMagic.MagicInfo.btDefPower)));
  end;

  function GetRPow(wInt: Integer): Word;
  begin
    if HiWord(wInt) > LoWord(wInt) then
    begin
      Result := Random(HiWord(wInt) - LoWord(wInt) + 1) + LoWord(wInt);
    end
    else
      Result := LoWord(wInt);
  end;

  procedure sub_4934B4(PlayObject: TPlayObject);
  begin
    if PlayObject.m_UseItems[U_ARMRINGL].Dura < 100 then
    begin
      PlayObject.m_UseItems[U_ARMRINGL].Dura := 0;
      PlayObject.SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
      PlayObject.m_UseItems[U_ARMRINGL].wIndex := 0;
    end;
  end;

begin                                                       //0049350C
  Result := False;
  if IsWarrSkill(UserMagic.wMagIdx) then
    exit;

  if (abs(PlayObject.m_nCurrX - nTargetX) > g_Config.nMagicAttackRage) or
    (abs(PlayObject.m_nCurrY - nTargetY) > g_Config.nMagicAttackRage) then
  begin
    exit;
  end;

  PlayObject.SendRefMsg(RM_SPELL, UserMagic.MagicInfo.btEffect, nTargetX,
    nTargetY, UserMagic.MagicInfo.wMagicId, '');
  if (TargeTBaseObject <> nil) and (TargeTBaseObject.m_boDeath) then
    TargeTBaseObject := nil;
  boTrain := False;
  boSpellFail := False;
  boSpellFire := True;
  nPower := 0;
  if (PlayObject.m_nSoftVersionDateEx = 0) and (PlayObject.m_dwClientTick = 0)
    and (UserMagic.MagicInfo.wMagicId > 40) then
    exit;
  case UserMagic.MagicInfo.wMagicId of                      //
    SKILL_FIREBALL {1},
    SKILL_FIREBALL2 {5}:
      begin                                                 //火球术 大火球
        if PlayObject.MagCanHitTarget(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
          TargeTBaseObject) then
        begin
          if PlayObject.IsProperTarget(TargeTBaseObject) then
          begin
            if (TargeTBaseObject.m_nAntiMagic <= Random(10)) and
              (abs(TargeTBaseObject.m_nCurrX - nTargetX) <= 1) and
              (abs(TargeTBaseObject.m_nCurrY - nTargetY) <= 1) then
            begin
              with PlayObject do
              begin
                nPower := GetAttackPower(GetPower(MPow(UserMagic)) +
                  LoWord(m_WAbil.MC),
                  SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1);
                //pwr := GetPower (MPow(UserMagic)) + (Lobyte(WAbil.MC) + Random(Hibyte(WAbil.MC)-Lobyte(WAbil.MC) + 1));
                //鸥百 嘎澜, 饶俊 瓤苞唱鸥巢
                //target.SendDelayMsg (user, RM_MAGSTRUCK, 0, pwr, 0, 0, '', 1200 + _MAX(Abs(CX-xx),Abs(CY-yy)) * 50 );
              end;
              //rm-delaymagic俊辑 selecttarget阑 贸府茄促.
              PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower,
                MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '',
                600);
              if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
                boTrain := True;
            end
            else
              TargeTBaseObject := nil;
          end
          else
            TargeTBaseObject := nil;
        end
        else
          TargeTBaseObject := nil;
      end;
    SKILL_HEALLING {2}:
      begin
        if TargeTBaseObject = nil then
        begin
          TargeTBaseObject := PlayObject;
          nTargetX := PlayObject.m_nCurrX;
          nTargetY := PlayObject.m_nCurrY;
        end;
        if PlayObject.IsProperFriend {0FFF3}(TargeTBaseObject) then
        begin
          nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
            LoWord(PlayObject.m_WAbil.SC) * 2,
            SmallInt(HiWord(PlayObject.m_WAbil.SC) -
            LoWord(PlayObject.m_WAbil.SC)) * 2 + 1);
          if TargeTBaseObject.m_WAbil.HP < TargeTBaseObject.m_WAbil.MaxHP then
          begin
            TargeTBaseObject.SendDelayMsg(PlayObject, RM_MAGHEALING, 0, nPower,
              0, 0, '', 800);
            boTrain := True;
          end;
          if PlayObject.m_boAbilSeeHealGauge then
            PlayObject.SendMsg(TargeTBaseObject, RM_10414, 0, 0, 0, 0, '');
        end;
      end;
    SKILL_AMYOUNSUL {6}:
      begin                                                 //施毒术
        (*
        boSpellFail:=True;

        if PlayObject.IsProperTarget(TargeTBaseObject) then begin
          if PlayObject.m_UseItems[U_ARMRINGL].wIndex > 0 then begin
            StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGL].wIndex);
            if (StdItem <> nil) and (StdItem.StdMode = 25) and (StdItem.Shape <= 2) then begin
              if PlayObject.m_UseItems[U_ARMRINGL].Dura >= 100 then begin
                Dec(PlayObject.m_UseItems[U_ARMRINGL].Dura,100);
                PlayObject.SendMsg(PlayObject,RM_DURACHANGE,5,PlayObject.m_UseItems[U_ARMRINGL].Dura,PlayObject.m_UseItems[U_ARMRINGL].DuraMax,0,'');
                if Random(TargeTBaseObject.m_btAntiPoison + 7) <= 6 then begin
                  case StdItem.Shape of
                    1: begin //0493F94
                      nPower:=GetPower13(40) + GetRPow(PlayObject.m_WAbil.SC) * 2;
                      TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DECHEALTH{中毒类型 - 绿毒},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
                    end;
                    2: begin //00493FE9
                      nPower:=GetPower13(30) + GetRPow(PlayObject.m_WAbil.SC) * 2;
                      TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DAMAGEARMOR{中毒类型 - 红毒},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
                    end;
                  end; //0049403C
                  if (TargeTBaseObject.m_btRaceServer = RC_PLAYOBJECT) or (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
                    boTrain:=True;
                end; //00494058
                PlayObject.SetTargetCreat(TargeTBaseObject);
                boSpellFail:=False;
              end; //0049406B
              if PlayObject.m_UseItems[U_ARMRINGL].Dura < 100 then begin
                PlayObject.m_UseItems[U_ARMRINGL].Dura:=0;
                PlayObject.SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
                PlayObject.m_UseItems[U_ARMRINGL].wIndex:=0;
              end;
            end;
          end;
        end;
        *)
        boSpellFail := True;

        if PlayObject.IsProperTarget(TargeTBaseObject) then
        begin

          if CheckAmulet(PlayObject, 1, 2, nAmuletIdx) then
          begin
            StdItem :=
              UserEngine.GetStdItem(PlayObject.m_UseItems[nAmuletIdx].wIndex);
            if StdItem <> nil then
            begin
              UseAmulet(PlayObject, 1, 2, nAmuletIdx);

              if Random(TargeTBaseObject.m_btAntiPoison + 7) <= 6 then
              begin
                case StdItem.Shape of
                  1:
                    begin                                   //0493F94
                      nPower := GetPower13(40) + GetRPow(PlayObject.m_WAbil.SC)
                        * 2;
                      TargeTBaseObject.SendDelayMsg(PlayObject, RM_POISON,
                        POISON_DECHEALTH {中毒类型 - 绿毒}, nPower,
                        Integer(PlayObject), ROUND(UserMagic.btLevel / 3 *
                        (nPower
                        / g_Config.nAmyOunsulPoint)) {UserMagic.btLevel}, '',
                        1000);
                    end;
                  2:
                    begin                                   //00493FE9
                      nPower := GetPower13(30) + GetRPow(PlayObject.m_WAbil.SC)
                        * 2;
                      TargeTBaseObject.SendDelayMsg(PlayObject, RM_POISON,
                        POISON_DAMAGEARMOR {中毒类型 - 红毒}, nPower,
                        Integer(PlayObject), ROUND(UserMagic.btLevel / 3 *
                        (nPower
                        / g_Config.nAmyOunsulPoint)) {UserMagic.btLevel}, '',
                        1000);
                    end;
                end;                                        //0049403C
                if (TargeTBaseObject.m_btRaceServer = RC_PLAYOBJECT) or
                  (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
                  boTrain := True;
              end;                                          //00494058
              PlayObject.SetTargetCreat(TargeTBaseObject);
              boSpellFail := False;
            end;
          end;                                              //0049406B
        end;
      end;
    SKILL_FIREWIND {8}:
      begin                                                 //抗拒火环  00493754
        if MagPushArround(PlayObject, UserMagic.btLevel) > 0 then
          boTrain := True;
      end;
    SKILL_FIRE {9}:
      begin                                                 //地狱火 00493778
        n1C := GetNextDirection(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
          nTargetX, nTargetY);
        if PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
          PlayObject.m_nCurrY, n1C, 1, n14, n18) then
        begin
          PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
            PlayObject.m_nCurrY, n1C, 5, nTargetX, nTargetY);
          nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
            LoWord(PlayObject.m_WAbil.MC),
            SmallInt(HiWord(PlayObject.m_WAbil.MC) -
            LoWord(PlayObject.m_WAbil.MC)) + 1);
          if PlayObject.MagPassThroughMagic(n14, n18, nTargetX, nTargetY, n1C,
            nPower, False) > 0 then
            boTrain := True;
        end;
      end;
    SKILL_SHOOTLIGHTEN {10}:
      begin                                                 //疾光电影 0049386A
        n1C := GetNextDirection(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
          nTargetX, nTargetY);
        if PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
          PlayObject.m_nCurrY, n1C, 1, n14, n18) then
        begin
          PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
            PlayObject.m_nCurrY, n1C, 8, nTargetX, nTargetY);
          nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
            LoWord(PlayObject.m_WAbil.MC),
            SmallInt(HiWord(PlayObject.m_WAbil.MC) -
            LoWord(PlayObject.m_WAbil.MC)) + 1);
          if PlayObject.MagPassThroughMagic(n14, n18, nTargetX, nTargetY, n1C,
            nPower, True) > 0 then
            boTrain := True;
        end;
      end;
    SKILL_LIGHTENING {11}:
      begin                                                 //雷电术 0049395C
        if PlayObject.IsProperTarget(TargeTBaseObject) then
        begin
          if (Random(10) >= TargeTBaseObject.m_nAntiMagic) then
          begin
            nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
              LoWord(PlayObject.m_WAbil.MC),
              SmallInt(HiWord(PlayObject.m_WAbil.MC) -
              LoWord(PlayObject.m_WAbil.MC)) + 1);
            if TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD then
              nPower := ROUND(nPower * 1.5);
            PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower,
              MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '',
              600);
            if TargeTBaseObject.m_btRaceServer >= RC_ANIMAL then
              boTrain := True;
          end
          else
            TargeTBaseObject := nil
        end
        else
          TargeTBaseObject := nil;
      end;
    SKILL_FIRECHARM {13},
    SKILL_HANGMAJINBUB {14},
    SKILL_DEJIWONHO {15},
    SKILL_HOLYSHIELD {16},
    SKILL_SKELLETON {17},
    SKILL_CLOAK {18},
    SKILL_BIGCLOAK {19}:
      begin                                                 //004940BC
        boSpellFail := True;
        if CheckAmulet(PlayObject, 1, 1, nAmuletIdx) then
        begin
          UseAmulet(PlayObject, 1, 1, nAmuletIdx);
          {
          if BaseObject.m_UseItems[U_ARMRINGL].Dura >= 100 then Dec(BaseObject.m_UseItems[U_ARMRINGL].Dura,100)
          else BaseObject.m_UseItems[U_ARMRINGL].Dura:=0;
          BaseObject.SendMsg(BaseObject,RM_DURACHANGE,U_ARMRINGL,BaseObject.m_UseItems[U_ARMRINGL].Dura,BaseObject.m_UseItems[U_ARMRINGL].DuraMax,0,'');
          }
          case UserMagic.MagicInfo.wMagicId of              //
            SKILL_FIRECHARM {13}:
              begin                                         //灵魂火符 0049415F
                if PlayObject.MagCanHitTarget(PlayObject.m_nCurrX,
                  PlayObject.m_nCurrY, TargeTBaseObject) then
                begin
                  if PlayObject.IsProperTarget(TargeTBaseObject) then
                  begin
                    if Random(10) >= TargeTBaseObject.m_nAntiMagic then
                    begin
                      if (abs(TargeTBaseObject.m_nCurrX - nTargetX) <= 1) and
                        (abs(TargeTBaseObject.m_nCurrY - nTargetY) <= 1) then
                      begin
                        nPower :=
                          PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
                          LoWord(PlayObject.m_WAbil.SC),
                          SmallInt(HiWord(PlayObject.m_WAbil.SC) -
                          LoWord(PlayObject.m_WAbil.SC)) + 1);
                        PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC,
                          nPower, MakeLong(nTargetX, nTargetY), 2,
                          Integer(TargeTBaseObject), '', 1200);
                        if TargeTBaseObject.m_btRaceServer >= RC_ANIMAL then
                          boTrain := True;
                      end;                                  //00494463
                    end;                                    //00494463
                  end;                                      //00494463
                end
                else
                  TargeTBaseObject := nil;                  //0049426D
              end;
            SKILL_HANGMAJINBUB {14}:
              begin                                         //幽灵盾 00494277
                nPower := PlayObject.GetAttackPower(GetPower13(60) +
                  LoWord(PlayObject.m_WAbil.SC) * 10,
                  SmallInt(HiWord(PlayObject.m_WAbil.SC) -
                  LoWord(PlayObject.m_WAbil.SC)) + 1);
                if PlayObject.MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower,
                  1) > 0 then
                  boTrain := True;
              end;
            SKILL_DEJIWONHO {15}:
              begin                                         //神圣战甲术 004942E5
                nPower := PlayObject.GetAttackPower(GetPower13(60) +
                  LoWord(PlayObject.m_WAbil.SC) * 10,
                  SmallInt(HiWord(PlayObject.m_WAbil.SC) -
                  LoWord(PlayObject.m_WAbil.SC)) + 1);
                if PlayObject.MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower,
                  0) > 0 then
                  boTrain := True;
              end;
            SKILL_HOLYSHIELD {16}:
              begin                                         //捆魔咒 00494353

⌨️ 快捷键说明

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