📄 magic.pas
字号:
UserMagic.MagicInfo.btDefPower)));
end;
function GetRPow(wInt: Integer): Word;
begin
if HiWord(wInt) > LoWord(wInt) then
begin
Result := Random(HiWord(wInt) - LoWord(wInt) + 1) + LoWord(wInt);
end
else
Result := LoWord(wInt);
end;
procedure sub_4934B4(PlayObject: TPlayObject);
begin
if PlayObject.m_UseItems[U_ARMRINGL].Dura < 100 then
begin
PlayObject.m_UseItems[U_ARMRINGL].Dura := 0;
PlayObject.SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
PlayObject.m_UseItems[U_ARMRINGL].wIndex := 0;
end;
end;
begin //0049350C
Result := False;
if IsWarrSkill(UserMagic.wMagIdx) then
exit;
if (abs(PlayObject.m_nCurrX - nTargetX) > g_Config.nMagicAttackRage) or
(abs(PlayObject.m_nCurrY - nTargetY) > g_Config.nMagicAttackRage) then
begin
exit;
end;
PlayObject.SendRefMsg(RM_SPELL, UserMagic.MagicInfo.btEffect, nTargetX,
nTargetY, UserMagic.MagicInfo.wMagicId, '');
if (TargeTBaseObject <> nil) and (TargeTBaseObject.m_boDeath) then
TargeTBaseObject := nil;
boTrain := False;
boSpellFail := False;
boSpellFire := True;
nPower := 0;
if (PlayObject.m_nSoftVersionDateEx = 0) and (PlayObject.m_dwClientTick = 0)
and (UserMagic.MagicInfo.wMagicId > 40) then
exit;
case UserMagic.MagicInfo.wMagicId of //
SKILL_FIREBALL {1},
SKILL_FIREBALL2 {5}:
begin //火球术 大火球
if PlayObject.MagCanHitTarget(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
TargeTBaseObject) then
begin
if PlayObject.IsProperTarget(TargeTBaseObject) then
begin
if (TargeTBaseObject.m_nAntiMagic <= Random(10)) and
(abs(TargeTBaseObject.m_nCurrX - nTargetX) <= 1) and
(abs(TargeTBaseObject.m_nCurrY - nTargetY) <= 1) then
begin
with PlayObject do
begin
nPower := GetAttackPower(GetPower(MPow(UserMagic)) +
LoWord(m_WAbil.MC),
SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1);
//pwr := GetPower (MPow(UserMagic)) + (Lobyte(WAbil.MC) + Random(Hibyte(WAbil.MC)-Lobyte(WAbil.MC) + 1));
//鸥百 嘎澜, 饶俊 瓤苞唱鸥巢
//target.SendDelayMsg (user, RM_MAGSTRUCK, 0, pwr, 0, 0, '', 1200 + _MAX(Abs(CX-xx),Abs(CY-yy)) * 50 );
end;
//rm-delaymagic俊辑 selecttarget阑 贸府茄促.
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower,
MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '',
600);
if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
boTrain := True;
end
else
TargeTBaseObject := nil;
end
else
TargeTBaseObject := nil;
end
else
TargeTBaseObject := nil;
end;
SKILL_HEALLING {2}:
begin
if TargeTBaseObject = nil then
begin
TargeTBaseObject := PlayObject;
nTargetX := PlayObject.m_nCurrX;
nTargetY := PlayObject.m_nCurrY;
end;
if PlayObject.IsProperFriend {0FFF3}(TargeTBaseObject) then
begin
nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
LoWord(PlayObject.m_WAbil.SC) * 2,
SmallInt(HiWord(PlayObject.m_WAbil.SC) -
LoWord(PlayObject.m_WAbil.SC)) * 2 + 1);
if TargeTBaseObject.m_WAbil.HP < TargeTBaseObject.m_WAbil.MaxHP then
begin
TargeTBaseObject.SendDelayMsg(PlayObject, RM_MAGHEALING, 0, nPower,
0, 0, '', 800);
boTrain := True;
end;
if PlayObject.m_boAbilSeeHealGauge then
PlayObject.SendMsg(TargeTBaseObject, RM_10414, 0, 0, 0, 0, '');
end;
end;
SKILL_AMYOUNSUL {6}:
begin //施毒术
(*
boSpellFail:=True;
if PlayObject.IsProperTarget(TargeTBaseObject) then begin
if PlayObject.m_UseItems[U_ARMRINGL].wIndex > 0 then begin
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGL].wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 25) and (StdItem.Shape <= 2) then begin
if PlayObject.m_UseItems[U_ARMRINGL].Dura >= 100 then begin
Dec(PlayObject.m_UseItems[U_ARMRINGL].Dura,100);
PlayObject.SendMsg(PlayObject,RM_DURACHANGE,5,PlayObject.m_UseItems[U_ARMRINGL].Dura,PlayObject.m_UseItems[U_ARMRINGL].DuraMax,0,'');
if Random(TargeTBaseObject.m_btAntiPoison + 7) <= 6 then begin
case StdItem.Shape of
1: begin //0493F94
nPower:=GetPower13(40) + GetRPow(PlayObject.m_WAbil.SC) * 2;
TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DECHEALTH{中毒类型 - 绿毒},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
end;
2: begin //00493FE9
nPower:=GetPower13(30) + GetRPow(PlayObject.m_WAbil.SC) * 2;
TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DAMAGEARMOR{中毒类型 - 红毒},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
end;
end; //0049403C
if (TargeTBaseObject.m_btRaceServer = RC_PLAYOBJECT) or (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
boTrain:=True;
end; //00494058
PlayObject.SetTargetCreat(TargeTBaseObject);
boSpellFail:=False;
end; //0049406B
if PlayObject.m_UseItems[U_ARMRINGL].Dura < 100 then begin
PlayObject.m_UseItems[U_ARMRINGL].Dura:=0;
PlayObject.SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
PlayObject.m_UseItems[U_ARMRINGL].wIndex:=0;
end;
end;
end;
end;
*)
boSpellFail := True;
if PlayObject.IsProperTarget(TargeTBaseObject) then
begin
if CheckAmulet(PlayObject, 1, 2, nAmuletIdx) then
begin
StdItem :=
UserEngine.GetStdItem(PlayObject.m_UseItems[nAmuletIdx].wIndex);
if StdItem <> nil then
begin
UseAmulet(PlayObject, 1, 2, nAmuletIdx);
if Random(TargeTBaseObject.m_btAntiPoison + 7) <= 6 then
begin
case StdItem.Shape of
1:
begin //0493F94
nPower := GetPower13(40) + GetRPow(PlayObject.m_WAbil.SC)
* 2;
TargeTBaseObject.SendDelayMsg(PlayObject, RM_POISON,
POISON_DECHEALTH {中毒类型 - 绿毒}, nPower,
Integer(PlayObject), ROUND(UserMagic.btLevel / 3 *
(nPower
/ g_Config.nAmyOunsulPoint)) {UserMagic.btLevel}, '',
1000);
end;
2:
begin //00493FE9
nPower := GetPower13(30) + GetRPow(PlayObject.m_WAbil.SC)
* 2;
TargeTBaseObject.SendDelayMsg(PlayObject, RM_POISON,
POISON_DAMAGEARMOR {中毒类型 - 红毒}, nPower,
Integer(PlayObject), ROUND(UserMagic.btLevel / 3 *
(nPower
/ g_Config.nAmyOunsulPoint)) {UserMagic.btLevel}, '',
1000);
end;
end; //0049403C
if (TargeTBaseObject.m_btRaceServer = RC_PLAYOBJECT) or
(TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
boTrain := True;
end; //00494058
PlayObject.SetTargetCreat(TargeTBaseObject);
boSpellFail := False;
end;
end; //0049406B
end;
end;
SKILL_FIREWIND {8}:
begin //抗拒火环 00493754
if MagPushArround(PlayObject, UserMagic.btLevel) > 0 then
boTrain := True;
end;
SKILL_FIRE {9}:
begin //地狱火 00493778
n1C := GetNextDirection(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
nTargetX, nTargetY);
if PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
PlayObject.m_nCurrY, n1C, 1, n14, n18) then
begin
PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
PlayObject.m_nCurrY, n1C, 5, nTargetX, nTargetY);
nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
LoWord(PlayObject.m_WAbil.MC),
SmallInt(HiWord(PlayObject.m_WAbil.MC) -
LoWord(PlayObject.m_WAbil.MC)) + 1);
if PlayObject.MagPassThroughMagic(n14, n18, nTargetX, nTargetY, n1C,
nPower, False) > 0 then
boTrain := True;
end;
end;
SKILL_SHOOTLIGHTEN {10}:
begin //疾光电影 0049386A
n1C := GetNextDirection(PlayObject.m_nCurrX, PlayObject.m_nCurrY,
nTargetX, nTargetY);
if PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
PlayObject.m_nCurrY, n1C, 1, n14, n18) then
begin
PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,
PlayObject.m_nCurrY, n1C, 8, nTargetX, nTargetY);
nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
LoWord(PlayObject.m_WAbil.MC),
SmallInt(HiWord(PlayObject.m_WAbil.MC) -
LoWord(PlayObject.m_WAbil.MC)) + 1);
if PlayObject.MagPassThroughMagic(n14, n18, nTargetX, nTargetY, n1C,
nPower, True) > 0 then
boTrain := True;
end;
end;
SKILL_LIGHTENING {11}:
begin //雷电术 0049395C
if PlayObject.IsProperTarget(TargeTBaseObject) then
begin
if (Random(10) >= TargeTBaseObject.m_nAntiMagic) then
begin
nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
LoWord(PlayObject.m_WAbil.MC),
SmallInt(HiWord(PlayObject.m_WAbil.MC) -
LoWord(PlayObject.m_WAbil.MC)) + 1);
if TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD then
nPower := ROUND(nPower * 1.5);
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower,
MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '',
600);
if TargeTBaseObject.m_btRaceServer >= RC_ANIMAL then
boTrain := True;
end
else
TargeTBaseObject := nil
end
else
TargeTBaseObject := nil;
end;
SKILL_FIRECHARM {13},
SKILL_HANGMAJINBUB {14},
SKILL_DEJIWONHO {15},
SKILL_HOLYSHIELD {16},
SKILL_SKELLETON {17},
SKILL_CLOAK {18},
SKILL_BIGCLOAK {19}:
begin //004940BC
boSpellFail := True;
if CheckAmulet(PlayObject, 1, 1, nAmuletIdx) then
begin
UseAmulet(PlayObject, 1, 1, nAmuletIdx);
{
if BaseObject.m_UseItems[U_ARMRINGL].Dura >= 100 then Dec(BaseObject.m_UseItems[U_ARMRINGL].Dura,100)
else BaseObject.m_UseItems[U_ARMRINGL].Dura:=0;
BaseObject.SendMsg(BaseObject,RM_DURACHANGE,U_ARMRINGL,BaseObject.m_UseItems[U_ARMRINGL].Dura,BaseObject.m_UseItems[U_ARMRINGL].DuraMax,0,'');
}
case UserMagic.MagicInfo.wMagicId of //
SKILL_FIRECHARM {13}:
begin //灵魂火符 0049415F
if PlayObject.MagCanHitTarget(PlayObject.m_nCurrX,
PlayObject.m_nCurrY, TargeTBaseObject) then
begin
if PlayObject.IsProperTarget(TargeTBaseObject) then
begin
if Random(10) >= TargeTBaseObject.m_nAntiMagic then
begin
if (abs(TargeTBaseObject.m_nCurrX - nTargetX) <= 1) and
(abs(TargeTBaseObject.m_nCurrY - nTargetY) <= 1) then
begin
nPower :=
PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) +
LoWord(PlayObject.m_WAbil.SC),
SmallInt(HiWord(PlayObject.m_WAbil.SC) -
LoWord(PlayObject.m_WAbil.SC)) + 1);
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC,
nPower, MakeLong(nTargetX, nTargetY), 2,
Integer(TargeTBaseObject), '', 1200);
if TargeTBaseObject.m_btRaceServer >= RC_ANIMAL then
boTrain := True;
end; //00494463
end; //00494463
end; //00494463
end
else
TargeTBaseObject := nil; //0049426D
end;
SKILL_HANGMAJINBUB {14}:
begin //幽灵盾 00494277
nPower := PlayObject.GetAttackPower(GetPower13(60) +
LoWord(PlayObject.m_WAbil.SC) * 10,
SmallInt(HiWord(PlayObject.m_WAbil.SC) -
LoWord(PlayObject.m_WAbil.SC)) + 1);
if PlayObject.MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower,
1) > 0 then
boTrain := True;
end;
SKILL_DEJIWONHO {15}:
begin //神圣战甲术 004942E5
nPower := PlayObject.GetAttackPower(GetPower13(60) +
LoWord(PlayObject.m_WAbil.SC) * 10,
SmallInt(HiWord(PlayObject.m_WAbil.SC) -
LoWord(PlayObject.m_WAbil.SC)) + 1);
if PlayObject.MagMakeDefenceArea(nTargetX, nTargetY, 3, nPower,
0) > 0 then
boTrain := True;
end;
SKILL_HOLYSHIELD {16}:
begin //捆魔咒 00494353
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -