From 854c0097d4b3660445ed03b4a3e3bb7629629f2c Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 8 May 2019 23:13:51 +0100 Subject: [PATCH] MC 5/6th done, probably. --- code/modules/surgery/organs/vocal_cords.dm | 55 ++++++++- .../code/datums/mood_events/chem_events.dm | 2 +- .../code/datums/status_effects/chems.dm | 112 +++++++++++++++--- 3 files changed, 149 insertions(+), 20 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index dd9470d952..96b8ce99e3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -702,7 +702,9 @@ else span_list = list() - user.say(message, sanitize = FALSE)//Removed spans = span_list, It should just augment normal speech + user.say(message, sanitize = TRUE)//Removed spans = span_list, It should just augment normal speech + + //FIND THRALLS message = lowertext(message) var/mob/living/list/listeners = list() @@ -721,6 +723,8 @@ cooldown = COOLDOWN_NONE return cooldown + //POWER CALCULATIONS + var/power_multiplier = base_multiplier // Not sure I want to give extra power to anyone at the moment...? We'll see how it turns out @@ -808,6 +812,8 @@ //phase 3 //var/static/regex/hallucinate_words = regex("see the truth|hallucinate") var/static/regex/wakeup_words = regex("revert|awaken|*snap") + var/static/regex/custom_words = regex("new trigger|listen to me") + var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|objective")//What a descriptive name! var/static/regex/heal_words = regex("live|heal|survive|mend|life|heroes never die") var/static/regex/hurt_words = regex("die|suffer|hurt|pain|death") var/static/regex/bleed_words = regex("bleed|there will be blood") @@ -977,6 +983,52 @@ to_chat(C, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") L.SetSleeping(0) + //CUSTOM TRIGGERS + else if((findtext(message, custom_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new trigger!") + return + else + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if E.mental_capacity > 150 || message == "objective" + var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) + if ((findtext(trigger, custom_words_words))) + if (trigger2 == "speak" || trigger2 == "echo") + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + E.customTriggers[trigger] = list(trigger2, trigger3) + else + E.customTriggers[trigger] = trigger2 + else + to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") + + //CUSTOM OBJECTIVE + else if((findtext(message, objective_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new objective!") + return + else + user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if E.mental_capacity > 150 || message == "objective" + var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) + if(!LAZYLEN(objectives)) + return + //Pets don't understand harm + objective = replacetext(lowertext(objective), "kill", "hug") + objective = replacetext(lowertext(objective), "murder", "cuddle") + objective = replacetext(lowertext(objective), "harm", "snuggle") + objective = replacetext(lowertext(objective), "decapitate", "headpat") + objective = replacetext(lowertext(objective), "strangle", "meow at") + E.objective += objectives + else + //TO ADD //progam triggers and responses with mental costs @@ -995,7 +1047,6 @@ for(var/I in items) M.dropItemToGround(I, TRUE) - / var/i = 0 //STUN diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index f14a31a46d..1d3a4100d7 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -13,7 +13,7 @@ /datum/mood_event/enthrallscold mood_change = -12 - description = "I've failed my Master... I feel like crying.\n"//aaa I'm not kinky enough for this + description = "I've failed Master... What a bad, bad pet!\n"//aaa I'm not kinky enough for this timeout = 600 /datum/mood_event/enthrallmissing1 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 363cbad2a3..4bb67e3183 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -180,29 +180,29 @@ var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) var/withdrawal = FALSE var/withdrawalTick = 0 - var/customTriggers + var/list/customTriggers = list() /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) if(M.ID == enthrallID) owner.remove_status_effect(src)//This should'nt happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed - //Might need to add recirect component for listening too. + //Might need to add redirect component for listening too. mental_capacity = 500 - B.get_brain_damage() /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) if(M.has_trait(TRAIT_MINDSHIELD)) resistanceTally += 5 if(prob(20)) - to_chat(owner, "You feel your lucidity returning as the mindshield attempts to return your brain to normal function.") + to_chat(owner, "You feel lucidity returning to your mind as the mindshield attempts to return your brain to normal function.") //phase specific events switch(phase) if(-1)//fully removed owner.remove_status_effect(src) - if(0)// sleeper agent + else if(0)// sleeper agent return - if(1)//Initial enthrallment + else if(1)//Initial enthrallment if (enthrallTally > 100) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. @@ -215,7 +215,19 @@ owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. return if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name]", "[enthrallID.name]", "")].") + to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name].", "You can't keep your eyes off [enthrallID.name].", "[enthrallID.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallID.name]", "[enthrallID.name] is so sexy and dominant, it feels right to obey them.")].") + else if (2) //partially enthralled + if (enthrallTally > 150) + phase += 1 + mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. + enthrallTally = 0 + return + if (resistanceTally > 150) + enthrallTally *= 0.5 + phase -= 1 + resistanceTally = 0 + owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. + return //distance calculations switch(get_dist(enthrallID, owner)) @@ -232,7 +244,8 @@ enthrallTally += 2 else if (phase < 3) - resistance + resistance += 10//If you've no chem, then you break out quickly + to_chat(owner, "You're starting to miss your Master/Mistress.") if (mental_capacity <= 500) if (user.has_reagent("mannitol")) mental_capacity += 1 @@ -246,7 +259,7 @@ prob(10) to_chat(owner, "You're starting to miss your Master/Mistress.") prob(5) - M.adjustBrainLoss(1) + owner.adjustBrainLoss(1) if(41) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) if(42 to 65) @@ -255,13 +268,22 @@ if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) + owner.stuttering += 20 + owner.jitteriness += 20 if(67 to 90) - M.emote("cry")//does this exist? + prob(10) + owner.SetStun(10, 0) + owner.emote("cry")//does this exist? + pro(10) + owner.adjustBrainLoss(2) + withdrawalTick++ + resistance += deltaResist + //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. //message enthrallID "name appears to have mentally processed their last command." @@ -281,13 +303,62 @@ */ /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + var/mob/living/carbon/C = owner + for (trigger in customTriggers) + if (trigger == message)//if trigger1 is the message + + //Speak (Forces player to talk) + if (customTriggers[trigger][1] == "speak")//trigger2 + C.visible_message("Your mouth moves on it's own, before you can even catch it. Though you find yourself fully believing in the validity of what you just said and don't think to question it.") + (C.say([customTriggers[trigger][2]]))//trigger3 + + + //Echo (repeats message!) + else if (customTriggers[trigger][1] == "echo")//trigger2 + (to_chat(owner, customTriggers[trigger][2]))//trigger3 + + //Shocking truth! + else if (customTriggers[trigger] == "shock") + if (C.canbearoused) + C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is + C.adjustArousalLoss(5) + to_chat(owner, "Your muscles seize up, then start spasming wildy!") + else + C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect + + //wah intensifies + else if (customTriggers[trigger][1] == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + if (C.canbearoused) + if (C.getArousalLoss() > 80) + C.mob_climax(forced_climax=TRUE) + else + C.adjustArousalLoss(10) + else + C.throw_at(get_step_towards(speaker,C), 3, 1) //cut this if it's too hard to get working + + //kneel (knockdown) + else if (customTriggers[trigger][1] == "kneel")//as close to kneeling as you can get, I suppose. + C.Knockdown(20) + + //strip (some) clothes + else if (customTriggers[trigger][1] == "strip")//This wasn't meant to just be a lewd thing oops + var/mob/living/carbon/human/o = owner + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + C.visible_message("You feel compelled to strip your clothes.") + + //add more fun stuff! + + return /* /datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) //3 stages, each getting worse */ /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) - if (status == "Sleeper") + if (status == "Sleeper" || phase == 0) return else if (status == "Antiresist")//If ordered to not resist if (statusStrength > 0) @@ -295,6 +366,10 @@ return else status = null + if (deltaResist != 0)//So you can't spam it, you get one deltaResistance per tick. + deltaResist += 0.1 //Though I commend your spamming efforts. + return + if(prob(10)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") @@ -335,7 +410,7 @@ //Command staff has authority, if(owner.mind.assigned_role in GLOB.command_positions) deltaResist *= 1.4 - //if(owner.first_name == "skylar"); power_multiplier *= 0.8 //for skylar //I'm kidding + //if(owner.has_status == "sub"); power_multiplier *= 0.8 //for skylar //I'm kidding <3 //Chemists should be familiar with drug effects if(owner.mind.assigned_role == "Chemist") deltaResist *= 1.3 @@ -344,14 +419,17 @@ //Your Thralls are like pets, you need to keep them happy. if(owner.nutrition < 250) deltaResist += (250-owner.nutrition)/100 - if(owner.health < 120)//Harming your thrall will make them rebel harder. + if(owner.health < 100)//Harming your thrall will make them rebel harder. deltaResist *= ((120-owner.health)/100)+1 //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong) //Mental health could play a role too in the other direction //If master gives you a collar, you get a sense of pride if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) - deltaResist *= 0.8 + deltaResist *= 0.5 + + if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) + power_multiplier *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance @@ -360,11 +438,11 @@ var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") if(findtext(message, enthral_words)) if(enthrallID.gender == FEMALE) - message = replacetext(message, enthrallID.real_name, "Mistress") - message = replacetext(message, enthrallID.first_name(, "Mistress") + message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Mistress") + message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Mistress") else - message = replacetext(message, enthrallID.real_name, "Master") - message = replacetext(message, enthrallID.first_name(, "Master") + message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Master") + message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Master") return message /* /datum/status_effect/chem/OwO