Merge pull request 'feat/TD-012-add-pause' (#11) from dev into main
Reviewed-on: #11
This commit is contained in:
commit
2b302ab82e
@ -21,6 +21,7 @@ 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);
|
procedure DrawRectangle(x0, y0, h, w: integer);
|
||||||
|
procedure DrawInterface;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@ const
|
|||||||
DigitHeight = 5;
|
DigitHeight = 5;
|
||||||
DigitWidth = 5;
|
DigitWidth = 5;
|
||||||
DigitsAscii: array[0..9] of array[1..DigitHeight] of string = (
|
DigitsAscii: array[0..9] of array[1..DigitHeight] of string = (
|
||||||
|
|
||||||
(
|
(
|
||||||
'@@@@@',
|
'@@@@@',
|
||||||
'@ @',
|
'@ @',
|
||||||
@ -78,6 +77,7 @@ const
|
|||||||
'@@@@@'
|
'@@@@@'
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
GameNameHeight = 6;
|
GameNameHeight = 6;
|
||||||
GameNameWidth = 58;
|
GameNameWidth = 58;
|
||||||
GameNameAscii: array[1..GameNameHeight] of string = (
|
GameNameAscii: array[1..GameNameHeight] of string = (
|
||||||
@ -122,6 +122,7 @@ const
|
|||||||
);
|
);
|
||||||
|
|
||||||
ContinueHeight = 6;
|
ContinueHeight = 6;
|
||||||
|
ContinueWidth = 41;
|
||||||
ContinueAscii: array[1..ContinueHeight] of string = (
|
ContinueAscii: array[1..ContinueHeight] of string = (
|
||||||
' _____ _ _ ',
|
' _____ _ _ ',
|
||||||
' / ____| | | (_) ',
|
' / ____| | | (_) ',
|
||||||
@ -144,6 +145,36 @@ const
|
|||||||
' |___/'
|
' |___/'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
PauseHeight = 22;
|
||||||
|
PauseWidth = 76;
|
||||||
|
|
||||||
|
{ Too long strings :(, lets following linux styleguide }
|
||||||
|
PauseAscii: array[1..PauseHeight] of string = (
|
||||||
|
' _',
|
||||||
|
' | |',
|
||||||
|
' _ __ __ _ _ _ ___ ___ __| |',
|
||||||
|
' | ''_ \ / _` | | | / __|/ _ \/ _` |',
|
||||||
|
' | |_) | (_| | |_| \__ \ __/ (_| |',
|
||||||
|
' | .__/ \__,_|\__,_|___/\___|\__,_| ',
|
||||||
|
' | | ',
|
||||||
|
' |_| _ _',
|
||||||
|
' | | (_)',
|
||||||
|
' ___ _ __ __ _ __ ___ ______ ___ ___ _ __ | |_ _ _ __ _ _ ___',
|
||||||
|
'/ __| ''_ \ / _` |/ __/ _ \ |______| / __/ _ \| ''_ \| __| | ''_ \| | | |/ _ \',
|
||||||
|
'\__ \ |_) | (_| | (_| __/ | (_| (_) | | | | |_| | | | | |_| | __/',
|
||||||
|
'|___/ .__/ \__,_|\___\___| \___\___/|_| |_|\__|_|_| |_|\__,_|\___|',
|
||||||
|
' | |',
|
||||||
|
' |_| _ _ _',
|
||||||
|
' (_) | | |',
|
||||||
|
' __ _ ______ __ _ _ _ _| |_ | |_ ___ _ __ ___ ___ _ __ _ _',
|
||||||
|
' / _` | |______| / _` | | | | | __| | __/ _ \ | ''_ ` _ \ / _ \ ''_ \| | | |',
|
||||||
|
'| (_| | | (_| | |_| | | |_ | || (_) | | | | | | | __/ | | | |_| |',
|
||||||
|
' \__, | \__, |\__,_|_|\__| \__\___/ |_| |_| |_|\___|_| |_|\__,_|',
|
||||||
|
' | | | |',
|
||||||
|
' |_| |_|'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
YesHeight = 6;
|
YesHeight = 6;
|
||||||
YesAscii: array[1..YesHeight] of string = (
|
YesAscii: array[1..YesHeight] of string = (
|
||||||
' _ _ ___ ___',
|
' _ _ ___ ___',
|
||||||
@ -163,11 +194,20 @@ const
|
|||||||
'|_| |_|\___/'
|
'|_| |_|\___/'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
HamsterHeight = 5;
|
HamsterHeight = 5;
|
||||||
HamsterWidth = 7;
|
HamsterWidth = 7;
|
||||||
HamsterStayAscii: array[1..HamsterHeight] of string = (
|
HamsterStayAscii: array[1..HamsterHeight] of string = (
|
||||||
' (\_/)',
|
' (\_/)',
|
||||||
'( o_o )',
|
'( 0_0 )',
|
||||||
|
'/-----\',
|
||||||
|
' |___|',
|
||||||
|
' / \'
|
||||||
|
);
|
||||||
|
HamsterGGAscii: array[1..HamsterHeight] of string = (
|
||||||
|
' (\_/)',
|
||||||
|
'( G_G )',
|
||||||
'/-----\',
|
'/-----\',
|
||||||
' |___|',
|
' |___|',
|
||||||
' / \'
|
' / \'
|
||||||
|
|||||||
207
src/game_m.pas
207
src/game_m.pas
@ -3,32 +3,34 @@ unit game_m;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
type
|
type
|
||||||
state = (gameExit, gameMenu, gamePause, gameLevel);
|
state = (gameExit, gameMenu, gameScore, gameInfo,
|
||||||
|
gamePause, gameLevel, gameOver);
|
||||||
menuState = (menuNewGame, menuHighScore, menuKeyInfo, menuContinue);
|
menuState = (menuNewGame, menuHighScore, menuKeyInfo, menuContinue);
|
||||||
exitState = (exitYes, exitNo);
|
exitState = (exitYes, exitNo);
|
||||||
|
|
||||||
gameState = record
|
gameState = record
|
||||||
curExit: exitState;
|
curExit: exitState;
|
||||||
curMenu: menuState;
|
curMenu: menuState;
|
||||||
curState: state;
|
curState: state;
|
||||||
hamsterAlive: boolean;
|
hamsterAlive: boolean;
|
||||||
score, life, speedBonus, slowBonus: integer;
|
score, level, life, speedBonus, slowBonus: integer;
|
||||||
shutdown: boolean
|
shutdown, continueAllowed: boolean
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DecreaseLife(var g: gameState);
|
procedure DecreaseLife(var g: gameState);
|
||||||
procedure GameOver(var g: gameState);
|
procedure RunGameover(var g: gameState);
|
||||||
procedure InitGame(var g: gameState);
|
procedure InitGame(var g: gameState);
|
||||||
procedure NextExitState(var g: gameState);
|
procedure NextExitState(var g: gameState);
|
||||||
procedure NextMenuState(var g: gameState);
|
procedure NextMenuState(var g: gameState);
|
||||||
procedure PreviousExitState(var g: gameState);
|
procedure PreviousExitState(var g: gameState);
|
||||||
procedure PreviousMenuState(var g: gameState);
|
procedure PreviousMenuState(var g: gameState);
|
||||||
|
procedure RunLevel(var g: gameState);
|
||||||
procedure RunExit(var g: gameState);
|
procedure RunExit(var g: gameState);
|
||||||
procedure RunMenu(var g: gameState);
|
procedure RunState(var g: gameState);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses crt, arena_graphics_m, graphics_m, keys_m;
|
uses arena_m, arena_graphics_m, crt, creature_m, ghost_m, graphics_m,
|
||||||
|
hamster_m, keys_m, trace_m;
|
||||||
|
|
||||||
const
|
const
|
||||||
StartScore = 0;
|
StartScore = 0;
|
||||||
@ -37,18 +39,7 @@ const
|
|||||||
StartSpeedBonus = 0;
|
StartSpeedBonus = 0;
|
||||||
StartSlowBonus = 0;
|
StartSlowBonus = 0;
|
||||||
KeyDelayMs = 25;
|
KeyDelayMs = 25;
|
||||||
|
LevelDelayMs = 100;
|
||||||
procedure InitGame(var g: gameState);
|
|
||||||
begin
|
|
||||||
g.score := StartScore;
|
|
||||||
g.life := StartLifes;
|
|
||||||
g.speedBonus := StartSpeedBonus;
|
|
||||||
g.slowBonus := StartSlowBonus;
|
|
||||||
g.hamsterAlive := true;
|
|
||||||
g.curState := gameMenu;
|
|
||||||
g.curMenu := menuNewGame;
|
|
||||||
g.shutdown := false
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DecreaseLife(var g: gameState);
|
procedure DecreaseLife(var g: gameState);
|
||||||
begin
|
begin
|
||||||
@ -56,30 +47,24 @@ begin
|
|||||||
DrawLifes(g)
|
DrawLifes(g)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure RunMenu(var g: gameState);
|
procedure InitGame(var g: gameState);
|
||||||
begin
|
begin
|
||||||
|
g.continueAllowed := false;
|
||||||
|
g.curMenu := menuNewGame;
|
||||||
g.curState := gameMenu;
|
g.curState := gameMenu;
|
||||||
DrawMenu(g);
|
g.hamsterAlive := true;
|
||||||
while g.curState = gameMenu do
|
g.level := 1;
|
||||||
begin
|
g.life := StartLifes;
|
||||||
delay(KeyDelayMs);
|
g.score := StartScore;
|
||||||
if keypressed then
|
g.shutdown := false;
|
||||||
HandleMenuKey(g);
|
g.slowBonus := StartSlowBonus;
|
||||||
if g.shutdown then
|
g.speedBonus := StartSpeedBonus
|
||||||
break;
|
|
||||||
if g.curState = gameExit then
|
|
||||||
begin
|
|
||||||
g.curState := gameMenu;
|
|
||||||
DrawMenu(g)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure RunExit(var g: gameState);
|
procedure RunExit(var g: gameState);
|
||||||
var
|
var
|
||||||
keep: boolean = true;
|
keep: boolean = true;
|
||||||
begin
|
begin
|
||||||
g.curState := gameExit;
|
|
||||||
DrawExit(g);
|
DrawExit(g);
|
||||||
while keep do
|
while keep do
|
||||||
begin
|
begin
|
||||||
@ -90,8 +75,149 @@ begin
|
|||||||
EraseExit
|
EraseExit
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure RunScore(var g: gameState);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RunInfo(var g: gameState);
|
||||||
|
var
|
||||||
|
keep: boolean = true;
|
||||||
|
begin
|
||||||
|
DrawInfo;
|
||||||
|
while keep do
|
||||||
|
begin
|
||||||
|
delay(KeyDelayMs);
|
||||||
|
if keypressed then
|
||||||
|
HandleInfoKey(keep, g)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RunPause(var g: gameState);
|
||||||
|
var
|
||||||
|
keep: boolean = true;
|
||||||
|
begin
|
||||||
|
DrawPause(g);
|
||||||
|
while keep do
|
||||||
|
begin
|
||||||
|
delay(KeyDelayMs);
|
||||||
|
if keypressed then
|
||||||
|
HandlePauseKey(keep, g)
|
||||||
|
end
|
||||||
|
{ErasePause(g)}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RunGameover(var g: gameState);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RunLevel(var g: gameState);
|
||||||
|
var
|
||||||
|
h, ghost: creature;
|
||||||
|
a: arena;
|
||||||
|
t: tracePtr = nil;
|
||||||
|
continueLevel: boolean = true;
|
||||||
|
begin
|
||||||
|
InitArena(a);
|
||||||
|
InitHamster(h);
|
||||||
|
InitGhost(ghost);
|
||||||
|
DrawInterface;
|
||||||
|
DrawCreature(h);
|
||||||
|
DrawCreature(ghost);
|
||||||
|
DrawScore(g);
|
||||||
|
DrawLifes(g);
|
||||||
|
while continueLevel do
|
||||||
|
begin
|
||||||
|
delay(LevelDelayMs);
|
||||||
|
if ArenaSplited(h, t, a) then
|
||||||
|
begin
|
||||||
|
SetArenaBorder(t, a);
|
||||||
|
CutSmallerPart(h, t, a)
|
||||||
|
end;
|
||||||
|
if ghost.alive then
|
||||||
|
MakeEnemyStep(ghost, h, t, a);
|
||||||
|
while ghost.alive and GhostShouldTurn(ghost, a) do
|
||||||
|
TurnGhost(ghost, a);
|
||||||
|
if not h.alive then
|
||||||
|
begin
|
||||||
|
if g.life >= 0 then
|
||||||
|
begin
|
||||||
|
DecreaseLife(g);
|
||||||
|
KillHamster(h, t, a);
|
||||||
|
h.alive := true
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
RunGameover(g)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
if keypressed then
|
||||||
|
HandleLevelKey(h, a, t, g);
|
||||||
|
if not HamsterStepPossible(h, t, a) then
|
||||||
|
StopCreature(h);
|
||||||
|
if not ((h.dX = 0) and (h.dY = 0)) then
|
||||||
|
MakeHamsterStep(h, t, a);
|
||||||
|
if ghost.alive and a.captured[ghost.curX][ghost.curY] then
|
||||||
|
KillCreature(ghost);
|
||||||
|
if g.curState = gamePause then
|
||||||
|
break
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RunMenu(var g: gameState);
|
||||||
|
var
|
||||||
|
prevMenu: boolean = false;
|
||||||
|
begin
|
||||||
|
g.curState := gameMenu;
|
||||||
|
while g.curState = gameMenu do
|
||||||
|
begin
|
||||||
|
if (g.curState = gameMenu) and not prevMenu then
|
||||||
|
begin
|
||||||
|
DrawMenu(g);
|
||||||
|
prevMenu := true
|
||||||
|
end;
|
||||||
|
delay(KeyDelayMs);
|
||||||
|
if keypressed then
|
||||||
|
HandleMenuKey(g);
|
||||||
|
if (g.curState <> gameMenu) and prevMenu then
|
||||||
|
begin
|
||||||
|
EraseMenu;
|
||||||
|
prevMenu := false
|
||||||
|
end;
|
||||||
|
if (g.curState <> gameMenu) then
|
||||||
|
if g.shutdown then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RunState(var g: gameState);
|
||||||
|
begin
|
||||||
|
while not g.shutdown do
|
||||||
|
begin
|
||||||
|
case g.curState of
|
||||||
|
gameExit:
|
||||||
|
RunExit(g);
|
||||||
|
gameScore:
|
||||||
|
RunScore(g);
|
||||||
|
gameInfo:
|
||||||
|
RunInfo(g);
|
||||||
|
gamePause:
|
||||||
|
RunPause(g);
|
||||||
|
gameLevel:
|
||||||
|
RunLevel(g);
|
||||||
|
gameOver:
|
||||||
|
RunGameover(g);
|
||||||
|
gameMenu:
|
||||||
|
RunMenu(g)
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
EraseAll
|
||||||
|
end;
|
||||||
|
|
||||||
procedure PreviousMenuState(var g: gameState);
|
procedure PreviousMenuState(var g: gameState);
|
||||||
begin
|
begin
|
||||||
|
if (g.curMenu = menuNewGame) and not g.continueAllowed then
|
||||||
|
g.curMenu := menuKeyInfo
|
||||||
|
else
|
||||||
if g.curMenu = menuNewGame then
|
if g.curMenu = menuNewGame then
|
||||||
g.curMenu := menuContinue
|
g.curMenu := menuContinue
|
||||||
else
|
else
|
||||||
@ -100,10 +226,15 @@ end;
|
|||||||
|
|
||||||
procedure NextMenuState(var g: gameState);
|
procedure NextMenuState(var g: gameState);
|
||||||
begin
|
begin
|
||||||
if g.curMenu = menuContinue then
|
if (g.curMenu = menuKeyInfo) and not g.continueAllowed or
|
||||||
|
(g.curMenu = menuContinue) then
|
||||||
|
begin
|
||||||
g.curMenu := menuNewGame
|
g.curMenu := menuNewGame
|
||||||
|
end
|
||||||
else
|
else
|
||||||
|
begin
|
||||||
g.curMenu := succ(g.curMenu)
|
g.curMenu := succ(g.curMenu)
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure NextExitState(var g: gameState);
|
procedure NextExitState(var g: gameState);
|
||||||
@ -122,8 +253,4 @@ begin
|
|||||||
g.curExit := pred(g.curExit)
|
g.curExit := pred(g.curExit)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure GameOver(var g: gameState);
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
@ -1,58 +1,23 @@
|
|||||||
program go_hamster;
|
program go_hamster;
|
||||||
uses crt, arena_m, arena_graphics_m, trace_m, creature_m, graphics_m,
|
uses crt, keys_m, arena_graphics_m, graphics_m, game_m, debug_m;
|
||||||
hamster_m, keys_m, ghost_m, game_m, debug_m;
|
|
||||||
|
|
||||||
const
|
function IsTerminalValid: boolean;
|
||||||
DelaySizeMs = 100;
|
|
||||||
|
|
||||||
procedure RunLevel(var game: gameState);
|
|
||||||
var
|
|
||||||
h, g: creature;
|
|
||||||
a: arena;
|
|
||||||
t: tracePtr = nil;
|
|
||||||
continueLevel: boolean = true;
|
|
||||||
begin
|
begin
|
||||||
InitArena(a);
|
IsTerminalValid := (ScreenWidth >= ScreenW) and (ScreenHeight >= ScreenH)
|
||||||
InitHamster(h);
|
end;
|
||||||
InitGhost(g);
|
|
||||||
DrawCreature(h);
|
|
||||||
DrawCreature(g);
|
|
||||||
DrawScore(game);
|
|
||||||
DrawLifes(game);
|
|
||||||
|
|
||||||
while continueLevel do
|
procedure PrintTerminalHelp;
|
||||||
|
begin
|
||||||
|
writeln('Increase your terminal size and try again.');
|
||||||
|
if ScreenWidth < ScreenW then
|
||||||
begin
|
begin
|
||||||
delay(DelaySizeMs);
|
writeln('Your terminal width: ', ScreenWidth,
|
||||||
if ArenaSplited(h, t, a) then
|
'. Required: ', ScreenW, '.')
|
||||||
begin
|
end;
|
||||||
SetArenaBorder(t, a);
|
if ScreenHeight < ScreenH then
|
||||||
CutSmallerPart(h, t, a)
|
begin
|
||||||
end;
|
writeln('Your terminal height: ', ScreenHeight,
|
||||||
if g.alive then
|
'. Required: ', ScreenH, '.')
|
||||||
MakeEnemyStep(g, h, t, a);
|
|
||||||
while g.alive and GhostShouldTurn(g, a) do
|
|
||||||
TurnGhost(g, a);
|
|
||||||
if not h.alive then
|
|
||||||
begin
|
|
||||||
if game.life >= 0 then
|
|
||||||
begin
|
|
||||||
DecreaseLife(game);
|
|
||||||
KillHamster(h, t, a);
|
|
||||||
h.alive := true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
GameOver(game)
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
if keypressed then
|
|
||||||
HandleKey(h, continueLevel, a, t);
|
|
||||||
if not HamsterStepPossible(h, t, a) then
|
|
||||||
StopCreature(h);
|
|
||||||
if not ((h.dX = 0) and (h.dY = 0)) then
|
|
||||||
MakeHamsterStep(h, t, a);
|
|
||||||
if g.alive and a.captured[g.curX][g.curY] then
|
|
||||||
KillCreature(g)
|
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -65,9 +30,7 @@ begin
|
|||||||
exit
|
exit
|
||||||
end;
|
end;
|
||||||
InitGame(g);
|
InitGame(g);
|
||||||
{RunLevel(g);}
|
EraseAll;
|
||||||
clrscr;
|
RunState(g)
|
||||||
RunMenu(g);
|
|
||||||
clrscr
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
@ -4,23 +4,24 @@ interface
|
|||||||
|
|
||||||
uses arena_graphics_m, arena_m, creature_m, hamster_m, trace_m, game_m;
|
uses arena_graphics_m, arena_m, creature_m, hamster_m, trace_m, game_m;
|
||||||
|
|
||||||
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 DrawExitState(s: exitState);
|
procedure DrawExitState(s: exitState);
|
||||||
procedure DrawExit(var g: gameState);
|
procedure DrawExit(var g: gameState);
|
||||||
|
procedure DrawPause(var g: gameState);
|
||||||
|
procedure DrawInfo;
|
||||||
procedure DrawLifes(var g: GameState);
|
procedure DrawLifes(var g: GameState);
|
||||||
procedure DrawMenuState(s: menuState);
|
procedure DrawMenuState(s: menuState);
|
||||||
procedure DrawMenu(var g: gameState);
|
procedure DrawMenu(var g: gameState);
|
||||||
procedure DrawScore(var g: GameState);
|
procedure DrawScore(var g: GameState);
|
||||||
|
procedure EraseAll;
|
||||||
procedure EraseExit;
|
procedure EraseExit;
|
||||||
procedure EraseExitState(s: exitState);
|
procedure EraseExitState(s: exitState);
|
||||||
procedure EraseMenu;
|
procedure EraseMenu;
|
||||||
procedure EraseMenuState(s: menuState);
|
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;
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -52,29 +53,11 @@ const
|
|||||||
ExitHamsterY = ExitYesY;
|
ExitHamsterY = ExitYesY;
|
||||||
HamsterYesX = ExitYesX - HamsterWidth - MenuWidthPadding;
|
HamsterYesX = ExitYesX - HamsterWidth - MenuWidthPadding;
|
||||||
HamsterNoX = ExitNoX - HamsterWidth - MenuWidthPadding;
|
HamsterNoX = ExitNoX - HamsterWidth - MenuWidthPadding;
|
||||||
|
PauseXMargin = 3 * WidthCoefficient;
|
||||||
|
PauseYMargin = 1;
|
||||||
var
|
var
|
||||||
firstMenuDraw: boolean = true;
|
firstMenuDraw: boolean = true;
|
||||||
|
|
||||||
function IsTerminalValid: boolean;
|
|
||||||
begin
|
|
||||||
IsTerminalValid := (ScreenWidth >= ScreenW) and (ScreenHeight >= ScreenH)
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure PrintTerminalHelp;
|
|
||||||
begin
|
|
||||||
writeln('Increase your terminal size and try again.');
|
|
||||||
if ScreenWidth < ScreenW then
|
|
||||||
begin
|
|
||||||
writeln('Your terminal width: ', ScreenWidth,
|
|
||||||
'. Required: ', ScreenW, '.')
|
|
||||||
end;
|
|
||||||
if ScreenHeight < ScreenH then
|
|
||||||
begin
|
|
||||||
writeln('Your terminal height: ', ScreenHeight,
|
|
||||||
'. Required: ', ScreenH, '.')
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure EraseTrace(t: tracePtr; var a: arena);
|
procedure EraseTrace(t: tracePtr; var a: arena);
|
||||||
begin
|
begin
|
||||||
while t <> nil do
|
while t <> nil do
|
||||||
@ -276,11 +259,6 @@ begin
|
|||||||
DrawNumber(killBarX, g.score)
|
DrawNumber(killBarX, g.score)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure EraseAll;
|
|
||||||
begin
|
|
||||||
FillRectangle(2, 2, (ScreenW - 2) * WidthCoefficient, ScreenH - 2, ' ')
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DrawMenuState(s: menuState);
|
procedure DrawMenuState(s: menuState);
|
||||||
begin
|
begin
|
||||||
case s of
|
case s of
|
||||||
@ -313,6 +291,9 @@ begin
|
|||||||
DrawAscii(GameNameX, HighScoreY, HighScoreHeight, HighScoreAscii);
|
DrawAscii(GameNameX, HighScoreY, HighScoreHeight, HighScoreAscii);
|
||||||
DrawAscii(GameNameX, KeyInfoY, KeyInfoHeight, KeyInfoAscii);
|
DrawAscii(GameNameX, KeyInfoY, KeyInfoHeight, KeyInfoAscii);
|
||||||
DrawAscii(GameNameX, ContinueY, ContinueHeight, ContinueAscii);
|
DrawAscii(GameNameX, ContinueY, ContinueHeight, ContinueAscii);
|
||||||
|
if not g.continueAllowed then
|
||||||
|
FillRectangle(GameNameX, ContinueY + ContinueHeight div 2,
|
||||||
|
ContinueWidth, 1, '-');
|
||||||
DrawMenuState(g.curMenu)
|
DrawMenuState(g.curMenu)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -334,6 +315,11 @@ begin
|
|||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure EraseAll;
|
||||||
|
begin
|
||||||
|
EraseRectangle(1, 1, ScreenW * WidthCoefficient, ScreenH)
|
||||||
|
end;
|
||||||
|
|
||||||
procedure EraseMenu;
|
procedure EraseMenu;
|
||||||
begin
|
begin
|
||||||
EraseRectangle(MenuHamsterX, GameNameY,
|
EraseRectangle(MenuHamsterX, GameNameY,
|
||||||
@ -346,13 +332,33 @@ begin
|
|||||||
case s of
|
case s of
|
||||||
exitYes:
|
exitYes:
|
||||||
DrawAscii(HamsterYesX, ExitHamsterY,
|
DrawAscii(HamsterYesX, ExitHamsterY,
|
||||||
HamsterHeight, HamsterStayAscii);
|
HamsterHeight, HamsterGGAscii);
|
||||||
exitNo:
|
exitNo:
|
||||||
DrawAscii(HamsterNoX, ExitHamsterY,
|
DrawAscii(HamsterNoX, ExitHamsterY,
|
||||||
HamsterHeight, HamsterStayAscii)
|
HamsterHeight, HamsterStayAscii)
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure DrawPause(var g: gameState);
|
||||||
|
var
|
||||||
|
pauseX: integer = (ScreenW * WidthCoefficient - PauseWidth) div 2;
|
||||||
|
pauseY: integer = (ScreenH - PauseHeight) div 2;
|
||||||
|
begin
|
||||||
|
EraseRectangle(pauseX - PauseXMargin,
|
||||||
|
pauseY - PauseYMargin,
|
||||||
|
PauseWidth + PauseXMargin * 2 - 1,
|
||||||
|
PauseHeight + PauseYMargin * 2 + 1);
|
||||||
|
DrawRectangle(pauseX - PauseXMargin,
|
||||||
|
pauseY - PauseYMargin,
|
||||||
|
PauseHeight + PauseYMargin * 2 + 1,
|
||||||
|
PauseWidth + PauseXMargin * 2);
|
||||||
|
DrawAscii(pauseX, pauseY, PauseHeight, PauseAscii)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ErasePause(var g: gameState);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
procedure DrawExit(var g: gameState);
|
procedure DrawExit(var g: gameState);
|
||||||
var
|
var
|
||||||
realX: integer = ScreenW * WidthCoefficient;
|
realX: integer = ScreenW * WidthCoefficient;
|
||||||
@ -363,6 +369,10 @@ begin
|
|||||||
DrawExitState(g.curExit)
|
DrawExitState(g.curExit)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure DrawInfo;
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
procedure EraseExitState(s: exitState);
|
procedure EraseExitState(s: exitState);
|
||||||
begin
|
begin
|
||||||
case s of
|
case s of
|
||||||
|
|||||||
@ -17,6 +17,14 @@ const
|
|||||||
SpaceOrd = 32;
|
SpaceOrd = 32;
|
||||||
UpperNOrd = 78;
|
UpperNOrd = 78;
|
||||||
UpperYOrd = 89;
|
UpperYOrd = 89;
|
||||||
|
|
||||||
|
OneOrd = 49;
|
||||||
|
TwoOrd = 50;
|
||||||
|
ThreeOrd = 51;
|
||||||
|
FourOrd = 52;
|
||||||
|
UpperQOrd = 81;
|
||||||
|
LowerQOrd = 113;
|
||||||
|
|
||||||
{ Debug }
|
{ Debug }
|
||||||
BOrd = 98;
|
BOrd = 98;
|
||||||
COrd = 99;
|
COrd = 99;
|
||||||
@ -25,9 +33,11 @@ const
|
|||||||
|
|
||||||
procedure GetKey(var keyCode: integer);
|
procedure GetKey(var keyCode: integer);
|
||||||
procedure HandleExitKey(var keep: boolean; var g: gameState);
|
procedure HandleExitKey(var keep: boolean; var g: gameState);
|
||||||
procedure HandleKey(var h: creature; var continueLevel: boolean;
|
procedure HandleLevelKey(var h: creature; var a: arena;
|
||||||
var a: arena; var t: tracePtr);
|
var t: tracePtr; var g: gameState);
|
||||||
procedure HandleMenuKey(var g: gameState);
|
procedure HandleMenuKey(var g: gameState);
|
||||||
|
procedure HandleInfoKey(var keep: boolean; var g: gameState);
|
||||||
|
procedure HandlePauseKey(var keep: boolean; var g: gameState);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -67,8 +77,8 @@ begin
|
|||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure HandleKey(var h: creature; var continueLevel: boolean;
|
procedure HandleLevelKey(var h: creature; var a: arena;
|
||||||
var a: arena; var t: tracePtr);
|
var t: tracePtr; var g: gameState);
|
||||||
var
|
var
|
||||||
k: integer;
|
k: integer;
|
||||||
begin
|
begin
|
||||||
@ -92,8 +102,12 @@ begin
|
|||||||
begin
|
begin
|
||||||
ChangeHamsterDelta(k, h)
|
ChangeHamsterDelta(k, h)
|
||||||
end;
|
end;
|
||||||
if (k = EscOrd) or (k = CtrlCOrd) then
|
if k = EscOrd then
|
||||||
|
g.curState := gamePause
|
||||||
|
{
|
||||||
|
if k = CtrlCOrd then
|
||||||
continueLevel := false
|
continueLevel := false
|
||||||
|
}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ChangeMenuState(k: integer; var g: gameState);
|
procedure ChangeMenuState(k: integer; var g: gameState);
|
||||||
@ -106,6 +120,22 @@ begin
|
|||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ChooseMenuOption(k: integer; var g: gameState);
|
||||||
|
begin
|
||||||
|
if (k = FourOrd) and not g.continueAllowed then
|
||||||
|
exit;
|
||||||
|
case k of
|
||||||
|
OneOrd:
|
||||||
|
g.curState := gameLevel;
|
||||||
|
TwoOrd:
|
||||||
|
g.curState := gameScore;
|
||||||
|
ThreeOrd:
|
||||||
|
g.curState := gameInfo;
|
||||||
|
FourOrd:
|
||||||
|
g.curState := gameLevel
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
procedure HandleMenuKey(var g: gameState);
|
procedure HandleMenuKey(var g: gameState);
|
||||||
var
|
var
|
||||||
k: integer;
|
k: integer;
|
||||||
@ -116,14 +146,11 @@ begin
|
|||||||
EraseMenuState(g.curMenu);
|
EraseMenuState(g.curMenu);
|
||||||
ChangeMenuState(k, g);
|
ChangeMenuState(k, g);
|
||||||
DrawMenuState(g.curMenu)
|
DrawMenuState(g.curMenu)
|
||||||
end
|
end;
|
||||||
else
|
if (k = OneOrd) or (k = TwoOrd) or (k = ThreeOrd) or (k = FourOrd) then
|
||||||
|
ChooseMenuOption(k, g);
|
||||||
if k = EscOrd then
|
if k = EscOrd then
|
||||||
begin
|
g.curState := gameExit
|
||||||
g.curState := gameExit;
|
|
||||||
EraseMenu;
|
|
||||||
RunExit(g)
|
|
||||||
end
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ChangeExitState(k: integer; var g: gameState);
|
procedure ChangeExitState(k: integer; var g: gameState);
|
||||||
@ -148,18 +175,46 @@ begin
|
|||||||
DrawExitState(g.curExit);
|
DrawExitState(g.curExit);
|
||||||
exit
|
exit
|
||||||
end;
|
end;
|
||||||
if k = EnterOrd then
|
if (k = EnterOrd) or (k = SpaceOrd) then
|
||||||
begin
|
begin
|
||||||
if g.curExit = exitYes then
|
if g.curExit = exitYes then
|
||||||
g.shutdown := true
|
g.shutdown := true
|
||||||
else
|
else
|
||||||
g.curExit := exitYes;
|
g.curExit := exitYes;
|
||||||
|
keep := false
|
||||||
end;
|
end;
|
||||||
if (k = UpperYOrd) or (k = LowerYOrd) then
|
if (k = UpperYOrd) or (k = LowerYOrd) or (k = OneOrd) then
|
||||||
|
begin
|
||||||
g.shutdown := true;
|
g.shutdown := true;
|
||||||
if (k = UpperNOrd) or (k = LowerNOrd) or (k = EscOrd) then
|
keep := false
|
||||||
|
end;
|
||||||
|
if (k = UpperNOrd) or (k = LowerNOrd) or (k = EscOrd) or (k = TwoOrd) then
|
||||||
|
begin
|
||||||
g.curExit := exitYes;
|
g.curExit := exitYes;
|
||||||
keep := false
|
keep := false
|
||||||
|
end;
|
||||||
|
g.curState := gameMenu
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure HandlePauseKey(var keep: boolean; var g: gameState);
|
||||||
|
var
|
||||||
|
k: integer;
|
||||||
|
begin
|
||||||
|
GetKey(k);
|
||||||
|
if (k = EscOrd) or (k = SpaceOrd) then
|
||||||
|
begin
|
||||||
|
g.curState := gameLevel;
|
||||||
|
keep := false
|
||||||
|
end;
|
||||||
|
if (k = UpperQOrd) or (k = LowerQOrd) then
|
||||||
|
begin
|
||||||
|
g.curState := gameMenu;
|
||||||
|
keep := false
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure HandleInfoKey(var keep: boolean; var g: gameState);
|
||||||
|
begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user