diff --git a/README b/README index 4688533..1455ddd 100644 --- a/README +++ b/README @@ -6,6 +6,10 @@ Building ttyvaders --enable-slang: use the SLang library (default) --enable-ncurses: use the ncurses library + --enable-conio: use MS-DOS conio.h + + Cross-compilation example: + ./configure --enable-conio --host=i386-pc-msdosdjgpp History of textmode games diff --git a/configure.ac b/configure.ac index 0870f14..007ca23 100644 --- a/configure.ac +++ b/configure.ac @@ -14,6 +14,10 @@ AM_PROG_CC_C_O AC_PROG_CPP AC_PROG_RANLIB +dnl AC_PROG_EGREP only exists in autoconf 2.54+, so we use AC_EGREP_CPP right +dnl now otherwise it might be set in an obscure if statement. +AC_EGREP_CPP(foo,foo) + AC_ARG_ENABLE(slang, [ --enable-slang slang graphics support (default enabled)]) AC_ARG_ENABLE(ncurses, @@ -26,6 +30,12 @@ USE_NCURSES=false USE_CONIO=false if test "${enable_conio}" = "yes"; then AC_CHECK_HEADER(conio.h,:,AC_MSG_ERROR([cannot find conio.h header])) + AC_MSG_CHECKING(for ScreenUpdate in pc.h) + AC_EGREP_HEADER(ScreenUpdate,pc.h,[ + AC_MSG_RESULT(yes) + AC_DEFINE(SCREENUPDATE_IN_PC_H, 1, + Define if defines ScreenUpdate.)],[ + AC_MSG_RESULT(no)]) AC_DEFINE(USE_CONIO, 1, Define if the backend driver is conio.h) USE_CONIO=: elif test "${enable_ncurses}" = "yes"; then diff --git a/libee/ee.c b/libee/ee.c index 009fe97..08e6a49 100644 --- a/libee/ee.c +++ b/libee/ee.c @@ -22,12 +22,16 @@ #include "config.h" -#ifdef USE_SLANG +#if defined(USE_SLANG) # include -#elif USE_NCURSES +#elif defined(USE_NCURSES) # include -#elif USE_CONIO +#elif defined(USE_CONIO) +# include # include +# if defined(SCREENUPDATE_IN_PC_H) +# include +# endif #else # error "no graphics library detected" #endif @@ -41,13 +45,14 @@ #include "ee.h" static int _ee_delay; -#ifdef USE_CONIO +#if defined(USE_CONIO) static struct text_info ti; +char *_screen_buffer; #endif int ee_init(void) { -#ifdef USE_SLANG +#if defined(USE_SLANG) static char * colors[] = { "black", "green", "yellow", "white", "red", "gray", "lightgray", "blue", "cyan", "magenta", NULL }; int i; @@ -81,7 +86,7 @@ int ee_init(void) SLtt_set_color(i + 1, NULL, colors[i], "black"); } -#elif USE_NCURSES +#elif defined(USE_NCURSES) /* Initialize ncurses library */ initscr(); keypad(stdscr, TRUE); @@ -104,12 +109,13 @@ int ee_init(void) init_pair(EE_CYAN, COLOR_CYAN, COLOR_BLACK); init_pair(EE_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); -#elif USE_CONIO +#elif defined(USE_CONIO) _wscroll = 0; _setcursortype(_NOCURSOR); clrscr(); gettextinfo(&ti); -//window(2, 2, 20, 20); + _screen_buffer = malloc(ee_get_width() * ee_get_height() * 2); + ScreenRetrieve(_screen_buffer); #endif _ee_delay = 0; @@ -117,34 +123,34 @@ int ee_init(void) return 0; } -void ee_set_delay(int delay) +void ee_set_delay(int usec) { - _ee_delay = delay; + _ee_delay = usec; } int ee_get_width(void) { -#ifdef USE_SLANG +#if defined(USE_SLANG) return SLtt_Screen_Cols; -#elif USE_NCURSES +#elif defined(USE_NCURSES) return COLS; -#elif USE_CONIO +#elif defined(USE_CONIO) return ti.screenwidth; #endif } int ee_get_height(void) { -#ifdef USE_SLANG +#if defined(USE_SLANG) return SLtt_Screen_Rows; -#elif USE_NCURSES +#elif defined(USE_NCURSES) return LINES; #else return ti.screenheight; #endif } -#ifndef USE_CONIO +#if !defined(USE_CONIO) static int64_t local_time(void) { struct timeval tv; @@ -160,7 +166,7 @@ static int64_t local_time(void) void ee_refresh(void) { -#ifndef USE_CONIO +#if !defined(USE_CONIO) static int64_t local_clock = 0; int64_t now; @@ -176,15 +182,15 @@ void ee_refresh(void) } #endif -#ifdef USE_SLANG +#if defined(USE_SLANG) SLsmg_refresh(); -#elif USE_NCURSES +#elif defined(USE_NCURSES) refresh(); -#elif USE_CONIO - /* Do nothing? */ +#elif defined(USE_CONIO) + ScreenUpdate(_screen_buffer); #endif -#ifndef USE_CONIO +#if !defined(USE_CONIO) now = local_time(); if(now < local_clock + _ee_delay - 10000) @@ -193,22 +199,27 @@ void ee_refresh(void) } local_clock += _ee_delay; +#else + delay(5); #endif } void ee_end(void) { -#ifdef USE_SLANG +#if defined(USE_SLANG) SLtt_set_cursor_visibility(1); SLang_reset_tty(); SLsmg_reset_smg(); -#elif USE_NCURSES +#elif defined(USE_NCURSES) curs_set(1); endwin(); -#elif USE_CONIO +#elif defined(USE_CONIO) + ScreenUpdate(_screen_buffer); _wscroll = 1; - ee_set_color(EE_WHITE); - ee_putstr(ee_get_width(), ee_get_height()-1, "\r\n"); + textcolor((enum COLORS)WHITE); + textbackground((enum COLORS)BLACK); + gotoxy(ee_get_width(), ee_get_height()); + cputs("\r\n"); _setcursortype(_NORMALCURSOR); #endif } diff --git a/libee/graphics.c b/libee/graphics.c index 468e5f0..76fe93f 100644 --- a/libee/graphics.c +++ b/libee/graphics.c @@ -22,11 +22,11 @@ #include "config.h" -#ifdef USE_SLANG +#if defined(USE_SLANG) # include -#elif USE_NCURSES +#elif defined(USE_NCURSES) # include -#elif USE_CONIO +#elif defined(USE_CONIO) # include #else # error "no graphics library detected" @@ -38,7 +38,7 @@ #include "ee.h" static int ee_color = 0; -#ifdef USE_CONIO +#if defined(USE_CONIO) static enum COLORS dos_colors[] = { 0, BLACK, @@ -57,11 +57,11 @@ static enum COLORS dos_colors[] = { void ee_set_color(int color) { ee_color = color; -#ifdef USE_SLANG +#if defined(USE_SLANG) SLsmg_set_color(color); -#elif USE_NCURSES +#elif defined(USE_NCURSES) attrset(COLOR_PAIR(color)); -#elif USE_CONIO +#elif defined(USE_CONIO) if(color >= 1 && color <= 10) textcolor(dos_colors[color]); #endif @@ -72,31 +72,45 @@ int ee_get_color(void) return ee_color; } +extern char *_screen_buffer; + void ee_putchar(int x, int y, char c) { -#ifdef USE_SLANG +#if defined(USE_SLANG) SLsmg_gotorc(y,x); SLsmg_write_char(c); -#elif USE_NCURSES +#elif defined(USE_NCURSES) move(y,x); addch(c); -#elif USE_CONIO - gotoxy(x+1,y+1); - putch(c); +#elif defined(USE_CONIO) + if(x<0 || x>=ee_get_width() || y<0 || y>=ee_get_height()) + return; + _screen_buffer[2 * (x + y * ee_get_width())] = c; + _screen_buffer[2 * (x + y * ee_get_width()) + 1] = dos_colors[ee_color]; +// gotoxy(x+1,y+1); +// putch(c); #endif } void ee_putstr(int x, int y, char *s) { -#ifdef USE_SLANG + if(y<0 || y>=ee_get_height()) + return; +#if defined(USE_SLANG) SLsmg_gotorc(y,x); SLsmg_write_string(s); -#elif USE_NCURSES +#elif defined(USE_NCURSES) move(y,x); addstr(s); -#elif USE_CONIO - gotoxy(x+1,y+1); - cputs(s); +#elif defined(USE_CONIO) + char *buf = _screen_buffer + 2 * (x + y * ee_get_width()); + while(*s) + { + *buf++ = *s++; + *buf++ = dos_colors[ee_color]; + } +// gotoxy(x+1,y+1); +// cputs(s); #endif }