📄 magic.pas
字号:
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;
begin
Result := False;
if TargeTBaseObject = nil then begin
TargeTBaseObject := PlayObject;
nTargetX := PlayObject.m_nCurrX;
nTargetY := PlayObject.m_nCurrY;
end;
if PlayObject.IsProperFriend(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) + PlayObject.m_WAbil.Level;
if TargeTBaseObject.m_WAbil.HP < TargeTBaseObject.m_WAbil.MaxHP then begin
TargeTBaseObject.SendDelayMsg(PlayObject, RM_MAGHEALING, 0, nPower, 0, 0, '', 800);
//TargeTBaseObject.SendMsg(PlayObject, RM_MAGHEALING, 0, nPower, 0, 0, '');
Result := True;
end;
if PlayObject.m_boAbilSeeHealGauge then
PlayObject.SendMsg(TargeTBaseObject, RM_10414, 0, 0, 0, 0, '');
end;
end;
{地域火}
function TMagicManager.MagMakeHellFire(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
nPower: Integer;
n1C: Integer;
n14, n18: 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;
begin
Result := False;
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
Result := True;
end;
end;
{疾光电影}
function TMagicManager.MagMakeQuickLighting(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; var nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
nPower: Integer;
n1C: Integer;
n14, n18: 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;
begin
Result := False;
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
Result := True;
end;
end;
{雷电术}
function TMagicManager.MagMakeLighting(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
var TargeTBaseObject: TBaseObject): Boolean;
var
nPower: 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;
begin
Result := False;
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);
//PlayObject.SendMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '');
if (PlayObject.m_btRaceServer = RC_PLAYMOSTER) or (PlayObject.m_btRaceServer = RC_HEROOBJECT) then Result := True
else if TargeTBaseObject.m_btRaceServer >= RC_ANIMAL then Result := True;
end else TargeTBaseObject := nil
end else TargeTBaseObject := nil;
end;
{灵魂火符}
function TMagicManager.MagMakeFireCharm(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
var TargeTBaseObject: TBaseObject): Boolean;
var
nPower: 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;
begin
Result := False;
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);
//PlayObject.SendMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '');
if (PlayObject.m_btRaceServer = RC_PLAYMOSTER) or (PlayObject.m_btRaceServer = RC_HEROOBJECT) then Result := True
else if (PlayObject.m_btRaceServer = RC_PLAYOBJECT) and (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then Result := True;
end;
end;
end;
end else TargeTBaseObject := nil;
end;
{灭天火}
function TMagicManager.MagMakeFireDay(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
var TargeTBaseObject: TBaseObject): Boolean;
var
nPower: 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;
begin
Result := False;
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);
//PlayObject.SendMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '');
if g_Config.boPlayObjectReduceMP then TargeTBaseObject.DamageSpell(nPower);
if (PlayObject.m_btRaceServer = RC_PLAYMOSTER) or (PlayObject.m_btRaceServer = RC_HEROOBJECT) then Result := True
else if TargeTBaseObject.m_btRaceServer >= RC_ANIMAL then Result := True;
end else TargeTBaseObject := nil
end else TargeTBaseObject := nil;
end;
{解毒术}
function TMagicManager.MagMakeUnTreatment(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
var TargeTBaseObject: TBaseObject): Boolean;
begin
Result := False;
if TargeTBaseObject = nil then begin
TargeTBaseObject := PlayObject;
nTargetX := PlayObject.m_nCurrX;
nTargetY := PlayObject.m_nCurrY;
end;
if PlayObject.IsProperFriend {0FFF3}(TargeTBaseObject) then begin
if Random(7) - (UserMagic.btLevel + 1) < 0 then begin
if TargeTBaseObject.m_wStatusTimeArr[POISON_DECHEALTH] <> 0 then begin
TargeTBaseObject.m_wStatusTimeArr[POISON_DECHEALTH] := 1;
Result := True;
end;
if TargeTBaseObject.m_wStatusTimeArr[POISON_DAMAGEARMOR] <> 0 then begin
TargeTBaseObject.m_wStatusTimeArr[POISON_DAMAGEARMOR] := 1;
Result := True;
end;
if TargeTBaseObject.m_wStatusTimeArr[POISON_STONE] <> 0 then begin
TargeTBaseObject.m_wStatusTimeArr[POISON_STONE] := 1;
Result := True;
end;
end;
end;
end;
{复活术}
function TMagicManager.MagMakeLivePlayObject(PlayObject: TBaseObject; {修改 TBaseObject} UserMagic: pTUserMagic; TargeTBaseObject: TBaseObject): Boolean;
begin
Result := False;
if PlayObject.IsProperTargetSKILL_57(TargeTBaseObject) then begin
if (Random(10 + UserMagic.btLevel) + UserMagic.btLevel) >= 8 then begin
TPlayObject(TargeTBaseObject).ReAlive;
TPlayObject(TargeTBaseObject).m_WAbil.HP := TPlayObject(TargeTBaseObject).m_WAbil.MaxHP;
TPlayObject(TargeTBaseObject).SendMsg(TPlayObject(TargeTBaseObject), RM_ABILITY, 0, 0, 0, 0, '');
Result := True;
end;
end;
end;
{擒龙手}
function TMagicManager.MagMakeArrestObject(PlayObject: TBaseObject; {修改 TBaseObject} UserMagic: pTUserMagic; TargeTBaseObject: TBaseObject): Boolean;
var
nX, nY: Integer;
begin
Result := False;
if PlayObject.IsProperTargetSKILL_55(PlayObject.m_WAbil.Level, TargeTBaseObject) then begin
if (Random(10 + UserMagic.btLevel) + UserMagic.btLevel) >= 5 then begin
PlayObject.GetFrontPosition(nX, nY);
TargeTBaseObject.SpaceMove(TargeTBaseObject.m_PEnvir.sMapName, nX, nY, 0);
TargeTBaseObject.SendRefMsg(RM_MONMOVE, 0, nX, nY, 0, '');
Result := True;
end;
end;
end;
{移行换位}
function TMagicManager.MagChangePosition2(PlayObject: TBaseObject; {修改 TBaseObject} nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
var
I, nX, nY, olddir, oldx, oldy, nBackDir, nDir: Integer;
n01: Integer;
begin
Result := False;
n01 := 0;
if not PlayObject.m_boOnHorse then begin
// if PlayObject.IsProperTargetSKILL_56(TargeTBaseObject, nTargetX, nTargetY) then begin
//nDir := GetNextDirection(PlayObject.m_nCurrX, PlayObject.m_nCurrY, nTargetX, nTargetY);
PlayObject.SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
//PlayObject.SendRefMsg(RM_CHANGETURN, 0, 0, 0, 0, '');
PlayObject.SpaceMove(PlayObject.m_PEnvir.sMapName, nTargetX, nTargetY, 0);
Result := True;
//end;
end;
end;
{移行换位}
function TMagicManager.MagChangePosition(PlayObject: TBaseObject; nTargetX, nTargetY: Integer): Boolean;
var
I, nX, nY, olddir, oldx, oldy, nBackDir, nDir: Integer;
n01: Integer;
begin
Result := False;
n01 := 0;
if not PlayObject.m_boOnHorse then begin
if PlayObject.m_PEnvir.CanWalk(nTargetX, nTargetY, True) and (PlayObject.m_PEnvir.GetXYObjCount(nTargetX, nTargetY) = 0) then begin
PlayObject.SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
PlayObject.SpaceMove2(nTargetX, nTargetY, 0);
Result := True;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -