//Boxes of ammo /obj/item/ammo_box name = "ammo box (null_reference_exception)" desc = "A box of ammo." icon_state = "357" icon = 'icons/obj/ammo.dmi' flags_1 = CONDUCT_1 slot_flags = SLOT_BELT item_state = "syringe_kit" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' materials = list(MAT_METAL=30000) throwforce = 2 w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 var/list/stored_ammo = list() var/ammo_type = /obj/item/ammo_casing var/max_ammo = 7 var/multiple_sprites = 0 var/caliber var/multiload = 1 var/start_empty = 0 /obj/item/ammo_box/New() ..() if(!start_empty) for(var/i = 1, i <= max_ammo, i++) stored_ammo += new ammo_type(src) update_icon() /obj/item/ammo_box/proc/get_round(keep = 0) if (!stored_ammo.len) return null else var/b = stored_ammo[stored_ammo.len] stored_ammo -= b if (keep) stored_ammo.Insert(1,b) return b /obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type. if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) return 0 if (stored_ammo.len < max_ammo) stored_ammo += R R.forceMove(src) return 1 //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo else if(replace_spent) for(var/obj/item/ammo_casing/AC in stored_ammo) if(!AC.BB)//found a spent ammo stored_ammo -= AC AC.forceMove(get_turf(src.loc)) stored_ammo += R R.forceMove(src) return 1 return 0 /obj/item/ammo_box/proc/can_load(mob/user) return 1 /obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = 0, replace_spent = 0) var/num_loaded = 0 if(!can_load(user)) return if(istype(A, /obj/item/ammo_box)) var/obj/item/ammo_box/AM = A for(var/obj/item/ammo_casing/AC in AM.stored_ammo) var/did_load = give_round(AC, replace_spent) if(did_load) AM.stored_ammo -= AC num_loaded++ if(!did_load || !multiload) break if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/AC = A if(give_round(AC, replace_spent)) user.transferItemToLoc(AC, src, TRUE) num_loaded++ if(num_loaded) if(!silent) to_chat(user, "You load [num_loaded] shell\s into \the [src]!") playsound(user, 'sound/weapons/bulletinsert.ogg', 60, 1) A.update_icon() update_icon() return num_loaded /obj/item/ammo_box/attack_self(mob/user) var/obj/item/ammo_casing/A = get_round() if(A) user.put_in_hands(A) to_chat(user, "You remove a round from \the [src]!") playsound(user, 'sound/weapons/bulletremove.ogg', 60, 1) update_icon() /obj/item/ammo_box/update_icon() switch(multiple_sprites) if(1) icon_state = "[initial(icon_state)]-[stored_ammo.len]" if(2) icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!" //Behavior for magazines /obj/item/ammo_box/magazine/proc/ammo_count() return stored_ammo.len /obj/item/ammo_box/magazine/proc/empty_magazine() var/turf_mag = get_turf(src) for(var/obj/item/ammo in stored_ammo) ammo.forceMove(turf_mag) stored_ammo -= ammo