2016-07-21 00:53:52 +00:00
|
|
|
//
|
|
|
|
// ui.c
|
|
|
|
// a2bejwld
|
|
|
|
//
|
|
|
|
// Created by Jeremy Rand on 2016-07-20.
|
|
|
|
// Copyright © 2016 Jeremy Rand. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#include <conio.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "ui.h"
|
|
|
|
#include "dbllores.h"
|
|
|
|
#include "game.h"
|
|
|
|
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
#define BTN1 0xC062
|
|
|
|
|
|
|
|
|
2016-07-22 04:45:07 +00:00
|
|
|
static void refreshSquare(tSquare square);
|
|
|
|
static void refreshScore(tScore score);
|
|
|
|
static void refreshLevel(tLevel level);
|
|
|
|
|
|
|
|
|
2016-07-21 00:53:52 +00:00
|
|
|
static tSquare gSelectedSquare = 0;
|
|
|
|
static bool gPlaySounds = true;
|
2016-07-21 19:33:31 +00:00
|
|
|
static uint8_t gScoreBar = 0;
|
2016-07-21 00:53:52 +00:00
|
|
|
|
2016-07-22 04:45:07 +00:00
|
|
|
static tGameCallbacks gCallbacks = {
|
|
|
|
refreshSquare,
|
|
|
|
refreshScore,
|
|
|
|
refreshLevel
|
|
|
|
};
|
|
|
|
|
2016-07-21 00:53:52 +00:00
|
|
|
|
2016-07-22 05:11:36 +00:00
|
|
|
static void showAndClearDblLoRes(void)
|
2016-07-21 00:53:52 +00:00
|
|
|
{
|
|
|
|
showDblLoRes();
|
|
|
|
clearDblLoRes();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
static void badThingHappened(void)
|
|
|
|
{
|
|
|
|
if (gPlaySounds)
|
|
|
|
printf("\007");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-21 00:53:52 +00:00
|
|
|
void printInstructions(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
int seed = 0;
|
|
|
|
|
|
|
|
unshowDblLoRes();
|
|
|
|
videomode(VIDEOMODE_80x24);
|
|
|
|
clrscr();
|
|
|
|
printf(
|
2016-07-21 19:33:31 +00:00
|
|
|
// 0000000001111111111222222222233333333334444444444555555555566666666667
|
|
|
|
// 1234567890123456789012345678901234567890123456789012345678901234567890
|
|
|
|
" Apple Jeweled\n"
|
|
|
|
" by Jeremy Rand\n"
|
2016-07-21 00:53:52 +00:00
|
|
|
"\n"
|
2016-07-21 19:33:31 +00:00
|
|
|
" Use I-J-K-M or the arrow keys to move your selection. Hold the closed\n"
|
|
|
|
" apple key and move your selection to swap two jewels and match 3 or\n"
|
|
|
|
" more jewels. When you match three jewels, they disappear and new\n"
|
|
|
|
" jewels will drop from the top.\n"
|
2016-07-21 00:53:52 +00:00
|
|
|
"\n"
|
2016-07-21 19:33:31 +00:00
|
|
|
" If you match four jewels or three jewels in two directions, then the\n"
|
|
|
|
" jewel does not disappear. Match it again and it explodes taking more\n"
|
2016-07-22 04:45:07 +00:00
|
|
|
" jewels with it. Match five jewels and a special jewel will appear.\n"
|
|
|
|
" Swap it with any other jewel and all jewels of that colour will\n"
|
|
|
|
" disappear.\n"
|
2016-07-21 19:33:31 +00:00
|
|
|
"\n"
|
|
|
|
" When the score bar on the right fills, the board reloads and you level\n"
|
|
|
|
" up. Play ends when no more matches can be made.\n"
|
|
|
|
"\n"
|
|
|
|
" Press Q or escape to quit at any time.\n"
|
2016-07-21 00:53:52 +00:00
|
|
|
" Press R to start a new game.\n"
|
|
|
|
" Press S to toggle sound.\n"
|
2016-07-22 04:45:07 +00:00
|
|
|
" Press H to get a hint.\n"
|
|
|
|
" Press ? to see this info again.\n"
|
2016-07-21 00:53:52 +00:00
|
|
|
"\n"
|
|
|
|
" Press any key to start");
|
|
|
|
|
|
|
|
// The amount of time the user waits to read the in
|
|
|
|
while (!kbhit())
|
|
|
|
seed++;
|
|
|
|
|
|
|
|
cgetc();
|
|
|
|
srand(seed);
|
|
|
|
|
|
|
|
clrscr();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void drawGemAtSquare(tSquare square)
|
|
|
|
{
|
|
|
|
switch (gemTypeAtSquare(square)) {
|
|
|
|
case GEM_GREEN:
|
|
|
|
drawGreenGem(square);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GEM_RED:
|
|
|
|
drawRedGem(square);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GEM_PURPLE:
|
|
|
|
drawPurpleGem(square);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GEM_ORANGE:
|
|
|
|
drawOrangeGem(square);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GEM_GREY:
|
|
|
|
drawGreyGem(square);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GEM_YELLOW:
|
|
|
|
drawYellowGem(square);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GEM_BLUE:
|
|
|
|
drawBlueGem(square);
|
|
|
|
break;
|
|
|
|
|
2016-07-21 19:33:31 +00:00
|
|
|
case GEM_SPECIAL:
|
|
|
|
drawSpecialGem(square);
|
|
|
|
break;
|
|
|
|
|
2016-07-21 00:53:52 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
static void refreshSquare(tSquare square)
|
|
|
|
{
|
|
|
|
drawBgSquare(square);
|
|
|
|
drawGemAtSquare(square);
|
2016-07-21 04:55:29 +00:00
|
|
|
|
|
|
|
if (gemIsStarredAtSquare(square))
|
|
|
|
starGem(square);
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-21 00:53:52 +00:00
|
|
|
static void drawBoard(void)
|
|
|
|
{
|
|
|
|
tSquare square;
|
|
|
|
|
|
|
|
for (square = MIN_SQUARE; square <= MAX_SQUARE; square++) {
|
2016-07-21 04:39:06 +00:00
|
|
|
refreshSquare(square);
|
2016-07-21 00:53:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
selectSquare(gSelectedSquare);
|
2016-07-21 19:33:31 +00:00
|
|
|
drawScore(gScoreBar);
|
2016-07-21 00:53:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void quitGame(void)
|
|
|
|
{
|
|
|
|
unshowDblLoRes();
|
|
|
|
videomode(VIDEOMODE_40x24);
|
|
|
|
clrscr();
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void moveUp(void)
|
|
|
|
{
|
|
|
|
tSquare oldSquare = gSelectedSquare;
|
|
|
|
tPos x = SQUARE_TO_X(gSelectedSquare);
|
|
|
|
tPos y = SQUARE_TO_Y(gSelectedSquare);
|
|
|
|
|
|
|
|
if (y == 0)
|
|
|
|
y = BOARD_SIZE - 1;
|
|
|
|
else
|
|
|
|
y--;
|
|
|
|
|
|
|
|
gSelectedSquare = XY_TO_SQUARE(x, y);
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
refreshSquare(oldSquare);
|
2016-07-21 00:53:52 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void moveDown(void)
|
|
|
|
{
|
|
|
|
tSquare oldSquare = gSelectedSquare;
|
|
|
|
tPos x = SQUARE_TO_X(gSelectedSquare);
|
|
|
|
tPos y = SQUARE_TO_Y(gSelectedSquare);
|
|
|
|
|
|
|
|
if (y == BOARD_SIZE - 1)
|
|
|
|
y = 0;
|
|
|
|
else
|
|
|
|
y++;
|
|
|
|
|
|
|
|
gSelectedSquare = XY_TO_SQUARE(x, y);
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
refreshSquare(oldSquare);
|
2016-07-21 00:53:52 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void moveLeft(void)
|
|
|
|
{
|
|
|
|
tSquare oldSquare = gSelectedSquare;
|
|
|
|
tPos x = SQUARE_TO_X(gSelectedSquare);
|
|
|
|
tPos y = SQUARE_TO_Y(gSelectedSquare);
|
|
|
|
|
|
|
|
if (x == 0)
|
|
|
|
x = BOARD_SIZE - 1;
|
|
|
|
else
|
|
|
|
x--;
|
|
|
|
|
|
|
|
gSelectedSquare = XY_TO_SQUARE(x, y);
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
refreshSquare(oldSquare);
|
2016-07-21 00:53:52 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void moveRight(void)
|
|
|
|
{
|
|
|
|
tSquare oldSquare = gSelectedSquare;
|
|
|
|
tPos x = SQUARE_TO_X(gSelectedSquare);
|
|
|
|
tPos y = SQUARE_TO_Y(gSelectedSquare);
|
|
|
|
|
|
|
|
if (x == BOARD_SIZE - 1)
|
|
|
|
x = 0;
|
|
|
|
else
|
|
|
|
x++;
|
|
|
|
|
|
|
|
gSelectedSquare = XY_TO_SQUARE(x, y);
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
refreshSquare(oldSquare);
|
2016-07-21 00:53:52 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
static bool swapUp(void)
|
2016-07-21 04:39:06 +00:00
|
|
|
{
|
2016-07-22 15:02:25 +00:00
|
|
|
bool result = false;
|
2016-07-21 04:39:06 +00:00
|
|
|
tPos y = SQUARE_TO_Y(gSelectedSquare);
|
|
|
|
|
|
|
|
if (y == 0) {
|
|
|
|
badThingHappened();
|
2016-07-22 15:02:25 +00:00
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
result = moveSquareInDir(gSelectedSquare, DIR_UP);
|
2016-07-21 04:39:06 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
2016-07-22 15:02:25 +00:00
|
|
|
|
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
static bool swapDown(void)
|
2016-07-21 04:39:06 +00:00
|
|
|
{
|
2016-07-22 15:02:25 +00:00
|
|
|
bool result = false;
|
2016-07-21 04:39:06 +00:00
|
|
|
tPos y = SQUARE_TO_Y(gSelectedSquare);
|
|
|
|
|
|
|
|
if (y == BOARD_SIZE - 1) {
|
|
|
|
badThingHappened();
|
2016-07-22 15:02:25 +00:00
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
result = moveSquareInDir(gSelectedSquare, DIR_DOWN);
|
2016-07-21 04:39:06 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
2016-07-22 15:02:25 +00:00
|
|
|
|
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
static bool swapLeft(void)
|
2016-07-21 04:39:06 +00:00
|
|
|
{
|
2016-07-22 15:02:25 +00:00
|
|
|
bool result = false;
|
2016-07-21 04:39:06 +00:00
|
|
|
tPos x = SQUARE_TO_X(gSelectedSquare);
|
|
|
|
|
|
|
|
if (x == 0) {
|
|
|
|
badThingHappened();
|
2016-07-22 15:02:25 +00:00
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
result = moveSquareInDir(gSelectedSquare, DIR_LEFT);
|
2016-07-21 04:39:06 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
2016-07-22 15:02:25 +00:00
|
|
|
|
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
static bool swapRight(void)
|
2016-07-21 04:39:06 +00:00
|
|
|
{
|
2016-07-22 15:02:25 +00:00
|
|
|
bool result = false;
|
2016-07-21 04:39:06 +00:00
|
|
|
tPos x = SQUARE_TO_X(gSelectedSquare);
|
|
|
|
|
|
|
|
if (x == BOARD_SIZE - 1) {
|
|
|
|
badThingHappened();
|
2016-07-22 15:02:25 +00:00
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
2016-07-22 15:02:25 +00:00
|
|
|
result = moveSquareInDir(gSelectedSquare, DIR_RIGHT);
|
2016-07-21 04:39:06 +00:00
|
|
|
selectSquare(gSelectedSquare);
|
2016-07-22 15:02:25 +00:00
|
|
|
|
|
|
|
return result;
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static bool isAppleButtonPressed(void)
|
|
|
|
{
|
|
|
|
static uint8_t temp;
|
|
|
|
|
|
|
|
__asm__("LDA %w", BTN1);
|
|
|
|
__asm__("STA %v", temp);
|
|
|
|
|
|
|
|
return ((temp > 127) ? true : false);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void endGame(void)
|
|
|
|
{
|
2016-07-22 04:45:07 +00:00
|
|
|
mixedTextMode();
|
2016-07-21 04:39:06 +00:00
|
|
|
videomode(VIDEOMODE_80x24);
|
2016-07-22 04:45:07 +00:00
|
|
|
cputsxy(0, 20, " No more moves - GAME OVER!!");
|
|
|
|
gotoxy(0,21);
|
|
|
|
cprintf( " You made it to level %u", getLevel());
|
|
|
|
cputsxy(0,23, " Play again (Y/N)?");
|
2016-07-21 04:39:06 +00:00
|
|
|
|
2016-07-22 04:45:07 +00:00
|
|
|
while (true) {
|
|
|
|
switch (cgetc()) {
|
|
|
|
case 'y':
|
|
|
|
case 'Y':
|
|
|
|
return;
|
|
|
|
|
|
|
|
case 'n':
|
|
|
|
case 'N':
|
|
|
|
case CH_ESC:
|
|
|
|
case 'q':
|
|
|
|
case 'Q':
|
|
|
|
quitGame();
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
badThingHappened();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2016-07-21 04:39:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-22 04:45:07 +00:00
|
|
|
static void refreshScore(tScore score)
|
2016-07-21 19:33:31 +00:00
|
|
|
{
|
|
|
|
if (score == gScoreBar)
|
|
|
|
return;
|
|
|
|
|
|
|
|
gScoreBar = score;
|
|
|
|
drawScore(score);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-22 04:45:07 +00:00
|
|
|
static void refreshLevel(tLevel level)
|
|
|
|
{
|
|
|
|
bool waiting = true;
|
|
|
|
|
|
|
|
mixedTextMode();
|
|
|
|
videomode(VIDEOMODE_80x24);
|
|
|
|
gotoxy(0, 20);
|
|
|
|
cprintf( " Completed level %u!!", level);
|
|
|
|
cputsxy(0,22, " Press space to continue to the next level...");
|
|
|
|
|
|
|
|
while (waiting) {
|
|
|
|
switch (cgetc()) {
|
|
|
|
case ' ':
|
|
|
|
waiting = false;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
badThingHappened();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-07-22 05:11:36 +00:00
|
|
|
showAndClearDblLoRes();
|
2016-07-22 04:45:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void getHint(void)
|
|
|
|
{
|
|
|
|
refreshSquare(gSelectedSquare);
|
|
|
|
|
|
|
|
gSelectedSquare = getHintSquare();
|
|
|
|
selectSquare(gSelectedSquare);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-22 05:11:36 +00:00
|
|
|
void initUI(void)
|
|
|
|
{
|
|
|
|
initGameEngine(&gCallbacks);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-21 00:53:52 +00:00
|
|
|
void playGame(void)
|
|
|
|
{
|
2016-07-22 05:11:36 +00:00
|
|
|
static bool firstGame = true;
|
|
|
|
bool shouldSave = false;
|
|
|
|
bool gameLoaded = false;
|
2016-07-22 15:02:25 +00:00
|
|
|
bool checkForGameOver = false;
|
2016-07-22 05:11:36 +00:00
|
|
|
uint8_t ch;
|
|
|
|
|
2016-07-21 19:33:31 +00:00
|
|
|
gScoreBar = 0;
|
|
|
|
|
2016-07-22 05:11:36 +00:00
|
|
|
if (firstGame) {
|
|
|
|
firstGame = false;
|
|
|
|
printf("\n\nChecking for a saved game...");
|
|
|
|
|
|
|
|
if (loadGame()) {
|
|
|
|
bool gotAnswer = false;
|
|
|
|
|
|
|
|
printf("\n\nYou have a saved game!\n Would you like to continue it (Y/N)");
|
|
|
|
|
|
|
|
while (!gotAnswer) {
|
|
|
|
ch = cgetc();
|
|
|
|
switch (ch) {
|
|
|
|
case 'y':
|
|
|
|
case 'Y':
|
|
|
|
printf("\n\nLoading your saved puzzle");
|
|
|
|
gotAnswer = true;
|
|
|
|
shouldSave = true;
|
|
|
|
gameLoaded = true;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'n':
|
|
|
|
case 'N':
|
|
|
|
gotAnswer = true;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
badThingHappened();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-07-21 00:53:52 +00:00
|
|
|
|
2016-07-22 05:11:36 +00:00
|
|
|
showAndClearDblLoRes();
|
|
|
|
if (!gameLoaded) {
|
|
|
|
startNewGame();
|
|
|
|
}
|
2016-07-21 00:53:52 +00:00
|
|
|
drawBoard();
|
|
|
|
while (true) {
|
2016-07-22 15:02:25 +00:00
|
|
|
if ((checkForGameOver) &&
|
|
|
|
(gameIsOver())) {
|
2016-07-21 04:39:06 +00:00
|
|
|
endGame();
|
|
|
|
return;
|
|
|
|
}
|
2016-07-22 15:02:25 +00:00
|
|
|
checkForGameOver = false;
|
2016-07-21 00:53:52 +00:00
|
|
|
|
|
|
|
while (!kbhit()) {
|
|
|
|
// Maybe do some animation stuff here...
|
|
|
|
}
|
|
|
|
|
2016-07-21 04:39:06 +00:00
|
|
|
ch = cgetc();
|
|
|
|
switch (ch) {
|
2016-07-21 00:53:52 +00:00
|
|
|
case 'i':
|
|
|
|
case 'I':
|
|
|
|
case CH_CURS_UP:
|
2016-07-22 05:11:36 +00:00
|
|
|
shouldSave = true;
|
2016-07-21 04:39:06 +00:00
|
|
|
if (isAppleButtonPressed())
|
2016-07-22 15:02:25 +00:00
|
|
|
checkForGameOver = swapUp();
|
2016-07-21 04:39:06 +00:00
|
|
|
else
|
|
|
|
moveUp();
|
2016-07-21 00:53:52 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'j':
|
|
|
|
case 'J':
|
|
|
|
case CH_CURS_LEFT:
|
2016-07-22 05:11:36 +00:00
|
|
|
shouldSave = true;
|
2016-07-21 04:39:06 +00:00
|
|
|
if (isAppleButtonPressed())
|
2016-07-22 15:02:25 +00:00
|
|
|
checkForGameOver = swapLeft();
|
2016-07-21 04:39:06 +00:00
|
|
|
else
|
|
|
|
moveLeft();
|
2016-07-21 00:53:52 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'k':
|
|
|
|
case 'K':
|
|
|
|
case CH_CURS_RIGHT:
|
2016-07-22 05:11:36 +00:00
|
|
|
shouldSave = true;
|
2016-07-21 04:39:06 +00:00
|
|
|
if (isAppleButtonPressed())
|
2016-07-22 15:02:25 +00:00
|
|
|
checkForGameOver = swapRight();
|
2016-07-21 04:39:06 +00:00
|
|
|
else
|
|
|
|
moveRight();
|
2016-07-21 00:53:52 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'm':
|
|
|
|
case 'M':
|
|
|
|
case CH_CURS_DOWN:
|
2016-07-22 05:11:36 +00:00
|
|
|
shouldSave = true;
|
2016-07-21 04:39:06 +00:00
|
|
|
if (isAppleButtonPressed())
|
2016-07-22 15:02:25 +00:00
|
|
|
checkForGameOver = swapDown();
|
2016-07-21 04:39:06 +00:00
|
|
|
else
|
|
|
|
moveDown();
|
2016-07-21 00:53:52 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CH_ESC:
|
|
|
|
case 'q':
|
|
|
|
case 'Q':
|
2016-07-22 05:11:36 +00:00
|
|
|
if (shouldSave) {
|
|
|
|
mixedTextMode();
|
|
|
|
videomode(VIDEOMODE_80x24);
|
|
|
|
gotoxy(0, 20);
|
|
|
|
cprintf("\n\nSaving your game so you can continue\r\n later...");
|
|
|
|
saveGame();
|
|
|
|
}
|
2016-07-21 00:53:52 +00:00
|
|
|
quitGame();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'r':
|
|
|
|
case 'R':
|
|
|
|
return;
|
|
|
|
|
|
|
|
case 's':
|
|
|
|
case 'S':
|
|
|
|
gPlaySounds = !gPlaySounds;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'h':
|
|
|
|
case 'H':
|
2016-07-22 04:45:07 +00:00
|
|
|
getHint();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case '?':
|
2016-07-21 00:53:52 +00:00
|
|
|
printInstructions();
|
2016-07-22 05:11:36 +00:00
|
|
|
showAndClearDblLoRes();
|
2016-07-21 00:53:52 +00:00
|
|
|
drawBoard();
|
|
|
|
break;
|
2016-07-21 04:39:06 +00:00
|
|
|
|
|
|
|
default:
|
|
|
|
badThingHappened();
|
|
|
|
break;
|
2016-07-21 00:53:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|