📄 magic.~pas
字号:
unit Magic;
interface
uses
Windows,Classes,Grobal2,ObjBase,SDK,Event;
type
TMagicManager = class
private
function MagBigHealing(PlayObject:TBaseObject;nPower,nX,nY:integer): Boolean;
function MagGroupjd(PlayObject:TBaseObject;nX,nY:integer): Boolean;
function MagGroupsg(PlayObject:TBaseObject;nX,nY:integer): Boolean;
function MagPushArround(PlayObject:TBaseObject; nPushLevel: integer): integer;
function MagADDABILITY (PlayObject:TBaseObject;nLevel: integer;nType:integer): BOOLEAN;
function MagTurnUndead(BaseObject,TargeTBaseObject:TBaseObject;nTargetX,nTargetY:Integer;nLevel:Integer):Boolean;
function MagMakeHolyCurtain(BaseObject:TBaseObject;nPower:Integer;nX,nY:Integer):Integer;
function MagMakeGroupTransparent(BaseObject:TBaseObject;nX,nY:Integer;nHTime:Integer):Boolean;
function MagTamming(BaseObject,TargeTBaseObject:TBaseObject;nTargetX,nTargetY:Integer;nMagicLevel:Integer):Boolean;
function MagSaceMove(BaseObject:TBaseObject;nLevel:integer):Boolean;
function MagSpyMove(playObject: TplayObject;nTargetX,nTargetY: integer;btLevel:integer;ntype:integer): Boolean;
function MagYSzhskill78(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
function MagYSzhskill79(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
function MagYSzhskill80(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
function MagYSzhskill81(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
function MagYSzhskill83(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel,nPower: integer): Boolean;
function MagYSzhskill85(playObject:TplayObject;nTargetX,nTargetY:Integer;TargeTBaseObject:Tbaseobject;btlevel : integer): Boolean;
function MagMonMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;
function MagbaobaoMove(playObject:TplayObject;TargeTBaseObject:Tbaseobject;btlevel: integer): Boolean;
function MagMakeFireCross(PlayObject:TPlayObject;nDamage,nHTime,nX,nY:Integer):Integer;
function MagBigExplosion(BaseObject:TBaseObject;nPower,nHTime,nX,nY:Integer;nRage:Integer;ntype:Integer):Boolean;
function MagElecBlizzard(BaseObject:TBaseObject;nPower:integer):Boolean;
function MabMabe(BaseObject,TargeTBaseObject: TBaseObject;nPower,nLevel, nTargetX, nTargetY: Integer):Boolean;
function MagMakeSlave(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
function MagMakeshiling(PlayObject: TPlayObject;tx,ty:integer;TargeTBaseObject:Tbaseobject;UserMagic:pTUserMagic):Boolean;
function Maglinghunqiang(PlayObject: TPlayObject;tx,ty:integer;TargeTBaseObject:Tbaseobject;UserMagic:pTUserMagic):Boolean;
function MagMaketishen(PlayObject: TPlayObject;tx,ty:integer;UserMagic:pTUserMagic):Boolean;
function MagMakeSinSuSlave(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
function MagMakePowerSlave(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
function MagWindTebo(PlayObject:TPlayObject;UserMagic:pTUserMagic):Boolean;
function MagGroupLightening(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject; var boSpellFire:Boolean):Boolean;
function MagGroupwind(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject; var boSpellFire:Boolean):Boolean;
function MagGroupAmyounsul(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;
function MagGroupDeDing(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;
function MagGroupMb(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;
function MagHbFireBall(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;var TargeTBaseObject:TBaseObject):Boolean;
public
constructor Create();
destructor Destroy; override;
function MagMakePrivateTransparent(BaseObject:TBaseObject;nHTime:Integer):Boolean;
function IsWarrSkill(wMagIdx:Integer):Boolean;
function DoSpell(PlayObject:TPlayObject;UserMagic:pTUserMagic;nTargetX,nTargetY:Integer;TargeTBaseObject:TBaseObject):Boolean;
end;
THolyCurtainEventarr=array[0..7]of THolyCurtainEvent ;
TMagicEvent=record
BaseObjectList: TList ;
dwStartTick:LongWord;
dwTime:LongWord;
Events:THolyCurtainEventarr;
end;
pTMagicEvent=^TMagicEvent ;
function MPow(UserMagic:pTUserMagic):Integer;
function GetPower(nPower:Integer;UserMagic:pTUserMagic):Integer;
function GetPower13(nInt:Integer;UserMagic:pTUserMagic):Integer;
function GetRPow(wInt:Integer):Word;
function CheckAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer):Boolean;
procedure UseAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer);
implementation
uses HUtil32, M2Share, Envir;
function MPow(UserMagic:pTUserMagic):Integer;
begin
Result:=UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
end;
function GetPower(nPower:Integer;UserMagic:pTUserMagic):Integer;
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;UserMagic:pTUserMagic):Integer;
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;
//nType 为指定类型 1 为护身符 2 为毒药 3 稻草人
function CheckAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer):Boolean;
var
AmuletStdItem:pTStdItem;
nACrate:Integer;
begin
Result:=False;
Idx:=0;
nACrate:=100;
if PlayObject.m_UseItems[U_ARMRINGL].wIndex > 0 then begin
AmuletStdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGL].wIndex);
if AmuletStdItem.AC=1 then nACrate:=1;
if ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 25)) or ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 34)) then begin
case nType of
1: begin
if (AmuletStdItem.Shape = 5) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
Idx:=U_ARMRINGL;
Result:=True;
exit;
end;
end;
2: begin
if (AmuletStdItem.Shape <= 2) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
Idx:=U_ARMRINGL;
Result:=True;
exit;
end;
end;
3: begin // 稻草人
if (AmuletStdItem.Shape in[1,2]) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
Idx:=U_ARMRINGL;
Result:=True;
exit;
end;
end;
end;
end;
end;
nACrate:=100;
if PlayObject.m_UseItems[U_BUJUK].wIndex > 0 then begin
AmuletStdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_BUJUK].wIndex);
if AmuletStdItem.AC=1 then nACrate:=1;
if ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 25)) or ((AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 34)) then begin
case nType of //
1: begin
if (AmuletStdItem.Shape = 5) and (ROUND(PlayObject.m_UseItems[U_BUJUK].Dura / nACrate) >= nCount) then begin
Idx:=U_BUJUK;
Result:=True;
exit;
end;
end;
2: begin
if (AmuletStdItem.Shape <= 2) and (ROUND(PlayObject.m_UseItems[U_BUJUK].Dura / nACrate) >= nCount) then begin
Idx:=U_BUJUK;
Result:=True;
exit;
end;
end;
3: begin // 稻草人
if (AmuletStdItem.Shape in [1,2]) and (ROUND(PlayObject.m_UseItems[U_ARMRINGL].Dura / nACrate) >= nCount) then begin
Idx:=U_BUJUK;
Result:=True;
exit;
end;
end;
end;
end;
end;
end;
function Checktianxuan(PlayObject:TPlayObject):Boolean;
var
StdItem:pTStdItem;
res:integer;
toukui:boolean;
xianglian:boolean;
shouzuo:boolean;
jiezhi:boolean;
begin
Result:=False;
//res:=0;
toukui:=false;
xianglian:=false;
shouzuo:=false;
jiezhi:=false;
{ if PlayObject.m_UseItems[U_DRESSNAME].wIndex > 0 then begin //衣服
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_DRESSNAME].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 746) or (StdItem.looks = 747) then inc(res);
end;
end;}
if PlayObject.m_UseItems[U_HELMET].wIndex > 0 then begin //头盔
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_HELMET].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 602) then toukui:=true;
end;
end;
if PlayObject.m_UseItems[U_NECKLACE].wIndex > 0 then begin // = '项链'
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_NECKLACE].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 605) then xianglian:=true;
end;
end;
res:=0;
if PlayObject.m_UseItems[U_ARMRINGL].wIndex > 0 then begin // U_ARMRINGLNAME = '左手镯';
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGL].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 608) then inc(res);
end;
end;
if PlayObject.m_UseItems[U_ARMRINGR].wIndex > 0 then begin // U_ARMRINGRNAME = '右手镯';
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGR].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 608) then inc(res);
end;
end;
if res>0 then shouzuo:=true;
res:=0;
if PlayObject.m_UseItems[U_RINGL].wIndex > 0 then begin // U_RINGLNAME = '左戒指';
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_RINGL].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 611) then inc(res);
end;
end;
if PlayObject.m_UseItems[U_RINGR].wIndex > 0 then begin // U_RINGRNAME = '右戒指';
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_RINGR].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 611) then inc(res);
end;
end;
if res>0 then jiezhi:=true;
{ if PlayObject.m_UseItems[U_BELTNAME].wIndex > 0 then begin // = '腰带';
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_BELTNAME].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 689) then inc(res);
end;
end;
if PlayObject.m_UseItems[U_BOOTSNAME].wIndex > 0 then begin // = '鞋子';
StdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[U_BOOTSNAME].wIndex);
if (stdItem<>nil) then begin
if (StdItem.looks = 676) then inc(res);
end;
end; }
if toukui and xianglian and shouzuo and jiezhi then result:=true;
end; //
//nType 为指定类型 1 为护身符 2 为毒药
procedure UseAmulet(PlayObject:TPlayObject;nCount:Integer;nType:Integer;var Idx:Integer);
var AmuletStdItem:pTStdItem;
nACrate:Integer;
begin
nACrate:=100;
AmuletStdItem:=UserEngine.GetStdItem(PlayObject.m_UseItems[Idx].wIndex);
if (AmuletStdItem<>nil) and (AmuletStdItem.AC=1) then begin
nACrate:=1;
end;
if PlayObject.m_UseItems[Idx].Dura > nCount * nACrate then begin
Dec(PlayObject.m_UseItems[Idx].Dura,nCount * nACrate);
PlayObject.SendMsg(PlayObject,RM_DURACHANGE,Idx,PlayObject.m_UseItems[Idx].Dura,PlayObject.m_UseItems[Idx].DuraMax,0,'');
end else begin
PlayObject.m_UseItems[Idx].Dura:=0;
PlayObject.SendDelItems(@PlayObject.m_UseItems[Idx]);
PlayObject.m_UseItems[Idx].wIndex:=0;
end;
end;
function TMagicManager.MagPushArround (PlayObject:TBaseObject;nPushLevel: integer): integer; //00492204
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -