📄 objmon.pas
字号:
begin
inherited;
m_boIsFirst := True;
m_boFixedHideMode := True;
m_btRaceServer := 100;
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 <> nil then begin
if BaseObject.m_boStoneMode then begin
if BaseObject is TScultureMonster then begin
TScultureMonster(BaseObject).MeltStone
end;
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);
if BaseObject = nil then Continue;
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) <= 2) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 2) then begin
MeltStoneAll();
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;
{ TScultureKingMonster }
constructor TScultureKingMonster.Create; //004AB120
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
m_nViewRange := 8;
m_boStoneMode := True;
m_nCharStatusEx := STATE_STONE_MODE;
m_btDirection := 5;
m_nDangerLevel := 5;
m_SlaveObjectList := TList.Create;
end;
destructor TScultureKingMonster.Destroy; //004AB1C8
begin
m_SlaveObjectList.Free;
inherited;
end;
procedure TScultureKingMonster.MeltStone; //004AB208
var
Event: TEvent;
begin
m_nCharStatusEx := 0;
m_nCharStatus := GetCharStatus();
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
m_boStoneMode := False;
Event := TEvent.Create(m_PEnvir, m_nCurrX, m_nCurrY, 6, 5 * 60 * 1000, True);
g_EventManager.AddEvent(Event);
end;
procedure TScultureKingMonster.CallSlave; //004AB29C
var
I: Integer;
nC: Integer;
n10, n14: Integer;
//sMonName:array[0..3] of String;
BaseObject: TBaseObject;
begin
nC := Random(6) + 6;
GetFrontPosition(n10, n14);
{
sMonName[0]:=sZuma1;
sMonName[1]:=sZuma2;
sMonName[2]:=sZuma3;
sMonName[3]:=sZuma4;
}
for I := 1 to nC do begin
if m_SlaveObjectList.Count >= 30 then break;
BaseObject := UserEngine.RegenMonsterByName(m_sMapName, n10, n14, g_Config.sZuma[Random(4)]);
if BaseObject <> nil then begin
//BaseObject.m_Master:=Self;
//BaseObject.m_dwMasterRoyaltyTick:=GetTickCount + 24 * 60 * 60 * 1000;
m_SlaveObjectList.Add(BaseObject);
end;
end; // for
end;
procedure TScultureKingMonster.Attack(TargeTBaseObject: TBaseObject; nDir: Integer); //004AB3E8
var
WAbil: pTAbility;
nPower: Integer;
begin
if TargeTBaseObject <> nil then begin
WAbil := @m_WAbil;
nPower := GetAttackPower(LoWord(WAbil.DC), SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
HitMagAttackTarget(TargeTBaseObject, 0, nPower, True);
end;
end;
procedure TScultureKingMonster.Run; //004AB444
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
//MeltStone();//测试用
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject = nil then Continue;
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) <= 2) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 2) then begin
MeltStone();
break;
end;
end;
end;
end; // for
end else begin
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
//CallSlave(); //测试用
if (m_nDangerLevel > m_WAbil.HP / m_WAbil.MaxHP * 5) and (m_nDangerLevel > 0) then begin
Dec(m_nDangerLevel);
CallSlave();
end;
if m_WAbil.HP = m_WAbil.MaxHP then
m_nDangerLevel := 5;
end;
end;
for I := m_SlaveObjectList.Count - 1 downto 0 do begin
if m_SlaveObjectList.Count <= 0 then break;
BaseObject := TBaseObject(m_SlaveObjectList.Items[I]);
if BaseObject <> nil then begin
if BaseObject.m_boDeath or BaseObject.m_boGhost then
m_SlaveObjectList.Delete(I);
end;
end; // for
end;
inherited;
end;
{ TGasMothMonster }
constructor TGasMothMonster.Create; //004AB6B8
begin
inherited;
m_nViewRange := 7;
end;
destructor TGasMothMonster.Destroy;
begin
inherited;
end;
function TGasMothMonster.sub_4A9C78(bt05: Byte): TBaseObject; //004AB708
var
BaseObject: TBaseObject;
begin
BaseObject := inherited sub_4A9C78(bt05);
if (BaseObject <> nil) and (Random(3) = 0) and (BaseObject.m_boHideMode) then begin
BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT {8 0x70}] := 1;
end;
Result := BaseObject;
end;
procedure TGasMothMonster.Run; //004AB758
var
n08, nC: Integer;
begin
n08 := 9999;
nC := 0;
if (not m_boDeath) and
(not bo554) and
(not m_boGhost) and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) and
(Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed) then begin
if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
(((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
m_dwSearchEnemyTick := GetTickCount();
sub_4C959C();
end;
end;
inherited;
end;
{ TGasDungMonster }
constructor TGasDungMonster.Create; //004AB7F4
begin
inherited;
m_nViewRange := 7;
end;
destructor TGasDungMonster.Destroy;
begin
inherited;
end;
{ TElfMonster }
procedure TElfMonster.AppearNow; //004AB908 神兽
begin
boIsFirst := False;
m_boFixedHideMode := False;
//SendRefMsg (RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
// Appear;
// ResetElfMon;
RecalcAbilitys;
m_dwWalkTick := m_dwWalkTick + 800; //
end;
constructor TElfMonster.Create;
//004AB844
begin
inherited;
m_nViewRange := 6;
m_boFixedHideMode := True;
m_boNoAttackMode := True;
boIsFirst := True;
end;
destructor TElfMonster.Destroy;
begin
inherited;
end;
procedure TElfMonster.RecalcAbilitys; //004AB8B0
begin
inherited;
ResetElfMon();
end;
procedure TElfMonster.ResetElfMon(); //004AB8CC
begin
m_nWalkSpeed := 500 - m_btSlaveMakeLevel * 50;
m_dwWalkTick := GetTickCount + 2000;
end;
procedure TElfMonster.Run; //4AB944
var
boChangeFace: Boolean;
ElfMon: TBaseObject;
begin
if boIsFirst then begin
boIsFirst := False;
m_boFixedHideMode := False;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
ResetElfMon();
end;
if m_boDeath then begin
if (GetTickCount - m_dwDeathTick > 2 * 1000) then begin
MakeGhost();
end;
end else begin
boChangeFace := False;
if m_TargetCret <> nil then boChangeFace := True;
if (m_Master <> nil) and ((m_Master.m_TargetCret <> nil) or (m_Master.m_LastHiter <> nil)) then
boChangeFace := True;
if boChangeFace then begin
//ElfMon:=MakeClone(sDogz1,Self);
ElfMon := MakeClone(m_sCharName + '1', Self);
if ElfMon <> nil then begin
ElfMon.m_boAutoChangeColor := m_boAutoChangeColor;
if ElfMon is TElfWarriorMonster then TElfWarriorMonster(ElfMon).AppearNow;
m_Master := nil;
KickException();
end;
end;
end;
inherited;
end;
{ TElfWarriorMonster }
procedure TElfWarriorMonster.AppearNow; //004ABB60
begin
boIsFirst := False;
m_boFixedHideMode := False;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
RecalcAbilitys;
m_dwWalkTick := m_dwWalkTick + 800; //函脚饶 距埃 掉饭捞 乐澜
dwDigDownTick := GetTickCount();
end;
constructor TElfWarriorMonster.Create;
begin
inherited;
m_nViewRange := 6;
m_boFixedHideMode := True;
boIsFirst := True;
m_boUsePoison := False;
end;
destructor TElfWarriorMonster.Destroy;
begin
inherited;
end;
procedure TElfWarriorMonster.RecalcAbilitys;
begin
inherited;
ResetElfMon();
end;
procedure TElfWarriorMonster.ResetElfMon();
begin
m_nNextHitTime := 1500 - m_btSlaveMakeLevel * 100;
m_nWalkSpeed := 500 - m_btSlaveMakeLevel * 50;
m_dwWalkTick := GetTickCount + 2000;
end;
procedure TElfWarriorMonster.Run; //004ABBD0
var
boChangeFace: Boolean;
ElfMon: TBaseObject;
ElfName: string;
begin
ElfMon := nil;
if boIsFirst then begin
boIsFirst := False;
m_boFixedHideMode := False;
SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
ResetElfMon();
end; //004ABC27
if m_boDeath then begin
if (GetTickCount - m_dwDeathTick > 2 * 1000) then begin
MakeGhost();
end;
end else begin
boChangeFace := True;
if m_TargetCret <> nil then boChangeFace := False;
if (m_Master <> nil) and ((m_Master.m_TargetCret <> nil) or (m_Master.m_LastHiter <> nil)) then
boChangeFace := False;
if boChangeFace then begin
if (GetTickCount - dwDigDownTick) > 6 * 10 * 1000 then begin
//if (GetTickCount - dwDigDownTick) > 10 * 1000 then begin
//ElfMon:=MakeClone(sDogz,Self);
ElfName := m_sCharName;
if ElfName[length(ElfName)] = '1' then begin
ElfName := Copy(ElfName, 1, length(ElfName) - 1);
ElfMon := MakeClone(ElfName, Self);
end;
if ElfMon <> nil then begin
SendRefMsg(RM_DIGDOWN, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
SendRefMsg(RM_CHANGEFACE, 0, Integer(Self), Integer(ElfMon), 0, '');
ElfMon.m_boAutoChangeColor := m_boAutoChangeColor;
if ElfMon is TElfMonster then
TElfMonster(ElfMon).AppearNow;
m_Master := nil;
KickException();
end;
end;
end else begin
dwDigDownTick := GetTickCount();
end;
end;
inherited;
end;
{ TElectronicScolpionMon }
constructor TElectronicScolpionMon.Create;
begin
inherited;
m_dwSearchTime := Random(1500) + 1500;
m_boUseMagic := False;
end;
destructor TElectronicScolpionMon.Destroy;
begin
inherited;
end;
procedure TElectronicScolpionMon.LightingAttack(nDir: Integer);
var
WAbil: pTAbility;
nPower, nDamage: Integer;
btGetBackHP: Integer;
begin
if m_TargetCret <> nil then begin
m_btDirection := nDir;
WAbil := @m_WAbil;
nPower := GetAttackPower(LoWord(WAbil.MC), SmallInt(HiWord(WAbil.MC) - LoWord(WAbil.MC)));
nDamage := m_TargetCret.GetMagStruckDamage(Self, nPower);
if nDamage > 0 then begin
btGetBackHP := LoByte(m_WAbil.MP);
if btGetBackHP <> 0 then Inc(m_WAbil.HP, nDamage div btGetBackHP);
m_TargetCret.StruckDamage(nDamage);
m_TargetCret.SendDelayMsg(TBaseObject(RM_STRUCK), RM_10101, nDamage, m_TargetCret.m_WAbil.HP, m_TargetCret.m_WAbil.MaxHP, Integer(Self), '', 200);
end;
SendRefMsg(RM_LIGHTING, 1, m_nCurrX, m_nCurrY, Integer(m_TargetCret), '');
end;
end;
procedure TElectronicScolpionMon.Run;
var
nAttackDir: Integer;
nX, nY: Integer;
begin
if (not m_boDeath) and
(not bo554) and
(not m_boGhost) and
(m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then begin
//血量低于一半时开始用魔法攻击
if m_WAbil.HP < m_WAbil.MaxHP div 2 then m_boUseMagic := True
else m_boUseMagic := False;
if ((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil) then begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
if m_TargetCret = nil then Exit;
nX := abs(m_nCurrX - m_TargetCret.m_nCurrX);
nY := abs(m_nCurrY - m_TargetCret.m_nCurrY);
if (nX <= 2) and (nY <= 2) then begin
if m_boUseMagic or ((nX = 2) or (nY = 2)) then begin
if (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;
end;
end;
inherited Run;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -