/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "ultima/shared/std/string.h" #include "ultima/nuvie/core/nuvie_defs.h" #include "ultima/nuvie/conf/configuration.h" #include "ultima/nuvie/misc/u6_misc.h" #include "ultima/nuvie/fonts/font_manager.h" #include "ultima/nuvie/fonts/font.h" #include "ultima/nuvie/screen/game_palette.h" #include "ultima/nuvie/gui/gui.h" #include "ultima/nuvie/misc/sdl_compat.h" #include "ultima/nuvie/gui/widgets/msg_scroll.h" #include "ultima/nuvie/portraits/portrait.h" #include "ultima/nuvie/core/player.h" #include "ultima/nuvie/gui/widgets/converse_gump_wou.h" #include "ultima/nuvie/actors/actor_manager.h" #include "ultima/nuvie/keybinding/keys.h" #include "ultima/nuvie/gui/widgets/map_window.h" #include "ultima/nuvie/gui/widgets/background.h" #include "ultima/nuvie/files/u6_shape.h" #include "ultima/nuvie/files/nuvie_bmp_file.h" #include "ultima/nuvie/views/view_manager.h" #include "ultima/nuvie/views/md_sky_strip_widget.h" namespace Ultima { namespace Nuvie { #define INPUT_FONT_COLOR 1 // ConverseGumpWOU Class ConverseGumpWOU::ConverseGumpWOU(const Configuration *cfg, Font *f, Screen *s) : found_break_char(false), frame_h(0), frame_w(0), min_w(0) { // uint16 x, y; init(cfg, f); Game *game = Game::get_game(); game_type = game->get_game_type(); //scroll_width = 20; //scroll_height = 18; set_scroll_dimensions(18, 18); Std::string height_str; uint16 x_off = game->get_game_x_offset(); uint16 y_off = game->get_game_y_offset(); if (game_type == NUVIE_GAME_U6) { GUI_Widget::Init(nullptr, x_off + 8, y_off + 8, 160, 160); bg_color = converse_bg_color = 0x31; //17; if (game->get_game_width() >= 335) { Common::Path imagefile; Common::Path datadir = GUI::get_gui()->get_data_dir(); build_path(datadir, "U6_WOU_Scroll_bg.bmp", imagefile); NuvieBmpFile bmp; bg_image = bmp.getSdlSurface32(imagefile); } else bg_image = nullptr; } else { //MD and SE bg_image = nullptr; GUI_Widget::Init(nullptr, x_off + 8, y_off + 16, 160, 144); bg_color = converse_bg_color = Game::get_game()->get_palette()->get_bg_color(); } left_margin = 8; add_new_line(); //DEBUG(0, LEVEL_DEBUGGING, "\nMin w = %d\n", frame_w + 12 + 210); } ConverseGumpWOU::~ConverseGumpWOU() { if (bg_image) delete bg_image; } void ConverseGumpWOU::set_talking(bool state, Actor *actor) { if (state) { found_break_char = true; clear_scroll(); Show(); if (Game::get_game()->get_view_manager()->get_mdSkyWidget() && Game::get_game()->is_original_plus()) Game::get_game()->get_view_manager()->get_mdSkyWidget()->Show(); } else { if (talking) { MsgScroll::display_string("\nPress any key...*", MSGSCROLL_NO_MAP_DISPLAY); } else { if (Game::get_game()->get_view_manager()->get_mdSkyWidget() && Game::get_game()->is_original_plus()) Game::get_game()->get_view_manager()->get_mdSkyWidget()->Hide(); } } MsgScroll::set_talking(state); } void ConverseGumpWOU::process_page_break() { page_break = false; just_finished_page_break = true; if (!input_mode) Game::get_game()->get_gui()->unlock_input(); if (!input_mode) { //clear_scroll(); process_holding_buffer(); // Process any text in the holding buffer. } } void ConverseGumpWOU::display_converse_prompt() { MsgScroll::display_string("\nyou say:", INPUT_FONT_COLOR, MSGSCROLL_NO_MAP_DISPLAY); } void ConverseGumpWOU::display_bg() { Game *game = Game::get_game(); U6Shape *background = game->get_background()->get_bg_shape(); unsigned char *ptr = background->get_data(); uint16 bg_w = game->get_background()->get_bg_w(); uint16 x_off = game->get_game_x_offset(); uint16 y_off = game->get_game_y_offset(); uint16 game_w = game->get_game_width(); if (game_type == NUVIE_GAME_U6) { if (game_w >= 335) { // get right size Common::Rect dst; dst.left = x_off; dst.top = y_off; dst.setWidth(176); dst.setHeight(176); SDL_BlitSurface(bg_image, nullptr, game->get_screen()->get_sdl_surface(), &dst); screen->update(x_off, y_off, 176, 176); } else { screen->blit(x_off, y_off, ptr, 8, 171, 200, bg_w, true); // main bg if (game_w > 323) { // add filler to the right ptr += 5; screen->blit(x_off + 171, y_off, ptr, 8, game_w - 323, 200, bg_w, true); screen->fill(game->get_palette()->get_bg_color(), x_off + 171, y_off + 8, game_w - 323, 184); // ovewrite center screen->update(x_off, y_off, 171 + game_w - 323, 200); } else screen->update(x_off, y_off, 171, 200); } } else if (game_type == NUVIE_GAME_SE) { ptr += bg_w + 1; screen->fill(0, x_off + 172, y_off, 4, 1); // upper right corner screen->blit(x_off + 1, y_off + 1, ptr, 8, 176, 173, bg_w, true); // main bg // FIXME: will need to add time strip to top once it is coded screen->update(x_off + 1, y_off, 177, 174); } else { // MD screen->fill(0, x_off, y_off, 176, 164); // background has transparent parts that should be black - also adding border to bottom if (game_w == 321) screen->fill(4, x_off + 176, y_off, 1, 1); // overwrite black pixel on top that looks bad else if (game_w > 321) // add right border screen->fill(0, x_off + 176, y_off, 1, 164); screen->blit(x_off, y_off, ptr, 8, 176, 163, bg_w, true); // main bg if (game->get_view_manager()->get_mdSkyWidget()) game->get_view_manager()->get_mdSkyWidget()->Display(true); screen->update(x_off, y_off, 177, 164); } } void ConverseGumpWOU::Display(bool full_redraw) { if (Game::get_game()->is_original_plus()) display_bg(); // do first so that the text will be displayed on top MsgScroll::Display(true); if (game_type == NUVIE_GAME_U6) { Game::get_game()->get_map_window()->drawBorder(); screen->update(area.left, area.top, area.width(), area.height()); } } } // End of namespace Nuvie } // End of namespace Ultima