📄 magic.pas
字号:
(abs(PlayObject.m_nCurrY - PoseBaseObject.m_nCurrY) <= 1) and
(PlayObject.m_Abil.Level > PoseBaseObject.m_Abil.Level) then begin
if Random(20) < UserMagic.btLevel * 6 + 6 + (PlayObject.m_Abil.Level - PoseBaseObject.m_Abil.Level) then begin
PoseBaseObject.CharPushed(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),_MAX(0,UserMagic.btLevel -1) + 1);
Result:=True;
end;
end;
end;
end;
function TMagicManager.MagSaceMove(BaseObject: TBaseObject;
nLevel: integer): Boolean; //04927D8
var
Envir :TEnvirnoment;
PlayObject :TPlayObject;
begin
Result:=False;
if Random(11) < nLevel * 2 + 4 then begin
BaseObject.SendRefMsg(RM_SPACEMOVE_FIRE2,0,0,0,0,'');
if BaseObject is TPlayObject then begin
Envir:=BaseObject.m_PEnvir;
BaseObject.MapRandomMove(BaseObject.m_sHomeMap,1);
if (Envir <> BaseObject.m_PEnvir) and (BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
PlayObject:=TPlayObject(BaseObject);
PlayObject.m_boTimeRecall:=False;
end;
end;
Result:=True;
end; //00492899
end;
function TMagicManager.MagGroupAmyounsul(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
I :Integer;
BaseObjectList :TList;
BaseObject :TBaseObject;
nPower :Integer;
StdItem :TItem;
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 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(BaseObject.m_btAntiPoison + 7) <= 6 then begin
case StdItem.Shape of
1: begin
nPower:=GetPower13(40,UserMagic) + GetRPow(PlayObject.m_WAbil.SC) * 2;
BaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DECHEALTH{中毒类型 - 绿毒},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
end;
2: begin
nPower:=GetPower13(30,UserMagic) + GetRPow(PlayObject.m_WAbil.SC) * 2;
BaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DAMAGEARMOR{中毒类型 - 红毒},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
end;
end;
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) or (BaseObject.m_btRaceServer >= RC_ANIMAL) then
Result:=True;
//BaseObject.SetLastHiter(PlayObject);
//PlayObject.SetTargetCreat(BaseObject);
end;
end;
PlayObject.SetTargetCreat(BaseObject);
end;
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagGroupDeDing(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
I :Integer;
BaseObjectList :TList;
BaseObject :TBaseObject;
nPower :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
nPower:=PlayObject.GetAttackPower(LoWord(PlayObject.m_WAbil.DC),SmallInt((HiWord(PlayObject.m_WAbil.DC) - LoWord(PlayObject.m_WAbil.DC))));
if (Random(BaseObject.m_btSpeedPoint) >= PlayObject.m_btHitPoint) then begin
nPower:=0;
end;
if nPower > 0 then begin
nPower:=BaseObject.GetHitStruckDamage(PlayObject,nPower);
end;
if nPower > 0 then begin //004C21FC
BaseObject.StruckDamage(nPower);
PlayObject.SendDelayMsg(PlayObject,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),1,Integer(BaseObject),'',200);
end;
if BaseObject.m_btRaceServer >= RC_ANIMAL then
Result:=True;
end;
PlayObject.SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,1,'');
end;
BaseObjectList.Free;
end;
function TMagicManager.MagGroupLightening(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject;var boSpellFire:Boolean): Boolean;
var
I: Integer;
BaseObjectList:TList;
BaseObject:TBaseObject;
nPower:Integer;
begin
Result:=False;
boSpellFire:=False;
BaseObjectList:=TList.Create;
PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir,nTargetX,nTargetY,_MAX(1,UserMagic.btLevel),BaseObjectList);
PlayObject.SendRefMsg(RM_MAGICFIRE,0,
MakeWord(UserMagic.MagicInfo.btEffectType,UserMagic.MagicInfo.btEffect),
MakeLong(nTargetX,nTargetY),
Integer(TargeTBaseObject),
'');
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(10) >= BaseObject.m_nAntiMagic) then begin
nPower:=PlayObject.GetAttackPower(GetPower(MPow(UserMagic),UserMagic) + LoWord(PlayObject.m_WAbil.MC),
SmallInt(HiWord(PlayObject.m_WAbil.MC)-LoWord(PlayObject.m_WAbil.MC))+ 1);
if BaseObject.m_btLifeAttrib = LA_UNDEAD then
nPower:=ROUND(nPower * 1.5);
PlayObject.SendDelayMsg(PlayObject,RM_DELAYMAGIC,nPower,MakeLong(BaseObject.m_nCurrX,BaseObject.m_nCurrY),2,Integer(BaseObject),'',600);
if BaseObject.m_btRaceServer >= RC_ANIMAL then
Result:=True;
end;
if (BaseObject.m_nCurrX <> nTargetX) or (BaseObject.m_nCurrY <> nTargetY) then
PlayObject.SendRefMsg(RM_10205,0,BaseObject.m_nCurrX,BaseObject.m_nCurrY,4{type},'');
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagHbFireBall(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
var TargetBaseObject: TBaseObject): Boolean;
var
nPower :Integer;
nDir :Integer;
levelgap :Integer;
push :Integer;
begin
Result:=False;
if not PlayObject.MagCanHitTarget(PlayObject.m_nCurrX, PlayObject.m_nCurrY, TargetBaseObject) then begin
TargeTBaseObject := nil;
exit;
end;
if not PlayObject.IsProperTarget (TargeTBaseObject) then begin
TargeTBaseObject := nil;
exit;
end;
if (TargeTBaseObject.m_nAntiMagic > Random(10)) or (abs(TargeTBaseObject.m_nCurrX-nTargetX) > 1) or (abs(TargeTBaseObject.m_nCurrY-nTargetY) > 1) then begin
TargeTBaseObject := nil;
exit;
end;
with PlayObject do begin
nPower:= GetAttackPower(GetPower(MPow(UserMagic),UserMagic) + LoWord(m_WAbil.MC),
SmallInt(HiWord(m_WAbil.MC)-LoWord(m_WAbil.MC)) + 1);
end;
PlayObject.SendDelayMsg (PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '', 600);
if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then Result:=True;
if (PlayObject.m_Abil.Level > TargetBaseObject.m_Abil.Level) and (not TargetBaseObject.m_boStickMode) then begin
levelgap := PlayObject.m_Abil.Level - TargetBaseObject.m_Abil.Level;
if (Random(20) < 6 + UserMagic.btLevel * 3 + levelgap) then begin
push := Random(UserMagic.btLevel) - 1;
if push > 0 then begin
nDir:= GetNextDirection (PlayObject.m_nCurrX, PlayObject.m_nCurrY, TargetBaseObject.m_nCurrX, TargeTBaseObject.m_nCurrY);
PlayObject.SendDelayMsg (PlayObject, RM_DELAYPUSHED, nDir, MakeLong(nTargetX, nTargetY), push, Integer(TargeTBaseObject), '', 600);
end;
end;
end;
end;
//火墙
function TMagicManager.MagMakeFireCross(PlayObject: TPlayObject; nDamage,
nHTime, nX,nY: Integer): Integer; //00492C9C
var
FireBurnEvent:TFireBurnEvent;
ResourceString
sDisableInSafeZoneFireCross = '安全区不允许使用...';
begin
Result:=0;
if g_Config.boDisableInSafeZoneFireCross and PlayObject.InSafeZone(PlayObject.m_PEnvir,nX,nY) then begin
PlayObject.SysMsg(sDisableInSafeZoneFireCross,c_Red,t_Notice);
exit;
end;
if PlayObject.m_PEnvir.GetEvent(nX,nY-1) = nil then begin
FireBurnEvent:=TFireBurnEvent.Create(PlayObject,nX,nY-1,ET_FIRE,nHTime * 1000 ,nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //0492CFC x
if PlayObject.m_PEnvir.GetEvent(nX-1,nY) = nil then begin
FireBurnEvent:=TFireBurnEvent.Create(PlayObject,nX-1,nY,ET_FIRE,nHTime * 1000 ,nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //0492D4D
if PlayObject.m_PEnvir.GetEvent(nX,nY) = nil then begin
FireBurnEvent:=TFireBurnEvent.Create(PlayObject,nX,nY,ET_FIRE,nHTime * 1000 ,nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492D9C
if PlayObject.m_PEnvir.GetEvent(nX+1,nY) = nil then begin
FireBurnEvent:=TFireBurnEvent.Create(PlayObject,nX+1,nY,ET_FIRE,nHTime * 1000 ,nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492DED
if PlayObject.m_PEnvir.GetEvent(nX,nY+1) = nil then begin
FireBurnEvent:=TFireBurnEvent.Create(PlayObject,nX,nY+1,ET_FIRE,nHTime * 1000 ,nDamage);
g_EventManager.AddEvent(FireBurnEvent);
end; //00492E3E
Result:=1;
end;
function TMagicManager.MagBigExplosion(BaseObject: TBaseObject; nPower, nX,
nY: Integer; nRage: Integer): Boolean; //00492F4C
var
I :Integer;
BaseObjectList :TList;
TargeTBaseObject :TBaseObject;
begin
Result := False;
BaseObjectList := TList.Create;
BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir,nX,nY,nRage,BaseObjectList);
for I := 0 to BaseObjectList.Count - 1 do begin
TargeTBaseObject:=TBaseObject(BaseObjectList.Items[i]);
if BaseObject.IsProperTarget(TargeTBaseObject) then begin
BaseObject.SetTargetCreat(TargeTBaseObject);
TargeTBaseObject.SendMsg(BaseObject,RM_MAGSTRUCK,0,nPower,0,0,'');
Result:=True;
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagElecBlizzard(BaseObject: TBaseObject;
nPower: integer): Boolean; //00493010
var
I :Integer;
BaseObjectList :TList;
TargeTBaseObject :TBaseObject;
nPowerPoint :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 not (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) then begin
nPowerPoint:=nPower div 10;
end else nPowerPoint:=nPower;
if BaseObject.IsProperTarget(TargeTBaseObject) then begin
//BaseObject.SetTargetCreat(TargeTBaseObject);
TargeTBaseObject.SendMsg(BaseObject,RM_MAGSTRUCK,0,nPowerPoint,0,0,'');
Result:=True;
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagMakeHolyCurtain(BaseObject:TBaseObject;nPower:Integer;nX,nY:Integer): Integer; //004928C0
var
I :Integer;
BaseObjectList :TList;
TargeTBaseObject :TBaseObject;
MagicEvent :pTMagicEvent;
HolyCurtainEvent :THolyCurtainEvent;
begin
Result:=0;
if BaseObject.m_PEnvir.CanWalk(nX,nY,True) then begin
BaseObjectList:=TList.Create;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -