gh/keys_m.pas
2026-01-10 12:09:22 +05:00

287 lines
6.3 KiB
ObjectPascal

unit keys_m;
interface
uses game_m, level_m;
const
ArrowDownOrd = -80;
ArrowLeftOrd = -75;
ArrowRightOrd = -77;
ArrowUpOrd = -72;
CtrlCOrd = 3;
CtrlZOrd = 26;
EscOrd = 27;
EnterOrd = 13;
LowerNOrd = 110;
LowerYOrd = 121;
SpaceOrd = 32;
UpperNOrd = 78;
UpperYOrd = 89;
OneOrd = 49;
TwoOrd = 50;
ThreeOrd = 51;
UpperQOrd = 81;
LowerQOrd = 113;
{ Debug }
BOrd = 98;
COrd = 99;
LOrd = 108;
{ Debug }
procedure HandleKey(var g: gameState; var level: levelState);
implementation
uses crt, graphics_m, trace_m, creature_m, debug_m;
procedure GetKey(var keyCode: integer);
var
c: char;
begin
c := ReadKey;
if c = #0 then
begin
c := ReadKey;
keyCode := -ord(c)
end
else
begin
keyCode := ord(c)
end
end;
procedure ChangeHamsterDelta(var h: creature; k: integer);
begin
h.dX := 0;
h.dY := 0;
case k of
ArrowLeftOrd:
h.dX := -h.movespeed;
ArrowRightOrd:
h.dX := h.movespeed;
ArrowUpOrd:
h.dY := -h.movespeed;
ArrowDownOrd:
h.dY := h.movespeed;
SpaceOrd:
StopCreature(h)
end
end;
procedure HandleLevelKey(var g: gameState; var level: levelState; k: integer);
begin
{DEBUG}
if k = BOrd then
Print(level.a.borders);
if k = COrd then
Print(level.a.captured);
if k = LOrd then
begin
GotoXY(2, 60);
write(' ');
GotoXY(2, 60);
writeln(GetLength(level.t));
GotoXY(1, 1)
end;
{DEBUG}
if (k = ArrowLeftOrd) or (k = ArrowRightOrd) or (k = ArrowUpOrd) or
(k = ArrowDownOrd) or (k = SpaceOrd) then
begin
ChangeHamsterDelta(level.h, k)
end;
if k = EscOrd then
g.curState := gamePause
end;
procedure PreviousMenuState(var g: gameState);
begin
if (g.curMenu = menuNewGame) and not g.levelInited then
g.curMenu := menuKeyInfo
else
if g.curMenu = menuNewGame then
g.curMenu := menuContinue
else
g.curMenu := pred(g.curMenu)
end;
procedure NextMenuState(var g: gameState);
begin
if (g.curMenu = menuKeyInfo) and not g.levelInited or
(g.curMenu = menuContinue) then
begin
g.curMenu := menuNewGame
end
else
begin
g.curMenu := succ(g.curMenu)
end
end;
procedure ChangeMenuState(var g: gameState; k: integer);
begin
case k of
ArrowUpOrd:
PreviousMenuState(g);
ArrowDownOrd:
NextMenuState(g)
end
end;
procedure ChooseMenuNum(var g: gameState; k: integer);
begin
if (k = ThreeOrd) and not g.levelInited then
exit;
case k of
OneOrd: begin
g.newGame := true;
g.level := 1;
g.curState := gameLevelAnnounce
end;
TwoOrd:
g.curState := gameKeyInfo;
ThreeOrd:
g.curState := gameContinueLevel
end
end;
procedure ChooseMenuMarked(var g: gameState);
begin
case g.curMenu of
menuNewGame:
begin
g.newGame := true;
g.level := 1;
g.curState := gameLevelAnnounce
end;
menuKeyInfo:
g.curState := gameKeyInfo;
menuContinue:
g.curState := gameContinueLevel
end
end;
procedure HandleMenuKey(var g: gameState; k: integer);
begin
if (k = ArrowUpOrd) or (k = ArrowDownOrd) then
begin
EraseMenuState(g.curMenu);
ChangeMenuState(g, k);
DrawMenuState(g.curMenu)
end;
if (k = OneOrd) or (k = TwoOrd) or (k = ThreeOrd) then
ChooseMenuNum(g, k);
if (k = EscOrd) or (k = UpperQOrd) or (k = LowerQOrd) then
g.curState := gameExit;
if (k = EnterOrd) or (k = SpaceOrd) then
ChooseMenuMarked(g)
end;
procedure HandleGameOverKey(var g: gameState; k: integer);
begin
case k of
UpperYOrd, LowerYOrd:
g.curState := gameLevelAnnounce;
UpperNOrd, LowerNOrd:
g.curState := gameMenu;
end
end;
procedure ChangeExitState(k: integer; var g: gameState);
begin
case k of
ArrowRightOrd:
NextExitState(g);
ArrowLeftOrd:
PreviousExitState(g)
end
end;
procedure HandleExitKey(var g: gameState; k: integer);
begin
if (k = ArrowLeftOrd) or (k = ArrowRightOrd) then
begin
EraseExitState(g.curExit);
ChangeExitState(k, g);
DrawExitState(g.curExit);
exit
end;
if (k = EnterOrd) or (k = SpaceOrd) then
begin
if g.curExit then
g.shutdown := true
else
g.curExit := true;
end;
if (k = UpperYOrd) or (k = LowerYOrd) or (k = OneOrd) then
g.shutdown := true;
if (k = UpperNOrd) or (k = LowerNOrd) or (k = EscOrd) or (k = TwoOrd) then
g.curExit := true;
g.curState := gameMenu
end;
procedure HandlePauseKey(var g: gameState; k: integer);
begin
if (k = EscOrd) or (k = SpaceOrd) then
g.curState := gameUnpauseLevel;
if (k = UpperQOrd) or (k = LowerQOrd) then
g.curState := gameMenu
end;
procedure HandleInfoKey(var g: gameState; k: integer);
begin
if (k = EscOrd) or (k = SpaceOrd) or (k = EnterOrd) or
(k = UpperQOrd) or (k = LowerQOrd) then
begin
g.curState := gameMenu
end
end;
procedure HandleSceneKey(var g: gameState; k: integer);
begin
if (k = EscOrd) or (k = SpaceOrd) or (k = EnterOrd) then
g.skipScene := true
end;
procedure HandleGameCompleteKey(var g: gameState; k: integer);
begin
if (k = EscOrd) or (k = SpaceOrd) or (k = EnterOrd) then
g.curState := gameMenu
end;
procedure HandleKey(var g: gameState; var level: levelState);
var
k: integer;
begin
GetKey(k);
if (k = CtrlCOrd) or (k = CtrlZOrd) then
begin
g.shutdown := true;
exit
end;
case g.curState of
gameLevelComplete, gameLevelAnnounce:
HandleSceneKey(g, k);
gameLevelLoop:
HandleLevelKey(g, level, k);
gameExit:
HandleExitKey(g, k);
gameMenu:
HandleMenuKey(g, k);
gameKeyInfo:
HandleInfoKey(g, k);
gamePause:
HandlePauseKey(g, k);
gameOver:
HandleGameOverKey(g, k);
gameComplete:
HandleGameCompleteKey(g, k)
end
end;
end.