Skip to content

Commit

Permalink
Make crafting time functions const and/or operate on const Character.
Browse files Browse the repository at this point in the history
Also makes Character::crafting_inventory() const.
  • Loading branch information
eltank committed May 28, 2021
1 parent e0eedee commit 36c62f9
Show file tree
Hide file tree
Showing 8 changed files with 35 additions and 53 deletions.
7 changes: 4 additions & 3 deletions src/activity_actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1703,6 +1703,10 @@ std::unique_ptr<activity_actor> unload_activity_actor::deserialize( JsonIn &jsin
craft_activity_actor::craft_activity_actor( item_location &it, const bool is_long ) :
craft_item( it ), is_long( is_long )
{
cached_crafting_speed = 0;
cached_assistants = 0;
cached_base_total_moves = 1;
cached_cur_total_moves = 1;
}

bool craft_activity_actor::check_if_craft_okay( item_location &craft_item, Character &crafter )
Expand Down Expand Up @@ -1739,9 +1743,6 @@ void craft_activity_actor::start( player_activity &act, Character &crafter )
act.moves_left = calendar::INDEFINITELY_LONG;
activity_override = craft_item.get_item()->get_making().exertion_level();
cached_crafting_speed = 0;
cached_assistants = 0;
cached_base_total_moves = 1;
cached_cur_total_moves = 1;
}

void craft_activity_actor::do_turn( player_activity &act, Character &crafter )
Expand Down
2 changes: 1 addition & 1 deletion src/character.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,6 @@ std::string enum_to_string<blood_type>( blood_type data )

// *INDENT-OFF*
Character::Character() :
cached_time( calendar::before_time_starts ),
id( -1 ),
next_climate_control_check( calendar::before_time_starts ),
last_climate_control_ret( false )
Expand Down Expand Up @@ -486,6 +485,7 @@ Character::Character() :

move_mode = move_mode_id( "walk" );
next_expected_position = cata::nullopt;
cached_time = calendar::before_time_starts;
}
// *INDENT-ON*

Expand Down
21 changes: 8 additions & 13 deletions src/character.h
Original file line number Diff line number Diff line change
Expand Up @@ -1996,8 +1996,6 @@ class Character : public Creature, public visitable
// Save favorite ammo location
item_location ammo_location;
std::set<tripoint_abs_omt> camps;
/* crafting inventory cached time */
time_point cached_time;

std::vector <addiction> addictions;
/** Adds an addiction to the player */
Expand Down Expand Up @@ -2447,7 +2445,7 @@ class Character : public Creature, public visitable
void clear_morale();
bool has_morale_to_read() const;
bool has_morale_to_craft() const;
const inventory &crafting_inventory( bool clear_path );
const inventory &crafting_inventory( bool clear_path ) const;
/**
* Returns items that can be used to craft with. Always includes character inventory.
* @param src_pos Character position.
Expand All @@ -2456,7 +2454,7 @@ class Character : public Creature, public visitable
* @returns Craftable inventory items found.
* */
const inventory &crafting_inventory( const tripoint &src_pos = tripoint_zero,
int radius = PICKUP_RANGE, bool clear_path = true );
int radius = PICKUP_RANGE, bool clear_path = true ) const;
void invalidate_crafting_inventory();

/** Returns a value from 1.0 to 11.0 that acts as a multiplier
Expand Down Expand Up @@ -2515,15 +2513,10 @@ class Character : public Creature, public visitable
/** For use with in progress crafts */
float crafting_speed_multiplier( const item &craft, const cata::optional<tripoint> &loc ) const;
int available_assistant_count( const recipe &rec ) const;
/**
* Time to craft not including speed multiplier
*/
int64_t base_time_to_craft( const recipe &rec, int batch_size = 1 );
/**
* Expected time to craft a recipe, with assumption that multipliers stay constant.
*/
int64_t expected_time_to_craft( const recipe &rec, int batch_size = 1,
bool in_progress = false );
int64_t expected_time_to_craft( const recipe &rec, int batch_size = 1 ) const;
std::vector<const item *> get_eligible_containers_for_crafting() const;
bool check_eligible_containers_for_crafting( const recipe &rec, int batch_size = 1 ) const;
bool can_make( const recipe *r, int batch_size = 1 ); // have components?
Expand Down Expand Up @@ -2929,9 +2922,11 @@ class Character : public Creature, public visitable

struct weighted_int_list<std::string> melee_miss_reasons;

int cached_moves;
tripoint cached_position;
pimpl<inventory> cached_crafting_inventory;
/* crafting inventory cached time */
mutable time_point cached_time;
mutable int cached_moves;
mutable tripoint cached_position;
mutable pimpl<inventory> cached_crafting_inventory;

protected:
/** Subset of learned recipes. Needs to be mutable for lazy initialization. */
Expand Down
26 changes: 6 additions & 20 deletions src/crafting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -375,17 +375,10 @@ int Character::available_assistant_count( const recipe &rec ) const
} );
}

int64_t Character::base_time_to_craft( const recipe &rec, int batch_size )
int64_t Character::expected_time_to_craft( const recipe &rec, int batch_size ) const
{
const size_t assistants = available_assistant_count( rec );
return rec.batch_time( *this, batch_size, 1.0f, assistants );
}

int64_t Character::expected_time_to_craft( const recipe &rec, int batch_size,
bool in_progress )
{
const size_t assistants = available_assistant_count( rec );
float modifier = crafting_speed_multiplier( rec, in_progress );
float modifier = crafting_speed_multiplier( rec );
return rec.batch_time( *this, batch_size, modifier, assistants );
}

Expand Down Expand Up @@ -536,13 +529,13 @@ bool Character::can_start_craft( const recipe *rec, recipe_filter_flags flags, i
inv, rec->get_component_filter( flags ), batch_size, craft_flags::start_only );
}

const inventory &Character::crafting_inventory( bool clear_path )
const inventory &Character::crafting_inventory( bool clear_path ) const
{
return crafting_inventory( tripoint_zero, PICKUP_RANGE, clear_path );
}

const inventory &Character::crafting_inventory( const tripoint &src_pos, int radius,
bool clear_path )
bool clear_path ) const
{
tripoint inv_pos = src_pos;
if( src_pos == tripoint_zero ) {
Expand All @@ -561,7 +554,7 @@ const inventory &Character::crafting_inventory( const tripoint &src_pos, int rad
cached_crafting_inventory->form_from_map( inv_pos, radius, this, false, clear_path );
}

for( const item_location &it : all_items_loc() ) {
for( const item_location &it : const_cast<Character *>( this )->all_items_loc() ) {
// can't craft with containers that have items in them
if( !it->contents.empty_container() ) {
continue;
Expand Down Expand Up @@ -1020,14 +1013,7 @@ double Character::crafting_success_roll( const recipe &making ) const
return 2;
}

float prof_multiplier = 1.0f;
for( const recipe_proficiency &recip : making.proficiencies ) {
if( !recip.required && !has_proficiency( recip.id ) ) {
prof_multiplier *= recip.fail_multiplier;
}
}

return ( skill_roll / diff_roll ) / prof_multiplier;
return ( skill_roll / diff_roll ) / making.proficiency_failure_maluses( *this );
}

int item::get_next_failure_point() const
Expand Down
2 changes: 1 addition & 1 deletion src/item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10770,7 +10770,7 @@ units::volume item::get_selected_stack_volume( const std::map<const item *, int>
return 0_ml;
}

int item::get_recursive_disassemble_moves( Character &guy ) const
int item::get_recursive_disassemble_moves( const Character &guy ) const
{
int moves = recipe_dictionary::get_uncraft( type->get_id() ).time_to_craft_moves( guy,
recipe_time_flag::ignore_proficiencies );
Expand Down
2 changes: 1 addition & 1 deletion src/item.h
Original file line number Diff line number Diff line change
Expand Up @@ -2211,7 +2211,7 @@ class item : public visitable
* @param guy The character performing the disassembly
* @return The number of moves to recursively disassemble this item
*/
int get_recursive_disassemble_moves( Character &guy ) const;
int get_recursive_disassemble_moves( const Character &guy ) const;

// inherited from visitable
VisitResponse visit_items( const std::function<VisitResponse( item *, item * )> &func ) const
Expand Down
14 changes: 7 additions & 7 deletions src/recipe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ static const itype_id itype_hotplate( "hotplate" );

recipe::recipe() : skill_used( skill_id::NULL_ID() ) {}

time_duration recipe::batch_duration( Character &guy, int batch, float multiplier,
time_duration recipe::batch_duration( const Character &guy, int batch, float multiplier,
size_t assistants ) const
{
return time_duration::from_turns( batch_time( guy, batch, multiplier, assistants ) / 100 );
Expand All @@ -57,20 +57,20 @@ static bool helpers_have_proficiencies( const Character &guy, const proficiency_
return false;
}

time_duration recipe::time_to_craft( Character &guy, recipe_time_flag flags ) const
time_duration recipe::time_to_craft( const Character &guy, recipe_time_flag flags ) const
{
return time_duration::from_moves( time_to_craft_moves( guy, flags ) );
}

int64_t recipe::time_to_craft_moves( Character &guy, recipe_time_flag flags ) const
int64_t recipe::time_to_craft_moves( const Character &guy, recipe_time_flag flags ) const
{
if( flags == recipe_time_flag::ignore_proficiencies ) {
return time;
}
return time * proficiency_time_maluses( guy );
}

int64_t recipe::batch_time( Character &guy, int batch, float multiplier,
int64_t recipe::batch_time( const Character &guy, int batch, float multiplier,
size_t assistants ) const
{
// 1.0f is full speed
Expand Down Expand Up @@ -649,7 +649,7 @@ std::string recipe::used_proficiencies_string( const Character *c ) const
return used;
}

std::string recipe::missing_proficiencies_string( Character *c ) const
std::string recipe::missing_proficiencies_string( const Character *c ) const
{
if( c == nullptr ) {
return { };
Expand Down Expand Up @@ -728,7 +728,7 @@ std::set<proficiency_id> recipe::assist_proficiencies() const
return ret;
}

float recipe::proficiency_time_maluses( Character &guy ) const
float recipe::proficiency_time_maluses( const Character &guy ) const
{
float total_malus = 1.0f;
for( const recipe_proficiency &prof : proficiencies ) {
Expand All @@ -742,7 +742,7 @@ float recipe::proficiency_time_maluses( Character &guy ) const
return total_malus;
}

float recipe::proficiency_failure_maluses( Character &guy ) const
float recipe::proficiency_failure_maluses( const Character &guy ) const
{
float total_malus = 1.0f;
for( const recipe_proficiency &prof : proficiencies ) {
Expand Down
14 changes: 7 additions & 7 deletions src/recipe.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ class recipe
// Format the proficiencies string.
std::string required_proficiencies_string( const Character *c ) const;
std::string used_proficiencies_string( const Character *c ) const;
std::string missing_proficiencies_string( Character *c ) const;
std::string missing_proficiencies_string( const Character *c ) const;
// Proficiencies for search
std::string recipe_proficiencies_string() const;
// Required proficiencies
Expand All @@ -184,9 +184,9 @@ class recipe
// Helpful proficiencies
std::set<proficiency_id> assist_proficiencies() const;
// The time malus due to proficiencies lacking
float proficiency_time_maluses( Character &guy ) const;
float proficiency_time_maluses( const Character &guy ) const;
// The failure malus due to proficiencies lacking
float proficiency_failure_maluses( Character &guy ) const;
float proficiency_failure_maluses( const Character &guy ) const;

// How active of exercise this recipe is
float exertion_level() const;
Expand All @@ -208,13 +208,13 @@ class recipe

bool has_byproducts() const;

int64_t batch_time( Character &guy, int batch, float multiplier, size_t assistants ) const;
time_duration batch_duration( Character &guy, int batch = 1, float multiplier = 1.0,
int64_t batch_time( const Character &guy, int batch, float multiplier, size_t assistants ) const;
time_duration batch_duration( const Character &guy, int batch = 1, float multiplier = 1.0,
size_t assistants = 0 ) const;

time_duration time_to_craft( Character &guy,
time_duration time_to_craft( const Character &guy,
recipe_time_flag flags = recipe_time_flag::none ) const;
int64_t time_to_craft_moves( Character &guy,
int64_t time_to_craft_moves( const Character &guy,
recipe_time_flag flags = recipe_time_flag::none ) const;

bool has_flag( const std::string &flag_name ) const;
Expand Down

0 comments on commit 36c62f9

Please sign in to comment.