From c12aefbdcb1ee2c0407c1c925b8767302059f49d Mon Sep 17 00:00:00 2001 From: Fris0uman Date: Sun, 15 Nov 2020 11:01:01 +0100 Subject: [PATCH 1/6] Check Software container in count_items --- src/mission.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/mission.cpp b/src/mission.cpp index 1772ed4077c1a..59dc795d23581 100644 --- a/src/mission.cpp +++ b/src/mission.cpp @@ -399,11 +399,20 @@ bool mission::is_complete( const character_id &_npc_id ) const map &here = get_map(); int found_quantity = 0; bool charges = item_sought.count_by_charges(); - auto count_items = [this, &found_quantity, &player_character, charges]( item_stack && items ) { + bool software = item_sought.is_software(); + auto count_items = [this, &found_quantity, &player_character, charges, software]( item_stack && + items ) { for( const item &i : items ) { if( !i.is_owned_by( player_character, true ) ) { continue; } + if( software ) { + for( const item *soft : i.softwares() ) { + if( soft->typeId() == type->item_id ) { + found_quantity ++; + } + } + } if( charges ) { found_quantity += i.charges_of( type->item_id, item_count - found_quantity ); } else { From f0b037b70c43ba0235e4a5c63719d58428e37c4d Mon Sep 17 00:00:00 2001 From: Fris0uman Date: Sun, 15 Nov 2020 11:46:53 +0100 Subject: [PATCH 2/6] Also count softwares in players pockets --- src/mission.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/mission.cpp b/src/mission.cpp index 59dc795d23581..4b64977393692 100644 --- a/src/mission.cpp +++ b/src/mission.cpp @@ -434,6 +434,17 @@ bool mission::is_complete( const character_id &_npc_id ) const } } } + if( software ) { + for( const item_location &it_loc : player_character.all_items_loc() ) { + if( it_loc->is_software_storage() ) { + for( const item *soft : it_loc->softwares() ) { + if( soft->typeId() == type->item_id ) { + found_quantity++; + } + } + } + } + } if( charges ) { return player_character.charges_of( type->item_id ) + found_quantity >= item_count; } else { From b117e43679e18010b1142dee274c585103916acd Mon Sep 17 00:00:00 2001 From: Fris0uman Date: Thu, 19 Nov 2020 21:02:28 +0100 Subject: [PATCH 3/6] count_softwares --- src/character.cpp | 15 +++++++++++++++ src/character.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/character.cpp b/src/character.cpp index 0463ed16e8b01..82087d1cc7ebe 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -2683,6 +2683,21 @@ int Character::amount_worn( const itype_id &id ) const return amount; } +int Character::count_softwares( const itype_id &id ) +{ + int count = 0; + for( const item_location &it_loc : all_items_loc() ) { + if( it_loc->is_software_storage() ) { + for( const item *soft : it_loc->softwares() ) { + if( soft->typeId() == id ) { + count++; + } + } + } + } + return count; +} + std::vector Character::nearby( const std::function &func, int radius ) const { diff --git a/src/character.h b/src/character.h index 12c5313497681..310cfbf8aa967 100644 --- a/src/character.h +++ b/src/character.h @@ -1437,6 +1437,9 @@ class Character : public Creature, public visitable /** Returns the amount of item `type' that is currently worn */ int amount_worn( const itype_id &id ) const; + /** Returns the amount of software `type' that are in the inventory */ + int count_softwares( const itype_id &id ); + /** Returns nearby items which match the provided predicate */ std::vector nearby( const std::function &func, int radius = 1 ) const; From b87b00f3d0822bfaaf7e5dd344e88370419ffb93 Mon Sep 17 00:00:00 2001 From: Fris0uman Date: Thu, 19 Nov 2020 21:02:48 +0100 Subject: [PATCH 4/6] find softwares hidden in pocketses --- src/crafting.cpp | 6 +++++- src/mission.cpp | 10 +--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/crafting.cpp b/src/crafting.cpp index 7050d20601029..40f1ead1bffca 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -1521,7 +1521,11 @@ comp_selection Character::select_item_component( const std::vector 0 ) { + player_has.push_back( component ); + found = true; + } else if( has_amount( type, count, false, filter ) ) { player_has.push_back( component ); found = true; } diff --git a/src/mission.cpp b/src/mission.cpp index 4b64977393692..ece241917f929 100644 --- a/src/mission.cpp +++ b/src/mission.cpp @@ -435,15 +435,7 @@ bool mission::is_complete( const character_id &_npc_id ) const } } if( software ) { - for( const item_location &it_loc : player_character.all_items_loc() ) { - if( it_loc->is_software_storage() ) { - for( const item *soft : it_loc->softwares() ) { - if( soft->typeId() == type->item_id ) { - found_quantity++; - } - } - } - } + found_quantity += player_character.count_softwares( type->item_id ); } if( charges ) { return player_character.charges_of( type->item_id ) + found_quantity >= item_count; From 44e642833244affaefd206db93de31ec5a9ed98f Mon Sep 17 00:00:00 2001 From: Fris0uman Date: Sat, 28 Nov 2020 23:39:02 +0100 Subject: [PATCH 5/6] Consume software container upon returning software for a quest --- src/character.h | 1 + src/crafting.cpp | 18 ++++++++++++++++++ src/mission.cpp | 17 +++++++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/character.h b/src/character.h index 310cfbf8aa967..9228d77e2a3d3 100644 --- a/src/character.h +++ b/src/character.h @@ -2533,6 +2533,7 @@ class Character : public Creature, public visitable const tripoint &origin = tripoint_zero, int radius = PICKUP_RANGE ); std::list consume_items( const std::vector &components, int batch = 1, const std::function &filter = return_true ); + bool consume_software_container( const itype_id &software_id ); comp_selection select_tool_component( const std::vector &tools, int batch, inventory &map_inv, bool can_cancel = false, bool player_inv = true, diff --git a/src/crafting.cpp b/src/crafting.cpp index 40f1ead1bffca..db93f46b7de7c 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -1736,6 +1736,24 @@ std::list Character::consume_items( const std::vector &componen filter ); } +bool Character::consume_software_container( const itype_id &software_id ) +{ + for( auto it = all_items_loc().begin(); it != all_items_loc().end(); ++it ) { + if( !it->get_item() ) { + continue; + } + if( it->get_item()->is_software_storage() ) { + for( const item *soft : it->get_item()->softwares() ) { + if( soft->typeId() == software_id ) { + it->remove_item(); + return true; + } + } + } + } + return false; +} + comp_selection Character::select_tool_component( const std::vector &tools, int batch, inventory &map_inv, bool can_cancel, bool player_inv, diff --git a/src/mission.cpp b/src/mission.cpp index ece241917f929..28be9458fd791 100644 --- a/src/mission.cpp +++ b/src/mission.cpp @@ -297,6 +297,7 @@ void mission::wrap_up() status = mission_status::success; player_character.on_mission_finished( *this ); std::vector comps; + const item item_sought( type->item_id ); switch( type->goal ) { case MGOAL_FIND_ITEM_GROUP: { inventory tmp_inv = player_character.crafting_inventory(); @@ -334,8 +335,20 @@ void mission::wrap_up() break; case MGOAL_FIND_ITEM: - comps.push_back( item_comp( type->item_id, item_count ) ); - player_character.consume_items( comps ); + if( item_sought.is_software() ) { + int consumed = 0; + while( consumed < item_count ) { + if( player_character.consume_software_container( type->item_id ) ) { + consumed++; + } else { + debugmsg( "Tried to consume more software %s than available", type->item_id.c_str() ); + break; + } + } + } else { + comps.push_back( item_comp( type->item_id, item_count ) ); + player_character.consume_items( comps ); + } break; case MGOAL_FIND_ANY_ITEM: player_character.remove_mission_items( uid ); From 18529187b152ea2f9ae3f8689449dd0d20a44c2f Mon Sep 17 00:00:00 2001 From: Fris0uman Date: Wed, 2 Dec 2020 18:54:36 +0100 Subject: [PATCH 6/6] use correct for loop --- src/crafting.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/crafting.cpp b/src/crafting.cpp index db93f46b7de7c..2a57a310f5db1 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -1738,14 +1738,14 @@ std::list Character::consume_items( const std::vector &componen bool Character::consume_software_container( const itype_id &software_id ) { - for( auto it = all_items_loc().begin(); it != all_items_loc().end(); ++it ) { - if( !it->get_item() ) { + for( item_location it : all_items_loc() ) { + if( !it.get_item() ) { continue; } - if( it->get_item()->is_software_storage() ) { - for( const item *soft : it->get_item()->softwares() ) { + if( it.get_item()->is_software_storage() ) { + for( const item *soft : it.get_item()->softwares() ) { if( soft->typeId() == software_id ) { - it->remove_item(); + it.remove_item(); return true; } }