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. \