📄 objmon3.pas
字号:
unit ObjMon3;
interface
uses
Windows,Classes,Grobal2,ObjBase,ObjMon,ObjMon2;
type
TRonObject=class(TMonster)
public
constructor Create();override;
destructor Destroy; override;
procedure AroundAttack;
procedure Run; override;
end;
TMinorNumaObject=class(TATMonster)
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TSandMobObject=class(TStickMonster)
private
m_dwAppearStart:LongWord;
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TRockManObject=class(TATMonster)
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TMagicMonObject = class(TMonster)
private
m_boUseMagic:Boolean;
procedure LightingAttack(nDir:Integer);
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TBoneKingMonster = class(TMonster)
private
m_nDangerLevel :Integer;
m_SlaveObjectList :TList;//0x55C
procedure CallSlave;
public
constructor Create();override;
destructor Destroy; override;
procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer);override; //0FFED
procedure Run;override;
end;
TPercentMonster = class(TAnimalObject)
n54C :Integer;
m_dwThinkTick :LongWord;
bo554 :Boolean;
m_boDupMode :Boolean;
private
function Think: Boolean;
function MakeClone(sMonName:String;OldMon:TBaseObject):TBaseObject;
public
constructor Create();override;
destructor Destroy; override;
function Operate(ProcessMsg:pTProcessMessage):Boolean; override;
function AttackTarget():Boolean; virtual;
procedure Run; override;
end;
TMagicMonster = class(TAnimalObject)
n54C :Integer;
m_dwThinkTick :LongWord;
m_dwSpellTick :LongWord;
bo554 :Boolean;
m_boDupMode :Boolean;
private
function Think: Boolean;
function MakeClone(sMonName:String;OldMon:TBaseObject):TBaseObject;
public
constructor Create();override;
destructor Destroy; override;
function Operate(ProcessMsg:pTProcessMessage):Boolean; override;
function AttackTarget():Boolean; virtual;
procedure Run; override;
end;
TFireballMonster = class(TMagicMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TFireMonster = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TFrostTiger = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TGreenMonster = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TRedMonster = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TKhazard = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TRunAway = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TTeleMonster = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TDefendMonster = class(TMonster)
private
m_GuardObjects :TList;
procedure CallGuard(mapmap:string; xx,yy:integer);
public
callguardrun:boolean;
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TClone = class(TMonster)
private
procedure LightingAttack(nDir:Integer);
public
constructor Create();override;
function Operate(ProcessMsg:pTProcessMessage):boolean; override;
procedure Struck(hiter: TBaseObject);virtual;
destructor Destroy; override;
procedure Run;override;
end;
implementation
uses
UsrEngn, M2Share, Event, SysUtils;
constructor TRonObject.Create;
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
end;
destructor TRonObject.Destroy;
begin
inherited;
end;
procedure TRonObject.AroundAttack;
var
xTargetList:TList;
BaseObject:TBaseObject;
wHitMode:Word;
i:Integer;
begin
wHitMode:=0;
GetAttackDir(m_TargetCret,m_btDirection);
xTargetList := TList.Create;
GetMapBaseObjects(m_PEnvir,m_nCurrX,m_nCurrY,1,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
_Attack(wHitMode,BaseObject); //CM_HIT
xTargetList.Delete(i);
end;
end;
end;
xTargetList.Free;
SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
end;
procedure TRonObject.Run;
begin
if (not m_boDeath) and (not m_boGhost) and (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
m_dwSearchEnemyTick:=GetTickCount();
SearchTarget();
end;
if (m_TargetCret <> nil) and
(abs(m_nCurrX - m_TargetCret.m_nCurrX) < 6) and
(abs(m_nCurrY - m_TargetCret.m_nCurrY) < 6) and
(Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime) then begin
m_dwHitTick:=GetTickCount();
AroundAttack;
end;
end;
inherited;
end;
constructor TMinorNumaObject.Create;
begin
inherited;
end;
destructor TMinorNumaObject.Destroy;
begin
inherited;
end;
procedure TMinorNumaObject.Run;
begin
if (not m_boDeath) then begin
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
m_dwSearchEnemyTick:=GetTickCount();
SearchTarget();
end;
end;
inherited;
end;
constructor TSandMobObject.Create;
begin
inherited;
//m_boHideMode := TRUE;
nComeOutValue := 8;
end;
destructor TSandMobObject.Destroy;
begin
inherited;
end;
procedure TSandMobObject.Run;
begin
if (not m_boDeath) and (not m_boGhost) then begin
if (Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) then begin
m_dwWalkTick := GetTickCount;
if (m_boFixedHideMode) then begin
if (((m_WAbil.HP > (m_WAbil.MaxHP / 20)) and CheckComeOut())) then
m_dwAppearStart := GetTickCount;
end else begin
if ((m_WAbil.HP > 0) and (m_WAbil.HP < (m_WAbil.MaxHP / 20)) and (GetTickCount - m_dwAppearStart > 3000)) then
ComeDown
else if (m_TargetCret<>nil) then begin
if (abs(m_nCurrX - m_TargetCret.m_nCurrX) > 15) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) > 15) then begin
ComeDown;
exit;
end;
end;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
SearchTarget();
if (not m_boFixedHideMode) then begin
if (AttackTarget) then
inherited;
end;
end;
end;
end;
inherited;
end;
constructor TRockManObject.Create;
begin
inherited;
//m_dwSearchTick := 2500 + Random(1500);
//m_dwSearchTime := GetTickCount();
m_boHideMode := TRUE;
end;
destructor TRockManObject.Destroy;
begin
inherited;
end;
procedure TRockManObject.Run;
begin
{if (not m_fIsDead) and (not m_fIsGhost) then begin
if (m_fHideMode) then begin
if (CheckComeOut(8)) then
ComeOut;
m_dwWalkTime := GetTickCount + 1000;
end else begin
if ((GetTickCount - m_dwSearchEnemyTime > 8000) or ((GetTickCount - m_dwSearchEnemyTime > 1000) and (m_pTargetObject=nil))) then begin
m_dwSearchEnemyTime := GetTickCount;
MonsterNormalAttack;
if (m_pTargetObject=nil) then
ComeDown;
end;
end;
end;}
inherited;
end;
{ TMagicMonObject }
constructor TMagicMonObject.Create;
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
m_boUseMagic:=False;
end;
destructor TMagicMonObject.Destroy;
begin
inherited;
end;
procedure TMagicMonObject.LightingAttack(nDir: Integer);
begin
end;
procedure TMagicMonObject.Run;
var
nAttackDir:Integer;
nX,nY:Integer;
begin
if (not m_boDeath) and
(not bo554) and
(not m_boGhost) and
(m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) 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_Master = nil then exit;
nX:=abs(m_nCurrX - m_Master.m_nCurrX);
nY:=abs(m_nCurrY - m_Master.m_nCurrY);
if (nX <= 5) and (nY <= 5) then begin
if m_boUseMagic or ((nX = 5) or (nY = 5)) then begin
if (Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime) then begin
m_dwHitTick:=GetTickCount();
nAttackDir:=GetNextDirection(m_nCurrX,m_nCurrY,m_Master.m_nCurrX,m_Master.m_nCurrY);
LightingAttack(nAttackDir);
end;
end;
end;
end;
inherited Run;
end;
{ TBoneKingMonster }
constructor TBoneKingMonster.Create;
begin
inherited;
m_dwSearchTime:=Random(1500) + 1500;
m_nViewRange:=8;
m_btDirection:=5;
m_nDangerLevel:=5;
m_SlaveObjectList:=TList.Create;
end;
destructor TBoneKingMonster.Destroy;
begin
m_SlaveObjectList.Free;
inherited;
end;
procedure TBoneKingMonster.CallSlave;
const
sMonName:array[0..2] of String = ('BoneCaptain', 'BoneArcher', 'BoneSpearman');
var
I: Integer;
nC:Integer;
n10,n14:Integer;
BaseObject:TBaseObject;
begin
nC:=Random(6) + 6;
GetFrontPosition(n10,n14);
for I := 1 to nC do begin
if m_SlaveObjectList.Count >= 30 then break;
BaseObject:=UserEngine.RegenMonsterByName(m_sMapName,n10,n14,sMonName[Random(3)]);
if BaseObject <> nil then begin
m_SlaveObjectList.Add(BaseObject);
end;
end; // for
end;
procedure TBoneKingMonster.Attack(TargeTBaseObject: TBaseObject;nDir: Integer);
var
WAbil:pTAbility;
nPower:Integer;
begin
WAbil:=@m_WAbil;
nPower:=GetAttackPower(LoWord(WAbil.DC),SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
HitMagAttackTarget(TargeTBaseObject,0,nPower,True);
end;
procedure TBoneKingMonster.Run;
var
I: Integer;
n10:Integer;
BaseObject:TBaseObject;
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 - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
m_dwSearchEnemyTick:=GetTickCount();
SearchTarget();
if (m_nDangerLevel > m_WAbil.HP / m_WAbil.MaxHP * 5) and (m_nDangerLevel > 0) then begin
Dec(m_nDangerLevel);
CallSlave();
end;
if m_WAbil.HP = m_WAbil.MaxHP then
m_nDangerLevel:=5;
end;
for I := m_SlaveObjectList.Count - 1 downto 0 do begin
BaseObject:=TBaseObject(m_SlaveObjectList.Items[I]);
if BaseObject.m_boDeath or BaseObject.m_boGhost then
m_SlaveObjectList.Delete(I);
end; // for
end;
inherited;
end;
constructor TPercentMonster.Create;
begin
inherited;
m_boDupMode:=False;
bo554:=False;
m_dwThinkTick:=GetTickCount();
m_nViewRange:=5;
m_nRunTime:=250;
m_dwSearchTime:=3000 + Random(2000);
m_dwSearchTick:=GetTickCount();
m_btRaceServer:=80;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -