mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-20 14:45:05 +00:00
<!-- 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>
125 lines
5.6 KiB
Plaintext
125 lines
5.6 KiB
Plaintext
#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 don’t).\
|
||
\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. Don’t worry about complex thoughts any more; you’re 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
|