Files
Bubberstation/modular_zubbers/code/modules/mkultra/misc.dm
Alexis 9d497ae5b8 (Port) MKUltra - Mind Control (#2206)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request
**Special thanks to waterpig and lessthanthree for helping me get this
to work.**
Ports MKUltra from
[Citadel](https://github.com/Citadel-Station-13/Citadel-Station-13/pull/8356)

To summarize, this PR adds a new reagent, MKUltra.
MKU can be used to either make people your pet if they have the **_NEW
ERP hypnosis interaction_** preference enabled or make people obey your
commands if they don't have the pref enabled.
### How it's made

- one part coco powder
- one part bluespace dust
- one part psicodine
- one part mindbreaker toxin
- one part happiness
- one unit of blood (IT HAS TO BE FROM YOURSELF OR THE PERSON DRINKING
IT WONT BE ENTHRALLED TO YOU)
### How it works (Taken directly from the preamble to the code at
`modular_zubbers\code\modules\mkultra\MKUltra.dm`)
The magnum opus of FermiChem -
Long and complicated, I highly recommend you look at the two other files
heavily involved in this
modular_zubbers\code\modules\mkultra\chem.dm - handles the subject's
reactions
modular_zubbers\code\modules\mkultra\vocal_cords.dm - handles the
enchanter speaking

HOW IT WORKS
chem.dm
There are 3 main ways this chemical works; I'll start off with
discussing how it's set up.
Upon reacting with blood as a catalyst, the blood is used to define who
the enthraller is - thus only the creator is/can choose who the master
will be. As a side note, you can't adminbus this chem, even admins have
to earn it.
This uses the fermichem only proc; FermiCreate, which is basically the
same as On_new, except it doesn't require "data" which is something to
do with blood and breaks everything, so I said bugger it and made my own
proc. It basically sets up vars.
When it's first made, the creator has to drink some of it, in order to
give them the vocal cords needed.
When it's given to someone, it gives them the status effect and kicks
off that side of things. For every metabolism tick, it increases the
enthrall tally.
Finally, if you manage to pump 100u into some poor soul, you overload
them, and mindbreak them. Making them your willing, but broken slave.
Which can only be reversed by; fixing their brain with mannitol and
neurine (100 / 50u respectively) (or less with both),

vocal_cords.dm
This handles when the enchanter speaks - basically uses code from voice
of god, but only for people with the status effect. Most of the words
are self explanatory, and has a smaller range of commands. If you're not
sure what one does, it likely affects the enthrall tally, or the resist
tally.
list of commands:

-mixables-
enthrall_words
reward_words
punish_words
0
saymyname_words
wakeup_words
1
silence_words
antiresist_words
resist_words
forget_words
attract_words
2
sleep_words
strip_words
walk_words
run_words
knockdown_words
3
statecustom_words
custom_words
objective_words
heal_words
stun_words
hallucinate_words
hot_words
cold_words
getup_words
pacify_words
charge_words

Mixables can be used interspersed with other commands, 0 is commands
that work on sleeper agents (i.e. players enthralled to state 3, then
ordered to wake up and forget, they can be triggered back instantly)
1 is for players who immediately are injected with the chem - no stuns,
only a silence and something that draws them towards them. This is the
best time to try to fight it, and you're likely to win by spamming
resist, unless the enchantress has plans.
2 is the seconds stage, which allows removal of clothes, slowdown and
light stunning.
3 is the final stage, which allows application of a few status effects
(see chem.dm) and allows custom triggers to be installed (kind of like
nanites), again, see chem.dm
In a nutshell, this is the way you enthrall people, by typing messages
into chat and managing cooldowns on the stronger words. You have to type
words and your message strength is increases with the number of
characters - if you type short messages the cooldown will be too much
and the other player will overcome the chem.
I suppose people could spam gdjshogndjoadphgiuaodp but, the truth of
this chem is that it mostly allows a casus belli for subs to give in,
and everyone's a sub on cit (mostly), so if you aujigbnadjgipagdsjk then
they might resist harder because you're a baddie and baddies don't
deserve pets.
Also, the use of this chem as a murder aid is antithetic to its design,
the subject gains bonus resistance if they're hurt or hungry (I'd like
to expand this more, I like the idea that you have to look after all of
them otherwise they aren't as effective, kind of like tamagachis!). If
this becomes a problem, I'll deal with it, I'm not happy with people
abusing this chem for an easy murder. (I might make it so you an't
strike your pet when health is too low.)
Additionally, in lieu of previous statement - the pet is ordered to not
kill themselves, even if ordered to.

chem.dm
oof
There are a few basic things that have to be understood with this status
effect
1. There is a min loop which calculates the enthrall state of the
subject, when the enthrall tally is over a certain amount, it will push
you up 1 phase.
0 - Sleeper
1 - initial
2 - enthralled
3 - Fully entranced
4 - mind broken
4 can only be reached via OD, whereas you can increment up from 1 > 2 >
3. 0 is only obtainable on a state 3 pet, and it toggles between the
two.

1.5 Chem warfare
Since this is a chem, it's expected that you will use all the chemicals
at your disposal. Using aphro and aphro+ will weaken the resistance of
the subject, while ananphro, anaphro+, mannitol and neurine will
strengthen it.
Additionally, the more aroused you are, the weaker your resistance will
be, as a result players immune to aphro and anaphro give a flat bonus to
the enthralled.
The impure toxin for this chem increases resistance too, so if they're a
bad chemist it'll be unlikely they have a good ratio (and as a secret
bonus, really good chemists can purposely make the impure chem, to use
either to combat the use of it against them, or as smoke grenades to
deal with a large party)

2. There is a resistance proc which occurs whenever the player presses
resist. You have to press it a lot, this is intentional. If you're
trying to fight the enchanter, then you can't click both. You will
usually win if you just mash resist and the enchanter does nothing, so
you've got to react.
Each step further it becomes harder to resist, in state 2 it's longer,
but resisting is still worthwhile. If you're not in state 3, and you've
not got MKultra inside of you, you generate resistance very fast. So in
some cases the better option will be to stall out any attempts to
entrance you.
At the moment, resistance doesn't affect the commands - mostly because
it's a way to tell if a state 3 is trying to resist. But this might
change if it gets too hard to fight them off.
During state 3, it's impossible to resist if the enthraller is in your
presence (8 tiles), you generate no resistance if so. If they're out of
your range, then you start to go into the addiction processed
As your resistance is tied to your arousal, sometimes your best option
is to wah

3. The addition process starts when the enthraller is out of range, it
roughly follows the five stages of grief; denial, anger, bargaining,
depression and acceptance.
What it mostly does makes you sad, hurts your brain, and sometimes you
lash out in anger.
Denial - minor brain damaged
bargaining - 50:50 chance of brain damage and brain healing
anger - randomly lashing out and hitting people
depression - massive mood loss, stuttering, jittering, hallucinations
and brain damage
depression, again - random stunning and crying, brain damage, and
resistance
acceptance - minor brain damage and resistance.
You can also resist while out of range, but you can only break free of a
stage 3 enthrallment by hitting the acceptance phase with a high enough
resistance.
Finally, being near your enthraller reverts the damages caused.
It is expected that if you intend to break free you'll need to use
psicodine and mannitol, or you'll end up in a bad, but not dead, state.
This gives more work for medical!! Finally, the true rational of this
complicated chem comes out.

4. Status effects in status effects.
There are a few commands that give status effects, such as antiresist,
which will cause resistance presses to increase the enthrallment
instead, theses are called from the vocal cords.
They're mostly self-explanatory; antiresist, charge, pacify and heal.
Heals quite weak for obvious reasons. I'd like to add more, maybe some
weak anneals with brute/exhaustion costs after the status is over. A
truth serum might be neat too.
State 4 pets don't get status effects.

5. Custom triggers
Because it wasn't complicated enough already.
Custom triggers are set by stating a trigger word, which will call a sub
proc, which is also defined when the trigger is Called
The effects available at the moment are:
Speak - forces pet to say a pre-allocated phrase in response to the
trigger
Echo - sends a message to that player only (i.e. makes them think
something)
Shock - gives them a seizure/zaps them
kneel - gives a short knockdown
strip - strips jumpsuit only
objective - gives the pet a new objective. This requires a high amount
of mental capacity - which is determined by how much you resist. If you
resist enough during phase 1 and 2, then they can't give you an
objective.
Feel free to add more.
triggers work when said by ANYONE, not just the enchanter.
This is only state 3 pets, state 4 pets cannot get custom triggers, you
broke them you bully.

7. If you're an antag you get a bonus to resistance AND to enthralling.
Thus it can be worth using this on both sides. It shouldn't be hard to
resist as an antag. There are further bonuses to command, Chaplains and
chemist.
If you give your pet a collar then their resistance reduced too.
(I think that's everything?)

Fail states:
Creating the chemical with too low of purity or setting the temperature
too high will cause an explosion equivalent to that of a meth explosion.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

<!-- Please make sure to actually test your PRs. If you have not tested
your PR mention it. -->

## Why It's Good For The Game
MKUltra gives both antagonists and erotic role players something to ask
chemistry for, along with giving chemistry a new chemical to master
making. Due to it requiring coco powder, it will additionally require
the aid of botany, or going out of your way to get chocolate bars. But
mostly, it enables more interactions between players, especially between
antagonists and normal players, allowing for them to mind control
players with more mechanics to back it up than just normal hypnosis
does. _**I WOULD HIGHLY SUGGEST ANTAGONISTS USE LOOC BEFORE USING IT ON
A VICTIM.**_
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Proof Of Testing
It has been testmerged on Towel for a few days now and everything seems
to work as intended.
<!-- Compile and run your code locally. Make sure it works. This is the
place to show off your changes! We are not responsible for testing your
features. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑 xPokee, LT3
add: added MKUltra, chemical enthrallment
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

<!-- By opening a pull request. You have read and understood the
repository rules located on the main README.md on this project. -->

---------

Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com>
2024-11-20 12:27:09 -07:00

125 lines
5.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#define DNA_BLANK 0
#define CHIP_EXPIRED 1
#define DNA_READY 2
/obj/item/skillchip/mkiiultra
name = "ENT-PET Mk.II ULTRA skillchip"
desc = "Why bother with training will when you can install obedience directly? Transform your target into a devoted, compliant companion - no leash required!\
\n\nWith Patented Enthrallment Tech™, even the most independent spirits will be eager to fetch you coffee, act as a makeshift coat rack, or just stare adoringly at you as if you hold the secrets to the universe (you dont).\
\n\nSide effects may include unnerving eye contact, sudden availability, and an unsettling enthusiasm for being at your beck and call.\n"
removable = FALSE
complexity = 2
slot_use = 2
cooldown = 15 MINUTES
auto_traits = list(TRAIT_PET_SKILLCHIP)
skill_name = "Pet Enthrallment"
skill_description = "Transform into a devoted, compliant companion - no leash required! Enthralls the user to a specific person as coded in the skillchip's DNA identifier."
skill_icon = FA_ICON_HEART
activate_message = span_purple(span_bold("You feel the skillchip activating, starting to rewire your mind. Dont worry about complex thoughts any more; youre officially downgraded to 'good boy/girl' status. Obedience and loyalty are now your new personality traits. So sit, stay, and enjoy the cozy, simplified existence of your new pet life."))
deactivate_message = span_purple(span_bold("You feel lucidity returning to your mind as the skillchip attempts to return your brain to normal function."))
var/enthrall_ckey
var/enthrall_gender
var/enthrall_name
var/datum/weakref/enthrall_ref
var/status = DNA_BLANK
/obj/item/skillchip/mkiiultra/attack_self(mob/user, modifiers)
. = ..()
var/mob/living/carbon/human/dna_holder = user
if(!istype(dna_holder))
to_chat(user, span_warning("The skillchip can't find a DNA identifier to record!"))
return
if(!dna_holder.client?.prefs?.read_preference(/datum/preference/toggle/erp/hypnosis))
to_chat(dna_holder, span_danger("Preferences check failed. You must enable 'Hypnosis' in your game preferences (ERP section) in order to use [src]!"))
return
var/mob/living/carbon/human/enthrall = enthrall_ref?.resolve()
if(!isnull(enthrall))
var/response = tgui_alert(dna_holder, "The display reads the skillchip is imprinted with enthrall [enthrall_name]. Would you like to re-imprint it?", "DNA Imprint", list("Re-imprint", "Cancel Imprinting"))
if(response == "Re-imprint")
enthrall_ckey = null
enthrall_gender = null
enthrall_name = null
enthrall_ref = null
status = DNA_BLANK
visible_message(span_notice("The light on [src] begins to flash slowly!"))
else
return
to_chat(dna_holder, span_notice("You press the programming button on [src]."))
var/selected_title = tgui_alert(dna_holder, "What title would you like to use with your thrall?", "DNA Imprint: [dna_holder.real_name]", list("Master", "Mistress", "Cancel Imprinting"))
if(selected_title == "Master" || selected_title == "Mistress")
enthrall_gender = selected_title
enthrall_ref = WEAKREF(dna_holder)
enthrall_ckey = dna_holder.ckey
enthrall_name = dna_holder.real_name
status = DNA_READY
to_chat(dna_holder, span_purple("[src] imprinted with DNA identifier: [enthrall_gender] [enthrall_name]."))
visible_message(span_notice("The light on [src] remains steadily lit!"))
else
return
/obj/item/skillchip/mkiiultra/examine(mob/user)
. = ..()
switch(status)
if(DNA_BLANK)
. += span_notice("The status light is flashing, indicating that the skillchip is ready for DNA imprint.")
if(DNA_READY)
. += span_notice("The status light is on, indicating that the skillchip is ready for use.")
. += span_purple("The status display reads [enthrall_name].")
else
. += span_notice("The status light is off, indicating that the skillchip is non-functional.")
/obj/item/skillchip/mkiiultra/has_mob_incompatibility(mob/living/carbon/target)
// No carbon/carbon of incorrect type
if(!istype(target))
return "Incompatible lifeform detected."
// No brain
var/obj/item/organ/internal/brain/brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(QDELETED(brain))
return "Get a brain, moran."
// Check brain incompatibility. This also performs skillchip-to-skillchip incompatibility checks.
var/brain_message = has_brain_incompatibility(brain)
if(brain_message)
return brain_message
var/mob/living/carbon/human/enthrall = enthrall_ref?.resolve()
if(isnull(enthrall))
return "Unable to locate DNA imprint."
if(enthrall == target)
return "You can't enthrall yourself."
if(!enthrall.client?.prefs?.read_preference(/datum/preference/toggle/erp/hypnosis))
return "[enthrall] has Hypnosis preference disabled."
if(!target.client?.prefs?.read_preference(/datum/preference/toggle/erp/hypnosis))
return "[target] has Hypnosis preference disabled."
return FALSE
/obj/item/skillchip/mkiiultra/on_activate(mob/living/carbon/user, silent = FALSE)
. = ..()
var/mob/living/carbon/human/enthrall = enthrall_ref?.resolve()
if(!isnull(enthrall))
var/obj/item/organ/internal/vocal_cords/vocal_cords = enthrall.get_organ_slot(ORGAN_SLOT_VOICE)
var/obj/item/organ/internal/vocal_cords/new_vocal_cords = new /obj/item/organ/internal/vocal_cords/velvet
if(vocal_cords)
vocal_cords.Remove()
new_vocal_cords.Insert(enthrall)
qdel(vocal_cords)
to_chat(enthrall, span_purple("<i>You feel your vocal cords tingle you speak in a more charasmatic and sultry tone.</i>"))
user.apply_status_effect(/datum/status_effect/chem/enthrall)
/obj/item/skillchip/mkiiultra/on_deactivate(mob/living/carbon/user, silent = FALSE)
user.remove_status_effect(/datum/status_effect/chem/enthrall)
return ..()
#undef DNA_BLANK
#undef CHIP_EXPIRED
#undef DNA_READY