📄 objplaymon.pas
字号:
SKILL_ERGUM {12}: begin //刺杀剑法
if m_MagicErgumSkill <> nil then begin
if not m_boUseThrusting then begin
m_boUseThrusting := True;
end else begin
m_boUseThrusting := False;
end;
end;
Result := True;
end;
SKILL_BANWOL {25}: begin //半月弯刀
if m_MagicBanwolSkill <> nil then begin
if not m_boUseHalfMoon then begin
m_boUseHalfMoon := True;
end else begin
m_boUseHalfMoon := False;
end;
end;
Result := True;
Exit;
end;
SKILL_FIRESWORD {26}: begin //烈火剑法
if m_MagicFireSwordSkill <> nil then begin
if AllowFireHitSkill then begin
nSpellPoint := GetSpellPoint(m_MagicFireSwordSkill);
if m_WAbil.MP >= nSpellPoint then begin
if nSpellPoint > 0 then begin
DamageSpell(nSpellPoint);
//HealthSpellChanged();
end;
end;
end;
end;
Result := True;
Exit;
end;
else begin {使用魔法}
for I := 0 to m_MagicList.Count - 1 do begin
UserMagic := m_MagicList.Items[I];
if (UserMagic <> nil) and (UserMagic.wMagIdx = wMagIdx) then begin
m_btDirection := GetNextDirection(m_nCurrX, m_nCurrY, m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
BaseObject := nil;
nNewTargetX := m_TargetCret.m_nCurrX;
nNewTargetY := m_TargetCret.m_nCurrY;
//检查目标角色,与目标座标误差范围,如果在误差范围内则修正目标座标
if CretInNearXY(m_TargetCret, nNewTargetX, nNewTargetY) then begin
BaseObject := m_TargetCret;
nNewTargetX := BaseObject.m_nCurrX;
nNewTargetY := BaseObject.m_nCurrY;
end;
(*if wMagIdx = SKILL_DEJIWONHO then begin {如果是 神圣战甲术 目标为自己}
BaseObject := Self;
nNewTargetX := m_nCurrX;
nNewTargetY := m_nCurrY;
end;*)
Result := DoSpell(UserMagic, nNewTargetX, nNewTargetY, BaseObject);
Break;
end;
end;
end;
end;
end;
function TPlayMonster.WarrAttackTarget(wHitMode: Word): Boolean; {物理攻击}
var
bt06: Byte;
begin
Result := False;
if m_TargetCret <> nil then begin
if GetAttackDir(m_TargetCret, bt06) then begin
m_dwTargetFocusTick := GetTickCount();
Attack(m_TargetCret, bt06);
BreakHolySeizeMode();
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;
end;
procedure TPlayMonster.EatMedicine(); {吃药}
var
n01: Integer;
begin
if (m_nCopyHumanLevel > 0) and (m_ItemList.Count > 0) then begin
if m_WAbil.HP < (m_WAbil.MaxHP * g_Config.nCopyHumAddHPRate) div 100 then begin
n01 := 0;
while m_WAbil.HP < m_WAbil.MaxHP do begin {增加连续吃三瓶}
if n01 > 3 then Break;
EatUseItems(0);
if m_ItemList.Count = 0 then Break;
Inc(n01);
end;
end;
if m_WAbil.MP < (m_WAbil.MaxMP * g_Config.nCopyHumAddMPRate) div 100 then begin
n01 := 0;
while m_WAbil.MP < m_WAbil.MaxMP do begin {增加连续吃三瓶}
if n01 > 3 then Break;
EatUseItems(1);
if m_ItemList.Count = 0 then Break;
Inc(n01);
end;
end;
if (m_ItemList.Count = 0) or (m_WAbil.HP < (m_WAbil.MaxHP * 20) div 100) or (m_WAbil.MP < (m_WAbil.MaxMP * 20) div 100) then begin
if m_VisibleItems.Count > 0 then begin
m_boPickUpItemOK := False;
SearchPickUpItem(500);
end;
end
end;
end;
{检测指定方向和范围内坐标的怪物数量}
function TPlayMonster.CheckTargetXYCountOfDirection(nX, nY, nDir, nRange: Integer): Integer;
var
BaseObject: TBaseObject;
I, nC, n10: Integer;
begin
Result := 0;
n10 := 2;
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject <> nil then begin
if not BaseObject.m_boDeath then begin
if IsProperTarget(BaseObject) and
(not BaseObject.m_boHideMode or m_boCoolEye) then begin
case nDir of
DR_UP: begin
if (abs(nX - BaseObject.m_nCurrX) <= nRange) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
end;
DR_UPRIGHT: begin
if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
end;
DR_RIGHT: begin
if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and (abs(nY - BaseObject.m_nCurrY) <= nRange) then Inc(Result);
end;
DR_DOWNRIGHT: begin
if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
end;
DR_DOWN: begin
if (abs(nX - BaseObject.m_nCurrX) <= nRange) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
end;
DR_DOWNLEFT: begin
if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
end;
DR_LEFT: begin
if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and (abs(nY - BaseObject.m_nCurrY) <= nRange) then Inc(Result);
end;
DR_UPLEFT: begin
if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
end;
end;
if Result > 2 then Break;
end;
end;
end;
end;
end;
function TPlayMonster.WarrorAttackTarget(): Boolean; {战士攻击}
var
wHitMode: Word;
begin
Result := False;
m_wHitMode := 0;
if m_WAbil.MP > 0 then begin
if wSkill_13 > 0 then begin
if CheckTargetXYCountOfDirection(m_nCurrX, m_nCurrY, m_btDirection, 1) >= 2 then begin
if not m_boUseHalfMoon then DoSpellMagic(SKILL_BANWOL {25}); //打开半月
if (wSkill_12 > 0) and (m_boUseThrusting) then DoSpellMagic(SKILL_ERGUM); //关闭刺杀
end else begin
if m_boUseHalfMoon then DoSpellMagic(SKILL_BANWOL {25}); //关闭半月
if (wSkill_12 > 0) and (not m_boUseThrusting) then DoSpellMagic(SKILL_ERGUM); //打开刺杀
end;
end else begin
if (wSkill_12 > 0) and (not m_boUseThrusting) then DoSpellMagic(SKILL_ERGUM); //打开刺杀
end;
if wSkill_11 > 0 then DoSpellMagic(SKILL_FIRESWORD {26}); //使用烈火
if m_boUseThrusting then m_wHitMode := 4; //使用刺杀
if m_boUseHalfMoon then m_wHitMode := 5; //使用半月
if m_boFireHitSkill then m_wHitMode := 7; //使用烈火
end;
Result := WarrAttackTarget(m_wHitMode);
end;
function TPlayMonster.CheckUserMagic(wMagIdx: Word): Integer;
var
UserMagic: pTUserMagic;
I: Integer;
begin
Result := 0;
for I := 0 to m_MagicList.Count - 1 do begin
UserMagic := m_MagicList.Items[I];
if UserMagic.MagicInfo.wMagicId = wMagIdx then begin
Result := wMagIdx;
Break;
end;
end;
end;
function TPlayMonster.CheckTargetXYCount(nX, nY, nRange: Integer): Integer;
var
BaseObject: TBaseObject;
I, nC, n10: Integer;
begin
Result := 0;
n10 := nRange;
for I := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
if BaseObject <> nil then begin
if not BaseObject.m_boDeath then begin
if IsProperTarget(BaseObject) and
(not BaseObject.m_boHideMode or m_boCoolEye) then begin
nC := abs(nX - BaseObject.m_nCurrX) + abs(nY - BaseObject.m_nCurrY);
if nC <= n10 then begin
Inc(Result);
if Result > 2 then Break;
end;
end;
end;
end;
end;
end;
function TPlayMonster.WizardAttackTarget(): Boolean; {法师攻击}
function SearchDoSpell: Integer;
begin
Result := 0;
if (wSkill_05 > 0) and (m_wStatusTimeArr[STATE_BUBBLEDEFENCEUP {0x76}] = 0) then begin {使用 魔法盾}
Result := wSkill_05;
Exit;
end;
if CheckTargetXYCount(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, 3) > 1 then begin
if (abs(m_TargetCret.m_nCurrX - m_nCurrX) <= 1) and (abs(m_TargetCret.m_nCurrY - m_nCurrY) <= 1) then begin
if wSkill_02 > 0 then Result := wSkill_02
else if wSkill_03 > 0 then Result := wSkill_03
else if wSkill_04 > 0 then Result := wSkill_04
else if wSkill_01 > 0 then Result := wSkill_01;
Exit;
end else begin
if (wSkill_03 > 0) and (wSkill_04 > 0) then begin
if Random(8) > 3 then begin
Result := wSkill_03;
end else begin
Result := wSkill_04;
end;
Exit;
end else begin
if wSkill_03 > 0 then Result := wSkill_03
else if wSkill_04 > 0 then Result := wSkill_04
else if wSkill_01 > 0 then Result := wSkill_01;
Exit;
end;
end;
end else begin
if wSkill_01 > 0 then Result := wSkill_01
else if wSkill_03 > 0 then Result := wSkill_03
else if wSkill_04 > 0 then Result := wSkill_04;
end;
end;
var
nMagicID: Integer;
begin
Result := False;
m_wHitMode := 0;
if m_boDoSpellMagic then begin
nMagicID := SearchDoSpell;
if nMagicID > 0 then begin
if not DoSpellMagic(nMagicID) then begin
SendRefMsg(RM_MAGICFIREFAIL, 0, 0, 0, 0, '');
end;
Result := True;
end;
end else begin
Result := WarrAttackTarget(m_wHitMode);
end;
end;
{道士}
function TPlayMonster.CheckItemType(nItemType: Integer; StdItem: pTStdItem): Boolean;
begin
Result := False;
case nItemType of
1: begin
if (StdItem.StdMode = 25) and (StdItem.Shape = 5) then Result := True;
end;
2: begin
if (StdItem.StdMode = 25) and (StdItem.Shape <= 2) then Result := True;
end;
end;
end;
function TPlayMonster.CheckUserItemType(nItemType: Integer): Boolean;
var
UserItem: pTUserItem;
StdItem: pTStdItem;
begin
Result := False;
if m_UseItems[U_BUJUK].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_BUJUK].wIndex);
if StdItem <> nil then begin
Result := CheckItemType(nItemType, StdItem);
end;
end;
end;
function TPlayMonster.UseItem(nItemType, nIndex: Integer): Boolean; //自动换毒符
var
UserItem: pTUserItem;
AddUserItem: pTUserItem;
StdItem: pTStdItem;
begin
Result := False;
if (nIndex >= 0) and (nIndex < m_ItemList.Count) then begin
UserItem := m_ItemList.Items[nIndex];
if m_UseItems[U_BUJUK].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_BUJUK].wIndex);
if StdItem <> nil then begin
if CheckItemType(nItemType, StdItem) then begin
Result := True;
end else begin
m_ItemList.Delete(nIndex);
New(AddUserItem);
AddUserItem^ := m_UseItems[U_BUJUK];
m_ItemList.Add(AddUserItem);
m_UseItems[U_BUJUK] := UserItem^;
Dispose(UserItem);
Result := True;
end;
end else begin
m_ItemList.Delete(nIndex);
m_UseItems[U_BUJUK] := UserItem^;
Dispose(UserItem);
Result := True;
end;
end else begin
m_ItemList.Delete(nIndex);
m_UseItems[U_BUJUK] := UserItem^;
Dispose(UserItem);
Result := True;
end;
end;
end;
//检测包裹中是否有符和毒
//nType 为指定类型 1 为护身符 2 为毒药
function TPlayMonster.GetUserItemList(nItemType: Integer): Integer;
var
I: Integer;
UserItem: pTUserItem;
StdItem: pTStdItem;
begin
Result := -1;
for I := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[I];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
if CheckItemType(nItemType, StdItem) then begin
Result := I;
Break;
end;
end;
end;
end;
function TPlayMonster.TaoistAttackTarget(): Boolean; {道士攻击}
function SearchDoSpell: Integer;
function GetMagic01: Integer;
begin
Re
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -