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

📄 objmon.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 4 页
字号:
{ TElfMonster }

procedure TElfMonster.AppearNow;//004AB908
begin
   boIsFirst := FALSE;
   m_boFixedHideMode := FALSE;
   RecalcAbilitys;
   m_dwWalkTick := m_dwWalkTick + 800;
end;

constructor TElfMonster.Create;
begin
  inherited;
  m_nViewRange:=6;
  m_boFixedHideMode:=True;
  m_boNoAttackMode:=True;
  boIsFirst:=True;
end;

destructor TElfMonster.Destroy;
begin

  inherited;
end;

procedure TElfMonster.RecalcAbilitys;
begin
  inherited;
  ResetElfMon();
end;

procedure TElfMonster.ResetElfMon();
begin
  m_nWalkSpeed:=500 - m_btSlaveMakeLevel * 50;
  m_dwWalkTick:=GetCurrentTime + 2000;
end;

procedure TElfMonster.Run;
var
  boChangeFace:Boolean;
  ElfMon:TBaseObject;
begin
  if boIsFirst then begin
    boIsFirst:=False;
    m_boFixedHideMode:=False;
    SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
    ResetElfMon();
  end;
  if m_boDeath then begin
    if (GetTickCount - m_dwDeathTick > 2 * 1000) then begin
       MakeGhost();
    end;
  end else begin
    boChangeFace:=False;
    if m_TargetCret <> nil then boChangeFace:=True;
    if (m_Master <> nil) and ((m_Master.m_TargetCret <> nil) or (m_Master.m_LastHiter <> nil)) then
      boChangeFace:=True;
    if boChangeFace then begin
      ElfMon:=MakeClone(g_Config.sDragon1,Self);
      if ElfMon <> nil then begin
        ElfMon.m_boAutoChangeColor:=m_boAutoChangeColor;
        if ElfMon is TElfWarriorMonster then TElfWarriorMonster(ElfMon).AppearNow;
        m_Master:=nil;
        KickException();
      end;
    end;
  end;
  inherited;
end;
{ TElfWarriorMonster }
procedure TElfWarriorMonster.AppearNow; //004ABB60
begin
   boIsFirst := FALSE;
   m_boFixedHideMode := FALSE;
   SendRefMsg (RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
   RecalcAbilitys;
   m_dwWalkTick := m_dwWalkTick + 800; //函脚饶 距埃 掉饭捞 乐澜
   dwDigDownTick:=GetTickCount();
end;

constructor TElfWarriorMonster.Create;
begin
  inherited;
  m_nViewRange:=6;
  m_boFixedHideMode:=True;
  boIsFirst:=True;
  m_boUsePoison:=False;
end;

destructor TElfWarriorMonster.Destroy;
begin

  inherited;
end;
//004ABB08
procedure TElfWarriorMonster.RecalcAbilitys; //004ABAEC
begin
  inherited;
  ResetElfMon();
end;

procedure TElfWarriorMonster.ResetElfMon();
begin
  m_nNextHitTime:=1500 - m_btSlaveMakeLevel * 100;
  m_nWalkSpeed:=500 - m_btSlaveMakeLevel * 50;
  m_dwWalkTick:=GetCurrentTime + 2000;
end;

procedure TElfWarriorMonster.Run; //004ABBD0
var
  boChangeFace:Boolean;
  ElfMon:TBaseObject;
  ElfName:String;
begin
  ElfMon:=nil;
  if boIsFirst then begin
    boIsFirst:=False;
    m_boFixedHideMode:=False;
    SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
    ResetElfMon();
  end;//004ABC27
  if m_boDeath then begin
    if (GetTickCount - m_dwDeathTick > 2 * 1000) then begin
       MakeGhost();
    end;
  end else begin
    boChangeFace:=True;
    if m_TargetCret <> nil then boChangeFace:=False;
    if (m_Master <> nil) and ((m_Master.m_TargetCret <> nil) or (m_Master.m_LastHiter <> nil)) then
      boChangeFace:=False;
    if boChangeFace then begin
      if (GetTickCount - dwDigDownTick) > 6 * 10 * 1000 then begin
      //if (GetTickCount - dwDigDownTick) > 10 * 1000 then begin
        //ElfMon:=MakeClone(sDogz,Self);

        ElfName:=m_sCharName;
        if ElfName[length(ElfName)] = '1' then begin
          ElfName:=Copy(ElfName,1,length(ElfName) -1);
          ElfMon:=MakeClone(ElfName,Self);
        end;
        if ElfMon <> nil then begin
          SendRefMsg(RM_DIGDOWN, m_btDirection,m_nCurrX,m_nCurrY,0,'');
          SendRefMsg(RM_CHANGEFACE,0,Integer(Self),Integer(ElfMon),0,'');
          ElfMon.m_boAutoChangeColor:=m_boAutoChangeColor;
          if ElfMon is TElfMonster then
            TElfMonster(ElfMon).AppearNow;
          m_Master:=nil;
          KickException();
        end;
      end;
    end else begin
      dwDigDownTick:=GetTickCount();
    end;
  end;
  inherited;
end;


{ TElectronicScolpionMon }

constructor TElectronicScolpionMon.Create;
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
  m_boUseMagic:=False;
  m_boApproach:=FALSE;
end;

destructor TElectronicScolpionMon.Destroy;
begin

  inherited;
end;

function TElectronicScolpionMon.MagCanHitTarget(nX, nY:Integer;
  TargeTBaseObject: TBaseObject): Boolean; //004C6B1C
var
  n14,n18,n19,n1C,n20:Integer;
begin
  Result:=False;
  if TargeTBaseObject = nil then exit;
  n20:=abs(nX - TargeTBaseObject.m_nCurrX) + abs(nY - TargeTBaseObject.m_nCurrY);
  n14:=0;
  n18:=GetNextDirection(nX,nY,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY);
  while (n14 < 13) do begin
    n19:=GetNextDirection(nX,nY,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY);
    if n18 <> n19 then
      break;
    if m_PEnvir.GetNextPosition(nX,nY,n18,1,nX,nY) and m_PEnvir.IsValidCell(nX,nY) then begin
      if (nX = TargeTBaseObject.m_nCurrX) and (nY = TargeTBaseObject.m_nCurrY) then begin
        Result:=True;
        break;
      end else begin
        n1C:=abs(nX - TargeTBaseObject.m_nCurrX) + abs(nY - TargeTBaseObject.m_nCurrY);
        if n1C > n20 then begin
          Result:=True;
          break;
        end;
        n1C:=n20;
      end;
    end else begin
      break;
    end;
    Inc(n14);
  end;
end;

procedure TElectronicScolpionMon.LightingAttack(nDir: Integer);
var
  WAbil:pTAbility;
  nSX,nSY,nTX,nTY,nPwr:Integer;

begin
  m_btDirection:=nDir;
  if m_PEnvir.GetNextPosition(m_nCurrX,m_nCurrY,nDir,1,nSX,nSY) then begin
    m_PEnvir.GetNextPosition(m_nCurrX,m_nCurrY,nDir,3,nTX,nTY);
    WAbil:=@m_WAbil;
    nPwr:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC));
    MagPassThroughMagic(nSX,nSY,nTX,nTY,nDir,nPwr,True);
  end;
  SendRefMsg(RM_LIGHTING,1,m_nCurrX,m_nCurrY,Integer(m_TargetCret),'');
end;

procedure TElectronicScolpionMon.Run;
var
  nAttackDir,nDir,distx,disty:Integer;
  nX,nY:Integer;
begin
  if not m_boFixedHideMode and
     not m_boStoneMode and
     CanMove then begin

    if m_WAbil.HP < m_WAbil.MaxHP div 2 then m_boUseMagic:=True
    else m_boUseMagic:=False;

    if ((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      SearchTarget();
    end;
    if m_TargetCret <> nil then begin
    //walking
     if (GetCurrentTime - m_dwWalkTick > GetWalkSpeed) then begin //check if we should walk closer or not and do it :p
        distx:=abs(m_nCurrX - m_TargetCret.m_nCurrX);
        disty := abs(m_nCurrY - m_TargetCret.m_nCurrY);
        nDir:=GetNextDirection(m_nCurrX,m_nCurrY,m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
        if (((distx > 2) or (disty > 2)) and ((distx < 12) and (disty < 12))) or (MagCanHitTarget(m_nCurrX,m_nCurrY,m_targetCret) = false) then begin //restrict the maximum pursuit distance to 12 coords away
          m_dwWalkTick:=GetCurrentTime;
          m_nTargetX := m_TargetCret.m_nCurrX;
          m_nTargetY := m_TargetCret.m_nCurrY;
          GotoTargetXY
//          WalkTo(nDir,False);
        end;
      end;
      nX:=abs(m_nCurrX - m_TargetCret.m_nCurrX);
      nY:=abs(m_nCurrY - m_TargetCret.m_nCurrY);
      if MagCanHitTarget(m_nCurrX,m_nCurrY,m_targetCret) then begin //make sure the 'line' in wich magic will go isnt blocked
        if (nX <= 3) and (nY <= 3) then begin
          if m_boUseMagic or ((nX = 2) or (nY = 2)) then begin
            if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
              m_dwHitTick:=GetCurrentTime;
              nAttackDir:=GetNextDirection(m_nCurrX,m_nCurrY,m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
              LightingAttack(nAttackDir);
            end;
          end;
        end;
      end;
    end;
  end;
  inherited Run;
end;


constructor TCrystalSpider.Create;
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
  m_boUseMagic:=False;
end;

destructor TCrystalSpider.Destroy;
begin
  inherited;
end;

function TCrystalSpider.AttackTarget():Boolean; //004A8F34
var
  btDir:Byte;
begin
  Result:=False;
  if m_TargetCret <> nil then begin
    if GetAttackDir(m_TargetCret,btDir) then begin
      if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
        m_dwHitTick:=GetCurrentTime;
        m_dwTargetFocusTick:=GetTickCount();
        Attack(m_TargetCret,btDir);  //FFED
        if (Random(m_TargetCret.m_btAntiPoison + 20) = 0) then
          m_TargetCret.MakePosion(POISON_DECHEALTH,30,1);
        BreakHolySeizeMode();
      end;
      Result:=True;
    end else begin
      if m_TargetCret.m_PEnvir = m_PEnvir then begin
        SetTargetXY(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY); {0FFF0h}
        //004A8FE3
      end else begin
        DelTargetCreat();{0FFF1h}
        //004A9009
      end;
    end;
  end;
end;


{ TDDevilMon }

constructor TDDevil.Create;
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
  m_boUseMagic:=False;
  m_dwSpellTick:=GetTickCount();
end;

destructor TDDevil.Destroy;
begin

  inherited;
end;


procedure TDDevil.LightingAttack(nDir: Integer);
var
  WAbil:pTAbility;
  nSX,nSY,nTX,nTY,nPwr:Integer;

begin
  m_btDirection:=nDir;
  if m_PEnvir.GetNextPosition(m_nCurrX,m_nCurrY,nDir,1,nSX,nSY) then begin
    m_PEnvir.GetNextPosition(m_nCurrX,m_nCurrY,nDir,2,nTX,nTY);
    WAbil:=@m_WAbil;
    nPwr:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC));
    MagPassThroughMagic(nSX,nSY,nTX,nTY,nDir,nPwr,True);
  end;
  SendRefMsg(RM_LIGHTING,1,m_nCurrX,m_nCurrY,Integer(m_TargetCret),'');
end;

procedure TDDevil.Run;
var
  nAttackDir:Integer;
  nX,nY:Integer;
begin
  if (not bo554) and CanMove then begin

    if ((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      SearchTarget();
    end;
    if m_TargetCret <> nil then begin
      nX:=abs(m_nCurrX - m_TargetCret.m_nCurrX);
      nY:=abs(m_nCurrY - m_TargetCret.m_nCurrY);
      if (nX <= 2) and (nY <= 2) then begin
      //if m_boUseMagic or ((nX = 2) or (nY = 2)) then begin
        if (Integer(GetTickCount - m_dwSpellTick) > (m_nNextHitTime * 4)) then begin
          m_dwSpellTick:=GetTickCount();
          nAttackDir:=GetNextDirection(m_nCurrX,m_nCurrY,m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
          LightingAttack(nAttackDir);
        end;
      end;
    end;
  end;
  inherited Run;
end;


constructor TRedThunderZuma.Create;//004AAE20
begin

  m_dwSearchTime:=Random(1500) + 1500;
  m_boStoneMode:=True;
  m_nCharStatusEx:=STATE_STONE_MODE;
  m_nViewRange:=12;
  m_dwSpellTick:=GetTickCount();
  inherited;
end;

destructor TRedThunderZuma.Destroy;
begin
  inherited;
end;


procedure TRedThunderZuma.Run;//004AAF98
begin
  if (not bo554) and CanMove then begin
    if m_TargetCret <> nil then begin
      if (Integer(GetTickCount - m_dwSpellTick) > 2500) then begin
        m_dwSpellTick:=GetTickCount();
        MagicAttack();
      end;
    end;
  end;
  inherited;
end;

procedure TRedThunderZuma.MagicAttack();
var
  WAbil:pTAbility;
  nPwr:Integer;
begin
  SendRefMsg(RM_LIGHTING,1,m_nCurrX,m_nCurrY,Integer(m_TargetCret),'');

  if IsProperTarget(m_TargetCret) then begin
    WAbil:=@m_WAbil;
    nPwr:=(Random(SmallInt(HiWord(WAbil.MC) - LoWord(WAbil.MC)) + 1) + LoWord(WAbil.MC));
    if nPwr > 0 then
    m_TargetCret.SendDelayMsg (self, RM_MAGSTRUCK, 0, npwr, 1, 0, '', 600);
  end;
end;

{ TStoneMonster }

constructor TStoneMonster.Create;
begin
  inherited;
  m_nViewRange   := 6;
  m_boStickMode  := True;
end;

destructor TStoneMonster.Destroy;
begin

  inherited;
end;

procedure TStoneMonster.Run;
var
  i, x, y:     integer;
  nStartX, nStartY, nEndX, nEndY: integer;
  boRecalc:Boolean;
  BaseObject: TBaseObject;
  xList:TList;
begin
  if (not m_boGhost) and (not m_boDeath) then begin
    if GetCurrentTime - m_dwWalkTick > 5000 then begin
      m_dwWalkTick := GetCurrentTime;

      nStartX := _MAX(0, m_nCurrX-3);
      nEndX := _MIN(m_PEnvir.Header.wWidth, m_nCurrX+3);
      nStartY := _MAX(0, m_nCurrY-3);
      nEndY := _MIN(m_PEnvir.Header.wHeight, m_nCurrY+3);

      xList:=TList.Create;
      for x := nStartX to nEndX do begin
        for y := nStartY to nEndY do begin

          m_PEnvir.GetBaseObjects(x, y, True, xList);
          for i := 0 to xList.Count - 1 do begin
            BaseObject := TBaseObject(xList.Items[i]);
            boRecalc := False;
            if BaseObject<>nil then begin
              if (BaseObject.m_btRaceServer <> RC_PLAYOBJECT) and
                (BaseObject.m_Master = nil) and
                (not BaseObject.m_boGhost) and
                (not BaseObject.m_boDeath) then begin

                if BaseObject.m_btRaceServer = 138{OmaThing :P} then begin
                  if BaseObject.m_wStatusArrValue[0] = 0 then begin
                    boRecalc := True;
                    BaseObject.m_wStatusArrValue[0] := 15;
                    BaseObject.m_dwStatusArrTimeOutTick[0] := GetTickCount + 15100;
                  end;
                end else begin
                  if BaseObject.m_wStatusTimeArr[STATE_DEFENCEUP] = 0 then begin
                    boRecalc := True;
                    BaseObject.m_wStatusTimeArr[STATE_DEFENCEUP] := 8;
                    BaseObject.m_dwStatusArrTick[STATE_DEFENCEUP] := GetTickCount;
                  end;
                  if BaseObject.m_wStatusTimeArr[STATE_MAGDEFENCEUP] = 0 then begin
                    boRecalc := True;
                    BaseObject.m_wStatusTimeArr[STATE_MAGDEFENCEUP] := 8;
                    BaseObject.m_dwStatusArrTick[STATE_MAGDEFENCEUP] := GetTickCount;
                  end;
                end;

                if boRecalc then BaseObject.RecalcAbilitys();
              end;
            end;

            if (Random(6) = 0) and boRecalc then begin
              SendRefMsg(RM_HIT, 0, m_nCurrX, m_nCurrY, 0, '');
            end;
          end;
        end;
      end;
      xList.Free;

      if Random(2) = 0 then begin
        SendRefMsg(RM_TURN, 0, m_nCurrX, m_nCurrY, 0, '');
      end;
    end;
  end;
  inherited;
end;

{---- Adjust global SVN revision ----}
initialization
  SVNRevision('$Id: ObjMon.pas 594 2007-03-09 15:00:12Z damian $');
end.

⌨️ 快捷键说明

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