Skip to content

Commit

Permalink
Merge pull request #62242 from irwiss/app-battery-check
Browse files Browse the repository at this point in the history
Add UI feedback if appliance has no battery on grid
  • Loading branch information
dseguin authored Nov 20, 2022
2 parents b7b0c5d + 553ebee commit 025172a
Showing 4 changed files with 39 additions and 20 deletions.
11 changes: 6 additions & 5 deletions src/map.cpp
Original file line number Diff line number Diff line change
@@ -582,15 +582,16 @@ void map::vehmove()
}
}
dirty_vehicle_list.clear();
// The bool tracks whether the vehicles is on the map or not.
std::map<vehicle *, bool> connected_vehicles;
std::set<vehicle *> origins;
for( int zlev = minz; zlev <= maxz; ++zlev ) {
level_cache *cache = get_cache_lazy( zlev );
const level_cache *cache = get_cache_lazy( zlev );
if( cache ) {
vehicle::enumerate_vehicles( connected_vehicles, cache->vehicle_list );
for( vehicle *veh : cache->vehicle_list ) {
origins.emplace( veh );
}
}
}
for( std::pair<vehicle *const, bool> &veh_pair : connected_vehicles ) {
for( const std::pair<vehicle *const, bool> &veh_pair : vehicle::enumerate_vehicles( origins ) ) {
veh_pair.first->idle( veh_pair.second );
}

19 changes: 19 additions & 0 deletions src/veh_appliance.cpp
Original file line number Diff line number Diff line change
@@ -124,9 +124,23 @@ veh_app_interact::veh_app_interact( vehicle &veh, const point &p )
ctxt.register_action( "UNPLUG" );
}

// @returns true if a battery part exists on any vehicle connected to veh
static bool has_battery_in_grid( vehicle *veh )
{
const std::map<vehicle *, bool> veh_map = vehicle::enumerate_vehicles( { veh } );
return std::any_of( veh_map.begin(), veh_map.end(),
[]( const std::pair<vehicle *, bool> &p ) {
return !p.first->batteries.empty();
} );
}

void veh_app_interact::init_ui_windows()
{
int height_info = veh->get_printable_fuel_types().size() + 2;

if( !has_battery_in_grid( veh ) ) {
height_info++;
}
if( !veh->batteries.empty() ) {
height_info++;
}
@@ -206,6 +220,11 @@ void veh_app_interact::draw_info()
wprintz( w_info, rcol, rstr );
};

if( !has_battery_in_grid( veh ) ) {
mvwprintz( w_info, point( 0, row ), c_light_red, _( "Appliance has no connection to a battery." ) );
row++;
}

// Battery power output
int charge_rate = veh->net_battery_charge_rate_w( true, true );
print_charge( _( "Grid battery power flow: " ), charge_rate, row );
15 changes: 7 additions & 8 deletions src/vehicle.cpp
Original file line number Diff line number Diff line change
@@ -5134,19 +5134,18 @@ vehicle *vehicle::find_vehicle( const tripoint &where )
return nullptr;
}

void vehicle::enumerate_vehicles( std::map<vehicle *, bool> &connected_vehicles,
std::set<vehicle *> &vehicle_list )
std::map<vehicle *, bool> vehicle::enumerate_vehicles( const std::set<vehicle *> &origins )
{
auto enumerate_visitor = [&connected_vehicles]( vehicle * veh, int amount, int ) {
// Only emplaces if element is not present already.
connected_vehicles.emplace( veh, false );
std::map<vehicle *, bool> result; // the bool represents if vehicle ptr is in origins set
const auto enumerate_visitor = [&result]( vehicle * veh, int amount, int /* loss_amount */ ) {
result.emplace( veh, false ); // only add if element is not present already.
return amount;
};
for( vehicle *veh : vehicle_list ) {
// This autovivifies, and also overwrites the value if already present.
connected_vehicles[veh] = true;
for( vehicle *veh : origins ) {
result[veh] = true; // add or overwrite the value
traverse_vehicle_graph( veh, 1, enumerate_visitor );
}
return result;
}

template <typename Func, typename Vehicle>
14 changes: 7 additions & 7 deletions src/vehicle.h
Original file line number Diff line number Diff line change
@@ -1543,13 +1543,13 @@ class vehicle
float handling_difficulty() const;

/**
* Use grid traversal to enumerate all connected vehicles.
* @param connected_vehicles is an output map from vehicle pointers to
* a bool that is true if the vehicle is in the reality bubble.
* @param vehicle_list is a set of pointers to vehicles present in the reality bubble.
*/
static void enumerate_vehicles( std::map<vehicle *, bool> &connected_vehicles,
std::set<vehicle *> &vehicle_list );
* Use vehicle::traverse_vehicle_graph (breadth-first search) to enumerate all vehicles
* connected to @ref origins by parts with POWER_TRANSFER flag.
* @param origins set of pointers to vehicles to start searching from
* @return a map of vehicle pointers to a bool that is true if the
* vehicle is in the @ref origins set.
*/
static std::map<vehicle *, bool> enumerate_vehicles( const std::set<vehicle *> &origins );
// idle fuel consumption
void idle( bool on_map = true );
// continuous processing for running vehicle alarms

0 comments on commit 025172a

Please sign in to comment.