Merge pull request 'feat/TD-011-add-scenes-screens' (#10) from dev into main
Reviewed-on: #10
This commit is contained in:
commit
6c4c204a07
@ -8,7 +8,7 @@ const
|
|||||||
BorderSize = 1;
|
BorderSize = 1;
|
||||||
CellSize = 2;
|
CellSize = 2;
|
||||||
LifeBarX = 33;
|
LifeBarX = 33;
|
||||||
ScreenW = (ArenaW - 1) * CellSize + BorderSize * 2; { 79 }
|
ScreenW = (ArenaW - 1) * CellSize + BorderSize * 2; { 82 }
|
||||||
InterfaceBarH = ScreenW - ArenaH * CellSize - BorderSize * 2; { 14 }
|
InterfaceBarH = ScreenW - ArenaH * CellSize - BorderSize * 2; { 14 }
|
||||||
InterfaceCellW = ScreenW div 3;
|
InterfaceCellW = ScreenW div 3;
|
||||||
InterfaceH = 6;
|
InterfaceH = 6;
|
||||||
@ -20,6 +20,7 @@ procedure DrawArenaCell(arenaX, arenaY: integer; symbol: char);
|
|||||||
procedure DrawArenaEdges;
|
procedure DrawArenaEdges;
|
||||||
procedure DrawEdge(x, y: integer; var a: arena);
|
procedure DrawEdge(x, y: integer; var a: arena);
|
||||||
procedure DrawLevel;
|
procedure DrawLevel;
|
||||||
|
procedure DrawRectangle(x0, y0, h, w: integer);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -157,6 +158,7 @@ end;
|
|||||||
|
|
||||||
procedure DrawLevel;
|
procedure DrawLevel;
|
||||||
begin
|
begin
|
||||||
|
clrscr;
|
||||||
DrawRectangle(1, 1, ScreenH, ScreenW * WidthCoefficient);
|
DrawRectangle(1, 1, ScreenH, ScreenW * WidthCoefficient);
|
||||||
DrawInterface
|
DrawInterface
|
||||||
end;
|
end;
|
||||||
|
|||||||
@ -207,10 +207,11 @@ end;
|
|||||||
|
|
||||||
procedure SetArenaBorder(var t: tracePtr; var a: arena);
|
procedure SetArenaBorder(var t: tracePtr; var a: arena);
|
||||||
begin
|
begin
|
||||||
if t = nil then
|
if t <> nil then
|
||||||
exit;
|
begin
|
||||||
a.borders[t^.x][t^.y] := true;
|
a.borders[t^.x][t^.y] := true;
|
||||||
SetArenaBorder(t^.prev, a)
|
SetArenaBorder(t^.prev, a)
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function IsOnEdge(var cr: creature): boolean;
|
function IsOnEdge(var cr: creature): boolean;
|
||||||
@ -395,7 +396,6 @@ begin
|
|||||||
a.borders[x + 1][y] and a.borders[x][y - 1]
|
a.borders[x + 1][y] and a.borders[x][y - 1]
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function IsConvexCorner(var cr: creature; var a: arena): boolean;
|
function IsConvexCorner(var cr: creature; var a: arena): boolean;
|
||||||
var
|
var
|
||||||
x, y, nextX, nextY: integer;
|
x, y, nextX, nextY: integer;
|
||||||
|
|||||||
178
src/ascii_arts_m.pas
Normal file
178
src/ascii_arts_m.pas
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
unit ascii_arts_m;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
const
|
||||||
|
DigitHeight = 5;
|
||||||
|
DigitWidth = 5;
|
||||||
|
DigitsAscii: array[0..9] of array[1..DigitHeight] of string = (
|
||||||
|
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
'@ @',
|
||||||
|
'@ @',
|
||||||
|
'@ @',
|
||||||
|
'@@@@@'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
' @ ',
|
||||||
|
' @@ ',
|
||||||
|
'@ @ ',
|
||||||
|
' @ ',
|
||||||
|
'@@@@@'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
' @',
|
||||||
|
'@@@@@',
|
||||||
|
'@ ',
|
||||||
|
'@@@@@'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
' @',
|
||||||
|
'@@@@@',
|
||||||
|
' @',
|
||||||
|
'@@@@@'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@ @',
|
||||||
|
'@ @',
|
||||||
|
'@@@@@',
|
||||||
|
' @',
|
||||||
|
' @'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
'@ ',
|
||||||
|
'@@@@@',
|
||||||
|
' @',
|
||||||
|
'@@@@@'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
'@ ',
|
||||||
|
'@@@@@',
|
||||||
|
'@ @',
|
||||||
|
'@@@@@'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
' @',
|
||||||
|
' @',
|
||||||
|
' @',
|
||||||
|
' @'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
'@ @',
|
||||||
|
'@@@@@',
|
||||||
|
'@ @',
|
||||||
|
'@@@@@'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'@@@@@',
|
||||||
|
'@ @',
|
||||||
|
'@@@@@',
|
||||||
|
' @',
|
||||||
|
'@@@@@'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
GameNameHeight = 6;
|
||||||
|
GameNameWidth = 58;
|
||||||
|
GameNameAscii: array[1..GameNameHeight] of string = (
|
||||||
|
' _____ _ _ _ _',
|
||||||
|
' / ____| | | | | | | | |',
|
||||||
|
'| | __ ___ | | | |__| | __ _ _ __ ___ ___| |_ ___ _ __',
|
||||||
|
'| | |_ |/ _ \| | | __ |/ _` | ''_ ` _ \/ __| __/ _ \ ''__|',
|
||||||
|
'| |__| | (_) |_| | | | | (_| | | | | | \__ \ || __/ |',
|
||||||
|
' \_____|\___/(_) |_| |_|\__,_|_| |_| |_|___/\__\___|_|'
|
||||||
|
);
|
||||||
|
NewGameHeight = 6;
|
||||||
|
NewGameAscii: array[1..NewGameHeight] of string = (
|
||||||
|
' _ _ _____',
|
||||||
|
'| \ | | / ____|',
|
||||||
|
'| \| | _____ __ | | __ __ _ _ __ ___ ___',
|
||||||
|
'| . ` |/ _ \ \ /\ / / | | |_ |/ _` | ''_ ` _ \ / _ \',
|
||||||
|
'| |\ | __/\ V V / | |__| | (_| | | | | | | __/',
|
||||||
|
'|_| \_|\___| \_/\_/ \_____|\__,_|_| |_| |_|\___|'
|
||||||
|
);
|
||||||
|
HighScoreHeight = 8;
|
||||||
|
HighScoreAscii: array[1..HighScoreHeight] of string = (
|
||||||
|
' _ _ _ _ _____',
|
||||||
|
'| | | (_) | | / ____|',
|
||||||
|
'| |__| |_ __ _| |__ | (___ ___ ___ _ __ ___',
|
||||||
|
'| __ | |/ _` | ''_ \ \___ \ / __/ _ \| ''__/ _ \',
|
||||||
|
'| | | | | (_| | | | | ____) | (_| (_) | | | __/',
|
||||||
|
'|_| |_|_|\__, |_| |_| |_____/ \___\___/|_| \___|',
|
||||||
|
' __/ |',
|
||||||
|
' |___/'
|
||||||
|
);
|
||||||
|
|
||||||
|
KeyInfoHeight = 8;
|
||||||
|
KeyInfoAscii: array[1..KeyInfoHeight] of string = (
|
||||||
|
' _ __ _____ __',
|
||||||
|
'| |/ / |_ _| / _|',
|
||||||
|
'| '' / ___ _ _ | | _ __ | |_ ___',
|
||||||
|
'| < / _ \ | | | | | | ''_ \| _/ _ \',
|
||||||
|
'| . \ __/ |_| | _| |_| | | | || (_) |',
|
||||||
|
'|_|\_\___|\__, | |_____|_| |_|_| \___/',
|
||||||
|
' __/ |',
|
||||||
|
' |___/'
|
||||||
|
);
|
||||||
|
|
||||||
|
ContinueHeight = 6;
|
||||||
|
ContinueAscii: array[1..ContinueHeight] of string = (
|
||||||
|
' _____ _ _ ',
|
||||||
|
' / ____| | | (_) ',
|
||||||
|
'| | ___ _ __ | |_ _ _ __ _ _ ___ ',
|
||||||
|
'| | / _ \| ''_ \| __| | ''_ \| | | |/ _ \',
|
||||||
|
'| |___| (_) | | | | |_| | | | | |_| | __/',
|
||||||
|
' \_____\___/|_| |_|\__|_|_| |_|\__,_|\___|'
|
||||||
|
);
|
||||||
|
|
||||||
|
ExitHeight = 8;
|
||||||
|
ExitWidth = 70;
|
||||||
|
ExitAscii: array[1..ExitHeight] of string = (
|
||||||
|
' ______ _ _ _ _ ___',
|
||||||
|
'| ____| (_) | | | | | |__ \',
|
||||||
|
'| |__ __ ___| |_ | |_| |__ ___ __ _ __ _ _ __ ___ ___ ) |',
|
||||||
|
'| __| \ \/ / | __| | __| ''_ \ / _ \ / _` |/ _` | ''_ ` _ \ / _ \/ /',
|
||||||
|
'| |____ > <| | |_ | |_| | | | __/ | (_| | (_| | | | | | | __/_|',
|
||||||
|
'|______/_/\_\_|\__| \__|_| |_|\___| \__, |\__,_|_| |_| |_|\___(_)',
|
||||||
|
' __/ |',
|
||||||
|
' |___/'
|
||||||
|
);
|
||||||
|
|
||||||
|
YesHeight = 6;
|
||||||
|
YesAscii: array[1..YesHeight] of string = (
|
||||||
|
' _ _ ___ ___',
|
||||||
|
'| | | |/ _ \/ __|',
|
||||||
|
'| |_| | __/\__ \',
|
||||||
|
' \__, |\___||___/',
|
||||||
|
' __/ |',
|
||||||
|
' |___/'
|
||||||
|
);
|
||||||
|
|
||||||
|
NoHeight = 4;
|
||||||
|
NoWidth = 13;
|
||||||
|
NoAscii: array[1..NoHeight] of string = (
|
||||||
|
' _ __ ___',
|
||||||
|
'| ''_ \ / _ \',
|
||||||
|
'| | | | (_) |',
|
||||||
|
'|_| |_|\___/'
|
||||||
|
);
|
||||||
|
|
||||||
|
HamsterHeight = 5;
|
||||||
|
HamsterWidth = 7;
|
||||||
|
HamsterStayAscii: array[1..HamsterHeight] of string = (
|
||||||
|
' (\_/)',
|
||||||
|
'( o_o )',
|
||||||
|
'/-----\',
|
||||||
|
' |___|',
|
||||||
|
' / \'
|
||||||
|
);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
end.
|
||||||
|
|
||||||
@ -3,18 +3,32 @@ unit game_m;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
type
|
type
|
||||||
|
state = (gameExit, gameMenu, gamePause, gameLevel);
|
||||||
|
menuState = (menuNewGame, menuHighScore, menuKeyInfo, menuContinue);
|
||||||
|
exitState = (exitYes, exitNo);
|
||||||
|
|
||||||
gameState = record
|
gameState = record
|
||||||
|
curExit: exitState;
|
||||||
|
curMenu: menuState;
|
||||||
|
curState: state;
|
||||||
|
hamsterAlive: boolean;
|
||||||
score, life, speedBonus, slowBonus: integer;
|
score, life, speedBonus, slowBonus: integer;
|
||||||
paused, level, hamsterAlive: boolean;
|
shutdown: boolean
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DecreaseLife(var g: gameState);
|
procedure DecreaseLife(var g: gameState);
|
||||||
procedure GameOver(var g: gameState);
|
procedure GameOver(var g: gameState);
|
||||||
procedure InitGame(var g: gameState);
|
procedure InitGame(var g: gameState);
|
||||||
|
procedure NextExitState(var g: gameState);
|
||||||
|
procedure NextMenuState(var g: gameState);
|
||||||
|
procedure PreviousExitState(var g: gameState);
|
||||||
|
procedure PreviousMenuState(var g: gameState);
|
||||||
|
procedure RunExit(var g: gameState);
|
||||||
|
procedure RunMenu(var g: gameState);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses graphics_m;
|
uses crt, arena_graphics_m, graphics_m, keys_m;
|
||||||
|
|
||||||
const
|
const
|
||||||
StartScore = 0;
|
StartScore = 0;
|
||||||
@ -22,6 +36,7 @@ const
|
|||||||
BonusTurns = 45;
|
BonusTurns = 45;
|
||||||
StartSpeedBonus = 0;
|
StartSpeedBonus = 0;
|
||||||
StartSlowBonus = 0;
|
StartSlowBonus = 0;
|
||||||
|
KeyDelayMs = 25;
|
||||||
|
|
||||||
procedure InitGame(var g: gameState);
|
procedure InitGame(var g: gameState);
|
||||||
begin
|
begin
|
||||||
@ -29,7 +44,10 @@ begin
|
|||||||
g.life := StartLifes;
|
g.life := StartLifes;
|
||||||
g.speedBonus := StartSpeedBonus;
|
g.speedBonus := StartSpeedBonus;
|
||||||
g.slowBonus := StartSlowBonus;
|
g.slowBonus := StartSlowBonus;
|
||||||
g.hamsterAlive := true
|
g.hamsterAlive := true;
|
||||||
|
g.curState := gameMenu;
|
||||||
|
g.curMenu := menuNewGame;
|
||||||
|
g.shutdown := false
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DecreaseLife(var g: gameState);
|
procedure DecreaseLife(var g: gameState);
|
||||||
@ -38,6 +56,72 @@ begin
|
|||||||
DrawLifes(g)
|
DrawLifes(g)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure RunMenu(var g: gameState);
|
||||||
|
begin
|
||||||
|
g.curState := gameMenu;
|
||||||
|
DrawMenu(g);
|
||||||
|
while g.curState = gameMenu do
|
||||||
|
begin
|
||||||
|
delay(KeyDelayMs);
|
||||||
|
if keypressed then
|
||||||
|
HandleMenuKey(g);
|
||||||
|
if g.shutdown then
|
||||||
|
break;
|
||||||
|
if g.curState = gameExit then
|
||||||
|
begin
|
||||||
|
g.curState := gameMenu;
|
||||||
|
DrawMenu(g)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RunExit(var g: gameState);
|
||||||
|
var
|
||||||
|
keep: boolean = true;
|
||||||
|
begin
|
||||||
|
g.curState := gameExit;
|
||||||
|
DrawExit(g);
|
||||||
|
while keep do
|
||||||
|
begin
|
||||||
|
delay(KeyDelayMs);
|
||||||
|
if keypressed then
|
||||||
|
HandleExitKey(keep, g)
|
||||||
|
end;
|
||||||
|
EraseExit
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure PreviousMenuState(var g: gameState);
|
||||||
|
begin
|
||||||
|
if g.curMenu = menuNewGame then
|
||||||
|
g.curMenu := menuContinue
|
||||||
|
else
|
||||||
|
g.curMenu := pred(g.curMenu)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure NextMenuState(var g: gameState);
|
||||||
|
begin
|
||||||
|
if g.curMenu = menuContinue then
|
||||||
|
g.curMenu := menuNewGame
|
||||||
|
else
|
||||||
|
g.curMenu := succ(g.curMenu)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure NextExitState(var g: gameState);
|
||||||
|
begin
|
||||||
|
if g.curExit = exitNo then
|
||||||
|
g.curExit := exitYes
|
||||||
|
else
|
||||||
|
g.curExit := succ(g.curExit)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure PreviousExitState(var g: gameState);
|
||||||
|
begin
|
||||||
|
if g.curExit = exitYes then
|
||||||
|
g.curExit := exitNo
|
||||||
|
else
|
||||||
|
g.curExit := pred(g.curExit)
|
||||||
|
end;
|
||||||
|
|
||||||
procedure GameOver(var g: gameState);
|
procedure GameOver(var g: gameState);
|
||||||
begin
|
begin
|
||||||
end;
|
end;
|
||||||
|
|||||||
@ -5,18 +5,16 @@ uses crt, arena_m, arena_graphics_m, trace_m, creature_m, graphics_m,
|
|||||||
const
|
const
|
||||||
DelaySizeMs = 100;
|
DelaySizeMs = 100;
|
||||||
|
|
||||||
procedure RunLevel;
|
procedure RunLevel(var game: gameState);
|
||||||
var
|
var
|
||||||
h, g: creature;
|
h, g: creature;
|
||||||
a: arena;
|
a: arena;
|
||||||
t: tracePtr = nil;
|
t: tracePtr = nil;
|
||||||
continueLevel: boolean = true;
|
continueLevel: boolean = true;
|
||||||
game: gameState;
|
|
||||||
begin
|
begin
|
||||||
InitArena(a);
|
InitArena(a);
|
||||||
InitHamster(h);
|
InitHamster(h);
|
||||||
InitGhost(g);
|
InitGhost(g);
|
||||||
InitGame(game);
|
|
||||||
DrawCreature(h);
|
DrawCreature(h);
|
||||||
DrawCreature(g);
|
DrawCreature(g);
|
||||||
DrawScore(game);
|
DrawScore(game);
|
||||||
@ -58,15 +56,18 @@ begin
|
|||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
g: gameState;
|
||||||
begin
|
begin
|
||||||
if not IsTerminalValid then
|
if not IsTerminalValid then
|
||||||
begin
|
begin
|
||||||
PrintTerminalHelp;
|
PrintTerminalHelp;
|
||||||
exit
|
exit
|
||||||
end;
|
end;
|
||||||
|
InitGame(g);
|
||||||
|
{RunLevel(g);}
|
||||||
clrscr;
|
clrscr;
|
||||||
DrawLevel;
|
RunMenu(g);
|
||||||
RunLevel;
|
|
||||||
clrscr
|
clrscr
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
@ -8,22 +8,52 @@ function IsTerminalValid: boolean;
|
|||||||
procedure DrawAfterStep(var cr: creature; var a: arena);
|
procedure DrawAfterStep(var cr: creature; var a: arena);
|
||||||
procedure DrawAfterStep(var hamster: creature; var t: tracePtr; var a: arena);
|
procedure DrawAfterStep(var hamster: creature; var t: tracePtr; var a: arena);
|
||||||
procedure DrawCreature(var cr: creature);
|
procedure DrawCreature(var cr: creature);
|
||||||
procedure DrawLifes(var game: GameState);
|
procedure DrawExitState(s: exitState);
|
||||||
procedure DrawScore(var game: GameState);
|
procedure DrawExit(var g: gameState);
|
||||||
|
procedure DrawLifes(var g: GameState);
|
||||||
|
procedure DrawMenuState(s: menuState);
|
||||||
|
procedure DrawMenu(var g: gameState);
|
||||||
|
procedure DrawScore(var g: GameState);
|
||||||
|
procedure EraseExit;
|
||||||
|
procedure EraseExitState(s: exitState);
|
||||||
|
procedure EraseMenu;
|
||||||
|
procedure EraseMenuState(s: menuState);
|
||||||
procedure EraseStepTrace(var hamster: creature; t: tracePtr);
|
procedure EraseStepTrace(var hamster: creature; t: tracePtr);
|
||||||
procedure EraseTrace(t: tracePtr; var a: arena);
|
procedure EraseTrace(t: tracePtr; var a: arena);
|
||||||
procedure PrintTerminalHelp;
|
procedure PrintTerminalHelp;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses crt, math_m;
|
uses crt, math_m, ascii_arts_m;
|
||||||
|
|
||||||
const
|
const
|
||||||
LetterWidth = 6;
|
BigLetterWidth = 8;
|
||||||
Notation = 10;
|
DigitWidth = 6;
|
||||||
DigitSpaceSize = 1;
|
GameNameX = ScreenW * WidthCoefficient div 3 + 4;
|
||||||
InterfaceMarginY = InterfaceBarH div 4 + BorderSize + 1;
|
GameNameY = 12;
|
||||||
|
NameHeightPadding = 8;
|
||||||
|
MenuHeightPadding = 2;
|
||||||
|
MenuWidthPadding = 4;
|
||||||
|
MenuHamsterX = GameNameX - HamsterWidth - MenuWidthPadding;
|
||||||
|
NewGameY = GameNameY + GameNameHeight + NameHeightPadding;
|
||||||
|
HighScoreY = NewGameY + NewGameHeight + MenuHeightPadding;
|
||||||
|
KeyInfoY = HighScoreY + HighScoreHeight;
|
||||||
|
ContinueY = KeyInfoY + KeyInfoHeight;
|
||||||
InterfaceMarginX = InterfaceCellW div 4;
|
InterfaceMarginX = InterfaceCellW div 4;
|
||||||
|
InterfaceMarginY = InterfaceBarH div 4 + BorderSize + 1;
|
||||||
|
LetterWidth = 5;
|
||||||
|
Notation = 10;
|
||||||
|
PunctuationWidth = 3;
|
||||||
|
SpaceWidth = 3;
|
||||||
|
ExitGameY = ScreenH div 2 - ExitHeight - MenuHeightPadding;
|
||||||
|
ExitYesX = MenuHamsterX;
|
||||||
|
ExitYesY = ExitGameY + ExitHeight + MenuHeightPadding;
|
||||||
|
ExitNoX = ScreenW * WidthCoefficient - ExitYesX - NoWidth;
|
||||||
|
ExitHamsterY = ExitYesY;
|
||||||
|
HamsterYesX = ExitYesX - HamsterWidth - MenuWidthPadding;
|
||||||
|
HamsterNoX = ExitNoX - HamsterWidth - MenuWidthPadding;
|
||||||
|
var
|
||||||
|
firstMenuDraw: boolean = true;
|
||||||
|
|
||||||
function IsTerminalValid: boolean;
|
function IsTerminalValid: boolean;
|
||||||
begin
|
begin
|
||||||
@ -139,161 +169,11 @@ begin
|
|||||||
DrawCreature(cr)
|
DrawCreature(cr)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DrawZero(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawOne(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write(' @ ');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write(' @@ ');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@ @ ');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write(' @ ');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawTwo(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write('@ ');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawThree(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawFour(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawFive(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write('@ ');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawSix(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write('@ ');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawSeven(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawEight(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawNine(x, y: integer);
|
|
||||||
begin
|
|
||||||
GotoXY(x, y);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 1);
|
|
||||||
write('@ @');
|
|
||||||
GotoXY(x, y + 2);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(x, y + 3);
|
|
||||||
write(' @');
|
|
||||||
GotoXY(x, y + 4);
|
|
||||||
write('@@@@@');
|
|
||||||
GotoXY(1, 1)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure FillRectangle(x, y, w, h: integer; ch: char);
|
procedure FillRectangle(x, y, w, h: integer; ch: char);
|
||||||
var
|
var
|
||||||
i, j: integer;
|
i, j: integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to h do
|
for i := 0 to h - 1 do
|
||||||
begin
|
begin
|
||||||
GotoXY(x, y + i);
|
GotoXY(x, y + i);
|
||||||
for j := 0 to w do
|
for j := 0 to w do
|
||||||
@ -338,30 +218,26 @@ begin
|
|||||||
dispose(tmp)
|
dispose(tmp)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure DrawAscii(x, y, h: integer; var a: array of string);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := 1 to h do
|
||||||
|
begin
|
||||||
|
GotoXY(x, y + i - 1);
|
||||||
|
write(a[i - 1])
|
||||||
|
end;
|
||||||
|
GotoXY(1, 1)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure EraseRectangle(x, y, w, h: integer);
|
||||||
|
begin
|
||||||
|
FillRectangle(x, y, w, h, ' ')
|
||||||
|
end;
|
||||||
|
|
||||||
procedure DrawDigit(x, y, digit: integer);
|
procedure DrawDigit(x, y, digit: integer);
|
||||||
begin
|
begin
|
||||||
case digit of
|
DrawAscii(x, y, DigitHeight, DigitsAscii[digit])
|
||||||
0:
|
|
||||||
DrawZero(x, y);
|
|
||||||
1:
|
|
||||||
DrawOne(x, y);
|
|
||||||
2:
|
|
||||||
DrawTwo(x, y);
|
|
||||||
3:
|
|
||||||
DrawThree(x, y);
|
|
||||||
4:
|
|
||||||
DrawFour(x, y);
|
|
||||||
5:
|
|
||||||
DrawFive(x, y);
|
|
||||||
6:
|
|
||||||
DrawSix(x, y);
|
|
||||||
7:
|
|
||||||
DrawSeven(x, y);
|
|
||||||
8:
|
|
||||||
DrawEight(x, y);
|
|
||||||
9:
|
|
||||||
DrawNine(x, y)
|
|
||||||
end
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DrawNumber(interfaceX: integer; s: longint);
|
procedure DrawNumber(interfaceX: integer; s: longint);
|
||||||
@ -382,22 +258,128 @@ begin
|
|||||||
y := InterfaceMarginY;
|
y := InterfaceMarginY;
|
||||||
while st.top <> nil do
|
while st.top <> nil do
|
||||||
begin
|
begin
|
||||||
DrawDigit(x + (LetterWidth + DigitSpaceSize) * i, y, st.top^.val);
|
DrawDigit(x + (DigitWidth + SpaceWidth) * i, y, st.top^.val);
|
||||||
StackPop(st);
|
StackPop(st);
|
||||||
i := i + 1
|
i := i + 1
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DrawLifes(var game: GameState);
|
procedure DrawLifes(var g: GameState);
|
||||||
begin
|
begin
|
||||||
DrawNumber(LifeBarX, game.life)
|
DrawNumber(LifeBarX, g.life)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DrawScore(var game: GameState);
|
procedure DrawScore(var g: GameState);
|
||||||
var
|
var
|
||||||
killBarX: integer = InterfaceCellW * 2 * WidthCoefficient + BorderSize;
|
killBarX: integer = InterfaceCellW * 2 * WidthCoefficient + BorderSize;
|
||||||
begin
|
begin
|
||||||
DrawNumber(killBarX, game.score)
|
DrawNumber(killBarX, g.score)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure EraseAll;
|
||||||
|
begin
|
||||||
|
FillRectangle(2, 2, (ScreenW - 2) * WidthCoefficient, ScreenH - 2, ' ')
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawMenuState(s: menuState);
|
||||||
|
begin
|
||||||
|
case s of
|
||||||
|
menuNewGame:
|
||||||
|
DrawAscii(MenuHamsterX, NewGameY + 1,
|
||||||
|
HamsterHeight, HamsterStayAscii);
|
||||||
|
menuHighScore:
|
||||||
|
DrawAscii(MenuHamsterX, HighScoreY + 1,
|
||||||
|
HamsterHeight, HamsterStayAscii);
|
||||||
|
menuKeyInfo:
|
||||||
|
DrawAscii(MenuHamsterX, KeyInfoY + 1,
|
||||||
|
HamsterHeight, HamsterStayAscii);
|
||||||
|
menuContinue:
|
||||||
|
DrawAscii(MenuHamsterX, ContinueY + 1,
|
||||||
|
HamsterHeight, HamsterStayAscii)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawMenu(var g: gameState);
|
||||||
|
var
|
||||||
|
y: integer = GameNameY;
|
||||||
|
begin
|
||||||
|
if firstMenuDraw then
|
||||||
|
begin
|
||||||
|
DrawRectangle(1, 1, ScreenH, ScreenW * WidthCoefficient);
|
||||||
|
firstMenuDraw := not firstMenuDraw
|
||||||
|
end;
|
||||||
|
DrawAscii(GameNameX, y, GameNameHeight, GameNameAscii);
|
||||||
|
DrawAscii(GameNameX, NewGameY, NewGameHeight, NewGameAscii);
|
||||||
|
DrawAscii(GameNameX, HighScoreY, HighScoreHeight, HighScoreAscii);
|
||||||
|
DrawAscii(GameNameX, KeyInfoY, KeyInfoHeight, KeyInfoAscii);
|
||||||
|
DrawAscii(GameNameX, ContinueY, ContinueHeight, ContinueAscii);
|
||||||
|
DrawMenuState(g.curMenu)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure EraseMenuState(s: menuState);
|
||||||
|
begin
|
||||||
|
case s of
|
||||||
|
menuNewGame:
|
||||||
|
EraseRectangle(MenuHamsterX, NewGameY + 1,
|
||||||
|
HamsterWidth, HamsterHeight);
|
||||||
|
menuHighScore:
|
||||||
|
EraseRectangle(MenuHamsterX, HighScoreY + 1,
|
||||||
|
HamsterWidth, HamsterHeight);
|
||||||
|
menuKeyInfo:
|
||||||
|
EraseRectangle(MenuHamsterX, KeyInfoY + 1,
|
||||||
|
HamsterWidth, HamsterHeight);
|
||||||
|
menuContinue:
|
||||||
|
EraseRectangle(MenuHamsterX, ContinueY + 1,
|
||||||
|
HamsterWidth, HamsterHeight)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure EraseMenu;
|
||||||
|
begin
|
||||||
|
EraseRectangle(MenuHamsterX, GameNameY,
|
||||||
|
GameNameWidth + HamsterWidth + MenuWidthPadding,
|
||||||
|
ScreenH - GameNameY * 2)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawExitState(s: exitState);
|
||||||
|
begin
|
||||||
|
case s of
|
||||||
|
exitYes:
|
||||||
|
DrawAscii(HamsterYesX, ExitHamsterY,
|
||||||
|
HamsterHeight, HamsterStayAscii);
|
||||||
|
exitNo:
|
||||||
|
DrawAscii(HamsterNoX, ExitHamsterY,
|
||||||
|
HamsterHeight, HamsterStayAscii)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawExit(var g: gameState);
|
||||||
|
var
|
||||||
|
realX: integer = ScreenW * WidthCoefficient;
|
||||||
|
begin
|
||||||
|
DrawAscii((realX - ExitWidth) div 2, ExitGameY, ExitHeight, ExitAscii);
|
||||||
|
DrawAscii(ExitYesX, ExitYesY, YesHeight, YesAscii);
|
||||||
|
DrawAscii(ExitNoX, ExitYesY, NoHeight, NoAscii);
|
||||||
|
DrawExitState(g.curExit)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure EraseExitState(s: exitState);
|
||||||
|
begin
|
||||||
|
case s of
|
||||||
|
exitYes:
|
||||||
|
EraseRectangle(HamsterYesX, ExitHamsterY,
|
||||||
|
HamsterWidth, HamsterHeight);
|
||||||
|
exitNo:
|
||||||
|
EraseRectangle(HamsterNoX, ExitHamsterY,
|
||||||
|
HamsterWidth, HamsterHeight)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure EraseExit;
|
||||||
|
begin
|
||||||
|
EraseRectangle(HamsterYesX, ExitGameY,
|
||||||
|
ExitWidth + HamsterWidth + MenuWidthPadding,
|
||||||
|
ExitHeight + MenuHeightPadding + YesHeight)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
108
src/keys_m.pas
108
src/keys_m.pas
@ -2,16 +2,21 @@ unit keys_m;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses crt, creature_m, arena_m, trace_m, hamster_m, debug_m;
|
uses crt, creature_m, arena_m, game_m, trace_m, hamster_m, debug_m;
|
||||||
|
|
||||||
const
|
const
|
||||||
SpaceOrd = 32;
|
ArrowDownOrd = -80;
|
||||||
EscOrd = 27;
|
|
||||||
CtrlCOrd = 3;
|
|
||||||
ArrowLeftOrd = -75;
|
ArrowLeftOrd = -75;
|
||||||
ArrowRightOrd = -77;
|
ArrowRightOrd = -77;
|
||||||
ArrowDownOrd = -80;
|
|
||||||
ArrowUpOrd = -72;
|
ArrowUpOrd = -72;
|
||||||
|
CtrlCOrd = 3;
|
||||||
|
EnterOrd = 13;
|
||||||
|
EscOrd = 27;
|
||||||
|
LowerNOrd = 110;
|
||||||
|
LowerYOrd = 121;
|
||||||
|
SpaceOrd = 32;
|
||||||
|
UpperNOrd = 78;
|
||||||
|
UpperYOrd = 89;
|
||||||
{ Debug }
|
{ Debug }
|
||||||
BOrd = 98;
|
BOrd = 98;
|
||||||
COrd = 99;
|
COrd = 99;
|
||||||
@ -19,11 +24,15 @@ const
|
|||||||
{ Debug }
|
{ Debug }
|
||||||
|
|
||||||
procedure GetKey(var keyCode: integer);
|
procedure GetKey(var keyCode: integer);
|
||||||
|
procedure HandleExitKey(var keep: boolean; var g: gameState);
|
||||||
procedure HandleKey(var h: creature; var continueLevel: boolean;
|
procedure HandleKey(var h: creature; var continueLevel: boolean;
|
||||||
var a: arena; var t: tracePtr);
|
var a: arena; var t: tracePtr);
|
||||||
|
procedure HandleMenuKey(var g: gameState);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
uses graphics_m;
|
||||||
|
|
||||||
procedure GetKey(var keyCode: integer);
|
procedure GetKey(var keyCode: integer);
|
||||||
var
|
var
|
||||||
c: char;
|
c: char;
|
||||||
@ -40,11 +49,11 @@ begin
|
|||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ChangeHamsterDelta(keyCode: integer; var h: creature);
|
procedure ChangeHamsterDelta(k: integer; var h: creature);
|
||||||
begin
|
begin
|
||||||
h.dX := 0;
|
h.dX := 0;
|
||||||
h.dY := 0;
|
h.dY := 0;
|
||||||
case keyCode of
|
case k of
|
||||||
ArrowLeftOrd:
|
ArrowLeftOrd:
|
||||||
h.dX := -h.movespeed;
|
h.dX := -h.movespeed;
|
||||||
ArrowRightOrd:
|
ArrowRightOrd:
|
||||||
@ -61,15 +70,15 @@ end;
|
|||||||
procedure HandleKey(var h: creature; var continueLevel: boolean;
|
procedure HandleKey(var h: creature; var continueLevel: boolean;
|
||||||
var a: arena; var t: tracePtr);
|
var a: arena; var t: tracePtr);
|
||||||
var
|
var
|
||||||
keyCode: integer;
|
k: integer;
|
||||||
begin
|
begin
|
||||||
GetKey(keyCode);
|
GetKey(k);
|
||||||
{DEBUG}
|
{DEBUG}
|
||||||
if keyCode = BOrd then
|
if k = BOrd then
|
||||||
Print(a.borders);
|
Print(a.borders);
|
||||||
if keyCode = COrd then
|
if k = COrd then
|
||||||
Print(a.captured);
|
Print(a.captured);
|
||||||
if keyCode = LOrd then
|
if k = LOrd then
|
||||||
begin
|
begin
|
||||||
GotoXY(2, 60);
|
GotoXY(2, 60);
|
||||||
write(' ');
|
write(' ');
|
||||||
@ -78,14 +87,79 @@ begin
|
|||||||
GotoXY(1, 1)
|
GotoXY(1, 1)
|
||||||
end;
|
end;
|
||||||
{DEBUG}
|
{DEBUG}
|
||||||
if (keyCode = ArrowLeftOrd) or (keyCode = ArrowRightOrd) or
|
if (k = ArrowLeftOrd) or (k = ArrowRightOrd) or (k = ArrowUpOrd) or
|
||||||
(keyCode = ArrowUpOrd) or (keyCode = ArrowDownOrd) or
|
(k = ArrowDownOrd) or (k = SpaceOrd) then
|
||||||
(keyCode = SpaceOrd) then
|
|
||||||
begin
|
begin
|
||||||
ChangeHamsterDelta(keyCode, h)
|
ChangeHamsterDelta(k, h)
|
||||||
end;
|
end;
|
||||||
if (keyCode = EscOrd) or (keyCode = CtrlCOrd) then
|
if (k = EscOrd) or (k = CtrlCOrd) then
|
||||||
continueLevel := false
|
continueLevel := false
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ChangeMenuState(k: integer; var g: gameState);
|
||||||
|
begin
|
||||||
|
case k of
|
||||||
|
ArrowUpOrd:
|
||||||
|
PreviousMenuState(g);
|
||||||
|
ArrowDownOrd:
|
||||||
|
NextMenuState(g)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure HandleMenuKey(var g: gameState);
|
||||||
|
var
|
||||||
|
k: integer;
|
||||||
|
begin
|
||||||
|
GetKey(k);
|
||||||
|
if (k = ArrowUpOrd) or (k = ArrowDownOrd) then
|
||||||
|
begin
|
||||||
|
EraseMenuState(g.curMenu);
|
||||||
|
ChangeMenuState(k, g);
|
||||||
|
DrawMenuState(g.curMenu)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if k = EscOrd then
|
||||||
|
begin
|
||||||
|
g.curState := gameExit;
|
||||||
|
EraseMenu;
|
||||||
|
RunExit(g)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ChangeExitState(k: integer; var g: gameState);
|
||||||
|
begin
|
||||||
|
case k of
|
||||||
|
ArrowRightOrd:
|
||||||
|
NextExitState(g);
|
||||||
|
ArrowLeftOrd:
|
||||||
|
PreviousExitState(g)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure HandleExitKey(var keep: boolean; var g: gameState);
|
||||||
|
var
|
||||||
|
k: integer;
|
||||||
|
begin
|
||||||
|
GetKey(k);
|
||||||
|
if (k = ArrowLeftOrd) or (k = ArrowRightOrd) then
|
||||||
|
begin
|
||||||
|
EraseExitState(g.curExit);
|
||||||
|
ChangeExitState(k, g);
|
||||||
|
DrawExitState(g.curExit);
|
||||||
|
exit
|
||||||
|
end;
|
||||||
|
if k = EnterOrd then
|
||||||
|
begin
|
||||||
|
if g.curExit = exitYes then
|
||||||
|
g.shutdown := true
|
||||||
|
else
|
||||||
|
g.curExit := exitYes;
|
||||||
|
end;
|
||||||
|
if (k = UpperYOrd) or (k = LowerYOrd) then
|
||||||
|
g.shutdown := true;
|
||||||
|
if (k = UpperNOrd) or (k = LowerNOrd) or (k = EscOrd) then
|
||||||
|
g.curExit := exitYes;
|
||||||
|
keep := false
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user