📄 magiceff.pas
字号:
unit magiceff;
interface
uses
svn, 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;
TDBBASE = 210;
FLYFORSEC = 500;
FIREGUNFRAME = 6;
MAXEFFECT = 55{31};
EffectBase: array[0..MAXEFFECT-1] of integer = (
0,{1}
200,{2}
400,{3}
600,{4}
0,{5}
900,{6}
920,{7}
940,{8}
20,{9}
940,{10}
940,{11}
940,{12}
0,{13}
1380,{14}
1500,{15}
1520,{16}
940,{17}
1560,{18}
1590,{19}
1620,{20}
1650,{21}
1680,{22}
0,{23}
0,{24}
0,{25}
3960,{26}
1790,{27}
0,{28}
3880,{29}
3920,{30}
3840,{31}
0,{32}
40,{33}
130, {34}
160,{35}
190,{36}
0,{37}
210,{38}
400,{39}
600,{40}
1500,{41}
650,{42}
710,{43}
740,{44}
910,{45}
940,{46}
990,{47}
1040,{48}
1110, {49}
1510, {50}
1520, {51}
1540, {52}
1590, {53}
1680, {54}
940 {55}
);
MAXHITEFFECT = 8{5};
HitEffectBase: array[0..MAXHITEFFECT-1] of integer = (
800,
1410,
1700,
3480,
3390,
40,
220,
740
);
MAXMAGICTYPE = 18;
type
TMagicType = (mtReady, mtFly, mtExplosion,
mtFlyAxe, mtFireWind, mtFireGun,
mtLightingThunder, mtThunder, mtExploBujauk,
mtBujaukGroundEffect, mtKyulKai, mtFlyArrow,
mt12, mt13, mt14,
mt15, mt16, mtRedThunder,
mtLava
);
TUseMagicInfo = record
ServerMagicCode: integer;
MagicSerial: integer;
MimicSerial: integer;
Target: integer; //recogcode
EffectType: TMagicType;
EffectNumber: integer;
TargX: integer;
TargY: integer;
Recusion: Boolean;
AniTime: integer;
end;
PTUseMagicInfo = ^TUseMagicInfo;
TMagicEff = class//Size 0xC8
m_boActive: Boolean; //0x04
ServerMagicId: integer; //0x08
magnumber: integer;
MagOwner: TObject; //0x0C
TargetActor: TObject; //0x10
ImgLib: TWMImages; //0x14
EffectBase: integer; //0x18
MagExplosionBase: integer; //0x1C
px, py: integer; //0x20 0x24
RX, RY: integer; //0x28 0x2C
Dir16, OldDir16: byte; //0x30 0x31
TargetX, TargetY: integer; //0x34 0x38
TargetRx, TargetRy: integer; //0x3C 0x40
FlyX, FlyY, OldFlyX, OldFlyY: integer; //0x44 0x48 0x4C 0x50
FlyXf, FlyYf: Real; //0x54 0x5C
Repetition: Boolean; //0x64
FixedEffect: Boolean; //0x65
MagicType: integer; //0x68
NextEffect: TMagicEff; //0x6C
ExplosionFrame: integer; //0x70
NextFrameTime: integer; //0x74
Light: integer; //0x78
n7C:Integer;
bt80:Byte;
bt81:Byte;
start: integer; //0x84
curframe: integer; //0x88
frame: integer; //0x8C
private
m_dwFrameTime: longword; //0x90
m_dwStartTime: longword; //0x94
repeattime: longword; //0x98 馆汗 局聪皋捞记 矫埃 (-1: 拌加)
steptime: longword; //0x9C
fireX, fireY: integer; //0xA0 0xA4
firedisX, firedisY: integer; //0xA8 0xAC
newfiredisX, newfiredisY: integer;//0xB0 0xB4
FireMyselfX, FireMyselfY: integer;//0xB8 0xBC
prevdisx, prevdisy: integer; //0xC0 0xC4
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;
TFlyingBug = class (TMagicEff)//Size 0xD0
FlyImageBase: integer;//0xC8
ReadyFrame: integer;//0xCC
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;
TFlyingFireBall = class (TFlyingAxe) //0xD0
public
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TCharEffect = class (TMagicEff)
public
constructor Create (effbase, effframe: integer; target: TObject);
function Run: Boolean; override;
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TMapEffect = class (TMagicEff)
public
RepeatCount: integer;
constructor Create (effbase, effframe: integer; x, y: integer);
function Run: Boolean; override;
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)//Size 0xD0
public
MagicNumber: integer; //0xC8
BoGroundEffect: Boolean; //0xCC
constructor Create (effbase, magicnumb, sx, sy, tx, ty: integer);
function Run: Boolean; override;
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TNormalDrawEffect = class (TMagicEff)//Size 0xCC
boC8:Boolean;
public
constructor Create(XX,YY:Integer;WmImage:TWMImages;effbase,nX:Integer;frmTime:LongWord;boFlag:Boolean);
function Run: Boolean; override;
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
THumanEffects = class (TMagicEff)//Size 0xCC
boC8:Boolean;
public
constructor Create(XX,YY:Integer;WmImage:TWMImages;effbase,nX:Integer;frmTime:LongWord;boFlag:Boolean);
function Run: Boolean; override;
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TObjectEffects = class (TMagicEff)
ObjectID : TObject;
boC8:Boolean;
public
constructor Create(ObjectiD2:TObject;WmImage:TWMImages;effbase,nX:Integer;frmTime:LongWord;boFlag:Boolean);
function Run: Boolean; override;
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TRedThunderEffect = class (TMagicEff)
n0:integer;
public
constructor Create (effbase, tx, ty: integer; target: TObject);
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
TLavaEffect = class (TMagicEff)
public
constructor Create (effbase, tx, ty: integer; target: TObject);
procedure DrawEff (surface: TDirectDrawSurface); override;
end;
procedure GetEffectBase (mag, mtype: integer; var wimg: TWMImages; var idx: integer);
implementation
uses
ClMain, Actor, SoundUtil, MShare;
procedure GetEffectBase (mag, mtype: integer; var wimg: TWMImages; var idx: integer);
begin
wimg := nil;
idx := 0;
case mtype of
0: begin
case mag of
8,27,33..35,37..39,41..42,43,44,45{46},48..55: begin
wimg := g_WMagic2Images;
if mag in [0..MAXEFFECT-1] then
idx := EffectBase[mag];
end;
31: begin
wimg := FrmMain.WMon21Img;
if mag in [0..MAXEFFECT-1] then
idx := EffectBase[mag];
end;
36: begin
wimg := FrmMain.WMon22Img;
if mag in [0..MAXEFFECT-1] then
idx := EffectBase[mag];
end;
80..82: begin
wimg := FrmMain.WDragonImg;
if mag = 80 then begin
if g_Myself.m_nCurrX >= 84 then begin
idx:=130;
end else begin
idx:=140;
end;
end;
if mag = 81 then begin
if (g_Myself.m_nCurrX >= 78) and (g_Myself.m_nCurrY >= 48) then begin
idx:=150;
end else begin
idx:=160;
end;
end;
if mag = 82 then begin
idx:=180;
end;
end;
89: begin
wimg := FrmMain.WDragonImg;
idx:=350;
end;
90: begin
wimg:=FrmMain.WDragonImg;
idx:=440
end;
91: begin
wimg:=FrmMain.WDragonImg;
idx:=470
end;
92: begin
wimg:= g_WMagic2Images;
idx:= 1250;
end;
else begin
wimg := g_WMagicImages;
if mag in [0..MAXEFFECT-1] then
idx := EffectBase[mag];
end;
end;
end;
1: begin
wimg := g_WMagicImages;
if mag in [0..MAXHITEFFECT-1] then begin
if mag <> 740 then begin//bladeava no hit effect image
idx := HitEffectBase[mag];
end;
end;
if mag >= 5 then wimg := g_WMagic2Images;
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 := g_WMagicImages;
case mtype of
mtFly,mtBujaukGroundEffect,mtExploBujauk: begin
start:=0;
frame:=6;
curframe:=start;
FixedEffect:=False;
Repetition:=Recusion;
ExplosionFrame:=10;
if id = 38 then frame:=10;
if id = 39 then begin
frame:=4;
ExplosionFrame:=8;
end;
if id = 44 then begin
ExplosionFrame:=16;//16
end;
if (id = 81) or (id = 82) or (id = 83) then begin
bt80:=1;
Repetition:=True;
if id = 81 then begin
ImgLib:=FrmMain.WDragonImg;
if g_MySelf.m_nCurrX >= 84 then begin
EffectBase:=130;
end else begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -