From 485def8d2808bf83940f9a51d15733ee6b1b3f1a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 21 May 2019 22:06:55 +0100 Subject: [PATCH] More fixed upon the last! --- code/modules/reagents/chemistry/holder.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 46 +++++++++++++------ .../code/datums/status_effects/chems.dm | 23 +++++----- .../chemistry/reagents/fermi_reagents.dm | 23 ++++++---- 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6566fd7e06..0d7532d344 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -902,7 +902,7 @@ im my_atom.on_reagent_change(ADD_REAGENT) //if(R.FermiChem == TRUE) // R.on_mob_add(my_atom) - R.on_merge(data, amount) + R.on_merge(data, amount, my_atom, other_purity) if(!no_react) handle_reactions() @@ -920,7 +920,7 @@ im R.data = data R.on_new(data) if(R.addProc == TRUE) - R.on_new() + R.on_new(my_atom) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/Ferm = D //It's Fermi time! Ferm.FermiNew(my_atom) //Seriously what is "data" ???? diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 9e5c7a7445..7844ab860b 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -805,11 +805,13 @@ 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/liedown_words = regex("lie down") //TO ADD 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|trance")//What a descriptive name! + var/static/regex/recognise_words = regex("recognise me|i'm back|did you miss me?") 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") @@ -839,7 +841,7 @@ else E.enthrallTally += power_multiplier*1.25 if(L.canbearoused) - addtimer(CALLBACK(L, .proc/to_chat, "[E.master] is so nice to listen to."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "[E.master] is so nice to listen to."), 5) E.cooldown += 1 //REWARD mixable works @@ -852,10 +854,10 @@ if (L.canbearoused) //E.resistanceTally -= 1 L.adjustArousalLoss(1*power_multiplier) - addtimer(CALLBACK(L, .proc/to_chat, "[E.enthrallGender] has praised me!!"), 5) + addtimer(CALLBACK(L, .proc.to_chat, "[E.enthrallGender] has praised me!!"), 5) else E.resistanceTally /= 2*power_multiplier - addtimer(CALLBACK(L, .proc/to_chat, "I've been praised for doing a good job!"), 5) + addtimer(CALLBACK(L, .proc.to_chat, "I've been praised for doing a good job!"), 5) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise) E.cooldown += 1 @@ -869,10 +871,10 @@ if (L.canbearoused) E.resistanceTally /= 1*power_multiplier L.adjustArousalLoss(-2*power_multiplier) - addtimer(CALLBACK(L, .proc/to_chat, "I've let [E.enthrallGender] down..."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "I've let [E.enthrallGender] down..."), 5) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) - addtimer(CALLBACK(L, .proc/to_chat, "I've failed [E.master]..."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "I've failed [E.master]..."), 5) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) E.cooldown += 1 @@ -898,9 +900,9 @@ E.phase = 3 E.status = null if(L.canbearoused) - addtimer(CALLBACK(L, .proc/to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else - addtimer(CALLBACK(L, .proc/to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) //to_chat(L, ) @@ -954,9 +956,9 @@ E.phase = 0 E.cooldown = 0 if(C.canbearoused) - addtimer(CALLBACK(C, .proc/to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) + addtimer(CALLBACK(C, .proc.to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else - addtimer(CALLBACK(C, .proc/to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) + addtimer(CALLBACK(C, .proc.to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) //ATTRACT else if((findtext(message, attract_words))) @@ -1071,12 +1073,15 @@ else if((findtext(message, statecustom_words)))//doesn't work for(var/V in listeners) var/speaktrigger = "" - var/mob/living/L = V - var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty + var/mob/living/carbon/C = V + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty for (var/trigger in E.customTriggers) - speaktrigger = "[trigger]\n" + speaktrigger += "[trigger], " if(!speaktrigger == "") - L.say(speaktrigger) + C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! + addtimer(CALLBACK(C, /atom/movable/proc/say, "[speaktrigger]"), 5) + C.remove_trait(TRAIT_DEAF, "Triggers") + //CUSTOM TRIGGERS else if((findtext(message, custom_words))) @@ -1132,6 +1137,19 @@ to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") + //RECOGNISE + else if((findtext(message, recognise_words))) + for(var/V in listeners) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) + if(E.phase > 1) + if(user.ckey == E.enthrallID && user.real_name == E.master.real_name) + E.master = user + if(H.canbearoused) + addtimer(CALLBACK(H, .proc.to_chat, "You hear the words of your [E.enthrallID] again!! They're back!!"), 5) + else + addtimer(CALLBACK(H, .proc.to_chat, "You recognise the words of [user], and comply with their orders oncemore."), 5)//It's a bit like a job, It's a living. + //I dunno how to do state objectives without them revealing they're an antag //HEAL (maybe make this nap instead?) @@ -1146,7 +1164,7 @@ E.cooldown += 5 //STUN - if(findtext(message, stun_words)) + else if(findtext(message, stun_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 429c8f5ff6..50291ca20e 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -463,7 +463,7 @@ else . = ..() */ -//Doesn't work +//WORKS!! AAAAA /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) //message_admins("post: hear:[hearer], msg:[message], spk:[speaker], lng:[message_language], raw:[raw_message], freq:[radio_freq], spen:[spans], mod:[message_mode]") @@ -471,22 +471,22 @@ //message_admins("[C] heard something!") raw_message = lowertext(raw_message) for (var/trigger in customTriggers) - //cached_trigger = lowertext(trigger) - message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") - if ("[trigger]" == raw_message)//if trigger1 is the message + var/cached_trigger = lowertext(trigger) + //message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") + if (findtext(raw_message, cached_trigger))//if trigger1 is the message message_admins("[C] has been triggered with [trigger]!") - //Speak (Forces player to talk) + //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 - to_chat(C, "Your mouth moves on it's own, before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.") + to_chat(C, "Your body moves on it's own before you can even catch it. 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!) + //Echo (repeats message!) works else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2 (to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 - //Shocking truth! + //Shocking truth! works else if (lowertext(customTriggers[trigger]) == "shock") if (C.canbearoused) C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is @@ -495,7 +495,7 @@ else C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect - //wah intensifies + //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if (C.canbearoused) if (C.getArousalLoss() > 80) @@ -507,7 +507,8 @@ //kneel (knockdown) else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose. - C.Knockdown(20) + C.resting = 1 + C.lying = 1 //strip (some) clothes else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops @@ -516,7 +517,7 @@ 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.") + to_chat(owner,"You feel compelled to strip your clothes.") //trance else if (lowertext(customTriggers[trigger]) == "trance") 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 3c2aab4736..3842342f97 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -56,23 +56,25 @@ M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return -/datum/reagent/fermi/on_merge(mob/living/carbon/M, amount, other_purity) +//When merging two fermichems +/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity) . = ..() + message_admins("purity of chem is [purity]") if(!M) return message_admins("purity of chem is [purity]") - if(other_purity < 0) + if (purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") - if (other_purity == 1 || src.DoNotSplit == TRUE) + if (purity == 1 || src.DoNotSplit == TRUE) return - else if (src.InverseChemVal > other_purity) + else if (src.InverseChemVal > purity) M.reagents.remove_reagent(src.id, amount, FALSE) M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) message_admins("all convered to [src.InverseChem]") return else //var/pureVol = - var/impureVol = amount * (1 - other_purity) + var/impureVol = amount * (1 - purity) message_admins("splitting [src] [amount] into [src.ImpureChem] [impureVol]") M.reagents.remove_reagent(src.id, impureVol, FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) @@ -334,9 +336,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") if(20 to INFINITY) - message_admins("Number of candidates [LAZYLEN(candies)]") + //message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! - message_admins("Candidate found!") + message_admins("Candidate found! [candies] is becomeing a clone of [M]! Hee~!! Exciting!!") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") //var/typepath = owner.type //clone = new typepath(owner.loc) @@ -420,6 +422,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustBruteLoss(-1, 0) M.adjustFireLoss(-1, 0) M.heal_bodypart_damage(1,1) + M.reagents.remove_reagent(src.id, 1)//faster rate of loss. else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. switch(current_cycle) if(21) @@ -448,7 +451,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(87 to INFINITY) M.reagents.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. message_admins("Purging SGDF [volume]") - message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") + //message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") ..() @@ -1470,6 +1473,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/fermiTest/on_new() ..() + if(LAZYLEN(holder.reagent_list) == 1) + return + else + holder.remove_reagent(src.id, 1000)//Avoiding recurrsion message_admins("FermiTest addition!") var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1)