diff options
Diffstat (limited to 'crawl-ref/source/tilesdl.cc')
-rw-r--r-- | crawl-ref/source/tilesdl.cc | 178 |
1 files changed, 162 insertions, 16 deletions
diff --git a/crawl-ref/source/tilesdl.cc b/crawl-ref/source/tilesdl.cc index 206831be25..b768c8abf9 100644 --- a/crawl-ref/source/tilesdl.cc +++ b/crawl-ref/source/tilesdl.cc @@ -310,11 +310,6 @@ void TilesFramework::resize() glMatrixMode(GL_PROJECTION); glLoadIdentity(); - // TODO enne - need better resizing - // View size in pixels is (m_viewsc * crawl_view.viewsz) - m_viewsc.x = 32; - m_viewsc.y = 32; - // For ease, vertex positions are pixel positions. glOrtho(0, m_windowsz.x, m_windowsz.y, 0, 0, 100); } @@ -647,44 +642,177 @@ int TilesFramework::getch_ck() void TilesFramework::do_layout() { - const int map_stat_buffer = 5; + // View size in pixels is (m_viewsc * crawl_view.viewsz) + m_viewsc.x = 32; + m_viewsc.y = 32; - // TODO enne - use options + const int map_stat_buffer = 4; const int crt_width = 80; const int crt_height = 30; const int map_margin = 2; - // Size regions that we know about + crawl_view.viewsz.x = Options.view_max_width; + crawl_view.viewsz.y = Options.view_max_height; + crawl_view.msgsz.x = crt_width; + + // Initial sizes. + m_region_tile->dx = m_viewsc.x; + m_region_tile->dy = m_viewsc.y; m_region_tile->resize(crawl_view.viewsz.x, crawl_view.viewsz.y); m_region_crt->resize(crt_width, crt_height); m_region_stat->resize(crawl_view.hudsz.x, crawl_view.hudsz.y); m_region_msg->resize(crawl_view.msgsz.x, crawl_view.msgsz.y); m_region_map->resize(GXM, GYM); - + m_region_menu_inv->resize(24, 1); // Place regions for normal layer const int margin = 4; + m_region_tile->place(0, 0, margin); - m_region_msg->place(0, m_region_tile->ey, margin); + m_region_msg->place(0, m_region_tile->ey - margin, margin); + + bool message_overlay = false; + + if (m_windowsz.y < m_region_tile->dy * VIEW_MIN_HEIGHT) + { + crawl_view.viewsz.x = VIEW_MIN_WIDTH; + crawl_view.viewsz.y = VIEW_MIN_HEIGHT; + m_region_tile->place(0, 0, 0); + int factor = m_windowsz.y / crawl_view.viewsz.y; + m_viewsc.x = m_viewsc.y = std::min(32, factor); + m_region_tile->dx = m_viewsc.x; + m_region_tile->dy = m_viewsc.y; + m_region_tile->resize(crawl_view.viewsz.x, crawl_view.viewsz.y); + m_region_msg->place(0, 0, 0); + message_overlay = true; + } + else + { + // Shrink viewsz if too wide: + while (m_region_tile->wx + m_region_stat->wx > m_windowsz.x + && crawl_view.viewsz.x > VIEW_MIN_WIDTH) + { + crawl_view.viewsz.x -= 2; + m_region_tile->mx = crawl_view.viewsz.x; + m_region_tile->place(0, 0, margin); + m_region_msg->place(0, m_region_tile->ex, margin); + } + + // Shrink viewsz if too tall: + while (m_region_tile->wy + m_region_msg->wy > m_windowsz.y + && crawl_view.viewsz.y > VIEW_MIN_HEIGHT) + { + crawl_view.viewsz.y -= 2; + m_region_tile->my = crawl_view.viewsz.y; + m_region_tile->place(0, 0, margin); + m_region_msg->place(0, m_region_tile->ey, margin); + } - int stat_col = m_region_tile->ex + map_stat_buffer; + // Shrink msgsz if too tall: + while (m_region_tile->wy + m_region_msg->wy > m_windowsz.y + && crawl_view.msgsz.y > MSG_MIN_HEIGHT) + { + m_region_msg->resize(m_region_msg->mx, --crawl_view.msgsz.y); + } - m_region_stat->place(stat_col, 0, 0); + if (m_region_tile->wy + m_region_msg->wy > m_windowsz.y) + { + m_region_tile->place(0, 0, 0); + m_region_msg->place(0, 0, 0); + message_overlay = true; + } + } + + if (message_overlay) + { + m_region_msg->resize_to_fit(m_region_tile->ex, m_region_msg->ey); + crawl_view.msgsz.x = m_region_msg->mx; + crawl_view.msgsz.y = m_region_msg->my; + } + else + { + m_region_msg->resize_to_fit(m_region_msg->wx, + m_windowsz.y - m_region_msg->sx); + int msg_y = std::min(Options.msg_max_height, (int)m_region_msg->my); + m_region_msg->resize(m_region_msg->mx, msg_y); + } + m_region_msg->set_overlay(message_overlay); + + // Shrink view width if stat window can't fit... + int stat_col; + crawl_view.viewsz.x += 2; + do + { + crawl_view.viewsz.x -= 2; + m_region_tile->mx = crawl_view.viewsz.x; + m_region_tile->place(0, 0, margin); + + stat_col = m_region_tile->ex + map_stat_buffer; + m_region_stat->place(stat_col, 0, 0); + m_region_stat->resize_to_fit(m_windowsz.x - m_region_stat->sx, + m_region_stat->wy); + } + while (m_region_stat->ex > m_windowsz.x + && crawl_view.viewsz.x > VIEW_MIN_WIDTH); + + int hud_width = std::min(50, (int)m_region_stat->mx); + m_region_stat->resize(hud_width, m_region_stat->my); + crawl_view.hudsz.x = m_region_stat->mx; + crawl_view.hudsz.y = m_region_stat->my; + + // Resize map to fit the screen + m_region_map->dx = m_region_map->dy = Options.tile_map_pixels; m_region_map->place(stat_col, m_region_stat->ey, map_margin); + while (m_region_map->ex > m_windowsz.x) + { + m_region_map->dx--; + m_region_map->dy--; + m_region_map->resize(GXM, GYM); + } int inv_col = std::max(m_region_tile->ex, m_region_msg->ex); + if (message_overlay) + inv_col = stat_col; m_region_self_inv->place(inv_col, m_region_map->ey, 0); m_region_self_inv->resize_to_fit(m_windowsz.x - - m_region_self_inv->sx, - m_windowsz.y - - m_region_self_inv->sy); + m_region_self_inv->sx, + m_windowsz.y - + m_region_self_inv->sy); + m_region_self_inv->resize(std::min(13, (int)m_region_self_inv->mx), + std::min(6, (int)m_region_self_inv->my)); + + int self_inv_y = m_windowsz.y - m_region_self_inv->wy - margin; + m_region_self_inv->place(inv_col, self_inv_y, 0); + + // recenter map above inventory + int map_cen_x = m_region_self_inv->sx + (m_region_self_inv->wx) / 2; + m_region_map->place(map_cen_x - m_region_map->wy / 2, m_region_map->sy, + map_margin); // Place regions for crt layer m_region_crt->place(0, 0, margin); + + while (m_region_crt->ey + m_region_menu_inv->wy > m_windowsz.y) + { + m_region_crt->resize(m_region_crt->mx, m_region_crt->my - 1); + } + while (m_region_crt->ex > m_windowsz.x) + { + m_region_crt->resize(m_region_crt->mx - 1, m_region_crt->my); + } + m_region_menu_inv->place(0, m_region_crt->ey, margin); m_region_menu_inv->resize_to_fit(m_windowsz.x, m_windowsz.y - - m_region_menu_inv->sy); + m_region_menu_inv->sy); + + // Depending on the font, the menu inventory may hold fewer items + // than the crt menu can display. Decrease the lines if necessary. + const int ex = 3; + if (m_region_crt->my - ex > m_region_menu_inv->mx) + m_region_crt->resize(m_region_crt->mx, m_region_menu_inv->mx + ex); + + crawl_view.init_view(); } void TilesFramework::clrscr() @@ -723,6 +851,18 @@ void TilesFramework::clear_message_window() m_active_layer = LAYER_NORMAL; } +int TilesFramework::get_number_of_lines() +{ + return m_region_crt->my; +} + +int TilesFramework::get_number_of_cols() +{ + // TODO enne - do we need to differentiate the number of columns + // in the message window and the number of columns on the CRT? + return m_region_crt->mx; +} + void TilesFramework::cgotoxy(int x, int y, int region) { if (region == GOTO_LAST) @@ -884,6 +1024,12 @@ void TilesFramework::update_inventory() // TODO enne - if all inventory and ground can't fit, allow ground // and inventory items on the same row. + // TODO enne - if inventory fills up all squares, add up to one row + // of ground, depending. + + // TODO enne - only fill up 52 squares of inventory, then start + // showing floor. + // item.base_type <-> char conversion table const static char *obj_syms = ")([/%#?=!#+\\0}x"; |