#include <signal.h>
#include <ctype.h>
#include <stdarg.h>
-#include <time.h>
#include "sst.h"
#include "sstlinux.h"
-static int linecount; /* for paging */
-static int curses = TRUE;
+static int rows, linecount; /* for paging */
WINDOW *curwnd;
static void outro(void)
/* wrap up, either normally or due to signal */
{
- if (curses) {
+ if (game.options & OPTION_CURSES) {
clear();
curs_set(1);
(void)refresh();
}
}
-void iostart(int usecurses)
+void iostart(void)
{
- if ((curses = usecurses)) {
+ if (!(game.options & OPTION_CURSES)) {
+ rows = atoi(getenv("LINES"));
+ } else {
if (atexit(outro)){
fprintf(stderr,"Unable to register outro(), exiting...\n");
exit(1);
(void)saveterm();
(void)nonl();
(void)cbreak();
+#ifdef A_COLOR
+ {
+ start_color();
+ init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK);
+ init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
+ init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
+ init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
+ init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
+ init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
+ init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
+ init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
+ }
+#endif /* A_COLOR */
//(void)noecho();
- FULLSCREEN_WINDOW = stdscr;
- SRSCAN_WINDOW = newwin(12, 25, 0, 0);
- REPORT_WINDOW = newwin(10, 0, 1, 25);
- LRSCAN_WINDOW = newwin(10, 0, 0, 64);
- LOWER_WINDOW = newwin(0, 0, 12, 0);
- BOTTOM_WINDOW = newwin(1, 0, LINES-1, 0);
- scrollok(LOWER_WINDOW, TRUE);
+ fullscreen_window = stdscr;
+ srscan_window = newwin(12, 25, 0, 0);
+ report_window = newwin(10, 0, 1, 25);
+ lrscan_window = newwin(10, 0, 0, 64);
+ message_window = newwin(0, 0, 12, 0);
+ prompt_window = newwin(1, 0, LINES-2, 0);
+ scrollok(message_window, TRUE);
+ setwnd(fullscreen_window);
+ textcolor(DEFAULT);
}
}
void waitfor(void)
/* wait for user action -- OK to do nothing if on a TTY */
{
- if (curses)
+ if (game.options & OPTION_CURSES)
getch();
}
char *prompt;
char buf[BUFSIZ];
if (i==1) {
- if (skill > 2)
+ if (skill > SKILL_FAIR)
prompt = "[ANOUNCEMENT ARRIVING...]";
else
prompt = "[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]";
}
else {
- if (skill > 2)
+ if (skill > SKILL_FAIR)
prompt = "[CONTINUE?]";
else
prompt = "[PRESS ENTER TO CONTINUE]";
}
- if (curses) {
+ if (game.options & OPTION_CURSES) {
drawmaps(0);
- setwnd(BOTTOM_WINDOW);
- wclear(BOTTOM_WINDOW);
- waddstr(BOTTOM_WINDOW, prompt);
- wgetnstr(BOTTOM_WINDOW, buf, sizeof(buf));
- wclear(BOTTOM_WINDOW);
- wrefresh(BOTTOM_WINDOW);
- setwnd(LOWER_WINDOW);
+ setwnd(prompt_window);
+ wclear(prompt_window);
+ waddstr(prompt_window, prompt);
+ wgetnstr(prompt_window, buf, sizeof(buf));
+ wclear(prompt_window);
+ wrefresh(prompt_window);
+ setwnd(message_window);
} else {
putchar('\n');
proutn(prompt);
fgets(buf, sizeof(buf), stdin);
if (i != 0) {
int j;
- for (j = 0; j < 24; j++)
+ for (j = 0; j < rows; j++)
putchar('\n');
}
linecount = 0;
void skip(int i)
{
while (i-- > 0) {
- if (curses) {
+ if (game.options & OPTION_CURSES) {
proutn("\n\r");
} else {
linecount++;
- if (linecount >= 24)
+ if (linecount >= rows)
pause_game(0);
else
putchar('\n');
static void vproutn(char *fmt, va_list ap)
{
- if (curses) {
+ if (game.options & OPTION_CURSES) {
vwprintw(curwnd, fmt, ap);
wrefresh(curwnd);
}
void prouts(char *fmt, ...)
/* print slowly! */
{
- clock_t endTime;
char *s, buf[BUFSIZ];
va_list ap;
va_start(ap, fmt);
va_end(ap);
skip(1);
for (s = buf; *s; s++) {
- endTime = clock() + CLOCKS_PER_SEC*0.05;
- while (clock() < endTime) continue;
- if (curses) {
+ delay(30);
+ if (game.options & OPTION_CURSES) {
waddch(curwnd, *s);
wrefresh(curwnd);
}
void cgetline(char *line, int max)
{
- if (curses) {
+ if (game.options & OPTION_CURSES) {
wgetnstr(curwnd, line, max);
strcat(line, "\n");
wrefresh(curwnd);
void setwnd(WINDOW *wnd)
/* change windows -- OK for this to be a no-op in tty mode */
{
- if (curses) {
+ if (game.options & OPTION_CURSES) {
curwnd=wnd;
- curs_set(wnd == FULLSCREEN_WINDOW || wnd == LOWER_WINDOW);
+ curs_set(wnd == fullscreen_window || wnd == message_window || wnd == prompt_window);
}
}
void clreol (void)
/* clear to end of line -- can be a no-op in tty mode */
{
- if (curses) {
+ if (game.options & OPTION_CURSES) {
wclrtoeol(curwnd);
wrefresh(curwnd);
}
void clrscr (void)
/* clear screen -- can be a no-op in tty mode */
{
- if (curses) {
+ if (game.options & OPTION_CURSES) {
wclear(curwnd);
wmove(curwnd,0,0);
wrefresh(curwnd);
void textcolor (int color)
{
- if (curses) {
- wattroff(curwnd, A_REVERSE);
- // FIXME
- }
+#ifdef A_COLOR
+ if (game.options & OPTION_CURSES) {
+ switch(color) {
+ case DEFAULT:
+ wattrset(curwnd, 0);
+ break;
+ case BLACK:
+ wattron(curwnd, COLOR_PAIR(COLOR_BLACK));
+ break;
+ case BLUE:
+ wattron(curwnd, COLOR_PAIR(COLOR_BLUE));
+ break;
+ case GREEN:
+ wattron(curwnd, COLOR_PAIR(COLOR_GREEN));
+ break;
+ case CYAN:
+ wattron(curwnd, COLOR_PAIR(COLOR_CYAN));
+ break;
+ case RED:
+ wattron(curwnd, COLOR_PAIR(COLOR_RED));
+ break;
+ case MAGENTA:
+ wattron(curwnd, COLOR_PAIR(COLOR_MAGENTA));
+ break;
+ case BROWN:
+ wattron(curwnd, COLOR_PAIR(COLOR_YELLOW));
+ break;
+ case LIGHTGRAY:
+ wattron(curwnd, COLOR_PAIR(COLOR_WHITE));
+ break;
+ case DARKGRAY:
+ wattron(curwnd, COLOR_PAIR(COLOR_BLACK) | A_BOLD);
+ break;
+ case LIGHTBLUE:
+ wattron(curwnd, COLOR_PAIR(COLOR_BLUE) | A_BOLD);
+ break;
+ case LIGHTGREEN:
+ wattron(curwnd, COLOR_PAIR(COLOR_GREEN) | A_BOLD);
+ break;
+ case LIGHTCYAN:
+ wattron(curwnd, COLOR_PAIR(COLOR_CYAN) | A_BOLD);
+ break;
+ case LIGHTRED:
+ wattron(curwnd, COLOR_PAIR(COLOR_RED) | A_BOLD);
+ break;
+ case LIGHTMAGENTA:
+ wattron(curwnd, COLOR_PAIR(COLOR_MAGENTA) | A_BOLD);
+ break;
+ case YELLOW:
+ wattron(curwnd, COLOR_PAIR(COLOR_YELLOW) | A_BOLD);
+ break;
+ case WHITE:
+ wattron(curwnd, COLOR_PAIR(COLOR_WHITE) | A_BOLD);
+ break;
+ }
+ }
+#endif /* A_COLOR */
}
void highvideo (void)
{
- if (curses) {
- attron(A_REVERSE);
+ if (game.options & OPTION_CURSES) {
+ wattron(curwnd, A_REVERSE);
}
}
void drawmaps(short l)
/* hook to be called after moving to redraw maps */
{
- if (curses) {
- if (l == 1)
+ if (game.options & OPTION_CURSES) {
+ if (l == 1)
sensor();
if (l != 2) {
- setwnd(SRSCAN_WINDOW);
+ setwnd(srscan_window);
wmove(curwnd, 0, 0);
enqueue("no");
srscan(SCAN_FULL);
- setwnd(REPORT_WINDOW);
- wclear(REPORT_WINDOW);
- wmove(REPORT_WINDOW, 0, 0);
+ setwnd(report_window);
+ wclear(report_window);
+ wmove(report_window, 0, 0);
srscan(SCAN_NO_LEFTSIDE);
- setwnd(LRSCAN_WINDOW);
- wclear(LRSCAN_WINDOW);
- wmove(LRSCAN_WINDOW, 0, 0);
+ setwnd(lrscan_window);
+ wclear(lrscan_window);
+ wmove(lrscan_window, 0, 0);
enqueue("l");
lrscan();
}
void boom(int ii, int jj)
/* enemy fall down, go boom */
{
- if (curses) {
- setwnd(SRSCAN_WINDOW);
+ if (game.options & OPTION_CURSES) {
+ setwnd(srscan_window);
drawmaps(2);
- wmove(SRSCAN_WINDOW, ii*2+3, jj+2);
- wattron(SRSCAN_WINDOW, A_REVERSE);
- waddch(SRSCAN_WINDOW, game.quad[ii][jj]);
- wrefresh(SRSCAN_WINDOW);
+ wmove(srscan_window, ii*2+3, jj+2);
+ wattron(srscan_window, A_REVERSE);
+ waddch(srscan_window, game.quad[ii][jj]);
+ wrefresh(srscan_window);
sound(500);
delay(1000);
nosound();
- wmove(SRSCAN_WINDOW, ii*2+3, jj+2);
- wattroff(SRSCAN_WINDOW, A_REVERSE);
- waddch(SRSCAN_WINDOW, game.quad[ii][jj]);
- wrefresh(SRSCAN_WINDOW);
- setwnd(LOWER_WINDOW);
+ wmove(srscan_window, ii*2+3, jj+2);
+ wattroff(srscan_window, A_REVERSE);
+ waddch(srscan_window, game.quad[ii][jj]);
+ wrefresh(srscan_window);
+ setwnd(message_window);
delay(500);
}
}
void warble(void)
/* sound and visual effects for teleportation */
{
- if (curses) {
+ if (game.options & OPTION_CURSES) {
drawmaps(1);
- setwnd(LOWER_WINDOW);
+ setwnd(message_window);
sound(50);
delay(1000);
nosound();
void tracktorpedo(int x, int y, int ix, int iy, int wait, int l, int i, int n, int iquad)
/* torpedo-track animation */
{
- if (!curses) {
+ if (!game.options & OPTION_CURSES) {
if (l == 1) {
if (n != 1) {
skip(1);
void makechart(void)
{
- if (curses) {
- setwnd(LOWER_WINDOW);
- wclear(LOWER_WINDOW);
+ if (game.options & OPTION_CURSES) {
+ setwnd(message_window);
+ wclear(message_window);
chart(0);
}
}
void setpassword(void)
{
- if (!curses) {
+ if (!(game.options & OPTION_CURSES)) {
while (TRUE) {
scan();
strcpy(game.passwd, citem);