📄 objmon.pas
字号:
constructor THighRiskSpider.Create;//004A9B64
begin
inherited;
m_boAnimal:=False;
m_boUsePoison:=False;
end;
destructor THighRiskSpider.Destroy;
begin
inherited;
end;
{ TBigPoisionSpider }
constructor TBigPoisionSpider.Create;//004A9BBC
begin
inherited;
m_boAnimal:=False;
m_boUsePoison:=True;
end;
destructor TBigPoisionSpider.Destroy;
begin
inherited;
end;
{ TGasAttackMonster }
constructor TGasAttackMonster.Create; //004A9C14
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
m_boAnimal:=True;
end;
destructor TGasAttackMonster.Destroy;
begin
inherited;
end;
function TGasAttackMonster.sub_4A9C78(bt05: Byte):TBaseObject;
var
WAbil:pTAbility;
n10:integer;
BaseObject:TBaseObject;
begin
Result:=nil;
m_btDirection:=bt05;
WAbil:=@m_WAbil;
n10:=Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC);
if n10 > 0 then begin
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
BaseObject:=GetPoseCreate();
if (BaseObject <> nil) and
IsProperTarget(BaseObject) and
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) then begin
n10:=BaseObject.GetMagStruckDamage(Self,n10);
if n10 > 0 then begin
BaseObject.StruckDamage(n10);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,n10,BaseObject.m_WAbil.HP,BaseObject.m_WAbil.MaxHP,Integer(Self),'',300);
if Random(BaseObject.m_btAntiPoison + 20) = 0 then begin
BaseObject.MakePosion(POISON_STONE,5,0)
end;
Result:=BaseObject;
end;
end;
end;
end;
function TGasAttackMonster.AttackTarget():Boolean;//004A9DD4
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if GetAttackDir(m_TargetCret,btDir) then begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
m_dwTargetFocusTick:=GetTickCount();
sub_4A9C78(btDir);
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);
end else begin
DelTargetCreat();
end;
end;
end;
{ TCowMonster }
constructor TCowMonster.Create;//004A9EB4
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
end;
destructor TCowMonster.Destroy;
begin
inherited;
end;
{ TMagCowMonster }
constructor TMagCowMonster.Create;//004A9F10
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
end;
destructor TMagCowMonster.Destroy;
begin
inherited;
end;
procedure TMagCowMonster.sub_4A9F6C(btDir: Byte);
var
WAbil:pTAbility;
n10:integer;
BaseObject:TBaseObject;
begin
m_btDirection:=btDir;
WAbil:=@m_WAbil;
n10:=Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC);
if n10 > 0 then begin
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
BaseObject:=GetPoseCreate();
if (BaseObject <> nil) and
IsProperTarget(BaseObject) and
(m_nAntiMagic >= 0) then begin
n10:=BaseObject.GetMagStruckDamage(Self,n10);
if n10 > 0 then begin
BaseObject.StruckDamage(n10);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,n10,BaseObject.m_WAbil.HP,BaseObject.m_WAbil.MaxHP,Integer(Self),'',300);
end;
end;
end;
end;
function TMagCowMonster.AttackTarget: Boolean;//004AA084
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if GetAttackDir(m_TargetCret,btDir) then begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
m_dwTargetFocusTick:=GetTickCount();
sub_4A9F6C(btDir);
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);
end else begin
DelTargetCreat();
end;
end;
end;
{ TCowKingMonster }
constructor TCowKingMonster.Create;//004AA160
begin
inherited;
m_dwSearchTime:=Random(1500) + 500;
dw558:=GetTickCount();
bo2BF:=True;
n560:=0;
bo55C:=False;
bo55D:=False;
m_boBOSS:=true;
end;
destructor TCowKingMonster.Destroy;
begin
inherited;
end;
procedure TCowKingMonster.Attack(TargeTBaseObject: TBaseObject; nDir: Integer); //004AA1F0
var
WAbil:pTAbility;
nPower:integer;
begin
WAbil:=@m_WAbil;
nPower:=GetAttackPower(LoWord(WAbil.DC),SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
HitMagAttackTarget(TargeTBaseObject,nPower div 2,nPower div 2,True);
// inherited;
end;
procedure TCowKingMonster.Initialize;
begin
dw56C:=m_nNextHitTime;
dw570:=m_nWalkSpeed;
inherited;
end;
procedure TCowKingMonster.Run;//004AA294
var
I: Integer;
n8,nC,n10:Integer;
BaseObject:TBaseObject;
begin
if (not m_boDeath) and
(not bo554) and
(not m_boGhost) and
((GetTickCount - dw558) > 30 * 1000) then begin
dw558:=GetTickCount();
if (m_TargetCret <> nil) and (sub_4C3538 >= 5) then begin //
m_TargetCret.GetBackPosition(n8,nC);
if m_PEnvir.CanWalk(n8,nC,False) then begin
SpaceMove(m_PEnvir.sMapName,n8,nC,0);
exit;
end;
MapRandomMove(m_PEnvir.sMapName,0);
exit;
end;
n10:=n560;
n560:=7 - m_WAbil.HP div (m_WAbil.MaxHP div 7);
if (n560 >= 2) and (n560 <> n10) then begin
bo55C:=True;
dw564:=GetTickCount();
end;
if bo55C then begin
if (GetTickCount - dw564) < 8000 then begin
m_nNextHitTime:=10000;
end else begin
bo55C:=False;
bo55D:=True;
dw568:=GetTickCount();
end;
end;//004AA43D
if bo55D then begin
if (GetTickCount - dw568) < 8000 then begin
m_nNextHitTime:=500;
m_nWalkSpeed:=400;
end else begin
bo55D:=False;
m_nNextHitTime:=dw56C;
m_nWalkSpeed:=dw570;
end;
end;
end;
inherited;
end;
/// 铁血魔王
constructor Ttiexueking.Create;//004AA160
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
m_nViewRange:=8;
m_boStoneMode:=True;
m_nCharStatusEx:=STATE_STONE_MODE;
m_btDirection:=5;
m_nDangerLevel:=5;
m_SlaveObjectList:=TList.Create;
dw558:=GetTickCount();
m_boBOSS:=true;
end;
destructor Ttiexueking.Destroy;
begin
m_SlaveObjectList.Free;
inherited;
end;
procedure Ttiexueking.MeltStone; //004AB208
var
Event:TEvent;
begin
m_nCharStatusEx:=0;
m_nCharStatus:=GetCharStatus();
// SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
m_boStoneMode:=False;
// Event:=TEvent.Create(m_PEnvir,m_nCurrX,m_nCurrY,6,5 * 60 * 1000,True);
// Event.m_nEventParam :=2; //hint
// g_EventManager.AddEvent(Event);
end;
procedure Ttiexueking.CallSlave; //004AB29C
var
I: Integer;
nC:Integer;
n10,n14:Integer;
//sMonName:array[0..3] of String;
BaseObject:TBaseObject;
begin
nC:=Random(2) + 2;
GetFrontPosition(n10,n14);
{
sMonName[0]:=sZuma1;
sMonName[1]:=sZuma2;
sMonName[2]:=sZuma3;
sMonName[3]:=sZuma4;
}
for I := 1 to nC do begin
if m_SlaveObjectList.Count >= 4 then break;
BaseObject:=UserEngine.RegenMonsterByName(m_sMapName,n10,n14,'炎魔'); // g_Config.sZuma[Random(4)]
if BaseObject <> nil then begin
//BaseObject.m_Master:=Self;
//BaseObject.m_dwMasterRoyaltyTick:=GetTickCount + 24 * 60 * 60 * 1000;
m_SlaveObjectList.Add(BaseObject);
end;
end; // for
end;
procedure Ttiexueking.Attack(TargeTBaseObject: TBaseObject; nDir: Integer); //004AA1F0
var
WAbil:pTAbility;
nPower:integer;
dechp,n,nHTime:integer;
FireBurnEvent:TFireBurnEvent;
Range,
nStartX,
nEndX,
nStartY ,
nEndY,nx,ny: integer;
begin
WAbil:=@m_WAbil;
nPower:=GetAttackPower(LoWord(WAbil.DC),SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
dechp:=wabil.MaxHP- wabil.hp;
n:= dechp div 1000 ;
case n of
0..1:tiexueHitAttackTarget(TargeTBaseObject,nPower div 2,nPower div 2,True,0);
2..4:tiexueHitwideTarget(TargeTBaseObject,nPower div 2,nPower div 2,True,2);
5..6:tiexueHitALLTarget(TargeTBaseObject,nPower div 2,nPower div 2,True,4)
else begin
tiexueHitALLTarget(TargeTBaseObject,nPower div 2,nPower div 2,True,4);
end
end; //case
if random(8)<4 then begin
Range:=4;
nStartX :=m_nCurrX - Range;
nEndX :=m_nCurrX + Range;
nStartY :=m_nCurrY - Range;
nEndY :=m_nCurrY + Range;
for nx:= nStartX to nEndX do begin
for ny:= nStartY to nEndY do begin
nHTime:= random(5)+5;
if m_PEnvir.GetEvent(nx,ny) = nil then begin
FireBurnEvent:=TFireBurnEvent.Create(self,nx,ny,21,nHTime * 1000 ,nPower div 2);
g_EventManager.AddEvent(FireBurnEvent);
end; //0492CFC x
end; //for
end; //for
end; // random(10)<2
// end; //else
end;
procedure Ttiexueking.run; //004AA1F0
var
I: Integer;
n8,nC,n10:Integer;
BaseObject:TBaseObject;
WAbil:pTAbility;
begin
if (not m_boGhost) and
(not m_boDeath) and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) and
(Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed) then begin
n10:=0;
////
if ((GetTickCount - dw558) > 10 * 1000) then begin
WAbil:=@m_WAbil;
dw558:=GetTickCount();
{ if (m_TargetCret <> nil) and (WAbil.HP<2000) then begin // and (sub_4C3538 >= 5)
m_TargetCret.GetBackPosition(n8,nC);
if m_PEnvir.CanWalk(n8,nC,False) then begin
SpaceMove(m_PEnvir.sMapName,n8,nC,0);
exit;
end;
n8:= n8+random(5)+2 ;
nC:= nC+random(5)+2 ;
if m_PEnvir.CanWalk(n8,nc,False) then begin
SpaceMove(m_PEnvir.sMapName,n8,nC,0);
exit;
end;
// MapRandomMove(m_PEnvir.sMapName,0);
// exit;
end; }
end;
////
if m_boStoneMode then begin
//MeltStone();//测试用
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 not BaseObject.m_boHideMode or m_boCoolEye then begin
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 2) and (
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -