char *progname = NULL;
char *version = "1.1";
+int chrono = 0;
char *filename = NULL;
int scale = 1;
int nbdigit = 5;
int maxscor = 100000;
+int nbholes = 2;
int savelen = 12;
int xoffset = 1;
int usage (int ret)
{
FILE *fd = ret ? stderr : stdout;
- fprintf (fd, "usage: %s [-f file] [-h] [-s int] [-v int] [-w int]\n", progname);
+ fprintf (fd, "usage: %s [-c] [-f file] [-h] [-s int] [-v int] [-w int]\n", progname);
+ fprintf (fd, " -c: time penalty (%s)", (chrono) ? "yes" : "no" );
fprintf (fd, " -f: file name (%s)\n", (filename) ? filename : "none");
fprintf (fd, " -s: scale [0..3] (%d)\n", scale);
fprintf (fd, " -v: verbose level (%d)\n", verbose);
return ret;
}
+block_t *drawblock (board_t *board, block_t *blocks, int nb_blocks, block_t *cblock, int *current, int *xblock, int *yblock, int *next)
+{
+ /* clean block and get next */
+ if (cblock) {
+ freeblock (cblock);
+ *current = *next;
+ *next = rand () % nb_blocks;
+ }
+
+ /* init state */
+ if (*current == -1) {
+ *current = rand () % nb_blocks;
+ }
+ if (*next == -1) {
+ *next = rand () % nb_blocks;
+ }
+
+ cblock = copyblock (blocks + *current);
+ *xblock = board->width / 2;
+ *yblock = 0;
+
+ return cblock;
+}
+
void setendtime (struct timeval *t, int s)
{
gettimeofday (t, NULL);
}
char c = arg[1];
switch (c) {
+ case 'c':
+ chrono = 1;
+ break;
case 'f':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
if (arg == NULL) {
srand (time (NULL));
/* get first bloc */
- if (current == -1) {
- current = rand () % nb_blocks;
- }
- block_t *cblock = copyblock (blocks + current);
- int xblock = board->width / 2;
- int yblock = 0;
- if (next == -1) {
- next = rand () % nb_blocks;
- }
+ int xblock, yblock;
+ block_t *cblock = drawblock (board, blocks, nb_blocks, NULL, ¤t, &xblock, &yblock, &next);
VERBOSE (DEBUG, fprintf (stderr, "%d/%d: (%d, %d)\n", current, nb_blocks, xblock, yblock));
/* init curses window */
int mode = -1;
int settle = 0;
int speed = 5000;
+ float chronoratio = 5.0;
int stop = 0;
- struct timeval tend = {0, 0};
+ struct timeval blockend = {0, 0};
+ struct timeval lineend = {0, 0};
while (!stop) {
char msg[128] = {0};
+ msgwindow (msg, xmsg, ymsg, lmsg);
switch (mode) {
case -1:
sprintf (msg, "Get ready player One. Press <s> to start");
break;
case 0:
- halfdelay (0);
boardwindow (nextblock, 1);
displayblock (nextblock, blocks + current, -1, -1);
sprintf (msg, "Game in pause. Pause <p> to continue");
break;
case 1:
halfdelay (1);
- if (tend.tv_sec && isovertime (&tend)) {
+ if (blockend.tv_sec && isovertime (&blockend)) {
if (testvalidpos (board, cblock, xblock, yblock + 1)) {
yblock++;
} else {
settle = 1;
}
- setendtime (&tend, speed);
+ setendtime (&blockend, speed);
}
if (settle) {
settleblock (board, cblock, xblock, yblock);
- freeblock (cblock);
- current = next;
- cblock = copyblock (blocks + current);
- xblock = board->width / 2;
- yblock = 0;
- next = rand () % nb_blocks;
- settle = 0;
}
- if (!testvalidpos (board, cblock, xblock, yblock)) {
- halfdelay (0);
- mode = 2;
- sprintf (msg, "To bad, you loose. Score is %d", score);
+ int nblines = checkline (board, &score, &lines);
+ if (nblines) {
+ while (nblines-- > 0) {
+ boardwindow (board, 0);
+ stackboard (board);
+ usleep ((200 + 2000 / (lines / 10 + 1)) * 100);
+ refresh ();
+ }
+ if (chrono) {
+ setendtime (&lineend, chronoratio * speed);
+ }
+ } else if (chrono && lineend.tv_sec && isovertime (&lineend)) {
+ if (!testvalidpos (board, cblock, xblock, yblock + 1)) {
+ settleblock (board, cblock, xblock, yblock);
+ settle = 1;
+ }
+ int isempty = addline (board, nbholes);
+ if (!isempty) {
+ sprintf (msg, "Shame, you loose. Score is %d", score);
+ mode = 2;
+ settle = 0;
+ }
+ setendtime (&lineend, chronoratio * speed);
+ }
+ if (settle) {
+ if (!testvalidpos (board, blocks + next , board->width / 2, 0)) {
+ sprintf (msg, "To bad, you loose. Score is %d", score);
+ mode = 2;
+ } else {
+ cblock = drawblock (board, blocks, nb_blocks, cblock, ¤t, &xblock, &yblock, &next);
+ boardwindow (nextblock, 1);
+ displayblock (nextblock, blocks + next, -1, -1);
+ }
+ settle = 0;
}
- boardwindow (nextblock, 1);
- displayblock (nextblock, blocks + next, -1, -1);
break;
case 2:
freeblock (cblock);
sprintf (msg, "End of game. Press <q> to quit");
}
- msgwindow (msg, xmsg, ymsg, lmsg);
- int nblines = checkline (board, &score, &lines);
- while (nblines-- > 0) {
- boardwindow (board, 0);
- stackboard (board);
- usleep ((200 + 2000 / (lines / 10 + 1)) * 100);
- refresh ();
+ if (*msg) {
+ halfdelay (0);
+ msgwindow (msg, xmsg, ymsg, lmsg);
+ usleep (800000);
}
+
boardwindow (board, 0);
scorewindow (xscore, yscore, nbdigit, score, (lines / 10) + 1);
int newspeed = 10 + 4900 / (lines / 10 + 1);
if (newspeed != speed) {
speed = newspeed;
- setendtime (&tend, speed);
+ setendtime (&blockend, speed);
+ if (chrono) {
+ setendtime (&lineend, chronoratio * speed);
+ }
}
if (mode == 1) {
displayblock (board, cblock, xblock, yblock);
switch (mode) {
case 0:
mode = 1;
- setendtime (&tend, speed);
+ setendtime (&blockend, speed);
+ if (chrono) {
+ setendtime (&lineend, chronoratio * speed);
+ }
break;
case 1:
mode = 0;
/* test: { echo -n s; sleep 1; echo lllololo; sleep 1; echo jjjujuju; sleep 1; echo lllololo; sleep 1; echo jjjujuju; sleep 1; echo q; } | tetris.exe -w 9*/
/* test: { echo -n s; sleep 1; echo ccccccccccccc; sleep 1; echo q; } | tetris.exe */
/* test: { echo -n s; sleep 1; echo -n jjuuuc; sleep 1; echo -n jjoc; sleep 1; echo q; } | tetris.exe -f lines.ttr */
+/* test: { echo -n s; sleep 1; echo -n jjuuuc; sleep 1; echo -n jjoc; sleep 1; echo q; } | tetris.exe -c -f lines.ttr */
+/* test: { echo -n sccccccc; sleep 50; echo q; } | tetris.exe -c */
/* vim: set ts=4 sw=4 et: */