📄 magic.pas
字号:
RecalcAbilitys();
SendMsg(PlayObject, RM_ABILITY, 0, 0, 0, 0, '');
end;
// else
// SysMsg('道术增加' + InttoStr(nPower)+'秒', c_Green, t_Hint);
end;
end;
boTrain := True;
end;
SKILL_51:
begin //灵魂召唤术
boTrain := True;
end;
SKILL_52:
begin //诅咒术
boTrain := True;
end;
SKILL_53:
begin //灵魂召唤术
boTrain := True;
end;
SKILL_54:
begin //诅咒术
boTrain := True;
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),
'');
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 : TMyList;
TargeTBaseObject : TBaseObject;
begin
Result := False;
if BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] > 0 then
exit; //4930FE
BaseObjectList := TMyList.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.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_btRaceServer <> RC_PLAYOBJECT) 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(2) = 0 then
begin
if TargeTBaseObject.m_Abil.Level <= BaseObject.m_Abil.Level + 2 then
begin
if Random(3) = 0 then
begin
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;
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;
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(2) = 0 then
Result := True;
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;
begin
Result := False;
PoseBaseObject := PlayObject.GetPoseCreate;
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) then
begin
if Random(20) < UserMagic.btLevel * 6 + 6 + (PlayObject.m_Abil.Level -
PoseBaseObject.m_Abil.Level) then
begin
PoseBaseObject.CharPushed(GetNextDirection(PlayObject.m_nCurrX,
PlayObject.m_nCurrY, PoseBaseObject.m_nCurrX,
PoseBaseObject.m_nCurrY),
_MAX(0, UserMagic.btLevel - 1) + 1);
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.MagGroupAmyounsul(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
i : Integer;
BaseObjectList : TMyList;
BaseObject : TBaseObject;
nPower : Integer;
StdItem : pTStdItem;
nAmuletIdx : Integer;
begin
Result := False;
BaseObjectList := TMyList.create;
PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir, nTargetX, nTargetY, _MAX(1,
UserMagic.btLevel), BaseObjectList);
for i := 0 to BaseObjectList.Count - 1 do
begin
BaseObject := TBaseObject(BaseObjectList.Items[i]);
if BaseObject.m_boDeath or (BaseObject.m_boGhost) or (PlayObject =
BaseObject) then
Continue;
if PlayObject.IsProperTarget(BaseObject) then
begin
if CheckAmulet(PlayObject, 1, 2, nAmuletIdx) then
begin
StdItem :=
UserEngine.GetStdItem(PlayObject.m_UseItems[nAmuletIdx].wIndex);
if StdItem <> nil then
begin
UseAmulet(PlayObject, 1, 2, nAmuletIdx);
if Random(BaseObject.m_btAntiPoison + 7) <= 6 then
begin
case StdItem.Shape of
1:
begin
nPower := GetPower13(40, UserMagic) +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -