void game_display::display_unit_hex(map_location hex) { const unit *u = get_visible_unit(units_, hex, teams_[viewing_team()], !viewpoint_); if (u) { displayedUnitHex_ = hex; invalidate_unit(); } }
void game_display::highlight_hex(map_location hex) { const unit *u = get_visible_unit(units_, hex, teams_[viewing_team()], !viewpoint_); if (u) { displayedUnitHex_ = hex; invalidate_unit(); } else { u = get_visible_unit(units_, mouseoverHex_, teams_[viewing_team()], !viewpoint_); if (u) { // mouse moved from unit hex to non-unit hex if (units_.count(selectedHex_)) { displayedUnitHex_ = selectedHex_; invalidate_unit(); } } } display::highlight_hex(hex); invalidate_game_status(); }
void game_display::display_unit_hex(map_location hex) { if (!hex.valid()) return; wb::future_map future; /**< Lasts for whole method. */ const unit *u = resources::gameboard->get_visible_unit(hex, dc_->teams()[viewing_team()], !dont_show_all_); if (u) { displayedUnitHex_ = hex; invalidate_unit(); } }
void game_display::highlight_hex(map_location hex) { wb::future_map future; /**< Lasts for whole method. */ const unit *u = resources::gameboard->get_visible_unit(hex, dc_->teams()[viewing_team()], !dont_show_all_); if (u) { displayedUnitHex_ = hex; invalidate_unit(); } else { u = resources::gameboard->get_visible_unit(mouseoverHex_, dc_->teams()[viewing_team()], !dont_show_all_); if (u) { // mouse moved from unit hex to non-unit hex if (dc_->units().count(selectedHex_)) { displayedUnitHex_ = selectedHex_; invalidate_unit(); } } } display::highlight_hex(hex); invalidate_game_status(); }
void game_display::display_unit_hex(map_location hex) { if (!hex.valid()) return; wb::future_map future; //< Lasts for whole method. const unit *u = get_visible_unit(hex, (*teams_)[viewing_team()], !viewpoint_); if (u) { displayedUnitHex_ = hex; invalidate_unit(); } }
void game_display::highlight_hex(map_location hex) { wb::future_map future; //< Lasts for whole method. const unit *u = get_visible_unit(hex, (*teams_)[viewing_team()], !viewpoint_); if (u) { displayedUnitHex_ = hex; invalidate_unit(); } else { u = get_visible_unit(mouseoverHex_, (*teams_)[viewing_team()], !viewpoint_); if (u) { // mouse moved from unit hex to non-unit hex if (units_->count(selectedHex_)) { displayedUnitHex_ = selectedHex_; invalidate_unit(); } } } display::highlight_hex(hex); invalidate_game_status(); }
void play_controller::hotkey_handler::show_menu(const std::vector<std::string>& items_arg, int xloc, int yloc, bool context_menu, display& disp) { if (context_menu) { last_context_menu_x_ = xloc; last_context_menu_y_ = yloc; } std::vector<std::string> items = items_arg; const hotkey::hotkey_command* cmd; std::vector<std::string>::iterator i = items.begin(); while(i != items.end()) { if (*i == "AUTOSAVES") { // Autosave visibility is similar to LOAD_GAME hotkey cmd = &hotkey::hotkey_command::get_command_by_command(hotkey::HOTKEY_LOAD_GAME); } else { cmd = &hotkey::get_hotkey_command(*i); } // Remove WML commands if they would not be allowed here if(*i == "wml") { if(!context_menu || !viewing_team_is_playing() || events::commands_disabled || !viewing_team().is_local_human() || (linger() && !game_config::debug)){ i = items.erase(i); continue; } // Remove commands that can't be executed or don't belong in this type of menu } else if(!can_execute_command(*cmd) || (context_menu && !in_context_menu(cmd->id))) { i = items.erase(i); continue; } ++i; } // Add special non-hotkey items to the menu and remember their indices expand_autosaves(items); expand_wml_commands(items); if(items.empty()) return; command_executor::show_menu(items, xloc, yloc, context_menu, disp); }
void game_display::highlight_hex(map_location hex) { unit_map::const_iterator u = find_visible_unit(units_, hex, get_map(), teams_, teams_[viewing_team()], !viewpoint_); if (u != units_.end()) { displayedUnitHex_ = hex; invalidate_unit(); } else { u = find_visible_unit(units_, mouseoverHex_, get_map(), teams_, teams_[viewing_team()], !viewpoint_); if (u != units_.end()) { // mouse moved from unit hex to non-unit hex if (units_.count(selectedHex_)) { displayedUnitHex_ = selectedHex_; invalidate_unit(); } } } display::highlight_hex(hex); invalidate_game_status(); }
hotkey::ACTION_STATE play_controller::hotkey_handler::get_action_state(hotkey::HOTKEY_COMMAND command, int /*index*/) const { switch(command) { case hotkey::HOTKEY_MINIMAP_DRAW_VILLAGES: return (preferences::minimap_draw_villages()) ? hotkey::ACTION_ON : hotkey::ACTION_OFF; case hotkey::HOTKEY_MINIMAP_CODING_UNIT: return (preferences::minimap_movement_coding()) ? hotkey::ACTION_ON : hotkey::ACTION_OFF; case hotkey::HOTKEY_MINIMAP_CODING_TERRAIN: return (preferences::minimap_terrain_coding()) ? hotkey::ACTION_ON : hotkey::ACTION_OFF; case hotkey::HOTKEY_MINIMAP_DRAW_UNITS: return (preferences::minimap_draw_units()) ? hotkey::ACTION_ON : hotkey::ACTION_OFF; case hotkey::HOTKEY_MINIMAP_DRAW_TERRAIN: return (preferences::minimap_draw_terrain()) ? hotkey::ACTION_ON : hotkey::ACTION_OFF; case hotkey::HOTKEY_ZOOM_DEFAULT: return (gui()->get_zoom_factor() == 1.0) ? hotkey::ACTION_ON : hotkey::ACTION_OFF; case hotkey::HOTKEY_DELAY_SHROUD: return viewing_team().auto_shroud_updates() ? hotkey::ACTION_OFF : hotkey::ACTION_ON; default: return hotkey::ACTION_STATELESS; } }
bool playsingle_controller::hotkey_handler::can_execute_command(const hotkey::hotkey_command& cmd, int index) const { hotkey::HOTKEY_COMMAND command = cmd.id; bool res = true; switch (command){ case hotkey::HOTKEY_WML: { int prefixlen = wml_menu_hotkey_prefix.length(); if(cmd.command.compare(0, prefixlen, wml_menu_hotkey_prefix) != 0) { return false; } game_events::wmi_container::const_iterator it = gamestate().get_wml_menu_items().find(cmd.command.substr(prefixlen)); if(it == gamestate().get_wml_menu_items().end()) { return false; } return !(**it).is_synced() || play_controller_.can_use_synced_wml_menu(); } case hotkey::HOTKEY_UNIT_HOLD_POSITION: case hotkey::HOTKEY_END_UNIT_TURN: return !browse() && !linger() && !events::commands_disabled; case hotkey::HOTKEY_RECRUIT: case hotkey::HOTKEY_REPEAT_RECRUIT: case hotkey::HOTKEY_RECALL: return (!browse() || whiteboard_manager_->is_active()) && !linger() && !events::commands_disabled; case hotkey::HOTKEY_ENDTURN: return (!browse() || linger()) && !events::commands_disabled; case hotkey::HOTKEY_DELAY_SHROUD: return !linger() && (viewing_team().uses_fog() || viewing_team().uses_shroud()) && viewing_team_is_playing() && viewing_team().is_local_human() && !events::commands_disabled; case hotkey::HOTKEY_UPDATE_SHROUD: return !linger() && viewing_team_is_playing() && viewing_team().is_local_human() && !events::commands_disabled && viewing_team().auto_shroud_updates() == false; // Commands we can only do if in debug mode case hotkey::HOTKEY_CREATE_UNIT: case hotkey::HOTKEY_CHANGE_SIDE: case hotkey::HOTKEY_KILL_UNIT: return !events::commands_disabled && game_config::debug && play_controller_.get_map_const().on_board(mouse_handler_.get_last_hex()); case hotkey::HOTKEY_CLEAR_LABELS: res = !is_observer(); break; case hotkey::HOTKEY_LABEL_TEAM_TERRAIN: case hotkey::HOTKEY_LABEL_TERRAIN: { const terrain_label *label = gui()->labels().get_label(mouse_handler_.get_last_hex()); res = !events::commands_disabled && play_controller_.get_map_const().on_board(mouse_handler_.get_last_hex()) && !gui()->shrouded(mouse_handler_.get_last_hex()) && !is_observer() && (!label || !label->immutable()); break; } case hotkey::HOTKEY_CONTINUE_MOVE: { if(browse() || events::commands_disabled) return false; if( (menu_handler_.current_unit().valid()) && (menu_handler_.current_unit()->move_interrupted())) return true; const unit_map::const_iterator i = play_controller_.get_units_const().find(mouse_handler_.get_selected_hex()); if (!i.valid()) return false; return i->move_interrupted(); } case hotkey::HOTKEY_WB_TOGGLE: return !is_observer(); case hotkey::HOTKEY_WB_EXECUTE_ACTION: case hotkey::HOTKEY_WB_EXECUTE_ALL_ACTIONS: return whiteboard_manager_->can_enable_execution_hotkeys(); case hotkey::HOTKEY_WB_DELETE_ACTION: return whiteboard_manager_->can_enable_modifier_hotkeys(); case hotkey::HOTKEY_WB_BUMP_UP_ACTION: case hotkey::HOTKEY_WB_BUMP_DOWN_ACTION: return whiteboard_manager_->can_enable_reorder_hotkeys(); case hotkey::HOTKEY_WB_SUPPOSE_DEAD: { //@todo re-enable this once we figure out a decent UI for suppose_dead return false; } default: return play_controller::hotkey_handler::can_execute_command(cmd, index); } return res; }
void game_display::draw_hex(const map_location& loc) { const bool on_map = get_map().on_board(loc); const bool is_shrouded = shrouded(loc); // const bool is_fogged = fogged(loc); const int xpos = get_location_x(loc); const int ypos = get_location_y(loc); // image::TYPE image_type = get_image_type(loc); display::draw_hex(loc); if(cursor::get() == cursor::WAIT) { // Interaction is disabled, so we don't need anything else return; } if(on_map && loc == mouseoverHex_) { tdrawing_layer hex_top_layer = LAYER_MOUSEOVER_BOTTOM; const unit *u = resources::gameboard->get_visible_unit(loc, dc_->teams()[viewing_team()] ); if( u != NULL ) { hex_top_layer = LAYER_MOUSEOVER_TOP; } if(u == NULL) { drawing_buffer_add( hex_top_layer, loc, xpos, ypos, image::get_image("misc/hover-hex-top.png~RC(magenta>gold)", image::SCALED_TO_HEX)); drawing_buffer_add(LAYER_MOUSEOVER_BOTTOM, loc, xpos, ypos, image::get_image("misc/hover-hex-bottom.png~RC(magenta>gold)", image::SCALED_TO_HEX)); } else if(dc_->teams()[currentTeam_].is_enemy(u->side())) { drawing_buffer_add( hex_top_layer, loc, xpos, ypos, image::get_image("misc/hover-hex-enemy-top.png~RC(magenta>red)", image::SCALED_TO_HEX)); drawing_buffer_add(LAYER_MOUSEOVER_BOTTOM, loc, xpos, ypos, image::get_image("misc/hover-hex-enemy-bottom.png~RC(magenta>red)", image::SCALED_TO_HEX)); } else if(dc_->teams()[currentTeam_].side() == u->side()) { drawing_buffer_add( hex_top_layer, loc, xpos, ypos, image::get_image("misc/hover-hex-top.png~RC(magenta>green)", image::SCALED_TO_HEX)); drawing_buffer_add(LAYER_MOUSEOVER_BOTTOM, loc, xpos, ypos, image::get_image("misc/hover-hex-bottom.png~RC(magenta>green)", image::SCALED_TO_HEX)); } else { drawing_buffer_add( hex_top_layer, loc, xpos, ypos, image::get_image("misc/hover-hex-top.png~RC(magenta>lightblue)", image::SCALED_TO_HEX)); drawing_buffer_add(LAYER_MOUSEOVER_BOTTOM, loc, xpos, ypos, image::get_image("misc/hover-hex-bottom.png~RC(magenta>lightblue)", image::SCALED_TO_HEX)); } } // Draw reach_map information. // We remove the reachability mask of the unit // that we want to attack. if (!is_shrouded && !reach_map_.empty() && reach_map_.find(loc) == reach_map_.end() && loc != attack_indicator_dst_) { static const image::locator unreachable(game_config::images::unreachable); drawing_buffer_add(LAYER_REACHMAP, loc, xpos, ypos, image::get_image(unreachable,image::SCALED_TO_HEX)); } if (boost::shared_ptr<wb::manager> w = wb_.lock()) { w->draw_hex(loc); if (!(w->is_active() && w->has_temp_move())) { // Footsteps indicating a movement path const std::vector<surface>& footstepImages = footsteps_images(loc, route_, dc_); if (!footstepImages.empty()) { drawing_buffer_add(LAYER_FOOTSTEPS, loc, xpos, ypos, footstepImages); } } } // Draw the attack direction indicator if(on_map && loc == attack_indicator_src_) { drawing_buffer_add(LAYER_ATTACK_INDICATOR, loc, xpos, ypos, image::get_image("misc/attack-indicator-src-" + attack_indicator_direction() + ".png", image::SCALED_TO_HEX)); } else if (on_map && loc == attack_indicator_dst_) { drawing_buffer_add(LAYER_ATTACK_INDICATOR, loc, xpos, ypos, image::get_image("misc/attack-indicator-dst-" + attack_indicator_direction() + ".png", image::SCALED_TO_HEX)); } // Linger overlay unconditionally otherwise it might give glitches // so it's drawn over the shroud and fog. if(game_mode_ != RUNNING) { static const image::locator linger(game_config::images::linger); drawing_buffer_add(LAYER_LINGER_OVERLAY, loc, xpos, ypos, image::get_image(linger, image::TOD_COLORED)); } if(on_map && loc == selectedHex_ && !game_config::images::selected.empty()) { static const image::locator selected(game_config::images::selected); drawing_buffer_add(LAYER_SELECTED_HEX, loc, xpos, ypos, image::get_image(selected, image::SCALED_TO_HEX)); } // Show def% and turn to reach info if(!is_shrouded && on_map) { draw_movement_info(loc); } if(game_config::debug) { int debugH = debugHighlights_[loc]; if (debugH) { std::string txt = lexical_cast<std::string>(debugH); draw_text_in_hex(loc, LAYER_MOVE_INFO, txt, 18, font::BAD_COLOR); } } //simulate_delay += 1; }
void game_display::display_unit_hex(map_location hex) { unit_map::const_iterator u = find_visible_unit(units_, hex, get_map(), teams_, teams_[viewing_team()], !viewpoint_); if (u != units_.end()) { displayedUnitHex_ = hex; invalidate_unit(); } }
void game_display::draw_hex(const map_location& loc) { const bool on_map = get_map().on_board(loc); const bool is_shrouded = shrouded(loc); const bool is_fogged = fogged(loc); const int xpos = get_location_x(loc); const int ypos = get_location_y(loc); image::TYPE image_type = get_image_type(loc); display::draw_hex(loc); if(on_map && loc == mouseoverHex_) { tdrawing_layer hex_top_layer = LAYER_MOUSEOVER_BOTTOM; if( get_visible_unit(loc, (*teams_)[viewing_team()] ) != NULL ) { hex_top_layer = LAYER_MOUSEOVER_TOP; } drawing_buffer_add( hex_top_layer, loc, xpos, ypos, image::get_image("misc/hover-hex-top.png", image::SCALED_TO_HEX)); drawing_buffer_add(LAYER_MOUSEOVER_BOTTOM, loc, xpos, ypos, image::get_image("misc/hover-hex-bottom.png", image::SCALED_TO_HEX)); } if(!is_shrouded) { typedef overlay_map::const_iterator Itor; std::pair<Itor,Itor> overlays = overlays_.equal_range(loc); for( ; overlays.first != overlays.second; ++overlays.first) { if ((overlays.first->second.team_name == "" || overlays.first->second.team_name.find((*teams_)[playing_team()].team_name()) != std::string::npos) && !(is_fogged && !overlays.first->second.visible_in_fog)) { drawing_buffer_add(LAYER_TERRAIN_BG, loc, xpos, ypos, image::get_image(overlays.first->second.image,image_type)); } } // village-control flags. drawing_buffer_add(LAYER_TERRAIN_BG, loc, xpos, ypos, get_flag(loc)); } // Draw reach_map information. // We remove the reachability mask of the unit // that we want to attack. if (!is_shrouded && !reach_map_.empty() && reach_map_.find(loc) == reach_map_.end() && loc != attack_indicator_dst_) { static const image::locator unreachable(game_config::images::unreachable); drawing_buffer_add(LAYER_REACHMAP, loc, xpos, ypos, image::get_image(unreachable,image::SCALED_TO_HEX)); } resources::whiteboard->draw_hex(loc); if (!(resources::whiteboard->is_active() && resources::whiteboard->has_temp_move())) { // Footsteps indicating a movement path const std::vector<surface>& footstepImages = footsteps_images(loc); if (footstepImages.size() != 0) { drawing_buffer_add(LAYER_FOOTSTEPS, loc, xpos, ypos, footstepImages); } } // Draw the attack direction indicator if(on_map && loc == attack_indicator_src_) { drawing_buffer_add(LAYER_ATTACK_INDICATOR, loc, xpos, ypos, image::get_image("misc/attack-indicator-src-" + attack_indicator_direction() + ".png", image::SCALED_TO_HEX)); } else if (on_map && loc == attack_indicator_dst_) { drawing_buffer_add(LAYER_ATTACK_INDICATOR, loc, xpos, ypos, image::get_image("misc/attack-indicator-dst-" + attack_indicator_direction() + ".png", image::SCALED_TO_HEX)); } // Linger overlay unconditionally otherwise it might give glitches // so it's drawn over the shroud and fog. if(game_mode_ != RUNNING) { static const image::locator linger(game_config::images::linger); drawing_buffer_add(LAYER_LINGER_OVERLAY, loc, xpos, ypos, image::get_image(linger, image::TOD_COLORED)); } if(on_map && loc == selectedHex_ && !game_config::images::selected.empty()) { static const image::locator selected(game_config::images::selected); drawing_buffer_add(LAYER_SELECTED_HEX, loc, xpos, ypos, image::get_image(selected, image::SCALED_TO_HEX)); } // Show def% and turn to reach info if(!is_shrouded && on_map) { draw_movement_info(loc); } if(game_config::debug) { int debugH = debugHighlights_[loc]; if (debugH) { std::string txt = lexical_cast<std::string>(debugH); draw_text_in_hex(loc, LAYER_MOVE_INFO, txt, 18, font::BAD_COLOR); } } //simulate_delay += 1; }