📄 magic.pas
字号:
end;
{破魂斩}
function TMagicManager.MagMakeSkillFire_60(PlayObject: TBaseObject; UserMagic: pTUserMagic; nPower: Integer): Boolean;
var
I: Integer;
BaseObjectList: TList;
TargeTBaseObject: TBaseObject;
nPowerValue: Integer;
begin
Result := False;
BaseObjectList := TList.Create;
PlayObject.GetDirectionBaseObjects(PlayObject.m_btDirection, 10, BaseObjectList);
for I := 0 to BaseObjectList.Count - 1 do begin
TargeTBaseObject := TBaseObject(BaseObjectList.Items[I]);
if PlayObject.IsProperTarget(TargeTBaseObject) then begin
PlayObject.SetTargetCreat(TargeTBaseObject);
nPowerValue := Round(nPower * (g_Config.nHeroAttackRate / 100));
TargeTBaseObject.SendMsg(PlayObject, RM_MAGSTRUCK, 0, nPowerValue, 0, 0, '');
PlayObject.SendRefMsg(RM_MAGICFIRE, 0,
MakeWord(UserMagic.MagicInfo.btEffectType, UserMagic.MagicInfo.btEffect),
MakeLong(TargeTBaseObject.m_nCurrX, TargeTBaseObject.m_nCurrY),
Integer(TargeTBaseObject),
'');
Result := True;
end;
end;
BaseObjectList.Free;
end;
//劈星斩
function TMagicManager.MagMakeSkillFire_61(PlayObject: 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 (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
case m_btJob of
2: nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.SC), SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) + 1) * 2;
0: nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.DC), SmallInt(HiWord(m_WAbil.DC) - LoWord(m_WAbil.DC)) + 1) * 2;
end;
end;
nPower := Round(nPower * (g_Config.nHeroAttackRate / 100));
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '', 600);
Result := True;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end;
//雷霆一击
function TMagicManager.MagMakeSkillFire_62(PlayObject: 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 (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
case m_btJob of
1: nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1);
0: nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.DC), SmallInt(HiWord(m_WAbil.DC) - LoWord(m_WAbil.DC)) + 1);
end;
end;
nPower := Round(nPower * (g_Config.nHeroAttackRate / 100));
TargeTBaseObject.MagDownHealth(0, (Random(10) + UserMagic.btLevel) * 2 + 1, nPower div 10 + 1);
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '', 600);
Result := True;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end;
//噬魂沼泽
function TMagicManager.MagMakeSkillFire_63(PlayObject: TBaseObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
I: Integer;
BaseObjectList: TList;
BaseObject: TBaseObject;
nPower: Integer;
StdItem: pTStdItem;
nAmuletIdx: Integer;
begin
Result := False;
BaseObjectList := TList.Create;
PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir, nTargetX, nTargetY, _MAX(1, UserMagic.btLevel), BaseObjectList);
for I := 0 to BaseObjectList.Count - 1 do begin
BaseObject := TBaseObject(BaseObjectList.Items[I]);
if BaseObject.m_boDeath or (BaseObject.m_boGhost) or (PlayObject = BaseObject) then Continue;
if PlayObject.IsProperTarget(BaseObject) then begin
//if Random(BaseObject.m_btAntiPoison + 7) <= 6 then begin
with PlayObject do begin
nPower := GetAttackPower(GetPower(MPow(UserMagic), UserMagic) + LoWord(m_WAbil.SC),
SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) + 1) * 2;
end;
nPower := Round(nPower * (g_Config.nHeroAttackRate / 100));
BaseObject.SendMsg(PlayObject, RM_MAGSTRUCK, 0, nPower, 0, 0, '');
nPower := (GetPower13(40, UserMagic) + GetRPow(PlayObject.m_WAbil.SC) * 2) * 2;
nPower := Round(nPower * (g_Config.nHeroAttackRate / 100));
BaseObject.SendDelayMsg(PlayObject, RM_POISON, POISON_DECHEALTH {中毒类型 - 绿毒}, nPower, Integer(PlayObject), Round(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)) {UserMagic.btLevel}, '', 1000);
BaseObject.SetLastHiter(PlayObject);
PlayObject.SetTargetCreat(BaseObject);
Result := True;
//end;
end;
end;
BaseObjectList.Free;
end;
//末日审判
function TMagicManager.MagMakeSkillFire_64(PlayObject: TBaseObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
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 (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
case m_btJob of
1: nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC), SmallInt(HiWord(m_WAbil.MC) - LoWord(m_WAbil.MC)) + 1) * 2;
2: nPower := GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(m_WAbil.SC), SmallInt(HiWord(m_WAbil.SC) - LoWord(m_WAbil.SC)) + 1) * 2;
end;
end;
nPower := Round(nPower * (g_Config.nHeroAttackRate / 100));
TargeTBaseObject.MagDownHealth(0, (Random(10) + UserMagic.btLevel) * 2 + 1, nPower div 10 + 1);
TargeTBaseObject.MagDownHealth(1, (Random(10) + UserMagic.btLevel) * 2 + 1, nPower div 10 + 1);
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '', 600);
Result := True;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end;
//火龙气焰
function TMagicManager.MagMakeSkillFire_65(BaseObject: TBaseObject;
nPower: Integer): Boolean;
var
I: Integer;
BaseObjectList: TList;
TargeTBaseObject: TBaseObject;
nPowerValue: Integer;
begin
Result := False;
BaseObjectList := TList.Create;
BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir, BaseObject.m_nCurrX, BaseObject.m_nCurrY, g_Config.nElecBlizzardRange {2}, BaseObjectList);
for I := 0 to BaseObjectList.Count - 1 do begin
TargeTBaseObject := TBaseObject(BaseObjectList.Items[I]);
if BaseObject.IsProperTarget(TargeTBaseObject) then begin
//BaseObject.SetTargetCreat(TargeTBaseObject);
nPowerValue := Round(nPower * 2 * (g_Config.nHeroAttackRate / 100));
TargeTBaseObject.SendMsg(BaseObject, RM_MAGSTRUCK, 0, nPowerValue, 0, 0, '');
Result := True;
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.IsWarrSkill(wMagIdx: Integer): Boolean; //是否是战士技能
begin
Result := False;
if wMagIdx in [SKILL_ONESWORD {3}, SKILL_ILKWANG {4}, SKILL_YEDO {7}, SKILL_ERGUM {12}, SKILL_BANWOL {25}, SKILL_FIRESWORD {26}, SKILL_MOOTEBO {27}, SKILL_40 {40}] then
Result := True;
end;
function TMagicManager.DoSpell(PlayObject: TBaseObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
boTrain: Boolean;
boSpellFail: Boolean;
boSpellFire: Boolean;
n14: Integer;
n18: Integer;
n1C: Integer;
nPower: Integer;
StdItem: pTStdItem;
nAmuletIdx: Integer;
nX: Integer;
nY: Integer;
nPowerRate: Integer;
nDelayTime: Integer;
nDelayTimeRate: Integer;
function MPow(UserMagic: pTUserMagic): Integer; //004921C8
begin
Result := UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
end;
function GetPower(nPower: Integer): Integer; //00493314
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; //0049338C
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;
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: TBaseObject);
begin
if PlayObject.m_UseItems[U_ARMRINGL].Dura < 100 then begin
PlayObject.m_UseItems[U_ARMRINGL].Dura := 0;
if PlayObject.m_btRaceServer = RC_PLAYOBJECT then begin
TPlayObject(PlayObject).SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
end else
if PlayObject.m_btRaceServer = RC_HEROOBJECT then begin
THeroObject(PlayObject).SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
end;
PlayObject.m_UseItems[U_ARMRINGL].wIndex := 0;
end;
end;
begin
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, '');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -