📄 objmon.pas
字号:
{ 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 + -