mirror of https://github.com/sean-m/zork
232 lines
4.6 KiB
C
232 lines
4.6 KiB
C
/* supp.c -- support routines for dungeon */
|
|
|
|
#include <stdio.h>
|
|
|
|
#ifdef unix
|
|
#include <sys/types.h>
|
|
#endif
|
|
|
|
#ifdef BSD4_2
|
|
#include <sys/time.h>
|
|
#else /* ! BSD4_2 */
|
|
#include <time.h>
|
|
#endif /* ! BSD4_2 */
|
|
|
|
#include "funcs.h"
|
|
|
|
/* Define these here to avoid using <stdlib.h> */
|
|
|
|
extern void exit P((int));
|
|
extern int rand P((void));
|
|
|
|
/* We should have a definition for time_t and struct tm by now. Make
|
|
* sure we have definitions for the functions we want to call.
|
|
* The argument to localtime should be P((const time_t *)), but Ultrix
|
|
* 4.0 leaves out the const in their prototype. Damn them.
|
|
*/
|
|
|
|
extern time_t time P((time_t *));
|
|
extern struct tm *localtime ();
|
|
|
|
/* Terminate the game */
|
|
|
|
void exit_()
|
|
{
|
|
fprintf(stderr, "The game is over.\n");
|
|
exit(0);
|
|
}
|
|
|
|
/* Get time in hours, minutes and seconds */
|
|
|
|
void itime_(hrptr, minptr, secptr)
|
|
integer *hrptr;
|
|
integer *minptr;
|
|
integer *secptr;
|
|
{
|
|
time_t timebuf;
|
|
struct tm *tmptr;
|
|
|
|
time(&timebuf);
|
|
tmptr = localtime(&timebuf);
|
|
|
|
*hrptr = tmptr->tm_hour;
|
|
*minptr = tmptr->tm_min;
|
|
*secptr = tmptr->tm_sec;
|
|
}
|
|
/* Random number generator */
|
|
|
|
integer rnd_(maxval)
|
|
integer maxval;
|
|
{
|
|
return rand() % maxval;
|
|
}
|
|
|
|
/* Terminal support routines for dungeon */
|
|
/* By Ian Lance Taylor ian@airs.com or uunet!airs!ian */
|
|
|
|
/* The dungeon game can often output long strings, more than enough
|
|
* to overwhelm a typical 24 row terminal (I assume that back when
|
|
* dungeon was written people generally used paper terminals (I know
|
|
* I did) so this was not a problem). The functions in this file
|
|
* provide a very simplistic ``more'' facility. They are necessarily
|
|
* somewhat operating system dependent, although I have tried to
|
|
* minimize it as much as I could.
|
|
*/
|
|
|
|
/* The following macro definitions may be used to control how these
|
|
* functions work:
|
|
*
|
|
* MORE_NONE Don't use the more facility at all
|
|
* MORE_24 Always assume a 24 row terminal
|
|
* MORE_TERMCAP Use termcap routines to get rows of terminal
|
|
* MORE_TERMINFO Use terminfo routines to get rows of terminal
|
|
* MORE_AMOS Use AMOS monitor calls to get rows of terminal
|
|
*
|
|
* If none of these are defined then this will use termcap routines on
|
|
* unix and AMOS routines on AMOS.
|
|
*/
|
|
|
|
#ifndef MORE_NONE
|
|
#ifndef MORE_24
|
|
#ifndef MORE_TERMCAP
|
|
#ifndef MORE_TERMINFO
|
|
#ifndef MORE_AMOS
|
|
#ifdef __AMOS__
|
|
#define MORE_AMOS
|
|
#else /* ! __AMOS__ */
|
|
#ifdef unix
|
|
#define MORE_TERMCAP
|
|
#else /* ! unix */
|
|
#define MORE_NONE
|
|
#endif /* ! unix */
|
|
#endif /* ! __AMOS__ */
|
|
#endif /* ! MORE_AMOS */
|
|
#endif /* ! MORE_TERMINFO */
|
|
#endif /* ! MORE_TERMCAP */
|
|
#endif /* ! MORE_24 */
|
|
#endif /* ! MORE_NONE */
|
|
|
|
#ifdef MORE_TERMCAP
|
|
|
|
extern char *getenv P((const char *));
|
|
extern void tgetent P((char *, const char *));
|
|
extern int tgetnum P((const char *));
|
|
|
|
#else /* ! MORE_TERMCAP */
|
|
|
|
#ifdef MORE_TERMINFO
|
|
|
|
#include <cursesX.h>
|
|
#include <term.h>
|
|
extern void setupterm P((const char *, int, int));
|
|
|
|
#else /* ! MORE_TERMINFO */
|
|
|
|
#ifdef MORE_AMOS
|
|
|
|
#include <moncal.h>
|
|
#include <unistd.h>
|
|
|
|
#endif /* MORE_AMOS */
|
|
#endif /* ! MORE_TERMINFO */
|
|
#endif /* ! MORE_TERMCAP */
|
|
|
|
/* Initialize the more waiting facility (determine how many rows the
|
|
* terminal has).
|
|
*/
|
|
|
|
static integer crows;
|
|
static integer coutput;
|
|
|
|
void more_init()
|
|
{
|
|
#ifdef MORE_NONE
|
|
|
|
crows = 0;
|
|
|
|
#else /* ! MORE_NONE */
|
|
#ifdef MORE_24
|
|
|
|
crows = 24;
|
|
|
|
#else /* ! MORE_24 */
|
|
#ifdef MORE_TERMCAP
|
|
|
|
char buf[2048];
|
|
char *term;
|
|
|
|
term = getenv("TERM");
|
|
if (term == NULL)
|
|
crows = 0;
|
|
else {
|
|
tgetent(buf, term);
|
|
crows = tgetnum("li");
|
|
}
|
|
|
|
#else /* ! MORE_TERMCAP */
|
|
#ifdef MORE_TERMINFO
|
|
|
|
int i;
|
|
|
|
setupterm(NULL, 1, &i);
|
|
if (i != 1)
|
|
crows = 0;
|
|
else
|
|
crows = lines;
|
|
|
|
#else /* ! MORE_TERMINFO */
|
|
#ifdef MORE_AMOS
|
|
|
|
trm_char st;
|
|
|
|
if (isatty(fileno(stdin)) == 0)
|
|
crows = 0;
|
|
else {
|
|
trmchr(&st, 0);
|
|
crows = st.row;
|
|
}
|
|
|
|
#else /* ! MORE_AMOS */
|
|
|
|
This should be impossible
|
|
|
|
#endif /* ! MORE_AMOS */
|
|
#endif /* ! MORE_TERMINFO */
|
|
#endif /* ! MORE_TERMCAP */
|
|
#endif /* ! MORE_24 */
|
|
#endif /* ! MORE_NONE */
|
|
}
|
|
|
|
/* The program wants to output a line to the terminal. If z is not
|
|
* NULL it is a simple string which is output here; otherwise it
|
|
* needs some sort of formatting, and is output after this function
|
|
* returns (if all computers had vprintf I would just it, but they
|
|
* probably don't).
|
|
*/
|
|
|
|
void more_output(z)
|
|
const char *z;
|
|
{
|
|
/* pager code remarked out to allow streamed input and output */
|
|
/*
|
|
if (crows > 0 && coutput > crows - 2) {
|
|
printf("Press return to continue: ");
|
|
(void) fflush(stdout);
|
|
while (getchar() != '\n')
|
|
;
|
|
coutput = 0;
|
|
}
|
|
*/
|
|
if (z != NULL)
|
|
printf("%s\n", z);
|
|
|
|
coutput++;
|
|
}
|
|
|
|
/* The terminal is waiting for input (clear the number of output lines) */
|
|
|
|
void more_input()
|
|
{
|
|
coutput = 0;
|
|
}
|