📄 objmon.pas
字号:
unit ObjMon;
interface
uses
svn, Windows,Classes,HUtil32,Grobal2,ObjBase;
type
TMonster = class(TAnimalObject)
n54C :Integer; //0x54C
m_dwThinkTick :LongWord; //0x550
bo554 :Boolean; //0x554
m_boDupMode :Boolean; //0x555
m_boApproach :Boolean; //wether or not a mob should go near his target or not
private
function Think: Boolean;
function MakeClone(sMonName:String;OldMon:TBaseObject):TBaseObject;
public
constructor Create();override;
destructor Destroy; override;
{procedure ComeOut;
procedure ComeDown;
function CheckComeOut(nValue:Integer):Boolean;}
function Operate(ProcessMsg:pTProcessMessage):Boolean; override;//FFFC
function AttackTarget():Boolean; virtual; //FFEB
procedure Run; override;
end;
TChickenDeer = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TATMonster = class(TMonster)
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run; override;
end;
TSlowATMonster = class(TATMonster)
private
public
constructor Create();override;
destructor Destroy; override;
end;
TScorpion = class(TATMonster)
private
public
constructor Create();override;
destructor Destroy; override;
end;
TSpitSpider = class(TATMonster)
m_boUsePoison :Boolean;
private
procedure SpitAttack(btDir:Byte);
public
constructor Create();override;
destructor Destroy; override;
function AttackTarget():Boolean; override;
end;
THighRiskSpider = class(TSpitSpider)
private
public
constructor Create();override;
destructor Destroy; override;
end;
TBigPoisionSpider = class(TSpitSpider)
private
public
constructor Create();override;
destructor Destroy; override;
end;
TGasAttackMonster = class(TATMonster)
private
public
constructor Create();override;
destructor Destroy; override;
function AttackTarget:Boolean;override;
function sub_4A9C78(bt05:Byte):TBaseObject;virtual;//FFEA
end;
TCowMonster = class(TATMonster)
private
public
constructor Create();override;
destructor Destroy; override;
end;
TMagCowMonster = class(TATMonster)
private
procedure sub_4A9F6C(btDir:Byte);
public
constructor Create();override;
destructor Destroy; override;
function AttackTarget:Boolean;override;
end;
TCowKingMonster = class(TATMonster)
dw558 :LongWord;
bo55C :Boolean;
bo55D :Boolean;
n560 :integer;
dw564 :LongWord;
dw568 :LongWord;
dw56C :LongWord;
dw570 :LongWord;
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer);override;
procedure Initialize();override;
end;
TElectronicScolpionMon = class(TMonster)
private
m_boUseMagic:Boolean;
procedure LightingAttack(nDir:Integer);
public
constructor Create();override;
destructor Destroy; override;
function MagCanHitTarget(nX, nY:Integer;TargeTBaseObject: TBaseObject): Boolean;override;
procedure Run;override;
end;
TCrystalSpider = class (TElectronicScolpionMon)
private
public
function AttackTarget():Boolean; override;//FFEB
constructor Create();override;
destructor Destroy; override;
end;
TLightingZombi = class(TMonster)
private
procedure LightingAttack(nDir:Integer);
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TDigOutZombi = class(TMonster)
private
procedure sub_4AA8DC;
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TZilKinZombi = class(TATMonster)
dw558 :LongWord;
nZilKillCount :Integer;
dw560 :LongWord;
private
public
constructor Create();override;
destructor Destroy; override;
procedure Die;override;
procedure Run;override;
end;
TWhiteSkeleton = class(TATMonster)
private
m_boIsFirst :Boolean; //0x7A0
procedure Reset; //0x00509C88
public
constructor Create();override; //0x00509C08
destructor Destroy; override;
procedure RecalcAbilitys();override; //0x00509C74
procedure Run;override; //0x00509CE8
end;
TScultureMonster = class(TMonster)
private
procedure MeltStone;//
procedure MeltStoneAll;
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TScultureKingMonster = class(TMonster)
private
m_nDangerLevel :Integer;
m_SlaveObjectList :TList;//0x55C
procedure MeltStone;
procedure CallSlave;
public
constructor Create();override;
destructor Destroy; override;
procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer);override; //0FFED
procedure Run;override;
end;
TGasMothMonster = class(TGasAttackMonster) //楔蛾
private
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
function sub_4A9C78(bt05:Byte):TBaseObject;override;//FFEA
end;
TGasDungMonster = class(TGasAttackMonster)
private
public
constructor Create();override;
destructor Destroy; override;
end;
TElfMonster = class(TMonster)
private
boIsFirst :Boolean; //0x7A0
procedure AppearNow;
procedure ResetElfMon;
public
constructor Create();override;
destructor Destroy; override;
procedure RecalcAbilitys(); override;
procedure Run; override;
end;
TElfWarriorMonster = class(TSpitSpider)
private
boIsFirst :Boolean; //0x560
dwDigDownTick:LongWord; //0x564
procedure AppearNow;
procedure ResetElfMon;
public
constructor Create();override;
destructor Destroy; override;
procedure RecalcAbilitys(); override;
procedure Run; override;
end;
TDoubleCriticalMonster = class(TATMonster)
private
m_n7A0 :Integer;
public
constructor Create();override; //0x0050ACB4
destructor Destroy; override;
procedure Run; override; //0x0050AD00
procedure Attack(Target:TBaseObject; nDir:Integer);override; //0x0050AE74
end;
TDDevil = class(TMonster)
m_dwSpellTick :LongWord;
private
m_boUseMagic:Boolean;
procedure LightingAttack(nDir:Integer);
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TRedThunderZuma = class(TScultureMonster)
m_dwSpellTick : LongWord;
private
procedure MagicAttack();
public
constructor Create();override;
destructor Destroy; override;
procedure Run;override;
end;
TStoneMonster = class(TMonster)
public
constructor Create(); override;
destructor Destroy; override;
procedure Run; override;
end;
implementation
uses
UsrEngn, M2Share, Event;
{ TMonster }
constructor TMonster.Create; //004A8B74
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_boApproach:=TRUE;
end;
destructor TMonster.Destroy; //004A8C24
begin
inherited;
end;
function TMonster.MakeClone(sMonName: String;OldMon:TBaseObject): TBaseObject; //004A8C58
var
ElfMon:TBaseObject;
begin
Result:=nil;
ElfMon:=UserEngine.RegenMonsterByName(m_PEnvir.sMapName,m_nCurrX,m_nCurrY,sMonName);
if ElfMon <> nil then begin
ElfMon.m_Master:=OldMon.m_Master;
ElfMon.m_dwMasterRoyaltyTick:=OldMon.m_dwMasterRoyaltyTick;
ElfMon.m_btSlaveMakeLevel:=OldMon.m_btSlaveMakeLevel;
ElfMon.m_btSlaveExpLevel:=OldMon.m_btSlaveExpLevel;
ElfMon.RecalcAbilitys;
ElfMon.RefNameColor;
if OldMon.m_Master <> nil then
OldMon.m_Master.m_SlaveList.Add(ElfMon);
ElfMon.m_WAbil:=OldMon.m_WAbil;
ElfMon.m_wStatusTimeArr:=OldMon.m_wStatusTimeArr;
ElfMon.m_TargetCret:=OldMon.m_TargetCret;
ElfMon.m_dwTargetFocusTick:=OldMon.m_dwTargetFocusTick;
ElfMon.m_LastHiter:=OldMon.m_LastHiter;
ElfMon.m_LastHiterTick:=OldMon.m_LastHiterTick;
ElfMon.m_btDirection:=OldMon.m_btDirection;
Result:=ElfMon;
end;
end;
(*procedure TMonster.ComeOut;
begin
m_boHideMode := FALSE;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;
procedure TMonster.ComeDown;
var
i:Integer;
pVisibleObject:pTVisibleBaseObject;
begin
SendRefMsg(RM_DIGDOWN, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
for i := 0 to m_VisibleActors.Count - 1 do begin
pVisibleObject:=pTVisibleBaseObject(m_VisibleActors.Items[i]);
if (pVisibleObject <> nil) then
end;
CVisibleObject* pVisibleObject;
if (m_xVisibleObjectList.GetCount())
{
PLISTNODE pListNode = m_xVisibleObjectList.GetHead();
while (pListNode)
{
if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
{
delete pVisibleObject;
pVisibleObject = NULL;
}
pListNode = m_xVisibleObjectList.RemoveNode(pListNode);
} // while (pListNode)
}
m_boHideMode := TRUE;
end;
function TMonster.CheckComeOut(nValue:Integer):Boolean;
var
i:Integer;
BaseObject:TBaseObject;
begin
Result := FALSE;
for i := 0 to m_VisibleActors.Count - 1 do begin
BaseObject:=pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject;
if (not BaseObject.m_boDeath) and IsProperTarget(BaseObject) and (not BaseObject.m_boObMode) then begin
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= nValue) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= nValue) then begin
Result := TRUE;
Exit;
end;
end;
end;
end;*)
function TMonster.Operate(ProcessMsg: pTProcessMessage):Boolean;
begin
Result:=inherited Operate(ProcessMsg);
end;
function TMonster.Think():Boolean; //004A8E54
var
nOldX,nOldY:integer;
begin
Result:=False;
if (GetTickCount - m_dwThinkTick) > 3 * 1000 then begin
m_dwThinkTick:=GetTickCount();
if m_PEnvir.GetXYObjCount(m_nCurrX,m_nCurrY) >= 2 then m_boDupMode:=True;
if not IsProperTarget{FFFF4}(m_TargetCret) then m_TargetCret:=nil;
end; //004A8ED2
if m_boDupMode then begin
nOldX:=m_nCurrX;
nOldY:=m_nCurrY;
WalkTo(Random(8),False);
if (nOldX <> m_nCurrX) or (nOldY <> m_nCurrY) then begin
m_boDupMode:=False;
Result:=True;
end;
end;
end;
function TMonster.AttackTarget():Boolean; //004A8F34
var
btDir:Byte;
begin
Result:=False;
if m_TargetCret <> nil then begin
if GetAttackDir(m_TargetCret,btDir) then begin
if GetCurrentTime - m_dwHitTick > GetHitSpeed then begin
m_dwHitTick:=GetCurrentTime;
m_dwTargetFocusTick:=GetTickCount();
Attack(m_TargetCret,btDir); //FFED
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); {0FFF0h}
//004A8FE3
end else begin
DelTargetCreat();{0FFF1h}
//004A9009
end;
end;
end;
end;
procedure TMonster.Run; //004A9020
var
nX,nY:Integer;
begin
if not m_boFixedHideMode and not m_boStoneMode and CanMove then begin
if Think then begin
inherited;
exit;
end;
if m_boWalkWaitLocked then begin
if (GetTickCount - m_dwWalkWaitTick) > m_dwWalkWait then begin
m_boWalkWaitLocked:=False;
end;
end;
if not m_boWalkWaitLocked and (GetCurrentTime - m_dwWalkTick > GetWalkSpeed) then begin
m_dwWalkTick:=GetCurrentTime;
Inc(m_nWalkCount);
if m_nWalkCount > m_nWalkStep then begin
m_nWalkCount:=0;
m_boWalkWaitLocked:=True;
m_dwWalkWaitTick:=GetTickCount();
end; //004A9151
if not m_boRunAwayMode then begin
if not m_boNoAttackMode then begin
if m_TargetCret <> nil then begin
if AttackTarget{FFEB} then begin
inherited;
exit;
end;
end else begin
m_nTargetX:=-1;
if m_boMission then begin
m_nTargetX:=m_nMissionX;
m_nTargetY:=m_nMissionY;
end; //004A91D3
end;
end; //004A91D3 if not bo2C0 then begin
if m_Master <> nil then begin
if m_TargetCret = nil then begin
m_Master.GetBackPosition(nX,nY);
if (abs(m_nTargetX - nX) > 1) or (abs(m_nTargetY - nY{nX}) > 1) then begin //004A922D
m_nTargetX:=nX;
m_nTargetY:=nY;
if (abs(m_nCurrX - nX) <= 2) and (abs(m_nCurrY - nY) <= 2) then begin
if m_PEnvir.GetMovingObject(nX,nY,True) <> nil then begin
m_nTargetX:=m_nCurrX;
m_nTargetY:=m_nCurrY;
end //004A92A5
end;
end; //004A92A5
end; //004A92A5 if m_TargetCret = nil then begin
if (not m_Master.m_boSlaveRelax) and
((m_PEnvir <> m_Master.m_PEnvir) or
(abs(m_nCurrX-m_Master.m_nCurrX) > 20) or
(abs(m_nCurrY-m_Master.m_nCurrY) > 20)) then begin
SpaceMoveEX(m_Master.m_PEnvir.sMapName, m_nTargetX, m_nTargetY, 1,m_Master.m_PEnvir.Flag.nGuildTerritory);
end; // 004A937E
end;// 004A937E if m_Master <> nil then begin
end else begin //004A9344
if (m_dwRunAwayTime > 0) and ((GetTickCount - m_dwRunAwayStart) > m_dwRunAwayTime) then begin
m_boRunAwayMode:=False;
m_dwRunAwayTime:=0;
end;
end; //004A937E
if (m_Master <> nil) and m_Master.m_boSlaveRelax then begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -