📄 magic.~pas
字号:
var
i, nDir, levelgap, push: integer;
BaseObject: TBaseObject;
begin
Result := 0;
for i:=0 to PlayObject.m_VisibleActors.Count-1 do begin
BaseObject:= TBaseObject (pTVisibleBaseObject(PlayObject.m_VisibleActors[i]).BaseObject);
if (abs(PlayObject.m_nCurrX-BaseObject.m_nCurrX) <= 1) and (abs(PlayObject.m_nCurrY-BaseObject.m_nCurrY) <= 1) then begin
if (not BaseObject.m_boDeath) and (BaseObject <> PlayObject) then begin
// if (PlayObject.m_Abil.Level > BaseObject.m_Abil.Level) and (not BaseObject.m_boStickMode) then begin
if ((PlayObject.m_Abil.Level > BaseObject.m_Abil.Level)or ((PlayObject.m_Abil.Level = BaseObject.m_Abil.Level)and(PlayObject.m_nfenghaolevel>BaseObject.m_nfenghaolevel)))
and (not BaseObject.m_boStickMode) then begin
levelgap := PlayObject.m_Abil.Level - BaseObject.m_Abil.Level;
if (Random(20) < 6 + nPushLevel * 3 + levelgap) then begin
if PlayObject.IsProperTarget(BaseObject) then begin
push := 1 + _MAX(0,nPushLevel - 1) + Random(2);
nDir:= GetNextDirection (PlayObject.m_nCurrX, PlayObject.m_nCurrY, BaseObject.m_nCurrX, BaseObject.m_nCurrY);
BaseObject.CharPushed (nDir, push);
Inc (Result);
end;
end;
end;
end;
end;
end;
end;
function TMagicManager.MagADDABILITY (PlayObject:TBaseObject;nLevel: integer;nType:integer): BOOLEAN;
var
BaseObject: TBaseObject;
begin
Result := false;
// if nLevel=0 then playobject.m_btSpeedPoint:=
// nType:=2;
IF (nType=0) then begin //and (not(PlayObject.m_boAbilMagPowerDefence)) 护身蒸气
// if PlayObject.m_wStatusTimeArr[STATE_14]>1 then exit;
PlayObject.m_wStatusTimeArr[STATE_14]:=100; // :TStatusTime; //0x60 //人物状态属性值,一般是持续多少秒
PlayObject.m_dwStatusArrTick[STATE_14]:=GetTickCount +24 *60 * 60 * 1000;
PlayObject.m_nCharStatus:=PlayObject.GetCharStatus();
PlayObject.StatusChanged();
// PlayObject.m_wStatusArrValue[6]:=100;
// PlayObject.m_dwStatusArrTimeOutTick[6]:=GetTickCount +24 *60 * 60 * 1000;
PlayObject.SendRefMsg(RM_29,0,100,100,154,'');
PlayObject.m_boAbilMagzqDefence :=true; //护身
PlayObject.m_btMagzqDefencelevel :=nLevel; // 级别
Result := true;
end;
IF (nType=1 ) then begin // and (not(PlayObject.m_boAbilMagzqDefence)) // 金刚护体
if PlayObject.m_wStatusArrValue[6]>1 then exit;
PlayObject.m_wStatusArrValue[6]:=100;
PlayObject.m_dwStatusArrTimeOutTick[6]:=GetTickCount +24 *60 * 60 * 1000;
PlayObject.SendRefMsg(RM_MAGADDABILTY,0,0, 0,0,''); //nType(cmd,wParam,w1, w2,w3,'')
PlayObject.SendRefMsg(RM_29,0,100,100,154,'');
PlayObject.m_boAbilMagPowerDefence:=true; //金刚护体
PlayObject.m_btMagPowerDefencelevel:=nLevel ;
Result := true;
end;
IF nType=2 then begin // 表示开风隐盾
if PlayObject.m_wStatusArrValue[7]>1 then exit;
PlayObject.m_wStatusArrValue[7]:=makeword(2+nLevel, 1); //防御点 魔法躲避点 //持续时间 秒
PlayObject.m_dwStatusArrTimeOutTick[7]:=GetTickCount + (80+nLevel *25) *1000; //80秒
PlayObject.SendRefMsg(RM_MAGADDABILTY,0,0, 0,0,''); //nType(cmd,wParam,w1, w2,w3,'') w1=2 表示开风隐盾
PlayObject.m_boAbilMagfyDefence :=true; //0x35C //fy盾
PlayObject.m_btMagfyDefenceLevel :=nLevel; //0x35D
Result := true;
end;
if Result then begin
PlayObject.RecalcAbilitys();
PlayObject.SendMsg(PlayObject,RM_ABILITY,0,0,0,0,'');
PlayObject.SendMsg(PlayObject,RM_SUBABILITY,0,0,0,0,'');
end;
end;
function TMagicManager.MagGroupjd(PlayObject:TBaseObject;nX,nY:integer): Boolean; //00492E50
var
i: integer;
BaseObjectList:TList;
BaseObject:TBaseObject;
begin
Result:=False;
BaseObjectList:= TList.Create;
PlayObject.GetMapBaseObjects (PlayObject.m_PEnvir,nX,nY,1, BaseObjectList);
for i:=0 to BaseObjectList.Count-1 do begin
BaseObject:= TBaseObject (BaseObjectList[i]);
if BaseObject=nil then continue;
if PlayObject.IsProperFriend (BaseObject) then begin
if BaseObject.m_wStatusTimeArr[POISON_DECHEALTH] <> 0 then begin
BaseObject.m_wStatusTimeArr[POISON_DECHEALTH]:=1;
end;
if BaseObject.m_wStatusTimeArr[POISON_DAMAGEARMOR] <> 0 then begin
BaseObject.m_wStatusTimeArr[POISON_DAMAGEARMOR]:=1;
end;
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagGroupsg(PlayObject:TBaseObject;nX,nY:integer): Boolean; //00492E50
var
i: integer;
BaseObjectList:TList;
BaseObject:TBaseObject;
begin
Result:=False;
BaseObjectList:= TList.Create;
PlayObject.GetMapBaseObjects (PlayObject.m_PEnvir,nX,nY,1, BaseObjectList);
for i:=0 to BaseObjectList.Count-1 do begin
BaseObject:= TBaseObject (BaseObjectList[i]);
if BaseObject=nil then continue;
if PlayObject.IsProperFriend (BaseObject) then begin
if BaseObject.m_wStatusTimeArr[POISON_DAOCAO1] <> 0 then begin
BaseObject.m_wStatusTimeArr[POISON_DAOCAO1]:=1;
end;
if BaseObject.m_wStatusTimeArr[POISON_DAOCAO2] <> 0 then begin
BaseObject.m_wStatusTimeArr[POISON_DAOCAO2]:=1;
end;
if BaseObject.m_wStatusTimeArr[POISON_STONE] <> 0 then begin
BaseObject.m_wStatusTimeArr[POISON_STONE]:=1;
end;
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagBigHealing (PlayObject:TBaseObject;nPower,nX,nY:integer): Boolean; //00492E50
var
i: integer;
BaseObjectList:TList;
BaseObject:TBaseObject;
begin
Result:=False;
BaseObjectList:= TList.Create;
PlayObject.GetMapBaseObjects (PlayObject.m_PEnvir,nX,nY,1, BaseObjectList);
for i:=0 to BaseObjectList.Count-1 do begin
BaseObject:= TBaseObject (BaseObjectList[i]);
if BaseObject=nil then continue;
if PlayObject.IsProperFriend (BaseObject) then begin
if BaseObject.m_WAbil.HP < BaseObject.m_WAbil.MaxHP then begin
BaseObject.SendDelayMsg (PlayObject,RM_MAGHEALING, 0, nPower, 0, 0, '', 800);
Result:=True;
end;
if PlayObject.m_boAbilSeeHealGauge then begin
PlayObject.SendMsg (BaseObject,RM_10414, 0, 0, 0, 0, ''); //?? RM_INSTANCEHEALGUAGE
end;
end;
end;
BaseObjectList.Free;
end;
constructor TMagicManager.Create;//0049214C
begin
end;
destructor TMagicManager.Destroy;
begin
inherited;
end;
function TMagicManager.IsWarrSkill(wMagIdx: Integer): Boolean; //492190
begin
Result:=False;
if wMagIdx in [3,7,12,25,26,27] then
//[SKILL_ONESWORD{3},SKILL_ILKWANG{4},SKILL_YEDO{7},SKILL_ERGUM{12},SKILL_BANWOL{25},SKILL_FIRESWORD{26},SKILL_MOOTEBO{27}] then
Result:=True;
end;
function TMagicManager.DoSpell(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject):Boolean; //0049350C
var
boTrain :Boolean;
boSpellFail :Boolean;
boSpellFire :Boolean;
n14 :Integer;
n18 :Integer;
n1C :Integer;
nPower :Integer;
StdItem :pTStdItem;
nAmuletIdx :Integer;
i:integer;
hum:Tplayobject;
// SpyFly:TSpyFly;
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:TPlayObject);
begin
if PlayObject.m_UseItems[U_ARMRINGL].Dura < 100 then begin
PlayObject.m_UseItems[U_ARMRINGL].Dura:=0;
PlayObject.SendDelItems(@PlayObject.m_UseItems[U_ARMRINGL]);
PlayObject.m_UseItems[U_ARMRINGL].wIndex:=0;
end;
end;
begin //0049350C
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;
// MainOutMessage('check 5 end:');
end;
// 人物发魔法的动作视觉效果
// MainOutMessage('开始使用魔法3:');
if UserMagic.MagicInfo.wMagicId in [78,79,80,81,83,85] then begin
if (PlayObject.Ysplayer<>nil) and(PlayObject.Ysplayer.nyuanqi<100) then exit;
// hum:=nil;
// hum:=UserEngine.GetPlayObjectEx(PlayObject.sYsname);
hum:=PlayObject.Ysplayer;
if hum<>nil then begin
hum.SendRefMsg(RM_SPELL,UserMagic.MagicInfo.btEffect,nTargetX,nTargetY,UserMagic.MagicInfo.wMagicId,'');
end;
end;
if not ( UserMagic.MagicInfo.wMagicId in [75,35,77]) then
PlayObject.SendRefMsg(RM_SPELL,UserMagic.MagicInfo.btEffect,nTargetX,nTargetY,UserMagic.MagicInfo.wMagicId,'');
if (TargeTBaseObject <> nil) and ((TargeTBaseObject.m_boDeath)and (UserMagic.MagicInfo.wMagicId<>46 )) then TargeTBaseObject:=nil;
boTrain:=False;
boSpellFail:=False;
boSpellFire:=True;
nPower:=0;
{
if boSpellFire then begin
PlayObject.SendRefMsg(RM_MAGICFIRE,0, //发魔法打中的效果
MakeWord(UserMagic.MagicInfo.btEffectType,UserMagic.MagicInfo.btEffect),
MakeLong(nTargetX,nTargetY),
Integer(TargeTBaseObject),
'');
end; }
// if (PlayObject.m_nSoftVersionDateEx = 0) and (PlayObject.m_dwClientTick = 0) and (UserMagic.MagicInfo.wMagicId > 40) then exit;
case UserMagic.MagicInfo.wMagicId of //
SKILL_FIREBALL{1},
SKILL_FIREBALL2{5}: begin //火球术 大火球
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
nPower:= GetAttackPower (GetPower(MPow(UserMagic)) + LoWord(m_WAbil.MC),
SmallInt(HiWord(m_WAbil.MC)-LoWord(m_WAbil.MC)) + 1);
//pwr := GetPower (MPow(UserMagic)) + (Lobyte(WAbil.MC) + Random(Hibyte(WAbil.MC)-Lobyte(WAbil.MC) + 1));
//鸥百 嘎澜, 饶俊 瓤苞唱鸥巢
//target.SendDelayMsg (user, RM_MAGSTRUCK, 0, pwr, 0, 0, '', 1200 + _MAX(Abs(CX-xx),Abs(CY-yy)) * 50 );
end;
//rm-delaymagic俊辑 selecttarget阑 贸府茄促.
PlayObject.SendDelayMsg (PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, integer(TargeTBaseObject), '', 600);
if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then boTrain:=True;
end else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -