diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 8bcccbb02a..3d9e81e6c1 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -24,7 +24,7 @@ // start global signals with "!", this used to be necessary but now it's just a formatting choice #define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) #define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args) - +#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" //global living say plug - use sparingly: (mob/speaker , message) ////////////////////////////////////////////////////////////////// // /datum signals @@ -137,8 +137,9 @@ #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () -#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent. - #define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing. +//#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent. +// #define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing. +//#define // /mob/living/carbon signals diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm new file mode 100644 index 0000000000..d3ce57ca67 --- /dev/null +++ b/code/datums/brain_damage/hypnosis.dm @@ -0,0 +1,53 @@ +/datum/brain_trauma/hypnosis + name = "Hypnosis" + desc = "Patient's unconscious is completely enthralled by a word or sentence, focusing their thoughts and actions on it." + scan_desc = "looping thought pattern" + gain_text = "" + lose_text = "" + resilience = TRAUMA_RESILIENCE_SURGERY + + var/hypnotic_phrase = "" + var/regex/target_phrase + +/datum/brain_trauma/hypnosis/New(phrase) + if(!phrase) + qdel(src) + hypnotic_phrase = phrase + try + target_phrase = new("(\\b[hypnotic_phrase]\\b)","ig") + catch(var/exception/e) + stack_trace("[e] on [e.file]:[e.line]") + qdel(src) + ..() + +/datum/brain_trauma/hypnosis/on_gain() + message_admins("[ADMIN_LOOKUPFLW(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.") + log_game("[key_name(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.") + to_chat(owner, "[hypnotic_phrase]") + to_chat(owner, "[pick("You feel your thoughts focusing on this phrase... you can't seem to get it out of your head.",\ + "Your head hurts, but this is all you can think of. It must be vitally important.",\ + "You feel a part of your mind repeating this over and over. You need to follow these words.",\ + "Something about this sounds... right, for some reason. You feel like you should follow these words.",\ + "These words keep echoing in your mind. You find yourself completely fascinated by them.")]") + to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ + as long as you act like the words are your highest priority.") + ..() + +/datum/brain_trauma/hypnosis/on_lose() + message_admins("[ADMIN_LOOKUPFLW(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") + log_game("[key_name(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") + to_chat(owner, "You suddenly snap out of your hypnosis. The phrase '[hypnotic_phrase]' no longer feels important to you.") + ..() + +/datum/brain_trauma/hypnosis/on_life() + ..() + if(prob(2)) + switch(rand(1,2)) + if(1) + to_chat(owner, "...[lowertext(hypnotic_phrase)]...") + if(2) + new /datum/hallucination/chat(owner, TRUE, FALSE, "[hypnotic_phrase]") + +/datum/brain_trauma/hypnosis/on_hear(message, speaker, message_language, raw_message, radio_freq) + message = target_phrase.Replace(message, "$1") + return message diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index a8adbfbce8..ebc6091d31 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -203,4 +203,20 @@ /datum/brain_trauma/severe/pacifism/on_lose() owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT) - ..() \ No newline at end of file + ..() + +/datum/brain_trauma/severe/hypnotic_stupor + name = "Hypnotic Stupor" + desc = "Patient is prone to episodes of extreme stupor that leaves them extremely suggestible." + scan_desc = "oneiric feedback loop" + gain_text = "You feel somewhat dazed." + lose_text = "You feel like a fog was lifted from your mind." + +/datum/brain_trauma/severe/hypnotic_stupor/on_lose() //hypnosis must be cleared separately, but brain surgery should get rid of both anyway + ..() + owner.remove_status_effect(/datum/status_effect/trance) + +/datum/brain_trauma/severe/hypnotic_stupor/on_life() + ..() + if(prob(1) && !owner.has_status_effect(/datum/status_effect/trance)) + owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 1c77520108..ec8093b782 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -507,3 +507,57 @@ desc = "Your body is covered in blue ichor! You can't be revived by vitality matrices." icon_state = "ichorial_stain" alerttooltipstyle = "clockcult" + +/datum/status_effect/trance + id = "trance" + status_type = STATUS_EFFECT_UNIQUE + duration = 300 + tick_interval = 10 + examine_text = "SUBJECTPRONOUN seems slow and unfocused." + var/stun = TRUE + alert_type = /obj/screen/alert/status_effect/trance + +/obj/screen/alert/status_effect/trance + name = "Trance" + desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..." + icon_state = "high" + +/datum/status_effect/trance/tick() + if(stun) + owner.Stun(60, TRUE, TRUE) + owner.dizziness = 20 + +/datum/status_effect/trance/on_apply() + if(!iscarbon(owner)) + return FALSE + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) + owner.add_trait(TRAIT_MUTE, "trance") + if(!owner.has_quirk(/datum/quirk/monochromatic)) + owner.add_client_colour(/datum/client_colour/monochrome) + owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ + "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") + return TRUE + +/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE) + duration = _duration + stun = _stun + return ..() + +/datum/status_effect/trance/on_remove() + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + owner.remove_trait(TRAIT_MUTE, "trance") + owner.dizziness = 0 + if(!owner.has_quirk(/datum/quirk/monochromatic)) + owner.remove_client_colour(/datum/client_colour/monochrome) + to_chat(owner, "You snap out of your trance!") + +/datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + if(!owner.can_hear()) + return + if(speaker == owner) + return + var/mob/living/carbon/C = owner + C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) + addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it + qdel(src) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 6466a47e42..edf8fca32d 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -393,6 +393,22 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} +@keyframes hypnocolor { + 0% { color: #202020; } + 25% { color: #4b02ac; } + 50% { color: #9f41f1; } + 75% { color: #541c9c; } + 100% { color: #7adbf3; } +} + +.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;} +@keyframes phobia { + 0% { color: #f75a5a; } + 50% { color: #dd0000; } + 100% { color: #f75a5a; } +} + .icon {height: 1em; width: auto;} diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6ea876feac..1ce3420155 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -910,3 +910,17 @@ /mob/living/carbon/can_resist() return bodyparts.len > 2 && ..() + +/mob/living/carbon/proc/hypnosis_vulnerable()//unused atm, but added in case + if(src.has_trait(TRAIT_MINDSHIELD)) + return FALSE + if(hallucinating()) + return TRUE + if(IsSleeping()) + return TRUE + if(src.has_trait(TRAIT_DUMB)) + return TRUE + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + if(mood.sanity < SANITY_UNSTABLE) + return TRUE diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index b966535a8f..42fdb36933 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -6,6 +6,7 @@ var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE) if(Vc) if(Vc.name == "velvet chords" ) + ..() velvetspeech(message, src) var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 871e33349a..161544578d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -205,6 +205,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message spans |= SPAN_ITALICS + //global say component + //SEND_GLOBAL_SIGNAL(COMSIG_LIVING_SAY, src, message) + //if(SEND_SIGNAL(COMSIG_LIVING_SAY,src,message) == COMPONENT_NO_SAY) + // return + send_speech(message, message_range, src, bubble_type, spans, language, message_mode) if(succumbed) @@ -273,6 +278,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode) else AM.Hear(rendered, src, message_language, message, , spans, message_mode) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //speech bubble var/list/speech_bubble_recipients = list() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 521c27a838..8a101f5873 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -49,6 +49,7 @@ im var/atom/my_atom = null var/chem_temp = 150 var/pH = REAGENT_NORMAL_PH//This is definately 7, right? + var/overallPurity = 1 var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() @@ -355,17 +356,6 @@ im var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - //if(fermiIsReacting == TRUE) - /* if (reactedVol >= targetVol && targetVol != 0) - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - message_admins("FermiChem processing stopped in reaction handler") - reaction_occurred = 1 - return - else - message_admins("FermiChem processing passed in reaction handler") - return - */ do //What does do do in byond? It sounds very redundant? is it a while loop? @@ -429,9 +419,6 @@ im if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! if (C.FermiExplode == TRUE) //To be added! - else - FermiExplode() - //explode function!! TODO: make plastic beakers melt at 447 kalvin, all others at ~850 and meta-material never break. */ @@ -472,11 +459,11 @@ im var/datum/chemical_reaction/C = selected_reaction if (C.FermiChem == TRUE && !continue_reacting) - message_admins("FermiChem Proc'd") + //message_admins("FermiChem Proc'd") for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier - message_admins("FermiChem target volume: [targetVol]") + //message_admins("FermiChem target volume: [targetVol]") if ((chem_temp > C.OptimalTempMin) && (pH > (C.OptimalpHMin - C.ReactpHLim)) && (pH < (C.OptimalpHMax + C.ReactpHLim)))//To prevent pointless reactions //if (reactedVol < targetVol) @@ -486,7 +473,7 @@ im //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) //selected_reaction.on_reaction(src, my_atom, multiplier) START_PROCESSING(SSprocessing, src) - message_admins("FermiChem processing started") + //message_admins("FermiChem processing started") selected_reaction.on_reaction(src, my_atom, multiplier) fermiIsReacting = TRUE fermiReactID = selected_reaction @@ -496,7 +483,7 @@ im // STOP_PROCESSING(SSfastprocess, src) else if (chem_temp > C.ExplodeTemp) var/datum/chemical_reaction/fermi/Ferm = selected_reaction - Ferm.FermiExplode(src, my_atom, total_volume, chem_temp, pH) + Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 else return 0 @@ -554,13 +541,13 @@ im var/multiplier = INFINITY //var/special_react_result = C.check_special_react(src) Only add if I add in the fermi-izer chem - message_admins("updating targetVol from [targetVol]") + //message_admins("updating targetVol from [targetVol]") for(var/B in cached_required_reagents) // multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) if (multiplier == 0) STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE - message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") reactedVol = 0 targetVol = 0 handle_reactions() @@ -572,20 +559,20 @@ im for(var/P in cached_results) targetVol = cached_results[P]*multiplier - message_admins("to [targetVol]") + //message_admins("to [targetVol]") if (fermiIsReacting == FALSE) - message_admins("THIS SHOULD NEVER APPEAR!") + //message_admins("THIS SHOULD NEVER APPEAR!") CRASH("Fermi has refused to stop reacting even though we asked her nicely.") if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions if (reactedVol < targetVol) reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) - message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") else STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE - message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") reactedVol = 0 targetVol = 0 handle_reactions() @@ -596,7 +583,7 @@ im return else STOP_PROCESSING(SSprocessing, src) - message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 @@ -619,28 +606,28 @@ im var/purity = 1 //var/tempVol = totalVol - message_admins("Loop beginning") + //message_admins("Loop beginning") //Begin Parse - + //update_holder_purity(C)//updates holder's purity //Check extremes first if (cached_temp > C.ExplodeTemp) //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]") + //message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]") C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) if (pH > 14) pH = 14 - message_admins("pH is lover limit, cur pH: [pH]") + //message_admins("pH is lover limit, cur pH: [pH]") else if (pH < 0) pH = 0 //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") + //message_admins("pH is lover limit, cur pH: [pH]") if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up. - C.FermiExplode(src, (reactedVol+targetVol), cached_temp, pH, C) + C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) //For now, purity is handled elsewhere @@ -664,10 +651,10 @@ im deltapH = 1 //This should never proc: else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") + //message_admins("Fermichem's pH broke!! Please let Fermis know!!") WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + //message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") //Calculate DeltaT (Deviation of T from optimal) if (cached_temp < C.OptimalTempMax && cached_temp >= C.OptimalTempMin) @@ -676,61 +663,71 @@ im deltaT = 1 else deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + //message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") stepChemAmmount = deltaT //used to have multipler, now it doesn't if (stepChemAmmount > C.RateUpLim) stepChemAmmount = C.RateUpLim else if (stepChemAmmount <= 0.01) - message_admins("stepChem underflow [stepChemAmmount]") + //message_admins("stepChem underflow [stepChemAmmount]") stepChemAmmount = 0.01 if ((reactedVol + stepChemAmmount) > targetVol) stepChemAmmount = targetVol - reactedVol - message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") + //message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") //if (reactedVol > 0) // purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product //else - purity = deltapH//set purity equal to pH offset + purity = (deltapH)//set purity equal to pH offset + + //TODO: Check overall beaker purity with proc + //Then adjust purity of result AND yeild ammount with said purity. // End. /* for(var/B in cached_required_reagents) // tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) */ - message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") + //message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") + //message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? //reactedVol = max(reactedVol, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, cached_temp, purity)//add reagent function!! I THINK I can do this: + add_reagent(P, cached_results[P]*(stepChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: + //Above should reduce yeild based on holder purity. C.FermiCreate(src) - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //message_admins("purity: [purity], purity of beaker") + //message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! //adjust_thermal_energy((cached_temp*(C.ThermicConstant * stepChemAmmount *100)), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") + //message_admins("Temp after change: [chem_temp], pH after change: [pH]") reactedVol = reactedVol + stepChemAmmount return (reactedVol) -/* MOVED TO REAGENTS.DM -/datum/reagents/proc/FermiExplode() - return -*/ + +/datum/reagents/proc/update_holder_purity(var/datum/chemical_reaction/fermi/C) + var/list/cached_reagents = reagent_list + var/i + var/cachedPurity + //var/fermiChem + for(var/reagent in C.required_reagents) + cachedPurity += cached_reagents[reagent].purity + i++ + overallPurity = cachedPurity/i /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list @@ -877,11 +874,8 @@ im //WIP_TAG //check my maths for purity calculations //Add amount and equalize purity R.volume += amount - //Maybe make a pH for reagents, not sure. it's hard to imagine where the H+ ions would go. I'm okay with this solution for now. - //R.purity = (our_pure_moles + their_pure_moles) / (R.volume) - message_admins("Purity before addition: [R.purity], vol:[R.volume]. Adding [other_purity], vol: [amount]") R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product - message_admins("Purity after [R.purity]") + update_total() if(my_atom) @@ -918,7 +912,7 @@ im if(!no_react) handle_reactions() if(isliving(my_atom)) - R.on_mob_add(my_atom) + R.on_mob_add(my_atom, amount) return TRUE diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 88c6ce175f..14ff377523 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -16,8 +16,9 @@ var/convert_damage = FALSE //If you want to convert the caster's health to the shift, and vice versa. var/convert_damage_type = BRUTE //Since simplemobs don't have advanced damagetypes, what to convert damage back into. - var/shapeshift_type + var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! Racist var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ + /mob/living/simple_animal/pet/cat,\ /mob/living/simple_animal/pet/dog/corgi,\ /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/ed209,\ @@ -167,4 +168,4 @@ /datum/soullink/shapeshift/sharerDies(gibbed, mob/living/sharer) if(source) - source.shapeDeath(gibbed) \ No newline at end of file + source.shapeDeath(gibbed) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index c402ad5f09..cc33188a26 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -87,6 +87,7 @@ M.Dizzy(1) /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) +//TODO: add lung damage = less oxygen gains if((H.status_flags & GODMODE)) return if(H.has_trait(TRAIT_NOBREATH)) @@ -157,7 +158,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) //More damaged lungs = slower oxy rate up to a factor of half + H.adjustOxyLoss(-5) //More damaged lungs = slower oxy rate up to a factor of half gas_breathed = breath_gases[/datum/gas/oxygen][MOLES] H.clear_alert("not_enough_oxy") @@ -186,7 +187,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) + H.adjustOxyLoss(-5) gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES] H.clear_alert("nitro") @@ -223,7 +224,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) + H.adjustOxyLoss(-5) gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES] H.clear_alert("not_enough_co2") @@ -253,7 +254,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) + H.adjustOxyLoss(-5) gas_breathed = breath_gases[/datum/gas/plasma][MOLES] H.clear_alert("not_enough_tox") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 037df6ee33..1fca8123c2 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -670,7 +670,7 @@ ///////////FermiChem////////////////// ////////////////////////////////////// //Removed span_list from input arguments. //mob/living/user -/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = TRUE) +/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = FALSE) message_admins("Velvet speech proc'd on [user]") var/cooldown = 0 @@ -703,7 +703,7 @@ if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//Check to see if pet is on cooldown from last command - if (E.cooldown >= 0)//If they're on cooldown you can't give them more commands. + if (E.cooldown > 0)//If they're on cooldown you can't give them more commands. continue listeners += L if(debug == TRUE) @@ -812,7 +812,7 @@ //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/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//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") @@ -827,6 +827,8 @@ //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words + //CALLBACKS ARE USED FOR MESSAGES BECAUSE SAY IS HANDLED AFTER THE PROCESSING. + //Tier 1 //ENTHRAL mixable if(findtext(message, enthral_words)) @@ -876,7 +878,7 @@ if((findtext(message, saymyname_words))) for(var/V in listeners) var/mob/living/carbon/C = V - C.remove_trait(TRAIT_MUTE, TRAUMA_TRAIT) + C.remove_trait(TRAIT_MUTE, "enthrall") addtimer(CALLBACK(C, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here //WAKE UP @@ -889,7 +891,7 @@ if(0) E.phase = 3 E.status = null - addtimer(CALLBACK(L, /atom/movable/proc/to_chat, "The snapping of your Master'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 Master's fingers brings you back to your enthralled state, obedient and ready to serve."), 5) //to_chat(L, ) @@ -900,7 +902,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, C)+1] if (E.phase == 3) //If target is fully enthralled, - C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) + C.add_trait(TRAIT_MUTE, "enthrall") else C.silent += ((10 * power_multiplier) * E.phase) E.cooldown += 3 @@ -933,11 +935,12 @@ else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - C.Sleeping(50) to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") + C.Sleeping(50) switch(E.phase) if(1 to 2) E.phase = -1 + to_chat(C, "You have no recollection of being enthralled by [E.master]") if(3) E.phase = 0 E.cooldown = 0 @@ -951,22 +954,6 @@ E.cooldown += 3 - //ORGASM - else if((findtext(message, orgasm_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(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure - H.mob_climax(forced_climax=TRUE) - H.setArousalLoss(H.min_arousal) - E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthrallTally += power_multiplier - else - E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthrallTally += power_multiplier*1.1 - to_chat(H, "Your Masters command whites out your mind in bliss!") - E.cooldown += 6 - //teir 2 @@ -976,7 +963,7 @@ 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(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure + if(H.canbearoused) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) H.setArousalLoss(H.min_arousal) E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). @@ -1007,7 +994,7 @@ if(2 to INFINITY) var/mob/living/M = V playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - H.emote(H,"lets out a nya!") + M.emote(M,"lets out a nya!") E.cooldown += 1 //SLEEP @@ -1072,10 +1059,10 @@ 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) - if (!E.customTriggers == list())//i.e. if it's not empty - for (var/trigger in E.customTriggers) - speaktrigger = "[trigger]\n" + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty + for (var/trigger in E.customTriggers) + speaktrigger = "[trigger]\n" + if(!speaktrigger == "") L.say(speaktrigger) //CUSTOM TRIGGERS @@ -1085,7 +1072,7 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3) if (get_dist(user, H) > 1)//Requires user to be next to their pet. - to_chat(H, "You need to be next to your pet to give them a new trigger!") + to_chat(user, "You need to be next to your pet to give them a new trigger!") return else if (E.mental_capacity >= 10) @@ -1110,7 +1097,7 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3) if (get_dist(user, H) > 1)//Requires user to be next to their pet. - to_chat(H, "You need to be next to your pet to give them a new objective!") + to_chat(user, "You need to be next to your pet to give them a new objective!") return else user.emote(user, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") @@ -1310,7 +1297,8 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ */ - + else + return 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].") diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 820537e32b..c709381299 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -346,6 +346,22 @@ em {font-style: normal; font-weight: bold;} .greentext {color: #00FF00; font-size: 3;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} +@keyframes hypnocolor { + 0% { color: #202020; } + 25% { color: #4b02ac; } + 50% { color: #9f41f1; } + 75% { color: #541c9c; } + 100% { color: #7adbf3; } +} + +.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;} +@keyframes phobia { + 0% { color: #f75a5a; } + 50% { color: #dd0000; } + 100% { color: #f75a5a; } +} + big img.icon {width: 32px; height: 32px;} @@ -359,4 +375,4 @@ big img.icon {width: 32px; height: 32px;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} -.hidden {display: none; visibility: hidden;} \ No newline at end of file +.hidden {display: none; visibility: hidden;} diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index cdf6df2dab..b7c8dbc19e 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -153,6 +153,21 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite;} +@keyframes hypnocolor { + 0% { color: #0d0d0d; } + 25% { color: #410194; } + 50% { color: #7f17d8; } + 75% { color: #410194; } + 100% { color: #3bb5d3; } +} + +.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;} + @keyframes phobia { + 0% { color: #0d0d0d; } + 50% { color: #dd0000; } + 100% { color: #0d0d0d; } +} .icon {height: 1em; width: auto;} diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 01f09dda15..6127f82a03 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -172,7 +172,8 @@ //var/mental_cost //Current cost of custom triggers //var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 var/datum/weakref/redirect_component //resistance - var/datum/weakref/redirect_component2 //say + //var/datum/weakref/redirect_component2 //say + //var/datum/weakref/redirect_component3 //hear var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers var/withdrawal = FALSE //withdrawl var/withdrawalTick = 0 //counts how long withdrawl is going on for @@ -194,6 +195,9 @@ owner.remove_status_effect(src)//This shouldn't happen, but just in case redirect_component = 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 + //redirect_component3 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_HEAR = CALLBACK(src, .proc/owner_hear)))) //Do resistance calc if resist is pressed + RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say) + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() @@ -221,7 +225,7 @@ //mindshield check if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. - resistanceTally += 2 + resistanceTally += 5 if(prob(10)) to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") @@ -236,23 +240,26 @@ if (enthrallTally > 100) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. + resistanceTally /= 2 enthrallTally = 0 - to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") + to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else if (resistanceTally > 100) enthrallTally *= 0.5 phase = -1 resistanceTally = 0 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") + to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore.'") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if (enthrallTally > 150) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 + resistanceTally /= 2 to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") - to_chat(owner, "You are now fully enthralled to [master], 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 [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] 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. + to_chat(owner, "You are now fully enthralled to [master], 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 [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] 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. else if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 @@ -260,15 +267,15 @@ to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced - if (resistanceTally >= 250 && withdrawalTick >= 150) + if (resistanceTally >= 200 && withdrawalTick >= 150) enthrallTally = 0 phase -= 1 resistanceTally = 0 to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") - if(prob(2)) - to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] known's whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if(prob(3)) + to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) phase = 2 @@ -284,7 +291,8 @@ //distance calculations switch(get_dist(master, owner)) if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects. - enthrallTally += distancelist[get_dist(master, owner)+1] + if(phase <= 2) + enthrallTally += distancelist[get_dist(master, owner)+1] withdrawal = FALSE if(withdrawalTick > 0) withdrawalTick -= 2 @@ -301,31 +309,31 @@ //Withdrawal subproc: if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial - if(20 to 40)//Gives wiggle room, so you're not SUPER needy + if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) - to_chat(owner, "You're starting to miss your [enthrallGender].") + to_chat(owner, "You're starting to miss your [enthrallGender].") if(prob(5)) owner.adjustBrainLoss(0.5) - to_chat(owner, "Master will surely be back soon") //denial - if(41) + to_chat(owner, "Master will surely be back soon") //denial + if(36) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) - if(42 to 65)//barganing - if(prob(5)) - to_chat(owner, "They are coming back, right...?") + if(37 to 65)//barganing + if(prob(10)) + to_chat(owner, "They are coming back, right...?") owner.adjustBrainLoss(1) - if(prob(5)) - to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") + if(prob(10)) + to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") owner.adjustBrainLoss(-1) 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 + owner.stuttering += 200 + owner.jitteriness += 200 if(67 to 90) //anger if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) - to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your [enthrallGender].") + to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!") owner.adjustBrainLoss(1) if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? @@ -334,10 +342,10 @@ if(91 to 120)//depression if(prob(20)) owner.adjustBrainLoss(2.5) - owner.stuttering += 2 - owner.jitteriness += 2 + owner.stuttering += 20 + owner.jitteriness += 20 if(prob(25)) - M.hallucination += 2 + M.hallucination += 20 if(121) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4) @@ -348,34 +356,34 @@ owner.emote("cry")//does this exist? to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") owner.adjustBrainLoss(5) - owner.stuttering += 2 - owner.jitteriness += 2 + owner.stuttering += 20 + owner.jitteriness += 20 if(prob(5)) deltaResist += 5 if(140 to INFINITY) //acceptance if(prob(15)) deltaResist += 5 if(prob(20)) - to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") + to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") if(prob(10)) owner.adjustBrainLoss(2) - M.hallucination += 5 + M.hallucination += 50 withdrawalTick += 0.5 //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) + if (status) - if(status = "Antiresist") - if (statusStrength == 0) + if(status == "Antiresist") + if (statusStrength < 0) status = null to_chat(owner, "You feel able to resist oncemore.") else statusStrength -= 1 - else if(status = "heal") - if (statusStrength == 0) + else if(status == "heal") + if (statusStrength < 0) status = null to_chat(owner, "You finish licking your wounds.") else @@ -383,13 +391,13 @@ owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) cooldown += 1 //Cooldown doesn't process till status is done - else if(status = "charge") + else if(status == "charge") owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") status = "charged" to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") - else if (status = "charged") - if (statusStrength == 0) + else if (status == "charged") + if (statusStrength < 0) status = null owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") owner.Knockdown(30) @@ -398,7 +406,7 @@ statusStrength -= 1 cooldown += 1 //Cooldown doesn't process till status is done - else if (status = "pacify") + else if (status == "pacify") owner.add_trait(TRAIT_PACIFISM, "MKUltra") status = null @@ -432,6 +440,10 @@ redirect_component = null //qdel(redirect_component2.resolve()) //redirect_component2 = null + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) + //qdel(redirect_component3.resolve()) + //redirect_component3 = null /* /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) @@ -441,34 +453,37 @@ . = ..() */ //Doesn't work -/datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + +/datum/status_effect/chem/enthrall/proc/owner_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner - message_admins("[C] heard something!") + //message_admins("[C] heard something!") for (var/trigger in customTriggers) - if (trigger == message)//if trigger1 is the message + //cached_trigger = lowertext(trigger) + message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") + if ("[trigger]" == raw_message)//if trigger1 is the message message_admins("[C] has been triggered with [trigger]!") //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. You find yourself fully believing in the validity of what you just said and don't think to question it.") + 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.") (C.say(customTriggers[trigger][2]))//trigger3 //Echo (repeats message!) - else if (customTriggers[trigger][1] == "echo")//trigger2 - (to_chat(owner, customTriggers[trigger][2]))//trigger3 + else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2 + (to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 //Shocking truth! - else if (customTriggers[trigger] == "shock") + 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 C.adjustArousalLoss(5) - to_chat(owner, "Your muscles seize up, then start spasming wildy!") + 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 + else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if (C.canbearoused) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) @@ -478,17 +493,22 @@ 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. + else if (lowertext(customTriggers[trigger]) == "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 + else if (customTriggers[trigger] == "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.") + C.visible_message("You feel compelled to strip your clothes.") + + //trance + else if (customTriggers[trigger] == "trance") + var/mob/living/carbon/human/o = owner + o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) //add more fun stuff! @@ -505,14 +525,14 @@ if (status == "Sleeper" || phase == 0) return else if (phase == 4) - to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") + to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") return else if (phase == 3 && withdrawal == FALSE) - to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.") + to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) - to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.") + to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.") statusStrength += 1 enthrallTally += 1 return @@ -593,7 +613,8 @@ message_admins("[M] is trying to resist with a delta of [deltaResist]!") return -/datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works +/datum/status_effect/chem/enthrall/proc/owner_say(mob/speaker, message) //I can only hope this works + //var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) //var/mob/living/master = E.master message_admins("[owner] said something") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 7c6cc74392..2daaeb1502 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -273,7 +273,7 @@ //H.update_body() /datum/species/proc/handle_genitals(mob/living/carbon/human/H) - message_admins("attempting to update sprite") + //message_admins("attempting to update sprite") if(!H)//no args CRASH("H = null") if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index f68c31909e..bd7331337d 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -21,6 +21,10 @@ var/statuscheck = FALSE var/prev_size = 6 +/obj/item/organ/genital/penis/Initialize() + . = ..() + prev_size = length + cached_length = length /obj/item/organ/genital/penis/update_size() var/mob/living/carbon/human/o = owner @@ -33,32 +37,32 @@ length = cached_length size = 1 if(statuscheck == TRUE) - message_admins("Attempting to remove.") + //message_admins("Attempting to remove.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = FALSE if(5 to 8) //If modest size length = cached_length size = 2 if(statuscheck == TRUE) - message_admins("Attempting to remove.") + //message_admins("Attempting to remove.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = FALSE if(9 to INFINITY) //If massive length = cached_length size = 3 //no new sprites for anything larger yet if(statuscheck == FALSE) - message_admins("Attempting to apply.") + //message_admins("Attempting to apply.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = TRUE if(15 to INFINITY) length = cached_length size = 3 //no new sprites for anything larger yet if(statuscheck == FALSE) - message_admins("Attempting to apply.") + //message_admins("Attempting to apply.") o.apply_status_effect(/datum/status_effect/chem/PElarger) statuscheck = TRUE - message_admins("Pinas size: [size], [cached_length], [o]") - message_admins("2. size vs prev_size") + //message_admins("Pinas size: [size], [cached_length], [o]") + //message_admins("2. size vs prev_size") if (round(length) > round(prev_size)) to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(length)] inch penis.") else if (round(length) < round(prev_size)) 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 8010179007..4444251243 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -14,8 +14,8 @@ id = "fermi" //It's meeee taste_description = "If affection had a taste, this would be it." var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction - var/InverseChemVal = 0 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. + var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + var/InverseChem = "toxin" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. var/DoNotSplit = FALSE // If impurity is handled within the main chem itself ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) @@ -34,7 +34,7 @@ //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE -/datum/reagent/fermi/on_mob_add(mob/living/carbon/M) +/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount) . = ..() if(!M) return @@ -44,15 +44,15 @@ if (src.purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > src.purity) - M.reagents.remove_reagent(src, volume, FALSE) - M.reagents.add_reagent(src.InverseChem, volume, FALSE, other_purity = 1) + 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 = volume * purity - var/impureVol = volume * (1 - (volume * purity)) - message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]") - M.reagents.remove_reagent(src, (volume*impureVol), FALSE) + //var/pureVol = amount * purity + var/impureVol = amount * (1 - purity) + message_admins("splitting [src.id] [amount] into [src.ImpureChem] [impureVol]") + M.reagents.remove_reagent(src.id, (impureVol), FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return @@ -66,15 +66,15 @@ if (other_purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > other_purity) - M.reagents.remove_reagent(src, amount, FALSE) + 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 - (amount * other_purity)) - message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]") - M.reagents.remove_reagent(src, impureVol, FALSE) + var/impureVol = amount * (1 - other_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) return @@ -111,7 +111,7 @@ taste_description = "wiggly cosmic dust." color = "#5020H4" // rgb: 50, 20, 255 overdose_threshold = 15 - addiction_threshold = 20 + addiction_threshold = 15 metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage2_end = 30 addiction_stage3_end = 40 @@ -525,7 +525,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/startHunger /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. - message_admins("SGZF ingested") + //message_admins("SGZF ingested") switch(current_cycle)//Pretends to be normal if(20) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") @@ -577,7 +577,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.adjustToxLoss(1, 0) - message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") + //message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -821,6 +821,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason var/mob/living/simple_animal/hostile/retaliate/ghost/G = null var/antiGenetics = 255 var/sleepytime = 0 + InverseChemVal = 0.25 //var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! @@ -1215,10 +1216,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") if(prob(10)) - owner.Stun(10) - owner.emote("whimper")//does this exist? - to_chat(owner, "You're overcome with a desire to see [love].") - owner.adjustBrainLoss(5) + M.Stun(10) + M.emote("whimper")//does this exist? + to_chat(M, "You're overcome with a desire to see [love].") + M.adjustBrainLoss(5) ..() /datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) @@ -1446,9 +1447,36 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Fermis Test Reagent" id = "fermiTest" description = "You should be really careful with this...! Also, how did you get this?" - data = "Big bang" + data = list("Big bang" = 1, "please work" = 2) /datum/reagent/fermi/fermiTest/on_new() + ..() + message_admins("FermiTest addition!") + var/location = get_turf(holder.my_atom) + if(purity < 0.34 || purity == 1) + var/datum/effect_system/foam_spread/s = new() + s.set_up(volume*2, location, holder) + s.start() + if((purity < 0.67 && purity >= 0.34)|| purity == 1) + var/datum/effect_system/smoke_spread/chem/s = new() + s.set_up(holder, volume*2, location) + s.start() + if(purity >= 0.67) + for (var/datum/reagent/reagent in holder.reagent_list) + if (istype(reagent, /datum/reagent/fermi)) + var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] + Ferm.FermiExplode(src, holder.my_atom, holder, holder.total_volume, holder.chem_temp, holder.pH) + else + var/datum/chemical_reaction/Ferm = GLOB.chemical_reagents_list[reagent.id] + Ferm.on_reaction(holder, reagent.volume) + for(var/mob/M in viewers(8, location)) + to_chat(M, "The solution reacts dramatically, with a meow!") + playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + holder.clear_reagents() + +/datum/reagent/fermi/fermiTest/on_merge() + ..() + message_admins("FermiTest addition!") var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1) var/datum/effect_system/foam_spread/s = new() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7015087fc6..cdc822179a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -10,7 +10,7 @@ //Called when temperature is above a certain threshold //....Is this too much? -/datum/chemical_reaction/fermi/proc/FermiExplode(src, var/atom/my_atom, datum/reagents/holder, volume, temp, pH, Reaction, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? //var/Svol = volume if (Exploding == TRUE) return @@ -19,13 +19,13 @@ var/ImpureTot = 0 var/pHmod = 1 var/turf/T = get_turf(my_atom) - if(temp>600)//if hot, start a fire + if(temp>500)//if hot, start a fire switch(temp) - if (601 to 800) + if (500 to 750) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) //volume /= 3 - if (801 to 1100) + if (751 to 1100) for(var/turf/turf in range(2,T)) new /obj/effect/hotspot(turf) //volume /= 4 @@ -48,8 +48,8 @@ pHmod = 1.5 for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) if (istype(reagent, /datum/reagent/fermi)) - var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] - Ferm.FermiExplode(src, my_atom, holder, volume, temp, pH, Exploding = TRUE) + //var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] + //Ferm.FermiExplode(src, my_atom, volume, temp, pH, Exploding = TRUE) continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) R.add_reagent(reagent, reagent.volume) if (reagent.purity < 0.6) @@ -64,7 +64,7 @@ my_atom.reagents.clear_reagents() return -/datum/chemical_reaction/fermi/eigenstate +/datum/chemical_reaction/fermi/eigenstate//done name = "Eigenstasium" id = "eigenstate" results = list("eigenstate" = 1) @@ -81,7 +81,7 @@ CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction + HIonRelease = 0.08 //pH change per 1u reaction RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -98,8 +98,8 @@ name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 3) - required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) - //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + //required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 500 // Upper end for above @@ -117,17 +117,17 @@ FermiExplode = TRUE // If the chemical explodes in a special way PurityMin = 0.25 -/datum/chemical_reaction/fermi/SDGF/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies - var/turf/T = get_turf(holder) +/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies + var/turf/T = get_turf(my_atom) 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)//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, grr grr to_chat("The cells clump up into a horrifying tumour!") - holder.clear_reagents() + my_atom.reagents.clear_reagents() -/datum/chemical_reaction/fermi/BElarger +/datum/chemical_reaction/fermi/BElarger //done name = "Sucubus milk" id = "BElarger" results = list("BElarger" = 6) @@ -136,29 +136,29 @@ OptimalTempMin = 200 OptimalTempMax = 800 ExplodeTemp = 900 - OptimalpHMin = 5 - OptimalpHMax = 10 + OptimalpHMin = 8 + OptimalpHMax = 12 ReactpHLim = 3 CatalystFact = 0 CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = 0.1 - RateUpLim = 10 + HIonRelease = 0.5 + RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 -/datum/chemical_reaction/fermi/BElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) +/datum/chemical_reaction/fermi/BElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) //var/obj/item/organ/genital/breasts/B = - new /obj/item/organ/genital/breasts(get_turf(holder)) - var/list/seen = viewers(5, get_turf(holder)) + new /obj/item/organ/genital/breasts(get_turf(my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO - holder.clear_reagents() + my_atom.reagents.clear_reagents() ..() -/datum/chemical_reaction/fermi/PElarger //Vars needed +/datum/chemical_reaction/fermi/PElarger //done name = "Incubus draft" id = "PElarger" results = list("PElarger" = 3) @@ -168,53 +168,52 @@ OptimalTempMin = 200 OptimalTempMax = 800 ExplodeTemp = 900 - OptimalpHMin = 5 - OptimalpHMax = 10 + OptimalpHMin = 2 + OptimalpHMax = 6 ReactpHLim = 3 CatalystFact = 0 CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = 0.1 - RateUpLim = 10 + HIonRelease = -0.5 + RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 -/datum/chemical_reaction/fermi/PElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) +/datum/chemical_reaction/fermi/PElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) //var/obj/item/organ/genital/penis/nP = - new /obj/item/organ/genital/penis(get_turf(holder)) - var/list/seen = viewers(5, get_turf(holder)) + new /obj/item/organ/genital/penis(get_turf(my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO - holder.clear_reagents() + my_atom.reagents.clear_reagents() ..() -/datum/chemical_reaction/fermi/astral //Vars needed +/datum/chemical_reaction/fermi/astral //done name = "Astrogen" id = "astral" results = list("astral" = 3) required_reagents = list("eigenstasium" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) - //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 ExplodeTemp = 900 - OptimalpHMin = 5 - OptimalpHMax = 10 - ReactpHLim = 3 + OptimalpHMin = 12 + OptimalpHMax = 13 + ReactpHLim = 2 CatalystFact = 0 - CurveSharpT = 2 + CurveSharpT = 4 CurveSharppH = 2 - ThermicConstant = 1 - HIonRelease = 0.1 + ThermicConstant = 10 + HIonRelease = 0.5 RateUpLim = 10 FermiChem = TRUE FermiExplode = TRUE - PurityMin = 0.25 + PurityMin = 0.25 // explode purity! -/datum/chemical_reaction/fermi/enthrall //Vars needed +/datum/chemical_reaction/fermi/enthrall//done name = "MKUltra" id = "enthrall" results = list("enthrall" = 3) @@ -275,21 +274,21 @@ //var/enthrallID = B.get_blood_data() */ -/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) - var/turf/T = get_turf(holder) +/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) + var/turf/T = get_turf(my_atom) var/datum/reagents/R = new/datum/reagents(1000) var/datum/effect_system/smoke_spread/chem/s = new() R.add_reagent("enthrallExplo", volume) s.set_up(R, volume, T) s.start() - holder.clear_reagents() + my_atom.reagents.clear_reagents() //..() //Please don't kill everyone too. -/datum/chemical_reaction/fermi/hatmium +/datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" id = "hatmium" results = list("hatmium" = 5) - required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1, "blackpepper" = 3) + required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1) //mix_message = "" //FermiChem vars: OptimalTempMin = 500 @@ -301,27 +300,27 @@ //CatalystFact = 0 //To do 1 CurveSharpT = 4 CurveSharppH = 0.5 - ThermicConstant = -2.5 - HIonRelease = 0.01 + ThermicConstant = -2 + HIonRelease = -0.05 RateUpLim = 5 FermiChem = TRUE //FermiExplode = FALSE //PurityMin = 0.15 -/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) - var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(holder.my_atom)) +/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH) + var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom)) hat.animate_atom_living() - var/list/seen = viewers(5, get_turf(holder.my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!") - holder.clear_reagents() + my_atom.reagents.clear_reagents() ..() -/datum/chemical_reaction/fermi/furranium //low temp and medium pH +/datum/chemical_reaction/fermi/furranium //low temp and medium pH - done name = "Furranium" id = "furranium" results = list("furranium" = 5) - required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 1, "salglu_solution" = 1) + required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1) //mix_message = "" //FermiChem vars: OptimalTempMin = 350 @@ -341,7 +340,7 @@ //PurityMin = 0.15 //Nano-b-gone -/datum/chemical_reaction/fermi/naninte_b_gone +/datum/chemical_reaction/fermi/naninte_b_gone//done name = "Naninte bain" id = "naninte_b_gone" results = list("naninte_b_gone" = 5) @@ -357,9 +356,9 @@ //CatalystFact = 0 //To do 1 CurveSharpT = 4 CurveSharppH = 2 - ThermicConstant = -2.5 + ThermicConstant = 1 HIonRelease = 0.01 - RateUpLim = 5 + RateUpLim = 100 FermiChem = TRUE //FermiExplode = FALSE //PurityMin = 0.15 diff --git a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm index 3cd5c8e90c..908016d371 100644 --- a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm +++ b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm @@ -9,6 +9,11 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) item_flags = NODROP //Tips their hat! +/* +/obj/item/clothing/head/hattip/equipped(mob/living/carbon/human/user, slot) + C = user //grumble grumble loc +*/ + /obj/item/clothing/head/hattip/attack_hand(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user @@ -19,10 +24,23 @@ user.emote("me",1,"admires such a spiffy hat.",TRUE) return ..() -/obj/item/clothing/head/hattip/speechModification(message) +/obj/item/clothing/head/hattip/speechModification(message, /mob/living/carbon/C) ..() + var/mob/living/carbon/C = get_wearer()//user + //if(istype(C, /mob/living/carbon/C)) + var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) + if (T.name == "fluffy tongue") + if(prob(0.01)) + message += "\" and tips their hat. \"swpy's sappin' my swentwy uwu!!" + return message + message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]" + return message if(prob(0.01)) message += "\" and tips their hat. \"Spy's sappin' my Sentry!" return message message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" return message + + +/obj/item/clothing/head/hattip/proc/get_wearer() + return loc diff --git a/tgstation.dme b/tgstation.dme index d45fc811c0..e8a0ec5c10 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -328,6 +328,7 @@ #include "code\datums\actions\beam_rifle.dm" #include "code\datums\actions\ninja.dm" #include "code\datums\brain_damage\brain_trauma.dm" +#include "code\datums\brain_damage\hypnosis.dm" #include "code\datums\brain_damage\imaginary_friend.dm" #include "code\datums\brain_damage\mild.dm" #include "code\datums\brain_damage\phobia.dm"