/obj/item/weapon/gun/projectile/revolver name = "\improper .357 revolver" desc = "A suspicious revolver. Uses .357 ammo." icon_state = "revolver" mag_type = /obj/item/ammo_box/magazine/internal/cylinder /obj/item/weapon/gun/projectile/revolver/New() ..() if(!istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder)) verbs -= /obj/item/weapon/gun/projectile/revolver/verb/spin /obj/item/weapon/gun/projectile/revolver/chamber_round(var/spin = 1) if(spin) chambered = magazine.get_round(1) else chambered = magazine.stored_ammo[1] return /obj/item/weapon/gun/projectile/revolver/shoot_with_empty_chamber(mob/living/user as mob|obj) ..() chamber_round(1) /obj/item/weapon/gun/projectile/revolver/process_chamber() return ..(0, 1) /obj/item/weapon/gun/projectile/revolver/attackby(obj/item/A, mob/user, params) . = ..() if(.) return var/num_loaded = magazine.attackby(A, user, params, 1) if(num_loaded) to_chat(user, "You load [num_loaded] shell\s into \the [src].") A.update_icon() update_icon() chamber_round(0) /obj/item/weapon/gun/projectile/revolver/attack_self(mob/living/user) var/num_unloaded = 0 chambered = null while(get_ammo() > 0) var/obj/item/ammo_casing/CB CB = magazine.get_round(0) if(CB) CB.loc = get_turf(loc) CB.SpinAnimation(10, 1) CB.update_icon() num_unloaded++ if(num_unloaded) to_chat(user, "You unload [num_unloaded] shell\s from [src].") else to_chat(user, "[src] is empty!") /obj/item/weapon/gun/projectile/revolver/verb/spin() set name = "Spin Chamber" set category = "Object" set desc = "Click to spin your revolver's chamber." var/mob/M = usr if(M.stat || !in_range(M,src)) return if(istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder)) var/obj/item/ammo_box/magazine/internal/cylinder/C = magazine C.spin() chamber_round(0) playsound(loc, 'sound/weapons/revolver_spin.ogg', 50, 1) usr.visible_message("[usr] spins [src]'s chamber.", "You spin [src]'s chamber.") else verbs -= /obj/item/weapon/gun/projectile/revolver/verb/spin /obj/item/weapon/gun/projectile/revolver/can_shoot() return get_ammo(0,0) /obj/item/weapon/gun/projectile/revolver/get_ammo(countchambered = 0, countempties = 1) var/boolets = 0 //mature var names for mature people if(chambered && countchambered) boolets++ if(magazine) boolets += magazine.ammo_count(countempties) return boolets /obj/item/weapon/gun/projectile/revolver/examine(mob/user) ..() to_chat(user, "[get_ammo(0,0)] of those are live rounds.") /obj/item/weapon/gun/projectile/revolver/detective desc = "A cheap Martian knock-off of a classic law enforcement firearm. Uses .38-special rounds." name = "\improper .38 Mars Special" icon_state = "detective" origin_tech = "combat=2;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 unique_rename = 1 unique_reskin = 1 /obj/item/weapon/gun/projectile/revolver/detective/New() ..() options["The Original"] = "detective" options["Leopard Spots"] = "detective_leopard" options["Black Panther"] = "detective_panther" options["Gold Trim"] = "detective_gold" options["The Peacemaker"] = "detective_peacemaker" options["Cancel"] = null /obj/item/weapon/gun/projectile/revolver/detective/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override = "") if(magazine.caliber != initial(magazine.caliber)) if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 playsound(user, fire_sound, 50, 1) to_chat(user, "[src] blows up in your face!") user.take_organ_damage(0,20) user.unEquip(src) return 0 ..() /obj/item/weapon/gun/projectile/revolver/detective/attackby(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/weapon/screwdriver)) if(magazine.caliber == "38") to_chat(user, "You begin to reinforce the barrel of [src]...") if(magazine.ammo_count()) afterattack(user, user) //you know the drill user.visible_message("[src] goes off!", "[src] goes off in your face!") return if(do_after(user, 30 * A.toolspeed, target = src)) if(magazine.ammo_count()) to_chat(user, "You can't modify it!") return magazine.caliber = "357" desc = "The barrel and chamber assembly seems to have been modified." to_chat(user, "You reinforce the barrel of [src]. Now it will fire .357 rounds.") else to_chat(user, "You begin to revert the modifications to [src]...") if(magazine.ammo_count()) afterattack(user, user) //and again user.visible_message("[src] goes off!", "[src] goes off in your face!") return if(do_after(user, 30 * A.toolspeed, target = src)) if(magazine.ammo_count()) to_chat(user, "You can't modify it!") return magazine.caliber = "38" desc = initial(desc) to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.") /obj/item/weapon/gun/projectile/revolver/mateba name = "\improper Unica 6 auto-revolver" desc = "A retro high-powered autorevolver typically used by officers of the New Russia military. Uses .357 ammo." //>10mm hole >.357 icon_state = "mateba" origin_tech = "combat=2;materials=2" /obj/item/weapon/gun/projectile/revolver/golden name = "\improper Golden revolver" desc = "This ain't no game, ain't never been no show, And I'll gladly gun down the oldest lady you know. Uses .357 ammo." icon_state = "goldrevolver" fire_sound = 'sound/weapons/resonator_blast.ogg' recoil = 8 /obj/item/weapon/gun/projectile/revolver/nagant name = "nagant revolver" desc = "An old model of revolver that originated in Russia. Able to be suppressed. Uses 7.62x38mmR ammo." icon_state = "nagant" origin_tech = "combat=3" can_suppress = 1 mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev762 // A gun to play Russian Roulette! // You can spin the chamber to randomize the position of the bullet. /obj/item/weapon/gun/projectile/revolver/russian name = "\improper Russian Revolver" desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism that spins the chamber before each trigger pull." origin_tech = "combat=2;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/rus357 var/spun = 0 /obj/item/weapon/gun/projectile/revolver/russian/New() ..() Spin() update_icon() /obj/item/weapon/gun/projectile/revolver/russian/proc/Spin() chambered = null var/random = rand(1, magazine.max_ammo) if(random <= get_ammo(0,0)) chamber_round() spun = 1 /obj/item/weapon/gun/projectile/revolver/russian/attackby(obj/item/A, mob/user, params) var/num_loaded = ..() if(num_loaded) user.visible_message("[user] loads a single bullet into the revolver and spins the chamber.", "You load a single bullet into the chamber and spin it.") else user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") if(get_ammo() > 0) Spin() update_icon() A.update_icon() return /obj/item/weapon/gun/projectile/revolver/russian/attack_self(mob/user) if(!spun && can_shoot()) user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") Spin() else var/num_unloaded = 0 while(get_ammo() > 0) var/obj/item/ammo_casing/CB CB = magazine.get_round() chambered = null CB.loc = get_turf(loc) CB.update_icon() num_unloaded++ if(num_unloaded) to_chat(user, "You unload [num_unloaded] shell\s from [src].") else to_chat(user, "[src] is empty.") /obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) if(flag) if(!(target in user.contents) && ismob(target)) if(user.a_intent == "harm") // Flogging action return if(isliving(user)) if(!can_trigger_gun(user)) return if(target != user) if(ismob(target)) to_chat(user, "A mechanism prevents you from shooting anyone but yourself!") return if(ishuman(user)) if(!spun) to_chat(user, "You need to spin the revolver's chamber first!") return spun = 0 if(chambered) var/obj/item/ammo_casing/AC = chambered if(AC.fire(user, user)) playsound(user, fire_sound, 50, 1) var/zone = check_zone(user.zone_sel.selecting) if(zone == "head" || zone == "eyes" || zone == "mouth") shoot_self(user, zone) else user.visible_message("[user.name] cowardly fires [src] at \his [zone]!", "You cowardly fire [src] at your [zone]!", "You hear a gunshot!") return user.visible_message("*click*") playsound(user, 'sound/weapons/empty.ogg', 100, 1) /obj/item/weapon/gun/projectile/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = "head") user.apply_damage(300, BRUTE, affecting) user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a gunshot!") /obj/item/weapon/gun/projectile/revolver/capgun name = "cap gun" desc = "Looks almost like the real thing! Ages 8 and up." origin_tech = "combat=1;materials=1" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/cap ///////////////////////////// // DOUBLE BARRELED SHOTGUN // ///////////////////////////// /obj/item/weapon/gun/projectile/revolver/doublebarrel name = "double-barreled shotgun" desc = "A true classic." icon_state = "dshotgun" item_state = "shotgun" w_class = 4 force = 10 flags = CONDUCT slot_flags = SLOT_BACK origin_tech = "combat=3;materials=1" mag_type = /obj/item/ammo_box/magazine/internal/shot/dual sawn_desc = "Omar's coming!" unique_rename = 1 unique_reskin = 1 /obj/item/weapon/gun/projectile/revolver/doublebarrel/New() ..() options["Default"] = "dshotgun" options["Dark Red Finish"] = "dshotgun-d" options["Ash"] = "dshotgun-f" options["Faded Grey"] = "dshotgun-g" options["Maple"] = "dshotgun-l" options["Rosewood"] = "dshotgun-p" options["Cancel"] = null /obj/item/weapon/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) chamber_round() if(istype(A, /obj/item/weapon/melee/energy)) var/obj/item/weapon/melee/energy/W = A if(W.active) sawoff(user) if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/gun/energy/plasmacutter)) sawoff(user) /obj/item/weapon/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user) var/num_unloaded = 0 while(get_ammo() > 0) var/obj/item/ammo_casing/CB CB = magazine.get_round(0) chambered = null CB.loc = get_turf(loc) CB.update_icon() num_unloaded++ if(num_unloaded) to_chat(user, "You break open \the [src] and unload [num_unloaded] shell\s.") else to_chat(user, "[src] is empty.") /obj/item/weapon/gun/projectile/revolver/doublebarrel/isHandgun() //contrary to popular opinion, double barrels are not, shockingly, handguns return 0 // IMPROVISED SHOTGUN // /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised name = "improvised shotgun" desc = "Essentially a tube that aims shotgun shells." icon_state = "ishotgun" item_state = "shotgun" w_class = 4 force = 10 slot_flags = null origin_tech = "combat=2;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm just here for the gasoline." unique_rename = 0 unique_reskin = 0 var/slung = 0 /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/stack/cable_coil) && !sawn_state) var/obj/item/stack/cable_coil/C = A if(C.use(10)) slot_flags = SLOT_BACK icon_state = "ishotgunsling" to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.") slung = 1 update_icon() else to_chat(user, "You need at least ten lengths of cable if you want to make a sling.") return /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/update_icon() ..() if(slung && (slot_flags & SLOT_BELT) ) slung = 0 icon_state = "ishotgun-sawn" /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/sawoff(mob/user) . = ..() if(. && slung) //sawing off the gun removes the sling new /obj/item/stack/cable_coil(get_turf(src), 10) slung = 0 update_icon() //caneshotgun /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane name = "cane" desc = "A cane used by a true gentleman. Or a clown." icon = 'icons/obj/weapons.dmi' lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' icon_state = "cane" item_state = "stick" sawn_state = SAWN_OFF w_class = 2 force = 10 can_unsuppress = 0 slot_flags = null origin_tech = "" // NO GIVAWAYS mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm sorry, but why did you saw your cane in the first place?" attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") fire_sound = 'sound/weapons/Gunshot_silenced.ogg' suppressed = 1 needs_permit = 0 //its just a cane beepsky..... /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/is_crutch() return 1 /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/update_icon() return /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/stack/cable_coil)) return /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/examine(mob/user) // HAD TO REPEAT EXAMINE CODE BECAUSE GUN CODE DOESNT STEALTH var/f_name = "\a [src]." if(blood_DNA && !istype(src, /obj/effect/decal)) if(gender == PLURAL) f_name = "some " else f_name = "a " f_name += "blood-stained [name]!" to_chat(user, "[bicon(src)] That's [f_name]") if(desc) to_chat(user, desc)