📄 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -