📄 magic.pas
字号:
SKILL_66: begin //强化骷髅术
boSpellFail:=True;
if CheckAmulet(PlayObject,2,1,nAmuletIdx) then
begin
UseAmulet(PlayObject,2,1,nAmuletIdx);
if MagMakePowerSlave(PlayObject,UserMagic) then
begin
boTrain:=True;
end;
boSpellFail:=False;
end;
end;
SKILL_68:begin // 法之魄
boTrain:=True;
end;
SKILL_69:begin // 兽灵术
boTrain:=True;
end;
SKILL_70:begin //风影盾
if MagADDABILITY(PlayObject,UserMagic.btLevel,2) then boTrain:=True;
end;
SKILL_71:begin //狂龙紫电
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_72:begin //心灵召唤 道士
if MagbaobaoMove(PlayObject,TargeTBaseObject,UserMagic.btLevel) then
boTrain:=True;
end;
SKILL_73: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 MagBigExplosion(PlayObject,
nPower,
GetPower(10) + (Word(GetRPow(PlayObject.m_WAbil.MC)) shr 1),
nTargetX,
nTargetY,
g_Config.nSnowWindRange{1},73) then
boTrain:=True;
end;
74:begin // 擒龙手
if MagMonMove(PlayObject,TargeTBaseObject,UserMagic.btLevel) then
boTrain:=True;
end;
SKILL_77, SKILL_75, SKILL_35:begin //遁地 化身蝙蝠 移形换影
if MagSpyMove(PlayObject, nTargetX,nTargetY,UserMagic.btLevel,UserMagic.MagicInfo.wMagicId) then
begin
boTrain:=True;
boSpellFire:= false;
end
else
boSpellFail:=true;
end;
SKILL_78:begin //怒斩天下 //战战
if MagYSzhskill78(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,GetPower(MPow(UserMagic))) then begin
boTrain:=True;
end;
PlayObject.Ysplayer.nyuanqi:=0;
PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
end;
79: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 MagYSzhskill79(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,nPower) then
begin
boTrain:=True;
end;
PlayObject.Ysplayer.nyuanqi:=0;
PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
end;
80:begin //天女散花 道道
nPower:= PlayObject.GetAttackPower(GetPower(MPow(UserMagic)) + LoWord(PlayObject.m_WAbil.SC), SmallInt(HiWord(PlayObject.m_WAbil.SC)-LoWord(PlayObject.m_WAbil.SC))+ 1);
if MagYSzhskill80(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,nPower) then
begin
boTrain:=True;
end;
PlayObject.Ysplayer.nyuanqi:=0;
PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
end;
81:begin //迷光烈焰 战法
if MagYSzhskill81(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,GetPower(MPow(UserMagic))) then
begin
boTrain:=True;
end;
PlayObject.Ysplayer.nyuanqi:=0;
PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
end;
83:begin //火毒攻心剑 //战道 地面效果 26
if MagYSzhskill83(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel,GetPower(MPow(UserMagic))) then
begin
boTrain:=True;
end;
PlayObject.Ysplayer.nyuanqi:=0;
PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
end;
SKILL_85:begin //神之召唤 法道 ====
if MagYSzhskill85(PlayObject,nTargetX,nTargetY,TargeTBaseObject,UserMagic.btLevel) then
begin
boTrain:=True;
end;
PlayObject.Ysplayer.nyuanqi:=0;
PlayObject.Ysplayer.SendDefMessage(38417,0,0,100,0,'');
end;
82:begin
g_FunctionNPC.GotoLable(PlayObject,'@MagFunc82',False);
boTrain:=True;
end;
84:begin
g_FunctionNPC.GotoLable(PlayObject,'@MagFunc84',False);
boTrain:=True;
end;
34:begin
g_FunctionNPC.GotoLable(PlayObject,'@MagFunc34',False);
boTrain:=True;
end;
36:begin
g_FunctionNPC.GotoLable(PlayObject,'@MagFunc36',False);
boTrain:=True;
end;
45: begin //诅咒术
boSpellFail:=True;
if PlayObject.IsProperTarget(TargeTBaseObject) then
begin
if CheckAmulet(PlayObject,1,3,nAmuletIdx) then //检查稻草人的数量和位置 3表稻草人
begin
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[nAmuletIdx].wIndex);
if StdItem <> nil then
begin
UseAmulet(PlayObject,1,3,nAmuletIdx); //使用一个数量
if Random(TargeTBaseObject.m_btAntiPoison + 7) <= 6 then
begin
case StdItem.Shape of
1: begin
nPower:=GetPower13(40) + GetRPow(PlayObject.m_WAbil.SC) * 2;
TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DAOCAO1{蓝色- 雄性稻草人},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
end;
2: begin
nPower:=GetPower13(30) + GetRPow(PlayObject.m_WAbil.SC) * 2;
TargeTBaseObject.SendDelayMsg(PlayObject,RM_POISON,POISON_DAOCAO2{粉红色 - 雌性稻草人},nPower,Integer(PlayObject),ROUND(UserMagic.btLevel / 3 * (nPower / g_Config.nAmyOunsulPoint)){UserMagic.btLevel},'',1000);
end;
end;
if (TargeTBaseObject.m_btRaceServer = RC_PLAYOBJECT) or (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then
boTrain:=True;
end;
PlayObject.SetTargetCreat(TargeTBaseObject);
boSpellFail:=False;
end;
end;
end;
end;
end;
if boSpellFail then exit;
if boSpellFire then
begin
PlayObject.SendRefMsg(RM_MAGICFIRE,0, //发魔法打中的效果
MakeWord(UserMagic.MagicInfo.btEffectType,UserMagic.MagicInfo.btEffect),
MakeLong(nTargetX,nTargetY),
Integer(TargeTBaseObject),
'');
if UserMagic.MagicInfo.wMagicId in [78,79,80,81,83,85] then
begin
hum:=PlayObject.Ysplayer;
if hum<>nil then
begin
hum.SendRefMsg(RM_MAGICFIRE,0, //发魔法打中的效果
MakeWord(UserMagic.MagicInfo.btEffectType,UserMagic.MagicInfo.btEffect),
MakeLong(nTargetX,nTargetY),
Integer(TargeTBaseObject),
'');
end;
end;
end;
if (UserMagic.btLevel < 3) and (boTrain) then
begin
if UserMagic.MagicInfo.TrainLevel[UserMagic.btLevel] <= PlayObject.m_Abil.Level then
begin
PlayObject.TrainSkill(UserMagic,Random(3) + 1);
if not PlayObject.CheckMagicLevelup(UserMagic) then
begin
PlayObject.SendDelayMsg(PlayObject,RM_MAGIC_LVEXP,0,UserMagic.MagicInfo.wMagicId,UserMagic.btLevel,UserMagic.nTranPoint,'',1000);
end;
end;
end;
Result:=True;
end;
function TMagicManager.MagMakePrivateTransparent(BaseObject: TBaseObject; nHTime: Integer):Boolean; //004930E8
var
I :Integer;
BaseObjectList :TList;
TargeTBaseObject :TBaseObject;
begin
Result:=False;
if BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT{0x70}] > 0 then exit; //4930FE
BaseObjectList:=TList.Create;
BaseObject.GetMapBaseObjects(BaseObject.m_PEnvir,BaseObject.m_nCurrX,BaseObject.m_nCurrY,9,BaseObjectList);
for I := 0 to BaseObjectList.Count - 1 do begin
TargeTBaseObject:=TBaseObject(BaseObjectList.Items[i]);
if TargeTBaseObject=nil then continue;
if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) and (TargeTBaseObject.m_TargetCret = BaseObject) then begin
if (abs(TargeTBaseObject.m_nCurrX - BaseObject.m_nCurrX) > 1) or
(abs(TargeTBaseObject.m_nCurrY - BaseObject.m_nCurrY) > 1) or
(Random(2) = 0) then begin
TargeTBaseObject.m_TargetCret:=nil;
end;
end;
end;
BaseObjectList.Free;
BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT{0x70}]:=nHTime; //004931D2
BaseObject.m_nCharStatus:=BaseObject.GetCharStatus();
BaseObject.StatusChanged();
BaseObject.m_boHideMode:=True;
BaseObject.m_boTransparent:=True;
Result:=True;
end;
function TMagicManager.MagTamming(BaseObject, TargeTBaseObject: TBaseObject;
nTargetX, nTargetY, nMagicLevel: Integer): Boolean; //00492368
var
n14:Integer;
begin
Result:=False;
if TargeTBaseObject.m_boTishen then exit;
if (TargeTBaseObject.m_btRaceServer <> RC_PLAYOBJECT) and (TargeTBaseObject.m_btRaceServer <> RC_YSBJECT) and ((Random(4 - nMagicLevel) = 0)) then begin
TargeTBaseObject.m_TargetCret:=nil;
if TargeTBaseObject.m_Master = BaseObject then begin
TargeTBaseObject.OpenHolySeizeMode((nMagicLevel * 5 + 10) * 1000);
Result:=True;
end else begin
if Random(1) = 0 then begin //2
if TargeTBaseObject.m_Abil.Level <= BaseObject.m_Abil.Level + 2 then begin
if Random(2) = 0 then begin //3
if Random((BaseObject.m_Abil.Level + 20)) + (nMagicLevel * 5) > (TargeTBaseObject.m_Abil.Level + g_Config.nMagTammingTargetLevel{10}) then begin
if not(TargeTBaseObject.bo2C1) and
(TargeTBaseObject.m_btLifeAttrib = 0) and
(TargeTBaseObject.m_Abil.Level < g_Config.nMagTammingLevel{50}) and
(BaseObject.m_SlaveList.Count < g_Config.nMagTammingCount{(nMagicLevel + 2)}) then begin
n14:=TargeTBaseObject.m_WAbil.MaxHP div g_Config.nMagTammingHPRate{100};
if n14 <= 2 then n14:=2
else Inc(n14,n14);
if (TargeTBaseObject.m_Master <> BaseObject) and (Random(n14) = 0) then begin
TargeTBaseObject.BreakCrazyMode();
if TargeTBaseObject.m_Master <> nil then begin
TargeTBaseObject.m_WAbil.HP:=TargeTBaseObject.m_WAbil.HP div 10;
end;
TargeTBaseObject.m_Master:=BaseObject;
TargeTBaseObject.m_dwMasterRoyaltyTick:=LongWord((Random(BaseObject.m_Abil.Level * 2) + (nMagicLevel shl 2) * 5 + 20) * 60 * 1000) + GetTickCount;
if Tplayobject(BaseObject).m_Magic69skill <> nil then begin //兽灵术:06.01.23
case Tplayobject(BaseObject).m_Magic69skill.btLevel of
0:TargeTBaseObject.m_btSlaveExpLevel:=1;
1:TargeTBaseObject.m_btSlaveExpLevel:=2; //怪物等级
2:TargeTBaseObject.m_btSlaveExpLevel:=3;
3:TargeTBaseObject.m_btSlaveExpLevel:=4;
end;
if Tplayobject(BaseObject).m_Magic69skill.btLevel < 3 then begin
if Tplayobject(BaseObject).m_Magic69skill.MagicInfo.TrainLevel[Tplayobject(BaseObject).m_Magic69skill.btLevel] <= Tplayobject(BaseObject).m_Abil.Level then begin
Tplayobject(BaseObject).TrainSkill(Tplayobject(BaseObject).m_Magic69skill,Random(3) + 1);
if not Tplayobject(BaseObject).CheckMagicLevelup(Tplayobject(BaseObject).m_Magic69skill) then begin
Tplayobject(BaseObject).SendDelayMsg(Tplayobject(BaseObject),RM_MAGIC_LVEXP,0,Tplayobject(BaseObject).m_Magic69skill.MagicInfo.wMagicId,Tplayobject(BaseObject).m_Magic69skill.btLevel,Tplayobject(BaseObject).m_Magic69skill.nTranPoint,'',1000);
end;
end;
end;
end;
TargeTBaseObject.m_btSlaveMakeLevel:=nMagicLevel;
if TargeTBaseObject.m_dwMasterTick = 0 then TargeTBaseObject.m_dwMasterTick:=GetTickCount();
TargeTBaseObject.BreakHolySeizeMode();
if LongWord(1500 - nMagicLevel * 200) < LongWord(TargeTBaseObject.m_nWalkSpeed) then begin
TargeTBaseObject.m_nWalkSpeed:=1500 - nMagicLevel * 200;
end;
if LongWord(2000 - nMagicLevel * 200) < LongWord(TargeTBaseObject.m_nNextHitTime) then begin
TargeTBaseObject.m_nNextHitTime:=2000 - nMagicLevel * 200;
end;
TargeTBaseObject.RefShowName();
BaseObject.m_SlaveList.Add(TargeTBaseObject);
end else begin //004925F2
if Random(14) = 0 then TargeTBaseObject.m_WAbil.HP:=0;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -