ammunition_information calc_ammo_info(const const_entity_handle item) { auto out = calc_reloadable_ammo_info(item); auto count_for = [&](const auto slot) { if (slot.alive()) { ensure(slot->has_limited_space()); out.total_charges += count_charges_inside(slot); out.total_ammo_space += slot->space_available; out.available_ammo_space += slot.calc_local_space_available(); } }; const auto chamber = item[slot_function::GUN_CHAMBER]; const auto chamber_mag = item[slot_function::GUN_CHAMBER_MAGAZINE]; count_for(chamber); if (chamber_mag && chamber) { if (const auto gun = item.find<invariants::gun>()) { if (!gun->allow_charge_in_chamber_magazine_when_chamber_loaded) { out.available_ammo_space -= chamber_mag.calc_space_occupied_by_children(); out.total_charges += count_charges_inside(chamber_mag); } else { count_for(chamber_mag); } } } return out; }
int count_charges_in_deposit(const const_entity_handle item) { return count_charges_inside(item[slot_function::ITEM_DEPOSIT]); }