📄 objmon2.pas
字号:
unit ObjMon2;
interface
uses
Windows, Classes, Grobal2, ObjBase, ObjMon;
type
TStickMonster = class(TAnimalObject)
n54C: Integer;
bo550: Boolean;
n554: Integer;
n558: Integer;
private
public
constructor Create(); override;
destructor Destroy; override;
function AttackTarget(): Boolean; virtual;
procedure sub_FFEA; virtual;
procedure sub_FFE9; virtual;
procedure VisbleActors; virtual; //FFE8
function Operate(ProcessMsg: pTProcessMessage): Boolean; override; //FFFC
procedure Run; override;
end;
TBeeQueen = class(TAnimalObject)
n54C: Integer;
BBList: TList;
private
procedure MakeChildBee;
public
constructor Create(); override;
destructor Destroy; override;
function Operate(ProcessMsg: pTProcessMessage): Boolean; override; //FFFC
procedure Run; override;
end;
TCentipedeKingMonster = class(TStickMonster)
m_dwAttickTick: LongWord; //0x560
private
function sub_4A5B0C: Boolean;
public
constructor Create(); override;
destructor Destroy; override;
function AttackTarget(): Boolean; override;
procedure sub_FFE9; override;
procedure Run; override;
end;
TBigHeartMonster = class(TAnimalObject)
private
public
constructor Create(); override;
destructor Destroy; override;
function AttackTarget(): Boolean; virtual;
procedure Run; override;
end;
TSpiderHouseMonster = class(TAnimalObject)
n54C: Integer;
BBList: TList;
private
procedure GenBB;
public
constructor Create(); override;
destructor Destroy; override;
function Operate(ProcessMsg: pTProcessMessage): Boolean; override; //FFFC
procedure Run; override;
end;
TExplosionSpider = class(TMonster)
dw558: LongWord;
private
procedure sub_4A65C4;
public
constructor Create(); override;
destructor Destroy; override;
procedure Run; override;
function AttackTarget(): Boolean; override; //FFEB
end;
TGuardUnit = class(TAnimalObject)
dw54C: LongWord; //0x54C
m_nX550: Integer; //0x550
m_nY554: Integer; //0x554
m_nDirection: Integer; //0x558
public
function IsProperTarget(BaseObject: TBaseObject): Boolean; override; //FFF4
procedure Struck(hiter: TBaseObject); override; //FFEC
end;
TArcherGuard = class(TGuardUnit)
private
procedure sub_4A6B30(TargeTBaseObject: TBaseObject);
public
constructor Create(); override;
destructor Destroy; override;
procedure Run; override;
end;
TArcherPolice = class(TArcherGuard)
private
public
constructor Create(); override;
destructor Destroy; override;
end;
TCastleDoor = class(TGuardUnit)
dw55C: LongWord; //0x55C
dw560: LongWord; //0x560
m_boOpened: Boolean; //0x564
bo565n: Boolean; //0x565
bo566n: Boolean; //0x566
bo567n: Boolean; //0x567
private
procedure SetMapXYFlag(nFlag: Integer);
public
constructor Create(); override;
destructor Destroy; override;
procedure Die; override;
procedure Run; override;
procedure Initialize(); override;
procedure Close;
procedure Open;
procedure RefStatus;
end;
TWallStructure = class(TGuardUnit)
n55C: Integer;
dw560: LongWord;
boSetMapFlaged: Boolean;
private
public
constructor Create(); override;
destructor Destroy; override;
procedure Initialize; override;
procedure Die; override;
procedure Run; override;
procedure RefStatus;
end;
TSoccerBall = class(TAnimalObject)
n548: Integer;
n54C: Integer;
n550: Integer;
private
public
constructor Create(); override;
destructor Destroy; override;
procedure Struck(hiter: TBaseObject); virtual; //FFEC
procedure Run; override;
end;
implementation
uses M2Share, HUtil32, Castle, Guild;
{ TStickMonster }
constructor TStickMonster.Create; //004A51C0
begin
inherited;
bo550 := False;
m_nViewRange := 7;
m_nRunTime := 250;
m_dwSearchTime := Random(1500) + 2500;
m_dwSearchTick := GetTickCount();
m_btRaceServer := 85;
n554 := 4;
n558 := 4;
m_boFixedHideMode := True;
m_boStickMode := True;
m_boAnimal := True;
end;
destructor TStickMonster.Destroy; //004A5290
begin
inherited;
end;
function TStickMonster.AttackTarget: Boolean;
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();
Attack(m_TargetCret, btDir);
end;
Result := True;
Exit;
end;
if m_TargetCret.m_PEnvir = m_PEnvir then begin
SetTargetXY(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY); {0FFF0h}
end else begin
DelTargetCreat(); {0FFF1h}
end;
end;
procedure TStickMonster.sub_FFE9();
begin
m_boFixedHideMode := False;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;
procedure TStickMonster.VisbleActors(); //004A53E4
var
I: Integer;
resourcestring
sExceptionMsg = '[Exception] TStickMonster::VisbleActors Dispose';
begin
SendRefMsg(RM_DIGDOWN, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
try
for I := 0 to m_VisibleActors.Count - 1 do begin
Dispose({pTVisibleBaseObject}(m_VisibleActors.Items[I]));
end;
m_VisibleActors.Clear;
except
MainOutMessage(sExceptionMsg);
end;
m_boFixedHideMode := True;
end;
procedure TStickMonster.sub_FFEA(); //004A53E4
var
I: Integer;
BaseObject: TBaseObject;
begin
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject = nil then Continue;
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) < n554) and (abs(m_nCurrY - BaseObject.m_nCurrY) < n554) then begin
sub_FFE9();
Break;
end;
end;
end;
end; // for
end;
function TStickMonster.Operate(ProcessMsg: pTProcessMessage): Boolean;
begin
Result := inherited Operate(ProcessMsg);
end;
procedure TStickMonster.Run; //004A5614
var
bo05: Boolean;
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then begin
if Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed then begin
m_dwWalkTick := GetTickCount();
if m_boFixedHideMode then begin
sub_FFEA();
end else begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
SearchTarget();
end;
bo05 := False;
if m_TargetCret <> nil then begin
if (abs(m_TargetCret.m_nCurrX - m_nCurrX) > n558) or
(abs(m_TargetCret.m_nCurrY - m_nCurrY) > n558) then begin
bo05 := True;
end;
end else bo05 := True;
if bo05 then begin
VisbleActors();
end else begin
if AttackTarget then begin
inherited;
Exit;
end;
end;
end;
end;
end;
inherited;
end;
{ TSoccerBall }
constructor TSoccerBall.Create; //004A764C
begin
inherited;
m_boAnimal := False;
m_boSuperMan := True;
n550 := 0;
m_nTargetX := -1;
end;
destructor TSoccerBall.Destroy;
begin
inherited;
end;
procedure TSoccerBall.Run;
var
n08, n0C: Integer;
bo0D: Boolean;
begin
if n550 > 0 then begin
if m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, m_btDirection, 1, n08, n0C) then begin
if m_PEnvir.CanWalk(n08, n0C, bo0D) then begin
case m_btDirection of //
0: m_btDirection := 4;
1: m_btDirection := 7;
2: m_btDirection := 6;
3: m_btDirection := 5;
4: m_btDirection := 0;
5: m_btDirection := 3;
6: m_btDirection := 2;
7: m_btDirection := 1;
end; // case
m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, m_btDirection, n550, m_nTargetX, m_nTargetY)
end;
end;
end else begin //004A78A1
m_nTargetX := -1;
end;
if m_nTargetX <> -1 then begin
GotoTargetXY();
if (m_nTargetX = m_nCurrX) and (m_nTargetY = m_nCurrY) then
n550 := 0;
end;
inherited;
end;
procedure TSoccerBall.Struck(hiter: TBaseObject);
begin
if hiter = nil then Exit;
m_btDirection := hiter.m_btDirection;
n550 := Random(4) + (n550 + 4);
n550 := _MIN(20, n550);
m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, m_btDirection, n550, m_nTargetX, m_nTargetY);
end;
{ TBeeQueen }
constructor TBeeQueen.Create; //004A5750
begin
inherited;
m_nViewRange := 9;
m_nRunTime := 250;
m_dwSearchTime := Random(1500) + 2500;
m_dwSearchTick := GetTickCount();
m_boStickMode := True;
BBList := TList.Create;
end;
destructor TBeeQueen.Destroy; //004A57F0
begin
BBList.Free;
inherited;
end;
procedure TBeeQueen.MakeChildBee;
begin
if BBList.Count >= 15 then Exit;
SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
SendDelayMsg(Self, RM_ZEN_BEE, 0, 0, 0, 0, '', 500);
end;
function TBeeQueen.Operate(ProcessMsg: pTProcessMessage): Boolean;
var
BB: TBaseObject;
begin
if ProcessMsg.wIdent = RM_ZEN_BEE then begin
BB := UserEngine.RegenMonsterByName(m_PEnvir.sMapName, m_nCurrX, m_nCurrY, g_Config.sBee);
if BB <> nil then begin
BB.SetTargetCreat(m_TargetCret);
BBList.Add(BB);
end;
end;
Result := inherited Operate(ProcessMsg);
end;
procedure TBeeQueen.Run;
var
I: Integer;
BB: TBaseObject;
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then begin
if Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed then begin
m_dwWalkTick := GetTickCount();
if Integer(GetTickCount - m_dwHitTick) >= m_nNextHitTime then begin
m_dwHitTick := GetTickCount();
SearchTarget();
if m_TargetCret <> nil then MakeChildBee();
end;
for I := BBList.Count - 1 downto 0 do begin
BB := TBaseObject(BBList.Items[I]);
if (BB <> nil) and (BB.m_boDeath) or (BB.m_boGhost) then BBList.Delete(I);
end;
end;
end;
inherited;
end;
{ TCentipedeKingMonster }
constructor TCentipedeKingMonster.Create; //004A5A8C
begin
inherited;
m_nViewRange := 6;
n554 := 4;
n558 := 6;
m_boAnimal := False;
m_dwAttickTick := GetTickCount();
end;
destructor TCentipedeKingMonster.Destroy;
begin
inherited;
end;
function TCentipedeKingMonster.sub_4A5B0C: Boolean;
var
I: Integer;
BaseObject: TBaseObject;
begin
Result := False;
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject = nil then Continue;
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
Result := True;
Break;
end;
end;
end;
end;
function TCentipedeKingMonster.AttackTarget: Boolean; //004A5BC0
var
WAbil: pTAbility;
nPower, I: Integer;
BaseObject: TBaseObject;
begin
Result := False;
if not sub_4A5B0C then begin
Exit;
end;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick := GetTickCount();
SendAttackMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY);
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 = nil then Continue;
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
m_dwTargetFocusTick := GetTickCount();
SendDelayMsg(Self, RM_DELAYMAGIC, nPower, MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 2, Integer(BaseObject), '', 600);
if Random(4) = 0 then begin
if Random(3) <> 0 then begin
BaseObject.MakePosion(POISON_DECHEALTH, 60, 3);
end else begin
BaseObject.MakePosion(POISON_STONE, 5, 0);
end;
m_TargetCret := BaseObject;
end;
end;
end;
end; // for
end;
Result := True;
end;
procedure TCentipedeKingMonster.sub_FFE9;
begin
inherited;
m_WAbil.HP := m_WAbil.MaxHP;
end;
procedure TCentipedeKingMonster.Run;
var
I: Integer;
BaseObject: TBaseObject;
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then begin
if Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed then begin
m_dwWalkTick := GetTickCount();
if m_boFixedHideMode then begin
if (GetTickCount - m_dwAttickTick) > 10000 then begin
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject = nil then Continue;
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) < n554) and (abs(m_nCurrY - BaseObject.m_nCurrY) < n554) then begin
sub_FFE9();
m_dwAttickTick := GetTickCount();
Break;
end;
end;
end;
end;
end; //004A5F86
end else begin
if (GetTickCount - m_dwAttickTick) > 3000 then begin
if AttackTarget() then begin
inherited;
Exit;
end;
if (GetTickCount - m_dwAttickTick) > 10000 then begin
VisbleActors();
m_dwAttickTick := GetTickCount();
end;
end;
end;
end;
end;
inherited;
end;
{ TBigHeartMonster }
constructor TBigHeartMonster.Create;
begin
inherited;
m_nViewRange := 16;
m_boAnimal := False;
end;
destructor TBigHeartMonster.Destroy;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -