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

📄 magic.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
              RecalcAbilitys();
              SendMsg(PlayObject, RM_ABILITY, 0, 0, 0, 0, '');

            end;
            //  else
            //    SysMsg('道术增加' + InttoStr(nPower)+'秒', c_Green, t_Hint);
          end;
        end;
        boTrain := True;
      end;
    SKILL_51:
      begin                                                 //灵魂召唤术
        boTrain := True;
      end;
    SKILL_52:
      begin                                                 //诅咒术
        boTrain := True;
      end;
    SKILL_53:
      begin                                                 //灵魂召唤术
        boTrain := True;
      end;
    SKILL_54:
      begin                                                 //诅咒术
        boTrain := True;
      end;
  end;
  if boSpellFail then
    exit;
  if boSpellFire then
  begin
    PlayObject.SendRefMsg(RM_MAGICFIRE, 0,
      MakeWord(UserMagic.MagicInfo.btEffectType, UserMagic.MagicInfo.btEffect),
      MakeLong(nTargetX, nTargetY),
      Integer(TargeTBaseObject),
      '');
  end;
  if (UserMagic.btLevel < 3) and (boTrain) then
  begin
    if UserMagic.MagicInfo.TrainLevel[UserMagic.btLevel] <=
      PlayObject.m_Abil.Level then
    begin
      PlayObject.TrainSkill(UserMagic, Random(3) + 1);
      if not PlayObject.CheckMagicLevelup(UserMagic) then
      begin
        PlayObject.SendDelayMsg(PlayObject, RM_MAGIC_LVEXP, 0,
          UserMagic.MagicInfo.wMagicId, UserMagic.btLevel, UserMagic.nTranPoint,
          '', 1000);
      end;
    end;
  end;
  Result := True;

end;

function TMagicManager.MagMakePrivateTransparent(BaseObject: TBaseObject;
  nHTime: Integer): Boolean;                                //004930E8
var
  i                                     : Integer;
  BaseObjectList                        : TMyList;
  TargeTBaseObject                      : TBaseObject;
begin
  Result := False;
  if BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] > 0 then
    exit;                                                   //4930FE
  BaseObjectList := TMyList.create;
  BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir, BaseObject.m_nCurrX,
    BaseObject.m_nCurrY, 9, BaseObjectList);
  for i := 0 to BaseObjectList.Count - 1 do
  begin
    TargeTBaseObject := TBaseObject(BaseObjectList.Items[i]);
    if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) and
      (TargeTBaseObject.m_TargetCret = BaseObject) then
    begin
      if (abs(TargeTBaseObject.m_nCurrX - BaseObject.m_nCurrX) > 1) or
        (abs(TargeTBaseObject.m_nCurrY - BaseObject.m_nCurrY) > 1) or
        (Random(2) = 0) then
      begin
        TargeTBaseObject.m_TargetCret := nil;
      end;
    end;
  end;
  BaseObjectList.Free;
  BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] := nHTime; //004931D2
  BaseObject.m_nCharStatus := BaseObject.GetCharStatus();
  BaseObject.StatusChanged();
  BaseObject.m_boHideMode := True;
  BaseObject.m_boTransparent := True;
  Result := True;
end;

function TMagicManager.MagTamming(BaseObject, TargeTBaseObject: TBaseObject;
  nTargetX, nTargetY, nMagicLevel: Integer): Boolean;       //00492368
var
  n14                                   : Integer;
begin
  Result := False;
  if (TargeTBaseObject.m_btRaceServer <> RC_PLAYOBJECT) and ((Random(4 -
    nMagicLevel) = 0)) then
  begin
    TargeTBaseObject.m_TargetCret := nil;
    if TargeTBaseObject.m_Master = BaseObject then
    begin
      TargeTBaseObject.OpenHolySeizeMode((nMagicLevel * 5 + 10) * 1000);
      Result := True;
    end
    else
    begin
      if Random(2) = 0 then
      begin
        if TargeTBaseObject.m_Abil.Level <= BaseObject.m_Abil.Level + 2 then
        begin
          if Random(3) = 0 then
          begin
            if Random((BaseObject.m_Abil.Level + 20) + (nMagicLevel * 5)) >
              (TargeTBaseObject.m_Abil.Level + g_Config.nMagTammingTargetLevel
              {10}) then
            begin
              if not (TargeTBaseObject.bo2C1) and
                (TargeTBaseObject.m_btLifeAttrib = 0) and
                (TargeTBaseObject.m_Abil.Level < g_Config.nMagTammingLevel {50})
                and
                (BaseObject.m_SlaveList.Count < g_Config.nMagTammingCount
                {(nMagicLevel + 2)}) then
              begin
                n14 := TargeTBaseObject.m_WAbil.MaxHP div
                  g_Config.nMagTammingHPRate {100};
                if n14 <= 2 then
                  n14 := 2
                else
                  Inc(n14, n14);
                if (TargeTBaseObject.m_Master <> BaseObject) and (Random(n14) =
                  0) then
                begin
                  TargeTBaseObject.BreakCrazyMode();
                  if TargeTBaseObject.m_Master <> nil then
                  begin
                    TargeTBaseObject.m_WAbil.HP := TargeTBaseObject.m_WAbil.HP
                      div 10;
                  end;
                  TargeTBaseObject.m_Master := BaseObject;
                  TargeTBaseObject.m_dwMasterRoyaltyTick :=
                    LongWord((Random(BaseObject.m_Abil.Level * 2) + (nMagicLevel
                    shl 2) * 5 + 20) * 60 * 1000) + GetTickCount;
                  TargeTBaseObject.m_btSlaveMakeLevel := nMagicLevel;
                  if TargeTBaseObject.m_dwMasterTick = 0 then
                    TargeTBaseObject.m_dwMasterTick := GetTickCount();
                  TargeTBaseObject.BreakHolySeizeMode();
                  if LongWord(1500 - nMagicLevel * 200) <
                    LongWord(TargeTBaseObject.m_nWalkSpeed) then
                  begin
                    TargeTBaseObject.m_nWalkSpeed := 1500 - nMagicLevel * 200;
                  end;
                  if LongWord(2000 - nMagicLevel * 200) <
                    LongWord(TargeTBaseObject.m_nNextHitTime) then
                  begin
                    TargeTBaseObject.m_nNextHitTime := 2000 - nMagicLevel * 200;
                  end;
                  TargeTBaseObject.RefShowName();
                  BaseObject.m_SlaveList.Add(TargeTBaseObject);
                end
                else
                begin                                       //004925F2
                  if Random(14) = 0 then
                    TargeTBaseObject.m_WAbil.HP := 0;
                end;
              end
              else
              begin                                         //00492615
                if (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) and (Random(20)
                  = 0) then
                  TargeTBaseObject.m_WAbil.HP := 0;
              end;
            end
            else
            begin                                           //00492641
              if not (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) and
                (Random(20) = 0) then
                TargeTBaseObject.OpenCrazyMode(Random(20) + 10);
            end;
          end
          else
          begin                                             //00492674
            if not (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) then
              TargeTBaseObject.OpenCrazyMode(Random(20) + 10); //变红
          end;
        end;                                                //004926B0
      end
      else
      begin                                                 //00492699
        TargeTBaseObject.OpenHolySeizeMode((nMagicLevel * 5 + 10) * 1000);
      end;
      Result := True;
    end;
  end
  else
  begin
    if Random(2) = 0 then
      Result := True;
  end;

end;

function TMagicManager.MagTurnUndead(BaseObject, TargeTBaseObject: TBaseObject;
  nTargetX, nTargetY, nLevel: Integer): Boolean;            //004926D4
var
  n14                                   : Integer;
begin
  Result := False;
  if TargeTBaseObject.m_boSuperMan or not (TargeTBaseObject.m_btLifeAttrib =
    LA_UNDEAD) then
    exit;
  TAnimalObject(TargeTBaseObject).Struck {FFEC}(BaseObject);
  if TargeTBaseObject.m_TargetCret = nil then
  begin
    TAnimalObject(TargeTBaseObject).m_boRunAwayMode := True;
    TAnimalObject(TargeTBaseObject).m_dwRunAwayStart := GetTickCount();
    TAnimalObject(TargeTBaseObject).m_dwRunAwayTime := 10 * 1000;
  end;
  BaseObject.SetTargetCreat(TargeTBaseObject);
  if (Random(2) + (BaseObject.m_Abil.Level - 1)) > TargeTBaseObject.m_Abil.Level
    then
  begin
    if TargeTBaseObject.m_Abil.Level < g_Config.nMagTurnUndeadLevel then
    begin
      n14 := BaseObject.m_Abil.Level - TargeTBaseObject.m_Abil.Level;
      if Random(100) < ((nLevel shl 3) - nLevel + 15 + n14) then
      begin
        TargeTBaseObject.SetLastHiter(BaseObject);
        TargeTBaseObject.m_WAbil.HP := 0;
        Result := True;
      end
    end;
  end;                                                      //004927CB
end;

function TMagicManager.MagWindTebo(PlayObject: TPlayObject;
  UserMagic: pTUserMagic): Boolean;
var
  PoseBaseObject                        : TBaseObject;
begin
  Result := False;
  PoseBaseObject := PlayObject.GetPoseCreate;
  if (PoseBaseObject <> nil) and
    (PoseBaseObject <> PlayObject) and
    (not PoseBaseObject.m_boDeath) and
    (not PoseBaseObject.m_boGhost) and
    (PlayObject.IsProperTarget(PoseBaseObject)) and
    (not PoseBaseObject.m_boStickMode) then
  begin
    if (abs(PlayObject.m_nCurrX - PoseBaseObject.m_nCurrX) <= 1) and
      (abs(PlayObject.m_nCurrY - PoseBaseObject.m_nCurrY) <= 1) and
      (PlayObject.m_Abil.Level > PoseBaseObject.m_Abil.Level) then
    begin
      if Random(20) < UserMagic.btLevel * 6 + 6 + (PlayObject.m_Abil.Level -
        PoseBaseObject.m_Abil.Level) then
      begin
        PoseBaseObject.CharPushed(GetNextDirection(PlayObject.m_nCurrX,
          PlayObject.m_nCurrY, PoseBaseObject.m_nCurrX,
          PoseBaseObject.m_nCurrY),
          _MAX(0, UserMagic.btLevel - 1) + 1);
        Result := True;
      end;
    end;
  end;
end;

function TMagicManager.MagSaceMove(BaseObject: TBaseObject;
  nLevel: Integer): Boolean;                                //04927D8
var
  Envir                                 : TEnvirnoment;
  PlayObject                            : TPlayObject;
begin
  Result := False;
  if Random(11) < nLevel * 2 + 4 then
  begin
    BaseObject.SendRefMsg(RM_SPACEMOVE_FIRE2, 0, 0, 0, 0, '');
    if BaseObject is TPlayObject then
    begin
      Envir := BaseObject.m_PEnvir;
      BaseObject.MapRandomMove(BaseObject.m_sHomeMap, 1);
      if (Envir <> BaseObject.m_PEnvir) and (BaseObject.m_btRaceServer =
        RC_PLAYOBJECT) then
      begin
        PlayObject := TPlayObject(BaseObject);
        PlayObject.m_boTimeRecall := False;
      end;
    end;
    Result := True;
  end;                                                      //00492899
end;

function TMagicManager.MagGroupAmyounsul(PlayObject: TPlayObject;
  UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
  TargeTBaseObject: TBaseObject): Boolean;
var
  i                                     : Integer;
  BaseObjectList                        : TMyList;
  BaseObject                            : TBaseObject;
  nPower                                : Integer;
  StdItem                               : pTStdItem;
  nAmuletIdx                            : Integer;
begin
  Result := False;
  BaseObjectList := TMyList.create;
  PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir, nTargetX, nTargetY, _MAX(1,
    UserMagic.btLevel), BaseObjectList);
  for i := 0 to BaseObjectList.Count - 1 do
  begin
    BaseObject := TBaseObject(BaseObjectList.Items[i]);
    if BaseObject.m_boDeath or (BaseObject.m_boGhost) or (PlayObject =
      BaseObject) then
      Continue;
    if PlayObject.IsProperTarget(BaseObject) 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(BaseObject.m_btAntiPoison + 7) <= 6 then
          begin
            case StdItem.Shape of
              1:
                begin
                  nPower := GetPower13(40, UserMagic) +

⌨️ 快捷键说明

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