time_of_day tod_manager::time_of_day_at(const unit_map& units,const map_location& loc, const gamemap& map) const { int lighten = std::max<int>(map.get_terrain_info(map.get_terrain(loc)).light_modification() , 0); int darken = std::min<int>(map.get_terrain_info(map.get_terrain(loc)).light_modification() , 0); time_of_day tod = get_time_of_day(lighten + darken,loc); if(loc.valid()) { map_location locs[7]; locs[0] = loc; get_adjacent_tiles(loc,locs+1); for(int i = 0; i != 7; ++i) { const unit_map::const_iterator itor = units.find(locs[i]); if(itor != units.end() && itor->second.get_ability_bool("illuminates") && !itor->second.incapacitated()) { unit_ability_list illum = itor->second.get_abilities("illuminates"); unit_abilities::effect illum_effect(illum,lighten,false); int mod = illum_effect.get_composite_value(); if(mod + tod.lawful_bonus > illum.highest("max_value").first) { mod = illum.highest("max_value").first - tod.lawful_bonus; } lighten = std::max<int>(mod, lighten); darken = std::min<int>(mod, darken); } } } tod = get_time_of_day(lighten + darken,loc); return tod; }
const time_of_day tod_manager::get_illuminated_time_of_day(const map_location& loc, int for_turn) const { // get ToD ignoring illumination time_of_day tod = get_time_of_day(loc, for_turn); // now add illumination const gamemap& map = *resources::game_map; const unit_map& units = *resources::units; int light_modif = map.get_terrain_info(map.get_terrain(loc)).light_modification(); int light = tod.lawful_bonus + light_modif; int illum_light = light; if(loc.valid()) { map_location locs[7]; locs[0] = loc; get_adjacent_tiles(loc,locs+1); for(int i = 0; i != 7; ++i) { const unit_map::const_iterator itor = units.find(locs[i]); if(itor != units.end() && itor->get_ability_bool("illuminates") && !itor->incapacitated()) { unit_ability_list illum = itor->get_abilities("illuminates"); unit_abilities::effect illum_effect(illum, light, false); illum_light = light + illum_effect.get_composite_value(); //max_value and min_value control the final result //unless ToD + terrain effect is stronger int max = std::max(light, illum.highest("max_value").first); int min = std::min(light, illum.lowest("min_value").first); if(illum_light > max) { illum_light = max; } else if (illum_light < min) { illum_light = min; } } } } tod.bonus_modified = illum_light - tod.lawful_bonus; tod.lawful_bonus = illum_light; return tod; }
const time_of_day tod_manager::get_illuminated_time_of_day(const unit_map & units, const gamemap & map, const map_location& loc, int for_turn) const { // get ToD ignoring illumination time_of_day tod = get_time_of_day(loc, for_turn); if ( map.on_board_with_border(loc) ) { // Now add terrain illumination. const int terrain_light = map.get_terrain_info(loc).light_bonus(tod.lawful_bonus); std::vector<int> mod_list; std::vector<int> max_list; std::vector<int> min_list; int most_add = 0; int most_sub = 0; // Find the "illuminates" effects from units that can affect loc. map_location locs[7]; locs[0] = loc; get_adjacent_tiles(loc,locs+1); for ( size_t i = 0; i != 7; ++i ) { const unit_map::const_iterator itor = units.find(locs[i]); if (itor != units.end() && itor->get_ability_bool("illuminates") && !itor->incapacitated()) { unit_ability_list illum = itor->get_abilities("illuminates"); unit_abilities::effect illum_effect(illum, terrain_light, false); const int unit_mod = illum_effect.get_composite_value(); // Record this value. mod_list.push_back(unit_mod); max_list.push_back(illum.highest("max_value").first); min_list.push_back(illum.lowest("min_value").first); if ( unit_mod > most_add ) most_add = unit_mod; else if ( unit_mod < most_sub ) most_sub = unit_mod; } } const bool net_darker = most_add < -most_sub; // Apply each unit's effect, tracking the best result. int best_result = terrain_light; const int base_light = terrain_light + (net_darker ? most_add : most_sub); for ( size_t i = 0; i != mod_list.size(); ++i ) { int result = bounded_add(base_light, mod_list[i], max_list[i], min_list[i]); if ( net_darker && result < best_result ) best_result = result; else if ( !net_darker && result > best_result ) best_result = result; } // Update the object we will return. tod.bonus_modified = best_result - tod.lawful_bonus; tod.lawful_bonus = best_result; } return tod; }