unit HerbActor; //herb:不能移动的怪物
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grobal2, DxDraws, CliUtil, magiceff, Actor, WIl;
const
BEEQUEENBASE = 600; //角蝇
DOORDEATHEFFECTBASE = 120; //沙皇宫门还是城门
WALLLEFTBROKENEFFECTBASE = 224; // 看来是城门
WALLRIGHTBROKENEFFECTBASE = 240; //。。
type
TDoorState = (dsOpen, dsClose, dsBroken);
TKillingHerb = class (TActor)
private
public
constructor Create; override;
destructor Destroy; override;
procedure CalcActorFrame; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
end;
TBeeQueen = class (TActor)
private
public
procedure CalcActorFrame; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
end;
TCentipedeKingMon = class (TKillingHerb) //触龙神
public
procedure CalcActorFrame; override;
end;
TCastleDoor = class (TActor) //很明显是城门
private
EffectSurface: TDirectDrawSurface;
ax, ay: integer;
oldunitx, oldunity: integer;
procedure ApplyDoorState (dstate: TDoorState);
public
BoDoorOpen: Boolean; //Bo,,be on,,是否处于什么什么的状态
constructor Create; override;
procedure CalcActorFrame; override;
procedure LoadSurface; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
procedure ActionEnded; override;
procedure Run; override;
procedure DrawChr (dsurface: TDirectDrawSurface; dx, dy: integer; blend: Boolean); override;
end;
TWallStructure = class (TActor)
private
EffectSurface: TDirectDrawSurface;
BrokenSurface: TDirectDrawSurface;
ax, ay, bx, by: integer;
deathframe: integer;
bomarkpos: Boolean; //
public
constructor Create; override;
procedure CalcActorFrame; override;
procedure LoadSurface; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
procedure DrawChr (dsurface: TDirectDrawSurface; dx, dy: integer; blend: Boolean); override;
procedure Run; override;
end;
implementation
uses
ClMain;
{============================== TKillingHerb =============================}
//
{--------------------------}
constructor TKillingHerb.Create;
begin
inherited Create;
end;
destructor TKillingHerb.Destroy;
begin
inherited Destroy;
end;
procedure TKillingHerb.CalcActorFrame;
var
pm: PTMonsterAction;
haircount: integer;
begin
BoUseMagic := FALSE;
currentframe := -1;
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
case CurrentAction of
SM_TURN: //规氢捞 绝澜...
begin
startframe := pm.ActStand.start; // + Dir * (pm.ActStand.frame + pm.ActStand.skip);
endframe := startframe + pm.ActStand.frame - 1;
frametime := pm.ActStand.ftime;
starttime := GetTickCount;
defframecount := pm.ActStand.frame;
Shift (Dir, 0, 0, 1);
end;
SM_DIGUP: //叭扁 绝澜, SM_DIGUP, 规氢 绝澜.
begin
startframe := pm.ActWalk.start; // + Dir * (pm.ActWalk.frame + pm.ActWalk.skip);
endframe := startframe + pm.ActWalk.frame - 1;
frametime := pm.ActWalk.ftime;
starttime := GetTickCount;
maxtick := pm.ActWalk.UseTick;
curtick := 0;
//WarMode := FALSE;
movestep := 1;
Shift (Dir, 0, 0, 1); //movestep, 0, endframe-startframe+1);
end;
SM_HIT:
begin
startframe := pm.ActAttack.start + Dir * (pm.ActAttack.frame + pm.ActAttack.skip);
endframe := startframe + pm.ActAttack.frame - 1;
frametime := pm.ActAttack.ftime;
starttime := GetTickCount;
//WarMode := TRUE;
WarModeTime := GetTickCount;
Shift (Dir, 0, 0, 1);
end;
SM_STRUCK:
begin
startframe := pm.ActStruck.start + Dir * (pm.ActStruck.frame + pm.ActStruck.skip);
endframe := startframe + pm.ActStruck.frame - 1;
frametime := struckframetime; //pm.ActStruck.ftime;
starttime := GetTickCount;
end;
SM_DEATH:
begin
startframe := pm.ActDie.start + Dir * (pm.ActDie.frame + pm.ActDie.skip);
endframe := startframe + pm.ActDie.frame - 1;
startframe := endframe; //
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
end;
SM_NOWDEATH:
begin
startframe := pm.ActDie.start + Dir * (pm.ActDie.frame + pm.ActDie.skip);
endframe := startframe + pm.ActDie.frame - 1;
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
end;
SM_DIGDOWN:
begin
startframe := pm.ActDeath.start;
endframe := startframe + pm.ActDeath.frame - 1;
frametime := pm.ActDeath.ftime;
starttime := GetTickCount;
BoDelActionAfterFinished := TRUE; //捞悼累捞 场唱搁 咀磐 瘤澜
end;
end;
end;
function TKillingHerb.GetDefaultFrame (wmode: Boolean): integer;
var
cf, dr: integer;
pm: PTMonsterAction;
begin
pm := RaceByPM (Race);
if pm = nil then exit;
if Death then begin
if Skeleton then
Result := pm.ActDeath.start
else Result := pm.ActDie.start + Dir * (pm.ActDie.frame + pm.ActDie.skip) + (pm.ActDie.frame - 1);
end else begin
defframecount := pm.ActStand.frame;
if currentdefframe < 0 then cf := 0
else if currentdefframe >= pm.ActStand.frame then cf := 0
else cf := currentdefframe;
Result := pm.ActStand.start + cf; //规氢捞 绝澜..
end;
end;
{----------------------------------------------------------------------}
//厚阜盔面
procedure TBeeQueen.CalcActorFrame;
var
pm: PTMonsterAction;
begin
BoUseMagic := FALSE;
currentframe := -1;
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
case CurrentAction of
SM_TURN: //规氢捞 绝澜...
begin
startframe := pm.ActStand.start; // + Dir * (pm.ActStand.frame + pm.ActStand.skip);
endframe := startframe + pm.ActStand.frame - 1;
frametime := pm.ActStand.ftime;
starttime := GetTickCount;
defframecount := pm.ActStand.frame;
Shift (Dir, 0, 0, 1);
end;
SM_HIT:
begin
startframe := pm.ActAttack.start; // + Dir * (pm.ActAttack.frame + pm.ActAttack.skip);
endframe := startframe + pm.ActAttack.frame - 1;
frametime := pm.ActAttack.ftime;
starttime := GetTickCount;
//WarMode := TRUE;
WarModeTime := GetTickCount;
Shift (Dir, 0, 0, 1);
end;
SM_STRUCK:
begin
startframe := pm.ActStruck.start; // + Dir * (pm.ActStruck.frame + pm.ActStruck.skip);
endframe := startframe + pm.ActStruck.frame - 1;
frametime := struckframetime; //pm.ActStruck.ftime;
starttime := GetTickCount;
end;
SM_DEATH:
begin
startframe := pm.ActDie.start; // + Dir * (pm.ActDie.frame + pm.ActDie.skip);
endframe := startframe + pm.ActDie.frame - 1;
startframe := endframe; //
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
end;
SM_NOWDEATH:
begin
startframe := pm.ActDie.start; // + Dir * (pm.ActDie.frame + pm.ActDie.skip);
endframe := startframe + pm.ActDie.frame - 1;
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
end;
end;
end;
function TBeeQueen.GetDefaultFrame (wmode: Boolean): integer;
var
pm: PTMonsterAction;
cf: integer;
begin
pm := RaceByPM (Race);
if pm = nil then exit;
if Death then begin
Result := pm.ActDie.start + (pm.ActDie.frame - 1);
end else begin
defframecount := pm.ActStand.frame;
if currentdefframe < 0 then cf := 0
else if currentdefframe >= pm.ActStand.frame then cf := 0
else cf := currentdefframe;
Result := pm.ActStand.start + cf; //规氢捞 绝澜..
end;
end;
{----------------------------------------------------------------------}
//瘤匙空
procedure TCentipedeKingMon.CalcActorFrame;
var
pm: PTMonsterAction;
begin
BoUseMagic := FALSE;
currentframe := -1;
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
case CurrentAction of
SM_TURN: //规氢捞 绝澜...
begin
Dir := 0;
inherited CalcActorFrame;
end;
SM_HIT:
begin
case Dir of
7, 6: Dir := 0;
0, 1, 2, 5: Dir := 1;
else Dir := 2;
end;
inherited CalcActorFrame;
end;
//SM_SPITPOISON:
// begin
// end;
else begin
Dir := 0;
inherited CalcActorFrame;
end;
end;
end;
{----------------------------------------------------------------------}
//己寒, 己巩
constructor TCastleDoor.Create;
begin
inherited Create;
Dir := 0;
EffectSurface := nil;
DownDrawLevel := 1; //1伎 刚历 弊覆. (荤恩 赣府啊 己巩 关栏肺 甸绢啊绰 巴阑 阜澜)
end;
procedure TCastleDoor.ApplyDoorState (dstate: TDoorState);
var
bowalk: Boolean;
begin
Map.MarkCanWalk (XX, YY-2, TRUE);
Map.MarkCanWalk (XX+1, YY-1, TRUE);
Map.MarkCanWalk (XX+1, YY-2, TRUE);
if dstate = dsClose then bowalk := FALSE
else bowalk := TRUE;
Map.MarkCanWalk (XX, YY, bowalk);
Map.MarkCanWalk (XX, YY-1, bowalk);
Map.MarkCanWalk (XX, YY-2, bowalk);
Map.MarkCanWalk (XX+1, YY-1, bowalk);
Map.MarkCanWalk (XX+1, YY-2, bowalk);
Map.MarkCanWalk (XX-1, YY-1, bowalk);
Map.MarkCanWalk (XX-1, YY, bowalk);
Map.MarkCanWalk (XX-1, YY+1, bowalk);
Map.MarkCanWalk (XX-2, YY, bowalk);
if dstate = dsOpen then begin
Map.MarkCanWalk (XX, YY-2, FALSE);
Map.MarkCanWalk (XX+1, YY-1, FALSE);
Map.MarkCanWalk (XX+1, YY-2, FALSE);
end;
end;
procedure TCastleDoor.LoadSurface;
var
mimg: TWMImages;
begin
inherited LoadSurface;
mimg := GetMonImg (Appearance);
if BoUseEffect then
EffectSurface := mimg.GetCachedImage (DOORDEATHEFFECTBASE + (currentframe - startframe), ax, ay);
end;
procedure TCastleDoor.CalcActorFrame;
var
pm: PTMonsterAction;
haircount: integer;
begin
BoUseEffect := FALSE;
currentframe := -1;
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
UserName := ' ';
case CurrentAction of
SM_NOWDEATH:
begin
startframe := pm.ActDie.start;
endframe := startframe + pm.ActDie.frame - 1;
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
Shift (Dir, 0, 0, 1);
BoUseEffect := TRUE;
ApplyDoorState (dsBroken); //框流老 荐 乐霸
end;
SM_STRUCK:
begin
startframe := pm.ActStruck.start + Dir * (pm.ActStruck.frame + pm.ActStruck.skip);
endframe := startframe + pm.ActStruck.frame - 1;
frametime := pm.ActStand.ftime;
starttime := GetTickCount;
Shift (Dir, 0, 0, 1);
end;
SM_DIGUP: //巩 凯覆
begin
startframe := pm.ActAttack.start;
endframe := startframe + pm.ActAttack.frame - 1;
frametime := pm.ActAttack.ftime;
starttime := GetTickCount;
ApplyDoorState (dsOpen); //框流老 荐 乐霸
end;
SM_DIGDOWN: //巩 摧塞
begin
startframe := pm.ActCritical.start;
endframe := startframe + pm.ActCritical.frame - 1;
frametime := pm.ActCritical.ftime;
starttime := GetTickCount;
BoDoorOpen := FALSE;
BoHoldPlace := TRUE;
ApplyDoorState (dsClose); //给框流烙
end;
SM_DEATH:
begin
startframe := pm.ActDie.start + pm.ActDie.frame - 1;
endframe := startframe;
defframecount := 0;
ApplyDoorState (dsBroken); //框流老 荐 乐霸
end;
else //规氢捞 绝澜...
begin
if Dir < 3 then begin
startframe := pm.ActStand.start + Dir * (pm.ActStand.frame + pm.ActStand.skip);
endframe := startframe; // + pm.ActStand.frame - 1;
frametime := pm.ActStand.ftime;
starttime := GetTickCount;
defframecount := 0; //pm.ActStand.frame;
Shift (Dir, 0, 0, 1);
BoDoorOpen := FALSE;
BoHoldPlace := TRUE;
ApplyDoorState (dsClose); //给框流捞霸
end else begin
startframe := pm.ActCritical.start; //凯妨乐绰 惑怕
endframe := startframe;
defframecount := 0;
BoDoorOpen := TRUE;
BoHoldPlace := FALSE;
ApplyDoorState (dsOpen); //吧阑 荐 乐澜
end;
end;
end;
end;
function TCastleDoor.GetDefaultFrame (wmode: Boolean): integer;
var
pm: PTMonsterAction;
begin
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
if Death then begin
Result := pm.ActDie.start + pm.ActDie.frame - 1;
DownDrawLevel := 2;
end else begin
if BoDoorOpen then begin
DownDrawLevel := 2;
Result := pm.ActCritical.start; // + Dir * (pm.ActStand.frame + pm.ActStand.skip);
end else begin
DownDrawLevel := 1;
Result := pm.ActStand.start + Dir * (pm.ActStand.frame + pm.ActStand.skip);
end;
end;
end;
procedure TCastleDoor.ActionEnded;
begin
if CurrentAction = SM_DIGUP then begin //巩凯覆
BoDoorOpen := TRUE;
BoHoldPlace := FALSE;
end;
// if CurrentAction = SM_DIGDOWN then
// DefaultMotion;
end;
procedure TCastleDoor.Run;
begin
if (Map.CurUnitX <> oldunitx) or (Map.CurUnitY <> oldunity) then begin
if Death then ApplyDoorState (dsBroken)
else if BoDoorOpen then ApplyDoorState (dsOpen)
else ApplyDoorState (dsClose);
end;
oldunitx := Map.CurUnitX;
oldunity := Map.CurUnitY;
inherited Run;
end;
procedure TCastleDoor.DrawChr (dsurface: TDirectDrawSurface; dx, dy: integer; blend: Boolean);
begin
inherited DrawChr (dsurface, dx, dy, blend);
if BoUseEffect and not blend then
if EffectSurface <> nil then begin
DrawBlend (dsurface,
dx + ax + ShiftX,
dy + ay + ShiftY,
EffectSurface, 1);
end;
end;
{----------------------------------------------------------------------}
//己寒
constructor TWallStructure.Create;
begin
inherited Create;
Dir := 0;
EffectSurface := nil;
BrokenSurface := nil;
bomarkpos := FALSE;
//DownDrawLevel := 1;
end;
procedure TWallStructure.CalcActorFrame;
var
pm: PTMonsterAction;
haircount: integer;
begin
BoUseEffect := FALSE;
currentframe := -1;
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
UserName := ' ';
deathframe := 0;
BoUseEffect := FALSE;
case CurrentAction of
SM_NOWDEATH:
begin
startframe := pm.ActDie.start;
endframe := startframe + pm.ActDie.frame - 1;
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
deathframe := pm.ActStand.start + Dir;
Shift (Dir, 0, 0, 1);
BoUseEffect := TRUE;
end;
SM_DEATH:
begin
startframe := pm.ActDie.start + pm.ActDie.frame - 1;
endframe := startframe;
defframecount := 0;
end;
SM_DIGUP: //葛嚼捞 函版瞪锭 付促
begin
startframe := pm.ActDie.start;
endframe := startframe + pm.ActDie.frame - 1;
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
deathframe := pm.ActStand.start + Dir;
BoUseEffect := TRUE;
end;
else //规氢捞 绝澜...
begin
startframe := pm.ActStand.start + Dir; // * (pm.ActStand.frame + pm.ActStand.skip);
endframe := startframe; // + pm.ActStand.frame - 1;
frametime := pm.ActStand.ftime;
starttime := GetTickCount;
defframecount := 0; //pm.ActStand.frame;
Shift (Dir, 0, 0, 1);
BoHoldPlace := TRUE;
end;
end;
end;
procedure TWallStructure.LoadSurface;
var
mimg: TWMImages;
begin
mimg := GetMonImg (Appearance);
if deathframe > 0 then begin //(CurrentAction = SM_NOWDEATH) or (CurrentAction = SM_DEATH) then begin
BodySurface := mimg.GetCachedImage (GetOffset (Appearance) + deathframe, px, py);
end else begin
inherited LoadSurface;
end;
BrokenSurface := mimg.GetCachedImage (GetOffset (Appearance) + 8 + Dir, bx, by);
if BoUseEffect then begin
if Appearance = 901 then
EffectSurface := mimg.GetCachedImage (WALLLEFTBROKENEFFECTBASE + (currentframe - startframe), ax, ay)
else
EffectSurface := mimg.GetCachedImage (WALLRIGHTBROKENEFFECTBASE + (currentframe - startframe), ax, ay);
end;
end;
function TWallStructure.GetDefaultFrame (wmode: Boolean): integer;
var
pm: PTMonsterAction;
begin
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
Result := pm.ActStand.start + Dir; // * (pm.ActStand.frame + pm.ActStand.skip);
end;
procedure TWallStructure.DrawChr (dsurface: TDirectDrawSurface; dx, dy: integer; blend: Boolean);
begin
inherited DrawChr (dsurface, dx, dy, blend);
if (BrokenSurface <> nil) and (not blend) then begin
dsurface.Draw (dx + bx + ShiftX,
dy + by + ShiftY,
BrokenSurface.ClientRect,
BrokenSurface, TRUE);
end;
if BoUseEffect and (not blend) then begin
if EffectSurface <> nil then begin
DrawBlend (dsurface,
dx + ax + ShiftX,
dy + ay + ShiftY,
EffectSurface, 1);
end;
end;
end;
procedure TWallStructure.Run;
begin
if Death then begin
if bomarkpos then begin
Map.MarkCanWalk (XX, YY, TRUE);
bomarkpos := FALSE;
end;
end else begin
if not bomarkpos then begin
Map.MarkCanWalk (XX, YY, FALSE);
bomarkpos := TRUE;
end;
end;
PlayScene.SetActorDrawLevel (self, 0);
inherited Run;
end;
end.
声明:本文系互联网搜索而收集整理,不以盈利性为目的,文字、图文资料源于互联网且共享于互联网。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。