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

📄 magic.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
              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(1) = 0 then Result:=True;  //2    
  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;    //   (PlayObject.m_Abil.Level > PoseBaseObject.m_Abil.Level)
begin
  Result:=False;
  PoseBaseObject:=PlayObject.GetPoseCreate;
//  TbaseObject(PlayObject).m_btDirection  :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY);
  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) or ((PlayObject.m_Abil.Level = PoseBaseObject.m_Abil.Level)and(PlayObject.m_nfenghaolevel>PoseBaseObject.m_nfenghaolevel)))  then begin
      if Random(20) < UserMagic.btLevel * 6 + 6 + (PlayObject.m_Abil.Level - PoseBaseObject.m_Abil.Level) then begin
        PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),_MAX(0,UserMagic.btLevel -1) + 2);
      //  if (PoseBaseObject.m_btRaceServer = RC_PLAYOBJECT) and (playobject.m_btRaceServer = RC_PLAYOBJECT) then begin
      //      PoseBaseObject.SetPKFlag(playobject);
      //    end;
      //  PoseBaseObject.SetLastHiter(PlayObject);
        PoseBaseObject.StruckDamage(UserMagic.btLevel*2+5);
        PoseBaseObject.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, PoseBaseObject.m_WAbil.HP, PoseBaseObject.m_WAbil.MaxHP,Integer(PlayObject),'');
       if PoseBaseObject.m_btRaceServer <> RC_PLAYOBJECT then
           PoseBaseObject.m_dwWalkTick := PoseBaseObject.m_dwWalkTick + 1000    //狮子 怪物卡位 1秒
       else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
       TPlayObject(PoseBaseObject).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime;  //人物卡位 1。5



        TbaseObject(PlayObject).m_btDirection :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY);
        Result:=True;
      end;
    end;
  end;
end;
}
function TMagicManager.MagWindTebo(PlayObject: TPlayObject;     //  狮子吼
  UserMagic: pTUserMagic): Boolean;                                  
 function CanWindTebo(BaseObject:TBaseObject):Boolean;//0x004C30B0
  var
    nC:Integer;
  begin                //    (m_Abil.Level > BaseObject.m_Abil.Level)
    Result:=False;


    if (BaseObject <> nil) and   
     (not BaseObject.m_boDeath) and
     (not BaseObject.m_boGhost) and
     (PlayObject.IsProperTarget(BaseObject)) and
     (not BaseObject.m_boStickMode) and
     ((PlayObject.m_Abil.Level > BaseObject.m_Abil.Level)or (PlayObject.m_Abil.Level = BaseObject.m_Abil.Level)and(PlayObject.m_nfenghaolevel>BaseObject.m_nfenghaolevel))
      then begin



       Result:=True;
      end;
    
  end;


var
  PoseBaseObject,BaseObject_30:TBaseObject;
  nX,nY,i:integer;
  pushok:boolean;
begin
  Result:=False;
  pushok:=false;
  if UserMagic.btLevel>=3 then begin
    PoseBaseObject:=PlayObject.GetPoseCreate;

    if CanWindTebo(PoseBaseObject) and
       (abs(PlayObject.m_nCurrX - PoseBaseObject.m_nCurrX) <= 1) and
       (abs(PlayObject.m_nCurrY - PoseBaseObject.m_nCurrY) <= 1) then begin

      PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PlayObject.m_btDirection,2,nX,nY);
      BaseObject_30:=nil;
      BaseObject_30:=PlayObject.m_PEnvir.GetMovingObject(nX,nY,True);
      if BaseObject_30 =nil then  begin
        PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),4);
        pushok:=true;
      end;
      if (BaseObject_30<>nil) and  CanWindTebo(BaseObject_30) then begin
          BaseObject_30.CharPushed(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,BaseObject_30.m_nCurrX,BaseObject_30.m_nCurrY),4);
          PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),4);
          pushok:=true;
      end;
      if pushok then begin
        PoseBaseObject.StruckDamage(UserMagic.btLevel*2+5);
        PoseBaseObject.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, PoseBaseObject.m_WAbil.HP, PoseBaseObject.m_WAbil.MaxHP,Integer(PlayObject),'');
        if PoseBaseObject.m_btRaceServer <> RC_PLAYOBJECT then
           PoseBaseObject.m_dwWalkTick := PoseBaseObject.m_dwWalkTick + 1000    //狮子 怪物卡位 1秒
        else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
        TPlayObject(PoseBaseObject).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime;  //人物卡位 1。5

  {     if  BaseObject_30<>nil then begin
        BaseObject_30.StruckDamage(UserMagic.btLevel*2+5);
        BaseObject_30.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, BaseObject_30.m_WAbil.HP, BaseObject_30.m_WAbil.MaxHP,Integer(PlayObject),'');
        if BaseObject_30.m_btRaceServer <> RC_PLAYOBJECT then
           BaseObject_30.m_dwWalkTick := BaseObject_30.m_dwWalkTick + 1000    //狮子 怪物卡位 1秒
        else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
        TPlayObject(BaseObject_30).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime;  //人物卡位 1。5

       end; }
      end; //     if pushok then begin

    end;



  exit;
  end;



  PoseBaseObject:=PlayObject.GetPoseCreate;


//  TbaseObject(PlayObject).m_btDirection  :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY);
  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)or (PlayObject.m_Abil.Level = PoseBaseObject.m_Abil.Level)and(PlayObject.m_nfenghaolevel>PoseBaseObject.m_nfenghaolevel)) then begin
      if Random(20) < UserMagic.btLevel * 6 + 6 + (PlayObject.m_Abil.Level - PoseBaseObject.m_Abil.Level) then begin
        PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),_MAX(0,UserMagic.btLevel -1) + 2);
      //  if (PoseBaseObject.m_btRaceServer = RC_PLAYOBJECT) and (playobject.m_btRaceServer = RC_PLAYOBJECT) then begin
      //      PoseBaseObject.SetPKFlag(playobject);
      //    end;
      //  PoseBaseObject.SetLastHiter(PlayObject);
        PoseBaseObject.StruckDamage(UserMagic.btLevel*2+5);
        PoseBaseObject.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, PoseBaseObject.m_WAbil.HP, PoseBaseObject.m_WAbil.MaxHP,Integer(PlayObject),'');
       if PoseBaseObject.m_btRaceServer <> RC_PLAYOBJECT then
           PoseBaseObject.m_dwWalkTick := PoseBaseObject.m_dwWalkTick + 1000    //狮子 怪物卡位 1秒
       else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
       TPlayObject(PoseBaseObject).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime;  //人物卡位 1。5



        TbaseObject(PlayObject).m_btDirection :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY);
        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.MagMonMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;

 var nx,ny:integer;
begin
        result:=false;
        if TargeTBaseObject=nil then exit;
        if PlayObject.IsProperTarget (TargeTBaseObject) and (PlayObject.m_Abil.Level > TargeTBaseObject.m_Abil.Level) then begin
        if (Random(11) <=  btLevel * 2+5) then begin
           if  (TargeTBaseObject.m_btRaceServer <> RC_PLAYOBJECT )  then  begin   //弓箭手 and (TargeTBaseObject.m_btRaceServer < 100)
                   playObject.GetFrontPosition(nX,nY);
                if playObject.m_PEnvir.CanWalk(nX, nY,false) then  begin

                   if TargeTBaseObject.m_PEnvir.DeleteFromMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject)=1 then begin
                      TargeTBaseObject.SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
                      TargeTBaseObject.m_nCurrX:=nx;
                      TargeTBaseObject.m_nCurrY:=ny;
                      TargeTBaseObject.m_PEnvir.AddToMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject);   //  ,500
                 //   TargeTBaseObject.TurnTo( GetNextDirection(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,playObject.m_nCurrX,playObject.m_nCurrY) );
                      TargeTBaseObject.SendRefMsg(RM_TURN,GetNextDirection(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,playObject.m_nCurrX,playObject.m_nCurrY) ,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,0,TargeTBaseObject.GetShowName);

                 // TargeTBaseObject.SpaceMove(TargeTBaseObject.m_sMapName,nx,ny,1);
                      result:=true;
                   end;
               end;
            //   TargeTBaseObject.m_PEnvir.DeleteFromMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject);
            //   TargeTBaseObject.m_nCurrX:=playObject.m_nCurrX+1;
            //   TargeTBaseObject.m_nCurrY:=playObject.m_nCurrY+1;
           //    TargeTBaseObject.m_PEnvir.AddToMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject);   //  ,500


           end;
        end else PlayObject.SysMsg('抓取能力不足',c_Red,t_Hint);


        end;
   

end;

function  TMagicManager.MagbaobaoMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;
 var nx,ny:integer;
     i:integer;
     mon:TBaseObject;
      p28:Pointer;
begin
        p28:=nil;
        result:=false;
        if TargeTBaseObject=nil then
        begin
           playObject.GetFrontPosition(nX,nY);
           if not playObject.m_PEnvir.CanWalk(nX, nY,false)  then exit;
           for i:=playObject.m_SlaveList.Count -1 downto 0 do  begin
              mon:= TBaseObject(playObject.m_SlaveList.Items[i])  ;

              if not mon.m_bohorse then
                begin
             //   if playObject.m_PEnvir.CanWalk(nX, nY,false) then begin
                  
                if  mon.m_PEnvir.DeleteFromMap(mon.m_nCurrX,mon.m_nCurrY,OS_MOVINGOBJECT,mon)=1 then begin
                   mon.SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
                   mon.m_nCurrX:=nx;
                   mon.m_nCurrY:=ny;
                   mon.m_PEnvir:= playObject.m_PEnvir;
                   mon.SetTargetCreat(nil);

                   p28:=playObject.m_PEnvir.AddToMap(mon.m_nCurrX,mon.m_nCurrY,OS_MOVINGOBJECT,mon);   //  ,500
                   if p28<>nil then begin
                     case btlevel of
                     0: if mon.m_WAbil.HP*3 < mon.m_WAbil.MaxHP then  mon.m_WAbil.HP:= mon.m_WAbil.MaxHP div 3;
                     1: if mon.m_WAbil.HP*2 < mon.m_WAbil.MaxHP then  mon.m_WAbil.HP:= mon.m_WAbil.MaxHP div 2;
                     2: if mon.m_WAbil.HP < mon.m_WAbil.MaxHP*3 div 4 then  mo

⌨️ 快捷键说明

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