std::string to_string( const time_point &p ) { const int year = to_turns<int>( p - calendar::time_of_cataclysm ) / to_turns<int> ( calendar::year_length() ) + 1; const std::string time = to_string_time_of_day( p ); if( calendar::eternal_season() ) { const int day = to_days<int>( time_past_new_year( p ) ); //~ 1 is the year, 2 is the day (of the *year*), 3 is the time of the day in its usual format return string_format( _( "Year %1$d, day %2$d %3$s" ), year, day, time ); } else { const int day = day_of_season<int>( p ); //~ 1 is the year, 2 is the season name, 3 is the day (of the season), 4 is the time of the day in its usual format return string_format( _( "Year %1$d, %2$s, day %3$d %4$s" ), year, calendar::name_season( season_of_year( p ) ), day, time ); } }
/** * Generate textual weather forecast for the specified radio tower. */ std::string weather_forecast( const point &abs_sm_pos ) { std::ostringstream weather_report; // Local conditions const auto cref = overmap_buffer.closest_city( tripoint( abs_sm_pos, 0 ) ); const std::string city_name = cref ? cref.city->name : std::string( _( "middle of nowhere" ) ); // Current time weather_report << string_format( _( "The current time is %s Eastern Standard Time. At %s in %s, it was %s. The temperature was %s. " ), to_string_time_of_day( calendar::turn ), print_time_just_hour( calendar::turn ), city_name, weather_data( g->weather ).name, print_temperature( g->temperature ) ); //weather_report << ", the dewpoint ???, and the relative humidity ???. "; //weather_report << "The wind was <direction> at ? mi/km an hour. "; //weather_report << "The pressure was ??? in/mm and steady/rising/falling."; // Regional conditions (simulated by choosing a random range containing the current conditions). // Adjusted for weather volatility based on how many weather changes are coming up. //weather_report << "Across <region>, skies ranged from <cloudiest> to <clearest>. "; // TODO: Add fake reports for nearby cities // TODO: weather forecast // forecasting periods are divided into 12-hour periods, day (6-18) and night (19-5) // Accumulate percentages for each period of various weather statistics, and report that // (with fuzz) as the weather chances. // int weather_proportions[NUM_WEATHER_TYPES] = {0}; double high = -100.0; double low = 100.0; const tripoint abs_ms_pos = tripoint( sm_to_ms_copy( abs_sm_pos ), 0 ); // TODO: wind direction and speed const time_point last_hour = calendar::turn - ( calendar::turn - calendar::time_of_cataclysm ) % 1_hours; for( int d = 0; d < 6; d++ ) { weather_type forecast = WEATHER_NULL; const auto wgen = g->get_cur_weather_gen(); for( time_point i = last_hour + d * 12_hours; i < last_hour + ( d + 1 ) * 12_hours; i += 1_hours ) { w_point w = wgen.get_weather( abs_ms_pos, i, g->get_seed() ); forecast = std::max( forecast, wgen.get_weather_conditions( w ) ); high = std::max( high, w.temperature ); low = std::min( low, w.temperature ); } std::string day; bool started_at_night; const time_point c = last_hour + 12_hours * d; if( d == 0 && calendar( to_turn<int>( c ) ).is_night() ) { day = _( "Tonight" ); started_at_night = true; } else { day = _( "Today" ); started_at_night = false; } if( d > 0 && ( ( started_at_night && !( d % 2 ) ) || ( !started_at_night && d % 2 ) ) ) { day = string_format( pgettext( "Mon Night", "%s Night" ), to_string( day_of_week( c ) ) ); } else { day = to_string( day_of_week( c ) ); } weather_report << string_format( _( "%s... %s. Highs of %s. Lows of %s. " ), day, weather_data( forecast ).name, print_temperature( high ), print_temperature( low ) ); } return weather_report.str(); }