📄 objmon.pas
字号:
end;
{ TMagCowMonster }
constructor TMagCowMonster.Create; //004A9F10
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TMagCowMonster.Destroy;
begin
inherited;
end;
procedure TMagCowMonster.sub_4A9F6C(btDir: Byte);
var
WAbil: pTAbility;
n10: Integer;
BaseObject: TBaseObject;
begin
m_btDirection := btDir;
WAbil := @m_WAbil;
n10 := Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC);
if n10 > 0 then
begin
SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
BaseObject := GetPoseCreate();
if (BaseObject <> nil) and
IsProperTarget(BaseObject) and
(m_nAntiMagic >= 0) then
begin
n10 := BaseObject.GetMagStruckDamage(Self, n10);
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), '', 300);
end;
end;
end;
end;
function TMagCowMonster.AttackTarget: Boolean; //004AA084
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_4A9F6C(btDir);
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);
end else
begin
DelTargetCreat();
end;
end;
end;
{ TCowKingMonster }
constructor TCowKingMonster.Create; //004AA160
begin
inherited;
m_dwSearchTime := Random(1500) + 500;
dw558 := GetTickCount();
bo2BF := True;
n560 := 0;
bo55C := False;
bo55D := False;
end;
destructor TCowKingMonster.Destroy;
begin
inherited;
end;
procedure TCowKingMonster.Attack(TargeTBaseObject: TBaseObject; nDir: Integer); //004AA1F0
var
WAbil: pTAbility;
nPower: Integer;
begin
WAbil := @m_WAbil;
nPower := GetAttackPower(LoWord(WAbil.DC), SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
HitMagAttackTarget(TargeTBaseObject, nPower div 2, nPower div 2, True);
// inherited;
end;
procedure TCowKingMonster.Initialize;
begin
dw56C := m_nNextHitTime;
dw570 := m_nWalkSpeed;
inherited;
end;
procedure TCowKingMonster.Run; //004AA294
var
i: Integer;
n8, nC, n10: Integer;
BaseObject: TBaseObject;
begin
if (not m_boDeath) and
(not bo554) and
(not m_boGhost) and
((GetTickCount - dw558) > 30 * 1000) then
begin
dw558 := GetTickCount();
if (m_TargetCret <> nil) and (sub_4C3538 >= 5) then
begin
m_TargetCret.GetBackPosition(n8, nC);
if m_PEnvir.CanWalk(n8, nC, False) then
begin
SpaceMove(m_PEnvir.sMapName, n8, nC, 0);
Exit;
end;
MapRandomMove(m_PEnvir.sMapName, 0);
Exit;
end;
n10 := n560;
n560 := 7 - m_WAbil.HP div (m_WAbil.MaxHP div 7);
if (n560 >= 2) and (n560 <> n10) then
begin
bo55C := True;
dw564 := GetTickCount();
end;
if bo55C then
begin
if (GetTickCount - dw564) < 8000 then
begin
m_nNextHitTime := 10000;
end else
begin
bo55C := False;
bo55D := True;
dw568 := GetTickCount();
end;
end; //004AA43D
if bo55D then
begin
if (GetTickCount - dw568) < 8000 then
begin
m_nNextHitTime := 500;
m_nWalkSpeed := 400;
end else
begin
bo55D := False;
m_nNextHitTime := dw56C;
m_nWalkSpeed := dw570;
end;
end;
end;
inherited;
end;
{ TLightingZombi }
constructor TLightingZombi.Create; //004AA4B4
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TLightingZombi.Destroy;
begin
inherited;
end;
procedure TLightingZombi.LightingAttack(nDir: Integer);
var
nSX, nSY, nTX, nTY, nPwr: Integer;
WAbil: pTAbility;
begin
m_btDirection := nDir;
SendRefMsg(RM_LIGHTING, 1, m_nCurrX, m_nCurrY, Integer(m_TargetCret), '');
if m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, nDir, 1, nSX, nSY) then
begin
m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, nDir, 9, nTX, nTY);
WAbil := @m_WAbil;
nPwr := (Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC));
MagPassThroughMagic(nSX, nSY, nTX, nTY, nDir, nPwr, True);
BreakHolySeizeMode();
end;
end;
procedure TLightingZombi.Run; //004AA604
var
nAttackDir: Integer;
begin
if (not m_boDeath) and
(not bo554) and
(not m_boGhost) and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) and
((GetTickCount - m_dwSearchEnemyTick) > 8000) then
begin
if ((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil) then
begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
if (Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) and
(m_TargetCret <> nil) and
(abs(m_nCurrX - m_TargetCret.m_nCurrX) <= 4) and
(abs(m_nCurrY - m_TargetCret.m_nCurrY) <= 4) then
begin
if (abs(m_nCurrX - m_TargetCret.m_nCurrX) <= 2) and
(abs(m_nCurrY - m_TargetCret.m_nCurrY) <= 2) and
(Random(3) <> 0) then
begin
inherited;
Exit;
end;
GetBackPosition(m_nTargetX, m_nTargetY);
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();
nAttackDir := GetNextDirection(m_nCurrX, m_nCurrY, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
LightingAttack(nAttackDir);
end;
end;
inherited;
end;
{ TDigOutZombi }
constructor TDigOutZombi.Create; //004AA848
begin
inherited;
bo554 := False;
m_nViewRange := 7;
m_dwSearchTime := Random(1500) + 2500;
m_dwSearchTick := GetTickCount();
m_boFixedHideMode := True;
end;
destructor TDigOutZombi.Destroy;
begin
inherited;
end;
procedure TDigOutZombi.sub_4AA8DC;
var
Event: TEvent;
begin
Event := TEvent.Create(m_PEnvir, m_nCurrX, m_nCurrY, 1, 5 * 60 * 1000, True);
g_EventManager.AddEvent(Event);
m_boFixedHideMode := False;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, Integer(Event), '');
end;
procedure TDigOutZombi.Run; //004AA95C
var
i: Integer;
n10: Integer;
BaseObject: TBaseObject;
begin
if (not m_boGhost) and
(not m_boDeath) and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) and
(Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) then
begin
n10 := 0;
if m_boFixedHideMode 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) <= 3) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 3) then
begin
sub_4AA8DC();
m_dwWalkTick := GetTickCount + 1000;
Break;
end;
end;
end;
end; // for
end else
begin //004AB0C7
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then
begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
end;
end;
inherited;
end;
{ TZilKinZombi }
constructor TZilKinZombi.Create;
begin
inherited;
m_nViewRange := 6;
m_dwSearchTime := Random(1500) + 2500;
m_dwSearchTick := GetTickCount();
nZilKillCount := 0;
if Random(3) = 0 then
begin
nZilKillCount := Random(3) + 1;
end;
end;
destructor TZilKinZombi.Destroy;
begin
inherited;
end;
procedure TZilKinZombi.Die;
begin
inherited;
if nZilKillCount > 0 then
begin
dw558 := GetTickCount();
dw560 := (Random(20) + 4) * 1000;
end;
Dec(nZilKillCount);
end;
procedure TZilKinZombi.Run; //004AABE4
begin
if m_boDeath and
(not m_boGhost) and
(nZilKillCount >= 0) and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) and
(m_VisibleActors.Count > 0) and
((GetTickCount - dw558) >= dw560) then
begin
m_Abil.MaxHP := m_Abil.MaxHP shr 1;
m_dwFightExp := m_dwFightExp div 2;
m_Abil.HP := m_Abil.MaxHP;
m_WAbil.HP := m_Abil.MaxHP;
ReAlive();
m_dwWalkTick := GetTickCount + 1000
end;
inherited;
end;
{ TWhiteSkeleton }
constructor TWhiteSkeleton.Create; //00004AACCC
begin
inherited;
m_boIsFirst := True;
m_boFixedHideMode := True;
m_nViewRange := 6;
end;
destructor TWhiteSkeleton.Destroy;
begin
inherited;
end;
procedure TWhiteSkeleton.RecalcAbilitys; //004AAD38
begin
inherited;
sub_4AAD54();
end;
procedure TWhiteSkeleton.Run;
begin
if m_boIsFirst then
begin
m_boIsFirst := False;
m_btDirection := 5;
m_boFixedHideMode := False;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;
inherited;
end;
procedure TWhiteSkeleton.sub_4AAD54; //004AAD54
begin
m_nNextHitTime := 3000 - m_btSlaveMakeLevel * 600;
m_nWalkSpeed := 1200 - m_btSlaveMakeLevel * 250;
m_dwWalkTick := GetTickCount + 2000;
end;
{ TScultureMonster }
constructor TScultureMonster.Create; //004AAE20
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
m_nViewRange := 7;
m_boStoneMode := True;
m_nCharStatusEx := STATE_STONE_MODE;
end;
destructor TScultureMonster.Destroy;
begin
inherited;
end;
procedure TScultureMonster.MeltStone;
begin
m_nCharStatusEx := 0;
m_nCharStatus := GetCharStatus();
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
m_boStoneMode := False;
end;
procedure TScultureMonster.MeltStoneAll;
var
i: Integer;
List10: TList;
BaseObject: TBaseObject;
begin
MeltStone();
List10 := TList.Create;
GetMapBaseObjects(m_PEnvir, m_nCurrX, m_nCurrY, 7, List10);
for i := 0 to List10.Count - 1 do
begin
BaseObject := TBaseObject(List10.Items[i]);
if BaseObject.m_boStoneMode then
begin
if BaseObject is TScultureMonster then
begin
TScultureMonster(BaseObject).MeltStone
end;
end;
end; // for
List10.Free;
end;
procedure TScultureMonster.Run; //004AAF98
var
i: Integer;
n10: Integer;
BaseObject: TBaseObject;
begin
if (not m_boGhost) and
(not m_boDeath) and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) and
(Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed) then
begin
n10 := 0;
if m_boStoneMode then
begin
for i := 0 to m_VisibleActors.Count - 1 do
begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -