When playing worm(6) and you crash there's a sleep of 2 seconds that
still allows input to be put into the terminal buffer that doesn't get
read until the application stops.
A similar case is possible in a more limited timespan if you win the
game.
The diff below flushes the input buffer just before exiting curses and
the application, leaving me with no clutter in my $SHELL.
I choose to also add '\n' as an escape character, since it's not part
of the game and allows me to exit after a crash faster (which always
annoys me) and allows me to add a new command straight away.
The crash() case might be a bit elaborate, but it's the closest to the
behaviour we have right now, minus the garbage.
Thoughts? OK?
martijn
Index: worm.c
===================================================================
RCS file: /cvs/src/games/worm/worm.c,v
retrieving revision 1.39
diff -u -p -r1.39 worm.c
--- worm.c 24 Aug 2018 11:14:49 -0000 1.39
+++ worm.c 1 Apr 2020 08:27:03 -0000
@@ -40,6 +40,7 @@
#include <poll.h>
#include <signal.h>
#include <stdlib.h>
+#include <time.h>
#include <unistd.h>
#define HEAD '@'
@@ -239,7 +240,12 @@ rnd(int range)
void
newpos(struct body *bp)
{
+ int ch;
+
if (visible_len == (LINES-3) * (COLS-3) - 1) {
+ timeout(0);
+ while ((ch = getch()) != '\n' && ch != ERR)
+ continue;
endwin();
printf("\nYou won!\nYour final score was %d\n\n", score);
exit(0);
@@ -387,7 +393,17 @@ newlink(void)
void
crash(void)
{
- sleep(2);
+ int ch, delay;
+ struct timespec tstart, tnow, texp;
+
+ timeout(2000);
+ (void) clock_gettime(CLOCK_MONOTONIC, &tstart);
+ while ((ch = getch()) != ERR && ch != '\n') {
+ (void) clock_gettime(CLOCK_MONOTONIC, &tnow);
+ timespecsub(&tnow, &tstart, &texp);
+ delay = 2000 - (texp.tv_sec * 1000) - (texp.tv_nsec / 1000000);
+ timeout(delay >= 0 ? delay : 0);
+ }
clear();
endwin();
printf("Well, you ran into something and the game is over.\n");