?? 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 + -