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:
uid67456 2004-01-30 20:08:21 +00:00
parent 815fb95862
commit ed879a0248
7 changed files with 101 additions and 63 deletions

View file

@ -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]);

View file

@ -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;
}

View file

@ -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

View file

@ -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;
}
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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
{