diff --git a/Blocks/BLOCKS.COM b/Blocks/BLOCKS.COM index f119630..b94c9b8 100644 Binary files a/Blocks/BLOCKS.COM and b/Blocks/BLOCKS.COM differ diff --git a/Blocks/README.md b/Blocks/README.md index ca04f28..ca4091e 100644 --- a/Blocks/README.md +++ b/Blocks/README.md @@ -1,21 +1,38 @@ # Blocks -This is a clon (more or less) of SameGame, a tile-matching puzzle video game, originally released under the name Chain Shot! in 1985 by Kuniaki Moribe (Morisuke). +This is a clone (more or less) of SameGame, a tile-matching puzzle video game, originally released under the name Chain Shot! in 1985 by Kuniaki Moribe (Morisuke). The goal of the game is to remove all the blocks of the board. Copyright (c) 1999-2018 Miguel García / FloppySoftware -The file ``kslib.h`` has been modified for VT100 compatibility (insted of VT52) by me (Anna Christina Naß . +The game has been modified for VT100 compatibility (insted of VT52) and got some color by me (Anna Christina Naß . Original Repository: https://github.com/MiguelVis/RetroProjects Website: http://www.floppysoftware.es/blocks.html?path=cpm_projects|blocks The file ``BLOCKS.COM`` is the compiled game file. -## Commands +## The Game -Move the cursor using Q, O, P and A as shown on the screen. +Move the cursor using the numpad keys: + + 8 + | + 4 --+-- 6 + | + 2 + +Then select a blocks using ``W`` and remove the blocks using ``R``. + +You can select just one block, or a group of blocks of the same type + +If you are in the normal mode, you can place all the blocks against a side (top, bottom, left or right). +Select the side using the ``E``, ``S``, ``D`` or ``X`` key. + +If you are in the automatic mode, the blocks rows will be placed on the bottom side of the board, and the columns will be placed on the middle of the board. + +The special block **X**, multiplies that result by 10. ## Compile: diff --git a/Blocks/blocks.c b/Blocks/blocks.c index 631f6c2..59cedff 100644 --- a/Blocks/blocks.c +++ b/Blocks/blocks.c @@ -21,6 +21,7 @@ Revisions: 02 Jul 2012 : Generic CP/M version 1.0 for 24x80 VT52 screen. + 11 Mar 2020 : modified to VT100 version by acn@acn.wtf */ #include /* MESCC header & runtime */ @@ -62,17 +63,26 @@ #define SCORE_ROW 2 /* Screen position for score info */ #define SCORE_COL 73 /* id */ -#define K_UP 'Q' /* Key up */ -#define K_DOWN 'A' /* Key down */ -#define K_LEFT 'O' /* Key left */ -#define K_RIGHT 'P' /* Key right */ -#define K_EXIT 'X' /* Key exit */ -#define K_SELECT 'S' /* Key select */ -#define K_KILL 'K' /* Key kill */ -#define K_GRAV_UP '1' /* Key gravity up */ -#define K_GRAV_LEFT '2' /* Key gravity left */ -#define K_GRAV_RIGHT '3' /* Key gravity right */ -#define K_GRAV_DOWN '4' /* Key gravity down */ +#define K_UP '8' /* Key up */ +#define K_DOWN '2' /* Key down */ +#define K_LEFT '4' /* Key left */ +#define K_RIGHT '6' /* Key right */ +#define K_EXIT 'Q' /* Key exit */ +#define K_SELECT 'W' /* Key select */ +#define K_KILL 'R' /* Key kill */ +#define K_GRAV_UP 'E' /* Key gravity up */ +#define K_GRAV_LEFT 'S' /* Key gravity left */ +#define K_GRAV_RIGHT 'D' /* Key gravity right */ +#define K_GRAV_DOWN 'X' /* Key gravity down */ + +#define RESET "\e[0m" /* reset all attributes */ +#define RED "\e[31m" +#define GREEN "\e[32m" +#define YELLOW "\e[33m" +#define BLUE "\e[34;1m" +#define MAGENTA "\e[35m" +#define CYAN "\e[36m" +#define WHITE "\e[37m" /* VARIABLES */ @@ -142,19 +152,22 @@ int argc, argv[]; Menu() { + char str[80]; + ScrClr(); ScrCurOff(); - ScrTitle(0, "BLOCKS"); - ScrTitle(1, "v1.0"); - ScrTitle(3, "(c) 2012 FLOPPY SOFTWARE"); + sprintf(str, "%sB%sl%so%sc%sk%ss%s", RED, GREEN, BLUE, CYAN, MAGENTA, WHITE, RESET); ScrOutStrRC(0, 37, str); + ScrTitle(1, "v1.1"); + ScrTitle(3, "(c) 2012 Floppy Software"); + ScrTitle(4, "VT-100 version (c) 2020 by acn@acn.wtf"); - ScrOutStrRC( 6, 25, "1 : PLAY GAME IN NORMAL MODE"); - ScrOutStrRC( 8, 25, "2 : PLAY GAME IN AUTOMATIC MODE"); - ScrOutStrRC(10, 25, "3 : SHOW HELP"); + ScrOutStrRC( 8, 25, "1 : Play game in normal mode"); + ScrOutStrRC(10, 25, "2 : Play game in automatic mode"); + ScrOutStrRC(12, 25, "3 : Show help"); - ScrOutStrRC(12, 25, "X : EXIT GAME"); + ScrOutStrRC(16, 25, "Q : Quit game"); - ScrTitle(SCR_ROWS-2, "SELECT YOUR CHOICE"); + ScrTitle(SCR_ROWS-2, "Select your choice"); randindex=0; /* This is used to generate a random number */ @@ -171,7 +184,7 @@ Menu() case '1' : automode=0; return 1; case '2' : automode=1; return 1; case '3' : Help(); return 2; - case 'X' : return 0; + case K_EXIT : return 0; } } } @@ -183,22 +196,23 @@ Help() { ScrClr(); - ScrTitle( 0, "BLOCKS"); + ScrTitle( 0, "Blocks"); + ScrTitle( 1, "------"); - ScrTitle( 2, "The object of the game is to remove all the"); - ScrTitle( 3, "blocks of the board."); - ScrTitle( 5, "You can select just one block, or a group of"); - ScrTitle( 6, "blocks of the same type."); - ScrTitle( 8, "Then, if you are in the normal mode, you can place all"); - ScrTitle( 9, "the blocks against a side (top, bottom, left or right)."); - ScrTitle(11, "If you are in the automatic mode, the blocks rows will be"); - ScrTitle(12, "placed on the bottom side of the board, and the columns"); - ScrTitle(13, "will be placed on the middle of the board."); - ScrTitle(15, "The partial score is the square of the number of"); - ScrTitle(16, "blocks selected."); - ScrTitle(18, "The special block 'X', multiplies that result by 10."); - ScrTitle(20, "Good luck!"); - ScrTitle(22, "PRESS ANY KEY"); + ScrTitle( 3, "The object of the game is to remove all the"); + ScrTitle( 4, "blocks of the board."); + ScrTitle( 6, "You can select just one block, or a group of"); + ScrTitle( 7, "blocks of the same type."); + ScrTitle( 9, "Then, if you are in the normal mode, you can place all"); + ScrTitle(10, "the blocks against a side (top, bottom, left or right)."); + ScrTitle(12, "If you are in the automatic mode, the blocks rows will be"); + ScrTitle(13, "placed on the bottom side of the board, and the columns"); + ScrTitle(14, "will be placed on the middle of the board."); + ScrTitle(16, "The partial score is the square of the number of"); + ScrTitle(17, "blocks selected."); + ScrTitle(19, "The special block 'X', multiplies that result by 10."); + ScrTitle(21, "Good luck!"); + ScrTitle(23, "PRESS ANY KEY"); KbdIn(); } @@ -209,6 +223,7 @@ Help() Play() { int row, col, run, val, key; + char str[80]; /* SETUP VARIABLES & BOARD */ @@ -224,11 +239,12 @@ Play() ScrClr(); - ScrBox(0, 0, SCR_ROWS-1, SCR_COLS, NULL); ScrTitle(0, "| BLOCKS |"); + ScrBox(0, 0, SCR_ROWS-1, SCR_COLS, NULL); + sprintf(str, "| %sB%sL%sO%sC%sK%sS%s |", RED, GREEN, BLUE, CYAN, MAGENTA, WHITE, RESET); ScrOutStrRC(0, 35, str); - ScrOutStrRC(LEVEL_ROW, LEVEL_COL, "BLOCKS"); PrintBlocks(); + ScrOutStrRC(LEVEL_ROW, LEVEL_COL, "Blocks"); PrintBlocks(); - ScrOutStrRC(SCORE_ROW, SCORE_COL, "SCORE"); PrintScore(); + ScrOutStrRC(SCORE_ROW, SCORE_COL, "Score"); PrintScore(); ScrBox(BORDER_ROW, BORDER_COL, BOARD_ROWS*BLOCK_ROWS+2, BOARD_COLS*BLOCK_COLS+2, NULL); @@ -239,24 +255,21 @@ Play() if(!automode) { - scrTitle(BORDER_ROW-1, "1"); - - ScrTitle(BORDER_ROW+BOARD_ROWS+2, "4"); - - ScrOutStrRC(BORDER_ROW+5, BORDER_COL-2, "2"); - - ScrOutStrRC(BORDER_ROW+5, BORDER_COL+BOARD_COLS*BLOCK_COLS+3, "3"); + sprintf(str, "%c", K_GRAV_UP); ScrTitle(BORDER_ROW-1, str); + sprintf(str, "%c", K_GRAV_DOWN); ScrTitle(BORDER_ROW+BOARD_ROWS+2, str); + sprintf(str, "%c", K_GRAV_LEFT); ScrOutStrRC(BORDER_ROW+5, BORDER_COL-2, str); + sprintf(str, "%c", K_GRAV_RIGHT); ScrOutStrRC(BORDER_ROW+5, BORDER_COL+BOARD_COLS*BLOCK_COLS+3, str); } - ScrOutStrRC(BORDER_ROW+3, 7, " Q"); + sprintf(str, " %c", K_UP); ScrOutStrRC(BORDER_ROW+3, 7, str); ScrOutStrRC(BORDER_ROW+4, 7, " |"); - ScrOutStrRC(BORDER_ROW+5, 7, "O --x-- P"); + sprintf(str, "%c --+-- %c", K_LEFT, K_RIGHT); ScrOutStrRC(BORDER_ROW+5, 7, str); ScrOutStrRC(BORDER_ROW+6, 7, " |"); - ScrOutStrRC(BORDER_ROW+7, 7, " A"); + sprintf(str, " %c", K_DOWN); ScrOutStrRC(BORDER_ROW+7, 7, str); - ScrOutStrRC(BORDER_ROW+4, BORDER_COL+BOARD_COLS*BLOCK_COLS+8, "S> SELECT BLOCKS"); - ScrOutStrRC(BORDER_ROW+5, BORDER_COL+BOARD_COLS*BLOCK_COLS+8, "K> KILL BLOCKS"); - ScrOutStrRC(BORDER_ROW+6, BORDER_COL+BOARD_COLS*BLOCK_COLS+8, "X> EXIT"); + sprintf(str, "%c> Select blocks", K_SELECT); ScrOutStrRC(BORDER_ROW+4, BORDER_COL+BOARD_COLS*BLOCK_COLS+8, str); + sprintf(str, "%c> Kill blocks", K_KILL); ScrOutStrRC(BORDER_ROW+5, BORDER_COL+BOARD_COLS*BLOCK_COLS+8, str); + sprintf(str, "%c> Quit", K_EXIT); ScrOutStrRC(BORDER_ROW+6, BORDER_COL+BOARD_COLS*BLOCK_COLS+8, str); /* PLAY GAME */ @@ -582,13 +595,13 @@ int row, col; switch(GetBlock(row, col)) { - case '1' : ScrOut('$'); break; - case '2' : ScrOut('O'); break; - case '3' : ScrOut('+'); break; - case '4' : ScrOut('#'); break; - case 'X' : ScrOut('X'); break; - case BLOCK_EMPTY : ScrOut(' '); break; - default : ScrOut('?'); break; + case '1' : ScrOutStr(RED); ScrOut('$'); ScrOutStr(RESET); break; + case '2' : ScrOutStr(GREEN); ScrOut('O'); ScrOutStr(RESET); break; + case '3' : ScrOutStr(BLUE); ScrOut('+'); ScrOutStr(RESET); break; + case '4' : ScrOutStr(MAGENTA); ScrOut('#'); ScrOutStr(RESET); break; + case 'X' : ScrOutStr(WHITE); ScrOut('X'); ScrOutStr(RESET); break; + case BLOCK_EMPTY : ScrOutStr(RESET); ScrOut(' '); break; + default : ScrOutStr(RESET); ScrOut('?'); break; } ScrOut(selected ? ':' : ' ');