Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds a voice modulator mask that makes it easier for antags to RP as "Unknown" without revealing their identity #16003

Merged
merged 11 commits into from Sep 19, 2021

Conversation

Stokes52
Copy link
Contributor

@Stokes52 Stokes52 commented May 8, 2021

What Does This PR Do

  • Adds craftable voice modulator mask that disguises the user's voice as "Unknown" when active (requires: multitool, screwdriver, gas mask, voice analyzer, 5 cables)
  • Adds a chameleon voice modulator mask to the traitor uplink for 1tc
  • In addition to hiding your name, the modulator makes your voice sound strange, replacing the "says" verb with something more artificial: "modulates, drones, buzzes, hums"
  • Both can be found in maintenance loot.

Why It's Good For The Game

Antags need a way to easily talk with and RP with their victims without immediately giving away their identity. Many antags won't talk to people because a single word will permanently give away their identity which leads to a boring cycle of no interaction, no-RP traitoring. 4tc is too much if you are only interested in disguising your voice and it locks vampires and cultists out of the ability to hide their voice. Vampires especially are a role that wants to talk to their victims but is punished for doing so.

Whispering when next to someone also hides your identity, but this feature is not widely known and there are many reasons why, as an antag, you might not want to be next to someone to talk to them.

Making it an uplink item gives traitors immediate access, while a craftable non-chameleon version makes it available to cult and vampires if they find the right items.

The masks are craftable and added to maintenance loot so that you cannot metagame that "Unknown" = bad guy

Images of changes

Left = Syndicate chameleon version in the uplink, Right = craftable version
modulators
name = "chameleon voice modulator mask"
desc = "A tactical mask equipped with chameleon technology and a sound modulator that disguises the user's voice when active"

name = "modified gas mask"
desc = "A gas mask modified with a sound modulator that disguises the user's voice when active"

Crafting recipe:
craftable

Uplink text:
uplink

Example of how it works in chat:
chat_logs

Balance Considerations:

  • Space Law: Both masks should be considered Class-C contraband. Someone using this item may hide their identity, but they will draw the unwanted attention of security. This also allows security to legally confiscate the mask from any crew members who try to craft or use this illegal item.

  • Why isn't the crafting recipe more difficult? This item is very intentionally meant to not be too difficult to acquire. It is similar if not more difficult to craft than the stun prod, requiring maintenance access (for the mask), access to tools to hack the vendomat (for the voice analyzer) or access to an autolathe (for the cables + analyzer). This item is meant to encourage RP for antags and should not be too difficult to acquire. If this becomes a very commonly used equipment for antags, I argue that would be a good thing for the server as it opens up more RP opportunities without harshly punishing antags for speaking. This is also an easy balance lever to tweak. The requirements can be increased easily in a future PR if it gets out of hand, but I argue for its first implementation it should be relatively easy to acquire.

  • What about crew grief? In cases of minor abuse, security can confiscate them, as already happens with other illegal/contraband items the crew can acquire/craft, such as stunprods, flamethrowers, syndicate maints loot, etc,. In cases of major abuse, it can be considered self-antagging and warrant admin intervention, which is the same as with the above items. After all, why would the crew ever need this item?

  • What about the existing chameleon kit?
    The chameleon kit is locked behind the traitor role and is too expensive if you are not interested in using all of the advanced disguise features. The chameleon kit is for traitors who want to be fully incognito and disguise themselves as other members of the crew. The voice modulator is for antags who don't mind appearing suspicious, but still want to hide their identity.

Changelog

馃啈
add: Adds craftable voice modulator mask that disguises the user's voice so it sounds like "Unknown"
add: Adds chameleon voice modulator version of the mask to the syndicate uplink
add: Custom sprites for the craftable voice modulator mask, including sprites for all species
add: Adds both masks to maintenance loot at low chance
add: Voice changing effect when the mask is active. The user's "say" verb will change to something more artificial
/:cl:

@Stokes52
Copy link
Contributor Author

Stokes52 commented May 8, 2021

@AffectedArc07 AffectedArc07 added the Feature This PR is a new addition to the game label May 8, 2021
@datlo
Copy link
Contributor

datlo commented May 8, 2021

Amazing idea. 馃憤

@@ -144,6 +144,8 @@
/obj/item/stamp/chameleon = 2,
/obj/item/clothing/shoes/chameleon/noslip = 5,
/obj/item/clothing/mask/chameleon = 2,
/obj/item/clothing/mask/gas/voice_modulator = 2,
/obj/item/clothing/mask/gas/voice_modulator/chameleon = 2,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need to update the line "" = 68 below this to "" = 64. You are adding 4 items to the loot table, so 4 needs to be removed from the 'empty' field.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@datlo thanks! Fixed in the commit below.

desc = "A syndicate tactical mask equipped with chameleon technology and a sound modulator for disguising your voice. \
While the mask is active, your voice will sound unrecognizable to others"
reference = "CVMM"
item = /obj/item/clothing/mask/gas/voice_modulator
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
item = /obj/item/clothing/mask/gas/voice_modulator
item = /obj/item/clothing/mask/gas/voice_modulator/chameleon

Should be this one right?

@@ -167,6 +167,12 @@
S.message = uppertext(S.message)
verb = "yells loudly"

if(istype(wear_mask, /obj/item/clothing/mask/gas/voice_modulator))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way masks are handled here could do with a refactor. Out of the scope for your PR though I recon

@@ -167,6 +167,12 @@
S.message = uppertext(S.message)
verb = "yells loudly"

if(istype(wear_mask, /obj/item/clothing/mask/gas/voice_modulator))
var/obj/item/voice_changer/changer = locate() in wear_mask
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
var/obj/item/voice_changer/changer = locate() in wear_mask
var/obj/item/clothing/mask/gas/voice_modulator/VM = wear_mask
var/obj/item/voice_changer/changer = VM.voice_modulator

Comment on lines 172 to 174
if (!changer.active)
continue
verb = pick("modulates", "drones", "hums", "buzzes")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (!changer.active)
continue
verb = pick("modulates", "drones", "hums", "buzzes")
if(changer.active)
verb = pick("modulates", "drones", "hums", "buzzes")

Else it skips the other code below

var/obj/item/voice_changer/changer = locate() in wear_mask
if (!changer.active)
continue
verb = pick("modulates", "drones", "hums", "buzzes")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code should also not be located in the for loop btw. verb is only used in the return on line 178. When everything is done

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.

@Samman166
Copy link
Contributor

Great idea but think it would look cooler as sec gas mask looking thing instead, but that's just being picky

@@ -169,6 +169,13 @@

if(span)
S.message = "<span class='[span]'>[S.message]</span>"

if(istype(wear_mask, /obj/item/clothing/mask/gas/voice_modulator))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is really snowflakey, and isn't acceptable--you're going to have to make this more OOP if this is remotely going to have a chance of passing.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Fox-McCloud absolutely, I thought the way this was implemented was weird too. I was following the example from the horse mask above and I didn't think I should deviate from the pattern already established.

However if you have examples or ideas for how you would prefer it to be coded I am very interested to learn. Thanks for taking a look!

@Stokes52 Stokes52 force-pushed the voice_modulator branch 2 times, most recently from b81d290 to 902856a Compare May 19, 2021 01:54
@Stokes52
Copy link
Contributor Author

@Fox-McCloud please see the last two commits. I made it so that voice changing when wearing a mask is a generic proc that any mask can use. I also refactored the horse mask to use this proc. Hopefully this is less "snowflake" :)

@alexpkeaton
Copy link

Great idea. Adds to RP while cutting down on metagaming. Hope to see it in-round sometime soon.

code/game/objects/effects/spawners/lootdrop.dm Outdated Show resolved Hide resolved
code/game/objects/items/devices/voice.dm Outdated Show resolved Hide resolved
@Stokes52
Copy link
Contributor Author

Applied changes. Thanks @AffectedArc07!

Comment on lines 148 to 151
if(wear_mask)
var/speech_verb_when_masked = wear_mask.change_speech_verb()
if(speech_verb_when_masked)
verb = speech_verb_when_masked
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is best to place this part of the code before the for loop.
Seeing verb is never used in the for loop and it never changes after one iteration.
Doing this also retains the behaviour of being brain damaged changing the verb even if you have a horsemask on... Bug? Your say

@Stokes52
Copy link
Contributor Author

Stokes52 commented Jul 2, 2021

Moved mask logic down so it takes precedence over things like brain damage, according to farie82's review.

@AffectedArc07 AffectedArc07 requested review from Fox-McCloud and removed request for AffectedArc07 July 2, 2021 19:49
@github-actions github-actions bot added the Merge Conflict This PR is merge conflicted label Jul 26, 2021
@Stokes52
Copy link
Contributor Author

Hello maintainers, @Fox-McCloud @AffectedArc07 @Crazylemon64.

I hope it's okay to ping you. Since this has been open a while, please let me know if you would like me to fix the merge conflicts, close this PR, or continue to wait. Thank you for your time. :)

@variableundefined
Copy link
Contributor

@Stokes52 Can you deconflict this within 7 days and ping me on Discord in coding_chat (do not DM) when ready and CI has passed?

Copy link
Contributor

@variableundefined variableundefined left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See above, please deconflict

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature This PR is a new addition to the game Merge Conflict This PR is merge conflicted
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants