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

📄 objmon2.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  end;
  inherited;
end;

procedure TEvilMir.CallSlaves();
const
  sMonName:array[0..2] of String = ('1', '2', '3');//basicaly by adding to this you can make new 'slaves' that drop better
var
  I: Integer;
  BaseObject:TBaseObject;
begin
  for i := 0 to High(g_DragonSearchPath) do begin
    if (g_DragonSearchPath[i,0] = 0) and (g_DragonSearchPath[i,1] = 0) then Continue;
    BaseObject := UserEngine.RegenMonsterByName(m_PEnvir.sMapName, m_nCurrX+g_DragonSearchPath[i,0], m_nCurrY+g_DragonSearchPath[i,1], sMonName[_Min(nEMKills,Length(sMonName))]);
    {if BaseObject <> nil then begin
      m_xSlaveList.Add(BaseObject);
    end;}
  end;
end;

procedure TEvilMir.FlameCircle(nDir:Integer);
var
  nSX,nSY,nTX,nTY,nPwr:Integer;
  I:Integer;
  magpwr:Integer;
  TargetNum:Integer;
  WAbil:pTAbility;
  BaseObject:TBaseObject;
  Target:TBaseObject;
begin
//target selected
 Target := m_TargetCret;
 {do spell effect}
 if nDir <= 4 then
   SendRefMsg(RM_81,nDir,m_nCurrX,m_nCurrY,Integer(Target),'');
 if nDir = 5 then
   SendRefMsg(RM_82,nDir,m_nCurrX,m_nCurrY,Integer(Target),'');
 if nDir >= 6 then
   SendRefMsg(RM_83,nDir,m_nCurrX,m_nCurrY,Integer(Target),'');
 //if (nDir <> 4) and (nDir <> 5) and (nDir <> 6) then
 //Target.SendMsg(self,RM_SYSMESSAGE,0,g_Config.btGreenMsgFColor,g_Config.btGreenMsgBColor,0,'Evilmir hits in unknown direction debug required, dir:');

 for i:=0 to Target.m_VisibleActors.Count-1 do begin
  BaseObject:= TBaseObject (pTVisibleBaseObject(Target.m_VisibleActors[i]).BaseObject);
   if (abs(Target.m_nCurrX-BaseObject.m_nCurrX) <= 2) and (abs(Target.m_nCurrY-BaseObject.m_nCurrY) <= 2) then begin

    if BaseObject <> nil then begin
      if IsProperTarget (BaseObject) then begin
        if Random(50) >= BaseObject.m_nAntiMagic then begin
          WAbil:=@m_WAbil;
          magpwr:=Random(nEMKills * 5) + (Random(SmallInt(HiWord(WAbil.MC) - LoWord(WAbil.MC)) + 1) + LoWord(WAbil.MC));
          BaseObject.SendDelayMsg (self, RM_MAGSTRUCK, 0, magpwr, 1, 0, '', 600);
        end;
      end;
    end;
   end;
  end;
end;

procedure TEvilMir.MassThunder();
var
  xTargetList:TList;
  BaseObject:TBaseObject;
  WAbil:pTAbility;
  magpwr:Integer;
  i:Integer;
begin
  m_dwSpellTick:=GetTickCount();
  SendAttackMsg(RM_hit,0,m_nCurrX,m_nCurrY);//make client show random tbolting;
  xTargetList := TList.Create;
  GetMapBaseObjects(m_PEnvir,m_nCurrX,m_nCurrY,14,xTargetList);

	if (xTargetList.Count>0) then begin
    for i:=xTargetList.Count-1 downto 0 do begin
      BaseObject := TBaseObject(xTargetList.Items[i]);

      if (BaseObject<>nil) then begin
      if IsProperTarget(BaseObject) then begin
         WAbil:=@m_WAbil;
          magpwr:=Random(nEMKills * 12) + (Random(SmallInt(HiWord(WAbil.SC) - LoWord(WAbil.SC)) + 1) + LoWord(WAbil.SC));
          BaseObject.SendDelayMsg (self, RM_MAGSTRUCK, 0, magpwr, 1, 0, '', 600);
      end;
        xTargetList.Delete(i);
		  end;
    end;
	end;
  xTargetList.Free;
end;


function TEvilMir.Operate(ProcessMsg:pTProcessMessage):boolean;
begin
  if (ProcessMsg.wIdent = RM_POISON) then begin
    massthunder();
  end;
  Result:=inherited Operate(ProcessMsg);
end;

procedure TEvilMir.Die;
begin
  inherited;
  m_dwDeathTick := GetTickCount + 5*60*1000;
end;


{ THellGuard }

constructor THellGuard.Create;
begin
  inherited;
  m_nViewRange:=16;
  m_boAnimal:=False;
end;

destructor THellGuard.Destroy;
begin

  inherited;
end;

function THellGuard.AttackTarget():Boolean;
var
  I: Integer;
  BaseObject:TBaseObject;
  nPower:Integer;
  WAbil:pTAbility;
begin
  Result:=False;
  if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
    m_dwHitTick:=GetCurrentTime;
    SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
    WAbil:=@m_WAbil;
    nPower:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
    for I := 0 to m_VisibleActors.Count - 1 do begin
      BaseObject:=TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
      if BaseObject.m_boDeath then Continue;
      if IsProperTarget(BaseObject) then begin
        if (abs(m_nCurrX - BaseObject.m_nCurrX) <= m_nViewRange) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= m_nViewRange) then begin
          SendDelayMsg(Self,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),1,Integer(BaseObject),'',200);
          SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,17{type},'');
        end;
      end;
    end;
    Result:=True;
  end;
end;

procedure THellGuard.Run;
begin
  if CanMove then begin
    if m_VisibleActors.Count > 0 then
      AttackTarget();
  end;
   if (Random(10) = 0) then begin
      RepulseCircle();
   end;
  inherited;
end;

procedure THellGuard.RepulseCircle();
var
  I:Integer;
  BaseObject:TBaseObject;
  nDir:Byte;
  push:integer;
begin
 nDir:= GetNextDirection (m_nCurrX, m_nCurrY, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
 m_btDirection:=nDir;

 SendRefMsg(RM_LIGHTING,nDir,m_nCurrX,m_nCurrY,Integer(self),'');

 for i:=0 to m_VisibleActors.Count-1 do begin
  BaseObject:= TBaseObject (pTVisibleBaseObject(m_VisibleActors[i]).BaseObject);
   if (abs(m_nCurrX-BaseObject.m_nCurrX) <= 2) and (abs(m_nCurrY-BaseObject.m_nCurrY) <= 2)
    and ((abs(m_nCurrY - m_TargetCret.m_nCurrY) + abs(m_nCurrX - m_TargetCret.m_nCurrX)) <= 3) then begin

    if BaseObject <> nil then begin
      if IsProperTarget (BaseObject) then begin
        if Random(50) >= BaseObject.m_nAntiMagic then begin
          push := 1 + Random(3);
          nDir:= GetNextDirection (m_nCurrX, m_nCurrY, BaseObject.m_nCurrX, BaseObject.m_nCurrY);
          BaseObject.CharPushed (nDir, push);
          SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,18{type},'');

          {if Random(3) <> 0 then
            BaseObject.MakePosion(POISON_STONE,5,0);
          end;}
        end;
      end;
    end;
   end;
  end;
end;

constructor TGuardianRock.Create;
begin
  inherited;
  m_nViewRange:=16;
  m_boAnimal:=False;
end;

destructor TGuardianRock.Destroy;
begin
  inherited;
end;

function TGuardianRock.AttackTarget():Boolean;
var
  I: Integer;
  BaseObject:TBaseObject;
  nPower:Integer;
  WAbil:pTAbility;
begin
  Result:=False;
  if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
    m_dwHitTick:=GetCurrentTime;
    SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
    WAbil:=@m_WAbil;
    nPower:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
    for I := 0 to m_VisibleActors.Count - 1 do begin
      BaseObject:=TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
      if BaseObject.m_boDeath then Continue;
      if IsProperTarget(BaseObject) then begin
        if (abs(m_nCurrX - BaseObject.m_nCurrX) <= m_nViewRange) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= m_nViewRange) then begin
          //SendDelayMsg(Self,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),1,Integer(BaseObject),'',200);
          SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,23{type},'');

        end;
      end;
    end;
    Result:=True;
  end;
end;

procedure TGuardianRock.Run;
begin
{  if CanMove then begin
    if m_VisibleActors.Count > 0 then
      AttackTarget();
  end;}
   if (Random(5) = 0) then begin
      AttackTarget();
   end;
  inherited;
end;

constructor TFoxOrbSpirit.Create;
begin
  inherited;
  m_dwSpellTick:=GetTickCount();
//  m_boAnimal:=False;
//  boSlaves:=False;
//  dwEMDied:=0;
//  m_nViewRange:=1;
end;

destructor TFoxOrbSpirit.Destroy;
begin
  inherited;
end;

procedure TFoxOrbSpirit.Run;
var
  nDir:Byte;
begin
  if not m_boFixedHideMode and
     not m_boStoneMode and
     CanMove then begin

     if (m_TargetCret <> nil) and (Integer(GetTickCount - m_dwHitTick) > 7000) and (abs(m_nCurrX - m_TargetCret.m_nCurrX) <= 10) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) <= 10) then begin
      m_dwHitTick:=GetCurrentTime;
      nDir:= GetNextDirection (m_nCurrX, m_nCurrY, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
      FlameCircle(nDir);
     end;

     if (m_TargetCret <> nil) and (Integer(GetTickCount - m_dwSpellTick) > 10000) and (abs(m_nCurrX - m_TargetCret.m_nCurrX) <= 10) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) <= 10) then begin
      MassThunder;
     end;

     {if (m_TargetCret <> nil) and (Integer(GetTickCount - m_dwSpellTick) > 5000) and (abs(m_nCurrX - m_TargetCret.m_nCurrX) <= 10) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) <= 10) then begin
      FoxYell;
     end;}
     if (GetCurrentTime - m_dwWalkTick > GetWalkSpeed) then begin
      m_dwWalkTick:=GetCurrentTime;
      SendRefMsg(RM_TURN,m_btDirection,m_nCurrX,m_nCurrY,0,'');
     end; 
    if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
       (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      SearchTarget();
   end;
  end;
  inherited;
end;

procedure TFoxOrbSpirit.FoxYell();
var
  I:Integer;
  magpwr:Integer;
  WAbil:pTAbility;
  BaseObject:TBaseObject;
  Target:TBaseObject;
  nDir:integer;
begin
//target selected
 Target := m_TargetCret;
 nDir:= GetNextDirection (m_nCurrX, m_nCurrY, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
  m_btDirection:=nDir;
 {do spell effect}
 SendRefMsg(RM_LIGHTING,nDir,m_nCurrX,m_nCurrY,Integer(self),'');

 for i:=0 to self.m_VisibleActors.Count-1 do begin
  BaseObject:= TBaseObject (pTVisibleBaseObject(Target.m_VisibleActors[i]).BaseObject);
   if (abs(Target.m_nCurrX-BaseObject.m_nCurrX) <= 8) and (abs(Target.m_nCurrY-BaseObject.m_nCurrY) <= 8) then begin

    if BaseObject <> nil then begin
      if IsProperTarget (BaseObject) then begin
        if Random(50) >= BaseObject.m_nAntiMagic then begin
          WAbil:=@m_WAbil;
          magpwr:=(baseobject.m_WAbil.MaxHP * LoWord(WAbil.MC)) div 100;
          BaseObject.SendDelayMsg (self, RM_MAGSTRUCK, 0, magpwr, 1, 0, '', 600);
          SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,27{type},'');
          if Random(3) <> 0 then
            BaseObject.MakePosion(POISON_STONE,4,0);

        end;
      end;
    end;
   end;
  end;
end;

procedure TFoxOrbSpirit.FlameCircle(nDir:Integer);
var
  nSX,nSY,nTX,nTY,nPwr:Integer;
  I:Integer;
  magpwr:Integer;
  TargetNum:Integer;
  WAbil:pTAbility;
  BaseObject:TBaseObject;
  Target:TBaseObject;
begin
 Target := m_TargetCret;
   SendRefMsg(RM_LIGHTING,nDir,m_nCurrX,m_nCurrY,Integer(Target),'');

 for i:=0 to Target.m_VisibleActors.Count-1 do begin
  BaseObject:= TBaseObject (pTVisibleBaseObject(Target.m_VisibleActors[i]).BaseObject);
   if (abs(Target.m_nCurrX-BaseObject.m_nCurrX) <= 2) and (abs(Target.m_nCurrY-BaseObject.m_nCurrY) <= 2) then begin

    if BaseObject <> nil then begin
      if IsProperTarget (BaseObject) then begin
        if Random(50) >= BaseObject.m_nAntiMagic then begin
          WAbil:=@m_WAbil;
          magpwr:=Random(nEMKills * 5) + (Random(SmallInt(HiWord(WAbil.MC) - LoWord(WAbil.MC)) + 1) + LoWord(WAbil.MC));
          BaseObject.SendDelayMsg (self, RM_MAGSTRUCK, 0, magpwr, 1, 0, '', 600);
          SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,26{type},'');
        end;
      end;
    end;
   end;
  end;
end;

procedure TFoxOrbSpirit.MassThunder();
var
  xTargetList:TList;
  BaseObject:TBaseObject;
  WAbil:pTAbility;
  magpwr:Integer;
  i:Integer;
begin
  m_dwSpellTick:=GetTickCount();
  SendAttackMsg(RM_hit,0,m_nCurrX,m_nCurrY);
  xTargetList := TList.Create;
  GetMapBaseObjects(m_PEnvir,m_nCurrX,m_nCurrY,14,xTargetList);

	if (xTargetList.Count>0) then begin
    for i:=xTargetList.Count-1 downto 0 do begin
      BaseObject := TBaseObject(xTargetList.Items[i]);

      if (BaseObject<>nil) then begin
      if IsProperTarget(BaseObject) then begin
         WAbil:=@m_WAbil;
          magpwr:=Random(nEMKills * 12) + (Random(SmallInt(HiWord(WAbil.SC) - LoWord(WAbil.SC)) + 1) + LoWord(WAbil.SC));
          BaseObject.SendDelayMsg (self, RM_MAGSTRUCK, 0, magpwr, 1, 0, '', 600);
      end;
        xTargetList.Delete(i);
		  end;
    end;
	end;
  xTargetList.Free;
end;


{function TFoxOrbSpirit.Operate(ProcessMsg:pTProcessMessage):boolean;
begin
  if (ProcessMsg.wIdent = RM_POISON) then begin
    massthunder();
  end;
  Result:=inherited Operate(ProcessMsg);
end;  }

{procedure TFoxOrbSpirit.Die;
begin
  inherited;
  m_dwDeathTick := GetTickCount + 5*60*1000;
end;}


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

⌨️ 快捷键说明

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