From e9d39b0d279c5178b2a4012f0804e126cd334c2c Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 1 May 2019 20:59:41 +0200 Subject: [PATCH] Chameleon overhaul --- .../RandomZLevels/stationCollision.dmm | 2 +- .../map_files/RandomZLevels/terrorspiders.dmm | 2 +- _maps/map_files/cyberiad/z2.dmm | 8 +- code/__DEFINES/misc.dm | 9 +- code/__HELPERS/lists.dm | 15 +- code/datums/action.dm | 14 + code/datums/outfits/outfit.dm | 9 +- code/datums/outfits/outfit_admin.dm | 8 +- code/datums/uplink_item.dm | 28 +- .../game/objects/effects/spawners/lootdrop.dm | 4 +- .../effects/spawners/random_spawners.dm | 2 +- code/game/objects/items.dm | 6 + code/game/objects/items/devices/megaphone.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 1 - code/game/objects/items/devices/voice.dm | 44 ++ .../objects/items/weapons/dna_injector.dm | 23 + .../objects/items/weapons/storage/backpack.dm | 3 +- .../admin/verbs/infiltratorteam_syndicate.dm | 2 +- code/modules/clothing/clothing.dm | 8 +- code/modules/clothing/masks/gasmask.dm | 5 - code/modules/clothing/masks/voice.dm | 38 -- code/modules/clothing/shoes/miscellaneous.dm | 18 - .../spacesuits/rig/modules/utility.dm | 13 +- code/modules/clothing/under/chameleon.dm | 522 +++++++++++++++--- code/modules/flufftext/Hallucination.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 22 +- code/modules/mob/mob_defines.dm | 1 + code/modules/ninja/suit/mask.dm | 12 +- code/modules/ninja/suit/suit.dm | 4 +- code/modules/paperwork/stamps.dm | 24 - icons/mob/actions/actions.dmi | Bin 93208 -> 96413 bytes icons/obj/device.dmi | Bin 41315 -> 41577 bytes paradise.dme | 2 +- 33 files changed, 646 insertions(+), 209 deletions(-) create mode 100644 code/game/objects/items/devices/voice.dm delete mode 100644 code/modules/clothing/masks/voice.dm diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm index a8e3a533033..cc1767248cf 100644 --- a/_maps/map_files/RandomZLevels/stationCollision.dmm +++ b/_maps/map_files/RandomZLevels/stationCollision.dmm @@ -4123,7 +4123,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/arrivalblock) "kG" = ( -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /obj/item/clothing/under/syndicate, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index 1a64a0d7f0a..ed0bb019b83 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -13398,7 +13398,7 @@ /area/awaymission/UO71/loot) "zt" = ( /obj/structure/chair/wood/normal, -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) "zu" = ( diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index ee6ca15f83d..c1764ddf1c6 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -8543,7 +8543,7 @@ pixel_y = 3 }, /obj/item/clothing/mask/gas/cyborg, -/obj/item/clothing/mask/gas/voice, +/obj/item/clothing/mask/chameleon, /obj/item/clothing/mask/balaclava{ pixel_x = 3; pixel_y = -3 @@ -8729,7 +8729,7 @@ /area/admin) "uY" = ( /obj/structure/rack, -/obj/item/clothing/under/chameleon/all{ +/obj/item/clothing/mask/chameleon{ pixel_x = -3; pixel_y = 3 }, @@ -9036,7 +9036,7 @@ pixel_y = 3 }, /obj/item/clothing/shoes/centcom, -/obj/item/clothing/shoes/syndigaloshes{ +/obj/item/clothing/shoes/chameleon/noslip{ pixel_x = 3; pixel_y = -3 }, @@ -12275,7 +12275,7 @@ "Hv" = ( /obj/structure/rack, /obj/item/katana/energy, -/obj/item/clothing/mask/gas/voice/space_ninja, +/obj/item/clothing/mask/gas/space_ninja, /turf/unsimulated/floor{ icon_state = "engine" }, diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index dff9426c641..479a936489e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -401,4 +401,11 @@ #define GHOST_ORBIT_TRIANGLE "triangle" #define GHOST_ORBIT_HEXAGON "hexagon" #define GHOST_ORBIT_SQUARE "square" -#define GHOST_ORBIT_PENTAGON "pentagon" \ No newline at end of file +#define GHOST_ORBIT_PENTAGON "pentagon" + +//suit sensors: sensor_mode defines + +#define SENSOR_OFF 0 +#define SENSOR_LIVING 1 +#define SENSOR_VITALS 2 +#define SENSOR_COORDS 3 \ No newline at end of file diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index f1e6f38a2d4..6b5807deaef 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -124,9 +124,13 @@ . += A //Like typesof() or subtypesof(), but returns a typecache instead of a list -/proc/typecacheof(path, ignore_root_path) +/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE) if(ispath(path)) - var/list/types = ignore_root_path ? subtypesof(path) : typesof(path) + var/list/types = list() + if(only_root_path) + types = list(path) + else + types = ignore_root_path ? subtypesof(path) : typesof(path) var/list/L = list() for(var/T in types) L[T] = TRUE @@ -140,8 +144,11 @@ L[T] = TRUE else for(var/P in pathlist) - for(var/T in typesof(P)) - L[T] = TRUE + if(only_root_path) + L[P] = TRUE + else + for(var/T in typesof(P)) + L[T] = TRUE return L //Removes any null entries from the list diff --git a/code/datums/action.dm b/code/datums/action.dm index d316bd29b41..5972579834b 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -107,6 +107,7 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS var/use_itemicon = TRUE + /datum/action/item_action/New(Target, custom_icon, custom_icon_state) ..() var/obj/item/I = target @@ -406,6 +407,19 @@ name = "Use [target.name]" button.name = name +/datum/action/item_action/voice_changer/toggle + name = "Toggle Voice Changer" + +/datum/action/item_action/voice_changer/voice + name = "Set Voice" + +/datum/action/item_action/voice_changer/voice/Trigger() + if(!IsAvailable()) + return FALSE + + var/obj/item/voice_changer/V = target + V.set_voice(usr) + // for clothing accessories like holsters /datum/action/item_action/accessory check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 8c172f3592f..184f1155da2 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -25,6 +25,7 @@ var/list/implants = null var/list/cybernetic_implants = null + var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) //to be overriden for customization depending on client prefs,species etc @@ -151,4 +152,10 @@ H.r_store.add_fingerprint(H, 1) if(H.wear_pda) H.wear_pda.add_fingerprint(H, 1) - return 1 \ No newline at end of file + return 1 + +/datum/outfit/proc/get_chameleon_disguise_info() + var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand, pda) + types += chameleon_extras + listclearnulls(types) + return types diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 3ac473edfeb..09282ec77b1 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -123,7 +123,7 @@ /datum/outfit/admin/syndicate/spy name = "Syndicate Spy" uniform = /obj/item/clothing/under/suit_jacket/really_black - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip uplink_uses = 40 id_access = "Syndicate Agent" @@ -228,7 +228,7 @@ back = /obj/item/storage/backpack belt = /obj/item/storage/belt/utility/full/multitool gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/centcom id = /obj/item/card/id pda = /obj/item/pda @@ -990,7 +990,7 @@ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id/syndicate l_hand = /obj/item/twohanded/dualsaber/red @@ -1021,7 +1021,7 @@ suit = /obj/item/clothing/suit/draculacoat back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id backpack_contents = list( diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a714e17d236..aaeffa08b02 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1092,20 +1092,19 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 35 /datum/uplink_item/stealthy_tools/syndigaloshes - name = "No-Slip Syndicate Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." + name = "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." reference = "NSSS" - item = /obj/item/clothing/shoes/syndigaloshes + item = /obj/item/clothing/shoes/chameleon/noslip cost = 2 excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/syndigaloshes/nuke - name = "Tactical No-Slip Brown Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow." - reference = "NNSSS" + reference = "TNSSS" cost = 4 //but they aren't - gamemodes = list(/datum/game_mode/nuclear) excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/chamsechud name = "Chameleon Security HUD" @@ -1146,12 +1145,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/card/id/syndicate cost = 2 -/datum/uplink_item/stealthy_tools/voice_changer - name = "Voice Changer" - desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognisable." - reference = "VC" - item = /obj/item/clothing/mask/gas/voice - cost = 3 +/datum/uplink_item/stealthy_tools/chameleon + name = "Chameleon Kit" + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ + Due to budget cuts, the shoes don't provide protection against slipping." + reference = "CHAM" + item = /obj/item/storage/box/syndie_kit/chameleon + cost = 2 /datum/uplink_item/stealthy_tools/chameleon_proj name = "Chameleon-Projector" @@ -1210,7 +1210,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools/clownkit name = "Honk Brand Infiltration Kit" - desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." + desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." reference = "HBIK" item = /obj/item/storage/backpack/clown/syndie cost = 6 diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 057c52a2a4c..b7311519f7a 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -140,8 +140,8 @@ /obj/item/suppressor = 4, /obj/item/clothing/under/chameleon = 2, /obj/item/stamp/chameleon = 2, - /obj/item/clothing/shoes/syndigaloshes = 5, - /obj/item/clothing/mask/gas/voice = 2, + /obj/item/clothing/shoes/chameleon/noslip = 5, + /obj/item/clothing/mask/chameleon = 2, /obj/item/dnascrambler = 1, /obj/item/storage/backpack/satchel_flat = 2, /obj/item/storage/toolbox/syndicate = 2, diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 510e5b90380..03e49c56a50 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -214,7 +214,7 @@ /obj/item/storage/pill_bottle/zoom = 1, /obj/item/storage/pill_bottle/random_drug_bottle = 2, /obj/item/storage/backpack/duffel/syndie/surgery = 1, - /obj/item/clothing/shoes/syndigaloshes = 1, + /obj/item/clothing/shoes/chameleon/noslip = 1, /obj/item/storage/belt/military = 1, /obj/item/clothing/under/chameleon = 1, /obj/item/storage/backpack/satchel_flat = 1, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9d199a404d0..6d91b4c8778 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -600,3 +600,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/MouseExited() deltimer(tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) + +/obj/item/proc/update_slot_icon() + if(!ismob(loc)) + return + var/mob/owner = loc + owner.regenerate_icons() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 59a7a650383..941e90a31ef 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -35,7 +35,7 @@ return if(H.mind) span = H.mind.speech_span - if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice) || istype(H.get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown)) + if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) span = "sans" if(spamcheck) to_chat(user, "\The [src] needs to recharge!") diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 83a8c9304a1..00efc83668b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -397,7 +397,6 @@ var/global/list/default_medbay_channels = list( var/mob/living/carbon/human/H = M displayname = H.voice if(H.voice != real_name) - jobname = "Unknown" voicemask = TRUE if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ) diff --git a/code/game/objects/items/devices/voice.dm b/code/game/objects/items/devices/voice.dm new file mode 100644 index 00000000000..339271cdcca --- /dev/null +++ b/code/game/objects/items/devices/voice.dm @@ -0,0 +1,44 @@ +/obj/item/voice_changer + name = "voice changer" + desc = "A voice scrambling module." + icon = 'icons/obj/device.dmi' + icon_state = "voice_changer_off" + + actions_types = list(/datum/action/item_action/voice_changer/toggle, /datum/action/item_action/voice_changer/voice) + + var/obj/item/parent + + var/voice + var/active + +/obj/item/voice_changer/New() + . = ..() + + if(isitem(loc)) + parent = loc + parent.actions |= actions + +/obj/item/voice_changer/Destroy() + if(isitem(parent)) + parent.actions -= actions + + return ..() + +/obj/item/voice_changer/attack_self(mob/user) + active = !active + icon_state = "voice_changer_[active ? "on" : "off"]" + to_chat(user, "You toggle [src] [active ? "on" : "off"].") + + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/voice_changer/proc/set_voice(mob/user) + var/chosen_voice = input(user, "What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice) as text + if(!chosen_voice) + voice = null + to_chat(user, "You are now mimicking the voice on your ID card.") + return + + voice = sanitize(copytext(chosen_voice, 1, MAX_MESSAGE_LEN)) + to_chat(user, "You are now mimicking [voice].") \ No newline at end of file diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index d2f2ed2c54d..04206e1f5b2 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -668,4 +668,27 @@ /obj/item/dnainjector/m2h/Initialize() block = MONKEYBLOCK + ..() + + +/obj/item/dnainjector/comic + name = "DNA-Injector (Comic)" + desc = "Honk!" + datatype = DNA2_BUF_SE + value = 0xFFF + forcedmutation = TRUE + +/obj/item/dnainjector/comic/Initialize() + block = COMIC + ..() + +/obj/item/dnainjector/anticomic + name = "DNA-Injector (Ant-Comic)" + desc = "Honk...?" + datatype = DNA2_BUF_SE + value = 0x001 + forcedmutation = TRUE + +/obj/item/dnainjector/anticomic/Initialize() + block = COMIC ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index e5ee3562228..56ae2864071 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -112,7 +112,7 @@ ..() new /obj/item/clothing/under/rank/clown(src) new /obj/item/clothing/shoes/magboots/clown(src) - new /obj/item/clothing/mask/gas/voice/clown(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/radio/headset/headset_service(src) new /obj/item/pda/clown(src) new /obj/item/storage/box/survival(src) @@ -124,6 +124,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src) new /obj/item/instrument/bikehorn(src) new /obj/item/bikehorn(src) + new /obj/item/dnainjector/comic(src) /obj/item/storage/backpack/mime name = "Parcel Parceaux" diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 551076be62a..4597a838733 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -170,7 +170,7 @@ var/global/sent_syndicate_infiltration_team = 0 equip_or_collect(new /obj/item/pda(src), slot_in_backpack) // Other gear - equip_to_slot_or_del(new /obj/item/clothing/shoes/syndigaloshes(src), slot_shoes) + equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/noslip(src), slot_shoes) var/obj/item/card/id/syndicate/W = new(src) if (flag_mgmt) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9613ce173af..a0e3b169c7e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -574,8 +574,9 @@ BLIND // can't see anything "Drask" = 'icons/mob/species/drask/uniform.dmi', "Grey" = 'icons/mob/species/grey/uniform.dmi' ) - var/has_sensor = 1//For the crew computer 2 = unable to change mode - var/sensor_mode = 0 + var/has_sensor = TRUE//For the crew computer 2 = unable to change mode + var/sensor_mode = SENSOR_OFF + var/random_sensor = TRUE /* 1 = Report living/dead 2 = Report detailed damages @@ -587,7 +588,8 @@ BLIND // can't see anything var/basecolor /obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) + if(random_sensor) + sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_VITALS, SENSOR_COORDS) ..() /obj/item/clothing/under/Destroy() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0c4dba9ae49..1bd53217770 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -162,11 +162,6 @@ item_state = "sexymime" burn_state = FLAMMABLE -/obj/item/clothing/mask/gas/death_commando - name = "Death Commando Mask" - icon_state = "death_commando_mask" - item_state = "death_commando_mask" - /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" desc = "Beep boop" diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm deleted file mode 100644 index b5b6298dcb2..00000000000 --- a/code/modules/clothing/masks/voice.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/item/voice_changer - name = "voice changer" - desc = "A voice scrambling module. If you can see this, report it as a bug on the tracker." - var/voice //If set and item is present in mask/suit, this name will be used for the wearer's speech. - var/active - -/obj/item/clothing/mask/gas/voice - name = "gas mask" -// desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." - var/obj/item/voice_changer/changer - burn_state = FIRE_PROOF - -/obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() - set category = "Object" - set src in usr - - changer.active = !changer.active - to_chat(usr, "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].") - -/obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) - set category = "Object" - set src in usr - - var/voice = sanitize(copytext(name,1,MAX_MESSAGE_LEN)) - if(!voice || !length(voice)) return - changer.voice = voice - to_chat(usr, "You are now mimicking [changer.voice].") - -/obj/item/clothing/mask/gas/voice/New() - ..() - changer = new(src) - -/obj/item/clothing/mask/gas/voice/clown - name = "clown wig and mask" - desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - icon_state = "clown" - item_state = "clown_hat" - flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f3a2efed260..d4411fbdbe6 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,21 +1,3 @@ -/obj/item/clothing/shoes/syndigaloshes - desc = "A pair of brown shoes. They seem to have extra grip." - name = "brown shoes" - icon_state = "brown" - item_state = "brown" - permeability_coefficient = 0.05 - flags = NOSLIP - origin_tech = "syndicate=2" - burn_state = FIRE_PROOF - var/list/clothing_choices = list() - silence_steps = 1 - -/obj/item/clothing/shoes/syndigaloshes/black - name = "black shoes" - icon_state = "black" - item_color = "black" - desc = "A pair of black shoes. They seem to have extra grip." - /obj/item/clothing/shoes/mime name = "mime shoes" icon_state = "mime" diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index aa62763a6d3..bfb326eae1d 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -269,14 +269,13 @@ /obj/item/rig_module/voice/New() ..() voice_holder = new(src) - voice_holder.active = 0 + voice_holder.active = FALSE /obj/item/rig_module/voice/installed() ..() holder.speech = src /obj/item/rig_module/voice/engage() - if(!..()) return 0 @@ -287,17 +286,17 @@ switch(choice) if("Enable") - active = 1 - voice_holder.active = 1 + active = TRUE + voice_holder.active = TRUE to_chat(usr, "You enable the speech synthesiser.") if("Disable") - active = 0 - voice_holder.active = 0 + active = FALSE + voice_holder.active = FALSE to_chat(usr, "You disable the speech synthesiser.") if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) - return 0 + return FALSE voice_holder.voice = raw_choice to_chat(usr, "You are now mimicking [voice_holder.voice].") return 1 diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index b320237996e..b08a1ce72c9 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -1,86 +1,478 @@ +#define EMP_RANDOMISE_TIME 300 + +/datum/action/chameleon_outfit + name = "Select Chameleon Outfit" + button_icon_state = "chameleon_outfit" + var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. + +/datum/action/chameleon_outfit/New() + ..() + initialize_outfits() + +/datum/action/chameleon_outfit/proc/initialize_outfits() + var/static/list/standard_outfit_options + if(!standard_outfit_options) + standard_outfit_options = list() + for(var/path in subtypesof(/datum/outfit/job)) + var/datum/outfit/O = path + standard_outfit_options[initial(O.name)] = path + sortTim(standard_outfit_options, /proc/cmp_text_asc) + outfit_options = standard_outfit_options + +/datum/action/chameleon_outfit/Trigger() + return select_outfit(owner) + +/datum/action/chameleon_outfit/proc/select_outfit(mob/user) + if(!user || !IsAvailable()) + return FALSE + var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options + if(!IsAvailable() || QDELETED(src) || QDELETED(user)) + return FALSE + var/outfit_type = outfit_options[selected] + if(!outfit_type) + return FALSE + var/datum/outfit/O = new outfit_type() + var/list/outfit_types = O.get_chameleon_disguise_info() + + for(var/V in user.chameleon_item_actions) + var/datum/action/item_action/chameleon/change/A = V + var/done = FALSE + for(var/T in outfit_types) + for(var/name in A.chameleon_list) + if(A.chameleon_list[name] == T) + A.update_look(user, T) + outfit_types -= T + done = TRUE + break + if(done) + break + //hardsuit helmets/suit hoods + if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user)) + var/mob/living/carbon/human/H = user + //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat + if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) + var/helmet_type + var/obj/item/clothing/suit/hooded/hooded = O.suit + helmet_type = initial(hooded.hoodtype) + + if(helmet_type) + var/obj/item/clothing/head/chameleon/hat = H.head + hat.chameleon_action.update_look(user, helmet_type) + qdel(O) + return TRUE + + +/datum/action/item_action/chameleon/change + name = "Chameleon Change" + var/list/chameleon_blacklist = list() //This is a typecache + var/list/chameleon_list = list() + var/chameleon_type = null + var/chameleon_name = "Item" + + var/emp_timer + +/datum/action/item_action/chameleon/change/Grant(mob/M) + if(M && (owner != M)) + if(!M.chameleon_item_actions) + M.chameleon_item_actions = list(src) + var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() + O.Grant(M) + else + M.chameleon_item_actions |= src + ..() + +/datum/action/item_action/chameleon/change/Remove(mob/M) + if(M && (M == owner)) + LAZYREMOVE(M.chameleon_item_actions, src) + if(!LAZYLEN(M.chameleon_item_actions)) + var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions + qdel(O) + ..() + +/datum/action/item_action/chameleon/change/proc/initialize_disguises() + if(button) + button.name = "Change [chameleon_name] Appearance" + + chameleon_blacklist |= typecacheof(target.type) + for(var/V in typesof(chameleon_type)) + if(ispath(V) && ispath(V, /obj/item)) + var/obj/item/I = V + if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state)) + continue + var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" + chameleon_list[chameleon_item_name] = I + +/datum/action/item_action/chameleon/change/proc/select_look(mob/user) + var/obj/item/picked_item + var/picked_name + picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list + if(!picked_name) + return + picked_item = chameleon_list[picked_name] + if(!picked_item) + return + update_look(user, picked_item) + +/datum/action/item_action/chameleon/change/proc/random_look(mob/user) + var/picked_name = pick(chameleon_list) + // If a user is provided, then this item is in use, and we + // need to update our icons and stuff + + if(user) + update_look(user, chameleon_list[picked_name]) + + // Otherwise, it's likely a random initialisation, so we + // don't have to worry + + else + update_item(chameleon_list[picked_name]) + +/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) + if(isliving(user)) + var/mob/living/C = user + if(C.stat != CONSCIOUS) + return + + update_item(picked_item) + var/obj/item/thing = target + thing.update_slot_icon() + UpdateButtonIcon() + +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) + target.name = initial(picked_item.name) + target.desc = initial(picked_item.desc) + target.icon_state = initial(picked_item.icon_state) + if(isitem(target)) + var/obj/item/I = target + I.item_state = initial(picked_item.item_state) + I.item_color = initial(picked_item.item_color) + if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing)) + var/obj/item/clothing/CL = I + var/obj/item/clothing/PCL = picked_item + CL.flags_cover = initial(PCL.flags_cover) + target.icon = initial(picked_item.icon) + +/datum/action/item_action/chameleon/change/Trigger() + if(!IsAvailable()) + return + + select_look(owner) + return 1 + +/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) + START_PROCESSING(SSprocessing, src) + random_look(owner) + + 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) + STOP_PROCESSING(SSprocessing, src) + return + random_look(owner) + /obj/item/clothing/under/chameleon //starts off as black name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" item_color = "black" - desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." - origin_tech = "syndicate=2" - var/list/clothing_choices = list() - burn_state = FIRE_PROOF - armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) + desc = "It's a plain jumpsuit. It has a small dial on the wrist." + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? + random_sensor = FALSE + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - New() - ..() - var/blocked = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/rank/centcom) // Stops random coloured jumpsuit and undefined centcomm suit appearing in the list. - for(var/U in subtypesof(/obj/item/clothing/under/color) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V + var/datum/action/item_action/chameleon/change/chameleon_action - for(var/U in subtypesof(/obj/item/clothing/under/rank) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V - return +/obj/item/clothing/under/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/under + chameleon_action.chameleon_name = "Jumpsuit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE) + chameleon_action.initialize_disguises() +/obj/item/clothing/under/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - attackby(obj/item/clothing/under/U as obj, mob/user as mob, params) - ..() - if(istype(U, /obj/item/clothing/under/chameleon)) - to_chat(user, "Nothing happens.") - return - if(istype(U, /obj/item/clothing/under)) - if(src.clothing_choices.Find(U)) - to_chat(user, "Pattern is already recognised by the suit.") - return - src.clothing_choices += U - to_chat(user, "Pattern absorbed by the suit.") +/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." + icon_state = "armor" + item_state = "armor" + blood_overlay_type = "armor" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - emp_act(severity) - name = "psychedelic" - desc = "Groovy!" - icon_state = "psyche" - item_color = "psyche" - usr.update_inv_w_uniform() - spawn(200) - name = initial(name) - icon_state = initial(icon_state) - item_color = initial(item_color) - desc = initial(desc) - usr.update_inv_w_uniform() - ..() + var/datum/action/item_action/chameleon/change/chameleon_action +/obj/item/clothing/suit/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/suit + chameleon_action.chameleon_name = "Suit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE) + chameleon_action.initialize_disguises() - verb/change() - set name = "Change Color" - set category = "Object" - set src in usr +/obj/item/clothing/suit/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - if(icon_state == "psyche") - to_chat(usr, "Your suit is malfunctioning") - return +/obj/item/clothing/suit/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) - var/obj/item/clothing/under/A - A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices - if(!A) - return +/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." + icon_state = "meson" + item_state = "meson" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - desc = null - permeability_coefficient = 0.90 + var/datum/action/item_action/chameleon/change/chameleon_action - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - item_color = A.item_color - usr.update_inv_w_uniform() //so our overlays update. +/obj/item/clothing/glasses/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "Glasses" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() +/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/under/chameleon/all/New() - ..() - var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all) - //to prevent an infinite loop - for(var/U in typesof(/obj/item/clothing/under)-blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V +/obj/item/clothing/gloves/chameleon + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/gloves/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/gloves + chameleon_action.chameleon_name = "Gloves" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/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." + icon_state = "greysoft" + item_color = "grey" + + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/head/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/head + chameleon_action.chameleon_name = "Hat" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/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/mask/chameleon + name = "gas mask" + desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate + icon_state = "gas_alt" + item_state = "gas_alt" + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH + + var/obj/item/voice_changer/voice_changer + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/mask/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/mask + chameleon_action.chameleon_name = "Mask" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + + voice_changer = new(src) + +/obj/item/clothing/mask/chameleon/Destroy() + QDEL_NULL(voice_changer) + return ..() + +/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/shoes/chameleon + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + permeability_coefficient = 0.05 + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/shoes/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/shoes + chameleon_action.chameleon_name = "Shoes" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/shoes/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/shoes/chameleon/noslip + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + flags = NOSLIP + +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/backpack/chameleon + name = "backpack" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/backpack/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/backpack + chameleon_action.chameleon_name = "Backpack" + chameleon_action.initialize_disguises() + +/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." + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + +/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/radio/headset/chameleon + name = "radio headset" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/radio/headset/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/radio/headset + chameleon_action.chameleon_name = "Headset" + chameleon_action.initialize_disguises() + +/obj/item/radio/headset/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/radio/headset/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/pda/chameleon + name = "PDA" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/pda/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/pda + chameleon_action.chameleon_name = "PDA" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/pda/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/pda/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/stamp/chameleon + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/stamp/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/stamp + chameleon_action.chameleon_name = "Stamp" + chameleon_action.initialize_disguises() + +/obj/item/stamp/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) \ No newline at end of file diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e937ec25ef9..6be1d3bcf70 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -671,8 +671,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ /obj/item/gun/energy/kinetic_accelerator/crossbow,\ /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\ /obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\ - /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ + /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\ + /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ /obj/item/chameleon, /obj/item/card/emag,\ /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\ /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\ diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 1be6fc60a25..2f181d77077 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -62,27 +62,38 @@ return ..() /mob/living/carbon/human/proc/HasVoiceChanger() - if(istype(back,/obj/item/rig)) + if(istype(back, /obj/item/rig)) var/obj/item/rig/rig = back if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice) return rig.speech.voice_holder.voice - for(var/obj/item/gear in list(wear_mask,wear_suit,head)) + for(var/obj/item/gear in list(wear_mask, wear_suit, head)) if(!gear) continue + var/obj/item/voice_changer/changer = locate() in gear - if(changer && changer.active && changer.voice) - return changer.voice - return 0 + if(changer && changer.active) + if(changer.voice) + return changer.voice + else if(wear_id) + var/obj/item/card/id/idcard = wear_id.GetID() + if(istype(idcard)) + return idcard.registered_name + + return FALSE /mob/living/carbon/human/GetVoice() var/has_changer = HasVoiceChanger() + if(has_changer) return has_changer + if(mind && mind.changeling && mind.changeling.mimicing) return mind.changeling.mimicing + if(GetSpecialVoice()) return GetSpecialVoice() + return real_name /mob/living/carbon/human/IsVocal() @@ -124,7 +135,6 @@ span = mind.speech_span if((COMIC in mutations) \ || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \ - || istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown) \ || GetComponent(/datum/component/jestosterone)) span = "sans" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 3e9ff0b7ba6..e3b9b516909 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -196,6 +196,7 @@ var/list/permanent_huds = list() var/list/actions = list() + var/list/datum/action/chameleon_item_actions var/list/progressbars = null //for stacking do_after bars diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 910ccbc953c..bfc87e0104c 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -6,7 +6,7 @@ Contents: */ -/obj/item/clothing/mask/gas/voice/space_ninja +/obj/item/clothing/mask/gas/space_ninja name = "ninja mask" desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." icon_state = "s-ninja(norm)" @@ -19,3 +19,13 @@ Contents: "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) + + var/obj/item/voice_changer/voice_changer + +/obj/item/clothing/mask/gas/space_ninja/Initialize(mapload) + . = ..() + voice_changer = new(src) + +/obj/item/clothing/mask/gas/space_ninja/Destroy() + QDEL_NULL(voice_changer) + return ..() \ No newline at end of file diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index f03a08d237a..dfd430a5754 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -24,7 +24,7 @@ Contents: var/obj/item/clothing/head/helmet/space/space_ninja/suitHood var/obj/item/clothing/gloves/space_ninja/suitGloves var/obj/item/clothing/shoes/space_ninja/suitShoes - var/obj/item/clothing/mask/gas/voice/space_ninja/suitMask + var/obj/item/clothing/mask/gas/space_ninja/suitMask var/mob/living/carbon/human/suitOccupant /obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user) @@ -41,7 +41,7 @@ Contents: if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja)) to_chat(user, "ERROR: Unable to locate foot gear.\nABORTING...") return 0 - if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) to_chat(user, "ERROR: Unable to locate mask.\nABORTING...") return 0 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 8e78f0ce230..8c24cc55c9d 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -92,27 +92,3 @@ icon_state = "stamp-syndicate" item_color = "syndicate" -// Syndicate stamp to forge documents. - -/obj/item/stamp/chameleon/attack_self(mob/user as mob) - - var/list/stamp_types = typesof(/obj/item/stamp) - src.type // Get all stamp types except our own - var/list/stamps = list() - - // Generate them into a list - for(var/stamp_type in stamp_types) - var/obj/item/stamp/S = new stamp_type - stamps[capitalize(S.name)] = S - - var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from - - var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps - - if(user && src in user.contents) - - var/obj/item/stamp/chosen_stamp = stamps[capitalize(input_stamp)] - - if(chosen_stamp) - name = chosen_stamp.name - icon_state = chosen_stamp.icon_state - item_color = chosen_stamp.item_color diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index b4d8a34a6e0b807b6381a3c8b92e6418718498df..7bc556c628c06f6152ba38303a766e421d6cc105 100644 GIT binary patch delta 16795 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 Z{J88D&`D(`1ONa9P>@lUE|WA0_&+_~S_uFE delta 13563 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 diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 02de48a6f41b9a525915b8893d89b6bc6b3802cc..469934ca9329fa755799091b1a95bb3396e463f4 100644 GIT binary patch delta 20405 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 diff --git a/paradise.dme b/paradise.dme index 1b7a691c820..f96d9d6da59 100644 --- a/paradise.dme +++ b/paradise.dme @@ -853,6 +853,7 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" +#include "code\game\objects\items\devices\voice.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\electropack.dm" @@ -1319,7 +1320,6 @@ #include "code\modules\clothing\masks\breath.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\voice.dm" #include "code\modules\clothing\patreon\glasses.dm" #include "code\modules\clothing\patreon\hats.dm" #include "code\modules\clothing\shoes\colour.dm"