📄 objmon.pas
字号:
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
SpaceMove(m_Master.m_PEnvir.sMapName, m_nTargetX, m_nTargetY, 1);
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
inherited;
Exit;
end; //004A93A6
if m_nTargetX <> -1 then
begin
GotoTargetXY(); //004A93B5 0FFEF
end else
begin
if m_TargetCret = nil then Wondering(); // FFEE //Jacky
end; //004A93D8
end; //004A93D8 if not bo510 and ((GetTickCount - m_dwWalkTick) > n4FC) then begin
end; //004A93D8
inherited;
end;
{ TChickenDeer }
constructor TChickenDeer.Create; //004A93E8
begin
inherited;
m_nViewRange := 5;
end;
destructor TChickenDeer.Destroy;
begin
inherited;
end;
procedure TChickenDeer.Run; //004A9438
var
i: Integer;
nC, n10, n14, n1C: Integer;
BaseObject1C, BaseObject: TBaseObject;
begin
n10 := 9999;
BaseObject := nil;
BaseObject1C := nil;
if not m_boDeath and
not bo554 and
not m_boGhost and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
begin
if Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed 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
nC := abs(m_nCurrX - BaseObject.m_nCurrX) + abs(m_nCurrY - BaseObject.m_nCurrY);
if nC < n10 then
begin
n10 := nC;
BaseObject1C := BaseObject;
end;
end;
end;
end; // for
if BaseObject1C <> nil then
begin
m_boRunAwayMode := True;
m_TargetCret := BaseObject1C;
end else
begin
m_boRunAwayMode := False;
m_TargetCret := nil;
end;
end; //
if m_boRunAwayMode and
(m_TargetCret <> nil) and
(Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed) then
begin
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 6) and (abs(m_nCurrX - BaseObject.m_nCurrX) <= 6) then
begin
n14 := GetNextDirection(m_nCurrX, m_nCurrY, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
m_PEnvir.GetNextPosition(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, n14, 5, m_nTargetX, m_nTargetY);
end;
end;
end;
inherited;
end;
{ TATMonster }
constructor TATMonster.Create; //004A9690
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TATMonster.Destroy;
begin
inherited;
end;
procedure TATMonster.Run; //004A9720
begin
if not m_boDeath and
not bo554 and
not m_boGhost and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
begin
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then
begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
end;
inherited;
end;
{ TSlowATMonster }
constructor TSlowATMonster.Create; //004A97AC
begin
inherited;
end;
destructor TSlowATMonster.Destroy;
begin
inherited;
end;
{ TScorpion }
constructor TScorpion.Create; //004A97F0
begin
inherited;
m_boAnimal := True;
end;
destructor TScorpion.Destroy;
begin
inherited;
end;
{ TSpitSpider }
constructor TSpitSpider.Create; //004A983C
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
m_boAnimal := True;
m_boUsePoison := True;
end;
destructor TSpitSpider.Destroy;
begin
inherited;
end;
procedure TSpitSpider.SpitAttack(btDir: Byte); //004A98AC
var
WAbil: pTAbility;
i, k, nX, nY, nDamage: Integer;
BaseObject: TBaseObject;
begin
m_btDirection := btDir;
WAbil := @m_WAbil;
nDamage := (Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC));
if nDamage <= 0 then Exit;
SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
for i := 0 to 4 do
begin
for k := 0 to 4 do
begin
if (g_Config.SpitMap[btDir, i, k] = 1) then
begin
nX := m_nCurrX - 2 + k;
nY := m_nCurrY - 2 + i;
BaseObject := m_PEnvir.GetMovingObject(nX, nY, True);
if (BaseObject <> nil) and
(BaseObject <> Self) and
(IsProperTarget(BaseObject)) and
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) then
begin
nDamage := BaseObject.GetMagStruckDamage(Self, nDamage);
if nDamage > 0 then
begin
BaseObject.StruckDamage(nDamage);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK), RM_10101, nDamage, m_WAbil.HP, m_WAbil.MaxHP, Integer(Self), '', 300);
if m_boUsePoison then
begin
if (Random(m_btAntiPoison + 20) = 0) then
BaseObject.MakePosion(POISON_DECHEALTH, 30, 1);
//if Random(2) = 0 then
// BaseObject.MakePosion(POISON_STONE,5,1);
end;
end;
end;
end;
end;
end;
end;
function TSpitSpider.AttackTarget: Boolean;
var
btDir: Byte;
begin
Result := False;
if m_TargetCret = nil then Exit;
if TargetInSpitRange(m_TargetCret, btDir) then
begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
begin
m_dwHitTick := GetTickCount();
m_dwTargetFocusTick := GetTickCount();
SpitAttack(btDir);
BreakHolySeizeMode();
end;
Result := True;
Exit;
end;
if m_TargetCret.m_PEnvir = m_PEnvir then
begin
SetTargetXY(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
end else
begin
DelTargetCreat();
end;
end;
{ THighRiskSpider }
constructor THighRiskSpider.Create; //004A9B64
begin
inherited;
m_boAnimal := False;
m_boUsePoison := False;
end;
destructor THighRiskSpider.Destroy;
begin
inherited;
end;
{ TDoubleCriticalMonster }
constructor TDoubleCriticalMonster.Create;
begin
inherited;
m_boAnimal := False;
end;
destructor TDoubleCriticalMonster.Destroy;
begin
inherited;
end;
function TDoubleCriticalMonster.AttackTarget: Boolean;
var
btDir: Byte;
begin
Result := False;
if m_TargetCret = nil then Exit;
if TargetInSpitRange(m_TargetCret, btDir) then
begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
begin
m_dwHitTick := GetTickCount();
m_dwTargetFocusTick := GetTickCount();
DoubleAttack(btDir);
BreakHolySeizeMode();
end;
Result := True;
Exit;
end;
if m_TargetCret.m_PEnvir = m_PEnvir then
begin
SetTargetXY(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
end else
begin
DelTargetCreat();
end;
end;
procedure TDoubleCriticalMonster.DoubleAttack(btDir: Byte);
var
WAbil: pTAbility;
i, k, nX, nY, nDamage: Integer;
BaseObject: TBaseObject;
begin
m_btDirection := btDir;
WAbil := @m_WAbil;
nDamage := (Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) + LoWord(WAbil.DC));
if nDamage <= 0 then Exit;
SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
for i := 0 to 4 do
begin
for k := 0 to 4 do
begin
if (g_Config.SpitMap[btDir, i, k] = 1) then
begin
nX := m_nCurrX - 2 + k;
nY := m_nCurrY - 2 + i;
BaseObject := m_PEnvir.GetMovingObject(nX, nY, True);
if (BaseObject <> nil) and
(BaseObject <> Self) and
(IsProperTarget(BaseObject)) and
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) then
begin
nDamage := BaseObject.GetHitStruckDamage(Self, nDamage);
if nDamage > 0 then
begin
BaseObject.StruckDamage(nDamage);
BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK), RM_10101, nDamage, m_WAbil.HP, m_WAbil.MaxHP, Integer(Self), '', 300);
end;
end;
end;
end;
end;
end;
{ TBigPoisionSpider }
constructor TBigPoisionSpider.Create; //004A9BBC
begin
inherited;
m_boAnimal := False;
m_boUsePoison := True;
end;
destructor TBigPoisionSpider.Destroy;
begin
inherited;
end;
{ TGasAttackMonster }
constructor TGasAttackMonster.Create; //004A9C14
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
m_boAnimal := True;
end;
destructor TGasAttackMonster.Destroy;
begin
inherited;
end;
function TGasAttackMonster.sub_4A9C78(bt05: Byte): TBaseObject;
var
WAbil: pTAbility;
n10: Integer;
BaseObject: TBaseObject;
begin
Result := nil;
m_btDirection := bt05;
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
(Random(BaseObject.m_btSpeedPoint) < m_btHitPoint) 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);
if Random(BaseObject.m_btAntiPoison + 20) = 0 then
begin
BaseObject.MakePosion(POISON_STONE, 5, 0)
end;
Result := BaseObject;
end;
end;
end;
end;
function TGasAttackMonster.AttackTarget(): Boolean; //004A9DD4
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_4A9C78(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;
{ TCowMonster }
constructor TCowMonster.Create; //004A9EB4
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
end;
destructor TCowMonster.Destroy;
begin
inherited;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -