/* * File: libgui.cc * Summary: Functions that any display port needs to implement. * Needed by makefile_tiles.mgw and makefile_tiles.unix. * Written by: M.Itakura */ #include "AppHdr.h" #ifdef USE_TILE #include #include #include #include "cio.h" #include "defines.h" #include "env.h" #include "externs.h" #include "tilereg.h" #include "message.h" #include "stash.h" #include "state.h" #include "stuff.h" #include "terrain.h" #include "tiles.h" #include "tilesdl.h" #include "tiledef-main.h" #include "travel.h" #include "viewgeom.h" #include #include "tilesdl.h" int tile_idx_unseen_terrain(int x, int y, int what) { const coord_def gc(x,y); dungeon_feature_type feature = grd(gc); unsigned int t = tileidx_feature(feature, gc.x, gc.y); if (t == TILE_ERROR || what == ' ') { unsigned int fg_dummy; tileidx_unseen(fg_dummy, t, what, gc); } t |= tile_unseen_flag(gc); return t; } int m_getch() { return getch(); } void set_mouse_enabled(bool enabled) { crawl_state.mouse_enabled = enabled; } void gui_init_view_params(crawl_view_geometry &geom) { // The tile version handles its own layout on a pixel-by-pixel basis. // Pretend that all of the regions start at character location (1,1). geom.termp.x = 1; geom.termp.y = 1; geom.viewp.x = 1; geom.viewp.y = 1; geom.hudp.x = 1; geom.hudp.y = 1; geom.msgp.x = 1; geom.msgp.y = 1; geom.mlistp.x = 1; geom.mlistp.y = 1; geom.mlistsz.x = 0; geom.mlistsz.y = 0; geom.viewsz.x = 17; geom.viewsz.y = 17; } int putch(unsigned char chr) { // object's method TextRegion::text_mode->putch(chr); return 0; } int putwch(unsigned chr) { // No unicode support. putch(static_cast(chr)); return 0; } void writeWChar(unsigned char *ch) { // object's method TextRegion::text_mode->writeWChar(ch); } void clear_to_end_of_line() { // object's method TextRegion::text_mode->clear_to_end_of_line(); } void get_input_line_gui(char *const buff, int len) { int y, x; int k = 0; int prev = 0; int done = 0; int kin; TextRegion *r = TextRegion::text_mode; static char last[128]; static int lastk = 0; // Locate the cursor. x = wherex(); y = wherey(); // Paranoia -- check len. if (len < 1) len = 1; /* Restrict the length */ if (x + len > (int)r->mx) len = r->mx - x; if (len > 40) len = 40; // Paranoia -- Clip the default entry. buff[len] = '\0'; buff[0] = '\0'; r->cgotoxy(x, y); putch('_'); // Process input. while (!done) { // Get a key. kin = getch_ck(); // Analyze the key. switch (kin) { case 0x1B: k = 0; done = true; break; case '\n': case '\r': k = strlen(buff); done = true; lastk = k; strncpy(last, buff, k); break; case CK_UP: // history if (lastk != 0) { k = lastk; strncpy(buff, last, k); } break; case 0x7F: case '\010': k = prev; break; // Escape conversion. (for ^H, etc.) case CONTROL('V'): kin = getch(); // fallthrough default: if (k < len && (isprint(kin) || (kin >= CONTROL('A') && kin <= CONTROL('Z')) || (kin >= 0x80 && kin <= 0xff))) { buff[k++] = kin; } break; } // Terminate. buff[k] = '\0'; // Update the entry. r->cgotoxy(x, y); int i; //addstr(buff); for (i = 0; i < k; i++) { prev = i; int c = (unsigned char)buff[i]; if (c >= 0x80) { if (buff[i+1] == 0) break; writeWChar((unsigned char *)&buff[i]); i++; } else if (c >= CONTROL('A') && c <= CONTROL('Z')) { putch('^'); putch(c + 'A' - 1); } else putch(c); } r->addstr((char *)"_ "); r->cgotoxy(x+k, y); } // while (!done) } int cprintf(const char *format,...) { char buffer[2048]; // One full screen if no control seq... va_list argp; va_start(argp, format); vsprintf(buffer, format, argp); va_end(argp); // object's method TextRegion::text_mode->addstr(buffer); return 0; } void textcolor(int color) { TextRegion::textcolor(color); } void textbackground(int bg) { TextRegion::textbackground(bg); } void set_cursor_enabled(bool enabled) { if (enabled) TextRegion::_setcursortype(1); else TextRegion::_setcursortype(0); } bool is_cursor_enabled() { if (TextRegion::cursor_flag) return (true); return (false); } int wherex() { return TextRegion::wherex(); } int wherey() { return TextRegion::wherey(); } int get_number_of_lines() { return tiles.get_number_of_lines(); } int get_number_of_cols() { return tiles.get_number_of_cols(); } void put_colour_ch(int colour, unsigned ch) { textcolor(colour); putwch(ch); } int window(int x1, int y1, int x2, int y2) { return 0; } int getch_ck() { return (tiles.getch_ck()); } int getch() { return getch_ck(); } int clrscr() { tiles.clrscr(); return 0; } void message_out(int *which_line, int colour, const char *s, int firstcol) { tiles.message_out(which_line, colour, s, firstcol); } void cgotoxy(int x, int y, GotoRegion region) { tiles.cgotoxy(x, y, region); } GotoRegion get_cursor_region() { return (tiles.get_cursor_region()); } void clear_message_window() { tiles.clear_message_window(); } void delay(int ms) { tiles.redraw(); SDL_Delay(ms); } void update_screen() { tiles.set_need_redraw(); } int kbhit() { // Look for the presence of any keyboard events in the queue. SDL_Event store; SDL_PumpEvents(); int count = SDL_PeepEvents(&store, 1, SDL_PEEKEVENT, SDL_EVENTMASK(SDL_KEYDOWN)); // SDL Error? ASSERT(count != -1); return (count == 1 ? 1 : 0); } #ifdef UNIX int itoa(int value, char *strptr, int radix) { unsigned int bitmask = 32768; int ctr = 0; int startflag = 0; if (radix == 10) { sprintf(strptr, "%i", value); } else if (radix == 2) /* int to "binary string" */ { while (bitmask) { if (value & bitmask) { startflag = 1; sprintf(strptr + ctr, "1"); } else if (startflag) { sprintf(strptr + ctr, "0"); } bitmask = bitmask >> 1; if (startflag) ctr++; } if (!startflag) /* Special case if value == 0 */ sprintf((strptr + ctr++), "0"); strptr[ctr] = (char) NULL; } return (0); /* Me? Fail? Nah. */ } // Convert string to lowercase. char *strlwr(char *str) { unsigned int i; for (i = 0; i < strlen(str); i++) str[i] = tolower(str[i]); return (str); } #endif // #ifdef UNIX #endif // #ifdef USE_TILE