/** * Animates a teleportation between hexes. * * @param a The starting hex. * @param b The ending hex. * @param temp_unit The unit to animate (historically, a temporary unit). * @param disp The game display. Assumed neither locked nor faked. */ static void teleport_unit_between(const map_location& a, const map_location& b, unit& temp_unit, display& disp) { if ( disp.fogged(a) && disp.fogged(b) ) { return; } temp_unit.set_location(a); if ( !disp.fogged(a) ) { // teleport disp.invalidate(a); temp_unit.set_facing(a.get_relative_dir(b)); disp.scroll_to_tiles(a, b, game_display::ONSCREEN, true, 0.0, false); unit_animator animator; animator.add_animation(&temp_unit,"pre_teleport",a); animator.start_animations(); animator.wait_for_end(); } temp_unit.set_location(b); if ( !disp.fogged(b) ) { // teleport disp.invalidate(b); temp_unit.set_facing(a.get_relative_dir(b)); disp.scroll_to_tiles(b, a, game_display::ONSCREEN, true, 0.0, false); unit_animator animator; animator.add_animation(&temp_unit,"post_teleport",b); animator.start_animations(); animator.wait_for_end(); } temp_unit.anim_comp().set_standing(); disp.update_display(); events::pump(); }
void default_map_generator::user_config(display& disp) { const resize_lock prevent_resizing; const events::event_context dialog_events_context; CVideo& screen = disp.video(); const int width = 600; const int height = 400; const int xpos = screen.getx()/2 - width/2; int ypos = screen.gety()/2 - height/2; gui::button close_button(screen,_("Close")); std::vector<gui::button*> buttons(1,&close_button); gui::dialog_frame f(screen,_("Map Generator"),gui::dialog_frame::default_style,true,&buttons); f.layout(xpos,ypos,width,height); f.draw(); SDL_Rect dialog_rect = sdl::create_rect(xpos, ypos, width, height); surface_restorer dialog_restorer(&screen,dialog_rect); const std::string& players_label = _("Players:"); const std::string& width_label = _("Width:"); const std::string& height_label = _("Height:"); const std::string& iterations_label = _("Number of hills:"); const std::string& hillsize_label = _("Max hill size:"); const std::string& villages_label = _("Villages:"); const std::string& castlesize_label = _("Castle size:"); const std::string& landform_label = _("Landform:"); SDL_Rect players_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,players_label,0,0); SDL_Rect width_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,width_label,0,0); SDL_Rect height_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,height_label,0,0); SDL_Rect iterations_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,iterations_label,0,0); SDL_Rect hillsize_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,hillsize_label,0,0); SDL_Rect villages_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_label,0,0); SDL_Rect castlesize_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,castlesize_label,0,0); SDL_Rect landform_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_label,0,0); const int horz_margin = 15; const int text_right = xpos + horz_margin + std::max<int>(std::max<int>(std::max<int>(std::max<int>(std::max<int>(std::max<int>( players_rect.w,width_rect.w),height_rect.w),iterations_rect.w),hillsize_rect.w),villages_rect.w),castlesize_rect.w); players_rect.x = text_right - players_rect.w; width_rect.x = text_right - width_rect.w; height_rect.x = text_right - height_rect.w; iterations_rect.x = text_right - iterations_rect.w; hillsize_rect.x = text_right - hillsize_rect.w; villages_rect.x = text_right - villages_rect.w; castlesize_rect.x = text_right - castlesize_rect.w; landform_rect.x = text_right - landform_rect.w; const int vertical_margin = 20; players_rect.y = ypos + vertical_margin*2; width_rect.y = players_rect.y + players_rect.h + vertical_margin; height_rect.y = width_rect.y + width_rect.h + vertical_margin; iterations_rect.y = height_rect.y + height_rect.h + vertical_margin; hillsize_rect.y = iterations_rect.y + iterations_rect.h + vertical_margin; villages_rect.y = hillsize_rect.y + hillsize_rect.h + vertical_margin; castlesize_rect.y = villages_rect.y + iterations_rect.h + vertical_margin; landform_rect.y = castlesize_rect.y + villages_rect.h + vertical_margin; const int right_space = 150; const int slider_left = text_right + 10; const int slider_right = xpos + width - horz_margin - right_space; SDL_Rect slider_rect = sdl::create_rect(slider_left , players_rect.y , slider_right - slider_left , players_rect.h); gui::slider players_slider(screen); players_slider.set_location(slider_rect); players_slider.set_min(2); players_slider.set_max(gamemap::MAX_PLAYERS); players_slider.set_value(nplayers_); const int min_width = 20; const int max_width = 100; const int max_height = 100; const int extra_size_per_player = 2; slider_rect.y = width_rect.y; gui::slider width_slider(screen); width_slider.set_location(slider_rect); width_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player); width_slider.set_max(max_width); width_slider.set_value(width_); slider_rect.y = height_rect.y; gui::slider height_slider(screen); height_slider.set_location(slider_rect); height_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player); height_slider.set_max(max_height); height_slider.set_value(height_); const int min_iterations = 10; const int max_iterations = 3000; slider_rect.y = iterations_rect.y; gui::slider iterations_slider(screen); iterations_slider.set_location(slider_rect); iterations_slider.set_min(min_iterations); iterations_slider.set_max(max_iterations); iterations_slider.set_value(iterations_); const int min_hillsize = 1; const int max_hillsize = 50; slider_rect.y = hillsize_rect.y; gui::slider hillsize_slider(screen); hillsize_slider.set_location(slider_rect); hillsize_slider.set_min(min_hillsize); hillsize_slider.set_max(max_hillsize); hillsize_slider.set_value(hill_size_); const int min_villages = 0; const int max_villages = 50; slider_rect.y = villages_rect.y; gui::slider villages_slider(screen); villages_slider.set_location(slider_rect); villages_slider.set_min(min_villages); villages_slider.set_max(max_villages); villages_slider.set_value(nvillages_); const int min_castlesize = 2; const int max_castlesize = 14; slider_rect.y = castlesize_rect.y; gui::slider castlesize_slider(screen); castlesize_slider.set_location(slider_rect); castlesize_slider.set_min(min_castlesize); castlesize_slider.set_max(max_castlesize); castlesize_slider.set_value(castle_size_); const int min_landform = 0; const int max_landform = int(max_island); slider_rect.y = landform_rect.y; gui::slider landform_slider(screen); landform_slider.set_location(slider_rect); landform_slider.set_min(min_landform); landform_slider.set_max(max_landform); landform_slider.set_value(island_size_); SDL_Rect link_rect = slider_rect; link_rect.y = link_rect.y + link_rect.h + vertical_margin; gui::button link_castles(screen,_("Roads between castles"),gui::button::TYPE_CHECK); link_castles.set_check(link_castles_); link_castles.set_location(link_rect); SDL_Rect labels_rect = link_rect; labels_rect.y = labels_rect.y + labels_rect.h + vertical_margin; gui::button show_labels(screen,_("Show labels"),gui::button::TYPE_CHECK); show_labels.set_check(show_labels_); show_labels.set_location(labels_rect); while(true) { nplayers_ = players_slider.value(); width_ = width_slider.value(); height_ = height_slider.value(); iterations_ = iterations_slider.value(); hill_size_ = hillsize_slider.value(); nvillages_ = villages_slider.value(); castle_size_ = castlesize_slider.value(); island_size_ = landform_slider.value(); dialog_restorer.restore(); close_button.set_dirty(true); if (close_button.pressed()) break; players_slider.set_dirty(); width_slider.set_dirty(); height_slider.set_dirty(); iterations_slider.set_dirty(); hillsize_slider.set_dirty(); villages_slider.set_dirty(); castlesize_slider.set_dirty(); landform_slider.set_dirty(); link_castles.set_dirty(); show_labels.set_dirty(); width_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player); height_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player); events::raise_process_event(); events::raise_draw_event(); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,players_label,players_rect.x,players_rect.y); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,width_label,width_rect.x,width_rect.y); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,height_label,height_rect.x,height_rect.y); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,iterations_label,iterations_rect.x,iterations_rect.y); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,hillsize_label,hillsize_rect.x,hillsize_rect.y); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_label,villages_rect.x,villages_rect.y); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,castlesize_label,castlesize_rect.x,castlesize_rect.y); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_label,landform_rect.x,landform_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, font::NORMAL_COLOR, str_cast(nplayers_), slider_right + horz_margin, players_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, font::NORMAL_COLOR, str_cast(width_), slider_right + horz_margin, width_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, font::NORMAL_COLOR, str_cast(height_), slider_right+horz_margin,height_rect.y); std::stringstream villages_str; villages_str << nvillages_ << _("/1000 tiles"); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_str.str(), slider_right+horz_margin,villages_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, font::NORMAL_COLOR, str_cast(castle_size_), slider_right + horz_margin, castlesize_rect.y); std::stringstream landform_str; landform_str << gettext(island_size_ == 0 ? N_("Inland") : (island_size_ < max_coastal ? N_("Coastal") : N_("Island"))); font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_str.str(), slider_right+horz_margin,landform_rect.y); update_rect(xpos,ypos,width,height); disp.update_display(); disp.delay(100); events::pump(); } link_castles_ = link_castles.checked(); show_labels_ = show_labels.checked(); }
void show_hotkeys_dialog (display & disp, config *save_config) { log_scope ("show_hotkeys_dialog"); const events::event_context dialog_events_context; const int centerx = disp.w()/2; const int centery = disp.h()/2; const int width = 700; const int height = disp.video().gety() < 600 ? 380 : 500; const int xpos = centerx - width/2; const int ypos = centery - height/2; gui::button close_button (disp.video(), _("Close")); std::vector<gui::button*> buttons; buttons.push_back(&close_button); gui::dialog_frame f(disp.video(),_("Hotkey Settings"),gui::dialog_frame::default_style,true,&buttons); f.layout(xpos,ypos,width,height); f.draw(); SDL_Rect clip_rect = create_rect(0, 0, disp.w (), disp.h ()); SDL_Rect text_size = font::draw_text(NULL, clip_rect, font::SIZE_LARGE, font::NORMAL_COLOR,_("Press desired hotkey (Esc cancels)"), 0, 0); std::vector<std::string> menu_items; std::vector<hotkey::hotkey_item>& hotkeys = hotkey::get_hotkeys(); for(std::vector<hotkey::hotkey_item>::iterator i = hotkeys.begin(); i != hotkeys.end(); ++i) { if(i->hidden() || !i->is_in_active_scope()) continue; std::stringstream str,name; name << i->get_description(); str << name.str(); str << COLUMN_SEPARATOR; // This trick allows to display chars identical to markup characters str << font::NULL_MARKUP << i->get_name(); menu_items.push_back(str.str()); } std::ostringstream heading; heading << HEADING_PREFIX << _("Action") << COLUMN_SEPARATOR << _("Binding"); menu_items.push_back(heading.str()); gui::menu::basic_sorter sorter; sorter.set_alpha_sort(0).set_alpha_sort(1); gui::menu menu_(disp.video(), menu_items, false, height - font::relative_size(10), -1, &sorter, &gui::menu::bluebg_style); menu_.sort_by(0); menu_.reset_selection(); menu_.set_width(font::relative_size(500)); menu_.set_location(xpos + font::relative_size(10), ypos + font::relative_size(10)); gui::button change_button (disp.video(), _("Change Hotkey")); change_button.set_location(xpos + width - change_button.width () - font::relative_size(30),ypos + font::relative_size(30)); gui::button clear_button (disp.video(), _("Clear Hotkey")); clear_button.set_location(xpos + width - clear_button.width () - font::relative_size(30),ypos + font::relative_size(80)); // gui::button save_button (disp.video(), _("Save Hotkeys")); // save_button.set_location(xpos + width - save_button.width () - font::relative_size(30),ypos + font::relative_size(130)); escape_handler esc_hand; for(;;) { if (close_button.pressed() || esc_hand.escape_pressed()) { if (save_config == NULL) { save_hotkeys(); } else { hotkey::save_hotkeys(*save_config); } break; } if (change_button.pressed () || menu_.double_clicked()) { // Lets change this hotkey...... SDL_Rect dlgr = create_rect(centerx - text_size.w / 2 - 30 , centery - text_size.h / 2 - 16 , text_size.w + 60 , text_size.h + 32); surface_restorer restorer(&disp.video(),dlgr); gui::dialog_frame mini_frame(disp.video()); mini_frame.layout(centerx-text_size.w/2 - 20, centery-text_size.h/2 - 6, text_size.w+40, text_size.h+12); mini_frame.draw_background(); mini_frame.draw_border(); font::draw_text (&disp.video(), clip_rect, font::SIZE_LARGE,font::NORMAL_COLOR, _("Press desired hotkey (Esc cancels)"),centerx-text_size.w/2, centery-text_size.h/2); disp.update_display(); SDL_Event event; event.type = 0; int character = 0, keycode = 0, mod = 0; // Just to avoid warning int joystick = 0, button = 0, hat = 0, value = 0; const int any_mod = KMOD_CTRL | KMOD_ALT | KMOD_LMETA; while (event.type!=SDL_KEYDOWN && event.type!=SDL_JOYBUTTONDOWN && event.type!= SDL_JOYHATMOTION) SDL_PollEvent(&event); do { if (event.type==SDL_KEYDOWN) { keycode=event.key.keysym.sym; character=event.key.keysym.unicode; mod=event.key.keysym.mod; }; if (event.type==SDL_JOYBUTTONDOWN) { joystick = event.jbutton.which; button = event.jbutton.button; } if (event.type==SDL_JOYHATMOTION) { joystick = event.jhat.which; hat = event.jhat.hat; value = event.jhat.value; } SDL_PollEvent(&event); disp.flip(); disp.delay(10); } while (event.type!=SDL_KEYUP && event.type!=SDL_JOYBUTTONUP && event.type!=SDL_JOYHATMOTION); restorer.restore(); disp.update_display(); if (keycode == SDLK_ESCAPE && (mod & any_mod) == 0) { //cancel -- no action } else { const hotkey::hotkey_item& oldhk = hotkey::get_hotkey(character, keycode, (mod & KMOD_SHIFT) != 0, (mod & KMOD_CTRL) != 0, (mod & KMOD_ALT) != 0, (mod & KMOD_LMETA) != 0); hotkey::hotkey_item& newhk = hotkey::get_visible_hotkey(menu_.selection()); if(oldhk.get_id() != newhk.get_id() && !oldhk.null()) { std::stringstream msg; msg << " " << oldhk.get_description() << " : " << oldhk.get_name(); gui2::show_transient_message(disp.video(),_("This hotkey is already in use."),msg.str()); } else { if (event.type == SDL_JOYHATMOTION) { const hotkey::hotkey_item& oldhkhat = hotkey::get_hotkey(joystick, hat, value); if(oldhkhat.get_id() != newhk.get_id() && !oldhkhat.null()) { std::stringstream msg; msg << " " << oldhkhat.get_description() << " : " << oldhkhat.get_name(); gui2::show_transient_message(disp.video(),_("This hotkey is already in use."),msg.str()); } else { newhk.set_hat(joystick, hat, value); menu_.change_item(menu_.selection(), 1, font::NULL_MARKUP + newhk.get_name()); } } else if (event.type == SDL_JOYBUTTONUP) { const hotkey::hotkey_item& oldhkbtn = hotkey::get_hotkey(button, joystick); if(oldhkbtn.get_id() != newhk.get_id() && !oldhkbtn.null()) { std::stringstream msg; msg << " " << oldhkbtn.get_description() << " : " << oldhkbtn.get_name(); gui2::show_transient_message(disp.video(),_("This hotkey is already in use."),msg.str()); } else { newhk.set_button(button, joystick); menu_.change_item(menu_.selection(), 1, font::NULL_MARKUP + newhk.get_name()); } } else { newhk.set_key(character, keycode, (mod & KMOD_SHIFT) != 0, (mod & KMOD_CTRL) != 0, (mod & KMOD_ALT) != 0, (mod & KMOD_LMETA) != 0); menu_.change_item(menu_.selection(), 1, font::NULL_MARKUP + newhk.get_name()); if ((newhk.get_id() == hotkey::HOTKEY_SCREENSHOT || newhk.get_id() == hotkey::HOTKEY_MAP_SCREENSHOT) && (mod & any_mod) == 0) { gui2::show_transient_message(disp.video(), _("Warning"), _("Screenshot hotkeys should be combined with the Control, Alt or Meta modifiers to avoid problems.")); } } } } } // if (save_button.pressed()) { // if (save_config == NULL) { // save_hotkeys(); // } else { // hotkey::save_hotkeys(*save_config); // } // } if (clear_button.pressed()) { // clear hotkey hotkey::hotkey_item& newhk = hotkey::get_visible_hotkey(menu_.selection()); newhk.clear_hotkey(); menu_.change_item(menu_.selection(), 1, font::NULL_MARKUP + newhk.get_name()); } menu_.process(); events::pump(); events::raise_process_event(); events::raise_draw_event(); disp.update_display(); disp.delay(10); } }