void vehicle::turret_unload( vehicle_part &pt ) { item &gun = pt.base; if( !gun.is_gun() || gun.ammo_type() == "NULL" || gun.ammo_current() == "null" || gun.ammo_remaining() == 0 ) { return; } // return fuels to onboard vehicle tanks if( fuel_capacity( gun.ammo_current() ) > 0 ) { refill( gun.ammo_current(), gun.ammo_remaining() ); gun.ammo_unset(); return; } // otherwise unload to cargo space item ammo( gun.ammo_current(), calendar::turn, gun.ammo_remaining() ); gun.ammo_unset(); // @todo check ammo is not liquid or otherwise irrecoverable for( item &e : pt.items ) { if( e.merge_charges( ammo ) ) { return; } } pt.items.push_back( std::move( ammo ) ); }
Item_spawn_data::ItemList Item_group::create(int birthday, RecursionList &rec) const { ItemList result; if (type == G_COLLECTION) { for(prop_list::const_iterator a = items.begin(); a != items.end(); ++a) { if(rng(0, 99) >= (*a)->probability) { continue; } ItemList tmp = (*a)->create(birthday, rec); result.insert(result.end(), tmp.begin(), tmp.end()); } } else if (type == G_DISTRIBUTION) { int p = rng(0, sum_prob - 1); for(prop_list::const_iterator a = items.begin(); a != items.end(); ++a) { p -= (*a)->probability; if (p >= 0) { continue; } ItemList tmp = (*a)->create(birthday, rec); result.insert(result.end(), tmp.begin(), tmp.end()); break; } } if (with_ammo && !result.empty()) { it_gun *maybe_gun = dynamic_cast<it_gun *>(result.front().type); if (maybe_gun != NULL) { item ammo(default_ammo(maybe_gun->ammo), birthday); // TODO: change the spawn lists to contain proper references to containers ammo = ammo.in_its_container(); result.push_back(ammo); } } return result; }
ActorInventory::ActorInventory(const XMLNode &node) :Inventory(node), m_weapon(Item::dummyWeapon()), m_dummy_weapon(Item::dummyWeapon()), m_armour(Item::dummyArmour()), m_ammo{Item::dummyAmmo(), 0} { if(!node) return; XMLNode weapon_node = node.child("weapon"); XMLNode armour_node = node.child("armour"); XMLNode ammo_node = node.child("ammo"); if(weapon_node) m_weapon = Item(findProto(weapon_node.attrib("proto_id"), ProtoId::item_weapon)); if(armour_node) m_armour = Item(findProto(armour_node.attrib("proto_id"), ProtoId::item_armour)); if(ammo_node) { Item ammo(findProto(ammo_node.attrib("proto_id"), ProtoId::item_ammo)); int count = ammo_node.attrib<int>("count"); int id = add(ammo, count); equip(id, count); } }
Item_spawn_data::ItemList Item_group::create(int birthday, RecursionList &rec) const { ItemList result; if (type == G_COLLECTION) { for( const auto &elem : items ) { if( rng( 0, 99 ) >= ( elem )->probability ) { continue; } ItemList tmp = ( elem )->create( birthday, rec ); result.insert(result.end(), tmp.begin(), tmp.end()); } } else if (type == G_DISTRIBUTION) { int p = rng(0, sum_prob - 1); for( const auto &elem : items ) { p -= ( elem )->probability; if (p >= 0) { continue; } ItemList tmp = ( elem )->create( birthday, rec ); result.insert(result.end(), tmp.begin(), tmp.end()); break; } } if (with_ammo && !result.empty()) { const auto t = result.front().type; if( t->gun ) { const std::string ammoid = default_ammo( t->gun->ammo ); if ( !ammoid.empty() ) { item ammo( ammoid, birthday ); // TODO: change the spawn lists to contain proper references to containers ammo = ammo.in_its_container(); result.push_back( ammo ); } } } return result; }
static void testItemReload (void) { Inventory inv; const objDef_t* od, *ad; const invDef_t* container, *containerFrom; Item* addedItem; ResetInventoryList(); od = INVSH_GetItemByIDSilent("rpg"); CU_ASSERT_PTR_NOT_NULL(od); container = INVSH_GetInventoryDefinitionByID("right"); CU_ASSERT_PTR_NOT_NULL(container); Item item(od); CU_ASSERT(inv.containsItem(container->id, &item) == false); addedItem = i.addToInventory(&inv, &item, container, NONE, NONE, 1); CU_ASSERT_PTR_NOT_NULL(addedItem); CU_ASSERT(inv.containsItem(container->id, &item) == true); ad = INVSH_GetItemByIDSilent("rpg_ammo"); CU_ASSERT_PTR_NOT_NULL(ad); Item ammo(ad); containerFrom = INVSH_GetInventoryDefinitionByID("backpack"); CU_ASSERT_PTR_NOT_NULL(containerFrom); CU_ASSERT(inv.containsItem(containerFrom->id, &ammo) == false); addedItem = i.addToInventory(&inv, &ammo, containerFrom, NONE, NONE, 1); CU_ASSERT_PTR_NOT_NULL(addedItem); CU_ASSERT(inv.containsItem(containerFrom->id, &ammo) == true); CU_ASSERT_EQUAL(IA_RELOAD, i.moveInInventory(&inv, containerFrom, addedItem, container, NONE, NONE, nullptr, nullptr)); CU_ASSERT(inv.containsItem(containerFrom->id, &ammo) == false); item.setAmmoDef(ad); item.setAmmoLeft(1); CU_ASSERT(inv.containsItem(container->id, &item) == true); ad = INVSH_GetItemByIDSilent("rpg_incendiary_ammo"); CU_ASSERT_PTR_NOT_NULL(ad); Item ammoFrom(ad); CU_ASSERT(inv.containsItem(containerFrom->id, &ammoFrom) == false); addedItem = i.addToInventory(&inv, &ammoFrom, containerFrom, NONE, NONE, 1); CU_ASSERT_PTR_NOT_NULL(addedItem); CU_ASSERT(inv.containsItem(containerFrom->id, &ammoFrom) == true); CU_ASSERT_EQUAL(IA_RELOAD_SWAP, i.moveInInventory(&inv, containerFrom, addedItem, container, NONE, NONE, nullptr, nullptr)); CU_ASSERT(inv.containsItem(containerFrom->id, &ammoFrom) == false); CU_ASSERT(inv.containsItem(containerFrom->id, &ammo) == true); item.setAmmoDef(ad); CU_ASSERT(inv.containsItem(container->id, &item) == true); }