void init () { int c, x, y, i; srand (time(NULL)); initscr (); raw (); nodelay(stdscr,1); noecho(); curs_set(0); nonl(); keypad(stdscr,1); resize_term(25,80); #ifdef PDCURSES PDC_set_title("Cymon's Games - Alleytris"); #endif start_color(); for (c = 0; c < COLORS; c++) if (c == COLOR_WHITE) init_pair(c, COLOR_BLACK, c); else init_pair(c, COLOR_WHITE, c); /* Allocate the memory required for the board buffer here */ buf = (int **)malloc(sizeof(int *) * (HEIGHT + 1)); for (i = 0; i < HEIGHT + 1; i++) { buf[i] = (int*)malloc(sizeof(int) * (col_width + 2)); } x = (COLS - col_width - 15) / 2; y = (LINES - HEIGHT) / 2; clear (); refresh (); pwin = newwin(HEIGHT + 1, col_width * 2 + 2, y, x); nwin = newwin(6, 10, y + 1, x + col_width * 2 + 5); iwin = newwin(15, 15, y + 8, x + col_width * 2 + 3); wattrset (iwin, COLOR_PAIR (COLORS / 2)); wfillrect (iwin, 1, 1, 14, 13); box (iwin, 0,0); drawmsg (iwin, 4, 1, 10, instruct); wrefresh (iwin); }
int main(int argc, char *argv[]) { setlocale(LC_ALL,""); PDC_set_title("Dungcrwl"); if (initGame(argc, argv)) return 1; while (quit == FALSE) { switch(game_state) { case GAME_MENU: showMenu(); break; case GAME_INTRO: newGame(); break; case GAME_PLAYING: gameLoop(); break; case GAME_DONE: quit = TRUE; break; } } gameShutdown(); return 0; }
void init_curses() { errs=0; if (ERR==keypad(stdscr=initscr(),true)) mvaddstr(Y_+errs++,0,"Cannot enable keypad"); if (ERR==noecho()) mvaddstr(Y_+errs++,0,"Cannot set noecho mode"); if (ERR==curs_set(0)) mvaddstr(errs++,X_+1,"Cannot set invisible cursor"); if (ERR==start_color()) mvaddstr(errs++,X_+1,"Cannot enable colors"); else { int c; for (c=0; c<8; c++) init_pair(c,c,0); } PDC_set_title("Crypt Rover on Cymon's Games"); }
void set_title (char *s) { #if defined(USE_NCURSES) || defined (USE_NCURSES_W) if (tgetflag ("hs")) { // terminal has status line support char buf[255] = {0}; char *p = buf; // tgetstr modifies its second argument, let buf keep pointing to the beginning char *ok; // tgetstr's return value is apparently undocumented, except that it's NULL on errors ok = tgetstr ("tsl", &p); // "to status line" if (ok == NULL) return; strcpy (p - 1, s); // tgetstr leaves us *after* the null, so skip back a bit p += strlen (s) - 1; // same here ok = tgetstr ("fsl", &p); // "from status line" if (ok == NULL) return; putp (buf); } #else // assume pdcurses PDC_set_title(s); #endif }
Screen::Screen() { initscr(); #ifdef WIN32 PDC_set_title("Harvest Rogue"); resize_term(40, 120); #endif noecho(); cbreak(); keypad(stdscr, TRUE); nodelay(stdscr, FALSE); notimeout(stdscr, TRUE); raw(); curs_set(0); start_color(); clear(); for (short i = 0; i < 16; i++) { init_pair(i + 1, i, CLR_BLACK); } for (short i = 16; i < 32; i++) { init_pair(i + 1, i - 15, CLR_WHITE); } }
/* Among other things, 'newtest' demonstrates how to make a Win32a PDCurses app that is a for-real, "pure Windows" version (instead of a console application). Doing this is quite easy, and has certain advantages. If the app is invoked from a command prompt, the only difference you'll see is that the app runs separately (that is, you can continue to use the command prompt, switching between it, your PDCurses/Win32a app, and other processes). Which is the main reason I did it; it meant that I could invoke a PDCurses-based text editor, for example, and still have use of the command line. (NOTE that, for reasons I don't actually understand, this happens when the Visual C++ compiler is used. With MinGW or OpenWatcom, it's still "really" a console app.) To do it, we ensure that the usual main() function has an alternative dummy_main() form, taking the same arguments as main(). We add a WinMain() function, whose sole purpose is to reformulate lpszCmdLine into argc/argv form, and pass it on to dummy_main(). And, of course, we can switch back to a "normal" console app by removing the above #define PURE_WINDOWS_VERSION line. */ #ifdef PURE_WINDOWS_VERSION #undef MOUSE_MOVED #include <windows.h> int dummy_main( int argc, char **argv); int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { char *argv[30]; int i, argc = 1; argv[0] = "newtest"; for( i = 0; lpszCmdLine[i]; i++) if( lpszCmdLine[i] != ' ' && (!i || lpszCmdLine[i - 1] == ' ')) argv[argc++] = lpszCmdLine + i; for( i = 0; lpszCmdLine[i]; i++) if( lpszCmdLine[i] == ' ') lpszCmdLine[i] = '\0'; return dummy_main( argc, (char **)argv); } int dummy_main( int argc, char **argv) #else /* "usual", console-app version: */ int main( int argc, char **argv) #endif { int quit = 0, i, fmt = 0xa, use_slk = 1; bool blink_state = FALSE; int cursor_state_1 = 2, cursor_state_2 = 3; int show_slk_index_line = 0; int redraw = 1; // setlocale(LC_ALL, ".utf8"); ttytype[0] = 25; ttytype[1] = 90; /* Allow 25 to 90 lines... */ ttytype[2] = 80; ttytype[3] = (char)200; /* ...and 80 to 200 columns */ /* (This program gets weird artifacts when smaller than 25x80.) */ for( i = 1; i < argc; i++) if( argv[i][0] == '-') switch( argv[i][1]) { case 's': use_slk = 0; break; case 'l': setlocale( LC_ALL, argv[i] + 2); break; case 'f': sscanf( argv[i] + 2, "%x", &fmt); break; case 'i': show_slk_index_line = 1; break; case 'r': /* allow user-resizable windows */ { int min_lines, max_lines, min_cols, max_cols; if( sscanf( argv[i] + 2, "%d,%d,%d,%d", &min_lines, &max_lines, &min_cols, &max_cols) == 4) { ttytype[0] = min_lines; ttytype[1] = max_lines; ttytype[2] = min_cols; ttytype[3] = max_cols; } } break; default: printf( "Option '%s' unrecognized\n", argv[i]); break; } if( use_slk) slk_init( show_slk_index_line ? 3 : 0); Xinitscr(argc, argv); if( use_slk) slk_setup( show_slk_index_line ? -fmt : fmt); start_color(); # if defined(NCURSES_VERSION) || (defined(PDC_BUILD) && PDC_BUILD > 3000) use_default_colors(); # endif cbreak(); noecho(); clear(); refresh(); #ifdef __PDCURSES__ PDC_set_title( "NewTest: tests various PDCurses features"); #endif keypad( stdscr, TRUE); init_pair( 1, 15, COLOR_BLACK); init_pair( 2, COLOR_BLACK, COLOR_YELLOW); mousemask( ALL_MOUSE_EVENTS, NULL); attrset( COLOR_PAIR( 1)); while( !quit) { char buff[40]; const int color_block_start = 52; const int color_block_size = 14; int c; const char *cursor_state_text[N_CURSORS] = { "Invisible (click to change) ", "Underscore (click to change)", "Block (click to change) ", "Outline (click to change) ", "Caret (click to change) ", "Half-block (click to change)", "Central (click to change) ", "Cross (click to change) ", "Heavy box (click to change) " }; if( redraw) { mvaddstr( 1, COL1, "'Normal' white-on-black"); #ifdef WACS_S1 mvaddwstr( 2, COL1, L"'Normal' text, but wide"); #endif attron( A_BLINK); mvaddstr( 6, 40, "Blinking"); attron( A_BOLD); mvaddstr( 8, 40, "BlinkBold"); attron( A_ITALIC); mvaddstr( 0, COL2, "BlinkBoldItalic"); attrset( COLOR_PAIR( 3)); attron( A_UNDERLINE); #ifdef WACS_S1 mvaddstr( 2, COL1, "Underlined"); addwstr( L"WideUnder"); #endif attrset( COLOR_PAIR( 1)); attron( A_UNDERLINE | A_ITALIC); mvaddstr( 2, COL2, "UnderlinedItalic"); attrset( COLOR_PAIR( 2)); attron( A_BLINK); mvaddstr( 4, COL1, "Black-on-yellow blinking"); attrset( COLOR_PAIR( 1)); move( 4, COL2); text_in_a_box( "Text in a box"); attrset( COLOR_PAIR( 6)); attron( A_STRIKEOUT); mvaddstr( 10, 40, "Strikeout"); attrset( COLOR_PAIR( 1)); for( i = 0; i < 128; i++) { /* Show extended characters: */ char buff[5]; sprintf( buff, "%2x %c", i + 128, (char)(i + 128)); mvaddstr( 5 + i % 16, (i / 16) * 5, buff); } #if(CHTYPE_LONG >= 2) /* "non-standard" 64-bit chtypes */ for( i = 0; i < 3; i++) { /* Demonstrate full RGB color control: */ int j; const char *output_text[3] = { "Red on green to white on black | (you can get full RGB colors when desired,", "Blue on yellow to black on red | with palette coloring still being available)", "White on red to green on blue, underlined and italic" }; const int len = strlen( output_text[i]); move( 21 + i, 1); for( j = 0; j < len; j++) { attr_t output_color; const int oval = j * 31 / len; const int reverse = 31 - oval; if( !i) output_color = A_RGB( 31, oval, oval, 0, reverse, 0); else if( i == 1) output_color = A_RGB( 0, 0, reverse, 31, reverse, 0); else { output_color = A_RGB( reverse, 31, reverse, reverse, 0, oval); output_color |= A_UNDERLINE | A_ITALIC; } attrset( output_color); addch( output_text[i][j]); } } #endif /* #if(CHTYPE_LONG >= 2) */ redraw = 0; } attrset( COLOR_PAIR( 1)); #ifdef MAYBE_TRY_THIS_SOMEWHERE_ELSE mvaddstr( 1, COL3, "Click on cursor descriptions to"); mvaddstr( 2, COL3, "cycle through possible cursors"); mvaddstr( 3, COL3, "Click on colors at left to change"); mvaddstr( 4, COL3, "colors used for under/over/outlining"); mvaddstr( 5, COL3, "Click 'Blink' at bottom to toggle"); mvaddstr( 6, COL3, "'real' blinking vs. 'highlit' blink"); #endif mvaddstr( 19, color_block_start, cursor_state_text[cursor_state_1]); mvaddstr( 20, color_block_start, cursor_state_text[cursor_state_2]); curs_set( (cursor_state_1 << 8) | cursor_state_2); for( i = 0; i < 256; i++) { attrset( COLOR_PAIR( i)); if( i > 2) init_pair((short)i, (short)i, COLOR_BLACK); if( !(i % color_block_size)) move( i / color_block_size, color_block_start); attron( A_REVERSE); addstr( " "); } move( 18, 77); refresh(); c = getch( ); attrset( COLOR_PAIR( 1)); if( c == KEY_RESIZE) { redraw = 1; resize_term( 0, 0); } else if( c == KEY_F(1) || c == 27) quit = 1; else if( c == KEY_F(2)) { blink_state ^= 1; PDC_set_blink( blink_state); } else if( c == KEY_F(3)) /* toggle SLKs */ { use_slk ^= 1; if( use_slk) slk_restore( ); else slk_clear( ); } else if( c >= KEY_F(4) && c < KEY_F(12)) { sscanf( labels[c - KEY_F(1)], "%x", &fmt); if( use_slk) slk_setup( show_slk_index_line ? -fmt : fmt); } if( c != KEY_MOUSE) { sprintf( buff, "Key %s hit ", keyname( c)); mvaddstr( 0, COL1, buff); } else { MEVENT mouse_event; #ifdef __PDCURSES__ nc_getmouse( &mouse_event); #else getmouse( &mouse_event); #endif sprintf( buff, "Mouse at %d x %d: %x ", mouse_event.x, mouse_event.y, (unsigned)mouse_event.bstate); mvaddstr( 0, COL1, buff); if( mouse_event.x >= color_block_start && mouse_event.y <= 256 / color_block_size) { int new_color = (mouse_event.x - color_block_start) / 2 + mouse_event.y * color_block_size; if( new_color >= 256) new_color = -1; PDC_set_line_color( (short)new_color); } else if( mouse_event.x >= color_block_start) { if( mouse_event.y == 19) /* blink/non-blink toggle */ cursor_state_1 = (cursor_state_1 + 1) % N_CURSORS; else if( mouse_event.y == 20) /* cycle cursor state */ cursor_state_2 = (cursor_state_2 + 1) % N_CURSORS; } } } endwin(); return 0; }
/* Among other things, 'newtest' demonstrates how to make a Win32a PDCurses app that is a for-real, "pure Windows" version (instead of a console application). Doing this is quite easy, and has certain advantages. If the app is invoked from a command prompt, the only difference you'll see is that the app runs separately (that is, you can continue to use the command prompt, switching between it, your PDCurses/Win32a app, and other processes). Which is the main reason I did it; it meant that I could invoke a PDCurses-based text editor, for example, and still have use of the command line. (NOTE that, for reasons I don't actually understand, this happens when the Visual C++ compiler is used. With MinGW or OpenWatcom, it's still "really" a console app.) To do it, we ensure that the usual main() function has an alternative dummy_main() form, taking the same arguments as main(). We add a WinMain() function, whose sole purpose is to reformulate lpszCmdLine into argc/argv form, and pass it on to dummy_main(). And, of course, we can switch back to a "normal" console app by removing the above #define PURE_WINDOWS_VERSION line. */ #ifdef PURE_WINDOWS_VERSION #undef MOUSE_MOVED #include <windows.h> int dummy_main( int argc, char **argv); int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { char *argv[30]; int i, argc = 1; argv[0] = "newtest"; for( i = 0; lpszCmdLine[i]; i++) if( lpszCmdLine[i] != ' ' && (!i || lpszCmdLine[i - 1] == ' ')) argv[argc++] = lpszCmdLine + i; for( i = 0; lpszCmdLine[i]; i++) if( lpszCmdLine[i] == ' ') lpszCmdLine[i] = '\0'; return dummy_main( argc, (char **)argv); } int dummy_main( int argc, char **argv) #else /* "usual", console-app version: */ int main( int argc, char **argv) #endif { int quit = 0, i, use_slk = 1; int fmt = 0xa; bool blink_state = FALSE; int cursor_state_1 = 2, cursor_state_2 = 3; int show_slk_index_line = 0; int redraw = 1; unsigned extra_character_to_show = 0; #ifdef PDC_WIDE unsigned unicode_offset = 0x80; #endif /* setlocale(LC_ALL, ".utf8"); */ ttytype[0] = 25; ttytype[1] = 90; /* Allow 25 to 90 lines... */ ttytype[2] = 80; ttytype[3] = (char)200; /* ...and 80 to 200 columns */ /* (This program gets weird artifacts when smaller than 25x80.) */ for( i = 1; i < argc; i++) if( argv[i][0] == '-') switch( argv[i][1]) { case 's': use_slk = 0; break; case 'l': setlocale( LC_ALL, argv[i] + 2); break; case 'e': sscanf( argv[i] + 2, "%x", &extra_character_to_show); break; case 'f': sscanf( argv[i] + 2, "%x", (unsigned *)&fmt); break; case 'i': show_slk_index_line = 1; break; case 'r': /* allow user-resizable windows */ { int min_lines, max_lines, min_cols, max_cols; if( sscanf( argv[i] + 2, "%d,%d,%d,%d", &min_lines, &max_lines, &min_cols, &max_cols) == 4) { ttytype[0] = min_lines; ttytype[1] = max_lines; ttytype[2] = min_cols; ttytype[3] = max_cols; } } break; case 'd': /* set window size before initscr */ { int n_lines, n_cols; if( sscanf( argv[i] + 2, "%d,%d", &n_lines, &n_cols) == 2) resize_term( n_lines, n_cols); } break; #ifdef PDC_WIDE case 'u': sscanf( argv[i] + 2, "%x", &unicode_offset); break; #endif default: printf( "Option '%s' unrecognized\n", argv[i]); break; } if( use_slk) slk_init( show_slk_index_line ? 3 : 0); Xinitscr(argc, argv); if( use_slk) slk_setup( show_slk_index_line ? -fmt : fmt); start_color(); # if defined(NCURSES_VERSION) || (defined(PDC_BUILD) && PDC_BUILD > 3000) use_default_colors(); # endif cbreak(); noecho(); clear(); refresh(); #ifdef __PDCURSES__ PDC_set_title( "NewTest: tests various PDCurses features"); #endif keypad( stdscr, TRUE); init_pair( 1, 15, COLOR_BLACK); init_pair( 2, COLOR_BLACK, COLOR_YELLOW); mousemask( ALL_MOUSE_EVENTS, NULL); attrset( COLOR_PAIR( 1)); while( !quit) { char buff[40]; const int xmax = getmaxx( stdscr); const int ymax = getmaxy( stdscr); int color_block_start = 54, c; int color_block_cols = (xmax - color_block_start) / 2; const int color_block_lines = 19; const char *cursor_state_text[N_CURSORS] = { "Invisible (click to change) ", "Underscore (click to change)", "Block (click to change) ", "Outline (click to change) ", "Caret (click to change) ", "Half-block (click to change)", "Central (click to change) ", "Cross (click to change) ", "Heavy box (click to change) " }; if( color_block_cols < 0) color_block_cols = 0; if( redraw) { mvaddstr( 1, COL1, "'Normal' white-on-black"); #if(CHTYPE_LONG >= 2) /* "non-standard" 64-bit chtypes */ attron( A_DIM); mvaddstr( 2, COL1, "Dimmed text"); attroff( A_DIM); #endif #ifdef PDC_WIDE mvaddwstr( 3, COL1, L"'Normal' text, but wide"); #endif attron( A_BLINK); mvaddstr( 6, 40, "Blinking"); attron( A_BOLD); mvaddstr( 8, 40, "BlinkBold"); attron( A_ITALIC); mvaddstr( 0, COL2, "BlinkBoldItalic"); attrset( COLOR_PAIR( 3)); attron( A_UNDERLINE); #ifdef PDC_WIDE mvaddstr( 1, COL2, "Underlined"); addwstr( L"WideUnder"); #endif attrset( COLOR_PAIR( 1)); attron( A_UNDERLINE | A_ITALIC); mvaddstr( 2, COL2, "UnderlinedItalic"); attrset( COLOR_PAIR( 2)); attron( A_BLINK); mvaddstr( 4, COL1, "Black-on-yellow blinking"); attrset( COLOR_PAIR( 1)); move( 4, COL2); text_in_a_box( "Text in a box"); #ifdef CHTYPE_LONG attrset( COLOR_PAIR( 6)); attron( A_STRIKEOUT); mvaddstr( 10, 40, "Strikeout"); attrset( COLOR_PAIR( 1)); #endif #ifdef PDC_WIDE move( 11, 40); text_in_a_box( "Next Ucode pg"); if( unicode_offset) { move( 12, 40); text_in_a_box( "Prev Ucode pg"); } mvprintw( 13, 40, "U+%04x ", unicode_offset); #endif for( i = 0; i < 128; i++) { /* Show extended characters: */ #ifdef PDC_WIDE wchar_t buff[20]; swprintf( buff, 20, L"%02x ", (unsigned)( i + unicode_offset) & 0xff); mvaddwstr( 5 + i % 16, (i / 16) * 5, buff); if( i + unicode_offset > ' ') addch( (chtype)( i + unicode_offset)); else addch( ' '); addch( ' '); #else char buff[6]; sprintf( buff, "%02x %c", i + 128, (char)(i + 128)); mvaddstr( 5 + i % 16, (i / 16) * 5, buff); #endif } #if(CHTYPE_LONG >= 2) /* "non-standard" 64-bit chtypes */ for( i = 0; i < 3 && i + 21 < ymax; i++) { /* Demonstrate full RGB color control: */ int j; const char *output_text[3] = { "Red on green to white on black | (you can get full RGB colors when desired,", "Blue on yellow to black on red | with palette coloring still being available)", "White on red to green on blue, underlined and italic" }; const int len = (int)strlen( output_text[i]); move( 21 + i, 1); for( j = 0; j < len && j + 1 < xmax; j++) { attr_t output_color; const int oval = j * 31 / len; const int reverse = 31 - oval; if( !i) output_color = A_RGB( 31, oval, oval, 0, reverse, 0); else if( i == 1) output_color = A_RGB( 0, 0, reverse, 31, reverse, 0); else { output_color = A_RGB( reverse, 31, reverse, reverse, 0, oval); output_color |= A_UNDERLINE | A_ITALIC; } attrset( output_color); addch( output_text[i][j]); } } #endif /* #if(CHTYPE_LONG >= 2) */ redraw = 0; attrset( COLOR_PAIR( 1)); if( extra_character_to_show && ymax > 23) mvaddch( 23, 63, (chtype)extra_character_to_show); #ifdef PDC_WIDE for( i = 0; i < 6; i++) { static const wchar_t spanish[] = L"Espa\xf1ol"; const int line = 24 + i / 3; const int col = 5 + 25 * (i % 3); static const wchar_t russian[] = {0x0420, 0x0443, 0x0441, 0x0441, 0x043a, 0x0438, 0x0439, L' ', 0x044f, 0x0437, 0x044b, 0x043a, 0}; static const wchar_t greek[] = {0x0395, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac, 0}; static const wchar_t georgian[] = {0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, L' ', 0x10d4, 0x10dc, 0x10d0, 0}; static const wchar_t fullwidth[] = { 0xff26, 0xff55, 0xff4c, 0xff4c, 0xff57, 0xff49, 0xff44, 0xff54, 0xff48, 0 }; /* "Fullwidth" */ static const wchar_t combining_marks[] = { L'C', L'o', 0x35c, L'm', L'b', 0x30a, L'i', L'n', L'i', 0x304, L'n', 0x30b, 0x329, L'g', 0x310, L' ', L'C', 0x338, L'h', 0x306, L'a', 0x361, L'r', L's', 0x30e, 0x348, 0 }; static const wchar_t *texts[6] = { spanish, russian, greek, georgian, fullwidth, combining_marks}; if( line < ymax && col < xmax) mvaddnwstr( line, 5 + 25 * (i % 3), texts[i], xmax - col); } #endif #ifdef MAYBE_TRY_THIS_SOMEWHERE_ELSE mvaddstr( 1, COL3, "Click on cursor descriptions to"); mvaddstr( 2, COL3, "cycle through possible cursors"); mvaddstr( 3, COL3, "Click on colors at left to change"); mvaddstr( 4, COL3, "colors used for under/over/outlining"); mvaddstr( 5, COL3, "Click 'Blink' at bottom to toggle"); mvaddstr( 6, COL3, "'real' blinking vs. 'highlit' blink"); #endif } mvaddnstr( 19, color_block_start, cursor_state_text[cursor_state_1], xmax - color_block_start); mvaddnstr( 20, color_block_start, cursor_state_text[cursor_state_2], xmax - color_block_start); curs_set( (cursor_state_1 << 8) | cursor_state_2); for( i = 0; i < color_block_cols * color_block_lines; i++) { const int n_color_blocks = 256; attrset( COLOR_PAIR( i >= n_color_blocks ? 2 : i)); if( i > 2 && i < n_color_blocks) init_pair((short)i, (short)i, COLOR_BLACK); if( !(i % color_block_cols)) move( i / color_block_cols, color_block_start); attron( A_REVERSE); addstr( " "); } move( 19, color_block_start - 3); refresh(); c = getch( ); attrset( COLOR_PAIR( 1)); if( c == KEY_RESIZE) { redraw = 1; resize_term( 0, 0); } else if( c == KEY_F(1) || c == 27) quit = 1; else if( c == KEY_F(2)) { blink_state ^= 1; PDC_set_blink( blink_state); } else if( c == KEY_F(3)) /* toggle SLKs */ { use_slk ^= 1; if( use_slk) slk_restore( ); else slk_clear( ); } else if( c >= KEY_F(4) && c < KEY_F(12)) { sscanf( labels[c - KEY_F(1)], "%x", (unsigned *)&fmt); if( use_slk) slk_setup( show_slk_index_line ? -fmt : fmt); } // else if( c == 'w') // PDC_write_screen_to_file( "scrdump.htm", curscr); if( c != KEY_MOUSE) { sprintf( buff, "Key %s hit ", keyname( c)); mvaddstr( 0, COL1, buff); } else { MEVENT mouse_event; #ifdef __PDCURSES__ nc_getmouse( &mouse_event); #else getmouse( &mouse_event); #endif sprintf( buff, "Mouse at %d x %d: %x ", mouse_event.x, mouse_event.y, (unsigned)mouse_event.bstate); mvaddstr( 0, COL1, buff); if( mouse_event.x >= color_block_start && mouse_event.y < color_block_lines) { int new_color = (mouse_event.x - color_block_start) / 2 + mouse_event.y * color_block_cols; if( new_color >= 256) new_color = -1; PDC_set_line_color( (short)new_color); } else if( mouse_event.x >= color_block_start) { int shift = ((mouse_event.bstate & BUTTON_MODIFIER_SHIFT) ? N_CURSORS - 1 : 1); if( mouse_event.y == 19) /* blink/non-blink toggle */ cursor_state_1 = (cursor_state_1 + shift) % N_CURSORS; else if( mouse_event.y == 20) /* cycle cursor state */ cursor_state_2 = (cursor_state_2 + shift) % N_CURSORS; } #ifdef PDC_WIDE else if( mouse_event.x >= 40 && mouse_event.x < 40 + 10) { if( mouse_event.y == 11) { redraw = 1; unicode_offset += 0x80; } else if( mouse_event.y == 12 && unicode_offset) { redraw = 1; unicode_offset -= 0x80; } } #endif } } endwin(); return 0; }
int main(int argc, char **argv) { char inp[60]; int i, j, seed; seed = time((time_t *)0); srand(seed); /* Initialize SDL */ if (SDL_Init(SDL_INIT_VIDEO) < 0) exit(1); atexit(SDL_Quit); pdc_screen = SDL_SetVideoMode(640, 480, 0, SDL_SWSURFACE|SDL_ANYFORMAT); /* Initialize PDCurses */ pdc_yoffset = 416; /* 480 - 4 * 16 */ initscr(); start_color(); scrollok(stdscr, TRUE); PDC_set_title("PDCurses for SDL"); /* Do some SDL stuff */ for (i = 640, j = 416; j; i -= 2, j -= 2) { SDL_Rect dest; dest.x = (640 - i) / 2; dest.y = (416 - j) / 2; dest.w = i; dest.h = j; SDL_FillRect(pdc_screen, &dest, SDL_MapRGB(pdc_screen->format, rand() % 256, rand() % 256, rand() % 256)); } SDL_UpdateRect(pdc_screen, 0, 0, 640, 416); /* Do some curses stuff */ init_pair(1, COLOR_WHITE + 8, COLOR_BLUE); bkgd(COLOR_PAIR(1)); addstr("This is a demo of "); attron(A_UNDERLINE); addstr("PDCurses for SDL"); attroff(A_UNDERLINE); addstr(".\nYour comments here: "); getnstr(inp, 59); addstr("Press any key to exit."); getch(); endwin(); return 0; }
int PDC_scr_open(int argc, char **argv) { int i; PDC_LOG(("PDC_scr_open() - called\n")); SP = calloc(1, sizeof(SCREEN)); if (!SP) return ERR; pdc_own_screen = !pdc_screen; if (pdc_own_screen) { if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0) { fprintf(stderr, "Could not start SDL: %s\n", SDL_GetError()); return ERR; } atexit(SDL_Quit); } if (!pdc_font) { const char *fname = getenv("PDC_FONT"); pdc_font = SDL_LoadBMP(fname ? fname : "pdcfont.bmp"); } if (!pdc_font) pdc_font = SDL_LoadBMP_RW(SDL_RWFromMem(deffont, sizeof(deffont)), 0); if (!pdc_font) { fprintf(stderr, "Could not load font\n"); return ERR; } SP->mono = !pdc_font->format->palette; if (!SP->mono && !pdc_back) { const char *bname = getenv("PDC_BACKGROUND"); pdc_back = SDL_LoadBMP(bname ? bname : "pdcback.bmp"); } if (!SP->mono && (pdc_back || !pdc_own_screen)) { SP->orig_attr = TRUE; SP->orig_fore = COLOR_WHITE; SP->orig_back = -1; } else SP->orig_attr = FALSE; pdc_fheight = pdc_font->h / 8; pdc_fwidth = pdc_font->w / 32; if (!SP->mono) pdc_flastc = pdc_font->format->palette->ncolors - 1; if (pdc_own_screen && !pdc_icon) { const char *iname = getenv("PDC_ICON"); pdc_icon = SDL_LoadBMP(iname ? iname : "pdcicon.bmp"); if (!pdc_icon) pdc_icon = SDL_LoadBMP_RW(SDL_RWFromMem(deficon, sizeof(deficon)), 0); if (pdc_icon) SDL_WM_SetIcon(pdc_icon, NULL); } if (pdc_own_screen) { const char *env = getenv("PDC_LINES"); pdc_sheight = (env ? atoi(env) : 25) * pdc_fheight; env = getenv("PDC_COLS"); pdc_swidth = (env ? atoi(env) : 80) * pdc_fwidth; pdc_screen = SDL_SetVideoMode(pdc_swidth, pdc_sheight, 0, SDL_SWSURFACE|SDL_ANYFORMAT|SDL_RESIZABLE); } else { if (!pdc_sheight) pdc_sheight = pdc_screen->h - pdc_yoffset; if (!pdc_swidth) pdc_swidth = pdc_screen->w - pdc_xoffset; } if (!pdc_screen) { fprintf(stderr, "Couldn't create a surface: %s\n", SDL_GetError()); return ERR; } if (SP->orig_attr) PDC_retile(); for (i = 0; i < 8; i++) { pdc_color[i].r = (i & COLOR_RED) ? 0xc0 : 0; pdc_color[i].g = (i & COLOR_GREEN) ? 0xc0 : 0; pdc_color[i].b = (i & COLOR_BLUE) ? 0xc0 : 0; pdc_color[i + 8].r = (i & COLOR_RED) ? 0xff : 0x40; pdc_color[i + 8].g = (i & COLOR_GREEN) ? 0xff : 0x40; pdc_color[i + 8].b = (i & COLOR_BLUE) ? 0xff : 0x40; } for (i = 0; i < 16; i++) pdc_mapped[i] = SDL_MapRGB(pdc_screen->format, pdc_color[i].r, pdc_color[i].g, pdc_color[i].b); SDL_EnableUNICODE(1); PDC_mouse_set(); if (pdc_own_screen) PDC_set_title(argc ? argv[0] : "PDCurses"); SP->lines = PDC_get_rows(); SP->cols = PDC_get_columns(); SP->mouse_wait = PDC_CLICK_PERIOD; SP->audible = FALSE; PDC_reset_prog_mode(); return OK; }
int PDC_scr_open(int argc, char **argv) { PDC_LOG(("PDC_scr_open() - called\n")); SP = calloc(1, sizeof(SCREEN)); if (!SP) return ERR; pdc_own_screen = !pdc_screen; if (pdc_own_screen) { if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0) { fprintf(stderr, "Could not start SDL: %s\n", SDL_GetError()); return ERR; } atexit(_clean); } #ifdef PDC_WIDE if (!pdc_ttffont) { const char *ptsz, *fname; if (TTF_Init() == -1) { fprintf(stderr, "Could not start SDL_TTF: %s\n", SDL_GetError()); return ERR; } ptsz = getenv("PDC_FONT_SIZE"); if (ptsz != NULL) pdc_font_size = atoi(ptsz); if (pdc_font_size <= 0) pdc_font_size = 18; fname = getenv("PDC_FONT"); pdc_ttffont = TTF_OpenFont(fname ? fname : PDC_FONT_PATH, pdc_font_size); } if (!pdc_ttffont) { fprintf(stderr, "Could not load font\n"); return ERR; } TTF_SetFontKerning(pdc_ttffont, 0); TTF_SetFontHinting(pdc_ttffont, TTF_HINTING_MONO); SP->mono = FALSE; #else if (!pdc_font) { const char *fname = getenv("PDC_FONT"); pdc_font = SDL_LoadBMP(fname ? fname : "pdcfont.bmp"); } if (!pdc_font) pdc_font = SDL_LoadBMP_RW(SDL_RWFromMem(font437, sizeof(font437)), 0); if (!pdc_font) { fprintf(stderr, "Could not load font\n"); return ERR; } SP->mono = !pdc_font->format->palette; #endif if (!SP->mono && !pdc_back) { const char *bname = getenv("PDC_BACKGROUND"); pdc_back = SDL_LoadBMP(bname ? bname : "pdcback.bmp"); } if (!SP->mono && (pdc_back || !pdc_own_screen)) { SP->orig_attr = TRUE; SP->orig_fore = COLOR_WHITE; SP->orig_back = -1; } else SP->orig_attr = FALSE; #ifdef PDC_WIDE TTF_SizeText(pdc_ttffont, "W", &pdc_fwidth, &pdc_fheight); pdc_fthick = pdc_font_size / 20 + 1; #else pdc_fheight = pdc_font->h / 8; pdc_fwidth = pdc_font->w / 32; pdc_fthick = 1; if (!SP->mono) pdc_flastc = pdc_font->format->palette->ncolors - 1; #endif if (pdc_own_screen && !pdc_icon) { const char *iname = getenv("PDC_ICON"); pdc_icon = SDL_LoadBMP(iname ? iname : "pdcicon.bmp"); if (!pdc_icon) pdc_icon = SDL_LoadBMP_RW(SDL_RWFromMem(iconbmp, sizeof(iconbmp)), 0); if (pdc_icon) SDL_WM_SetIcon(pdc_icon, NULL); } if (pdc_own_screen) { const SDL_VideoInfo *info = SDL_GetVideoInfo(); max_height = info->current_h; max_width = info->current_w; const char *env = getenv("PDC_LINES"); pdc_sheight = (env ? atoi(env) : 25) * pdc_fheight; env = getenv("PDC_COLS"); pdc_swidth = (env ? atoi(env) : 80) * pdc_fwidth; pdc_screen = SDL_SetVideoMode(pdc_swidth, pdc_sheight, 0, SDL_SWSURFACE|SDL_ANYFORMAT|SDL_RESIZABLE); } else { if (!pdc_sheight) pdc_sheight = pdc_screen->h - pdc_yoffset; if (!pdc_swidth) pdc_swidth = pdc_screen->w - pdc_xoffset; } if (!pdc_screen) { fprintf(stderr, "Couldn't create a surface: %s\n", SDL_GetError()); return ERR; } if (SP->orig_attr) PDC_retile(); _initialize_colors(); SDL_EnableUNICODE(1); PDC_mouse_set(); if (pdc_own_screen) PDC_set_title(argc ? argv[0] : "PDCurses"); SP->lines = PDC_get_rows(); SP->cols = PDC_get_columns(); SP->mouse_wait = PDC_CLICK_PERIOD; SP->audible = FALSE; SP->termattrs = A_COLOR | A_UNDERLINE | A_LEFT | A_RIGHT | A_REVERSE; #ifdef PDC_WIDE SP->termattrs |= A_ITALIC; #endif PDC_reset_prog_mode(); return OK; }
void chkr_PDC_set_title(char *title) { stubs_chkr_check_str(title, CHKR_RO, "title"); PDC_set_title(title); }
/* init_nhwindows(int* argcp, char** argv) -- Initialize the windows used by NetHack. This can also create the standard windows listed at the top, but does not display them. -- Any commandline arguments relevant to the windowport should be interpreted, and *argcp and *argv should be changed to remove those arguments. -- When the message window is created, the variable iflags.window_inited needs to be set to TRUE. Otherwise all plines() will be done via raw_print(). ** Why not have init_nhwindows() create all of the "standard" ** windows? Or at least all but WIN_INFO? -dean */ void curses_init_nhwindows(int* argcp, char** argv) { #ifdef PDCURSES char window_title[BUFSZ]; #endif #ifdef XCURSES base_term = Xinitscr(*argcp, argv); #else base_term = initscr(); #endif #ifdef TEXTCOLOR if (has_colors()) { start_color(); curses_init_nhcolors(); } else { iflags.use_color = FALSE; set_option_mod_status("color", SET_IN_FILE); iflags.wc2_guicolor = FALSE; set_wc2_option_mod_status(WC2_GUICOLOR, SET_IN_FILE); } #else iflags.use_color = FALSE; set_option_mod_status("color", SET_IN_FILE); iflags.wc2_guicolor = FALSE; set_wc2_option_mod_status(WC2_GUICOLOR, SET_IN_FILE); #endif noecho(); raw(); meta(stdscr, TRUE); orig_cursor = curs_set(0); keypad(stdscr, TRUE); #ifdef NCURSES_VERSION # ifdef __APPLE__ ESCDELAY = 25; # else set_escdelay(25); # endif /* __APPLE__ */ #endif /* NCURSES_VERSION */ #ifdef PDCURSES # ifdef DEF_GAME_NAME # ifdef VERSION_STRING sprintf(window_title, "%s %s", DEF_GAME_NAME, VERSION_STRING); # else sprintf(window_title, "%s", DEF_GAME_NAME); # endif /* VERSION_STRING */ # else # ifdef VERSION_STRING sprintf(window_title, "%s %s", "NetHack", VERSION_STRING); # else sprintf(window_title, "%s", "NetHack"); # endif /* VERSION_STRING */ # endif /* DEF_GAME_NAME */ PDC_set_title(window_title); PDC_set_blink(TRUE); /* Only if the user asks for it! */ timeout(1); (void)getch(); timeout(-1); #endif /* PDCURSES */ getmaxyx(base_term, term_rows, term_cols); counting = FALSE; curses_init_options(); if ((term_rows < 15) || (term_cols < 40)) { panic("Terminal too small. Must be minumum 40 width and 15 height"); } curses_create_main_windows(); curses_init_mesg_history(); curses_display_splash_window(); }
/* * main: * The main program, of course */ int main(int argc, char **argv, char **envp) { char *env; int lowtime; md_init(); #ifdef MASTER /* * Check to see if he is a wizard */ if (argc >= 2 && argv[1][0] == '\0') if (strcmp(PASSWD, md_crypt(md_getpass("wizard's password: "******"mT")) == 0) { wizard = TRUE; player.t_flags |= SEEMONST; argv++; argc--; } #endif /* * get home and options from environment */ strncpy(home, md_gethomedir(), MAXSTR); strcpy(file_name, home); strcat(file_name, "rogue.save"); if ((env = getenv("ROGUEOPTS")) != NULL) parse_opts(env); if (env == NULL || whoami[0] == '\0') strucpy(whoami, md_getusername(), (int) strlen(md_getusername())); lowtime = (int) time(NULL); #ifdef MASTER if (wizard && getenv("SEED") != NULL) dnum = atoi(getenv("SEED")); else #endif dnum = lowtime + md_getpid(); seed = dnum; open_score(); /* * Drop setuid/setgid after opening the scoreboard file. */ md_normaluser(); /* * check for print-score option */ md_normaluser(); /* we drop any setgid/setuid priveldges here */ if (argc == 2) { if (strcmp(argv[1], "-s") == 0) { noscore = TRUE; score(0, -1, 0); exit(0); } else if (strcmp(argv[1], "-d") == 0) { dnum = rnd(100); /* throw away some rnd()s to break patterns */ while (--dnum) rnd(100); purse = rnd(100) + 1; level = rnd(100) + 1; initscr(); getltchars(); death(death_monst()); exit(0); } } init_check(); /* check for legal startup */ if (argc == 2) if (!restore(argv[1], envp)) /* Note: restore will never return */ my_exit(1); #ifdef MASTER if (wizard) printf("Hello %s, welcome to dungeon #%d", whoami, dnum); else #endif printf("Hello %s, just a moment while I dig the dungeon...", whoami); fflush(stdout); initscr(); /* Start up cursor package */ #ifdef EMSCRIPTEN PDC_set_title("Rogue.JS"); #endif init_probs(); /* Set up prob tables for objects */ init_player(); /* Set up initial player stats */ init_names(); /* Set up names of scrolls */ init_colors(); /* Set up colors of potions */ init_stones(); /* Set up stone settings of rings */ init_materials(); /* Set up materials of wands */ setup(); /* * The screen must be at least NUMLINES x NUMCOLS */ if (LINES < NUMLINES || COLS < NUMCOLS) { printf("\nSorry, the screen must be at least %dx%d\n", NUMLINES, NUMCOLS); endwin(); my_exit(1); } /* * Set up windows */ hw = newwin(LINES, COLS, 0, 0); idlok(stdscr, TRUE); idlok(hw, TRUE); #ifdef MASTER noscore = wizard; #endif new_level(); /* Draw current level */ /* * Start up daemons and fuses */ start_daemon(runners, 0, AFTER); start_daemon(doctor, 0, AFTER); fuse(swander, 0, WANDERTIME, AFTER); start_daemon(stomach, 0, AFTER); playit(); return(0); }