📄 players.pas
字号:
unit Players;
interface
uses
TmpObj,
Blocks,
Buffers,
Figures,
Glitter,
Enemies,
BackGr,
VGA256,
Music,
Txt,
KeyBoard,
Joystick,
Crt;
const
stOnTheGround = 0;
stJumping = 1;
stFalling = 2;
SCROLL_AT = 112;
JumpVel = 4;
JumpDelay = 6;
MaxYVel = JumpVel * 2;
Slip = 6;
BlinkTime = 125;
StarTime = 750;
GrowTime = 24;
MAX_SPEED = 2;
var
Blinking,
Growing,
InPipe: Boolean;
PipeCode: array [1 .. 2] of Char;
MapX,
MapY: Integer;
EarthQuake: Boolean;
EarthQuakeCounter: Integer;
Small: Integer;
procedure InitPlayerFigures;
procedure InitPlayer (InitX, InitY: Integer; Name: Byte);
procedure DrawPlayer;
procedure ErasePlayer;
procedure DoDemo;
procedure MovePlayer;
implementation
{$I SWMAR.$00} {$I SWMAR.$01}
{$I SJMAR.$00} {$I SJMAR.$01}
{$I LWMAR.$00} {$I LWMAR.$01}
{$I LJMAR.$00} {$I LJMAR.$01}
{$I FWMAR.$00} {$I FWMAR.$01}
{$I FJMAR.$00} {$I FJMAR.$01}
{$I SWLUI.$00} {$I SWLUI.$01}
{$I SJLUI.$00} {$I SJLUI.$01}
{$I LWLUI.$00} {$I LWLUI.$01}
{$I LJLUI.$00} {$I LJLUI.$01}
{$I FWLUI.$00} {$I FWLUI.$01}
{$I FJLUI.$00} {$I FJLUI.$01}
const
Safe = EY1;
HSafe = H * Safe;
var
keyLeft,
keyRight,
keyUp,
keyDown,
keyAlt,
keyCtrl,
keyLeftShift,
keyRightShift,
keySpace: Boolean;
type
ScreenRec = record
Visible: Boolean;
XPos,
YPos: Integer;
{ Buffer: PicBuffer; }
BackGrAddr: Word;
end;
var
SaveScreen: Array [0 .. MAX_PAGE] of ScreenRec;
var
X,
Y,
OldX,
OldY,
DemoX,
DemoY,
DemoCounter1,
DemoCounter2,
XVel,
YVel: Integer;
Direction,
Status,
WalkingMode,
Counter,
WalkCount: Byte;
HighJump,
HitEnemy,
Jumped,
Fired: Boolean;
FireCounter,
StarCounter,
GrowCounter,
BlinkCounter: Integer;
AtCh1,
AtCh2,
Below1,
Below2: Char;
procedure HighMirror (P1, P2: Pointer);
type
PlaneBuffer = array[0..2 * H - 1, 0..W div 4 - 1] of Byte;
PlaneBufferArray = array[0..3] of PlaneBuffer;
PlaneBufferArrayPtr = ^PlaneBufferArray;
var
Source, Dest: PlaneBufferArrayPtr;
procedure Swap (Plane1, Plane2: Byte);
var
i, j: Byte;
begin
for j := 0 to 2 * H - 1 do
for i := 0 to W div 4 - 1 do
begin
Dest^[Plane2, j, i] := Source^[Plane1, j, W div 4 - 1 - i];
Dest^[Plane1, j, i] := Source^[Plane2, j, W div 4 - 1 - i];
end;
end;
begin
Source := P1;
Dest := P2;
Swap (0, 3);
Swap (1, 2);
end;
procedure InitPlayerFigures;
var
Pl, Md, N: Byte;
begin
FillChar (Pictures^, SizeOf (Pictures^), #$FF);
Move (@SWMar000^, Pictures^ [plMario, mdSmall, 0, dirLeft], SizeOf (PicBuffer));
Move (@SWMar001^, Pictures^ [plMario, mdSmall, 1, dirLeft], SizeOf (PicBuffer));
Move (@SJMar000^, Pictures^ [plMario, mdSmall, 2, dirLeft], SizeOf (PicBuffer));
Move (@SJMar001^, Pictures^ [plMario, mdSmall, 3, dirLeft], SizeOf (PicBuffer));
Move (@LWMar000^, Pictures^ [plMario, mdLarge, 0, dirLeft], SizeOf (PicBuffer));
Move (@LWMar001^, Pictures^ [plMario, mdLarge, 1, dirLeft], SizeOf (PicBuffer));
Move (@LJMar000^, Pictures^ [plMario, mdLarge, 2, dirLeft], SizeOf (PicBuffer));
Move (@LJMar001^, Pictures^ [plMario, mdLarge, 3, dirLeft], SizeOf (PicBuffer));
Move (@FWMar000^, Pictures^ [plMario, mdFire, 0, dirLeft], SizeOf (PicBuffer));
Move (@FWMar001^, Pictures^ [plMario, mdFire, 1, dirLeft], SizeOf (PicBuffer));
Move (@FJMar000^, Pictures^ [plMario, mdFire, 2, dirLeft], SizeOf (PicBuffer));
Move (@FJMar001^, Pictures^ [plMario, mdFire, 3, dirLeft], SizeOf (PicBuffer));
Move (@SWLui000^, Pictures^ [plLuigi, mdSmall, 0, dirLeft], SizeOf (PicBuffer));
Move (@SWLui001^, Pictures^ [plLuigi, mdSmall, 1, dirLeft], SizeOf (PicBuffer));
Move (@SJLui000^, Pictures^ [plLuigi, mdSmall, 2, dirLeft], SizeOf (PicBuffer));
Move (@SJLui001^, Pictures^ [plLuigi, mdSmall, 3, dirLeft], SizeOf (PicBuffer));
Move (@LWLui000^, Pictures^ [plLuigi, mdLarge, 0, dirLeft], SizeOf (PicBuffer));
Move (@LWLui001^, Pictures^ [plLuigi, mdLarge, 1, dirLeft], SizeOf (PicBuffer));
Move (@LJLui000^, Pictures^ [plLuigi, mdLarge, 2, dirLeft], SizeOf (PicBuffer));
Move (@LJLui001^, Pictures^ [plLuigi, mdLarge, 3, dirLeft], SizeOf (PicBuffer));
Move (@FWLui000^, Pictures^ [plLuigi, mdFire, 0, dirLeft], SizeOf (PicBuffer));
Move (@FWLui001^, Pictures^ [plLuigi, mdFire, 1, dirLeft], SizeOf (PicBuffer));
Move (@FJLui000^, Pictures^ [plLuigi, mdFire, 2, dirLeft], SizeOf (PicBuffer));
Move (@FJLui001^, Pictures^ [plLuigi, mdFire, 3, dirLeft], SizeOf (PicBuffer));
for Pl := plMario to plLuigi do
for Md := mdSmall to mdFire do
for N := 0 to 3 do
HighMirror (@Pictures^ [Pl, Md, N, dirLeft], @Pictures^ [Pl, Md, N, dirRight]);
end;
procedure InitPlayer (InitX, InitY: Integer; Name: Byte);
var
i: Integer;
begin
Player := Name;
X := InitX;
Y := InitY;
OldX := X;
OldY := Y;
XVel := 0;
YVel := 0;
Direction := dirRight;
WalkingMode := 0;
Status := stOnTheGround;
Jumped := False;
Fired := False;
HitEnemy := False;
for i := 0 to MAX_PAGE do
SaveScreen [i]. Visible := False;
PlayerX1 := X;
PlayerX2 := X + W - 1;
PlayerY1 := Y + H;
PlayerY2 := Y + 2 * H - 1;
PlayerXVel := XVel;
PlayerYVel := YVel;
Blinking := False;
Star := False;
Growing := False;
EarthQuake := False;
end;
procedure DrawDemo;
var
i, j: Integer;
begin
with SaveScreen [CurrentPage] do
begin
{ GetImage (X, Y, W, 2 * H, Buffer); }
BackGrAddr := PushBackGr (X, Y, W + 4, 2 * H);
XPos := X;
YPos := Y;
Visible := True;
end;
case Demo of
dmDownInToPipe,
dmUpOutOfPipe:
begin
DrawPart (X, Y + DemoY, W, 2 * H, 0, 2 * H - DemoY - 1,
Pictures^ [Player, Data.Mode [Player], WalkingMode, Direction]);
end;
dmUpInToPipe,
dmDownOutOfPipe:
begin
DrawPart (X, Y + DemoY, W, 2 * H, -DemoY, 2 * H,
Pictures^ [Player, Data.Mode [Player], WalkingMode, Direction]);
Redraw (MapX, MapY - 1);
Redraw (MapX + 1, MapY - 1);
end;
dmDead:
begin
DrawImage (X, Y, W, 2 * H,
Pictures^ [Player, Data.Mode [Player], WalkingMode, Direction]);
end;
end;
OldX := X;
OldY := Y;
end;
procedure DrawPlayer;
begin
if Demo <> dmNoDemo then
begin
DrawDemo;
Exit;
end;
if (not Blinking) or (BlinkCounter mod 2 = 0) then
begin
with SaveScreen [CurrentPage] do
begin
{ GetImage (X, Y, W, 2 * H, Buffer); }
BackGrAddr := PushBackGr (X, Y, W + 4, 2 * H);
XPos := X;
YPos := Y;
Visible := True;
end;
if (Data.Mode [Player] = mdFire) and keySpace and (FireCounter < 7) then
begin
Inc (FireCounter);
DrawPart (X, Y + 1, W, 2 * H, 0, 20,
Pictures^ [Player, mdFire, 1, Direction]);
DrawPart (X, Y, W, 2 * H, 21, 2 * H,
Pictures^ [Player, mdFire, 0, Direction]);
end
else
if Star or Growing then
RecolorImage (X, Y, W, 2 * H, Pictures^ [Player, Data.Mode [Player],
WalkingMode, Direction],
((GrowCounter + StarCounter) and 1) shl 4 -
Byte ((GrowCounter + StarCounter) and $F < 8))
else
DrawImage (X, Y, W, 2 * H, Pictures^ [Player, Data.Mode [Player], WalkingMode,
Direction]);
OldX := X;
OldY := Y;
end;
end;
procedure ErasePlayer;
begin
with SaveScreen [CurrentPage] do
begin
if not Visible then
Exit;
{ PutImage (XPos, YPos, W, 2 * H, Buffer); }
PopBackGr ({XPos, YPos, W + 4, 2 * H,} BackGrAddr);
Visible := False;
end;
end;
procedure DoDemo;
begin
Small := 9 * Byte (Data.Mode [Player] in [mdSmall]);
case Demo of
dmDownInToPipe,
dmUpOutOfPipe:
begin
if PipeCode [1] = '
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -