📄 magic.pas
字号:
unit Magic;
interface
uses
Windows, Classes, Grobal2, ObjBase, ObjHero, SysUtils;
type
TMagicManager = class
private
public
constructor Create();
destructor Destroy; override;
function MagMakePrivateTransparent(BaseObject: TBaseObject; nHTime: Integer): Boolean;
function IsWarrSkill(wMagIdx: Integer): Boolean;
function DoSpell(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagBigHealing(PlayObject: TBaseObject; nPower, nX, nY: Integer): Boolean;
function MagPushArround(PlayObject: TBaseObject; nPushLevel: Integer): Integer;
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 MagMakeFireCross(PlayObject: TBaseObject {修改 TBaseObject}; nDamage, nHTime, nX, nY: Integer): Integer;
function MagBigExplosion(BaseObject: TBaseObject; nPower, nX, nY: Integer; nRage: Integer): Boolean;
function MagElecBlizzard(BaseObject: TBaseObject {修改 TBaseObject}; nPower: Integer): Boolean;
function MabMabe(BaseObject, TargeTBaseObject: TBaseObject; nPower, nLevel, nTargetX, nTargetY: Integer): Boolean;
function MagMakeSlave(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic): Boolean;
function MagMakeSelf(BaseObject, TargeTBaseObject: TBaseObject; UserMagic: pTUserMagic): Boolean;
function MagMakeSinSuSlave(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic): Boolean;
function MagWindTebo(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic): Boolean;
function MagGroupLightening(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject; var boSpellFire: Boolean): Boolean;
function MagGroupAmyounsul(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagGroupDeDing(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagGroupMb(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagHbFireBall(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagReturn(BaseObject, TargeTBaseObject: TBaseObject; nTargetX, nTargetY, nMagicLevel: Integer): Boolean;
function MagMakeSlave_(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; sMonName: string; nCount, nHumLevel, nMonLevel: Integer): Boolean;
function MagLightening(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject; var boSpellFire: Boolean): Boolean;
function MagMakeSuperFireCross(PlayObject: TBaseObject {修改 TBaseObject}; nDamage, nHTime, nX, nY: Integer; nCount: Integer): Integer;
function MagMakeFireball(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagTreatment(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; var nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagMakeHellFire(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagMakeQuickLighting(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; var nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagMakeLighting(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagMakeFireCharm(PlayObject: TBaseObject { 修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagMakeUnTreatment(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagMakeLivePlayObject(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; TargeTBaseObject: TBaseObject): Boolean;
function MagMakeArrestObject(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; TargeTBaseObject: TBaseObject): Boolean;
function MagChangePosition(PlayObject: TBaseObject; nTargetX, nTargetY: Integer): Boolean;
function MagChangePosition2(PlayObject: TBaseObject {修改 TBaseObject}; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagMakeFireDay(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagGroupFengPo(PlayObject: TBaseObject {修改 TBaseObject}; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagTamming2(BaseObject, TargeTBaseObject: TBaseObject; nTargetX, nTargetY, nMagicLevel: Integer): Boolean;
function MagMakeSkillFire_60(PlayObject: TBaseObject; UserMagic: pTUserMagic; nPower: Integer): Boolean;
function MagMakeSkillFire_61(PlayObject: TBaseObject; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagMakeSkillFire_62(PlayObject: TBaseObject; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; var TargeTBaseObject: TBaseObject): Boolean;
function MagMakeSkillFire_63(PlayObject: TBaseObject; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagMakeSkillFire_64(PlayObject: TBaseObject; UserMagic: pTUserMagic; nTargetX, nTargetY: Integer; TargeTBaseObject: TBaseObject): Boolean;
function MagMakeSkillFire_65(BaseObject: TBaseObject; nPower: Integer): Boolean;
end;
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: TBaseObject { 修改 TBaseObject}; nCount: Integer; nType: Integer; var Idx: Integer): Boolean;
procedure UseAmulet(PlayObject: TBaseObject { 修改 TBaseObject}; nCount: Integer; nType: Integer; var Idx: Integer);
implementation
uses HUtil32, M2Share, Event, Envir, PlugIn;
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 为毒药
function CheckAmulet(PlayObject: TBaseObject {修改 TBaseObject}; nCount: Integer; nType: Integer; var Idx: Integer): Boolean;
var
AmuletStdItem: pTStdItem;
begin
Result := False;
Idx := 0;
if PlayObject.m_UseItems[U_ARMRINGL].wIndex > 0 then begin
AmuletStdItem := UserEngine.GetStdItem(PlayObject.m_UseItems[U_ARMRINGL].wIndex);
if (AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 25) then begin
case nType of
1: begin
if (AmuletStdItem.Shape = 5) and (Round(PlayObject.m_UseItems[U_ARMRINGL].Dura / 100) >= 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 / 100) >= nCount) then begin
Idx := U_ARMRINGL;
Result := True;
Exit;
end;
end;
end;
end;
end;
if PlayObject.m_UseItems[U_BUJUK].wIndex > 0 then begin
AmuletStdItem := UserEngine.GetStdItem(PlayObject.m_UseItems[U_BUJUK].wIndex);
if (AmuletStdItem <> nil) and (AmuletStdItem.StdMode = 25) then begin
case nType of //
1: begin
if (AmuletStdItem.Shape = 5) and (Round(PlayObject.m_UseItems[U_BUJUK].Dura / 100) >= 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 / 100) >= nCount) then begin
Idx := U_BUJUK;
Result := True;
Exit;
end;
end;
end;
end;
end;
end;
//nType 为指定类型 1 为护身符 2 为毒药
procedure UseAmulet(PlayObject: TBaseObject; nCount: Integer; nType: Integer; var Idx: Integer);
begin
if PlayObject.m_UseItems[Idx].Dura > nCount * 100 then begin
Dec(PlayObject.m_UseItems[Idx].Dura, nCount * 100);
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;
if PlayObject.m_btRaceServer = RC_PLAYOBJECT then
TPlayObject(PlayObject).SendDelItems(@PlayObject.m_UseItems[Idx]);
PlayObject.m_UseItems[Idx].wIndex := 0;
end;
end;
function TMagicManager.MagPushArround(PlayObject: TBaseObject; nPushLevel: Integer): Integer; //00492204
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
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.MagBigHealing(PlayObject: TBaseObject; nPower, nX, nY: Integer): Boolean;
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 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;
begin
end;
destructor TMagicManager.Destroy;
begin
inherited;
end;
{火球}
function TMagicManager.MagMakeFireball(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
var TargeTBaseObject: TBaseObject): Boolean;
var
nPower: Integer;
function MPow(UserMagic: pTUserMagic): Integer;
begin
Result := UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
end;
function GetPower(nPower: Integer): Integer;
begin
Result := Round(nPower / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1)) + (UserMagic.MagicInfo.btDefPower + Random(UserMagic.MagicInfo.btDefMaxPower - UserMagic.MagicInfo.btDefPower));
end;
begin
Result := False;
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);
end;
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '', 600);
//PlayObject.SendMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(nTargetX, nTargetY), 2, Integer(TargeTBaseObject), '');
if (TargeTBaseObject.m_btRaceServer >= RC_ANIMAL) then Result := True;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end else
TargeTBaseObject := nil;
end;
{治愈术}
function TMagicManager.MagTreatment(PlayObject: TBaseObject; {修改 TBaseObject}
UserMagic: pTUserMagic; var nTargetX, nTargetY: Integer;
var TargeTBaseObject: TBaseObject): Boolean;
var
nPower: Integer;
function MPow(UserMagic: pTUserMagic): Integer;
begin
Result := UserMagic.MagicInfo.wPower + Random(UserMagic.MagicInfo.wMaxPower - UserMagic.MagicInfo.wPower);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -