📄 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;
TAXEHIDEMonster = class(TAnimalObject)
n54C :Integer;
bo550 :Boolean;
n554 :Integer;
n558 :Integer;
private
procedure FlyAxeAttack(Target: TBaseObject);
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;
Tmontishen = class(TAnimalObject)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TSeeBeeQueen = 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;
///
Tbigheatmovemonster = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
function AttackTarget():Boolean;virtual;
procedure Run;override;
end;
Tbigheatmonsteraxe = class(TAnimalObject) //固定位置全屏幕攻击 +麻痹
private
procedure FlyAxeAttack(Target: TBaseObject);
public
constructor Create();override;
destructor Destroy; override;
function AttackTarget():Boolean;virtual;
procedure Run;override;
end;
///
Tbigearmonsteraxe = class(TAnimalObject) //固定位置全屏幕攻击 +麻痹
private
procedure FlyAxeAttack(Target: TBaseObject);
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;
{
TVisibleBaseObject=RECORD
BaseObject:TBaseObject;
END;
pTVisibleBaseObject=^TVisibleBaseObject ;
}
implementation
uses M2Share, HUtil32, Castle, Guild;
// var m_wStatusTimeArr:ARRAY[0..8479] of integer;
{ 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
// m_VisibleActors.Items[I].
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) < 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] = 0) then begin {5 0x6A }
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;
//// TAXEHIDEMonster
procedure TAXEHIDEMonster.FlyAxeAttack(Target:TBaseObject);
var
WAbil:pTAbility;
nDamage:Integer;
begin
if m_PEnvir.CanFly(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY) then begin // true
m_btDirection:=GetNextDirection(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY);
WAbil:=@m_WAbil;
nDamage:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
if nDamage > 0 then begin
nDamage:=Target.GetHitStruckDamage(Self,nDamage);
end;
if nDamage > 0 then begin
Target.StruckDamage(nDamage);
Target.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,Target.m_WAbil.HP,Target.m_WAbil.MaxHP,Integer(Self),'',
_MAX(abs(m_nCurrX - Target.m_nCurrX),abs(m_nCurrY - Target.m_nCurrY)) * 50 + 600);
end;
SendRefMsg(RM_FLYAXE,m_btDirection,m_nCurrX,m_nCurrY,Integer(Target),'ear');
end;
end;
constructor TAXEHIDEMonster.Create;//004A51C0
begin
inherited;
bo550:=False;
m_nViewRange:=11;
m_nRunTime:=250;
m_dwSearchTime:=Random(1500) + 1500;
m_dwSearchTick:=GetTickCount();
m_btRaceServer:=205;
n554:=7;
n558:=7;
m_boFixedHideMode:=True;
m_boStickMode:=True;
m_boAnimal:=false;
m_boBOSS:=true;
end;
destructor TAXEHIDEMonster.Destroy;//004A5290
begin
inherited;
end;
function TAXEHIDEMonster.AttackTarget: Boolean;
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret = nil then exit;
if true then begin // GetAttackDir(m_TargetCret,btDir)
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
m_dwTargetFocusTick:=GetTickCount();
// Attack(m_TargetCret,btDir);
FlyAxeAttack(m_TargetCret);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -