📄 magic.pas
字号:
end else begin //00492615
if (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) and (Random(20) = 0) then
TargeTBaseObject.m_WAbil.HP:=0;
end;
end else begin //00492641
if not (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) and (Random(20) = 0) then
TargeTBaseObject.OpenCrazyMode(Random(20) + 10);
end;
end else begin //00492674
if not (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) then
TargeTBaseObject.OpenCrazyMode(Random(20) + 10); //变红
end;
end; //004926B0
end else begin //00492699
TargeTBaseObject.OpenHolySeizeMode((nMagicLevel * 5 + 10) * 1000);
end;
Result:=True;
end;
end else begin
if Random(1) = 0 then Result:=True; //2
end;
end;
function TMagicManager.MagTurnUndead(BaseObject, TargeTBaseObject: TBaseObject;
nTargetX, nTargetY, nLevel: Integer): Boolean; //004926D4
var
n14:Integer;
begin
Result:=False;
if TargeTBaseObject.m_boSuperMan or not (TargeTBaseObject.m_btLifeAttrib = LA_UNDEAD) then exit;
TAnimalObject(TargeTBaseObject).Struck{FFEC}(BaseObject);
if TargeTBaseObject.m_TargetCret = nil then begin
TAnimalObject(TargeTBaseObject).m_boRunAwayMode:=True;
TAnimalObject(TargeTBaseObject).m_dwRunAwayStart:=GetTickCount();
TAnimalObject(TargeTBaseObject).m_dwRunAwayTime:=10 * 1000;
end;
BaseObject.SetTargetCreat(TargeTBaseObject);
if (Random(2) + (BaseObject.m_Abil.Level - 1)) > TargeTBaseObject.m_Abil.Level then begin
if TargeTBaseObject.m_Abil.Level < g_Config.nMagTurnUndeadLevel then begin
n14:=BaseObject.m_Abil.Level - TargeTBaseObject.m_Abil.Level;
if Random(100) < ((nLevel shl 3) - nLevel + 15 + n14) then begin
TargeTBaseObject.SetLastHiter(BaseObject);
TargeTBaseObject.m_WAbil.HP:=0;
Result:=True;
end
end;
end; //004927CB
end;
{function TMagicManager.MagWindTebo(PlayObject: TPlayObject; // 狮子吼
UserMagic: pTUserMagic): Boolean;
var
PoseBaseObject:TBaseObject; // (PlayObject.m_Abil.Level > PoseBaseObject.m_Abil.Level)
begin
Result:=False;
PoseBaseObject:=PlayObject.GetPoseCreate;
// TbaseObject(PlayObject).m_btDirection :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY);
if (PoseBaseObject <> nil) and (PoseBaseObject <> PlayObject) and
(not PoseBaseObject.m_boDeath) and
(not PoseBaseObject.m_boGhost) and
(PlayObject.IsProperTarget(PoseBaseObject)) and
(not PoseBaseObject.m_boStickMode) then begin
if (abs(PlayObject.m_nCurrX - PoseBaseObject.m_nCurrX) <= 1) and
(abs(PlayObject.m_nCurrY - PoseBaseObject.m_nCurrY) <= 1) and
((PlayObject.m_Abil.Level > PoseBaseObject.m_Abil.Level) or ((PlayObject.m_Abil.Level = PoseBaseObject.m_Abil.Level)and(PlayObject.m_nfenghaolevel>PoseBaseObject.m_nfenghaolevel))) then begin
if Random(20) < UserMagic.btLevel * 6 + 6 + (PlayObject.m_Abil.Level - PoseBaseObject.m_Abil.Level) then begin
PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),_MAX(0,UserMagic.btLevel -1) + 2);
// if (PoseBaseObject.m_btRaceServer = RC_PLAYOBJECT) and (playobject.m_btRaceServer = RC_PLAYOBJECT) then begin
// PoseBaseObject.SetPKFlag(playobject);
// end;
// PoseBaseObject.SetLastHiter(PlayObject);
PoseBaseObject.StruckDamage(UserMagic.btLevel*2+5);
PoseBaseObject.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, PoseBaseObject.m_WAbil.HP, PoseBaseObject.m_WAbil.MaxHP,Integer(PlayObject),'');
if PoseBaseObject.m_btRaceServer <> RC_PLAYOBJECT then
PoseBaseObject.m_dwWalkTick := PoseBaseObject.m_dwWalkTick + 1000 //狮子 怪物卡位 1秒
else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
TPlayObject(PoseBaseObject).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime; //人物卡位 1。5
TbaseObject(PlayObject).m_btDirection :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY);
Result:=True;
end;
end;
end;
end;
}
function TMagicManager.MagWindTebo(PlayObject: TPlayObject; // 狮子吼
UserMagic: pTUserMagic): Boolean;
function CanWindTebo(BaseObject:TBaseObject):Boolean;//0x004C30B0
var
nC:Integer;
begin // (m_Abil.Level > BaseObject.m_Abil.Level)
Result:=False;
if (BaseObject <> nil) and
(not BaseObject.m_boDeath) and
(not BaseObject.m_boGhost) and
(PlayObject.IsProperTarget(BaseObject)) and
(not BaseObject.m_boStickMode) and
((PlayObject.m_Abil.Level > BaseObject.m_Abil.Level)or (PlayObject.m_Abil.Level = BaseObject.m_Abil.Level)and(PlayObject.m_nfenghaolevel>BaseObject.m_nfenghaolevel))
then begin
Result:=True;
end;
end;
var
PoseBaseObject,BaseObject_30:TBaseObject;
nX,nY,i:integer;
pushok:boolean;
begin
Result:=False;
pushok:=false;
if UserMagic.btLevel>=3 then begin
PoseBaseObject:=PlayObject.GetPoseCreate;
if CanWindTebo(PoseBaseObject) and
(abs(PlayObject.m_nCurrX - PoseBaseObject.m_nCurrX) <= 1) and
(abs(PlayObject.m_nCurrY - PoseBaseObject.m_nCurrY) <= 1) then begin
PlayObject.m_PEnvir.GetNextPosition(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PlayObject.m_btDirection,2,nX,nY);
BaseObject_30:=nil;
BaseObject_30:=PlayObject.m_PEnvir.GetMovingObject(nX,nY,True);
if BaseObject_30 =nil then begin
PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),4);
pushok:=true;
end;
if (BaseObject_30<>nil) and CanWindTebo(BaseObject_30) then begin
BaseObject_30.CharPushed(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,BaseObject_30.m_nCurrX,BaseObject_30.m_nCurrY),4);
PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),4);
pushok:=true;
end;
if pushok then begin
PoseBaseObject.StruckDamage(UserMagic.btLevel*2+5);
PoseBaseObject.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, PoseBaseObject.m_WAbil.HP, PoseBaseObject.m_WAbil.MaxHP,Integer(PlayObject),'');
if PoseBaseObject.m_btRaceServer <> RC_PLAYOBJECT then
PoseBaseObject.m_dwWalkTick := PoseBaseObject.m_dwWalkTick + 1000 //狮子 怪物卡位 1秒
else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
TPlayObject(PoseBaseObject).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime; //人物卡位 1。5
{ if BaseObject_30<>nil then begin
BaseObject_30.StruckDamage(UserMagic.btLevel*2+5);
BaseObject_30.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, BaseObject_30.m_WAbil.HP, BaseObject_30.m_WAbil.MaxHP,Integer(PlayObject),'');
if BaseObject_30.m_btRaceServer <> RC_PLAYOBJECT then
BaseObject_30.m_dwWalkTick := BaseObject_30.m_dwWalkTick + 1000 //狮子 怪物卡位 1秒
else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
TPlayObject(BaseObject_30).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime; //人物卡位 1。5
end; }
end; // if pushok then begin
end;
exit;
end;
PoseBaseObject:=PlayObject.GetPoseCreate;
// TbaseObject(PlayObject).m_btDirection :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY);
if (PoseBaseObject <> nil) and (PoseBaseObject <> PlayObject) and
(not PoseBaseObject.m_boDeath) and
(not PoseBaseObject.m_boGhost) and
(PlayObject.IsProperTarget(PoseBaseObject)) and
(not PoseBaseObject.m_boStickMode) then begin
if (abs(PlayObject.m_nCurrX - PoseBaseObject.m_nCurrX) <= 1) and
(abs(PlayObject.m_nCurrY - PoseBaseObject.m_nCurrY) <= 1) and
((PlayObject.m_Abil.Level > PoseBaseObject.m_Abil.Level)or (PlayObject.m_Abil.Level = PoseBaseObject.m_Abil.Level)and(PlayObject.m_nfenghaolevel>PoseBaseObject.m_nfenghaolevel)) then begin
if Random(20) < UserMagic.btLevel * 6 + 6 + (PlayObject.m_Abil.Level - PoseBaseObject.m_Abil.Level) then begin
PoseBaseObject.CharPushedX(GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY),_MAX(0,UserMagic.btLevel -1) + 2);
// if (PoseBaseObject.m_btRaceServer = RC_PLAYOBJECT) and (playobject.m_btRaceServer = RC_PLAYOBJECT) then begin
// PoseBaseObject.SetPKFlag(playobject);
// end;
// PoseBaseObject.SetLastHiter(PlayObject);
PoseBaseObject.StruckDamage(UserMagic.btLevel*2+5);
PoseBaseObject.SendRefMsg(RM_STRUCK,UserMagic.btLevel*2+5, PoseBaseObject.m_WAbil.HP, PoseBaseObject.m_WAbil.MaxHP,Integer(PlayObject),'');
if PoseBaseObject.m_btRaceServer <> RC_PLAYOBJECT then
PoseBaseObject.m_dwWalkTick := PoseBaseObject.m_dwWalkTick + 1000 //狮子 怪物卡位 1秒
else // TPlayObject(PoseBaseObject).MakePosion(POISON_STONE,1,0);
TPlayObject(PoseBaseObject).m_dwtuzhanMoveTick := GetTickCount() +g_Config.PushTEBOTime; //人物卡位 1。5
TbaseObject(PlayObject).m_btDirection :=GetNextDirection(PlayObject.m_nCurrX,PlayObject.m_nCurrY,PoseBaseObject.m_nCurrX,PoseBaseObject.m_nCurrY);
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.MagMonMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;
var nx,ny:integer;
begin
result:=false;
if TargeTBaseObject=nil then exit;
if PlayObject.IsProperTarget (TargeTBaseObject) and (PlayObject.m_Abil.Level > TargeTBaseObject.m_Abil.Level) then begin
if (Random(11) <= btLevel * 2+5) then begin
if (TargeTBaseObject.m_btRaceServer <> RC_PLAYOBJECT ) then begin //弓箭手 and (TargeTBaseObject.m_btRaceServer < 100)
playObject.GetFrontPosition(nX,nY);
if playObject.m_PEnvir.CanWalk(nX, nY,false) then begin
if TargeTBaseObject.m_PEnvir.DeleteFromMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject)=1 then begin
TargeTBaseObject.SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
TargeTBaseObject.m_nCurrX:=nx;
TargeTBaseObject.m_nCurrY:=ny;
TargeTBaseObject.m_PEnvir.AddToMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject); // ,500
// TargeTBaseObject.TurnTo( GetNextDirection(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,playObject.m_nCurrX,playObject.m_nCurrY) );
TargeTBaseObject.SendRefMsg(RM_TURN,GetNextDirection(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,playObject.m_nCurrX,playObject.m_nCurrY) ,TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,0,TargeTBaseObject.GetShowName);
// TargeTBaseObject.SpaceMove(TargeTBaseObject.m_sMapName,nx,ny,1);
result:=true;
end;
end;
// TargeTBaseObject.m_PEnvir.DeleteFromMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject);
// TargeTBaseObject.m_nCurrX:=playObject.m_nCurrX+1;
// TargeTBaseObject.m_nCurrY:=playObject.m_nCurrY+1;
// TargeTBaseObject.m_PEnvir.AddToMap(TargeTBaseObject.m_nCurrX,TargeTBaseObject.m_nCurrY,OS_MOVINGOBJECT,TargeTBaseObject); // ,500
end;
end else PlayObject.SysMsg('抓取能力不足',c_Red,t_Hint);
end;
end;
function TMagicManager.MagbaobaoMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;
var nx,ny:integer;
i:integer;
mon:TBaseObject;
p28:Pointer;
begin
p28:=nil;
result:=false;
if TargeTBaseObject=nil then
begin
playObject.GetFrontPosition(nX,nY);
if not playObject.m_PEnvir.CanWalk(nX, nY,false) then exit;
for i:=playObject.m_SlaveList.Count -1 downto 0 do begin
mon:= TBaseObject(playObject.m_SlaveList.Items[i]) ;
if not mon.m_bohorse then
begin
// if playObject.m_PEnvir.CanWalk(nX, nY,false) then begin
if mon.m_PEnvir.DeleteFromMap(mon.m_nCurrX,mon.m_nCurrY,OS_MOVINGOBJECT,mon)=1 then begin
mon.SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
mon.m_nCurrX:=nx;
mon.m_nCurrY:=ny;
mon.m_PEnvir:= playObject.m_PEnvir;
mon.SetTargetCreat(nil);
p28:=playObject.m_PEnvir.AddToMap(mon.m_nCurrX,mon.m_nCurrY,OS_MOVINGOBJECT,mon); // ,500
if p28<>nil then begin
case btlevel of
0: if mon.m_WAbil.HP*3 < mon.m_WAbil.MaxHP then mon.m_WAbil.HP:= mon.m_WAbil.MaxHP div 3;
1: if mon.m_WAbil.HP*2 < mon.m_WAbil.MaxHP then mon.m_WAbil.HP:= mon.m_WAbil.MaxHP div 2;
2: if mon.m_WAbil.HP < mon.m_WAbil.MaxHP*3 div 4 then mo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -