diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 6156ee1d86..ba8be95065 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -34,7 +34,9 @@
/obj/item/device/pda/ai,
/obj/item/device/pda/heads,
/obj/item/device/pda/clear,
- /obj/item/device/pda/syndicate)
+ /obj/item/device/pda/syndicate,
+ /obj/item/device/pda/chameleon,
+ /obj/item/device/pda/chameleon/broken)
for(var/P in typesof(/obj/item/device/pda) - blocked)
var/obj/item/device/pda/D = new P
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 0fc957fdca..1362721e1d 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -194,6 +194,10 @@
keyslot = new /obj/item/device/encryptionkey/headset_com
keyslot2 = new /obj/item/device/encryptionkey/headset_cent
+/obj/item/device/radio/headset/headset_cent/empty
+ keyslot = null
+ keyslot2 = null
+
/obj/item/device/radio/headset/headset_cent/commander
keyslot = new /obj/item/device/encryptionkey/heads/captain
diff --git a/code/game/objects/items/implants/implant_clown.dm b/code/game/objects/items/implants/implant_clown.dm
index 18a22c1e60..ae1fef109d 100644
--- a/code/game/objects/items/implants/implant_clown.dm
+++ b/code/game/objects/items/implants/implant_clown.dm
@@ -14,7 +14,7 @@
playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 0)
/obj/item/implanter/sad_trombone
- name = "implanter (sad_trombone)"
+ name = "implanter (sad trombone)"
imp_type = /obj/item/implant/sad_trombone
/obj/item/implantcase/sad_trombone
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 84cd51fe22..c1aa39ddb1 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -553,3 +553,16 @@
new /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka(src)
new /obj/item/reagent_containers/syringe/stimulants(src)
new /obj/item/grenade/syndieminibomb(src)
+
+// For ClownOps.
+/obj/item/storage/backpack/duffelbag/clown/syndie
+ slowdown = 0
+ silent = TRUE
+
+/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents()
+ new /obj/item/device/pda/clown(src)
+ new /obj/item/clothing/under/rank/clown(src)
+ new /obj/item/clothing/shoes/clown_shoes(src)
+ new /obj/item/clothing/mask/gas/clown_hat(src)
+ new /obj/item/bikehorn(src)
+ new /obj/item/implanter/sad_trombone(src)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index fb44d094c7..7ce832acd3 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -308,3 +308,27 @@
/obj/item/storage/box/syndie_kit/imp_radio/PopulateContents()
new /obj/item/implanter/radio(src)
+
+/obj/item/storage/box/syndie_kit/centcom_costume/PopulateContents()
+ new /obj/item/clothing/under/rank/centcom_officer(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/gloves/color/black(src)
+ new /obj/item/device/radio/headset/headset_cent/empty(src)
+ new /obj/item/clothing/glasses/sunglasses(src)
+ new /obj/item/storage/backpack/satchel(src)
+ new /obj/item/device/pda/heads(src)
+ new /obj/item/clipboard(src)
+
+/obj/item/storage/box/syndie_kit/chameleon/broken/PopulateContents()
+ new /obj/item/clothing/under/chameleon/broken(src)
+ new /obj/item/clothing/suit/chameleon/broken(src)
+ new /obj/item/clothing/gloves/chameleon/broken(src)
+ new /obj/item/clothing/shoes/chameleon/broken(src)
+ new /obj/item/clothing/glasses/chameleon/broken(src)
+ new /obj/item/clothing/head/chameleon/broken(src)
+ new /obj/item/clothing/mask/chameleon/broken(src)
+ new /obj/item/storage/backpack/chameleon/broken(src)
+ new /obj/item/device/radio/headset/chameleon/broken(src)
+ new /obj/item/stamp/chameleon/broken(src)
+ new /obj/item/device/pda/chameleon/broken(src)
+ // No chameleon laser, they can't randomise for //REASONS//
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index d282fb9aed..ac3718394d 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -153,13 +153,15 @@
select_look(owner)
return 1
-/datum/action/item_action/chameleon/change/proc/emp_randomise()
+/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME)
if(istype(target, /obj/item/gun/energy/laser/chameleon))
return //Please no crash!
START_PROCESSING(SSprocessing, src)
random_look(owner)
- emp_timer = world.time + EMP_RANDOMISE_TIME
+ var/new_value = world.time + amount
+ if(new_value > emp_timer)
+ emp_timer = new_value
/datum/action/item_action/chameleon/change/process()
if(world.time > emp_timer)
@@ -189,8 +191,8 @@
item_state = "engi_suit"
item_color = "engine"
-/obj/item/clothing/under/chameleon/New()
- ..()
+/obj/item/clothing/under/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/under
chameleon_action.chameleon_name = "Jumpsuit"
@@ -200,6 +202,10 @@
/obj/item/clothing/under/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/clothing/under/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/clothing/suit/chameleon
name = "armor"
desc = "A slim armored vest that protects against most types of damage."
@@ -211,8 +217,8 @@
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/clothing/suit/chameleon/New()
- ..()
+/obj/item/clothing/suit/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/suit
chameleon_action.chameleon_name = "Suit"
@@ -222,6 +228,10 @@
/obj/item/clothing/suit/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/clothing/suit/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/clothing/glasses/chameleon
name = "Optical Meson Scanner"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
@@ -232,8 +242,8 @@
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/clothing/glasses/chameleon/New()
- ..()
+/obj/item/clothing/glasses/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/glasses
chameleon_action.chameleon_name = "Glasses"
@@ -243,6 +253,10 @@
/obj/item/clothing/glasses/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/clothing/glasses/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/clothing/gloves/chameleon
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
@@ -254,8 +268,8 @@
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/clothing/gloves/chameleon/New()
- ..()
+/obj/item/clothing/gloves/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/gloves
chameleon_action.chameleon_name = "Gloves"
@@ -265,6 +279,10 @@
/obj/item/clothing/gloves/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/clothing/gloves/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/clothing/head/chameleon
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
@@ -276,8 +294,8 @@
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/clothing/head/chameleon/New()
- ..()
+/obj/item/clothing/head/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/head
chameleon_action.chameleon_name = "Hat"
@@ -287,6 +305,10 @@
/obj/item/clothing/head/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/clothing/head/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/clothing/head/chameleon/drone
// The camohat, I mean, holographic hat projection, is part of the
// drone itself.
@@ -294,8 +316,8 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
// which means it offers no protection, it's just air and light
-/obj/item/clothing/head/chameleon/drone/New()
- ..()
+/obj/item/clothing/head/chameleon/drone/Initialize()
+ . = ..()
chameleon_action.random_look()
var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src)
togglehatmask_action.UpdateButtonIcon()
@@ -320,8 +342,8 @@
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/clothing/mask/chameleon/New()
- ..()
+/obj/item/clothing/mask/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/mask
chameleon_action.chameleon_name = "Mask"
@@ -331,6 +353,10 @@
/obj/item/clothing/mask/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/clothing/mask/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/clothing/mask/chameleon/attack_self(mob/user)
vchange = !vchange
to_chat(user, "The voice changer is now [vchange ? "on" : "off"]!")
@@ -343,8 +369,8 @@
// Can drones use the voice changer part? Let's not find out.
vchange = 0
-/obj/item/clothing/mask/chameleon/drone/New()
- ..()
+/obj/item/clothing/mask/chameleon/drone/Initialize()
+ . = ..()
chameleon_action.random_look()
var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src)
togglehatmask_action.UpdateButtonIcon()
@@ -367,8 +393,8 @@
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/clothing/shoes/chameleon/New()
- ..()
+/obj/item/clothing/shoes/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/shoes
chameleon_action.chameleon_name = "Shoes"
@@ -378,6 +404,10 @@
/obj/item/clothing/shoes/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/clothing/shoes/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/gun/energy/laser/chameleon
name = "practice laser gun"
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
@@ -405,8 +435,6 @@
chameleon_action.chameleon_blacklist = typecacheof(/obj/item/gun/magic, ignore_root_path = FALSE)
chameleon_action.initialize_disguises()
-/obj/item/gun/energy/laser/chameleon/Initialize()
- . = ..()
projectile_copy_vars = list("name", "icon", "icon_state", "item_state", "speed", "color", "hitsound", "forcedodge", "impact_effect_type", "range", "suppressed", "hitsound_wall", "impact_effect_type", "pass_flags")
chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/projectiles.dmi', "icon_state" = "laser")
gun_copy_vars = list("fire_sound", "burst_size", "fire_delay")
@@ -505,8 +533,8 @@
name = "backpack"
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/storage/backpack/chameleon/New()
- ..()
+/obj/item/storage/backpack/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/storage/backpack
chameleon_action.chameleon_name = "Backpack"
@@ -515,14 +543,18 @@
/obj/item/storage/backpack/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/storage/backpack/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/storage/belt/chameleon
name = "toolbelt"
desc = "Holds tools."
silent = 1
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/storage/belt/chameleon/New()
- ..()
+/obj/item/storage/belt/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/storage/belt
chameleon_action.chameleon_name = "Belt"
@@ -531,6 +563,10 @@
/obj/item/storage/belt/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/storage/belt/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/device/radio/headset/chameleon
name = "radio headset"
var/datum/action/item_action/chameleon/change/chameleon_action
@@ -545,12 +581,16 @@
/obj/item/device/radio/headset/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/device/radio/headset/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
/obj/item/device/pda/chameleon
name = "PDA"
var/datum/action/item_action/chameleon/change/chameleon_action
-/obj/item/device/pda/chameleon/New()
- ..()
+/obj/item/device/pda/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/device/pda
chameleon_action.chameleon_name = "PDA"
@@ -560,3 +600,7 @@
/obj/item/device/pda/chameleon/emp_act(severity)
chameleon_action.emp_randomise()
+/obj/item/device/pda/chameleon/broken/Initialize()
+ . = ..()
+ chameleon_action.emp_randomise(INFINITY)
+
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 3c26382d6f..e18ed333e3 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
/obj/item/stamp
name = "\improper GRANTED rubber stamp"
desc = "A rubber stamp for stamping important documents."
@@ -109,3 +110,127 @@
if(initial(stamp_type.name) == input_stamp)
break
change_to(stamp_type)
+=======
+/obj/item/stamp
+ name = "\improper GRANTED rubber stamp"
+ desc = "A rubber stamp for stamping important documents."
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "stamp-ok"
+ item_state = "stamp"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 3
+ throw_range = 7
+ materials = list(MAT_METAL=60)
+ item_color = "cargo"
+ pressure_resistance = 2
+ attack_verb = list("stamped")
+
+/obj/item/stamp/suicide_act(mob/user)
+ user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.")
+ return (OXYLOSS)
+
+/obj/item/stamp/qm
+ name = "quartermaster's rubber stamp"
+ icon_state = "stamp-qm"
+ item_color = "qm"
+
+/obj/item/stamp/law
+ name = "law office's rubber stamp"
+ icon_state = "stamp-law"
+ item_color = "cargo"
+
+/obj/item/stamp/captain
+ name = "captain's rubber stamp"
+ icon_state = "stamp-cap"
+ item_color = "captain"
+
+/obj/item/stamp/hop
+ name = "head of personnel's rubber stamp"
+ icon_state = "stamp-hop"
+ item_color = "hop"
+
+/obj/item/stamp/hos
+ name = "head of security's rubber stamp"
+ icon_state = "stamp-hos"
+ item_color = "hosred"
+
+/obj/item/stamp/ce
+ name = "chief engineer's rubber stamp"
+ icon_state = "stamp-ce"
+ item_color = "chief"
+
+/obj/item/stamp/rd
+ name = "research director's rubber stamp"
+ icon_state = "stamp-rd"
+ item_color = "director"
+
+/obj/item/stamp/cmo
+ name = "chief medical officer's rubber stamp"
+ icon_state = "stamp-cmo"
+ item_color = "cmo"
+
+/obj/item/stamp/denied
+ name = "\improper DENIED rubber stamp"
+ icon_state = "stamp-deny"
+ item_color = "redcoat"
+
+/obj/item/stamp/clown
+ name = "clown's rubber stamp"
+ icon_state = "stamp-clown"
+ item_color = "clown"
+
+/obj/item/stamp/attack_paw(mob/user)
+ return attack_hand(user)
+
+// Syndicate stamp to forge documents.
+
+/obj/item/stamp/chameleon
+ actions_types = list(/datum/action/item_action/toggle)
+
+ var/list/stamp_types
+ var/list/stamp_names
+
+/obj/item/stamp/chameleon/Initialize()
+ . = ..()
+ stamp_types = typesof(/obj/item/stamp) - type // Get all stamp types except our own
+
+ stamp_names = list()
+ // Generate them into a list
+ for(var/i in stamp_types)
+ var/obj/item/stamp/stamp_type = i
+ stamp_names += initial(stamp_type.name)
+
+ stamp_names = sortList(stamp_names)
+
+/obj/item/stamp/chameleon/emp_act(severity)
+ change_to(pick(stamp_types))
+
+/obj/item/stamp/chameleon/proc/change_to(obj/item/stamp/stamp_type)
+ name = initial(stamp_type.name)
+ icon_state = initial(stamp_type.icon_state)
+ item_color = initial(stamp_type.item_color)
+
+/obj/item/stamp/chameleon/attack_self(mob/user)
+ var/input_stamp = input(user, "Choose a stamp to disguise as.",
+ "Choose a stamp.") as null|anything in stamp_names
+
+ if(user && (src in user.contents) && input_stamp)
+ var/obj/item/stamp/stamp_type
+ for(var/i in stamp_types)
+ stamp_type = i
+ if(initial(stamp_type.name) == input_stamp)
+ break
+ change_to(stamp_type)
+
+/obj/item/stamp/chameleon/broken/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/stamp/chameleon/broken/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/stamp/chameleon/broken/process()
+ change_to(pick(stamp_types))
+>>>>>>> a00d4b1... Costumes for nuclear operatives (#34487)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 54514689cb..f798eac3d4 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -714,10 +714,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
exclude_modes = list(/datum/game_mode/nuclear)
player_minimum = 20
-/datum/uplink_item/stealthy_tools/chameleon/nuke
- cost = 6
- include_modes = list(/datum/game_mode/nuclear)
-
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Chameleon Shoes"
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
@@ -727,6 +723,12 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
exclude_modes = list(/datum/game_mode/nuclear)
player_minimum = 20
+/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
+ item = /obj/item/clothing/shoes/chameleon
+ cost = 4
+ exclude_modes = list()
+ include_modes = list(/datum/game_mode/nuclear)
+
/datum/uplink_item/stealthy_tools/frame
name = "F.R.A.M.E. PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \
@@ -736,15 +738,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
item = /obj/item/cartridge/virus/frame
cost = 4
-/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
- name = "Stealthy No-Slip Chameleon Shoes"
- desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
- They do not work on heavily lubricated surfaces. The manufacturer claims they are much more stealthy than the normal brand."
- item = /obj/item/clothing/shoes/chameleon
- cost = 4
- exclude_modes = list()
- include_modes = list(/datum/game_mode/nuclear)
-
/datum/uplink_item/stealthy_tools/agent_card
name = "Agent Identification Card"
desc = "Agent cards prevent artificial intelligences from tracking the wearer, and can copy access \
@@ -1328,6 +1321,27 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
cost = 20
cant_discount = TRUE
+/datum/uplink_item/badass/costumes
+ surplus = 0
+ include_modes = list(/datum/game_mode/nuclear)
+ cost = 4
+ cant_discount = TRUE
+
+/datum/uplink_item/badass/costumes/centcom_official
+ name = "Centcom Official Costume"
+ desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. Radio headset does not include key. No gun included."
+ item = /obj/item/storage/box/syndie_kit/centcom_costume
+
+/datum/uplink_item/badass/costumes/clown
+ name = "Clown Costume"
+ desc = "Nothing is more terrifying than clowns with fully automatic weaponry."
+ item = /obj/item/storage/backpack/duffelbag/clown/syndie
+
+/datum/uplink_item/badass/costumes/obvious_chameleon
+ name = "Broken Chameleon Kit"
+ desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! Please note that this kit did NOT pass quality control."
+ item = /obj/item/storage/box/syndie_kit/chameleon/broken
+
/datum/uplink_item/badass/bundle
name = "Syndicate Bundle"
desc = "Syndicate Bundles are specialized groups of items that arrive in a plain box. \