📄 playscn.pas
字号:
unit PlayScn;
//游戏主场景
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DXDraws, DXClass, DirectX, IntroScn, Grobal2, CliUtil, HUtil32,
Actor, HerbActor, AxeMon, SoundUtil, ClEvent, Wil,
StdCtrls, clFunc, magiceff, extctrls, MShare, Share;
const
//地图和物品南站的地方
MAPSURFACEWIDTH = 800;
MAPSURFACEHEIGHT = 445;
LONGHEIGHT_IMAGE = 35;
FLASHBASE = 410;
AAX = 16;
SOFFX = 0;
SOFFY = 0;
LMX = 30;
LMY = 26;
MAXLIGHT = 5;
LightFiles : array[0..MAXLIGHT] of string = (
'Data\lig0a.dat',
'Data\lig0b.dat',
'Data\lig0c.dat',
'Data\lig0d.dat',
'Data\lig0e.dat',
'Data\lig0f.dat'
);
LightMask0 : array[0..2, 0..2] of shortint = (
(0,1,0),
(1,3,1),
(0,1,0)
);
LightMask1 : array[0..4, 0..4] of shortint = (
(0,1,1,1,0),
(1,1,3,1,1),
(1,3,4,3,1),
(1,1,3,1,1),
(0,1,2,1,0)
);
LightMask2 : array[0..8, 0..8] of shortint = (
(0,0,0,1,1,1,0,0,0),
(0,0,1,2,3,2,1,0,0),
(0,1,2,3,4,3,2,1,0),
(1,2,3,4,4,4,3,2,1),
(1,3,4,4,4,4,4,3,1),
(1,2,3,4,4,4,3,2,1),
(0,1,2,3,4,3,2,1,0),
(0,0,1,2,3,2,1,0,0),
(0,0,0,1,1,1,0,0,0)
);
LightMask3 : array[0..10, 0..10] of shortint = (
(0,0,0,0,1,1,1,0,0,0,0),
(0,0,0,1,2,2,2,1,0,0,0),
(0,0,1,2,3,3,3,2,1,0,0),
(0,1,2,3,4,4,4,3,2,1,0),
(1,2,3,4,4,4,4,4,3,2,1),
(2,3,4,4,4,4,4,4,4,3,2),
(1,2,3,4,4,4,4,4,3,2,1),
(0,1,2,3,4,4,4,3,2,1,0),
(0,0,1,2,3,3,3,2,1,0,0),
(0,0,0,1,2,2,2,1,0,0,0),
(0,0,0,0,1,1,1,0,0,0,0)
);
LightMask4 : array[0..14, 0..14] of shortint = (
(0,0,0,0,0,0,1,1,1,0,0,0,0,0,0),
(0,0,0,0,0,1,1,1,1,1,0,0,0,0,0),
(0,0,0,0,1,1,2,2,2,1,1,0,0,0,0),
(0,0,0,1,1,2,3,3,3,2,1,1,0,0,0),
(0,0,1,1,2,3,4,4,4,3,2,1,1,0,0),
(0,1,1,2,3,4,4,4,4,4,3,2,1,1,0),
(1,1,2,3,4,4,4,4,4,4,4,3,2,1,1),
(1,2,3,4,4,4,4,4,4,4,4,4,3,2,1),
(1,1,2,3,4,4,4,4,4,4,4,3,2,1,1),
(0,1,1,2,3,4,4,4,4,4,3,2,1,1,0),
(0,0,1,1,2,3,4,4,4,3,2,1,1,0,0),
(0,0,0,1,1,2,3,3,3,2,1,1,0,0,0),
(0,0,0,0,1,1,2,2,2,1,1,0,0,0,0),
(0,0,0,0,0,1,1,1,1,1,0,0,0,0,0),
(0,0,0,0,0,0,1,1,1,0,0,0,0,0,0)
);
LightMask5 : array[0..16, 0..16] of shortint = (
(0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0),
(0,0,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0),
(0,0,0,0,0,1,2,4,4,4,2,1,0,0,0,0,0),
(0,0,0,0,1,2,4,4,4,4,4,2,1,0,0,0,0),
(0,0,0,1,2,4,4,4,4,4,4,4,2,1,0,0,0),
(0,0,1,2,4,4,4,4,4,4,4,4,4,2,1,0,0),
(0,1,2,4,4,4,4,4,4,4,4,4,4,4,2,1,0),
(1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1),
(1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1),
(1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1),
(0,1,2,4,4,4,4,4,4,4,4,4,4,4,2,1,0),
(0,0,1,2,4,4,4,4,4,4,4,4,4,2,1,0,0),
(0,0,0,1,2,4,4,4,4,4,4,4,2,1,0,0,0),
(0,0,0,0,1,2,4,4,4,4,4,2,1,0,0,0,0),
(0,0,0,0,0,1,2,4,4,4,2,1,0,0,0,0,0),
(0,0,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0),
(0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0)
{ (0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0,0),
(0,0,0,0,0,0,1,2,4,4,4,2,1,0,0,0,0,0,0),
(0,0,0,0,0,1,2,4,4,4,4,4,2,1,0,0,0,0,0),
(0,0,0,0,1,2,4,4,4,4,4,4,4,2,1,0,0,0,0),
(0,0,0,1,2,4,4,4,4,4,4,4,4,4,2,1,0,0,0),
(0,0,1,2,4,4,4,4,4,4,4,4,4,4,4,2,1,0,0),
(0,1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1,0),
(1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1),
(1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1),
(1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1),
(0,1,2,4,4,4,4,4,4,4,4,4,4,4,4,4,2,1,0),
(0,0,1,2,4,4,4,4,4,4,4,4,4,4,4,2,1,0,0),
(0,0,0,1,2,4,4,4,4,4,4,4,4,4,2,1,0,0,0),
(0,0,0,0,1,2,4,4,4,4,4,4,4,2,1,0,0,0,0),
(0,0,0,0,0,1,2,4,4,4,4,4,2,1,0,0,0,0,0),
(0,0,0,0,0,0,1,2,4,4,4,2,1,0,0,0,0,0,0),
(0,0,0,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0) }
);
type
PShoftInt = ^ShortInt;
TLightEffect = record
Width: integer;
Height: integer;
PFog: Pbyte;
end;
TLightMapInfo = record
ShiftX: integer;
ShiftY: integer;
light: integer;
bright: integer;
end;
TPlayScene = class (TScene)
private
m_MapSurface :TDirectDrawSurface;
m_ObjSurface :TDirectDrawSurface; //0x0C
m_FogScreen :array[0..MAPSURFACEHEIGHT, 0..MAPSURFACEWIDTH] of byte;
m_PFogScreen :PByte;
m_nFogWidth :Integer;
m_nFogHeight :Integer;
m_Lights :array[0..MAXLIGHT] of TLightEffect;
m_dwMoveTime :LongWord;
m_nMoveStepCount:Integer;
m_dwAniTime :LongWord;
m_nAniCount :Integer;
m_nDefXX :Integer;
m_nDefYY :Integer;
m_MainSoundTimer:TTimer;
m_MsgList :TList;
m_LightMap :array[0..LMX, 0..LMY] of TLightMapInfo;
procedure DrawTileMap;
procedure LoadFog;
procedure ClearLightMap;
procedure AddLight (x, y, shiftx, shifty, light: integer; nocheck: Boolean);
procedure UpdateBright (x, y, light: integer);
function CheckOverLight (x, y, light: integer): Boolean;
procedure ApplyLightMap;
procedure DrawLightEffect (lx, ly, bright: integer);
procedure EdChatKeyPress (Sender: TObject; var Key: Char);
procedure SoundOnTimer (Sender: TObject);
function CrashManEx(mx, my: integer): Boolean;
procedure ClearDropItem();
public
EdChat: TEdit;
MemoLog: TMemo;
EdAccountt: TEdit;//2004/05/17
EdChrNamet: TEdit;//2004/05/17
{
EdChgChrName: TEdit;
EdChgCurPwd: TEdit;
EdChgNewPwd: TEdit;
EdChgRePwd: TEdit;
}
m_ActorList :TList;
m_TempList :TList;
m_GroundEffectList :TList; //官蹿俊 彬府绰 付过 府胶飘
m_EffectList :TList; //付过瓤苞 府胶飘
m_FlyList :TList; //朝酒促聪绰 巴 (带柳档尝, 芒, 拳混)
m_dwBlinkTime :LongWord;
m_boViewBlink :Boolean;
constructor Create;
destructor Destroy; override;
procedure Initialize; override;
procedure Finalize; override;
procedure OpenScene; override;
procedure CloseScene; override;
procedure OpeningScene; override;
procedure DrawMiniMap (surface: TDirectDrawSurface);
procedure PlayScene (MSurface: TDirectDrawSurface); override;
function ButchAnimal (x, y: integer): TActor;
function FindActor (id: integer): TActor;overload;
function FindActor (sName:String): TActor;overload;
function FindActorXY (x, y: integer): TActor;
function IsValidActor (actor: TActor): Boolean;
function NewActor (chrid: integer; cx, cy, cdir: word; cfeature, cstate: integer): TActor;
procedure ActorDied (actor: TObject); //磷篮 actor绰 盖 困肺
procedure SetActorDrawLevel (actor: TObject; level: integer);
procedure ClearActors;
function DeleteActor (id: integer): TActor;
procedure DelActor (actor: TObject);
procedure SendMsg (ident, chrid, x, y, cdir, feature, state: integer; str: string);
procedure NewMagic (aowner: TActor;
magid, magnumb, cx, cy, tx, ty, targetcode: integer;
mtype: TMagicType;
Recusion: Boolean;
anitime: integer;
var bofly: Boolean);
procedure DelMagic (magid: integer);
function NewFlyObject (aowner: TActor; cx, cy, tx, ty, targetcode: integer; mtype: TMagicType): TMagicEff;
//function NewStaticMagic (aowner: TActor; tx, ty, targetcode, effnum: integer);
procedure ScreenXYfromMCXY (cx, cy: integer; var sx, sy: integer);
procedure CXYfromMouseXY (mx, my: integer; var ccx, ccy: integer);
function GetCharacter (x, y, wantsel: integer; var nowsel: integer; liveonly: Boolean): TActor;
function GetAttackFocusCharacter (x, y, wantsel: integer; var nowsel: integer; liveonly: Boolean): TActor;
function IsSelectMyself (x, y: integer): Boolean;
function GetDropItems (x, y: integer; var inames: string): PTDropItem;
function GetXYDropItems (nX,nY:Integer):pTDropItem;
procedure GetXYDropItemsList (nX,nY:Integer;var ItemList:TList);
function CanRun (sx, sy, ex, ey: integer): Boolean;
function CanWalk (mx, my: integer): Boolean;
function CanWalkEx (mx, my: integer): Boolean;
function CrashMan (mx, my: integer): Boolean; //荤恩尝府 般摹绰啊?
function CanFly (mx, my: integer): Boolean;
procedure RefreshScene;
procedure CleanObjects;
end;
implementation
uses
ClMain, FState;
constructor TPlayScene.Create;
var
nx,ny:Integer;
begin
m_MapSurface := nil;
m_ObjSurface := nil;
m_MsgList := TList.Create; //消息列表
m_ActorList := TList.Create; //角色列表
m_TempList := TList.Create;
m_GroundEffectList := TList.Create;
m_EffectList := TList.Create;
m_FlyList := TList.Create;
m_dwBlinkTime := GetTickCount;
m_boViewBlink := FALSE;
//聊天信息输入框
EdChat := TEdit.Create (FrmMain.Owner);
with EdChat do begin
Parent := FrmMain;
BorderStyle := bsNone;
OnKeyPress := EdChatKeyPress;
Visible := FALSE;
MaxLength := 70;
Ctl3D := FALSE;
Left := 208;
Top := SCREENHEIGHT - 19;
Height := 12;
Width := (SCREENWIDTH div 2 - 207) * 2{387};
Color := clSilver;
end;
MemoLog:=TMemo.Create(FrmMain.Owner);
with MemoLog do begin
Parent := FrmMain;
BorderStyle := bsNone;
Visible := False;
// Visible := True;
Ctl3D := True;
Left := 0;
Top := 250;
Width := 300;
Height := 150;
end;
//2004/05/17
EdAccountt := TEdit.Create (FrmMain.Owner);
with EdAccountt do begin
Parent := FrmMain;
BorderStyle := bsSingle;
Visible := False;
MaxLength := 70;
Ctl3D := True;
Left := (SCREENWIDTH - 194) div 2;
Top := SCREENHEIGHT - 200;
Height := 12;
Width := 194;
end;
//2004/05/17
//2004/05/17
EdChrNamet := TEdit.Create (FrmMain.Owner);
with EdChrNamet do begin
Parent := FrmMain;
BorderStyle := bsSingle;
Visible := False;
MaxLength := 70;
Ctl3D := True;
Left := (SCREENWIDTH - 194) div 2;
Top := SCREENHEIGHT - 176;
Height := 12;
Width := 194;
end;
//2004/05/17
m_dwMoveTime := GetTickCount;
m_dwAniTime := GetTickCount;
m_nAniCount := 0;
m_nMoveStepCount := 0;
m_MainSoundTimer := TTimer.Create (FrmMain.Owner);
with m_MainSoundTimer do begin
OnTimer := SoundOnTimer;
Interval := 1;
Enabled := FALSE;
end;
{
nx:=192;
ny:=150;
}
nx := SCREENWIDTH div 2 - 210 {192}{192};
ny := SCREENHEIGHT div 2 - 150{146}{150};
{
EdChgChrName := TEdit.Create (FrmMain.Owner);
with EdChgChrName do begin
Parent:=FrmMain;
Height:=16;
Width:=137;
Left:=nx + 239;
Top:=ny + 117;
BorderStyle:=bsNone;
Color:=clBlack;
Font.Color:=clWhite;
MaxLength:=10;
Visible:=FALSE;
//OnKeyPress:=EdNewIdKeyPress;
//OnEnter:=EdNewOnEnter;
Tag:=12;
end;
EdChgCurPwd := TEdit.Create (FrmMain.Owner);
with EdChgCurPwd do begin
Parent:=FrmMain;
Height:=16;
Width:=137;
Left:=nx+239;
Top:=ny+149;
BorderStyle:=bsNone;
Color:=clBlack;
Font.Color:=clWhite;
MaxLength:=10;
PasswordChar:='*';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -