📄 magiceff.pas
字号:
EffectBase:=140;
end;
bt81:=1;
end;
if id = 82 then begin
ImgLib:=FrmMain.WDragonImg;
if (g_MySelf.m_nCurrX >= 78) and (g_MySelf.m_nCurrY >= 48) then begin
EffectBase:=150;
end else begin
EffectBase:=160;
end;
bt81:=2;
end;
if id = 83 then begin
ImgLib:=FrmMain.WDragonImg;
EffectBase:=180;
bt81:=3;
end;
start:=0;
frame:=10;
MagExplosionBase:=200;
ExplosionFrame:=10;
end;
end;
mt12: begin
start:=0;
frame:=6;
curframe:=start;
FixedEffect:=False;
Repetition:=Recusion;
ExplosionFrame:=1;
end;
mt13: begin
start:=0;
frame:=20;
curframe:=start;
FixedEffect:=True;
Repetition:=False;
ExplosionFrame:=20;
ImgLib:=FrmMain.WMon21Img;
end;
mtExplosion,mtThunder,mtLightingThunder,mtRedThunder,mtLava: begin
start := 0;
frame := -1;
ExplosionFrame := 10;
curframe := start;
FixedEffect := TRUE;
Repetition := FALSE;
if id = 91 then begin
bt80:=2;
frame:=20;
EffectBase:=440;
//MagExplosionBase:=470;
//ExplosionFrame:=20;
//EffectFrame:=10;
end;
if id = 80 then begin
bt80:=2;
case Random(6) of
0:begin
EffectBase:=230;
end;
1:begin
EffectBase:=240;
end;
2:begin
EffectBase:=250;
end;
3:begin
EffectBase:=260;
end;
4:begin
EffectBase:=270;
end;
5:begin
EffectBase:=280;
end;
end;
Light:=4;
ExplosionFrame:=5;
frame:=5;
end;
if id = 70 then begin
bt80:=3;
case Random(3) of
0:begin
EffectBase:=400;
end;
1:begin
EffectBase:=410;
end;
2:begin
EffectBase:=420;
end;
end;
Light:=4;
ExplosionFrame:=5;
end;
if id = 71 then begin
bt80:=3;
ExplosionFrame:=20;
end;
if id = 72 then begin
bt80:=3;
Light:=3;
ExplosionFrame:=10;
end;
if id = 73 then begin
bt80:=3;
Light:=5;
ExplosionFrame:=20;
end;
if id = 74 then begin
bt80:=3;
Light:=4;
ExplosionFrame:=35;
end;
if id = 90 then begin
ImgLib:=FrmMain.WDragonImg;
EffectBase:=350;
MagExplosionBase:=350;
ExplosionFrame:=34;
bt80:=1;
end;
if id = 92 then begin
bt80:=2;
frame:=-1;
ImgLib:=g_WMagic2Images;
EffectBase:=0;
MagExplosionBase:=1250;
ExplosionFrame:=14;
end;
if id = 93 then begin
bt80:=2;
frame:=-1;
ImgLib:=g_WMagic2Images;
EffectBase:=0;
MagExplosionBase:=1280;
ExplosionFrame:=10;
end;
end;
mt14: begin
start:=0;
frame:=-1;
curframe:=start;
FixedEffect:=True;
Repetition:=False;
ImgLib:=g_WMagic2Images;
end;
mtFlyAxe: begin
start := 0;
frame := 3;
curframe := start;
FixedEffect := FALSE;
Repetition := Recusion;
ExplosionFrame := 3;
end;
mtFlyArrow: begin
start := 0;
frame := 1;
curframe := start;
FixedEffect := FALSE;
Repetition := Recusion;
ExplosionFrame := 1;
end;
mt15: begin
start := 0;
frame := 6;
curframe := start;
FixedEffect := FALSE;
Repetition := Recusion;
ExplosionFrame := 2;
end;
mt16: begin
start := 0;
frame := 1;
curframe := start;
FixedEffect := FALSE;
Repetition := Recusion;
ExplosionFrame := 1;
end;
end;
n7C:=0;
ServerMagicId := id; //ID
EffectBase := effnum; //MagicDB - Effect
TargetX := tx; // " target x
TargetY := ty; // " target y
if bt80 =1 then begin
{
if id = 81 then begin
dec(sx,14);
inc(sy,20);
end;
if id = 81 then begin
dec(sx,70);
dec(sy,10);
end;
if id = 83 then begin
dec(sx,60);
dec(sy,70);
end;
}
PlaySound(8208);
end;
fireX := sx; //
fireY := sy; //
FlyX := sx; //
FlyY := sy;
OldFlyX := sx;
OldFlyY := sy;
FlyXf := sx;
FlyYf := sy;
FireMyselfX := g_MySelf.m_nRx * UNITX + g_MySelf.m_nShiftX;
FireMyselfY := g_MySelf.m_nRy * UNITY + g_MySelf.m_nShiftY;
if bt80 = 0 then begin
MagExplosionBase := EffectBase + EXPLOSIONBASE;
end;
light := 1;
if fireX <> TargetX then tax := abs(TargetX-fireX)
else tax := 1;
if fireY <> TargetY then tay := abs(TargetY-fireY)
else tay := 1;
if abs(fireX-TargetX) > abs(fireY-TargetY) then begin
firedisX := Round((TargetX-fireX) * (500 / tax));
firedisY := Round((TargetY-fireY) * (500 / tax));
end else begin
firedisX := Round((TargetX-fireX) * (500 / tay));
firedisY := Round((TargetY-fireY) * (500 / tay));
end;
NextFrameTime := 50;
m_dwFrameTime := GetTickCount;
m_dwStartTime := GetTickCount;
steptime := GetTickCount;
RepeatTime := anitime;
Dir16 := GetFlyDirection16 (sx, sy, tx, ty);
OldDir16 := Dir16;
NextEffect := nil;
m_boActive := TRUE;
prevdisx := 99999;
prevdisy := 99999;
end;
destructor TMagicEff.Destroy;
begin
inherited Destroy;
end;
function TMagicEff.Shift: Boolean;
function OverThrough (olddir, newdir: integer): Boolean;
begin
Result := FALSE;
if abs(olddir-newdir) >= 2 then begin
Result := TRUE;
if ((olddir=0) and (newdir=15)) or ((olddir=15) and (newdir=0)) then
Result := FALSE;
end;
end;
var
i, rrx, rry, ms, stepx, stepy, newstepx, newstepy, nn: integer;
tax, tay, shx, shy, passdir16: integer;
crash: Boolean;
stepxf, stepyf: Real;
begin
Result := TRUE;
if Repetition then begin
if GetTickCount - steptime > longword(NextFrameTime) then begin
steptime := GetTickCount;
Inc (curframe);
if curframe > start+frame-1 then
curframe := start;
end;
end else begin
if (frame > 0) and (GetTickCount - steptime > longword(NextFrameTime)) then begin
steptime := GetTickCount;
Inc (curframe);
if curframe > start+frame-1 then begin
curframe := start+frame-1;
Result := FALSE;
end;
end;
end;
if (not FixedEffect) then begin
crash := FALSE;
if TargetActor <> nil then begin
ms := GetTickCount - m_dwFrameTime; //捞傈 瓤苞甫 弊赴饶 倔付唱 矫埃捞 汝范绰瘤?
m_dwFrameTime := GetTickCount;
//TargetX, TargetY 犁汲沥
PlayScene.ScreenXYfromMCXY (TActor(TargetActor).m_nRx,
TActor(TargetActor).m_nRy,
TargetX,
TargetY);
shx := (g_MySelf.m_nRx * UNITX + g_MySelf.m_nShiftX) - FireMyselfX;
shy := (g_MySelf.m_nRy * UNITY + g_MySelf.m_nShiftY) - FireMyselfY;
TargetX := TargetX + shx;
TargetY := TargetY + shy;
//货肺款 鸥百阑 谅钎甫 货肺 汲沥茄促.
if FlyX <> TargetX then tax := abs(TargetX-FlyX)
else tax := 1;
if FlyY <> TargetY then tay := abs(TargetY-FlyY)
else tay := 1;
if abs(FlyX-TargetX) > abs(FlyY-TargetY) then begin
newfiredisX := Round((TargetX-FlyX) * (500 / tax));
newfiredisY := Round((TargetY-FlyY) * (500 / tax));
end else begin
newfiredisX := Round((TargetX-FlyX) * (500 / tay));
newfiredisY := Round((TargetY-FlyY) * (500 / tay));
end;
if firedisX < newfiredisX then firedisX := firedisX + _MAX(1, (newfiredisX - firedisX) div 10);
if firedisX > newfiredisX then firedisX := firedisX - _MAX(1, (firedisX - newfiredisX) div 10);
if firedisY < newfiredisY then firedisY := firedisY + _MAX(1, (newfiredisY - firedisY) div 10);
if firedisY > newfiredisY then firedisY := firedisY - _MAX(1, (firedisY - newfiredisY) div 10);
stepxf := (firedisX/700) * ms;
stepyf := (firedisY/700) * ms;
FlyXf := FlyXf + stepxf;
FlyYf := FlyYf + stepyf;
FlyX := Round (FlyXf);
FlyY := Round (FlyYf);
//规氢 犁汲沥
// Dir16 := GetFlyDirection16 (OldFlyX, OldFlyY, FlyX, FlyY);
OldFlyX := FlyX;
OldFlyY := FlyY;
//烹苞咯何甫 犬牢窍扁 困窍咯
passdir16 := GetFlyDirection16 (FlyX, FlyY, TargetX, TargetY);
DebugOutStr (IntToStr(prevdisx) + ' ' + IntToStr(prevdisy) + ' / ' + IntToStr(abs(TargetX-FlyX)) + ' ' + IntToStr(abs(TargetY-FlyY)) + ' ' +
IntToStr(firedisX) + '.' + IntToStr(firedisY) + ' ' +
IntToStr(FlyX) + '.' + IntToStr(FlyY) + ' ' +
IntToStr(TargetX) + '.' + IntToStr(TargetY));
if ((abs(TargetX-FlyX) <= 15) and (abs(TargetY-FlyY) <= 15)) or
((abs(TargetX-FlyX) >= prevdisx) and (abs(TargetY-FlyY) >= prevdisy)) or
OverThrough(OldDir16, passdir16) then begin
crash := TRUE;
end else begin
prevdisx := abs(TargetX-FlyX);
prevdisy := abs(TargetY-FlyY);
//if (prevdisx <= 5) and (prevdisy <= 5) then crash := TRUE;
end;
OldDir16 := passdir16;
end else begin
ms := GetTickCount - m_dwFrameTime; //瓤苞狼 矫累饶 倔付唱 矫埃捞 汝范绰瘤?
rrx := TargetX - fireX;
rry := TargetY - fireY;
stepx := Round ((firedisX/900) * ms);
stepy := Round ((firedisY/900) * ms);
FlyX := fireX + stepx;
FlyY := fireY + stepy;
end;
PlayScene.CXYfromMouseXY (FlyX, FlyY, Rx, Ry);
if crash and (TargetActor <> nil) then begin
FixedEffect := TRUE; //气惯
start := 0;
frame := ExplosionFrame;
curframe := start;
Repetition := FALSE;
//磐瘤绰 荤款靛
PlaySound (TActor(MagOwner).m_nMagicExplosionSound);
end;
//if not Map.CanFly (Rx, Ry) then
// Result := FALSE;
end;
if FixedEffect then begin
if frame = -1 then frame := ExplosionFrame;
if TargetActor = nil then begin
FlyX := TargetX - ((g_MySelf.m_nRx * UNITX + g_MySelf.m_nShiftX) - FireMyselfX);
FlyY := TargetY - ((g_MySelf.m_nRy * UNITY + g_MySelf.m_nShiftY) - FireMyselfY);
PlayScene.CXYfromMouseXY (FlyX, FlyY, Rx, Ry);
end else begin
Rx := TActor(TargetActor).m_nRx;
Ry := TActor(TargetActor).m_nRy;
PlayScene.ScreenXYfromMCXY (Rx, Ry, FlyX, FlyY);
FlyX := FlyX + TActor(TargetActor).m_nShiftX;
FlyY := FlyY + TActor(TargetActor).m_nShiftY;
end;
end;
end;
procedure TMagicEff.GetFlyXY (ms: integer; var fx, fy: integer);
var
rrx, rry, stepx, stepy: integer;
begin
rrx := TargetX - fireX;
rry := TargetY - fireY;
stepx := Round ((firedisX/900) * ms);
stepy := Round ((firedisY/900) * ms);
fx := fireX + stepx;
fy := fireY + stepy;
end;
function TMagicEff.Run: Boolean;
begin
Result := Shift;
if Result then
if GetTickCount - m_dwStartTime > 10000 then //2000 then
Result := FALSE
else Result := TRUE;
end;
procedure TMagicEff.DrawEff (surface: TDirectDrawSurface);
var
img: integer;
d: TDirectDrawSurface;
shx, shy: integer;
begin
if m_boActive and ((Abs(FlyX-fireX) > 15) or (Abs(FlyY-fireY) > 15) or FixedEffect) then begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -