📄 objmon2.pas
字号:
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.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;
nComeOutValue := 4;
nAttackRange := 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.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.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.ComeOut;
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.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) < nComeOutValue) and (abs(m_nCurrY - BaseObject.m_nCurrY) < nComeOutValue) then
begin
ComeOut();
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
ComeDown();
m_dwAttickTick := GetTickCount();
end;
end;
end;
end;
end;
inherited;
end;
{ TBigHeartMonster }
constructor TBigHeartMonster.Create; //004A5F94
begin
inherited;
m_nViewRange := 16;
m_boAnimal := False;
end;
destructor TBigHeartMonster.Destroy;
begin
inherited;
end;
function TBigHeartMonster.AttackTarget(): Boolean; //004A5FEC
var
i: Integer;
BaseObject: TBaseObject;
nPower: Integer;
WAbil: pTAbility;
begin
Result := False;
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
begin
m_dwHitTick := GetTickCount();
SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
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.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
SendDelayMsg(Self, RM_DELAYMAGIC, nPower, MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 1, Integer(BaseObject), '', 200);
SendRefMsg(RM_10205, 0, BaseObject.m_nCurrX, BaseObject.m_nCurrY, 1 {type}, '');
end;
end;
end; // for
Result := True;
end;
// inherited;
end;
procedure TBigHeartMonster.Run; //004A617C
begin
if not m_boGhost and
not m_boDeath and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
begin
if m_VisibleActors.Count > 0 then
AttackTarget();
end;
inherited;
end;
{ TSpiderHouseMonster }
constructor TSpiderHouseMonster.Create; //004A61D0
begin
inherited;
m_nViewRange := 9;
m_nRunTime := 250;
m_dwSearchTime := Random(1500) + 2500;
m_dwSearchTick := 0;
m_boStickMode := True;
BBList := TList.Create;
end;
destructor TSpiderHouseMonster.Destroy;
//004A6270
begin
BBList.Free;
inherited;
end;
procedure TSpiderHouseMonster.GenBB; //004A62B0
begin
if BBList.Count < 15 then
begin
SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
SendDelayMsg(Self, RM_ZEN_BEE, 0, 0, 0, 0, '', 500);
end;
end;
function TSpiderHouseMonster.Operate(ProcessMsg: pTProcessMessage): Boolean;
var
BB: TBaseObject;
n08, n0C: Integer;
begin
if ProcessMsg.wIdent = RM_ZEN_BEE then
begin
n08 := m_nCurrX;
n0C := m_nCurrY + 1;
if m_PEnvir.CanWalk(n08, n0C, True) then
begin
BB := UserEngine.RegenMonsterByName(m_PEnvir.sMapName, n08, n0C, g_Config.sSpider);
if BB <> nil then
begin
BB.SetTargetCreat(m_TargetCret);
BBList.Add(BB);
end;
end;
end;
Result := inherited Operate(ProcessMsg);
end;
procedure TSpiderHouseMonster.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 GenBB();
end;
for i := BBList.Count - 1 downto 0 do
begin
BB := TBaseObject(BBList.Items[i]);
if BB.m_boDeath or (BB.m_boGhost) then BBList.Delete(i);
end; // for
end;
end;
inherited;
end;
{ TExplosionSpider }
constructor TExplosionSpider.Create;
//004A6538
begin
inherited;
m_nViewRange := 5;
m_nRunTime := 250;
m_dwSearchTime := Random(1500) + 2500;
m_dwSearchTick := 0;
dw558 := GetTickCount();
end;
destructor TExplosionSpider.Destroy;
begin
inherited;
end;
procedure TExplosionSpider.sub_4A65C4;
var
WAbil: pTAbility;
i, nPower, n10: Integer;
BaseObject: TBaseObject;
begin
m_WAbil.HP := 0;
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.m_boDeath then Continue;
if IsProperTarget(BaseObject) then
begin
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 1) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 1) then
begin
n10 := 0;
Inc(n10, BaseObject.GetHitStruckDamage(Self, nPower div 2));
Inc(n10, BaseObject.GetMagStruckDamage(Self, nPower div 2));
if n10 > 0 then
begin
BaseObject.StruckDamage(n10);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK), RM_10101, n10, BaseObject.m_WAbil.HP, BaseObject.m_WAbil.MaxHP, Integer(Self), '', 700);
end;
end;
end;
end; // for
end;
function TExplosionSpider.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();
sub_4A65C4();
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -