diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 933c38505b..2660aaabc0 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -15,7 +15,7 @@ /datum/component/mood/Initialize() if(!isliving(parent)) return COMPONENT_INCOMPATIBLE - + START_PROCESSING(SSmood, src) RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event) @@ -118,6 +118,8 @@ if(owner.client && owner.hud_used) if(sanity < 25) screen_obj.icon_state = "mood_insane" + else if (owner.has_status_effect(/datum/status_effect/chem/enthral))//Fermichem enthral chem, maybe change? + screen_obj.icon_state = "mood_entrance" else screen_obj.icon_state = "mood[mood_level]" @@ -160,7 +162,7 @@ clear_event(null, "depression") holdmyinsanityeffect = insanity_effect - + HandleNutrition(owner) /datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 26322c3b44..880823e2d7 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -310,7 +310,7 @@ /obj/item/storage/pill_bottle/penis_enlargement name = "penis enlargement pills" - desc = "Made by the Fermichem corporation - They have a little picture of Doctor Ronald Hyatt with a giant dong on them. The warming states not to take more than 10u at a time." + desc = "Made by Fermichem - They have a little picture of Doctor Ronald Hyatt with a giant dong on them. The warming states not to take more than 10u at a time." /obj/item/storage/pill_bottle/penis_enlargement/PopulateContents() for(var/i in 1 to 7) @@ -318,7 +318,7 @@ /obj/item/storage/pill_bottle/breast_enlargement name = "breast enlargement pills" - desc = "Made by the Fermichem corporation - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time." + desc = "Made by Fermichem - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time." /obj/item/storage/pill_bottle/breast_enlargement/PopulateContents() for(var/i in 1 to 7) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 95cefbe70c..5a1a06f954 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -2,10 +2,6 @@ #define COOLDOWN_DAMAGE 600 #define COOLDOWN_MEME 300 #define COOLDOWN_NONE 100 -#define COOLDOWN_VSTUN 800 -#define COOLDOWN_VDAMAGE 300 -#define COOLDOWN_VTHRAL 200 -#define COOLDOWN_VNONE 100 /obj/item/organ/vocal_cords //organs that are activated through speech with the :x channel name = "vocal cords" @@ -718,7 +714,7 @@ if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)//Check to see if pet is on cooldown from last command - if (E.cooldown != 0) + if (E.cooldown != 0)//If they're on cooldown you can't give them more commands. continue listeners += L @@ -795,67 +791,42 @@ power_multiplier *= 1.5//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. */ - //phase 1 - var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile|so easy") - var/static/regex/reward_words = regex("good boy|good girl|good pet") + //Mixables + var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words + var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words + var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") - var/static/regex/attract_words = regex("come here|come to me|get over here|attract") - var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") - var/static/regex/desire_words = regex("good boy|good girl|good pet") + //phase 0 + var/static/regex/saymyname_words = regex("say my name|who am i|whoami") + var/static/regex/wakeup_words = regex("revert|awaken|*snap") + //phase1 + var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") + var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting var/static/regex/forget_words = regex("forget|muddled|awake and forget") - //phase 2 + var/static/regex/attract_words = regex("come here|come to me|get over here|attract") var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //lewd + //phase 2 var/static/regex/awoo_words = regex("howl|awoo|bark") var/static/regex/nya_words = regex("nya|meow|mewl") - var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") - var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown") var/static/regex/sleep_words = regex("sleep|slumber|rest") - var/static/regex/vomit_words = regex("vomit|throw up|sick") - //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") - var/static/regex/burn_words = regex("burn|ignite") - var/static/regex/hot_words = regex("heat|hot|hell") - var/static/regex/cold_words = regex("cold|cool down|chill|freeze") - var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah|get away|repulse") - var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify") - var/static/regex/saymyname_words = regex("say my name|who am i|whoami") - var/static/regex/knockknock_words = regex("knock knock") - //var/static/regex/statelaws_words = regex("state laws|state your laws") - var/static/regex/move_words = regex("move|walk") - var/static/regex/left_words = regex("left|west|port") - var/static/regex/right_words = regex("right|east|starboard") - var/static/regex/up_words = regex("up|north|fore") - var/static/regex/down_words = regex("down|south|aft") + var/static/regex/strip_words = regex("strip|derobe|nude") var/static/regex/walk_words = regex("slow down") var/static/regex/run_words = regex("run") - var/static/regex/helpintent_words = regex("help|hug") - var/static/regex/disarmintent_words = regex("disarm") - var/static/regex/grabintent_words = regex("grab") - var/static/regex/harmintent_words = regex("harm|fight|punch") - var/static/regex/throwmode_words = regex("throw|catch") - var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault") - var/static/regex/speak_words = regex("speak|say something") + var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel") + //phase 3 + var/static/regex/statecustom_words = regex("state triggers|state your triggers") + 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/objective_words = regex("new objective|obey this command|unable to resist|compulsed") + var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") + var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") + var/static/regex/hallucinate_words = regex("trip balls|hallucinate") + var/static/regex/hot_words = regex("heat|hot|hell") + var/static/regex/cold_words = regex("cold|cool down|chill|freeze") var/static/regex/getup_words = regex("get up") - var/static/regex/sit_words = regex("sit") - var/static/regex/stand_words = regex("stand") - var/static/regex/dance_words = regex("dance") - var/static/regex/jump_words = regex("jump") - var/static/regex/salute_words = regex("salute") - var/static/regex/deathgasp_words = regex("play dead") - var/static/regex/clap_words = regex("clap|applaud") - //var/static/regex/honk_words = regex("ho+nk") //hooooooonk - //var/static/regex/multispin_words = regex("like a record baby|right round") - - //var/static/regex/dab_words = regex("dab|mood") //CITADEL CHANGE - //var/static/regex/snap_words = regex("snap") //CITADEL CHANGE - //var/static/regex/bwoink_words = regex("what the fuck are you doing|bwoink|hey you got a moment?") //CITADEL CHANGE + var/static/regex/pacify_words = regex("More and more docile|complaisant|friendly|pacifist") + var/static/regex/charge_words = regex("charge|oorah|attack") var/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25) @@ -888,10 +859,11 @@ L.adjustArousalLoss(1*power_multiplier) else E.resistanceTally /= 2*power_multiplier + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise) E.cooldown += 1 //PUNISH mixable - if(findtext(message, punish_words)) + else if(findtext(message, punish_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) @@ -902,11 +874,31 @@ L.adjustArousalLoss(-2*power_multiplier) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) E.cooldown += 1 + //teir 0 + //SAY MY NAME + if((findtext(message, saymyname_words))) + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /atom/movable/proc/say, "Master"), 5 * i)//When I figure out how to do genedered names put them here + + //WAKE UP + else if((findtext(message, wakeup_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(0) + E.phase = 3 + E.status = null + to_chat(L, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") + L.SetSleeping(0)//Can you hear while asleep? + + //tier 1 //SILENCE else if((findtext(message, silence_words))) - cooldown = COOLDOWN_VSTUN for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/C = C.has_status_effect(/datum/status_effect/chem/enthral) power_multiplier *= distancelist[get_dist(user, V)+1] @@ -916,9 +908,17 @@ C.silent += ((10 * power_multiplier) * E.phase) E.cooldown += 3 + //Antiresist + else if((findtext(message, antiresist_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.status = "Antiresist" + E.statusStrength = (1 * power_multiplier * E.phase) + E.cooldown += 6//Too short? + //RESIST - else if((findtext(message, silence_words))) - cooldown = COOLDOWN_VSTUN + else if((findtext(message, resist_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) power_multiplier *= distancelist[get_dist(user, V)+1] @@ -926,8 +926,7 @@ E.cooldown += 2 //FORGET (A way to cancel the process) - else if((findtext(message, silence_words))) - cooldown = COOLDOWN_VSTUN + else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) C.Sleeping(40) @@ -941,68 +940,121 @@ //ATTRACT else if((findtext(message, attract_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) E.cooldown += 3 - //teir 2 //ORGASM else if((findtext(message, orgasm_words))) - cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/carbon/human/H = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthral/E = H.has_status_effect(/datum/status_effect/chem/enthral) if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) H.setArousalLoss(H.min_arousal) - L.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.cooldown += 5 + E.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthralTally += power_multiplier + else + E.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthralTally += power_multiplier*1.1 + to_chat(H, "Your Masters command whites out your mind in bliss!") + E.cooldown += 6 + + //teir 2 //awoo else if((findtext(message, awoo_words))) - cooldown = 0 for(var/V in listeners) - var/mob/living/M = V - M.say("*awoo") + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY) + var/mob/living/M = V + M.say("*awoo") + E.cooldown += 1 //Nya else if((findtext(message, nya_words))) - cooldown = 0 for(var/V in listeners) - var/mob/living/M = V - playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - M.emote("me","lets out a nya!") + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY) + var/mob/living/M = V + playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) + M.emote("me","lets out a nya!") + E.cooldown += 1 //SLEEP else if((findtext(message, sleep_words))) - cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) switch(E.phase) - if(2 to 4) + if(2 to INFINITY) C.Sleeping(20 * power_multiplier) E.cooldown += 10 - - //WAKE UP - else if((findtext(message, wakeup_words))) - cooldown = COOLDOWN_DAMAGE + //STRIP + else if((findtext(message, strip_words))) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) switch(E.phase) - if(0) - E.phase = 3 - E.status = null - 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) + if(2 to INFINITY)//Tier 2 only + E.phase = 1 + var/items = M.get_contents() + for(var/I in items) + M.dropItemToGround(I, TRUE) + to_chat(H, "Before you can even think about it, you quickly remove your clothes in response to your Master's command.") + E.cooldown += 10 + + //WALK + else if((findtext(message, walk_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY)//Tier 2 only + if(L.m_intent != MOVE_INTENT_WALK) + L.toggle_move_intent() + E.cooldown += 1 + + //RUN + else if((findtext(message, run_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY)//Tier 2 only + if(L.m_intent != MOVE_INTENT_RUN) + L.toggle_move_intent() + E.cooldown += 1 + + //KNOCKDOWN + else if(findtext(message, knockdown_words)) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 2 only + L.Knockdown(20 * power_multiplier * E.phase) + E.cooldown += 8 + + //tier3 + + //STATE TRIGGERS + else if((findtext(message, statecustom_words))) + for(var/V in listeners) + var/speaktrigger =="" + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if (!E.customTriggers == list())//i.e. if it's not empty + for (trigger in E.customTriggers) + speaktrigger = "[trigger]\n" + L.say(speaktrigger) //CUSTOM TRIGGERS else if((findtext(message, custom_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) @@ -1060,102 +1112,98 @@ to_chat(C, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") - //TO ADD - //progam triggers and responses with mental costs - //Antiresist - //Figure out cooldown + //I dunno how to do state objectives without them revealing they're an antag - //STRIP - else if((findtext(message, strip_words))) + //HEAL (maybe make this nap instead?) + else if((findtext(message, heal_words))) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) switch(E.phase) - if(2 to INFINITY)//Tier 2 only - E.phase = 1 - var/items = M.get_contents() - for(var/I in items) - M.dropItemToGround(I, TRUE) - + if(3 to INFINITY)//Tier 3 only + E.status = "heal" + E.statusStrength = (5 * power_multiplier) + E.cooldown += 5 var/i = 0 //STUN if(findtext(message, stun_words)) - cooldown = COOLDOWN_STUN - for(var/V in listeners) - var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = has_status_effect(/datum/status_effect/chem/enthral) - L.Stun(30 * power_multiplier) - - //KNOCKDOWN - else if(findtext(message, knockdown_words)) - cooldown = COOLDOWN_STUN for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - E.cooldown - L.Knockdown(60 * power_multiplier) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + L.Stun(30 * power_multiplier) + E.cooldown += 8 //HALLUCINATE else if((findtext(message, hallucinate_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/C in listeners) - new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) - - //HEAL (maybe make this nap instead?) - else if((findtext(message, heal_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) - var/mob/living/L = V + var/mob/living/carbon/C = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - E.status = "heal" - E.statusStrength = (5 * power_multiplier) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) //HOT else if((findtext(message, hot_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it + to_chat(L, "You feel your metabolism speed up!") //COLD else if((findtext(message, cold_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(-10 * power_multiplier)//This + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + L.adjust_bodytemperature(-10 * power_multiplier)//This + to_chat(L, "You feel your metabolism slow down!") - //WHO ARE YOU? - else if((findtext(message, whoareyou_words))) - cooldown = COOLDOWN_MEME + + //GET UP + else if((findtext(message, getup_words))) for(var/V in listeners) var/mob/living/L = V - var/text = "" - if(is_devil(L)) - var/datum/antagonist/devil/devilinfo = is_devil(L) - text = devilinfo.truename - else - text = L.real_name - addtimer(CALLBACK(L, /atom/movable/proc/say, text), 5 * i) - i++ + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + if(L.resting) + L.lay_down() //aka get up + L.SetStun(0) + L.SetKnockdown(0) + L.SetUnconscious(0) //i said get up i don't care if you're being tased + E.cooldown += 10 //This could be really strong - //SAY MY NAME - else if((findtext(message, saymyname_words))) - cooldown = COOLDOWN_MEME + //PACIFY + else if((findtext(message, pacify_words))) for(var/V in listeners) var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, "master"), 5 * i)//When I figure out how to do genedered names put them here - i++ + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + E.status = "pacify" + E.cooldown += 10 - //STATE TRIGGERS - else if((findtext(message, statelaws_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/silicon/S in listeners) - S.statelaws(force = 1) + //CHARGE + else if((findtext(message, charge_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + E.status = "charge" + E.cooldown += 10 + + /* THE MAYBE PILE //MOVE else if((findtext(message, move_words))) - cooldown = COOLDOWN_MEME var/direction if(findtext(message, up_words)) direction = NORTH @@ -1170,22 +1218,6 @@ var/mob/living/L = V addtimer(CALLBACK(GLOBAL_PROC, .proc/_step, L, direction? direction : pick(GLOB.cardinals)), 10 * (iter - 1)) - //WALK - else if((findtext(message, walk_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - if(L.m_intent != MOVE_INTENT_WALK) - L.toggle_move_intent() - - //RUN - else if((findtext(message, run_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - if(L.m_intent != MOVE_INTENT_RUN) - L.toggle_move_intent() - //HELP INTENT else if((findtext(message, helpintent_words))) cooldown = COOLDOWN_MEME @@ -1225,16 +1257,6 @@ addtimer(CALLBACK(L, /atom/movable/proc/say, pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i) i++ - //GET UP - else if((findtext(message, getup_words))) - cooldown = COOLDOWN_DAMAGE //because stun removal - for(var/V in listeners) - var/mob/living/L = V - if(L.resting) - L.lay_down() //aka get up - L.SetStun(0) - L.SetKnockdown(0) - L.SetUnconscious(0) //i said get up i don't care if you're being tased //SIT else if((findtext(message, sit_words))) @@ -1268,6 +1290,7 @@ var/mob/living/L = V addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ + */ else cooldown = COOLDOWN_NONE @@ -1275,7 +1298,7 @@ if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - SSblackbox.record_feedback("tally", "voice_of_god", 1, log_message) + SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) return cooldown diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 77450b6ac3..14f5540f38 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 1d3a4100d7..e46bf023f7 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -17,13 +17,17 @@ timeout = 600 /datum/mood_event/enthrallmissing1 - mood_change = -10 + mood_change = -5 description = "I feel empty when Master's not around..\n" /datum/mood_event/enthrallmissing2 - mood_change = -15 + mood_change = -10 description = "I feel so lost in this complicated world without Master, where are they?!\n" /datum/mood_event/enthrallmissing3 - mood_change = -25 + mood_change = -15 description = "Where are you Master??!\n" + +/datum/mood_event/enthrallmissing4 + mood_change = -25 + description = "You're all alone, It's so hard to continute without your Master...\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 8f611e0e15..18281da27b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -164,31 +164,33 @@ alert_type = null var/mob/living/E //E for enchanter //var/mob/living/V = list() //V for victims - var/enthrallTally = 10 - var/resistanceTally = 0 - var/deltaResist - var/deltaEnthrall + var/enthrallTally = 1 //Keeps track of the enthralling process + var/resistanceTally = 0 //Keeps track of the resistance + var/deltaResist //The total resistance added per resist click + var/deltaEnthrall //currently unused (i think) var/phase = 1 //-1: resisted state, due to be removed.0: sleeper agent, no effects unless triggered 1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled, 4th Mindbroken - var/status = null - var/statusStrength = 0 - var/enthrallID - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/status = null //status effects + var/statusStrength = 0 //strength of status effect + var/enthrallID //Enchanter's name/ID + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. - var/mindbroken = FALSE - var/datum/weakref/redirect_component1 - var/datum/weakref/redirect_component2 - var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) - var/withdrawal = FALSE - var/withdrawalTick = 0 - var/list/customTriggers = list() + var/mental_cost //Current cost of custom triggers + var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 + var/datum/weakref/redirect_component1 //resistance + var/datum/weakref/redirect_component2 //say + var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) //Distance multipliers + var/withdrawal = FALSE //withdrawl + var/withdrawalTick = 0 //counts how long withdrawl is going on for + var/list/customTriggers = list() //the list of custom triggers (maybe have to split into two) /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 + owner.remove_status_effect(src)//This shouldn't 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 redirect component for listening too. mental_capacity = 500 - B.get_brain_damage() + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) if(M.has_trait(TRAIT_MINDSHIELD)) @@ -199,6 +201,7 @@ //phase specific events switch(phase) if(-1)//fully removed + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") owner.remove_status_effect(src) else if(0)// sleeper agent return @@ -207,13 +210,15 @@ phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 - return + to_chat(owner, "Your conciousness slips, as you sink deeper into trance.") + continue if (resistanceTally > 100) enthrallTally *= 0.5 - phase -= 1 + phase = -1 resistanceTally = 0 + to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. - return + continue if(prob(10)) 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 @@ -221,21 +226,33 @@ phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 - return + to_chat(owner, "Your mind gives, eagerly obeying and serving [enthrallID.name].") + to_chat(owner, "You are now fully enthralled to [enthrallID.name], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your master. Equally you are unable to commit suicide, even if ordered to, as you cannot server your Master in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + continue if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 - owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. - return - else if (3) - - else if (4) + to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [enthrallID.name].") + //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, + continue + else if (3)//fully entranced + if (resistanceTally >= 250 && withdrawalTick >= 150) + enthrallTally = 0 + phase -= 1 + resistanceTally = 0 + to_chat(owner, "The separation from you master sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") + else if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !user.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 - mental_capacity -= resistanceTally - resistanceTally = 0 + E.customTriggers = list() + to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive ammounts of chem injected into your system earlier, .") + M.slurring = 0 + M.confused = 0 + else + return//If you break the mind of someone, you can't use status effects on them. + //distance calculations switch(get_dist(enthrallID, owner)) @@ -244,17 +261,21 @@ var/withdrawal = FALSE if(withdrawalTick > 0) withdrawalTick -= 2 + M.hallucination = max(0, M.hallucination - 2) + M.stuttering = max(0, M.stuttering - 2) + M.jitteriness = max(0, M.jitteriness - 2) if(9 to INFINITY)//If var/withdrawal = TRUE //chem calculations if (user.has_reagent("MKUltra")) - enthrallTally += 2 + if (phase >= 2) + enthrallTally += phase else if (phase < 3) 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 (mental_capacity <= 500 || phase == 4) if (user.has_reagent("mannitol")) mental_capacity += 1 if (user.has_reagent("neurine")) @@ -262,51 +283,112 @@ //Withdrawal subproc: if (withdrawal == TRUE)//Your minions are really REALLY needy. - switch(withdrawalTick) + switch(withdrawalTick)//denial if(20 to 40)//Gives wiggle room, so you're not SUPER needy - prob(10) + if(prob(10)) to_chat(owner, "You're starting to miss your Master/Mistress.") - prob(5) - owner.adjustBrainLoss(1) + if(prob(10)) + owner.adjustBrainLoss(0.5) + to_chat(owner, "They'll surely be back soon") //denial if(41) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) - if(42 to 65) - prob(10) - to_chat(owner, "You're starting to miss your Master/Mistress.") + if(42 to 65)//barganing + if(prob(10)) + to_chat(owner, "They are coming back, right...?") + owner.adjustBrainLoss(1) + if(prob(20)) + to_chat(owner, "I just need to be a good pet for Master, they'll surely return if I'm a good pet.") + owner.adjustBrainLoss(-2) 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) - prob(10) - owner.SetStun(10, 0) + if(67 to 90) //anger + if(prob(30)) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your Master.") + if(90) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3) + to_chat(owner, "You need to find your Master at all costs, you can't hold yourself back anymore.") + if(91 to 120)//depression + if(prob(20)) + owner.adjustBrainLoss(1) + owner.stuttering += 2 + owner.jitteriness += 2 + if(prob(25)) + M.hallucination += 2 + if(121) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4) + to_chat(owner, "You can hardly find the strength to continue without your Master.") + if(120 to 140) //depression + if(prob(25)) + owner.SetStun(20, 0) owner.emote("cry")//does this exist? - pro(10) + to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your Master oncemore overwhelms you.") owner.adjustBrainLoss(2) - - - + owner.stuttering += 2 + owner.jitteriness += 2 + if(prob(10)) + deltaResist += 5 + if(140 to INFINITY) //acceptance + if(prob(20)) + deltaResist += 5 + if(prob(20)) + to_chat(owner, "Maybe you'll be okay without your Master.") + if(prob(10)) + owner.adjustBrainLoss(1) + M.hallucination += 5 withdrawalTick++ //Status subproc - statuses given to you from your Master + //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist. if (!status == null) switch(status) if("Antiresist") if (statusStrength == 0) status = null + to_chat(owner, "You feel able to resist oncemore.") else statusStrength -= 1 - if("heal") + else if("heal") if (statusStrength == 0) status = null + to_chat(owner, "You finish licking your wounds.") else statusStrength -= 1 owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) + cooldown += 1 //Cooldown doesn't process till status is done + else if("charge") + owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") + status = "charged" + to_chat(owner, "Your Master's order fills you with a burst of speed!") + + else if ("charged") + if (statusStrength == 0) + status = null + owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") + owner.Knockdown(30) + to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") + else + statusStrength -= 1 + cooldown += 1 //Cooldown doesn't process till status is done + + else if ("pacify") + owner.add_trait(TRAIT_PACIFISM, "MKUltra") + status = null + + //Truth serum? + //adrenals? + //M.next_move_modifier *= 0.5 + //M.adjustStaminaLoss(-5*REM) //final tidying resistance += deltaResist diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index cc041b4305..ebef9087e4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -393,13 +393,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition += 500 //If the reaction explodes /* -/datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! +/datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies //var/mob/living/simple_animal/slime/S = new(get_turf(location_created),"grey") var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory - S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny S.name = "Living teratoma" S.real_name = "Living teratoma"//horrifying!! - S.rabid = 1//Make them an angery boi + S.rabid = 1//Make them an angery boi, grr grr to_chat("The cells clump up into a horrifying tumour.") */ @@ -457,7 +457,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition = M.nutrition + (M.nutrition/2) if(74) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") - if (M.nutrition < 20000) + if (M.nutrition < 20000) //whoever knows the maxcap, please let me know, this seems a bit low. M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(75 to 85) M.adjustToxLoss(1, 0)// the warning! @@ -577,13 +577,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING W = nW ..() +//TODO: failing the reaction creates a penis instead. /datum/reagent/fermi/PElarger // Due to popular demand...! name = "Incubus draft" id = "PElarger" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermicem corp and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? - color = "#H60584" // rgb: 96, 0, 255 + color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" - overdose_threshold = 12 + overdose_threshold = 12 //ODing makes you male and removes female genitals metabolization_rate = 0.5 //var/mob/living/carbon/M @@ -597,7 +598,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING */ var/mob/living/carbon/human/H -/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size +/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) @@ -613,7 +614,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING P = nP P.cached_length = P.cached_length + 0.1 - if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? + if (P.cached_length >= 20.5 && P.cached_length < 21) //too low? Yes, 20 is the max if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") @@ -743,13 +744,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING description = "Need a description." color = "#A080H4" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" - metabolization_rate = 0.5 - overdose_threshold = 200 + //metabolization_rate = 0.5 + overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. //addiction_threshold = 30 //addiction_stage1_end = 9999//Should never end. var/creatorID //add here -/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) +/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) + ..() if(!creatorID) CRASH("Something went wrong in enthral creation") else if(M.ID == creatorID) @@ -758,7 +760,31 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING Vc.Remove(M) nVc.Insert(M) qdel(Vc) + to_chat(owner, "You feel your vocal chords tingle as your voice becomes more sultry.") else + M.apply_status_effect(/datum/status_effect/chem/enthrall) + +/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthral) + E.enthrallTally += 1 + M.adjustBrainLoss(0.1) + ..() + +/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M) + owner.add_trait(TRAIT_PACIFISM, "MKUltra") + if (!M.has_status_effect(/datum/status_effect/chem/enthral)) + M.apply_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthral) + to_chat(owner, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [enthrallID.name].") + M.slurring = 100 + M.confused = 100 + E.phase = 4 + E.mental_capacity = 0 + E.customTriggers = list() + +/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) + M.adjustBrainLoss(0.2) + ..() //Requires player to be within vicinity of creator //bonuses to mood