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

📄 magic.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    SKILL_66: begin  //强化骷髅术
      boSpellFail:=True;
      if CheckAmulet(PlayObject,2,1,nAmuletIdx) then
      begin
        UseAmulet(PlayObject,2,1,nAmuletIdx);
          if MagMakePowerSlave(PlayObject,UserMagic) then
          begin
            boTrain:=True;
          end;
        boSpellFail:=False;
      end;
    end;
    SKILL_68:begin   //  法之魄
      boTrain:=True;
    end;
    SKILL_69:begin   //       兽灵术
      boTrain:=True;
    end;
    SKILL_70:begin   //风影盾
       if  MagADDABILITY(PlayObject,UserMagic.btLevel,2) then  boTrain:=True;
    end;
    SKILL_71:begin   //狂龙紫电
      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_72:begin   //心灵召唤   道士
      if MagbaobaoMove(PlayObject,TargeTBaseObject,UserMagic.btLevel) then
        boTrain:=True;
    end;
    SKILL_73: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 MagBigExplosion(PlayObject,
                         nPower,
                         GetPower(10) + (Word(GetRPow(PlayObject.m_WAbil.MC)) shr 1),
                         nTargetX,
                         nTargetY,
                         g_Config.nSnowWindRange{1},73) then
        boTrain:=True;
    end;
    74:begin     //	擒龙手
      if MagMonMove(PlayObject,TargeTBaseObject,UserMagic.btLevel) then
        boTrain:=True;
    end;
    SKILL_77, SKILL_75, SKILL_35:begin       //遁地    化身蝙蝠    移形换影
      if  MagSpyMove(PlayObject, nTargetX,nTargetY,UserMagic.btLevel,UserMagic.MagicInfo.wMagicId) then
      begin
        boTrain:=True;
        boSpellFire:= false;
      end
      else
        boSpellFail:=true;
    end;
    SKILL_78:begin  //怒斩天下    //战战
      if MagYSzhskill78(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,GetPower(MPow(UserMagic)))  then begin
        boTrain:=True;
      end;
      PlayObject.Ysplayer.nyuanqi:=0;
      PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
    end;
    79: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 MagYSzhskill79(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,nPower) then
      begin
        boTrain:=True;
      end;
      PlayObject.Ysplayer.nyuanqi:=0;
      PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
    end;
    80:begin //天女散花 道道
      nPower:= PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(PlayObject.m_WAbil.SC), SmallInt(HiWord(PlayObject.m_WAbil.SC)-LoWord(PlayObject.m_WAbil.SC))+ 1);
      if  MagYSzhskill80(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,nPower) then
      begin
        boTrain:=True;
      end;
      PlayObject.Ysplayer.nyuanqi:=0;
      PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
    end;
    81:begin   //迷光烈焰   战法
      if MagYSzhskill81(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,GetPower(MPow(UserMagic))) then
      begin
        boTrain:=True;
      end;
      PlayObject.Ysplayer.nyuanqi:=0;
      PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
    end;
    83:begin   //火毒攻心剑  //战道     地面效果 26
      if  MagYSzhskill83(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,GetPower(MPow(UserMagic))) then
      begin
        boTrain:=True;
      end;
      PlayObject.Ysplayer.nyuanqi:=0;
      PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
    end;
    SKILL_85:begin   //神之召唤    法道    ====
      if MagYSzhskill85(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel) then
      begin
        boTrain:=True;
      end;
      PlayObject.Ysplayer.nyuanqi:=0;
      PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
    end;
    82:begin
      g_FunctionNPC.GotoLable(PlayObject,'@MagFunc82',False);
      boTrain:=True;
    end;
    84:begin
      g_FunctionNPC.GotoLable(PlayObject,'@MagFunc84',False);
      boTrain:=True;
    end;
    34:begin
      g_FunctionNPC.GotoLable(PlayObject,'@MagFunc34',False);
      boTrain:=True;
    end;
    36:begin
      g_FunctionNPC.GotoLable(PlayObject,'@MagFunc36',False);
      boTrain:=True;
    end;
    45: begin  //诅咒术
      boSpellFail:=True;
      if PlayObject.IsProperTarget(TargeTBaseObject) then
      begin
        if CheckAmulet(PlayObject,1,3,nAmuletIdx) then    //检查稻草人的数量和位置   3表稻草人
        begin
          StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[nAmuletIdx].wIndex);
          if StdItem <> nil then
          begin
            UseAmulet(PlayObject,1,3,nAmuletIdx);      //使用一个数量
            if Random(TargeTBaseObject.m_btAntiPoison + 7) <= 6 then
            begin
              case StdItem.Shape of
                1: begin
                  nPower:=GetPower13(40) + GetRPow(PlayObject.m_WAbil.SC) * 2;
                  TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DAOCAO1{蓝色- 雄性稻草人},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
                end;
                2: begin
                  nPower:=GetPower13(30) + GetRPow(PlayObject.m_WAbil.SC) * 2;
                  TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DAOCAO2{粉红色 - 雌性稻草人},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
                end;
              end;
              if (TargeTBaseObject.m_btRaceServer = RC_PLAYOBJECT) or (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
                boTrain:=True;
            end;
            PlayObject.SetTargetCreat(TargeTBaseObject);
            boSpellFail:=False;
          end;
        end;
      end;
    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),
                          '');
    if UserMagic.MagicInfo.wMagicId in [78,79,80,81,83,85] then
    begin
      hum:=PlayObject.Ysplayer;
      if hum<>nil then
      begin
        hum.SendRefMsg(RM_MAGICFIRE,0,                  //发魔法打中的效果
                      MakeWord(UserMagic.MagicInfo.btEffectType,UserMagic.MagicInfo.btEffect),
                      MakeLong(nTargetX,nTargetY),
                      Integer(TargeTBaseObject),
                      '');
      end;
    end;
  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   :TList;
  TargeTBaseObject :TBaseObject;
begin
  Result:=False;
  if BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT{0x70}] > 0 then exit;   //4930FE
  BaseObjectList:=TList.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=nil then continue;
    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_boTishen then exit;
  if (TargeTBaseObject.m_btRaceServer <> RC_PLAYOBJECT) and (TargeTBaseObject.m_btRaceServer <> RC_YSBJECT) 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(1) = 0 then begin    //2
        if TargeTBaseObject.m_Abil.Level <= BaseObject.m_Abil.Level + 2 then begin
          if Random(2) = 0 then begin   //3
            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;


                  if Tplayobject(BaseObject).m_Magic69skill <> nil then begin   //兽灵术:06.01.23
                      case Tplayobject(BaseObject).m_Magic69skill.btLevel of
                        0:TargeTBaseObject.m_btSlaveExpLevel:=1;
                        1:TargeTBaseObject.m_btSlaveExpLevel:=2;   //怪物等级
                        2:TargeTBaseObject.m_btSlaveExpLevel:=3;
                        3:TargeTBaseObject.m_btSlaveExpLevel:=4;
                       end;
                     if Tplayobject(BaseObject).m_Magic69skill.btLevel < 3 then begin
                      if Tplayobject(BaseObject).m_Magic69skill.MagicInfo.TrainLevel[Tplayobject(BaseObject).m_Magic69skill.btLevel] <= Tplayobject(BaseObject).m_Abil.Level then begin
                        Tplayobject(BaseObject).TrainSkill(Tplayobject(BaseObject).m_Magic69skill,Random(3) + 1);
                         if not Tplayobject(BaseObject).CheckMagicLevelup(Tplayobject(BaseObject).m_Magic69skill) then begin
                          Tplayobject(BaseObject).SendDelayMsg(Tplayobject(BaseObject),RM_MAGIC_LVEXP,0,Tplayobject(BaseObject).m_Magic69skill.MagicInfo.wMagicId,Tplayobject(BaseObject).m_Magic69skill.btLevel,Tplayobject(BaseObject).m_Magic69skill.nTranPoint,'',1000);
                         end;
                       end;
                     end;


                  end;

                  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;                  

⌨️ 快捷键说明

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