?? herbactor.pas
字號:
unit HerbActor;
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)//Size 0x250
private
public
constructor Create; override;
destructor Destroy; override;
procedure CalcActorFrame; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
end;
TMineMon = class (TKillingHerb)
private
public
constructor Create; 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)//Size 0x260
private
AttackEffectSurface :TDirectDrawSurface; //0x250
BoUseDieEffect :Boolean; //0x254
ax :integer; //0x258
ay :integer; //0x25C
procedure LoadEffect();
public
procedure CalcActorFrame; override;
procedure LoadSurface; override;
procedure DrawEff (dsurface: TDirectDrawSurface; dx, dy: integer);override;
procedure Run;override;
end;
TBigHeartMon = class (TKillingHerb)//Size 0x260
private
public
procedure CalcActorFrame; override;
end;
TSpiderHouseMon = class (TKillingHerb)
private
public
procedure CalcActorFrame; override;
end;
TCastleDoor = class (TActor)
private
EffectSurface: TDirectDrawSurface;
ax, ay: integer;
oldunitx, oldunity: integer;
procedure ApplyDoorState (dstate: TDoorState);
public
BoDoorOpen: Boolean;
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;boFlag:Boolean); override;
end;
TWallStructure = class (TActor)//0x62
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;boFlag:Boolean); override;
procedure Run; override;
end;
TSoccerBall = class (TActor)//0x9
private
public
end;
TDragonBody = class (TKillingHerb)//0x5a
private
public
procedure DrawEff (dsurface: TDirectDrawSurface; dx, dy: integer); override;
procedure CalcActorFrame(); override;
procedure LoadSurface(); override;
end;
implementation
uses
ClMain, MShare;
{============================== TKillingHerb =============================}
// 僥牢檬
{--------------------------}
constructor TKillingHerb.Create;
begin
inherited Create;
end;
destructor TKillingHerb.Destroy;
begin
inherited Destroy;
end;
procedure TKillingHerb.CalcActorFrame;
var
pm: PTMonsterAction;
haircount: integer;
begin
m_boUseMagic := FALSE;
m_nCurrentFrame := -1;
m_nBodyOffset := GetOffset (m_wAppearance);
pm := GetRaceByPM (m_btRace,m_wAppearance);
if pm = nil then exit;
case m_nCurrentAction of
SM_TURN: //
begin
m_nStartFrame := pm.ActStand.start; // + Dir * (pm.ActStand.frame + pm.ActStand.skip);
m_nEndFrame := m_nStartFrame + pm.ActStand.frame - 1;
m_dwFrameTime := pm.ActStand.ftime;
m_dwStartTime := GetTickCount;
m_nDefFrameCount := pm.ActStand.frame;
Shift (m_btDir, 0, 0, 1);
end;
SM_DIGUP: //, SM_DIGUP, .
begin
m_nStartFrame := pm.ActWalk.start; // + Dir * (pm.ActWalk.frame + pm.ActWalk.skip);
m_nEndFrame := m_nStartFrame + pm.ActWalk.frame - 1;
m_dwFrameTime := pm.ActWalk.ftime;
m_dwStartTime := GetTickCount;
m_nMaxTick := pm.ActWalk.UseTick;
m_nCurTick := 0;
//WarMode := FALSE;
m_nMoveStep := 1;
Shift (m_btDir, 0, 0, 1); //m_nMoveStep, 0, m_nEndFrame-startframe+1);
end;
SM_HIT:
begin
m_nStartFrame := pm.ActAttack.start + m_btDir * (pm.ActAttack.frame + pm.ActAttack.skip);
m_nEndFrame := m_nStartFrame + pm.ActAttack.frame - 1;
m_dwFrameTime := pm.ActAttack.ftime;
m_dwStartTime := GetTickCount;
//WarMode := TRUE;
m_dwWarModeTime := GetTickCount;
Shift (m_btDir, 0, 0, 1);
end;
SM_STRUCK:
begin
m_nStartFrame := pm.ActStruck.start + m_btDir * (pm.ActStruck.frame + pm.ActStruck.skip);
m_nEndFrame := m_nStartFrame + pm.ActStruck.frame - 1;
m_dwFrameTime := m_dwStruckFrameTime; //pm.ActStruck.ftime;
m_dwStartTime := GetTickCount;
end;
SM_DEATH:
begin
m_nStartFrame := pm.ActDie.start + m_btDir * (pm.ActDie.frame + pm.ActDie.skip);
m_nEndFrame := m_nStartFrame + pm.ActDie.frame - 1;
m_nStartFrame := m_nEndFrame; //
m_dwFrameTime := pm.ActDie.ftime;
m_dwStartTime := GetTickCount;
end;
SM_NOWDEATH:
begin
m_nStartFrame := pm.ActDie.start + m_btDir * (pm.ActDie.frame + pm.ActDie.skip);
m_nEndFrame := m_nStartFrame + pm.ActDie.frame - 1;
m_dwFrameTime := pm.ActDie.ftime;
m_dwStartTime := GetTickCount;
end;
SM_DIGDOWN:
begin
m_nStartFrame := pm.ActDeath.start;
m_nEndFrame := m_nStartFrame + pm.ActDeath.frame - 1;
m_dwFrameTime := pm.ActDeath.ftime;
m_dwStartTime := GetTickCount;
m_boDelActionAfterFinished := TRUE; //撈悼累撈 場唱擱 咀磐 瘤瀾
end;
end;
end;
function TKillingHerb.GetDefaultFrame (wmode: Boolean): integer;
var
cf, dr: integer;
pm: PTMonsterAction;
begin
Result:=0;//jacky
pm := GetRaceByPM (m_btRace,m_wAppearance);
if pm = nil then exit;
if m_boDeath then begin
if m_boSkeleton then
Result := pm.ActDeath.start
else Result := pm.ActDie.start + m_btDir * (pm.ActDie.frame + pm.ActDie.skip) + (pm.ActDie.frame - 1);
end else begin
m_nDefFrameCount := pm.ActStand.frame;
if m_nCurrentDefFrame < 0 then cf := 0
else if m_nCurrentDefFrame >= pm.ActStand.frame then cf := 0
else cf := m_nCurrentDefFrame;
Result := pm.ActStand.start + cf; //規氫撈 絕瀾..
end;
end;
{----------------------------------------------------------------------}
//厚阜盔面
procedure TBeeQueen.CalcActorFrame;
var
pm: PTMonsterAction;
begin
m_boUseMagic := FALSE;
m_nCurrentFrame := -1;
m_nBodyOffset := GetOffset (m_wAppearance);
pm := GetRaceByPM (m_btRace,m_wAppearance);
if pm = nil then exit;
case m_nCurrentAction of
SM_TURN: //規氫撈 絕瀾...
begin
m_nStartFrame := pm.ActStand.start; // + Dir * (pm.ActStand.frame + pm.ActStand.skip);
m_nEndFrame := m_nStartFrame + pm.ActStand.frame - 1;
m_dwFrameTime := pm.ActStand.ftime;
m_dwStartTime := GetTickCount;
m_nDefFrameCount := pm.ActStand.frame;
Shift (m_btDir, 0, 0, 1);
end;
SM_HIT:
begin
m_nStartFrame := pm.ActAttack.start; // + Dir * (pm.ActAttack.frame + pm.ActAttack.skip);
m_nEndFrame := m_nStartFrame + pm.ActAttack.frame - 1;
m_dwFrameTime := pm.ActAttack.ftime;
m_dwStartTime := GetTickCount;
//WarMode := TRUE;
m_dwWarModeTime := GetTickCount;
Shift (m_btDir, 0, 0, 1);
end;
SM_STRUCK:
begin
m_nStartFrame := pm.ActStruck.start; // + Dir * (pm.ActStruck.frame + pm.ActStruck.skip);
m_nEndFrame := m_nStartFrame + pm.ActStruck.frame - 1;
m_dwFrameTime := m_dwStruckFrameTime; //pm.ActStruck.ftime;
m_dwStartTime := GetTickCount;
end;
SM_DEATH:
begin
m_nStartFrame := pm.ActDie.start; // + Dir * (pm.ActDie.frame + pm.ActDie.skip);
m_nEndFrame := m_nStartFrame + pm.ActDie.frame - 1;
m_nStartFrame := m_nEndFrame; //
m_dwFrameTime := pm.ActDie.ftime;
m_dwStartTime := GetTickCount;
end;
SM_NOWDEATH:
begin
m_nStartFrame := pm.ActDie.start; // + Dir * (pm.ActDie.frame + pm.ActDie.skip);
m_nEndFrame := m_nStartFrame + pm.ActDie.frame - 1;
m_dwFrameTime := pm.ActDie.ftime;
m_dwStartTime := GetTickCount;
end;
end;
end;
function TBeeQueen.GetDefaultFrame (wmode: Boolean): integer;
var
pm: PTMonsterAction;
cf: integer;
begin
Result:=0;//jacky
pm := GetRaceByPM (m_btRace,m_wAppearance);
if pm = nil then exit;
if m_boDeath then begin
Result := pm.ActDie.start + (pm.ActDie.frame - 1);
end else begin
m_nDefFrameCount := pm.ActStand.frame;
if m_nCurrentDefFrame < 0 then cf := 0
else if m_nCurrentDefFrame >= pm.ActStand.frame then cf := 0
else cf := m_nCurrentDefFrame;
Result := pm.ActStand.start + cf; //規氫撈 絕瀾..
end;
end;
{----------------------------------------------------------------------}
//瘤匙空
procedure TCentipedeKingMon.CalcActorFrame;
var
pm: PTMonsterAction;
begin
m_boUseMagic := FALSE;
m_nCurrentFrame := -1;
m_nBodyOffset := GetOffset(m_wAppearance);
pm := GetRaceByPM (m_btRace,m_wAppearance);
if pm = nil then exit;
case m_nCurrentAction of
SM_TURN: //
begin
m_btDir := 0;
inherited CalcActorFrame;
end;
SM_HIT:
begin
m_btDir:=0;
m_nStartFrame:=pm.ActCritical.start + m_btDir * (pm.ActCritical.frame + pm.ActCritical.skip);
m_nEndFrame := m_nStartFrame + pm.ActCritical.frame - 1;
m_dwFrameTime:=pm.ActCritical.ftime;
m_dwStartTime := GetTickCount;
BoUseDieEffect:=True;
m_nEffectFrame:=0;
m_nEffectStart:=0;
m_nEffectEnd:=m_nEffectStart + 9;
m_dwEffectFrameTime:= 62;
// BoUseEffect:=True;
Shift (m_btDir, 0, 0, 1);
end;
SM_DIGDOWN:
begin
inherited CalcActorFrame;
end;
else begin
m_btDir := 0;
inherited CalcActorFrame;
end;
end;
end;
{----------------------------------------------------------------------}
//己寒, 己鞏
constructor TCastleDoor.Create;
begin
inherited Create;
m_btDir := 0;
EffectSurface := nil;
m_nDownDrawLevel := 1; //1伎 剛歷 弊覆. (葷恩 贛府啊 己鞏 關欄肺 甸絹啊綽 巴闌 阜瀾)
end;
procedure TCastleDoor.ApplyDoorState (dstate: TDoorState);
var
bowalk: Boolean;
begin
Map.MarkCanWalk (m_nCurrX, m_nCurrY-2, TRUE);
Map.MarkCanWalk (m_nCurrX+1, m_nCurrY-1, TRUE);
Map.MarkCanWalk (m_nCurrX+1, m_nCurrY-2, TRUE);
if dstate = dsClose then bowalk := FALSE
else bowalk := TRUE;
Map.MarkCanWalk (m_nCurrX, m_nCurrY, bowalk);
Map.MarkCanWalk (m_nCurrX, m_nCurrY-1, bowalk);
Map.MarkCanWalk (m_nCurrX, m_nCurrY-2, bowalk);
Map.MarkCanWalk (m_nCurrX+1, m_nCurrY-1, bowalk);
Map.MarkCanWalk (m_nCurrX+1, m_nCurrY-2, bowalk);
Map.MarkCanWalk (m_nCurrX-1, m_nCurrY-1, bowalk);
Map.MarkCanWalk (m_nCurrX-1, m_nCurrY, bowalk);
Map.MarkCanWalk (m_nCurrX-1, m_nCurrY+1, bowalk);
Map.MarkCanWalk (m_nCurrX-2, m_nCurrY, bowalk);
if dstate = dsOpen then begin
Map.MarkCanWalk (m_nCurrX, m_nCurrY-2, FALSE);
Map.MarkCanWalk (m_nCurrX+1, m_nCurrY-1, FALSE);
Map.MarkCanWalk (m_nCurrX+1, m_nCurrY-2, FALSE);
end;
end;
procedure TCastleDoor.LoadSurface;
var
mimg: TWMImages;
begin
inherited LoadSurface;
mimg := GetMonImg (m_wAppearance);
if m_boUseEffect then
EffectSurface := mimg.GetCachedImage (DOORDEATHEFFECTBASE + (m_nCurrentFrame - m_nStartFrame), ax, ay);
end;
procedure TCastleDoor.CalcActorFrame;
var
pm: PTMonsterAction;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -