diff --git a/src/game.cpp b/src/game.cpp index e1dce04600c60..d6df7774bde25 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -7164,7 +7164,18 @@ bool pet_menu(monster *z) } if( milk == choice ) { + // pin the cow in place if it isn't already + bool temp_tie = !z->has_effect( effect_tied ); + if( temp_tie ) { + z->add_effect( effect_tied, 1_turns, num_bp, true); + } + monexamine::milk_source( *z ); + + if( temp_tie ) { + z->remove_effect( effect_tied ); + } + return true; } @@ -9459,10 +9470,6 @@ bool game::handle_liquid( item &liquid, item * const source, const int radius, u.assign_activity( activity_id( "ACT_FILL_LIQUID" ) ); serialize_liquid_source( u.activity, *source_pos, liquid ); return true; - } else if( source_mon != nullptr ) { - u.assign_activity( activity_id( "ACT_FILL_LIQUID" ) ); - serialize_liquid_source( u.activity, *source_mon, liquid ); - return true; } else { return false; } diff --git a/src/monexamine.cpp b/src/monexamine.cpp index 120fc93b7121d..7af55035fd2ea 100644 --- a/src/monexamine.cpp +++ b/src/monexamine.cpp @@ -6,6 +6,7 @@ #include "messages.h" #include "mtype.h" #include "calendar.h" +#include "player.h" #include const efftype_id effect_milked( "milked" ); @@ -13,26 +14,23 @@ const efftype_id effect_milked( "milked" ); void monexamine::milk_source( monster &source_mon ) { const auto milked_item = source_mon.type->starting_ammo; - item milk( milked_item.begin()->first, calendar::turn, 1 ); + const long milk_per_day = milked_item.begin()->second; + const time_duration milking_freq = 1_days / milk_per_day; - // Milked items must be liquids. - if( !milk.made_of( LIQUID ) ) { - debugmsg( "milked item must be a liquid" ); - } else { - - const time_duration milk_per_day = 1_days / milked_item.begin()->second; - - if( !source_mon.has_effect( effect_milked ) ) { - g->handle_liquid( milk, nullptr, 0, nullptr, nullptr, &source_mon ); - source_mon.add_effect( effect_milked, milk_per_day ); - add_msg( _( "You milk the %s." ), source_mon.get_name().c_str() ); + long remaining_milk = milk_per_day; + if( source_mon.has_effect( effect_milked ) ) { + remaining_milk -= source_mon.get_effect_dur( effect_milked ) / milking_freq; + } - } else if( 1_days - source_mon.get_effect_dur( effect_milked ) >= milk_per_day ) { - source_mon.add_effect( effect_milked, milk_per_day ); - g->handle_liquid( milk, nullptr, 0, nullptr, nullptr, &source_mon ); + if( remaining_milk > 0 ) { + item milk( milked_item.begin()->first, calendar::turn, remaining_milk ); + if( g->handle_liquid( milk, nullptr, 1, nullptr, nullptr, &source_mon ) ) { add_msg( _( "You milk the %s." ), source_mon.get_name().c_str() ); - } else { - add_msg( _( "The %s's udders run dry." ), source_mon.get_name().c_str() ); + long transferred_milk = remaining_milk - milk.charges; + source_mon.add_effect( effect_milked, milking_freq * transferred_milk ); + g->u.mod_moves( -to_moves( transferred_milk * 1_minutes / 5 ) ); } + } else { + add_msg( _( "The %s's udders run dry." ), source_mon.get_name().c_str() ); } }