📄 objplaymon.pas
字号:
Result := True;
end;
end;
end;
end;
end;
end;
function GetUnbindItemName(nShape: Integer): string;
var
I: Integer;
begin
Result := '';
for I := 0 to g_UnbindList.Count - 1 do begin
if Integer(g_UnbindList.Objects[I]) = nShape then begin
Result := g_UnbindList.Strings[I];
Break;
end;
end;
end;
function GetUnBindItems(sItemName: string; nCount: Integer): Boolean;
var
I: Integer;
UserItem: pTUserItem;
begin
Result := False;
for I := 0 to nCount - 1 do begin
New(UserItem);
if UserEngine.CopyToUserItemFromName(sItemName, UserItem) then begin
m_ItemList.Add(UserItem);
Result := True;
end else begin
Dispose(UserItem);
Break;
end;
end;
end;
function FoundUserItem(nItemIdx: Integer): Boolean;
var
I: Integer;
UserItem: pTUserItem;
begin
Result := False;
for I := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[I];
if UserItem = nil then Continue;
if (UserItem <> nil) and (UserItem.MakeIndex = nItemIdx) then begin
Result := True;
Break;
end;
end;
end;
function FoundAddHealthItem(ItemType: Byte): 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];
if UserItem <> nil then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
case ItemType of
0: begin //红药
if (StdItem.StdMode = 0) and (StdItem.Shape = 0) and (StdItem.AC > 0) then begin
Result := I;
Break;
end;
end;
1: begin //蓝药
if (StdItem.StdMode = 0) and (StdItem.Shape = 0) and (StdItem.MAC > 0) then begin
Result := I;
Break;
end;
end;
2: begin //太阳水
if (StdItem.StdMode = 0) and (StdItem.Shape = 1) and (StdItem.AC > 0) and (StdItem.MAC > 0) then begin
Result := I;
Break;
end;
end;
3: begin //红药包
if (StdItem.StdMode = 31) and (GetBindItemType(StdItem.Shape) = 0) then begin
Result := I;
Break;
end;
end;
4: begin //蓝药包
if (StdItem.StdMode = 31) and (GetBindItemType(StdItem.Shape) = 1) then begin
Result := I;
Break;
end;
end;
end;
end;
end;
end;
end;
function UseAddHealthItem(nItemIdx: Integer): Boolean;
var
UserItem: pTUserItem;
StdItem: pTStdItem;
begin
Result := False;
UserItem := m_ItemList.Items[nItemIdx];
if UserItem <> nil then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
if not m_PEnvir.AllowStdItems(UserItem.wIndex) then begin
Exit;
end;
case StdItem.StdMode of
0 {, 1, 2, 3}: begin //药
if EatItems(StdItem) then begin
if UserItem <> nil then Dispose(UserItem);
m_ItemList.Delete(nItemIdx);
//m_WAbil.Weight := RecalcBagWeight();
Result := True;
end;
end;
31: begin //解包物品
//MainOutMessage('解包物品 ' + IntToStr(GetBindItemType(StdItem.Shape)));
if (StdItem.AniCount = 0) and (GetBindItemType(StdItem.Shape) >= 0) then begin
//if (m_ItemList.Count + 6 - 1) <= MAXBAGITEM then begin
Dispose(UserItem);
m_ItemList.Delete(nItemIdx);
GetUnBindItems(GetUnbindItemName(StdItem.Shape), 6);
Result := True;
end;
end;
end;
end;
end;
end;
var
nItemIdx: Integer;
boEatOK: Boolean;
UserItem: pTUserItem;
StdItem: pTStdItem;
UserItem34: TUserItem;
begin
boEatOK := False;
StdItem := nil;
if not m_boDeath then begin
nItemIdx := FoundAddHealthItem(btItemType);
if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
Result := UseAddHealthItem(nItemIdx);
end else begin
case btItemType of //查找解包物品
0: begin
nItemIdx := FoundAddHealthItem(3);
if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
Result := UseAddHealthItem(nItemIdx);
end else begin
nItemIdx := FoundAddHealthItem(2);
if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
Result := UseAddHealthItem(nItemIdx);
end;
end;
end;
1: begin
nItemIdx := FoundAddHealthItem(4);
if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
Result := UseAddHealthItem(nItemIdx);
end else begin
nItemIdx := FoundAddHealthItem(2);
if (nItemIdx >= 0) and (nItemIdx < m_ItemList.Count) then begin
Result := UseAddHealthItem(nItemIdx);
end;
end;
end;
end;
end;
end;
end;
function TPlayMonster.AllowGotoTargetXY(): Boolean;
begin
Result := True;
if (m_btJob = 0) or (not m_boDoSpellMagic) or (m_TargetCret = nil) then Exit;
Result := False;
end;
function TPlayMonster.AllowFireHitSkill(): Boolean;
begin
Result := False;
if (GetTickCount - m_dwLatestFireHitTick) > 10 * 1000 then begin
m_dwLatestFireHitTick := GetTickCount();
m_boFireHitSkill := True;
Result := True;
end;
end;
function TPlayMonster.StartAutoAvoid(): Boolean;
begin
Result := False;
if (m_btJob > 0) and ((GetTickCount - m_dwAutoAvoidTick) > 1 * 1000) and (m_TargetCret <> nil) and (not m_TargetCret.m_boDeath) then begin
m_dwAutoAvoidTick := GetTickCount();
Result := True;
end;
end;
function TPlayMonster.GetSpellPoint(UserMagic: pTUserMagic): Integer;
begin
Result := Round(UserMagic.MagicInfo.wSpell / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1)) + UserMagic.MagicInfo.btDefSpell;
end;
function TPlayMonster.DoSpellMagic(wMagIdx: Word): Boolean; //使用魔法
function DoSpell(UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
var
nSpellPoint: Integer;
boSpellFail: Boolean;
boSpellFire: Boolean;
n10: Integer;
n14: Integer;
n18: Integer;
n1C: Integer;
nDir: Integer;
nPower: Integer;
WAbil: pTAbility;
nAmuletIdx: Integer;
function MPow(UserMagic: pTUserMagic): Integer;
begin
Result := UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
end;
function GetPower(nPower: Integer): Integer;
begin
Result := Round(nPower / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1)) + (UserMagic.MagicInfo.btDefPower + Random(UserMagic.MagicInfo.btDefMaxPower - UserMagic.MagicInfo.btDefPower));
end;
function GetPower13(nInt: Integer): Integer;
var
d10: Double;
d18: Double;
begin
d10 := nInt / 3.0;
d18 := nInt - d10;
Result := Round(d18 / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1) + d10 + (UserMagic.MagicInfo.btDefPower + Random(UserMagic.MagicInfo.btDefMaxPower - UserMagic.MagicInfo.btDefPower)));
end;
procedure DelUseItem();
begin
if m_UseItems[U_BUJUK].Dura < 100 then begin
m_UseItems[U_BUJUK].Dura := 0;
m_UseItems[U_BUJUK].wIndex := 0;
end;
end;
begin
Result := False;
boSpellFail := False;
boSpellFire := True;
nPower := 0;
if (abs(m_nCurrX - nTargetX) > g_Config.nMagicAttackRage) or (abs(m_nCurrY - nTargetY) > g_Config.nMagicAttackRage) then begin
Exit;
end;
SendRefMsg(RM_SPELL, UserMagic.MagicInfo.btEffect, nTargetX, nTargetY, UserMagic.MagicInfo.wMagicId, '');
if (TargeTBaseObject <> nil) and (TargeTBaseObject.m_boDeath) then TargeTBaseObject := nil;
case wMagIdx of
SKILL_LIGHTENING {11}: begin {雷电术}
nSpellPoint := GetSpellPoint(UserMagic);
if nSpellPoint > 0 then begin
if m_WAbil.MP < nSpellPoint then Exit;
DamageSpell(nSpellPoint);
//HealthSpellChanged();
end;
if m_TargetCret <> nil then begin
if IsProperTarget(TargeTBaseObject) then begin
if (Random(10) >= TargeTBaseObject.m_nAntiMagic) then begin
nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC),
SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1);
if TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD then
nPower := Round(nPower * 1.5);
SendDelayMsg(Self, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '', 600);
Result := True
end else TargeTBaseObject := nil
end else TargeTBaseObject := nil;
end;
end;
SKILL_SHIELD {31}: begin //魔法盾
if MagBubbleDefenceUp(UserMagic.btLevel, GetPower(GetRPow(m_WAbil.MC) + 15)) then Result := True;
end;
SKILL_SNOWWIND {33}: begin // 冰咆哮
if MagicManager.MagBigExplosion(Self,
GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1),
nTargetX,
nTargetY,
g_Config.nSnowWindRange) then
Result := True;
end;
SKILL_LIGHTFLOWER {24}: begin //地狱雷光
if MagicManager.MagElecBlizzard(Self, GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1)) then
Result := True;
end;
SKILL_47: begin //火龙气焰
if MagicManager.MagBigExplosion(Self,
GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1),
nTargetX,
nTargetY,
g_Config.nFireBoomRage {1}) then
Result := True;
end;
{道士}
SKILL_AMYOUNSUL {6}: begin //施毒术
if MagicManager.MagLightening(Self, UserMagic, nTargetX, nTargetY, TargeTBaseObject, boSpellFail) then
Result := True;
end;
SKILL_FIRECHARM {13},
SKILL_HANGMAJINBUB {14},
SKILL_DEJIWONHO {15}: begin
boSpellFail := True;
if CheckAmulet(Self, 1, 1, nAmuletIdx) then begin
UseAmulet(Self, 1, 1, nAmuletIdx);
case wMagIdx of
SKILL_FIRECHARM {13}: begin //灵魂火符
if MagicManager.MagMakeFireCharm(Self,
UserMagic,
nTargetX,
nTargetY,
TargeTBaseObject) then Result := True;
end;
SKILL_HANGMAJINBUB {14}: begin //幽灵盾
nPower := GetAttackPower(GetPower13(60) + LoWord(m_WAbil.SC) * 10, SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) + 1);
if MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower, 1, True) > 0 then
Result := True;
end;
SKILL_DEJIWONHO {15}: begin //神圣战甲术
nPower := GetAttackPower(GetPower13(60) + LoWord(m_WAbil.SC) * 10, SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) + 1);
if MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower, 0, True) > 0 then
Result := True;
end;
end;
boSpellFail := False;
DelUseItem();
end;
end;
SKILL_GROUPAMYOUNSUL {38 群体施毒术}: begin
boSpellFail := True;
if CheckAmulet(Self, 1, 2, nAmuletIdx) then begin
UseAmulet(Self, 1, 2, nAmuletIdx);
if MagicManager.MagGroupAmyounsul(Self, UserMagic, nTargetX, nTargetY, TargeTBaseObject) then
Result := True;
boSpellFail := False;
DelUseItem();
end;
end;
SKILL_BIGHEALLING {29}: begin //群体治疗术
nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.SC) * 2,
SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) * 2 + 1);
if MagicManager.MagBigHealing(Self, nPower, nTargetX, nTargetY) then Result := True;
end;
end;
if boSpellFire then begin
SendRefMsg(RM_MAGICFIRE, 0,
MakeWord(UserMagic.MagicInfo.btEffectType, UserMagic.MagicInfo.btEffect),
MakeLong(nTargetX, nTargetY),
Integer(TargeTBaseObject),
'');
end;
end;
var
BaseObject: TBaseObject;
I: Integer;
nSpellPoint: Integer;
UserMagic: pTUserMagic;
nNewTargetX: Integer;
nNewTargetY: Integer;
begin
Result := False;
case wMagIdx of
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -