📄 magic.pas
字号:
Result := True;
BaseObject.SetLastHiter(PlayObject);
PlayObject.SetTargetCreat(BaseObject);
end;
end;
end;
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagGroupDeDing(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject): Boolean;
var
i: Integer;
BaseObjectList: TList;
BaseObject: TBaseObject;
nPower: Integer;
begin
Result := False;
BaseObjectList := TList.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
nPower := PlayObject.GetAttackPower(LoWord(PlayObject.m_WAbil.DC), SmallInt((HiWord(PlayObject.m_WAbil.DC) - LoWord(PlayObject.m_WAbil.DC))));
if (Random(BaseObject.m_btSpeedPoint) >= PlayObject.m_btHitPoint) then begin
nPower := 0;
end;
if nPower > 0 then begin
nPower := BaseObject.GetHitStruckDamage(PlayObject, nPower);
end;
if nPower > 0 then begin //004C21FC
BaseObject.StruckDamage(nPower);
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 1, Integer(BaseObject), '', 200);
//PlayObject.SendMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 1, Integer(BaseObject), '');
end;
if BaseObject.m_btRaceServer >= RC_ANIMAL then
Result := True;
end;
PlayObject.SendRefMsg(RM_10205, 0, BaseObject.m_nCurrX, BaseObject.m_nCurrY, 1, '');
end;
BaseObjectList.Free;
end;
function TMagicManager.MagGroupLightening(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject; var boSpellFire: Boolean): Boolean;
var
i: Integer;
BaseObjectList: TList;
BaseObject: TBaseObject;
nPower: Integer;
begin
Result := False;
boSpellFire := False;
BaseObjectList := TList.Create;
PlayObject.GetMapBaseObjects(PlayObject.m_PEnvir, nTargetX, nTargetY, _MAX(1, UserMagic.btLevel), BaseObjectList);
PlayObject.SendRefMsg(RM_MAGICFIRE, 0,
MakeWord(UserMagic.MagicInfo.btEffectType, UserMagic.MagicInfo.btEffect),
MakeLong(nTargetX, nTargetY),
Integer(TargeTBaseObject),
'');
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 (Random(10) >= BaseObject.m_nAntiMagic) then begin
nPower := PlayObject.GetAttackPower(GetPower(MPow(UserMagic), UserMagic) + LoWord(PlayObject.m_WAbil.MC),
SmallInt(HiWord(PlayObject.m_WAbil.MC) - LoWord(PlayObject.m_WAbil.MC)) + 1);
if BaseObject.m_btLifeAttrib = LA_UNDEAD then
nPower := ROUND(nPower * 1.5);
PlayObject.SendDelayMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 2, Integer(BaseObject), '', 600);
//PlayObject.SendMsg(PlayObject, RM_DELAYMAGIC, nPower, MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 2, Integer(BaseObject), '');
if PlayObject.m_btRaceServer = RC_PLAYMOSTER then Result := True
else if BaseObject.m_btRaceServer >= RC_ANIMAL then Result := True;
end;
if (BaseObject.m_nCurrX <> nTargetX) or (BaseObject.m_nCurrY <> nTargetY) then
PlayObject.SendRefMsg(RM_10205, 0, BaseObject.m_nCurrX, BaseObject.m_nCurrY, 4 {type}, '');
end;
end;
BaseObjectList.Free;
end;
function TMagicManager.MagLightening(PlayObject: TBaseObject {修改 TBaseObject};
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
TargeTBaseObject: TBaseObject; var boSpellFire: Boolean): Boolean;
var
boSpellFail: Boolean;
nPower: Integer;
StdItem: pTStdItem;
nAmuletIdx: Integer;
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;
begin //施毒术
Result := False;
boSpellFail := True;
if PlayObject.IsProperTarget(TargeTBaseObject) 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(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_DECHEALTH {中毒类型 - 绿毒}, 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_DAMAGEARMOR {中毒类型 - 红毒}, 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
Result := True;
end;
PlayObject.SetTargetCreat(TargeTBaseObject);
boSpellFail := False;
end;
end;
end;
end;
function TMagicManager.MagHbFireBall(PlayObject: TPlayObject;
UserMagic: pTUserMagic; nTargetX, nTargetY: Integer;
var TargeTBaseObject: TBaseObject): Boolean;
var
nPower: Integer;
nDir: Integer;
levelgap: Integer;
push: Integer;
begin
Result := False;
if not PlayObject.MagCanHitTarget(PlayObject.m_nCurrX, PlayObject.m_nCurrY, TargeTBaseObject) then begin
TargeTBaseObject := nil;
Exit;
end;
if not PlayObject.IsProperTarget(TargeTBaseObject) then begin
TargeTBaseObject := nil;
Exit;
end;
if (TargeTBaseObject.m_nAntiMagic > Random(10)) or (abs(TargeTBaseObject.m_nCurrX - nTargetX) > 1) or (abs(TargeTBaseObject.m_nCurrY - nTargetY) > 1) then begin
TargeTBaseObject := nil;
Exit;
end;
with PlayObject do begin
nPower := GetAttackPower(GetPower(MPow(UserMagic), 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;
if (PlayObject.m_Abil.Level > TargeTBaseObject.m_Abil.Level) and (not TargeTBaseObject.m_boStickMode) then begin
levelgap := PlayObject.m_Abil.Level - TargeTBaseObject.m_Abil.Level;
if (Random(20) < 6 + UserMagic.btLevel * 3 + levelgap) then begin
push := Random(UserMagic.btLevel) - 1;
if push > 0 then begin
nDir := GetNextDirection(PlayObject.m_nCurrX, PlayObject.m_nCurrY, TargeTBaseObject.m_nCurrX, TargeTBaseObject.m_nCurrY);
PlayObject.SendDelayMsg(PlayObject, RM_DELAYPUSHED, nDir, MakeLong(nTargetX, nTargetY), push, Integer(TargeTBaseObject), '', 600);
//PlayObject.SendMsg(PlayObject, RM_DELAYPUSHED, nDir, MakeLong(nTargetX, nTargetY), push, Integer(TargeTBaseObject), '');
end;
end;
end;
end;
//产生任意形状的火
function TMagicManager.MagMakeSuperFireCross(PlayObject: TPlayObject; nDamage,
nHTime, nX, nY: Integer; nCount: Integer): Integer;
function MagMakeSuperFireCrossOfDir(btDir: Integer): Integer;
var
FireBurnEvent: TFireBurnEvent;
i, ii, x, y: Integer;
nTime: Integer;
x1, x2, y1, y2: string;
begin
Result := 0;
nTime := 1;
case btDir of
DR_UP: begin
for y := PlayObject.m_nCurrY downto PlayObject.m_nCurrY - 10 do begin
FireBurnEvent := TFireBurnEvent.Create(PlayObject, PlayObject.m_nCurrX, y, ET_FIRE, nHTime * nTime, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
DR_UPRIGHT: begin
for i := 0 to 6 do begin
x := PlayObject.m_nCurrX + i;
y := PlayObject.m_nCurrY - i;
FireBurnEvent := TFireBurnEvent.Create(PlayObject, x, y, ET_FIRE, nHTime * nTime * 2, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
DR_RIGHT: begin
for x := PlayObject.m_nCurrX to PlayObject.m_nCurrX + 10 do begin
FireBurnEvent := TFireBurnEvent.Create(PlayObject, x, PlayObject.m_nCurrY, ET_FIRE, nHTime * nTime, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
DR_DOWNRIGHT: begin
for i := 0 to 6 do begin
x := PlayObject.m_nCurrX + i;
y := PlayObject.m_nCurrY + i;
FireBurnEvent := TFireBurnEvent.Create(PlayObject, x, y, ET_FIRE, nHTime * nTime * 2, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
DR_DOWN: begin
for y := PlayObject.m_nCurrY to PlayObject.m_nCurrY + 10 do begin
FireBurnEvent := TFireBurnEvent.Create(PlayObject, PlayObject.m_nCurrX, y, ET_FIRE, nHTime * nTime, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
DR_DOWNLEFT: begin
for i := 0 to 6 do begin
x := PlayObject.m_nCurrX - i;
y := PlayObject.m_nCurrY + i;
FireBurnEvent := TFireBurnEvent.Create(PlayObject, x, y, ET_FIRE, nHTime * nTime * 2, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
DR_LEFT: begin
for x := PlayObject.m_nCurrX downto PlayObject.m_nCurrX - 10 do begin
FireBurnEvent := TFireBurnEvent.Create(PlayObject, x, PlayObject.m_nCurrY, ET_FIRE, nHTime * nTime, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
DR_UPLEFT: begin
for i := 0 to 6 do begin
x := PlayObject.m_nCurrX - i;
y := PlayObject.m_nCurrY - i;
FireBurnEvent := TFireBurnEvent.Create(PlayObject, x, y, ET_FIRE, nHTime * nTime * 2, nDamage);
g_EventManager.AddEvent(FireBurnEvent);
Inc(nTime);
end;
end;
end;
Result := 1;
end;
var
i: Integer;
begin
Result := 0;
case nCount of
1: begin
Result := MagMakeSuperFireCrossOfDir(PlayObject.m_btDirection);
end;
3: begin
case PlayObject.m_btDirection of
DR_UP: begin
Result := MagMakeSuperFireCrossOfDir(PlayObject.m_btDirection);
Result := MagMakeSuperFireCrossOfDir(DR_UPRIGHT);
Result := MagMakeSuperFireCrossOfDir(DR_UPLEFT);
end;
DR_UPRIGHT: begin
Result := MagMakeSuperFireCrossOfDir(PlayObject.m_btDirection);
Result := MagMakeSuperFireCrossOfDir(DR_UP);
Result := MagMakeSu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -