Skip to content

Commit

Permalink
Merge pull request #24665 from mlangsdorf/better_milking
Browse files Browse the repository at this point in the history
Better milking: make milking a long action that gets all the milk it can
  • Loading branch information
ZhilkinSerg authored Aug 7, 2018
2 parents d86ae72 + 9a02468 commit 96d52b1
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 21 deletions.
15 changes: 11 additions & 4 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand Down
32 changes: 15 additions & 17 deletions src/monexamine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,31 @@
#include "messages.h"
#include "mtype.h"
#include "calendar.h"
#include "player.h"
#include <utility>

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<int>( transferred_milk * 1_minutes / 5 ) );
}
} else {
add_msg( _( "The %s's udders run dry." ), source_mon.get_name().c_str() );
}
}

0 comments on commit 96d52b1

Please sign in to comment.