📄 magiceff.pas
字号:
unit magiceff;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grobal2, DxDraws, CliUtil, ClFunc, HUtil32, WIl;
const
MG_READY = 10;
MG_FLY = 6;
MG_EXPLOSION = 10;
READYTIME = 120;
EXPLOSIONTIME = 100;
FLYBASE = 10;
EXPLOSIONBASE = 170;
//EFFECTFRAME = 260;
MAXMAGIC = 10;
FLYOMAAXEBASE = 447;
THORNBASE = 2967;
ARCHERBASE = 2607;
ARCHERBASE2 = 272; //2609;
FLYFORSEC = 500;
FIREGUNFRAME = 6;
MAXEFFECT = 31;
EffectBase: array[0..MAXEFFECT-1] of integer = (
0, //0 拳堪厘
200, //1 雀汗贱
400, //2 陛碍拳堪厘
600, //3 鞠楷贱
0, //4 八堡
900, //5 拳堪浅
920, //6 拳堪规荤
940, //7 汾牢厘 //矫傈瓤苞绝澜
20, //8 碍拜, Magic2
940, //9 气混拌 //矫傈瓤苞绝澜
940, //10 措瘤盔龋 //矫傈瓤苞绝澜
940, //11 措瘤盔龋付 //矫傈瓤苞绝澜
0, //12 绢八贱
1380, //13 搬拌
1500, //14 归榜捧磊家券, 家券贱
1520, //15 篮脚贱
940, //16 措篮脚
1560, //17 傈扁面拜
1590, //18 鉴埃捞悼
1620, //19 瘤凯厘
1650, //20 拳堪气惯
1680, //21 措篮窍(傈扁欺咙)
0, //22 馆岿八过
0, //23 堪拳搬
0, //24 公怕焊
3960, //25 沤扁颇楷
1790, //26 措雀汗贱
0, //27 脚荐家券 Magic2
3880, //28 林贱狼阜
3920, //29 荤磊辣雀
3840 //30 葫汲浅
);
MAXHITEFFECT = 5;
HitEffectBase: array[0..MAXHITEFFECT-1] of integer = (
800, //0, 绢八贱
1410, //1 绢八贱
1700, //2 馆岿八过
3480, //3 堪拳搬, 矫累
3390 //4 堪拳搬 馆娄烙
);
MAXMAGICTYPE = 12;
type
TMagicType = (mtReady, mtFly, mtExplosion,
mtFlyAxe, mtFireWind, mtFireGun,
mtLightingThunder, mtThunder, mtExploBujauk,
mtBujaukGroundEffect, mtKyulKai, mtFlyArrow);
TUseMagicInfo = record
ServerMagicCode: integer;
MagicSerial: integer;
Target: integer; //recogcode
EffectType: TMagicType;
EffectNumber: integer;
TargX: integer;
TargY: integer;
Recusion: Boolean;
AniTime: integer;
end;
PTUseMagicInfo = ^TUseMagicInfo;
TMagicEff = class
Active: Boolean;
ServerMagicId: integer;
MagOwner: TObject;
TargetActor: TObject;
ImgLib: TWMImages;
EffectBase: integer;
MagExplosionBase: integer;
px, py: integer;
RX, RY: integer; // 甘狼 谅钎肺 券魂茄 谅钎
Dir16, OldDir16: byte;
TargetX, TargetY: integer; //鸥百狼 胶农赴 谅钎
TargetRx, TargetRy: integer; //鸥百狼 甘 谅钎
FlyX, FlyY, OldFlyX, OldFlyY: integer; //泅犁 谅钎
FlyXf, FlyYf: Real;
Repetition: Boolean; //局聪皋捞记 馆汗
FixedEffect: Boolean; //绊沥 局聪皋矫记
MagicType: integer;
NextEffect: TMagicEff;
ExplosionFrame: integer;
NextFrameTime: integer;
Light: integer;
private
start, curframe, frame: integer;
frametime: longword;
starttime: longword;
repeattime: longword; //馆汗 局聪皋捞记 矫埃 (-1: 拌加)
steptime: longword;
fireX, fireY: integer;
firedisX, firedisY, newfiredisX, newfiredisY: integer;
FireMyselfX, FireMyselfY: integer;
prevdisx, prevdisy: integer; //朝酒啊绰 瓤苞狼 格钎客狼 芭府
protected
procedure GetFlyXY (ms: integer; var fx, fy: integer);
public
constructor Create (id, effnum, sx, sy, tx, ty: integer; mtype: TMagicType; Recusion: Boolean; anitime: integer);
destructor Destroy; override;
function Run: Boolean; dynamic; //false:场车澜.
function Shift: Boolean; dynamic;
procedure DrawEff (surface: TDirectDrawSurface); dynamic;
end;
TFlyingAxe = class (TMagicEff)
FlyImageBase: integer;
ReadyFrame: integer;
public
constructor Create (id, effnum, sx, sy, tx, ty: integer; mtype: TMagicType; Recusion: Boolean; anitime: integer);
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TFlyingArrow = class (TFlyingAxe)
public
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TCharEffect = class (TMagicEff)
public
constructor Create (effbase, effframe: integer; target: TObject);
function Run: Boolean; override; //false:场车澜.
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TMapEffect = class (TMagicEff)
public
RepeatCount: integer;
constructor Create (effbase, effframe: integer; x, y: integer);
function Run: Boolean; override; //false:场车澜.
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TScrollHideEffect = class (TMapEffect)
public
constructor Create (effbase, effframe: integer; x, y: integer; target: TObject);
function Run: Boolean; override;
end;
TLightingEffect = class (TMagicEff)
public
constructor Create (effbase, effframe: integer; x, y: integer);
function Run: Boolean; override;
end;
TFireNode = record
x: integer;
y: integer;
firenumber: integer;
end;
TFireGunEffect = class (TMagicEff)
public
OutofOil: Boolean;
firetime: longword;
FireNodes: array[0..FIREGUNFRAME-1] of TFireNode;
constructor Create (effbase, sx, sy, tx, ty: integer);
function Run: Boolean; override;
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TThuderEffect = class (TMagicEff)
public
constructor Create (effbase, tx, ty: integer; target: TObject);
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TLightingThunder = class (TMagicEff)
public
constructor Create (effbase, sx, sy, tx, ty: integer; target: TObject);
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TExploBujaukEffect = class (TMagicEff)
public
constructor Create (effbase, sx, sy, tx, ty: integer; target: TObject);
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TBujaukGroundEffect = class (TMagicEff)
public
MagicNumber: integer;
BoGroundEffect: Boolean;
constructor Create (effbase, magicnumb, sx, sy, tx, ty: integer);
function Run: Boolean; override;
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
procedure GetEffectBase (mag, mtype: integer; var wimg: TWMImages; var idx: integer);
implementation
uses
ClMain, Actor, SoundUtil;
procedure GetEffectBase (mag, mtype: integer; var wimg: TWMImages; var idx: integer);
//function GetEffectBase (mag, mtype: integer): integer;
begin
wimg := nil;
idx := 0;
case mtype of
0: //老馆利牢 付过 矫累 橇贰烙
begin
case mag of
8, //碍拜
27: //脚荐家券
begin
wimg := FrmMain.WMagic2;
if mag in [0..MAXEFFECT-1] then
idx := EffectBase[mag];
end;
else
begin
wimg := FrmMain.WMagic;
if mag in [0..MAXEFFECT-1] then
idx := EffectBase[mag];
end;
end;
end;
1: //八过 瓤苞
begin
wimg := FrmMain.WMagic;
if mag in [0..MAXHITEFFECT-1] then begin
idx := HitEffectBase[mag];
end;
end;
end;
end;
constructor TMagicEff.Create (id, effnum, sx, sy, tx, ty: integer; mtype: TMagicType; Recusion: Boolean; anitime: integer);
var
tax, tay: integer;
begin
ImgLib := FrmMain.WMagic; //扁夯
case mtype of
mtReady:
begin
end;
mtFly,
mtBujaukGroundEffect,
mtExploBujauk:
begin
start := 0;
frame := 6;
curframe := start;
FixedEffect := FALSE;
Repetition := Recusion;
ExplosionFrame := 10;
end;
mtExplosion,
mtThunder,
mtLightingThunder:
begin
start := 0;
frame := -1;
ExplosionFrame := 10;
curframe := start;
FixedEffect := TRUE;
Repetition := FALSE;
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;
end;
ServerMagicId := id; //辑滚狼 ID
EffectBase := effnum;
TargetX := tx; // " target x
TargetY := ty; // " target y
fireX := sx; //金 困摹
fireY := sy; //
FlyX := sx; //朝酒啊绊 乐绰 困摹
FlyY := sy;
OldFlyX := sx;
OldFlyY := sy;
FlyXf := sx;
FlyYf := sy;
FireMyselfX := Myself.RX*UNITX + Myself.ShiftX;
FireMyselfY := Myself.RY*UNITY + Myself.ShiftY;
MagExplosionBase := EffectBase + EXPLOSIONBASE;
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;
frametime := GetTickCount;
starttime := GetTickCount;
steptime := GetTickCount;
RepeatTime := anitime;
Dir16 := GetFlyDirection16 (sx, sy, tx, ty);
OldDir16 := Dir16;
NextEffect := nil;
Active := 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -