diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 392908127d0..4a67b7626d4 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -182,6 +182,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 3
job = list("Clown")
+/datum/uplink_item/jobspecific/trick_revolver
+ name = "Trick Revolver"
+ desc = "A revolver that will fire backwards and kill whoever attempts to use it. Perfect for those pesky vigilante or just a good laugh."
+ reference = "CTR"
+ item = /obj/item/toy/russian_revolver/trick_revolver
+ cost = 1
+ job = list("Clown")
+
//mime
/datum/uplink_item/jobspecific/caneshotgun
name = "Cane Shotgun and Assassination Shells"
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 9150f25736a..aff40200c6b 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -1,12 +1,12 @@
-/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
- var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
+/mob/proc/rightandwrong(summon_type, revolver_fight = FALSE, fake_revolver_fight = FALSE) //0 = Summon Guns, 1 = Summon Magic
+ var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam", "fakerevolver")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic")
to_chat(usr, "You summoned [summon_type ? "magic" : "guns"]!")
- message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!")
+ message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]! ([revolver_fight ? "Revolver duel!" : ""] [fake_revolver_fight ? "Suicidal revolver duel!" : ""])")
for(var/mob/living/carbon/human/H in GLOB.player_list)
if(H.stat == 2 || !(H.client))
@@ -17,6 +17,13 @@
var/randomizeguns = pick(gunslist)
var/randomizemagic = pick(magiclist)
var/randomizemagicspecial = pick(magicspeciallist)
+ if(revolver_fight)
+ randomizeguns = "revolver"
+ if(fake_revolver_fight)
+ if(prob(50))
+ randomizeguns = "revolver"
+ else
+ randomizeguns = "fakerevolver"
if(!summon_type)
switch(randomizeguns)
if("taser")
@@ -88,6 +95,8 @@
new /obj/item/gun/projectile/revolver/grenadelauncher(get_turf(H))
if("medibeam")
new /obj/item/gun/medbeam(get_turf(H))
+ if("fakerevolver")
+ new /obj/item/toy/russian_revolver/trick_revolver(get_turf(H)) //lol
playsound(get_turf(H), 'sound/magic/summon_guns.ogg', 50, 1)
else
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 7607ca52319..c719dfe6ad4 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1372,7 +1372,8 @@ obj/item/toy/cards/deck/syndicate/black
force = 5
origin_tech = "combat=1"
attack_verb = list("struck", "hit", "bashed")
- var/bullet_position = 1
+ var/bullets_left = 0
+ var/max_shots = 6
/obj/item/toy/russian_revolver/suicide_act(mob/user)
user.visible_message("[user] quickly loads six bullets into [src]'s cylinder and points it at [user.p_their()] head before pulling the trigger! It looks like [user.p_theyre()] trying to commit suicide.")
@@ -1380,46 +1381,70 @@ obj/item/toy/cards/deck/syndicate/black
return BRUTELOSS
/obj/item/toy/russian_revolver/New()
- spin_cylinder()
..()
-
+ spin_cylinder()
/obj/item/toy/russian_revolver/attack_self(mob/user)
- if(!bullet_position)
- user.visible_message("[user] loads a bullet into [src]'s cylinder.")
- bullet_position = 1
- else
+ if(!bullets_left)
+ user.visible_message("[user] loads a bullet into [src]'s cylinder before spinning it.")
spin_cylinder()
- user.visible_message("[user] spins the cylinder on [src]!")
-
-/obj/item/toy/russian_revolver/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
- if(M != user) //can't use this on other people
- return ..()
- if(!bullet_position)
- to_chat(user, "[src] is empty.")
- return
- if(!(user.has_organ("head"))) //For sanity
- to_chat(user, "Playing this game without a head would be classed as cheating.")
- return
- user.visible_message("[user] points [src] at [user.p_their()] head, ready to pull the trigger!")
- if(do_after(user, 30, target = user))
- if(bullet_position > 1)
- user.visible_message("*click*")
- playsound(src, 'sound/weapons/empty.ogg', 100, 1)
- bullet_position--
- return
- else
- bullet_position = null
- playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1)
- user.visible_message("[src] goes off!")
- user.apply_damage(200, BRUTE, "head", sharp = 1, used_weapon = "Self-inflicted gunshot wound to the head.")
- user.death()
else
- user.visible_message("[user] lowers [src] from [user.p_their()] head.")
+ user.visible_message("[user] spins the cylinder on [src]!")
+ spin_cylinder()
+
+/obj/item/toy/russian_revolver/attack(mob/M, mob/living/user)
+ return
+
+/obj/item/toy/russian_revolver/afterattack(atom/target, mob/user, proximity)
+ shoot_gun(user)
/obj/item/toy/russian_revolver/proc/spin_cylinder()
- bullet_position = rand(1,6)
+ bullets_left = rand(1, max_shots)
+/obj/item/toy/russian_revolver/proc/post_shot(mob/user)
+ return
+
+/obj/item/toy/russian_revolver/proc/shoot_gun(mob/living/carbon/human/user)
+ if(bullets_left > 1)
+ bullets_left--
+ user.visible_message("*click*")
+ playsound(src, 'sound/weapons/empty.ogg', 100, 1)
+ return FALSE
+ if(bullets_left == 1)
+ bullets_left = 0
+ var/zone = "head"
+ if(!(user.has_organ(zone))) // If they somehow don't have a head.
+ zone = "chest"
+ playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1)
+ user.visible_message("[src] goes off!")
+ post_shot(user)
+ user.apply_damage(300, BRUTE, zone, sharp = TRUE, used_weapon = "Self-inflicted gunshot wound to the [zone].")
+ user.bleed(BLOOD_VOLUME_NORMAL)
+ user.death() // Just in case
+ return TRUE
+ else
+ to_chat(user, "[src] needs to be reloaded.")
+ return FALSE
+
+/obj/item/toy/russian_revolver/trick_revolver
+ name = "\improper .357 revolver"
+ desc = "A suspicious revolver. Uses .357 ammo."
+ icon_state = "revolver"
+ max_shots = 1
+ var/fake_bullets = 0
+
+/obj/item/toy/russian_revolver/trick_revolver/New()
+ ..()
+ fake_bullets = rand(2, 7)
+
+/obj/item/toy/russian_revolver/trick_revolver/examine(mob/user) //Sneaky sneaky
+ ..()
+ to_chat(user, "Has [fake_bullets] round\s remaining.")
+ to_chat(user, "[fake_bullets] of those are live rounds.")
+
+/obj/item/toy/russian_revolver/trick_revolver/post_shot(user)
+ to_chat(user, "[src] did look pretty dodgey!")
+ SEND_SOUND(user, 'sound/misc/sadtrombone.ogg') //HONK
/*
* Rubber Chainsaw
*/
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index fe487ae6431..cec31ffc2ac 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -113,7 +113,9 @@
Japanese Animes Mode
Egalitarian Station Mode
Summon Guns
- Summon Magic
+ Summon Magic
+ Summon Revolver Duel
+ Summon Suicidal Revolver Duel
Roll the Dice
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 03d2940b32d..62ef01eecec 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2843,11 +2843,19 @@
if("guns")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","SG")
- usr.rightandwrong(0)
+ usr.rightandwrong(FALSE)
if("magic")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","SM")
- usr.rightandwrong(1)
+ usr.rightandwrong(TRUE)
+ if("revolver")
+ feedback_inc("admin_secrets_fun_used", 1)
+ feedback_add_details("admin_secrets_fun_used", "SRD")
+ usr.rightandwrong(FALSE, revolver_fight = TRUE)
+ if("fakerevolver")
+ feedback_inc("admin_secrets_fun_used", 1)
+ feedback_add_details("admin_secrets_fun_used", "SFD")
+ usr.rightandwrong(FALSE, fake_revolver_fight = TRUE)
if("tdomereset")
var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
if(delete_mobs == "Cancel")
diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm
index 98f60d01ac4..286391f1387 100644
--- a/code/modules/examine/descriptions/weapons.dm
+++ b/code/modules/examine/descriptions/weapons.dm
@@ -55,6 +55,11 @@
then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \
shells into the gun."
+/obj/item/toy/russian_revolver/trick_revolver //oh no
+ description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \
+ then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \
+ will tell you what caliber you need."
+
//*******
//*Melee*
//*******