Some changes in invisibility code
* Added find_visible_unit, to find a visible_unit by location in a unit_map
This commit is contained in:
parent
815fb95862
commit
ed879a0248
7 changed files with 101 additions and 63 deletions
11
src/ai.cpp
11
src/ai.cpp
|
@ -577,12 +577,13 @@ void ai::do_move()
|
|||
gamemap::location target;
|
||||
int weapon = -1;
|
||||
for(int n = 0; n != 6; ++n) {
|
||||
const unit_map::iterator enemy = units_.find(adj[n]);
|
||||
const unit_map::iterator enemy = find_visible_unit(units_,adj[n],
|
||||
map_,
|
||||
state_.get_time_of_day().lawful_bonus,
|
||||
teams_,current_team());
|
||||
|
||||
if(enemy != units_.end() &&
|
||||
current_team().is_enemy(enemy->second.side()) &&
|
||||
!enemy->second.invisible(map_.underlying_terrain(map_[enemy->first.x][enemy->first.y]),
|
||||
state_.get_time_of_day().lawful_bonus,enemy->first,
|
||||
units_,teams_)) {
|
||||
current_team().is_enemy(enemy->second.side())) {
|
||||
target = adj[n];
|
||||
weapon = choose_weapon(move.first,target,bat_stats,
|
||||
map_[move.second.x][move.second.y]);
|
||||
|
|
|
@ -577,22 +577,22 @@ void display::draw_sidebar()
|
|||
if(invalidateUnit_) {
|
||||
//we display the unit the mouse is over if it is over a unit
|
||||
//otherwise we display the unit that is selected
|
||||
std::map<gamemap::location,unit>::const_iterator i
|
||||
= units_.find(mouseoverHex_);
|
||||
std::map<gamemap::location,unit>::const_iterator i =
|
||||
find_visible_unit(units_,mouseoverHex_,
|
||||
map_,
|
||||
status_.get_time_of_day().lawful_bonus,
|
||||
teams_,teams_[viewing_team()]);
|
||||
|
||||
if(i == units_.end() || fogged(i->first.x,i->first.y)) {
|
||||
i = units_.find(selectedHex_);
|
||||
i = find_visible_unit(units_,selectedHex_,
|
||||
map_,
|
||||
status_.get_time_of_day().lawful_bonus,
|
||||
teams_,teams_[viewing_team()]);
|
||||
}
|
||||
|
||||
//if unit is not fogged and not an invisible enemy
|
||||
if(i != units_.end() && !fogged(i->first.x,i->first.y) &&
|
||||
(!teams_[viewing_team()].is_enemy(i->second.side()) ||
|
||||
!i->second.invisible(map_.underlying_terrain(map_[i->first.x][i->first.y]),
|
||||
status_.get_time_of_day().lawful_bonus,
|
||||
i->first,units_,teams_))) {
|
||||
for(size_t r = reports::UNIT_REPORTS_BEGIN; r != reports::UNIT_REPORTS_END; ++r) {
|
||||
if(i != units_.end() && !fogged(i->first.x,i->first.y))
|
||||
for(size_t r = reports::UNIT_REPORTS_BEGIN; r != reports::UNIT_REPORTS_END; ++r)
|
||||
draw_report(reports::TYPE(r));
|
||||
}
|
||||
}
|
||||
|
||||
invalidateUnit_ = false;
|
||||
}
|
||||
|
|
|
@ -332,15 +332,15 @@ SDL_Surface* getMinimap(int w, int h, const gamemap& map,
|
|||
surf = scale_surface(tile,scale,scale);
|
||||
|
||||
if(units != NULL && teams != NULL && tm != NULL && !fogged) {
|
||||
const unit_map::const_iterator u = units->find(loc);
|
||||
const unit_map::const_iterator u =
|
||||
find_visible_unit(*units,loc,
|
||||
map,lawful_bonus,
|
||||
*teams,*tm);
|
||||
if(u != units->end()) {
|
||||
if(!tm->is_enemy(u->second.side()) ||
|
||||
!u->second.invisible(terrain,lawful_bonus,loc,*units,*teams)){
|
||||
const SDL_Color& colour = font::get_side_colour(u->second.side());
|
||||
SDL_Rect rect = {0,0,surf->w,surf->h};
|
||||
const short col = SDL_MapRGB(surf->format,colour.r,colour.g,colour.b);
|
||||
SDL_FillRect(surf,&rect,col);
|
||||
}
|
||||
const SDL_Color& colour = font::get_side_colour(u->second.side());
|
||||
SDL_Rect rect = {0,0,surf->w,surf->h};
|
||||
const short col = SDL_MapRGB(surf->format,colour.r,colour.g,colour.b);
|
||||
SDL_FillRect(surf,&rect,col);
|
||||
}
|
||||
|
||||
//we're not caching the surface, so make sure
|
||||
|
|
|
@ -126,13 +126,12 @@ bool enemy_zoc(const gamemap& map, const gamestatus& status,
|
|||
get_adjacent_tiles(loc,locs);
|
||||
for(int i = 0; i != 6; ++i) {
|
||||
const std::map<gamemap::location,unit>::const_iterator it
|
||||
= units.find(locs[i]);
|
||||
= find_visible_unit(units,locs[i],
|
||||
map,
|
||||
status.get_time_of_day().lawful_bonus,
|
||||
teams,current_team);
|
||||
if(it != units.end() && it->second.side() != side &&
|
||||
current_team.is_enemy(it->second.side()) &&
|
||||
!it->second.invisible(map.underlying_terrain(
|
||||
map[it->first.x][it->first.y]),
|
||||
status.get_time_of_day().lawful_bonus,it->first,
|
||||
units,teams)) {
|
||||
current_team.is_enemy(it->second.side())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -306,16 +306,10 @@ void turn_info::mouse_motion(const SDL_MouseMotionEvent& event)
|
|||
!current_paths_.routes.empty() && map_.on_board(selected_hex_) &&
|
||||
map_.on_board(new_hex)) {
|
||||
|
||||
unit_map::const_iterator un = units_.find(selected_hex_);
|
||||
|
||||
//deselect the unit if it's an invisible enemy
|
||||
if(un != units_.end()){
|
||||
if(current_team.is_enemy(un->second.side()) &&
|
||||
un->second.invisible(map_.underlying_terrain(map_[un->first.x][un->first.y]),
|
||||
status_.get_time_of_day().lawful_bonus,un->first,units_,teams_)) {
|
||||
un = units_.end();
|
||||
}
|
||||
}
|
||||
unit_map::const_iterator un = find_visible_unit(units_,
|
||||
selected_hex_,
|
||||
map_,
|
||||
status_.get_time_of_day().lawful_bonus,teams_,current_team);
|
||||
|
||||
if(un != units_.end()) {
|
||||
const shortest_path_calculator calc(un->second,current_team,
|
||||
|
@ -342,16 +336,10 @@ void turn_info::mouse_motion(const SDL_MouseMotionEvent& event)
|
|||
}
|
||||
}
|
||||
|
||||
unit_map::iterator un = units_.find(new_hex);
|
||||
|
||||
//deselect the unit if it's an invisible enemy
|
||||
if(un != units_.end()){
|
||||
if(current_team.is_enemy(un->second.side()) &&
|
||||
un->second.invisible(map_.underlying_terrain(map_[un->first.x][un->first.y]),
|
||||
status_.get_time_of_day().lawful_bonus,un->first,units_,teams_)) {
|
||||
un = units_.end();
|
||||
}
|
||||
}
|
||||
unit_map::iterator un = find_visible_unit(units_,
|
||||
new_hex,
|
||||
map_,
|
||||
status_.get_time_of_day().lawful_bonus,teams_,current_team);
|
||||
|
||||
if(un != units_.end() && un->second.side() != team_num_ &&
|
||||
current_paths_.routes.empty() && !gui_.fogged(un->first.x,un->first.y)) {
|
||||
|
@ -451,16 +439,10 @@ void turn_info::left_click(const SDL_MouseButtonEvent& event)
|
|||
std::map<gamemap::location,paths::route>::const_iterator
|
||||
route = enemy_paths_ ? current_paths_.routes.end() :
|
||||
current_paths_.routes.find(hex);
|
||||
unit_map::iterator enemy = units_.find(hex);
|
||||
|
||||
//deselect the unit if it's an invisible enemy
|
||||
if(enemy != units_.end()){
|
||||
if(current_team.is_enemy(enemy->second.side()) &&
|
||||
enemy->second.invisible(map_.underlying_terrain(map_[enemy->first.x][enemy->first.y]),
|
||||
status_.get_time_of_day().lawful_bonus,enemy->first,units_,teams_)) {
|
||||
enemy = units_.end();
|
||||
}
|
||||
}
|
||||
unit_map::iterator enemy = find_visible_unit(units_,
|
||||
hex, map_,
|
||||
status_.get_time_of_day().lawful_bonus,teams_,current_team);
|
||||
|
||||
//see if we're trying to attack an enemy
|
||||
if(route != current_paths_.routes.end() && enemy != units_.end() &&
|
||||
|
@ -751,7 +733,7 @@ bool turn_info::can_execute_command(hotkey::HOTKEY_COMMAND command) const
|
|||
//commands we can only do if there is an active unit
|
||||
case hotkey::HOTKEY_TERRAIN_TABLE:
|
||||
case hotkey::HOTKEY_ATTACK_RESISTANCE:
|
||||
case hotkey::HOTKEY_UNIT_DESCRIPTION:
|
||||
case hotkey::HOTKEY_UNIT_DESCRIPTION:
|
||||
case hotkey::HOTKEY_RENAME_UNIT:
|
||||
return current_unit() != units_.end();
|
||||
|
||||
|
@ -779,7 +761,9 @@ namespace {
|
|||
void turn_info::show_menu(const std::vector<std::string>& items_arg)
|
||||
{
|
||||
std::vector<std::string> items = items_arg;
|
||||
std::cerr << "Erasing elements" << std::endl;
|
||||
items.erase(std::remove_if(items.begin(),items.end(),cannot_execute(*this)),items.end());
|
||||
std::cerr << "Finished erasing elements" << std::endl;
|
||||
if(items.empty())
|
||||
return;
|
||||
|
||||
|
@ -1554,11 +1538,19 @@ void turn_info::unit_list()
|
|||
|
||||
unit_map::iterator turn_info::current_unit()
|
||||
{
|
||||
unit_map::iterator i = units_.find(last_hex_);
|
||||
unit_map::iterator i = find_visible_unit(units_,
|
||||
last_hex_, map_,
|
||||
status_.get_time_of_day().lawful_bonus,teams_,teams_[team_num_-1]);
|
||||
|
||||
if(i == units_.end()) {
|
||||
i = units_.find(selected_hex_);
|
||||
unit_map::iterator i = find_visible_unit(units_, selected_hex_,
|
||||
map_,
|
||||
status_.get_time_of_day().lawful_bonus,teams_,teams_[team_num_-1]);
|
||||
}
|
||||
|
||||
if(i != units_.end()){
|
||||
std::cerr << "Selected " << i->second.name() << std::endl;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
|
38
src/unit.cpp
38
src/unit.cpp
|
@ -935,6 +935,44 @@ std::string team_name(int side, const unit_map& units)
|
|||
return "-";
|
||||
}
|
||||
|
||||
unit_map::iterator find_visible_unit(unit_map& units,
|
||||
const gamemap::location loc,
|
||||
const gamemap& map, int lawful_bonus,
|
||||
const std::vector<team>& teams, const team& current_team)
|
||||
{
|
||||
unit_map::iterator u = units.find(loc);
|
||||
if(map.on_board(loc)){
|
||||
if(u != units.end()){
|
||||
if(current_team.is_enemy(u->second.side()) &&
|
||||
u->second.invisible(
|
||||
map.underlying_terrain(map[loc.x][loc.y]),lawful_bonus,
|
||||
loc,units,teams)) {
|
||||
return units.end();
|
||||
}
|
||||
}
|
||||
}
|
||||
return u;
|
||||
}
|
||||
|
||||
unit_map::const_iterator find_visible_unit(const unit_map& units,
|
||||
const gamemap::location loc,
|
||||
const gamemap& map, int lawful_bonus,
|
||||
const std::vector<team>& teams, const team& current_team)
|
||||
{
|
||||
unit_map::const_iterator u = units.find(loc);
|
||||
if(map.on_board(loc)){
|
||||
if(u != units.end()){
|
||||
if(current_team.is_enemy(u->second.side()) &&
|
||||
u->second.invisible(
|
||||
map.underlying_terrain(map[loc.x][loc.y]),lawful_bonus,
|
||||
loc,units,teams)) {
|
||||
return units.end();
|
||||
}
|
||||
}
|
||||
}
|
||||
return u;
|
||||
}
|
||||
|
||||
team_data calculate_team_data(const team& tm, int side, const unit_map& units)
|
||||
{
|
||||
team_data res;
|
||||
|
|
|
@ -196,6 +196,14 @@ int team_units(const unit_map& units, int team_num);
|
|||
int team_upkeep(const unit_map& units, int team_num);
|
||||
unit_map::const_iterator team_leader(int side, const unit_map& units);
|
||||
std::string team_name(int side, const unit_map& units);
|
||||
unit_map::iterator find_visible_unit(unit_map& units,
|
||||
const gamemap::location loc,
|
||||
const gamemap& map, int lawful_bonus,
|
||||
const std::vector<team>& teams, const team& current_team);
|
||||
unit_map::const_iterator find_visible_unit(const unit_map& units,
|
||||
const gamemap::location loc,
|
||||
const gamemap& map, int lawful_bonus,
|
||||
const std::vector<team>& teams, const team& current_team);
|
||||
|
||||
struct team_data
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue