From 8525eeb2b7fa5093b309fc652da62eb7635529db Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 23 Apr 2019 21:03:39 -0700 Subject: [PATCH 01/40] holder --- .../subsystem/processing/chemistry.dm | 5 + code/modules/reagents/chemistry/holder.dm | 518 ++++++------------ tgstation.dme | 1 + 3 files changed, 183 insertions(+), 341 deletions(-) create mode 100644 code/controllers/subsystem/processing/chemistry.dm diff --git a/code/controllers/subsystem/processing/chemistry.dm b/code/controllers/subsystem/processing/chemistry.dm new file mode 100644 index 0000000000..da31d65fb3 --- /dev/null +++ b/code/controllers/subsystem/processing/chemistry.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(chemistry) + wait = 5 + flags = SS_KEEP_TIMING + + diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fb14cab18f..c2a10a3be6 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,10 +53,6 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags - var/targetVol = 0 - var/reactedVol = 0 - var/fermiIsReacting = FALSE - var/fermiReactID = null /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -341,358 +337,198 @@ R.on_update (A) update_total() -/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - if(fermiIsReacting == TRUE) - //reagents_holder_flags |= REAGENT_NOREACT unsure if this is needed - return - var/list/cached_reagents = reagent_list //a list of the reagents? - var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? - var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! - if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. - return //Yup, no reactions here. No siree. - - 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? - var/list/possible_reactions = list() //init list - reaction_occurred = 0 // sets it back to 0? - for(var/reagent in cached_reagents) //for reagent in beaker/holder - var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list - for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue - - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = C.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = 0 - var/has_special_react = C.special_react - var/can_special_react = 0 - - - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - break - total_matching_reagents++ - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - break - total_matching_catalysts++ - if(cached_my_atom) - if(!C.required_container) - matching_container = 1 +/datum/reagents/process() + var/occured = handle_reactions(TRUE) + if(!occured) + return PROCESS_KILL +/datum/reagents/proc/handle_reactions(fermi_chem_react = FALSE)//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + if(reagents_holder_flags & REAGENT_NOREACT) + return //don't react + //cache things for performance + var/list/cached_reagents = reagent_list + var/list/cached_reactions = GLOB.chemical_reactions_list + var/datum/cached_my_atom = my_atom + var/reaction_occurred //if a reaction happened + var/list/fermichem_reacted //keeps track of fermichem reactions that already reacted to prevent it from being instant + do + var/list/possible_reactions + reaction_occurred = FALSE + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + check_possible_reaction: + for(var/reaction in cached_reactions[R.id]) + if(!reaction) + continue + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/list/cached_required_catalysts = C.required_catalysts + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/has_special_react = C.special_react + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + continue check_possible_reaction + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + continue check_possible_reaction + if(cached_my_atom) + if(C.required_container && C.required_container != cached_my_atom.type) + continue check_possible_reaction + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + continue check_possible_reaction + if(C.required_other) //Checks for other things required + if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this + continue check_possible_reaction else - if(cached_my_atom.type == C.required_container)//if the suspected container is a container - matching_container = 1 - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - return - if(!C.required_other)//Checks for other things required - matching_other = 1//binary check passes - - else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. - matching_container = 1 - if(!C.required_other) - matching_other = 1 - - //FermiChem - /* - if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! - if (C.FermiExplode == TRUE) - //To be added! - else - FermiExplode() - //explode function!! - */ - - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! - meets_temp_requirement = 1//binary pass - - if(!has_special_react || C.check_special_react(src)) - can_special_react = 1 - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) - possible_reactions += C - - if(possible_reactions.len)//does list exist? + if(C.required_container || C.required_other) + continue check_possible_reaction + if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) + continue check_possible_reaction + if(has_special_react && !C.check_special_react(src)) + continue check_possible_reaction + if(C.FermiChem) //fermichem checks + if(chem_temp < C.OptimalTempMin) //too low temperature + continue check_possible_reaction + if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly + continue check_possible_reaction + START_PROCESSING(SSchemistry, src) //start processing + if(!fermi_chem_react) //only react fermichems on process icks + continue check_possible_reaction + LAZYADD(possible_reactions, C) + if(length(possible_reactions)) //does list exist? var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. - var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. - selected_reaction = competitor - else - if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. - selected_reaction = competitor + for(var/I in possible_reactions) + var/datum/chemical_reaction/competitor = I + if(selected_reaction.is_cold_recipe? competitor.required_temp < selected_reaction.required_temp : competitor.required_temp > selected_reaction.required_temp) + selected_reaction = competitor var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY //Wat - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, 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) - + var/special_react_result = selected_reaction.special_react //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. //BRANCH HERE - //if(selected_reaction) - var/datum/chemical_reaction/C = selected_reaction - - if (C.FermiChem == TRUE && !continue_reacting) - message_admins("FermiChem Proc'd") - - for(var/P in selected_reaction.results) - targetVol = cached_results[P]*multiplier - message_admins("FermiChem target volume: [targetVol]") - - if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions - //if (reactedVol < targetVol) - if (fermiIsReacting == TRUE) - return 0 - else - //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - START_PROCESSING(SSprocessing, src) - message_admins("FermiChem processing started") - fermiIsReacting = TRUE - fermiReactID = selected_reaction - reaction_occurred = 1 - //else - // fermiIsReacting = FALSE - // STOP_PROCESSING(SSfastprocess, src) - else - return 0 - - - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log - - //Standard reaction mechanics: - else - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, 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) - + var/multiplier = INFINITY //the multiplier of the stnadard "1 reaction" we managed to do this cycle + if(!selected_reaction.FermiChem) //it's a normal ss13 chem reaction, instant reactions. for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) //cap by the multiplier of the required you can get out of this + //remove reactants + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = TRUE) + //add products + for(var/P in cached_results) multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P] * multiplier, P) + add_reagent(P, cached_results[P]*multiplier, null, chem_temp) + else //FermiiiCheeeem! + //FERMICHEM BEGIN + //--CHECKS + message_admins("FermiChem Proc'd") + var/target_volume = 0 + for(var/result_id in cached_results) + target_volume += multiplier * cached_results[result_id] + message_admins("FermiChem target volume: [target_volume]") + //--PROCESS + message_admins("FermiChem processing started") + //--REACTION + //set up fermichem variables + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmount = 0 + var/purity = 1 + //For now, purity is handled elsewhere + //check extremes first + if(chem_temp > selected_reaction.ExplodeTemp) + FermiExplode(selected_reaction) + else if(!ISINRANGE(pH, 0, 14)) + //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) + FermiExplode() + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < selected_reaction.OptimalTempMax && chem_temp >= selected_reaction.OptimalTempMin) + deltaT = (((selected_reaction.OptimalTempMin - chem_temp)**selected_reaction.CurveSharpT)/((selected_reaction.OptimalTempMax - selected_reaction.OptimalTempMin)**selected_reaction.CurveSharpT)) + else if (chem_temp >= selected_reaction.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [selected_reaction.OptimalTempMin], max: [selected_reaction.OptimalTempMax], Exponential: [selected_reaction.CurveSharpT], deltaT: [deltaT]") + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < selected_reaction.OptimalpHMin) + if (pH < (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim))**selected_reaction.CurveSharppH)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) + //Upper range + else if (pH > selected_reaction.OptimalpHMin) + if (pH > (selected_reaction.OptimalpHMin + selected_reaction.ReactpHLim)) + deltapH = 0 + else + deltapH = ((selected_reaction.ReactpHLim -(pH - (selected_reaction.OptimalpHMax + selected_reaction.ReactpHLim))+selected_reaction.ReactpHLim)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) + //Within mid range + else if (pH >= selected_reaction.OptimalpHMin && pH <= selected_reaction.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[selected_reaction.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [selected_reaction.OptimalpHMin]-[selected_reaction.ReactpHLim], max: [selected_reaction.OptimalpHMax]+[selected_reaction.ReactpHLim], deltapH: [deltapH]") + stepChemAmount = target_volume * deltaT + if (stepChemAmount > selected_reaction.RateUpLim) + stepChemAmount = selected_reaction.RateUpLim + else if (stepChemAmount <= 0.01) + message_admins("stepChem underflow [stepChemAmount]") + stepChemAmount = 0.02 + purity = deltapH + message_admins("cached_results: [cached_results], stepChemAmount [stepChemAmount]") + if(stepChemAmount > multiplier) //too much + message_admins("stepChemAmount was over multiplier for some reason..?") + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], base stepChemAmount [stepChemAmount]") + remove_reagent(B, (stepChemAmount * cached_required_reagents[B]), safety = TRUE)//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]*stepChemAmount, P)//log + add_reagent(P, cached_results[P] * stepChemAmount, null, chem_temp)//add reagent function!! I THINK I can do this: + 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 += (selected_reaction.ThermicConstant * stepChemAmount) + pH += (selected_reaction.HIonRelease * stepChemAmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", multiplier, selected_reaction.id)//log + //ensure the same thing doesn't happen in the same tick + LAZYSET(fermichem_reacted, selected_reaction, TRUE) + //FERMICHEM END + //reaction is done, do the effects. + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 - continue_reacting = TRUE - - while(reaction_occurred)//while do nothing? - update_total()//Don't know waht this does. - return 0//end! - -/datum/reagents/process() - var/datum/chemical_reaction/C = fermiReactID - var/list/cached_required_reagents = C.required_reagents//update reagents list - var/list/cached_results = C.results//resultant chemical list - var/multiplier = INFINITY - - 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]") - reactedVol = 0 - targetVol = 0 - handle_reactions() - update_total() - return - for(var/P in cached_results) - targetVol = cached_results[P]*multiplier - - message_admins("to [targetVol]") - - if (fermiIsReacting == FALSE) - message_admins("THIS SHOULD NEVER APPEAR!") - - 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) - 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]") - reactedVol = 0 - targetVol = 0 - handle_reactions() - update_total() - return - else - STOP_PROCESSING(SSprocessing, src) - message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") - fermiIsReacting = FALSE - reactedVol = 0 - targetVol = 0 - handle_reactions() - update_total() - return - - //handle_reactions() - -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) - var/datum/chemical_reaction/C = selected_reaction - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - //var/ammoReacted = 0 - //get purity from combined beaker reactant purities HERE. - var/purity = 1 - //var/tempVol = totalVol - - message_admins("Loop beginning") - //Begin Parse - - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() - - if (pH > 14 || 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]") - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - 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]") - - stepChemAmmount = targetVol * deltaT - if (stepChemAmmount > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount <= 0.01) - message_admins("stepChem underflow [stepChemAmmount]") - stepChemAmmount = 0.02 - - if ((reactedVol + stepChemAmmount) > targetVol) - stepChemAmmount = targetVol - reactedVol - 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 - - // 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]") - - - - for(var/B in cached_required_reagents) - 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, chem_temp)//add reagent function!! I THINK I can do this: - - 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 += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - - reactedVol = reactedVol + stepChemAmmount - - - return (reactedVol) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = TRUE + while(reaction_occurred) + update_total() + return reaction_occurred /datum/reagents/proc/FermiExplode() return diff --git a/tgstation.dme b/tgstation.dme index 1610d0354d..59e73f45d8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -274,6 +274,7 @@ #include "code\controllers\subsystem\vore.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\chemistry.dm" #include "code\controllers\subsystem\processing\circuit.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" From 5430a9b673121e7dc7b688dba9ad5f12f26e046b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 24 Apr 2019 20:15:01 -0700 Subject: [PATCH 02/40] damnit --- code/modules/reagents/chemistry/holder.dm | 89 ++++++++++++----------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c2a10a3be6..f68f51999f 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -343,6 +343,7 @@ return PROCESS_KILL /datum/reagents/proc/handle_reactions(fermi_chem_react = FALSE)//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + return if(reagents_holder_flags & REAGENT_NOREACT) return //don't react //cache things for performance @@ -356,48 +357,54 @@ reaction_occurred = FALSE for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - check_possible_reaction: - for(var/reaction in cached_reactions[R.id]) - if(!reaction) + for(var/reaction in cached_reactions[R.id]) + if(!reaction) + continue + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/list/cached_required_catalysts = C.required_catalysts + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/has_special_react = C.special_react + var/fail = FALSE + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + fail = TRUE + break + if(fail) + continue + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + fail = TRUE + break + if(fail) + continue + if(cached_my_atom) + if(C.required_container && C.required_container != cached_my_atom.type) continue - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/list/cached_required_catalysts = C.required_catalysts - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/has_special_react = C.special_react - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - continue check_possible_reaction - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - continue check_possible_reaction - if(cached_my_atom) - if(C.required_container && C.required_container != cached_my_atom.type) - continue check_possible_reaction - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - continue check_possible_reaction - if(C.required_other) //Checks for other things required - if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this - continue check_possible_reaction - else - if(C.required_container || C.required_other) - continue check_possible_reaction - if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) - continue check_possible_reaction - if(has_special_react && !C.check_special_react(src)) - continue check_possible_reaction - if(C.FermiChem) //fermichem checks - if(chem_temp < C.OptimalTempMin) //too low temperature - continue check_possible_reaction - if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly - continue check_possible_reaction - START_PROCESSING(SSchemistry, src) //start processing - if(!fermi_chem_react) //only react fermichems on process icks - continue check_possible_reaction - LAZYADD(possible_reactions, C) + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + continue + if(C.required_other) //Checks for other things required + if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this + continue + else + if(C.required_container || C.required_other) + continue + if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) + continue + if(has_special_react && !C.check_special_react(src)) + continue + if(C.FermiChem) //fermichem checks + if(chem_temp < C.OptimalTempMin) //too low temperature + continue + if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly + continue + START_PROCESSING(SSchemistry, src) //start processing + if(!fermi_chem_react) //only react fermichems on process icks + continue + LAZYADD(possible_reactions, C) if(length(possible_reactions)) //does list exist? var/datum/chemical_reaction/selected_reaction = possible_reactions[1] for(var/I in possible_reactions) From 2a412ad9b53f95cf3fa7e234700d8eeb8c7e9bd9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 03:05:44 +0100 Subject: [PATCH 03/40] Fixed a few bugs in SGDF and Eigen. Added more function to BElarger --- .../chemistry/reagents/fermi_reagents.dm | 75 +++++++++++++------ 1 file changed, 53 insertions(+), 22 deletions(-) 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 9f13ac4d4c..e308b966ad 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -95,7 +95,7 @@ do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - holder.remove_reagent("eigenstate",0.5)//So you're not stuck for 10 minutes teleporting + holder.remove_reagent("eigenstate", 0.5, FALSE)//So you're not stuck for 10 minutes teleporting ..() //loop function @@ -172,9 +172,9 @@ M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) - for(var/i in M.mood_events) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i.id) + M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) + for(var/datum/mood_event/i) + clear_event(null, i) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) @@ -230,6 +230,7 @@ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) + /* if(1) for(var/mob/dead/observer/G in GLOB.player_list) group += G @@ -242,6 +243,8 @@ if(!W.key || !W.client) result -= W candies = result + */ + candies = pollGhostCandidates() if(20 to INFINITY) 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! @@ -285,39 +288,41 @@ message_admins("Failed to find clone Candidate") src.unitCheck = TRUE if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. - to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). - M.adjustCloneLoss(-2, 0) - M.adjustBruteLoss(-2, 0) - M.adjustFireLoss(-2, 0) - M.heal_bodypart_damage(1,1) - M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + switch(current_cycle) + if(21) + to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). + M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + M.adjustCloneLoss(-1, 0) + M.adjustBruteLoss(-1, 0) + M.adjustFireLoss(-1, 0) + M.heal_bodypart_damage(1,1) 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(10) + if(21) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - if(11 to 19) + if(21 to 29) M.nutrition = M.nutrition + (M.nutrition/10) - if(20) + if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(21 to 39) + if(30 to 49) M.nutrition = M.nutrition + (M.nutrition/5) - if(40) + if(50) to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] 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. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - if(41 to 69) + if(50 to 79) M.nutrition = M.nutrition + (M.nutrition/2) - if(70) + if(80) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") if (M.nutrition < 20000) M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI - if(76)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. + if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) - if(77 to INFINITY) - holder.remove_reagent("SGDF", 1)//removes SGDF on completion. + if(87 to INFINITY) + holder.remove_reagent("SGDF", 1, FALSE)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -392,7 +397,7 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50) + holder.remove_reagent("SGZF", 50, FALSE) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. @@ -402,7 +407,7 @@ S.name = "Living teratoma" S.real_name = "Living teratoma" //S.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50) + holder.remove_reagent("SGZF", 50, FALSE) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -417,6 +422,32 @@ color = "#60A584" // rgb: 96, 0, 255 overdose_threshold = 12 +/datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size + if(!M.getorganslot("breasts")) + var/obj/item/organ/genital/breasts/B = new + B.insert(M) + if(B) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + B.color = skintone2hex(skin_tone) + else + B.color = "#[dna.features["breasts_color"]]" + B.size = 0 + B.update() + to_chat(user, "Your chest feels warm, tingling with newfound sensitivity.") + else + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + B.size += 0.1 + if (B.size > 8.5) + to_chat(user, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.adjustBruteLoss(2, 0) + if B.size > 9 + M.adjustOxyLoss(-50, 0) + to_chat(user, "Your clothes give, ripping into peices under the strain of your swelling breasts!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + + + /datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing if(M.gender == MALE) M.gender = FEMALE From e6e5866677bb9145f8f4cafb81413c9bcdfd7b46 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 04:18:29 +0100 Subject: [PATCH 04/40] Futher functionality to BElarger --- .../code/modules/arousal/organs/breasts.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 39 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index a9e8744975..ab0e8023c1 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -44,8 +44,10 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size) + if (size <= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." + else if (size > 8.5) + B.desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) 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 e308b966ad..4d9a1d360c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -29,7 +29,7 @@ name = "Eigenstasium" id = "eigenstate" description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" - taste_description = "." + taste_description = "wiggly" color = "#60A584" // rgb: 96, 0, 255 overdose_threshold = 15 addiction_threshold = 20 @@ -308,7 +308,7 @@ M.nutrition = M.nutrition + (M.nutrition/5) if(50) to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] 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. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(50 to 79) M.nutrition = M.nutrition + (M.nutrition/2) @@ -318,7 +318,7 @@ M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE - M.next_move_modifier = 1 + M.next_move_modifier -= 4 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) @@ -419,8 +419,13 @@ name = "Sucubus Draft" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." - color = "#60A584" // rgb: 96, 0, 255 + color = "#E60584" // rgb: 96, 0, 255 overdose_threshold = 12 + var/obj/item/organ/genital/penis/B = M.getorganslot("breasts") + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + var/obj/item/organ/genital/penis/T = M.getorganslot("testicles") + var/obj/item/organ/genital/penis/V = M.getorganslot("vagina") + var/obj/item/organ/genital/penis/W = M.getorganslot("womb") /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!M.getorganslot("breasts")) @@ -443,16 +448,36 @@ M.adjustBruteLoss(2, 0) if B.size > 9 M.adjustOxyLoss(-50, 0) - to_chat(user, "Your clothes give, ripping into peices under the strain of your swelling breasts!") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - + M.physical/speed += 0.1//big breasts are cumbersome + M.next_move_modifier += 0.1 + ..() -/datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing + +/datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. if(M.gender == MALE) M.gender = FEMALE M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") + if(P) + P.size -= 0.2 + if (P.size < 0.5) + to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") + qdel(P) + if(T) + if (P.size < 0.5 || !P) + qdel(T) + if(!V) + var/obj/item/organ/genital/vagina/V = new + V.Insert(M) + if(!W) + var/obj/item/organ/genital/womb/W = new + W.Insert(M) + update() + + if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") From bc7b3e4d9524c911bd4159f1f6a374ac845a1972 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 08:37:51 +0100 Subject: [PATCH 05/40] BE and PE chems added. --- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 168 +++++++++++++----- 2 files changed, 121 insertions(+), 49 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index ab0e8023c1..19f6fee319 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -47,7 +47,7 @@ if (size <= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." else if (size > 8.5) - B.desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) 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 4d9a1d360c..35e8e702eb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -173,8 +173,8 @@ to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) - for(var/datum/mood_event/i) - clear_event(null, i) + for (var/datum/mood_event/i in M) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) @@ -230,8 +230,8 @@ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) - /* if(1) + /* for(var/mob/dead/observer/G in GLOB.player_list) group += G for(var/m in group) @@ -244,7 +244,7 @@ result -= W candies = result */ - candies = pollGhostCandidates() + candies = pollGhostCandidates() if(20 to INFINITY) 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! @@ -358,31 +358,30 @@ description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 metabolization_rate = 0.25 * REAGENTS_METABOLISM - var/fermi_Zombie /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") switch(current_cycle)//Pretends to be normal - if(10) - to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - if(11 to 19) - M.nutrition = M.nutrition + (M.nutrition/10) if(20) + to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + if(21 to 29) + M.nutrition = M.nutrition + (M.nutrition/10) + if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(21 to 39) + if(31 to 49) M.nutrition = M.nutrition + (M.nutrition/5) - if(40) + if(50) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! - if(41 to 63) + if(51 to 73) M.nutrition = M.nutrition + (M.nutrition/2) - if(64) + 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) M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI - if(65 to 75) + if(75 to 85) M.adjustToxLoss(1, 0)// the warning! - if(76) + if(86) if (!holder.has_reagent("pen_acid"))//Counterplay is pent.) message_admins("Zombie spawned at [M.loc]") M.nutrition -= 18500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE @@ -391,7 +390,6 @@ M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") M.emote("scream") M.adjustToxLoss(30, 0) - //fermi_Zombie = new typepath(M.loc) var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. @@ -414,49 +412,54 @@ ..() -//Breast englargement -/datum/reagent/fermi/BElarger +//breast englargement +//Honestly the most requested chems +/datum/reagent/fermi/BElarger() name = "Sucubus Draft" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 + taste_description = "melted ice cream" overdose_threshold = 12 - var/obj/item/organ/genital/penis/B = M.getorganslot("breasts") + var/mob/living/carbon/M + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - var/obj/item/organ/genital/penis/T = M.getorganslot("testicles") - var/obj/item/organ/genital/penis/V = M.getorganslot("vagina") - var/obj/item/organ/genital/penis/W = M.getorganslot("womb") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + var/mob/living/carbon/human/H = M /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size - if(!M.getorganslot("breasts")) - var/obj/item/organ/genital/breasts/B = new - B.insert(M) - if(B) + if(!M.getorganslot("breasts")) //If they don't have breasts, give them breasts. + var/obj/item/organ/genital/breasts/nB = new + nB.Insert(M) + if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - B.color = skintone2hex(skin_tone) + nB.color = skintone2hex(M.skin_tone) else - B.color = "#[dna.features["breasts_color"]]" - B.size = 0 - B.update() - to_chat(user, "Your chest feels warm, tingling with newfound sensitivity.") - else - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + nB.color = "#[M.dna.features["breasts_color"]]" + nB.size = 0 + to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") + B = nB + else //If they have them, increase size. If size is comically big, limit movement and rip clothes. B.size += 0.1 if (B.size > 8.5) - to_chat(user, "Your breasts begin to strain against your clothes tightly!") + to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) - if B.size > 9 - M.adjustOxyLoss(-50, 0) - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + if (B.size > (9 + M.armour)) + M.adjustOxyLoss((-50 - (M.armour * 10)), 0) + if(H.w_uniform || H.wear_suit) + M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) M.physical/speed += 0.1//big breasts are cumbersome M.next_move_modifier += 0.1 - ..() + M.update() + ..() - - -/datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. if(M.gender == MALE) M.gender = FEMALE M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") @@ -466,21 +469,90 @@ if (P.size < 0.5) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") qdel(P) + else if (P.size > (9 + M.armour)) + M.physical/speed -= 0.1//Liberation from comical size + M.next_move_modifier -= 0.1 + M.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + + if(T) - if (P.size < 0.5 || !P) + if (P.size < 0.1 || !P) qdel(T) if(!V) - var/obj/item/organ/genital/vagina/V = new - V.Insert(M) + var/obj/item/organ/genital/vagina/nV = new + nV.Insert(M) if(!W) - var/obj/item/organ/genital/womb/W = new - W.Insert(M) - update() + var/obj/item/organ/genital/womb/nW = new + nW.Insert(M) + M.update() + ..() +/datum/reagent/fermi/PElarger() // Due to popular demand...! + name = "Bluespace Viagra" + id = "PElarger" + description = "A volatile collodial mixture derived from toxic masculinity that encourages a larger gentleman's package via a potent testosterone mix." //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 = "#E60584" // rgb: 96, 0, 255 + taste_description = "meaty oil" + overdose_threshold = 12 + var/mob/living/carbon/M + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + var/mob/living/carbon/human/H = M + +/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size + if(!M.getorganslot("penis")) + var/obj/item/organ/genital/penis/nP = new + nP.Insert(M) + if(nP) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + nP.color = skintone2hex(M.skin_tone) + else + nP.color = "#[M.dna.features["cock_color"]]" + nP.size = 0 + to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") + P = nP + else + var/obj/item/organ/genital/penis/P = M.getorganslot("breasts") + P.size += 0.1 + if (P.size > 8.5) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.adjustBruteLoss(5, 0) + if (P.size > (9 + M.armour)) + if(H.w_uniform || H.wear_suit) + M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.physical/speed += 0.1//big breasts are cumbersome + M.next_move_modifier += 0.1 + M.update() + ..() + +/datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") + + if(!P) + var/obj/item/organ/genital/penis/nP = new + nP.Insert(M) + if(!T) + var/obj/item/organ/genital/testicles/nT = new + nT.Insert(M) + M.update() + ..() + + + + if(B) + B.size -= 0.2 + if (B.size < 0.1) + to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") + qdel(B) /* //Nanite removal /datum/reagent/fermi/naninte_b_gone From 207b606f75985cd060c79a6e1ac311c02654e162 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 10:01:14 +0100 Subject: [PATCH 06/40] Fixing compiling errors. 3 majors ones remain. --- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 55 ++++++++++++------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 19f6fee319..e9ab51baa7 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -47,7 +47,7 @@ if (size <= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." else if (size > 8.5) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) 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 35e8e702eb..0b4343ac8d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -292,10 +292,11 @@ if(21) to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) - M.adjustCloneLoss(-1, 0) - M.adjustBruteLoss(-1, 0) - M.adjustFireLoss(-1, 0) - M.heal_bodypart_damage(1,1) + if(22 to INFINITY) + M.adjustCloneLoss(-1, 0) + M.adjustBruteLoss(-1, 0) + M.adjustFireLoss(-1, 0) + M.heal_bodypart_damage(1,1) 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) @@ -414,7 +415,7 @@ //breast englargement //Honestly the most requested chems -/datum/reagent/fermi/BElarger() +/datum/reagent/fermi/BElarger name = "Sucubus Draft" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." @@ -422,12 +423,14 @@ taste_description = "melted ice cream" overdose_threshold = 12 var/mob/living/carbon/M + var/mob/living/carbon/human/H = M + var/species/S var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/obj/item/organ/genital/penis/P = M.getorganslot("penis") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - var/mob/living/carbon/human/H = M + /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!M.getorganslot("breasts")) //If they don't have breasts, give them breasts. @@ -435,7 +438,7 @@ nB.Insert(M) if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - nB.color = skintone2hex(M.skin_tone) + nB.color = skintone2hex(H.skin_tone) else nB.color = "#[M.dna.features["breasts_color"]]" nB.size = 0 @@ -447,14 +450,14 @@ to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) - if (B.size > (9 + M.armour)) - M.adjustOxyLoss((-50 - (M.armour * 10)), 0) + if (B.size > 9) + //M.adjustOxyLoss((-50, 0) if(H.w_uniform || H.wear_suit) M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical/speed += 0.1//big breasts are cumbersome + S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.physical.speed += 0.1//big breasts are cumbersome M.next_move_modifier += 0.1 M.update() ..() @@ -469,10 +472,10 @@ if (P.size < 0.5) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") qdel(P) - else if (P.size > (9 + M.armour)) - M.physical/speed -= 0.1//Liberation from comical size + else if (P.size > 9 ) + M.physical.speed -= 0.1//Liberation from comical size M.next_move_modifier -= 0.1 - M.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + S.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) if(T) @@ -487,7 +490,7 @@ M.update() ..() -/datum/reagent/fermi/PElarger() // Due to popular demand...! +/datum/reagent/fermi/PElarger // Due to popular demand...! name = "Bluespace Viagra" id = "PElarger" description = "A volatile collodial mixture derived from toxic masculinity that encourages a larger gentleman's package via a potent testosterone mix." //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? @@ -495,6 +498,7 @@ taste_description = "meaty oil" overdose_threshold = 12 var/mob/living/carbon/M + var/species/S var/obj/item/organ/genital/penis/P = M.getorganslot("penis") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") @@ -507,26 +511,25 @@ var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) - if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - nP.color = skintone2hex(M.skin_tone) + if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) + nP.color = skintone2hex(H.skin_tone) else nP.color = "#[M.dna.features["cock_color"]]" nP.size = 0 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP else - var/obj/item/organ/genital/penis/P = M.getorganslot("breasts") P.size += 0.1 if (P.size > 8.5) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.adjustBruteLoss(5, 0) - if (P.size > (9 + M.armour)) + if (P.size > 9) if(H.w_uniform || H.wear_suit) M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical/speed += 0.1//big breasts are cumbersome + S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.physical.speed += 0.1//big breasts are cumbersome M.next_move_modifier += 0.1 M.update() ..() @@ -553,6 +556,16 @@ if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") qdel(B) + + +/* +/mob/living/simple_animal/hostile/retaliate/ghost +incorporeal_move = 1 +name +alpha = 20 +reduce viewrange? +*/ + /* //Nanite removal /datum/reagent/fermi/naninte_b_gone From b10bf5b69fc945db07084d0d0f52ec9670df45ad Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 05:01:14 +0100 Subject: [PATCH 07/40] Futher fixing to PE and BE chems --- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 126 +++++++++++------- 2 files changed, 80 insertions(+), 48 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index e9ab51baa7..b17cb9be72 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -44,7 +44,7 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size <= 8.5) + if (size >= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." else if (size > 8.5) desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." 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 0b4343ac8d..840e3be877 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -217,7 +217,8 @@ */ /datum/reagent/fermi/proc/sepPoll() var/list/procCandies = list() - procCandies = 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. ", "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies + procCandies = pollGhostCandidates(, "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies + sleep return procCandies /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. @@ -231,6 +232,8 @@ //Setup clone switch(current_cycle) if(1) + 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.") + sleep(300) /* for(var/mob/dead/observer/G in GLOB.player_list) group += G @@ -244,7 +247,8 @@ result -= W candies = result */ - candies = pollGhostCandidates() + + if(20 to INFINITY) 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! @@ -279,6 +283,7 @@ M.next_move_modifier = 1 M.nutrition = 150 + holder.remove_reagent("SGDF", 999, FALSE) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -422,25 +427,35 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "melted ice cream" overdose_threshold = 12 - var/mob/living/carbon/M - var/mob/living/carbon/human/H = M - var/species/S - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") - var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") - var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + //var/mob/living/carbon/M + var/mob/living/carbon/human/H + //var/mob/living/carbon/human/species/S + /* + var/obj/item/organ/genital/breasts/B + var/obj/item/organ/genital/penis/P + var/obj/item/organ/genital/testicles/T + var/obj/item/organ/genital/vagina/V + var/obj/item/organ/genital/womb/W + */ /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size - if(!M.getorganslot("breasts")) //If they don't have breasts, give them breasts. + switch(current_cycle) + if(0) + + + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) //If they don't have breasts, give them breasts. + message_admins("No breasts found!") var/obj/item/organ/genital/breasts/nB = new nB.Insert(M) if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) nB.color = skintone2hex(H.skin_tone) - else + else if(M.dna.features["breasts_color"]) nB.color = "#[M.dna.features["breasts_color"]]" + else + nB.color = skintone2hex(H.skin_tone) nB.size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") B = nB @@ -456,38 +471,44 @@ M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical.speed += 0.1//big breasts are cumbersome + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) M.next_move_modifier += 0.1 - M.update() + //M.update() ..() /datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. + + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + if(M.gender == MALE) M.gender = FEMALE M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) P.size -= 0.2 - if (P.size < 0.5) + if (P.size <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") qdel(P) + if(T) + qdel(T) else if (P.size > 9 ) - M.physical.speed -= 0.1//Liberation from comical size + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1))//Via la liberation M.next_move_modifier -= 0.1 - S.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - - if(T) - if (P.size < 0.1 || !P) - qdel(T) if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) + V = nV if(!W) var/obj/item/organ/genital/womb/nW = new nW.Insert(M) - M.update() + W = nV + //M.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! @@ -497,24 +518,35 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "meaty oil" overdose_threshold = 12 - var/mob/living/carbon/M - var/species/S - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") - var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") - var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - var/mob/living/carbon/human/H = M + //var/mob/living/carbon/M + //var/mob/living/carbon/human/species/S + /* + var/obj/item/organ/genital/penis/P + var/obj/item/organ/genital/testicles/T + var/obj/item/organ/genital/vagina/V + var/obj/item/organ/genital/womb/W + var/obj/item/organ/genital/breasts/B + */ + var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size - if(!M.getorganslot("penis")) + switch(current_cycle) + if(0) + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + + + var/obj/item/organ/genital/penis/P = M.getorganslot("penis)") + if(!P) + message_admins("No penis found!") var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) nP.color = skintone2hex(H.skin_tone) - else + else if(M.dna.features["cock_color"]) nP.color = "#[M.dna.features["cock_color"]]" + else + nP.color = skintone2hex(H.skin_tone) nP.size = 0 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP @@ -528,10 +560,11 @@ M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical.speed += 0.1//big breasts are cumbersome + H.dna.species.no_equip = list() + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1)) M.next_move_modifier += 0.1 - M.update() + //H.update() + message_admins("P size: [P.size]") ..() /datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. @@ -540,23 +573,22 @@ M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") - if(!P) - var/obj/item/organ/genital/penis/nP = new - nP.Insert(M) - if(!T) - var/obj/item/organ/genital/testicles/nT = new - nT.Insert(M) - M.update() - ..() - - - if(B) B.size -= 0.2 if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") qdel(B) + if(!T) + var/obj/item/organ/genital/testicles/nT = new + nT.Insert(M) + //H.update() + ..() + + + + + /* /mob/living/simple_animal/hostile/retaliate/ghost From 93fef732b160e783e1eab9f320181b997e0c0bd6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 05:46:47 +0100 Subject: [PATCH 08/40] Blased breasts being letters. --- .../chemistry/reagents/fermi_reagents.dm | 115 ++++++++++++------ 1 file changed, 80 insertions(+), 35 deletions(-) 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 840e3be877..2fe5712e91 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -218,7 +218,7 @@ /datum/reagent/fermi/proc/sepPoll() var/list/procCandies = list() procCandies = pollGhostCandidates(, "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies - sleep + sleep(300) return procCandies /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. @@ -233,7 +233,7 @@ switch(current_cycle) if(1) 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.") - sleep(300) + /* for(var/mob/dead/observer/G in GLOB.player_list) group += G @@ -401,7 +401,7 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50, FALSE) + holder.remove_reagent("SGZF", 20, FALSE) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. @@ -411,7 +411,7 @@ S.name = "Living teratoma" S.real_name = "Living teratoma" //S.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50, FALSE) + holder.remove_reagent("SGZF", 20, FALSE) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -420,13 +420,15 @@ //breast englargement //Honestly the most requested chems +//I tried to make it interesting..!! /datum/reagent/fermi/BElarger - name = "Sucubus Draft" + name = "Sucubus milk" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 - taste_description = "melted ice cream" + taste_description = "a milky ice cream like flavour." overdose_threshold = 12 + metabolization_rate = 0.5 * REAGENTS_METABOLISM //var/mob/living/carbon/M var/mob/living/carbon/human/H //var/mob/living/carbon/human/species/S @@ -440,9 +442,10 @@ /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size + /* switch(current_cycle) if(0) - + */ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. @@ -456,24 +459,52 @@ nB.color = "#[M.dna.features["breasts_color"]]" else nB.color = skintone2hex(H.skin_tone) - nB.size = 0 + nB.size = "a" to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - B = nB + holder.remove_reagent("BElarger", 2, FALSE) else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - B.size += 0.1 - if (B.size > 8.5) - to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.adjustBruteLoss(2, 0) - if (B.size > 9) - //M.adjustOxyLoss((-50, 0) - if(H.w_uniform || H.wear_suit) - M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) - M.next_move_modifier += 0.1 + + if(B.size == "a") + B.size = "b" + to_chat(M, "You feel your breasts grow to a modest size.") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "b") + B.size = "c" + to_chat(M, "Your breasts swell up to a substancial size.") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "c") + B.size = "d" + to_chat(M, "Your breasts flourish into a full pair.") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "d") + B.size = "e" + to_chat(M, "Your breasts expand into a large voluptuous pair!") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "e") + B.size = 7 + to_chat(M, "Your breasts expand into a large voluptuous pair!") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size > 7) + B.size += 0.2 + if (B.size > 9) + //M.adjustOxyLoss((-50, 0) + if(H.w_uniform || H.wear_suit) + M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) + M.next_move_modifier += 0.1 + else if (B.size > 8.5) + to_chat(M, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.adjustBruteLoss(2, 0) + //M.update() ..() @@ -507,17 +538,18 @@ if(!W) var/obj/item/organ/genital/womb/nW = new nW.Insert(M) - W = nV + W = nW //M.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! - name = "Bluespace Viagra" + name = "Incubus draft" id = "PElarger" - description = "A volatile collodial mixture derived from toxic masculinity that encourages a larger gentleman's package via a potent testosterone mix." //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 = "#E60584" // rgb: 96, 0, 255 - taste_description = "meaty oil" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //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 + taste_description = "a salty and sticky substance." overdose_threshold = 12 + metabolization_rate = 0.5 * REAGENTS_METABOLISM //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -530,9 +562,10 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size + /* switch(current_cycle) if(0) - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + */ var/obj/item/organ/genital/penis/P = M.getorganslot("penis)") @@ -541,20 +574,18 @@ var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) + /* if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) nP.color = skintone2hex(H.skin_tone) else if(M.dna.features["cock_color"]) nP.color = "#[M.dna.features["cock_color"]]" - else - nP.color = skintone2hex(H.skin_tone) + else*/ + nP.color = skintone2hex(H.skin_tone) nP.size = 0 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP else - P.size += 0.1 - if (P.size > 8.5) - to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.adjustBruteLoss(5, 0) + P.size += 0.2 if (P.size > 9) if(H.w_uniform || H.wear_suit) M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") @@ -563,11 +594,20 @@ H.dna.species.no_equip = list() M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1)) M.next_move_modifier += 0.1 + else if (P.size > 8.5) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.adjustBruteLoss(5, 0) + //H.update() message_admins("P size: [P.size]") ..() /datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + if(M.gender == FEMALE) M.gender = MALE @@ -578,6 +618,10 @@ if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") qdel(B) + if(V) + qdel(V) + if(W) + qdel(W) if(!T) var/obj/item/organ/genital/testicles/nT = new @@ -600,6 +644,7 @@ reduce viewrange? /* //Nanite removal +//Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone name = "Naninte bain" id = "naninte_b_gone" From 9c4e2c8e08e7c0f3a356d53e8dceec56ad54c710 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 06:01:36 +0100 Subject: [PATCH 09/40] I hope it works! --- .../chemistry/reagents/fermi_reagents.dm | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) 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 2fe5712e91..d3643b8e1a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -204,6 +204,7 @@ //var/polling = FALSE var/list/result = list() var/list/group = null + var/pollStarted = FALSE //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting @@ -216,8 +217,9 @@ ^^^breaks everything */ /datum/reagent/fermi/proc/sepPoll() - var/list/procCandies = list() - procCandies = pollGhostCandidates(, "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies + //var/list/procCandies = list() + //if (pollStarted == FALSE) + // procCandies = 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.") sleep(300) return procCandies @@ -232,7 +234,10 @@ //Setup clone switch(current_cycle) if(1) - 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(pollStarted = FALSE) + 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.") + /* for(var/mob/dead/observer/G in GLOB.player_list) @@ -335,7 +340,8 @@ ..() -/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen. +/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen, mostly consolation prizes. + pollStarted = FALSE if (playerClone == TRUE)//If the player made a clone with it, then thats all they get. playerClone = FALSE return @@ -463,7 +469,7 @@ to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") holder.remove_reagent("BElarger", 2, FALSE) else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - + message_admins("Breast size: [B.size]") if(B.size == "a") B.size = "b" to_chat(M, "You feel your breasts grow to a modest size.") @@ -523,9 +529,9 @@ P.size -= 0.2 if (P.size <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") - qdel(P) + P.Remove(P) if(T) - qdel(T) + T.Remove(M) else if (P.size > 9 ) M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1))//Via la liberation M.next_move_modifier -= 0.1 @@ -617,11 +623,11 @@ B.size -= 0.2 if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") - qdel(B) + B.Remove(M) if(V) - qdel(V) + V.Remove(M) if(W) - qdel(W) + W.Remove(M) if(!T) var/obj/item/organ/genital/testicles/nT = new From ba84ef600bbfd281cd61aae11248cb75db7fb563 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 12:00:26 +0100 Subject: [PATCH 10/40] PE and BE functionality fixed/added. --- .../code/datums/status_effects/chems.dm | 47 ++++++ .../code/modules/arousal/organs/breasts.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 145 +++++++++--------- .../reagents/chemistry/recipes/fermi.dm | 4 + 4 files changed, 125 insertions(+), 75 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 6f3d4c99ae..43f8b18cd0 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -34,6 +34,52 @@ // to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") ..() +/datum/status_effect/chem/BElarger + id = "BElarger" + var/list/items = list() + +/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) + items |= M.get_equipped_items(TRUE) + M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + +/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + items |= M.get_equipped_items(TRUE) + to_chat(M, "Your enormous breasts are way to large to fit anything over!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + +/datum/status_effect/chem/PElarger + id = "PElarger" + var/list/items = list() + +/datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) + items |= M.get_equipped_items(TRUE) + M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + +/datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + items |= M.get_equipped_items(TRUE) + to_chat(M, "Your enormous package is way to large to fit anything over!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + + +/*Doesn't work /datum/status_effect/chem/SDGF/candidates id = "SGDFCandi" var/mob/living/fermi_Clone @@ -42,3 +88,4 @@ /datum/status_effect/chem/SDGF/candidates/on_apply() 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. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies return ..() +*/ diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index b17cb9be72..1ea7d68cfc 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -44,9 +44,9 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size >= 8.5) + if (size <= 7) desc += " You estimate that they're [uppertext(size)]-cups." - else if (size > 8.5) + else if (size > 7) desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." 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 d3643b8e1a..3ed6a4fa30 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -12,10 +12,10 @@ id = "fermi" taste_description = "If affection had a taste, this would be it." -/datum/reagent/fermi/on_mob_life(mob/living/carbon/M) +///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) //current_cycle++ - holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism - return ..() + //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism + //return ..() /datum/reagent/fermi/overdose_start(mob/living/carbon/M) current_cycle++ @@ -37,7 +37,7 @@ addiction_stage2_end = 30 addiction_stage3_end = 40 addiction_stage4_end = 43 //Incase it's too long - var/turf/open/location_created = null + var/location_created var/turf/open/location_return = null var/addictCyc1 = 1 var/addictCyc2 = 1 @@ -48,26 +48,17 @@ mob/living/carbon/purgeBody + /* -/datum/reagent/fermi/eigenstate/oew() - . = ..() //Needed! - location_created = get_turf(src) //Sets up coordinate of where it was created - message_admins("Attempting to get creation location from on_new() [location_created]") - //..()s -*/ /datum/reagent/fermi/eigenstate/on_new() -//obj/item/reagent/fermi/eigenstate/Initialize() -//datum/reagent/fermi/eigenstate/Initialize() - . = ..() //Needed! - //if(holder && holder.my_atom) location_created = get_turf(loc) //Sets up coordinate of where it was created message_admins("Attempting to get creation location from init() [location_created]") //..() - +*/ /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) - if(0) + if(1) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) @@ -216,13 +207,14 @@ message_admins("Attempting to poll") ^^^breaks everything */ +/* /datum/reagent/fermi/proc/sepPoll() //var/list/procCandies = list() //if (pollStarted == FALSE) // procCandies = 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.") sleep(300) return procCandies - +*/ /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) /datum/status_effect/chem/SDGF/candidates/candies = new /datum/status_effect/chem/SDGF/candidates @@ -234,7 +226,7 @@ //Setup clone switch(current_cycle) if(1) - if(pollStarted = FALSE) + if(pollStarted == FALSE) 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.") @@ -258,6 +250,7 @@ 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!") + to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") //var/typepath = owner.type //clone = new typepath(owner.loc) var/typepath = M.type @@ -281,14 +274,16 @@ //SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") - to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) playerClone = TRUE M.next_move_modifier = 1 M.nutrition = 150 - holder.remove_reagent("SGDF", 999, FALSE) + + reaction_mob(SM, ) + holder.remove_reagent("SDGF", 999) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -333,7 +328,7 @@ to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - holder.remove_reagent("SGDF", 1, FALSE)//removes SGDF on completion. + holder.remove_reagent("SGDF", 1)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -407,17 +402,18 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 20, FALSE) + M.reagents.remove_reagent("SDZF", 20) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") - if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. + if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. M.nutrition -= 100 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" S.real_name = "Living teratoma" + S.rabid = 1 //S.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 20, FALSE) + M.reagents.remove_reagent("SDZF", 20) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -434,7 +430,7 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." overdose_threshold = 12 - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 2 //var/mob/living/carbon/M var/mob/living/carbon/human/H //var/mob/living/carbon/human/species/S @@ -467,51 +463,48 @@ nB.color = skintone2hex(H.skin_tone) nB.size = "a" to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - holder.remove_reagent("BElarger", 2, FALSE) + M.reagents.remove_reagent(src.id, 5) else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size]") + message_admins("Breast size: [B.size], [holder]") if(B.size == "a") B.size = "b" to_chat(M, "You feel your breasts grow to a modest size.") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "b") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "b") B.size = "c" to_chat(M, "Your breasts swell up to a substancial size.") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "c") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "c") B.size = "d" to_chat(M, "Your breasts flourish into a full pair.") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "d") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "d") B.size = "e" to_chat(M, "Your breasts expand into a large voluptuous pair!") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "e") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "e") B.size = 7 - to_chat(M, "Your breasts expand into a large voluptuous pair!") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size > 7) - B.size += 0.2 + to_chat(M, "Your breasts burst forth into [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")].") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + if(B.size >= 7) + B.size = B.size + 0.1 if (B.size > 9) //M.adjustOxyLoss((-50, 0) - if(H.w_uniform || H.wear_suit) - M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) + M.apply_status_effect(/datum/status_effect/chem/BElarger) + M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) M.next_move_modifier += 0.1 else if (B.size > 8.5) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) + sleep(500) - //M.update() + B.update_appearance() ..() /datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. @@ -526,17 +519,18 @@ M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) - P.size -= 0.2 - if (P.size <= 0.1) + P.length -= 0.1 + if (P.length <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") P.Remove(P) if(T) T.Remove(M) - else if (P.size > 9 ) - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1))//Via la liberation + else if (P.length > 7) + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1))//Via la liberation M.next_move_modifier -= 0.1 H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - + else + M.remove_status_effect(/datum/status_effect/chem/PElarger) if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) @@ -545,7 +539,7 @@ var/obj/item/organ/genital/womb/nW = new nW.Insert(M) W = nW - //M.update() + P.update_appearance() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! @@ -574,7 +568,7 @@ */ - var/obj/item/organ/genital/penis/P = M.getorganslot("penis)") + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) message_admins("No penis found!") var/obj/item/organ/genital/penis/nP = new @@ -586,26 +580,23 @@ else if(M.dna.features["cock_color"]) nP.color = "#[M.dna.features["cock_color"]]" else*/ - nP.color = skintone2hex(H.skin_tone) - nP.size = 0 + //nP.color = skintone2hex(H.skin_tone) + nP.length = 0.2 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP + P.update_size() else - P.size += 0.2 - if (P.size > 9) - if(H.w_uniform || H.wear_suit) - M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - H.dna.species.no_equip = list() - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1)) + P.length = P.length + 0.1 + if (P.length > 9) + M.apply_status_effect(/datum/status_effect/chem/BElarger) + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1)) M.next_move_modifier += 0.1 - else if (P.size > 8.5) + else if (P.length > 8.5) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.adjustBruteLoss(5, 0) - //H.update() - message_admins("P size: [P.size]") + P.update_appearance() + message_admins("P size: [P.length]") ..() /datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. @@ -620,19 +611,27 @@ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) - B.size -= 0.2 + B.size -= 0.1 if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(M) + else if (B.size >= 9) + M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1))//Via la liberation + M.next_move_modifier -= 0.1 + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) if(V) V.Remove(M) if(W) W.Remove(M) + B.update_appearance() + else + M.remove_status_effect(/datum/status_effect/chem/BElarger) + if(!T) var/obj/item/organ/genital/testicles/nT = new nT.Insert(M) - //H.update() + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index d4cbf6847a..82c495b352 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -23,6 +23,10 @@ FermiExplode = FALSE //If the chemical explodes in a special way ImpureChem = "toxin" //What chemical is produced with an inpure reaction +/datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) + var/location = get_turf(holder.my_atom) + var/reagent/fermi/eigenstate/location_created = location + //serum /datum/chemical_reaction/SDGF name = "synthetic-derived growth factor" From f9ead7eadb3c1beb2c261107058a4c0be6b03b1d Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 00:53:30 +0100 Subject: [PATCH 11/40] Hurghh --- .../code/datums/status_effects/chems.dm | 30 +++++-- .../code/modules/arousal/organs/breasts.dm | 42 ++++++++- .../chemistry/reagents/fermi_reagents.dm | 85 +++++-------------- 3 files changed, 83 insertions(+), 74 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 43f8b18cd0..3d5a8a99bb 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -39,7 +39,7 @@ var/list/items = list() /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) items |= M.get_equipped_items(TRUE) @@ -49,31 +49,47 @@ M.dropItemToGround(H.w_uniform) /datum/status_effect/chem/BElarger/tick(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) items |= M.get_equipped_items(TRUE) to_chat(M, "Your enormous breasts are way to large to fit anything over!") M.dropItemToGround(H.wear_suit) M.dropItemToGround(H.w_uniform) + switch(round(B.cached_size)) + if(9) + if (!(B.breast_sizes[B.prev_size] == B.size)) + M.remove_movespeed_modifier("megamilk") + M.next_move_modifier = 1 + if(10 to INFINITY) + if (!(B.breast_sizes[B.prev_size] == B.size)) + to_chat(M, "Your indulgent busom is so substantial, it's affecting your movements!") + M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) + M.next_move_modifier = (round(B.cached_size) - 8) + +/datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) + M.remove_movespeed_modifier("megamilk") + M.next_move_modifier = 1 /datum/status_effect/chem/PElarger id = "PElarger" - var/list/items = list() + //var/list/items = list() + /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) - items |= M.get_equipped_items(TRUE) + //items |= M.get_equipped_items(TRUE) M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") M.dropItemToGround(H.wear_suit) M.dropItemToGround(H.w_uniform) /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) - items |= M.get_equipped_items(TRUE) + //items |= M.get_equipped_items(TRUE) to_chat(M, "Your enormous package is way to large to fit anything over!") M.dropItemToGround(H.wear_suit) M.dropItemToGround(H.w_uniform) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 1ea7d68cfc..1b0a3679d7 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -7,6 +7,10 @@ slot = "breasts" w_class = 3 size = BREASTS_SIZE_DEF + var/cached_size = 3//for enlargement + var/prev_size = 3//For flavour texts + var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "flat") + var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) fluid_id = "milk" var/amount = 2 producing = TRUE @@ -19,6 +23,7 @@ /obj/item/organ/genital/breasts/Initialize() . = ..() reagents.add_reagent(fluid_id, fluid_max_volume) + prev_size = size /obj/item/organ/genital/breasts/on_life() if(QDELETED(src)) @@ -44,12 +49,12 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size <= 7) + if (size == "huge") desc += " You estimate that they're [uppertext(size)]-cups." - else if (size > 7) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else - desc += " You wouldn't measure them in cup sizes." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." + //else + // desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) desc += " They're leaking [fluid_id]." if(owner) @@ -59,3 +64,32 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["breasts_color"]]" + +/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M) + + switch(round(cached_size)) + if(0) + size = "flat" + if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + if(1 to 8) + size = breast_sizes[round(cached_size)] + if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + if(9 to 15) + size = breast_sizes[round(cached_size)] + if(M.has_status_effect(/datum/status_effect/chem/BElarger)) + owner.apply_status_effect(/datum/status_effect/chem/BElarger) + if(16 to INFINITY) + size = "huge" + if (!(breast_sizes[prev_size] == size)) + if (breast_values[size] > breast_values[prev_size]) + to_chat(M, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + prev_size = cached_size + else if (breast_values[size] > breast_values[prev_size]) + to_chat(M, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + prev_size = cached_size + if(cached_size < 0) + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") + B.Remove(M) 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 3ed6a4fa30..b5a09502c8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -86,7 +86,7 @@ do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - holder.remove_reagent("eigenstate", 0.5, FALSE)//So you're not stuck for 10 minutes teleporting + holder.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting ..() //loop function @@ -283,7 +283,7 @@ M.nutrition = 150 reaction_mob(SM, ) - holder.remove_reagent("SDGF", 999) + holder.remove_reagent(src.id, 999) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -328,7 +328,7 @@ to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - holder.remove_reagent("SGDF", 1)//removes SGDF on completion. + holder.remove_reagent(src.id, 1)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -402,7 +402,7 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - M.reagents.remove_reagent("SDZF", 20) + holder.remove_reagent(src.id, 20) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. @@ -413,7 +413,7 @@ S.real_name = "Living teratoma" S.rabid = 1 //S.updateappearance(mutcolor_update=1) - M.reagents.remove_reagent("SDZF", 20) + holder.remove_reagent(src.id, 20) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -422,6 +422,7 @@ //breast englargement //Honestly the most requested chems +//I'm not a very kinky person, sorry if it's not great //I tried to make it interesting..!! /datum/reagent/fermi/BElarger name = "Sucubus milk" @@ -461,50 +462,19 @@ nB.color = "#[M.dna.features["breasts_color"]]" else nB.color = skintone2hex(H.skin_tone) - nB.size = "a" + nB.size = "flat" + nB.cached_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") M.reagents.remove_reagent(src.id, 5) - else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size], [holder]") - if(B.size == "a") - B.size = "b" - to_chat(M, "You feel your breasts grow to a modest size.") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "b") - B.size = "c" - to_chat(M, "Your breasts swell up to a substancial size.") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "c") - B.size = "d" - to_chat(M, "Your breasts flourish into a full pair.") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "d") - B.size = "e" - to_chat(M, "Your breasts expand into a large voluptuous pair!") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "e") - B.size = 7 - to_chat(M, "Your breasts burst forth into [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")].") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - if(B.size >= 7) - B.size = B.size + 0.1 - if (B.size > 9) - //M.adjustOxyLoss((-50, 0) - M.apply_status_effect(/datum/status_effect/chem/BElarger) - M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) - M.next_move_modifier += 0.1 - else if (B.size > 8.5) - to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.adjustBruteLoss(2, 0) - sleep(500) + //If they have them, increase size. If size is comically big, limit movement and rip clothes. + message_admins("Breast size: [B.size], [B.cached_size], [holder]") + B.cached_size = B.cached_size + 0.1 + if (B.cached_size >= 8 && B.cached_size < 8.5) + to_chat(M, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.adjustBruteLoss(2, 0) - B.update_appearance() + B.update() ..() /datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. @@ -611,23 +581,12 @@ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) - B.size -= 0.1 - if (B.size < 0.1) - to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") - B.Remove(M) - else if (B.size >= 9) - M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1))//Via la liberation - M.next_move_modifier -= 0.1 - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - if(V) - V.Remove(M) - if(W) - W.Remove(M) - B.update_appearance() - else - M.remove_status_effect(/datum/status_effect/chem/BElarger) - - + B.cached_size = B.cached_size - B.cached_size + B.update() + if(V) + V.Remove(M) + if(W) + W.Remove(M) if(!T) var/obj/item/organ/genital/testicles/nT = new nT.Insert(M) From f8495ae96ab353e97d9b9592b098da30d2ab9e27 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 01:45:09 +0100 Subject: [PATCH 12/40] I don't know how to icons aaaa --- .../code/modules/arousal/organs/breasts.dm | 20 +++++++++++------- .../chemistry/reagents/fermi_reagents.dm | 3 ++- .../icons/obj/genitals/breasts_onmob.dmi | Bin 753 -> 1141 bytes 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 1b0a3679d7..6a27a185ba 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -49,12 +49,12 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size == "huge") + if(isnum(size)) + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." + else if (!size == "huge") desc += " You estimate that they're [uppertext(size)]-cups." else - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." - //else - // desc += " You wouldn't measure them in cup sizes." + desc += " They're very small and flatchested, however." if(producing && aroused_state) desc += " They're leaking [fluid_id]." if(owner) @@ -65,20 +65,21 @@ else color = "#[owner.dna.features["breasts_color"]]" -/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M) +//Allows breasts to grow and change size, with sprite changes too. +/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M)//wah switch(round(cached_size)) if(0) size = "flat" - if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.remove_status_effect(/datum/status_effect/chem/BElarger) if(1 to 8) size = breast_sizes[round(cached_size)] - if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.remove_status_effect(/datum/status_effect/chem/BElarger) if(9 to 15) size = breast_sizes[round(cached_size)] - if(M.has_status_effect(/datum/status_effect/chem/BElarger)) + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.apply_status_effect(/datum/status_effect/chem/BElarger) if(16 to INFINITY) size = "huge" @@ -93,3 +94,6 @@ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(M) + var/S = GLOB.breasts_shapes_list[shape] + var/mutable_appearance/genital_overlay = mutable_appearance(S.icon) + genital_overlay.icon_state = "breasts_[shape]_[size]_0_FRONT" 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 b5a09502c8..02641b6cad 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -466,6 +466,7 @@ nB.cached_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") M.reagents.remove_reagent(src.id, 5) + B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 @@ -509,7 +510,7 @@ var/obj/item/organ/genital/womb/nW = new nW.Insert(M) W = nW - P.update_appearance() + P.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index 2a7342553bedc478e6e7c2c14fe23ee8fe80511a..5be42c8e7eba00fa9b7a8df2e1b4be958ee3f498 100644 GIT binary patch literal 1141 zcmV-*1d98KP)00001bW%=J06^y0W&i*HvU*flbVOxyV{&P5 zbZKvH004NLos&Ng!XOYwXZRGP-A${mE={X4h>3A0P_Bi+KLMg&-&SX1{B3u`yO%dy zDVlC4m1qx=KPaYfyNZoiFDlNS!DT-!t0iZi!szp7N!etY#==H2DJOk5A!?&5y*(Y( zx!}x&nC2^-4bfa^p6jnzjbIkDShl&oSBH6lUdxe=oaUM zMb45koI!;D{}VRZQkWjJCrwbw-S-ut49QDIj;|U}3IG5AK0)VoyHq|f^~2H~C8Hmn z%(cC@NXWsq`MYUirnmMhy082E1>>Lg-g8Qiw#@hR?RY?5xmR7Xz+?1=9Ziq6&CgUX zPNFDUMFX8eKx00000007|I z3-0Z``$U$`_D{{^Mg=Kh7!?Mmsvt)*yd=Jz6Ov$#m**8vc~PzF=q)dNb3H4gYIdfpNd@hm)Jcc;|zx3l_9b>KKz&4^Lk5 z7Uk0$|9sHlf}x>((!x~vY0BNO&I{h6Trd6eLH2@ZpR_RPvf9`MRe3>6*JwT{J}fAu zebTn9^3~?a3*Mnd^Fc3%ojL83qKBo5%DE^1`^+5_*C*BGmtBCpoB#5OCIA2c0002^ zPJu(@`Zz~St)H7cs)%`{LoUOiIz39P;&204kYq!RF za^`MlNBf-UVg7ex4L8}_pS{VNIq@8t6ijOO?w%0000LP)t-s{{a8+ z@bJ;m(f|MdzrVlQ+S;JKoExE!6rUufpB(+)H8Hx&t5@u4l4BQBn|)n zCp4C#WXDY=me$2d^*%C|2KgJC<6wJ5008(9Mo*ui@{+BW>#z19`9)mqmc8ah+_^iq z8%)2))%~j9yeuRu?FRY;BiC;p00000@EM%lyj`W|bKh*HTsP3;b!uL&HcP)L?FM?h z)(ukgGIr(V%*;zr6a7>lothWf%DA!{><@8u_|b1300000Fu3gLGgMx#n)$vo56Qp9 z)z8*=o|u>LINyiLY~b~Lum6rn&C9iu(cElM-0BAq=5?QWk)sr?Z`yv{#?}0x-+Tub z`T>O9sq+8;008j6%O2;Z$vekbx8GCqvT5e~%FMUsdp%yK<~z*yXTjGmRpDpq2c_oa z&Xt#wS}glRbb@i~_Iqkxiet0c4YqN$)eTbf000000Q{wT-VKxI0ssI2004MRzKE+u zdv(3UeDIR5Dzkx)-yg_)>+$}?e24r0BNx9QaPReEd#QN|?q=ug24T8>sWz*bzJSEM z{65qV``T(CU*Z)G!sM>ke3u6hvSW0D;#l^Y??f%y5Kf;500000oL2R`8zw*e1vKvh jytm-szsv&wfK&PdIMr7V0^cM>00000NkvXXu0mjffUj@3 From ab317d95aa658e1e8c9f13678a1a1fe3654e07fd Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 03:42:10 +0100 Subject: [PATCH 13/40] One day it'll work and everything will be great --- .../code/datums/status_effects/chems.dm | 67 +++++++++++-------- .../code/modules/arousal/organs/breasts.dm | 59 +++++++++------- .../code/modules/arousal/organs/penis.dm | 1 + .../chemistry/reagents/fermi_reagents.dm | 28 +++----- 4 files changed, 87 insertions(+), 68 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 3d5a8a99bb..94df596aef 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -38,38 +38,45 @@ id = "BElarger" var/list/items = list() -/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M) +/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) - playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) - items |= M.get_equipped_items(TRUE) - M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) + playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) + //items |= owner.get_equipped_items(TRUE) + owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) -/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M) +/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) - items |= M.get_equipped_items(TRUE) - to_chat(M, "Your enormous breasts are way to large to fit anything over!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + message_admins("M: [M]") + message_admins("H: [H]") + message_admins("owner: [owner]") + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) + //items |= owner.get_equipped_items(TRUE) + to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) switch(round(B.cached_size)) if(9) if (!(B.breast_sizes[B.prev_size] == B.size)) - M.remove_movespeed_modifier("megamilk") - M.next_move_modifier = 1 + owner.remove_movespeed_modifier("megamilk") + owner.next_move_modifier = 1 if(10 to INFINITY) if (!(B.breast_sizes[B.prev_size] == B.size)) to_chat(M, "Your indulgent busom is so substantial, it's affecting your movements!") - M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) - M.next_move_modifier = (round(B.cached_size) - 8) + owner.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) + owner.next_move_modifier = (round(B.cached_size) - 8) /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) - M.remove_movespeed_modifier("megamilk") - M.next_move_modifier = 1 + owner.remove_movespeed_modifier("megamilk") + owner.next_move_modifier = 1 /datum/status_effect/chem/PElarger id = "PElarger" @@ -78,21 +85,25 @@ /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) //items |= M.get_equipped_items(TRUE) - M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") + owner.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) //items |= M.get_equipped_items(TRUE) - to_chat(M, "Your enormous package is way to large to fit anything over!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + to_chat(owner, "Your enormous package is way to large to fit anything over!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) /*Doesn't work diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 6a27a185ba..08378684aa 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -9,7 +9,7 @@ size = BREASTS_SIZE_DEF var/cached_size = 3//for enlargement var/prev_size = 3//For flavour texts - var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "flat") + var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) fluid_id = "milk" var/amount = 2 @@ -51,10 +51,13 @@ desc = "You see some breasts, they seem to be quite exotic." if(isnum(size)) desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." - else if (!size == "huge") - desc += " You estimate that they're [uppertext(size)]-cups." + else if (!isnum(size)) + if (size == "flat") + desc += " They're very small and flatchested, however." + else + desc += " You estimate that they're [uppertext(size)]-cups." else - desc += " They're very small and flatchested, however." + if(producing && aroused_state) desc += " They're leaking [fluid_id]." if(owner) @@ -67,33 +70,43 @@ //Allows breasts to grow and change size, with sprite changes too. -/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M)//wah +//maximum wah +//Comical sizes slow you down in movement and actions. +//Rediculous sizes remove hands. +//Should I turn someone with meter wide... assets into a blob? +//this is far too lewd wah +/obj/item/organ/genital/breasts/update_size()//wah + var/mob/living/carbon/human/H = owner + message_admins("Breast size at start: [size], [cached_size], [owner]") + //var/sprite_accessory/breasts = mob/living/carbon/M + if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! + var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") + to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") + B.Remove(owner) switch(round(cached_size)) if(0) size = "flat" - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.remove_status_effect(/datum/status_effect/chem/BElarger) + //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.remove_status_effect(/datum/status_effect/chem/BElarger) if(1 to 8) size = breast_sizes[round(cached_size)] - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.remove_status_effect(/datum/status_effect/chem/BElarger) + //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.remove_status_effect(/datum/status_effect/chem/BElarger) if(9 to 15) size = breast_sizes[round(cached_size)] - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.apply_status_effect(/datum/status_effect/chem/BElarger) + //if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.apply_status_effect(/datum/status_effect/chem/BElarger) if(16 to INFINITY) - size = "huge" - if (!(breast_sizes[prev_size] == size)) + size = cached_size + message_admins("Breast size: [size], [cached_size], [owner]") + message_admins("[breast_values[prev_size]] vs [breast_values[size]]") + if (!(prev_size == breast_values[size])) if (breast_values[size] > breast_values[prev_size]) - to_chat(M, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") prev_size = cached_size - else if (breast_values[size] > breast_values[prev_size]) - to_chat(M, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + else if (breast_values[size] < breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") prev_size = cached_size - if(cached_size < 0) - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") - B.Remove(M) - var/S = GLOB.breasts_shapes_list[shape] - var/mutable_appearance/genital_overlay = mutable_appearance(S.icon) - genital_overlay.icon_state = "breasts_[shape]_[size]_0_FRONT" + icon_state = "breasts_[shape]_[size]" + H.update_body() + //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 38e8e44f39..82bc2c61d8 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -48,6 +48,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" + owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) 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 02641b6cad..30c555776d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -405,13 +405,13 @@ holder.remove_reagent(src.id, 20) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") - if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. + 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.nutrition -= 100 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" - S.real_name = "Living teratoma" - S.rabid = 1 + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi //S.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) M.adjustToxLoss(10, 0) @@ -431,17 +431,9 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." overdose_threshold = 12 - metabolization_rate = 2 - //var/mob/living/carbon/M + metabolization_rate = 0.5 var/mob/living/carbon/human/H - //var/mob/living/carbon/human/species/S - /* - var/obj/item/organ/genital/breasts/B - var/obj/item/organ/genital/penis/P - var/obj/item/organ/genital/testicles/T - var/obj/item/organ/genital/vagina/V - var/obj/item/organ/genital/womb/W - */ + /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size @@ -464,13 +456,14 @@ nB.color = skintone2hex(H.skin_tone) nB.size = "flat" nB.cached_size = 0 + nB.prev_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") M.reagents.remove_reagent(src.id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 - if (B.cached_size >= 8 && B.cached_size < 8.5) + if (B.cached_size >= 8.5 && B.cached_size < 9) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) @@ -502,6 +495,7 @@ H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) else M.remove_status_effect(/datum/status_effect/chem/PElarger) + P.update() if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) @@ -510,7 +504,6 @@ var/obj/item/organ/genital/womb/nW = new nW.Insert(M) W = nW - P.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! @@ -520,7 +513,7 @@ color = "#H60584" // rgb: 96, 0, 255 taste_description = "a salty and sticky substance." overdose_threshold = 12 - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 0.5 //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -582,7 +575,8 @@ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) - B.cached_size = B.cached_size - B.cached_size + B.cached_size = B.cached_size - 0.1 + message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.update() if(V) V.Remove(M) From 0ae8c72c9a5d9640263807796576ed026254d0a6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 04:04:57 +0100 Subject: [PATCH 14/40] Bees --- modular_citadel/code/datums/status_effects/chems.dm | 2 ++ modular_citadel/code/modules/arousal/organs/breasts.dm | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 94df596aef..14a88602f2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -39,6 +39,7 @@ var/list/items = list() /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. + message_admins("BElarge started!") var/mob/living/carbon/human/H = M for(var/obj/item/W in H) if(W == H.w_uniform || W == H.wear_suit) @@ -51,6 +52,7 @@ //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge + message_admins("BElarge tick!") var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/mob/living/carbon/human/H = M message_admins("M: [M]") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 08378684aa..9717622c04 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -56,7 +56,6 @@ desc += " They're very small and flatchested, however." else desc += " You estimate that they're [uppertext(size)]-cups." - else if(producing && aroused_state) desc += " They're leaking [fluid_id]." @@ -96,11 +95,16 @@ size = breast_sizes[round(cached_size)] //if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) H.apply_status_effect(/datum/status_effect/chem/BElarger) + message_admins("Attempting to apply.") if(16 to INFINITY) size = cached_size message_admins("Breast size: [size], [cached_size], [owner]") + if(size == 0)//Bloody byond with it's counting from 1 + size = 17 message_admins("[breast_values[prev_size]] vs [breast_values[size]]") if (!(prev_size == breast_values[size])) + if(prev_size == 0)//rabble rabble + prev_size = 17 if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") prev_size = cached_size From d0607ee85c21fa6686d38ef37d9b25a1cabf0504 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 04:43:58 +0100 Subject: [PATCH 15/40] Oneday it'll all work and everything would be great --- .../code/datums/status_effects/chems.dm | 18 ++++---- .../code/modules/arousal/organs/breasts.dm | 44 ++++++++++++------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 14a88602f2..baaa0da0c2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -41,15 +41,17 @@ /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("BElarge started!") var/mob/living/carbon/human/H = M - for(var/obj/item/W in H) + var/items = M.get_contents() + for(W in items) if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) - playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) - //items |= owner.get_equipped_items(TRUE) - owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) + M.dropItemToGround(W, TRUE) + message_admins("Dropping [W]") + playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) + //items |= owner.get_equipped_items(TRUE) + owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge message_admins("BElarge tick!") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 9717622c04..d945436817 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -93,24 +93,34 @@ H.remove_status_effect(/datum/status_effect/chem/BElarger) if(9 to 15) size = breast_sizes[round(cached_size)] - //if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.apply_status_effect(/datum/status_effect/chem/BElarger) + if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.apply_status_effect(/datum/status_effect/chem/BElarger) message_admins("Attempting to apply.") if(16 to INFINITY) size = cached_size - message_admins("Breast size: [size], [cached_size], [owner]") - if(size == 0)//Bloody byond with it's counting from 1 - size = 17 - message_admins("[breast_values[prev_size]] vs [breast_values[size]]") - if (!(prev_size == breast_values[size])) - if(prev_size == 0)//rabble rabble - prev_size = 17 - if (breast_values[size] > breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") - prev_size = cached_size - else if (breast_values[size] < breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") - prev_size = cached_size - icon_state = "breasts_[shape]_[size]" - H.update_body() + + if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. + if (prev_size == 0) + prev_size = "flat" + message_admins("Breast size: [size], [cached_size], [owner]") + if(size == 0)//Bloody byond with it's counting from 1 + size = "flat" + message_admins("[prev_size] vs [breast_values[size]]") + message_admins("breast_values[size] vs [breast_values[prev_size]]") + if (breast_values[size] > breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + //prev_size = cached_size + else if (breast_values[size] < breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + //prev_size = cached_size + prev_size = size + icon_state = "breasts_[shape]_[size]" + H.update_body() + else + if(!isnum(prev_size)) + prev_size = breast_values[prev_size] + if(size > prev_size) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") + else if (size < prev_size) + to_chat(owner, "Your breasts do something crazy that the big Fermis in the sky didn't account for.") //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" From 4a94d550a34f7bb05a1dc86b454c6ef500e283ee Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 08:54:04 +0100 Subject: [PATCH 16/40] Midfix --- .../code/datums/status_effects/chems.dm | 34 +++++++------ .../code/modules/arousal/organs/breasts.dm | 48 ++++++++++--------- .../code/modules/arousal/organs/penis.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 26 ++++++---- 4 files changed, 64 insertions(+), 46 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index baaa0da0c2..f91aad7009 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -38,31 +38,36 @@ id = "BElarger" var/list/items = list() -/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. +//mob/living/carbon/M = M tried, no dice +//owner, tried, no dice +/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("BElarge started!") - var/mob/living/carbon/human/H = M - var/items = M.get_contents() - for(W in items) + //var/mob/living/carbon/human/H = M + var/items = H.get_contents() + for(var/obj/item/W in items) if(W == H.w_uniform || W == H.wear_suit) - M.dropItemToGround(W, TRUE) + owner.dropItemToGround(W, TRUE) message_admins("Dropping [W]") playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) //items |= owner.get_equipped_items(TRUE) - owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + owner.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") //owner.dropItemToGround(owner.wear_suit) //owner.dropItemToGround(owner.w_uniform) + return ..() -/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge +/datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge message_admins("BElarge tick!") - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - var/mob/living/carbon/human/H = M - message_admins("M: [M]") + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") + //var/mob/living/carbon/human/H = M + message_admins("M: [H]") message_admins("H: [H]") message_admins("owner: [owner]") - for(var/obj/item/W in H) - if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W) //items |= owner.get_equipped_items(TRUE) to_chat(owner, "Your enormous breasts are way to large to fit anything over!") //owner.dropItemToGround(owner.wear_suit) @@ -74,9 +79,10 @@ owner.next_move_modifier = 1 if(10 to INFINITY) if (!(B.breast_sizes[B.prev_size] == B.size)) - to_chat(M, "Your indulgent busom is so substantial, it's affecting your movements!") + to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") owner.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) owner.next_move_modifier = (round(B.cached_size) - 8) + ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) owner.remove_movespeed_modifier("megamilk") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index d945436817..7a7b43cbaa 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -11,6 +11,7 @@ var/prev_size = 3//For flavour texts var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) + var/statuscheck = FALSE fluid_id = "milk" var/amount = 2 producing = TRUE @@ -50,7 +51,7 @@ else desc = "You see some breasts, they seem to be quite exotic." if(isnum(size)) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else if (!isnum(size)) if (size == "flat") desc += " They're very small and flatchested, however." @@ -75,7 +76,7 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah - var/mob/living/carbon/human/H = owner + //var/mob/living/carbon/human/H = owner message_admins("Breast size at start: [size], [cached_size], [owner]") //var/sprite_accessory/breasts = mob/living/carbon/M if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! @@ -85,42 +86,45 @@ switch(round(cached_size)) if(0) size = "flat" - //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.remove_status_effect(/datum/status_effect/chem/BElarger) + if(statuscheck == TRUE) + message_admins("Attempting to remove.") + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + statuscheck = FALSE if(1 to 8) size = breast_sizes[round(cached_size)] - //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.remove_status_effect(/datum/status_effect/chem/BElarger) + if(statuscheck == TRUE) + message_admins("Attempting to remove.") + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + statuscheck = FALSE if(9 to 15) size = breast_sizes[round(cached_size)] - if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.apply_status_effect(/datum/status_effect/chem/BElarger) - message_admins("Attempting to apply.") + if(statuscheck == FALSE) + message_admins("Attempting to apply.") + owner.apply_status_effect(/datum/status_effect/chem/BElarger) + statuscheck = TRUE + if(16 to INFINITY) size = cached_size - + message_admins("Breast size: [size], [cached_size], [owner]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. if (prev_size == 0) prev_size = "flat" - message_admins("Breast size: [size], [cached_size], [owner]") if(size == 0)//Bloody byond with it's counting from 1 size = "flat" - message_admins("[prev_size] vs [breast_values[size]]") - message_admins("breast_values[size] vs [breast_values[prev_size]]") - if (breast_values[size] > breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") - //prev_size = cached_size - else if (breast_values[size] < breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") - //prev_size = cached_size + message_admins("1. [prev_size] vs [breast_values[size]]") + message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") + if (breast_values[size] > breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + else if (breast_values[size] < breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") prev_size = size icon_state = "breasts_[shape]_[size]" - H.update_body() + owner.update_body() else if(!isnum(prev_size)) prev_size = breast_values[prev_size] - if(size > prev_size) + if(round(size) > round(prev_size)) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - else if (size < prev_size) + else if (round(size) < round(prev_size)) to_chat(owner, "Your breasts do something crazy that the big Fermis in the sky didn't account for.") //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 82bc2c61d8..2665bfe449 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -48,7 +48,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - owner.update_body() + //owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) 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 30c555776d..f4334f3230 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -433,6 +433,7 @@ overdose_threshold = 12 metabolization_rate = 0.5 var/mob/living/carbon/human/H + var/target = get_bodypart(BODY_ZONE_CHEST) @@ -466,12 +467,12 @@ if (B.cached_size >= 8.5 && B.cached_size < 9) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) - M.adjustBruteLoss(2, 0) + M.apply_damage(5, BRUTE, target) B.update() ..() -/datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/BElarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. var/obj/item/organ/genital/penis/P = M.getorganslot("penis") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") @@ -483,7 +484,7 @@ M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) - P.length -= 0.1 + P.length = P.length - 0.1 if (P.length <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") P.Remove(P) @@ -492,7 +493,6 @@ else if (P.length > 7) M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1))//Via la liberation M.next_move_modifier -= 0.1 - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) else M.remove_status_effect(/datum/status_effect/chem/PElarger) P.update() @@ -514,6 +514,7 @@ taste_description = "a salty and sticky substance." overdose_threshold = 12 metabolization_rate = 0.5 + var/target get_bodypart(BODY_ZONE_CHEST) //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -552,24 +553,24 @@ else P.length = P.length + 0.1 if (P.length > 9) - M.apply_status_effect(/datum/status_effect/chem/BElarger) + M.apply_status_effect(/datum/status_effect/chem/PElarger) M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1)) M.next_move_modifier += 0.1 else if (P.length > 8.5) to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.adjustBruteLoss(5, 0) + M.apply_damage(5, BRUTE, target) P.update_appearance() message_admins("P size: [P.length]") ..() -/datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - + message_admins("PE Breast status: [B]") if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") @@ -589,7 +590,14 @@ ..() - +/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! + name = "Astrogen" + id = "PElarger" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //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 + taste_description = "a salty and sticky substance." + overdose_threshold = 12 + metabolization_rate = 0.5 From accb202d6ec0c5eb6cf20f895ec09c39799d9e84 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 09:41:10 +0100 Subject: [PATCH 17/40] BROKEN COMMIT. Just in case. --- .../code/datums/status_effects/chems.dm | 99 +++++++++++-------- .../code/modules/arousal/organs/breasts.dm | 35 +++---- .../code/modules/arousal/organs/penis.dm | 53 +++++++--- .../chemistry/reagents/fermi_reagents.dm | 83 +++++++++------- 4 files changed, 157 insertions(+), 113 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f91aad7009..1d81eaee9d 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -36,84 +36,97 @@ /datum/status_effect/chem/BElarger id = "BElarger" - var/list/items = list() + //var/list/items = list() + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") + //var/items = o.get_contents() //mob/living/carbon/M = M tried, no dice //owner, tried, no dice /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("BElarge started!") - //var/mob/living/carbon/human/H = M - var/items = H.get_contents() - for(var/obj/item/W in items) - if(W == H.w_uniform || W == H.wear_suit) - owner.dropItemToGround(W, TRUE) - message_admins("Dropping [W]") - playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) - //items |= owner.get_equipped_items(TRUE) - owner.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + o.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge message_admins("BElarge tick!") - var/mob/living/carbon/human/o = owner - var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") - //var/mob/living/carbon/human/H = M - message_admins("M: [H]") - message_admins("H: [H]") - message_admins("owner: [owner]") + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) + to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + /* var/items = o.get_contents() for(var/obj/item/W in items) if(W == o.w_uniform || W == o.wear_suit) o.dropItemToGround(W) //items |= owner.get_equipped_items(TRUE) - to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + //owner.dropItemToGround(owner.wear_suit) //owner.dropItemToGround(owner.w_uniform) + */ switch(round(B.cached_size)) if(9) if (!(B.breast_sizes[B.prev_size] == B.size)) - owner.remove_movespeed_modifier("megamilk") - owner.next_move_modifier = 1 + o.remove_movespeed_modifier("megamilk") + o.next_move_modifier = 1 if(10 to INFINITY) if (!(B.breast_sizes[B.prev_size] == B.size)) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") - owner.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) - owner.next_move_modifier = (round(B.cached_size) - 8) + o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) + o.next_move_modifier = (round(B.cached_size) - 8) ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) owner.remove_movespeed_modifier("megamilk") owner.next_move_modifier = 1 + /datum/status_effect/chem/PElarger id = "PElarger" - //var/list/items = list() + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") +/datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. + message_admins("PElarge started!") + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + owner.visible_message("[M]'s schlong suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + return ..() -/datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) - var/mob/living/carbon/human/H = M - for(var/obj/item/W in H) - if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) - playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) - //items |= M.get_equipped_items(TRUE) - owner.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) - var/mob/living/carbon/human/H = M - for(var/obj/item/W in H) - if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) - //items |= M.get_equipped_items(TRUE) + message_admins("PElarge tick!") + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) to_chat(owner, "Your enormous package is way to large to fit anything over!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + to_chat(owner, "Your enormous package is way to large to fit anything over!") + switch(round(P.cached_size)) + if(11) + if (!(P.prev_size == P.size)) + to_chat(H, "Your rascally willy has become a more managable size, liberating your movements.") + o.remove_movespeed_modifier("hugedick") + o.next_move_modifier = 1 + if(12 to INFINITY) + if (!(P.prev_size == P.size)) + to_chat(H, "Your indulgent johnson is so substantial, it's affecting your movements!") + o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 11.1)) + o.next_move_modifier = (round(B.cached_size) - 8) + ..() /*Doesn't work diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 7a7b43cbaa..2f51cfb26f 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -76,55 +76,48 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah - //var/mob/living/carbon/human/H = owner message_admins("Breast size at start: [size], [cached_size], [owner]") - //var/sprite_accessory/breasts = mob/living/carbon/M if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(owner) switch(round(cached_size)) - if(0) + if(0) //If flatchested size = "flat" if(statuscheck == TRUE) message_admins("Attempting to remove.") owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE - if(1 to 8) + if(1 to 8) //If modest size size = breast_sizes[round(cached_size)] if(statuscheck == TRUE) message_admins("Attempting to remove.") owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE - if(9 to 15) + if(9 to 15) //If massive size = breast_sizes[round(cached_size)] if(statuscheck == FALSE) message_admins("Attempting to apply.") owner.apply_status_effect(/datum/status_effect/chem/BElarger) statuscheck = TRUE - if(16 to INFINITY) + if(16 to INFINITY) //if Rediculous size = cached_size message_admins("Breast size: [size], [cached_size], [owner]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. - if (prev_size == 0) - prev_size = "flat" - if(size == 0)//Bloody byond with it's counting from 1 - size = "flat" - message_admins("1. [prev_size] vs [breast_values[size]]") + if (!isnum(prev_size)) + breast_values[prev_size] + if(!isnum(prev_size)//Bloody byond with it's counting from 1 + breast_values[prev_size] message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") else if (breast_values[size] < breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") prev_size = size - icon_state = "breasts_[shape]_[size]" - owner.update_body() - else - if(!isnum(prev_size)) - prev_size = breast_values[prev_size] - if(round(size) > round(prev_size)) + icon_state = sanitize_text("breasts_[shape]_[size]") + + else (cached_size == 16.2) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - else if (round(size) < round(prev_size)) - to_chat(owner, "Your breasts do something crazy that the big Fermis in the sky didn't account for.") - //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" + owner.update_body() + B.update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 2665bfe449..f2219bf597 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -18,23 +18,50 @@ var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF var/list/dickflags = list() var/list/knotted_types = list("knotted", "barbed, knotted") + var/mob/living/carbon/human/o = owner + var/statuscheck = FALSE + var/prev_size = 6 + /obj/item/organ/genital/penis/update_size() - if(length == cached_length) - return - switch(length) - if(-INFINITY to 5) + + if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! + var/obj/item/organ/genital/penis/P = o.getorganslot("breasts") + to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") + P.Remove(o) + switch(round(cached_length)) + if(0 to 4) //If modest size + length = cached_length size = 1 - if(5 to 9) + if(statuscheck == TRUE) + 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(9 to INFINITY) - size = 3//no new sprites for anything larger yet -/* if(9 to 15) - size = 3 - if(15 to INFINITY) - size = 3*/ + if(statuscheck == TRUE) + 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.") + 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") + 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(size)] inch penis.") + else 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("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(size)] inch penis.") + prev_size = length + icon_state = sanitize_text("penis_[shape]_[size]") + o.update_body() + P.update_icon() girth = (length * girth_ratio) - cached_length = length /obj/item/organ/genital/penis/update_appearance() var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" @@ -48,7 +75,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - //owner.update_body() + H.update_body() /obj/item/organ/genital/penis/update_link() if(owner) 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 f4334f3230..f533fc517a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -433,7 +433,6 @@ overdose_threshold = 12 metabolization_rate = 0.5 var/mob/living/carbon/human/H - var/target = get_bodypart(BODY_ZONE_CHEST) @@ -465,10 +464,10 @@ message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 if (B.cached_size >= 8.5 && B.cached_size < 9) + var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) - M.apply_damage(5, BRUTE, target) - + M.apply_damage(2, BRUTE, target) B.update() ..() @@ -485,17 +484,10 @@ if(P) P.length = P.length - 0.1 - if (P.length <= 0.1) - to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") - P.Remove(P) - if(T) - T.Remove(M) - else if (P.length > 7) - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1))//Via la liberation - M.next_move_modifier -= 0.1 - else - M.remove_status_effect(/datum/status_effect/chem/PElarger) - P.update() + message_admins("Breast size: [P.size], [P.cached_size], [holder]") + P.update() + if(T) + T.Remove(M) if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) @@ -514,7 +506,6 @@ taste_description = "a salty and sticky substance." overdose_threshold = 12 metabolization_rate = 0.5 - var/target get_bodypart(BODY_ZONE_CHEST) //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -527,36 +518,47 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size - /* - switch(current_cycle) - if(0) - */ + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) //If they don't have breasts, give them breasts. + message_admins("No breasts found!") + var/obj/item/organ/genital/breasts/nB = new + nB.Insert(M) + if(nB) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + nB.color = skintone2hex(H.skin_tone) + else if(M.dna.features["breasts_color"]) + nB.color = "#[M.dna.features["breasts_color"]]" + else + nB.color = skintone2hex(H.skin_tone) + nB.size = "flat" + + to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") + + B = nB + //If they have them, increase size. If size is comically big, limit movement and rip clothes. + message_admins("Breast size: [B.size], [B.cached_size], [holder]") + B.cached_size = B.cached_size + 0.1 + + B.update() var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) - message_admins("No penis found!") + message_admins("No penis found!")//They do have a preponderance for escapism, or so I've heard. var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) - /* - if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) - nP.color = skintone2hex(H.skin_tone) - else if(M.dna.features["cock_color"]) - nP.color = "#[M.dna.features["cock_color"]]" - else*/ - //nP.color = skintone2hex(H.skin_tone) nP.length = 0.2 - to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") + to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO + nP.cached_length = 0 + nP.prev_size = 0 + M.reagents.remove_reagent(src.id, 5) P = nP - P.update_size() else P.length = P.length + 0.1 - if (P.length > 9) - M.apply_status_effect(/datum/status_effect/chem/PElarger) - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1)) - M.next_move_modifier += 0.1 - else if (P.length > 8.5) + if (P.cached_size >= 10.5 && P.cached_length < 11) //too low? + M.apply_damage(2, BRUTE, target) + var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.apply_damage(5, BRUTE, target) @@ -586,13 +588,22 @@ if(!T) var/obj/item/organ/genital/testicles/nT = new nT.Insert(M) - + T = nT ..() /datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! name = "Astrogen" - id = "PElarger" + id = "astral" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //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 + taste_description = "a salty and sticky substance." + overdose_threshold = 12 + metabolization_rate = 0.5 + +/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! + name = "Astrogen" + id = "astral" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //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 taste_description = "a salty and sticky substance." From 3c82bb2d4654a8bf1fc8d79002c5abb6ed419184 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 10:38:35 +0100 Subject: [PATCH 18/40] PElarger BElarger finalise 0.1 --- .../code/datums/status_effects/chems.dm | 45 ++++++++++--------- .../code/modules/arousal/organs/breasts.dm | 14 +++--- .../code/modules/arousal/organs/penis.dm | 8 ++-- .../chemistry/reagents/fermi_reagents.dm | 30 +------------ 4 files changed, 37 insertions(+), 60 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 1d81eaee9d..60a0165b17 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -37,31 +37,33 @@ /datum/status_effect/chem/BElarger id = "BElarger" //var/list/items = list() - var/mob/living/carbon/human/o = owner - var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") //var/items = o.get_contents() //mob/living/carbon/M = M tried, no dice //owner, tried, no dice /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. - message_admins("BElarge started!") + var/mob/living/carbon/human/o = owner if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(H.w_uniform, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + o.dropItemToGround(H.wear_suit, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + message_admins("BElarge started!") o.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge - message_admins("BElarge tick!") + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(H.w_uniform, TRUE) to_chat(owner, "Your enormous breasts are way to large to fit anything over!") if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) + o.dropItemToGround(H.wear_suit, TRUE) to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + message_admins("BElarge tick!") /* var/items = o.get_contents() for(var/obj/item/W in items) @@ -91,41 +93,42 @@ /datum/status_effect/chem/PElarger id = "PElarger" - var/mob/living/carbon/human/o = owner - var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("PElarge started!") + var/mob/living/carbon/human/o = owner if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(H.w_uniform, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) + o.dropItemToGround(H.wear_suit, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - owner.visible_message("[M]'s schlong suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") return ..() /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/penis/P = o.getorganslot("penis") message_admins("PElarge tick!") if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(o.w_uniform, TRUE) to_chat(owner, "Your enormous package is way to large to fit anything over!") if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) + o.dropItemToGround(o.wear_suit, TRUE) to_chat(owner, "Your enormous package is way to large to fit anything over!") - switch(round(P.cached_size)) + switch(round(P.cached_length)) if(11) if (!(P.prev_size == P.size)) - to_chat(H, "Your rascally willy has become a more managable size, liberating your movements.") + to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") o.remove_movespeed_modifier("hugedick") o.next_move_modifier = 1 if(12 to INFINITY) if (!(P.prev_size == P.size)) - to_chat(H, "Your indulgent johnson is so substantial, it's affecting your movements!") + to_chat(o, "Your indulgent johnson is so substantial, it's affecting your movements!") o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 11.1)) - o.next_move_modifier = (round(B.cached_size) - 8) + o.next_move_modifier = (round(P.length) - 11) ..() diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 2f51cfb26f..9e1dfa2417 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -76,9 +76,9 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah + var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! - var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(owner) switch(round(cached_size)) @@ -105,10 +105,10 @@ size = cached_size message_admins("Breast size: [size], [cached_size], [owner]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. - if (!isnum(prev_size)) - breast_values[prev_size] - if(!isnum(prev_size)//Bloody byond with it's counting from 1 - breast_values[prev_size] + if (isnum(prev_size)) + prev_size = breast_values[prev_size]//make numbers letters + if(isnum(size))//Bloody byond with it's counting from 1 + size = breast_values[size] //make numbers letters message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") @@ -117,7 +117,7 @@ prev_size = size icon_state = sanitize_text("breasts_[shape]_[size]") - else (cached_size == 16.2) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") + else if (cached_size == 16.2) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") owner.update_body() B.update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index f2219bf597..191951f408 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -18,13 +18,12 @@ var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF var/list/dickflags = list() var/list/knotted_types = list("knotted", "barbed, knotted") - var/mob/living/carbon/human/o = owner var/statuscheck = FALSE var/prev_size = 6 /obj/item/organ/genital/penis/update_size() - + var/mob/living/carbon/human/o = owner if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! var/obj/item/organ/genital/penis/P = o.getorganslot("breasts") to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") @@ -60,10 +59,11 @@ prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") o.update_body() - P.update_icon() + //P.update_icon() girth = (length * girth_ratio) /obj/item/organ/genital/penis/update_appearance() + var/mob/living/carbon/human/o = owner var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" icon_state = sanitize_text(string) var/lowershape = lowertext(shape) @@ -75,7 +75,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - H.update_body() + o.update_body() /obj/item/organ/genital/penis/update_link() if(owner) 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 f533fc517a..ecca3f27a0 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -484,7 +484,7 @@ if(P) P.length = P.length - 0.1 - message_admins("Breast size: [P.size], [P.cached_size], [holder]") + message_admins("Breast size: [P.size], [P.cached_length], [holder]") P.update() if(T) T.Remove(M) @@ -518,30 +518,6 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size - - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - if(!B) //If they don't have breasts, give them breasts. - message_admins("No breasts found!") - var/obj/item/organ/genital/breasts/nB = new - nB.Insert(M) - if(nB) - if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - nB.color = skintone2hex(H.skin_tone) - else if(M.dna.features["breasts_color"]) - nB.color = "#[M.dna.features["breasts_color"]]" - else - nB.color = skintone2hex(H.skin_tone) - nB.size = "flat" - - to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - - B = nB - //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size], [B.cached_size], [holder]") - B.cached_size = B.cached_size + 0.1 - - B.update() - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) message_admins("No penis found!")//They do have a preponderance for escapism, or so I've heard. @@ -556,14 +532,12 @@ P = nP else P.length = P.length + 0.1 - if (P.cached_size >= 10.5 && P.cached_length < 11) //too low? - M.apply_damage(2, BRUTE, target) + if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.apply_damage(5, BRUTE, target) P.update_appearance() - message_admins("P size: [P.length]") ..() /datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. From 890b3f8d7d85d12ad2be06afbf51d77e16d350e3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 15:55:23 +0100 Subject: [PATCH 19/40] Added Astral beta chem. --- .../code/datums/status_effects/chems.dm | 54 +++++---- .../code/modules/arousal/organs/breasts.dm | 25 ++-- .../code/modules/arousal/organs/penis.dm | 10 +- .../chemistry/reagents/fermi_reagents.dm | 109 ++++++++++++++---- .../reagents/chemistry/recipes/fermi.dm | 2 +- 5 files changed, 131 insertions(+), 69 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 60a0165b17..61e7c7a90c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -21,7 +21,7 @@ return ..() /datum/status_effect/chem/SGDF/tick() - message_admins("SDGF ticking") + //message_admins("SDGF ticking") if(owner.stat == DEAD) message_admins("SGDF status swapping") if(fermi_Clone && fermi_Clone.stat != DEAD) @@ -43,27 +43,26 @@ //owner, tried, no dice /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. var/mob/living/carbon/human/o = owner - if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - message_admins("BElarge started!") - o.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") + 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) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + //message_admins("BElarge started!") + o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") - if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) - to_chat(owner, "Your enormous breasts are way to large to fit anything over!") - if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - to_chat(owner, "Your enormous breasts are way to large to fit anything over!") - message_admins("BElarge tick!") + 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) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") + //message_admins("BElarge tick!") /* var/items = o.get_contents() for(var/obj/item/W in items) @@ -97,12 +96,11 @@ /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("PElarge started!") var/mob/living/carbon/human/o = owner - if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + 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) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") return ..() @@ -112,12 +110,12 @@ var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") message_admins("PElarge tick!") - if(o.w_uniform) - o.dropItemToGround(o.w_uniform, TRUE) - to_chat(owner, "Your enormous package is way to large to fit anything over!") - if(o.wear_suit) - o.dropItemToGround(o.wear_suit, TRUE) - to_chat(owner, "Your enormous package is way to large to fit anything over!") + 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) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + to_chat(owner, "Your enormous package is way to large to fit anything over!") switch(round(P.cached_length)) if(11) if (!(P.prev_size == P.size)) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 9e1dfa2417..ae4d05cc58 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -76,11 +76,12 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah - var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") + //var/mob/living/carbon/human/o = owner + //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") - B.Remove(owner) + src.Remove(owner) switch(round(cached_size)) if(0) //If flatchested size = "flat" @@ -103,21 +104,25 @@ if(16 to INFINITY) //if Rediculous size = cached_size - message_admins("Breast size: [size], [cached_size], [owner]") + //message_admins("1. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") + //message_admins("1. [prev_size] vs [breast_values[size]]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. - if (isnum(prev_size)) - prev_size = breast_values[prev_size]//make numbers letters - if(isnum(size))//Bloody byond with it's counting from 1 - size = breast_values[size] //make numbers letters - message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") + if (prev_size == 0) + prev_size = "flat" + if(size == 0)//Bloody byond with it's counting from 1 + size = "flat" + if(isnum(prev_size)) + prev_size = breast_sizes[prev_size] + message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") else if (breast_values[size] < breast_values[prev_size]) to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") prev_size = size - icon_state = sanitize_text("breasts_[shape]_[size]") else if (cached_size == 16.2) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") + + icon_state = sanitize_text("breasts_[shape]_[size]") owner.update_body() - B.update_icon() + update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 191951f408..c5ee246e9a 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -25,7 +25,7 @@ /obj/item/organ/genital/penis/update_size() var/mob/living/carbon/human/o = owner if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! - var/obj/item/organ/genital/penis/P = o.getorganslot("breasts") + var/obj/item/organ/genital/penis/P = o.getorganslot("penis") to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") P.Remove(o) switch(round(cached_length)) @@ -58,12 +58,12 @@ 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("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(size)] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") - o.update_body() - //P.update_icon() + //update_body() + //P.update_icon() //Either of these don't work, why??? girth = (length * girth_ratio) /obj/item/organ/genital/penis/update_appearance() - var/mob/living/carbon/human/o = owner + //var/mob/living/carbon/o = owner var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" icon_state = sanitize_text(string) var/lowershape = lowertext(shape) @@ -75,7 +75,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - o.update_body() + owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) 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 ecca3f27a0..e9b154d934 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -30,7 +30,7 @@ id = "eigenstate" description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" taste_description = "wiggly" - color = "#60A584" // rgb: 96, 0, 255 + color = "#5020H4" // rgb: 50, 20, 255 overdose_threshold = 15 addiction_threshold = 20 metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -434,8 +434,6 @@ metabolization_rate = 0.5 var/mob/living/carbon/human/H - - /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size /* switch(current_cycle) @@ -526,18 +524,18 @@ if(nP) nP.length = 0.2 to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO - nP.cached_length = 0 - nP.prev_size = 0 + nP.cached_length = 0.1 + nP.prev_size = 0.1 M.reagents.remove_reagent(src.id, 5) P = nP - else - P.length = P.length + 0.1 - if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.apply_damage(5, BRUTE, target) - P.update_appearance() + P.cached_length = P.cached_length + 0.1 + if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? + var/target = M.get_bodypart(BODY_ZONE_CHEST) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.apply_damage(5, BRUTE, target) + + P.update() ..() /datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. @@ -566,24 +564,85 @@ ..() -/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! +/datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! name = "Astrogen" id = "astral" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //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 + description = "An opalescent murky liquid that is said to distort your soul from your being." + color = "#6600A4" // rgb: 96, 0, 255 taste_description = "a salty and sticky substance." - overdose_threshold = 12 - metabolization_rate = 0.5 + metabolization_rate = 2.5 + overdose_threshold = 20 + addiction_threshold = 30 + addiction_stage1_end = 9999//Should never end. + var/mob/living/carbon/origin + var/mob/living/simple_animal/hostile/retaliate/ghost/G = null -/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! - name = "Astrogen" - id = "astral" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //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 - taste_description = "a salty and sticky substance." - overdose_threshold = 12 - metabolization_rate = 0.5 +/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! + switch(current_cycle) + if(1) + //var/mob/living/carbon/H = M + M.alpha = 255 + origin = M + if (G == null) + G = new(get_turf(M.loc)) + G.attacktext = "raises the hairs on the neck of" + G.response_harm = "disrupts the concentration of" + G.response_disarm = "wafts" + G.loot = null + G.maxHealth = 5 + G.health = 5 + G.melee_damage_lower = 0 + G.melee_damage_upper = 0 + G.deathmessage = "disappears as if it was never really there to begin with" + G.incorporeal_move = 1 + G.alpha = 25 + G.name = "[M]'s astral ghost" + M.mind.transfer_to(G) + ..() +/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) + G.mind.transfer_to(origin) + qdel(G) + ..() + +/datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) + origin.Sleeping(100, 0) + G.Sleeping(100, 0) + ..() + +//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body (cloning only..?). +/datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) + if(prob(50)) + M.alpha = M.alpha - 1 + switch(M.alpha) + if(245) + to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") + M.alpha = M.alpha - 1 + if(220) + to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") + M.alpha = M.alpha - 1 + if(180) + to_chat(M, "You're starting to get scared as more and more of your body and conciousness begins to fade.") + M.alpha = M.alpha - 1 + if(120) + to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") + M.alpha = M.alpha - 1 + if(100) + to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") + M.alpha = M.alpha - 1 + M.add_trait(TRAIT_NOCLONE) + if(80) + to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the coming oblivion of your self.") + M.alpha = M.alpha - 1 + if(45) + to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") + M.alpha = M.alpha - 1 + if(M.alpha <= 30) + to_chat(M, "Your body disperses from exisitance, as you become one with the universe.") + to_chat(M, "As your body disappears, your conciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable I will propose the idea that the player can retain living memories across lives if they die in this way only. + M.visible_message("[M] suddenly disappears, their body evaporatting from exisitance, freeing [M] from their mortal coil.") + qdel(M) + ..() /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 82c495b352..604faaffef 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -25,7 +25,7 @@ /datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) var/location = get_turf(holder.my_atom) - var/reagent/fermi/eigenstate/location_created = location + var/datum/reagent/fermi/eigenstate/location_created = location //serum /datum/chemical_reaction/SDGF From a491b981854a9cbe14f77101313144e7bf0ed509 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 16:49:26 +0100 Subject: [PATCH 20/40] Few tweaks to Astral. --- .../chemistry/reagents/fermi_reagents.dm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) 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 e9b154d934..285ec0f98f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -568,9 +568,9 @@ name = "Astrogen" id = "astral" description = "An opalescent murky liquid that is said to distort your soul from your being." - color = "#6600A4" // rgb: 96, 0, 255 - taste_description = "a salty and sticky substance." - metabolization_rate = 2.5 + color = "#A080H4" // rgb: , 0, 255 + taste_description = "velvety brambles " + metabolization_rate = 0 overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. @@ -595,9 +595,10 @@ G.melee_damage_upper = 0 G.deathmessage = "disappears as if it was never really there to begin with" G.incorporeal_move = 1 - G.alpha = 25 - G.name = "[M]'s astral ghost" + G.alpha = 35 + G.name = "[M]'s astral projection" M.mind.transfer_to(G) + holder.remove_reagent(src.id, current_cycle, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -606,11 +607,13 @@ ..() /datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) - origin.Sleeping(100, 0) - G.Sleeping(100, 0) + M.Sleeping(100, 0) + if(prob(25)) + to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") + G.forcemove(M.loc) ..() -//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body (cloning only..?). +//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) if(prob(50)) M.alpha = M.alpha - 1 From 81ad07aff33559b729c0e93532594398a33523ec Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 17:38:01 +0100 Subject: [PATCH 21/40] Astral final fixes --- .../chemistry/reagents/fermi_reagents.dm | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) 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 285ec0f98f..1dec95865b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -578,10 +578,11 @@ var/mob/living/simple_animal/hostile/retaliate/ghost/G = null /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! + M.alpha = 255//Reset addiction switch(current_cycle) - if(1) + if(1)//Require a minimum //var/mob/living/carbon/H = M - M.alpha = 255 + //M.alpha = 255 origin = M if (G == null) G = new(get_turf(M.loc)) @@ -604,13 +605,15 @@ /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) G.mind.transfer_to(origin) qdel(G) + if(overdose) + M.Sleeping(10*volume, 0) ..() /datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) - M.Sleeping(100, 0) - if(prob(25)) - to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") - G.forcemove(M.loc) + if (!G == null) + if(prob(70)) + to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") + do_teleport(G, M.loc) ..() //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. @@ -635,7 +638,7 @@ M.alpha = M.alpha - 1 M.add_trait(TRAIT_NOCLONE) if(80) - to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the coming oblivion of your self.") + to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the forthcoming oblivion.") M.alpha = M.alpha - 1 if(45) to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") @@ -656,7 +659,7 @@ alpha = 20 reduce viewrange? */ -/* + //Nanite removal //Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone @@ -665,16 +668,16 @@ reduce viewrange? description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." color = "#5a7267" // rgb: 90, 114, 103 overdose_threshold = 25 + var/component/nanites/nan /datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) - if(C./datum/component/nanites) + if(nan in C) regen_rate = -5.0 else return /datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) - if(C./datum/component/nanites) + if(nan in C) regen_rate = -7.5 else return -*/ From 8c17f6bbe935b9fc7bcc13435938301be4192791 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 18:41:20 +0100 Subject: [PATCH 22/40] yey new people --- .../chemistry/reagents/fermi_reagents.dm | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) 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 1dec95865b..8d3be59915 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -576,6 +576,8 @@ addiction_stage1_end = 9999//Should never end. var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null + var/ODing = FALSE + var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction @@ -605,11 +607,13 @@ /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) G.mind.transfer_to(origin) qdel(G) - if(overdose) - M.Sleeping(10*volume, 0) + if(ODing = TRUE) + M.Sleeping(10*Svol, 0) + ODing = FALSE ..() /datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) + ODing = TRUE if (!G == null) if(prob(70)) to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") @@ -628,7 +632,7 @@ to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") M.alpha = M.alpha - 1 if(180) - to_chat(M, "You're starting to get scared as more and more of your body and conciousness begins to fade.") + to_chat(M, "You're starting to get scared as more and more of your body and consciousness begins to fade.") M.alpha = M.alpha - 1 if(120) to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") @@ -644,9 +648,9 @@ to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") M.alpha = M.alpha - 1 if(M.alpha <= 30) - to_chat(M, "Your body disperses from exisitance, as you become one with the universe.") - to_chat(M, "As your body disappears, your conciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable I will propose the idea that the player can retain living memories across lives if they die in this way only. - M.visible_message("[M] suddenly disappears, their body evaporatting from exisitance, freeing [M] from their mortal coil.") + to_chat(M, "Your body disperses from existence, as you become one with the universe.") + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") qdel(M) ..() @@ -659,7 +663,7 @@ alpha = 20 reduce viewrange? */ - +/* //Nanite removal //Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone @@ -668,16 +672,17 @@ reduce viewrange? description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." color = "#5a7267" // rgb: 90, 114, 103 overdose_threshold = 25 - var/component/nanites/nan + v/component/nanites/nan /datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) - if(nan in C) - regen_rate = -5.0 - else + var/component/nanites/nane = C.GetComponent(/component/nanites) + if(isnull(nane)) return + nane.regen_rate = -5.0 /datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) - if(nan in C) - regen_rate = -7.5 - else + var/component/nanites/nane = C.GetComponent(/component/nanites) + if(isnull(nane)) return + nane.regen_rate = -7.5 +*/ From 1c910ba9fe31bf51badc1c26e16cd78367a51cc7 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 19:47:43 +0100 Subject: [PATCH 23/40] Minor fix to SDGF --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 8d3be59915..2b07526ae7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -306,17 +306,17 @@ switch(current_cycle) if(21) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - if(21 to 29) + if(22 to 29) M.nutrition = M.nutrition + (M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(30 to 49) + if(31 to 49) M.nutrition = M.nutrition + (M.nutrition/5) if(50) to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] 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. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - if(50 to 79) + if(51 to 79) M.nutrition = M.nutrition + (M.nutrition/2) if(80) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") @@ -622,7 +622,7 @@ //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(prob(50)) + if(prob(65)) M.alpha = M.alpha - 1 switch(M.alpha) if(245) From 00804b9f61b8645062b854db1a914a67806fa5b1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 29 Apr 2019 19:30:36 +0100 Subject: [PATCH 24/40] Breasts are still bust 2 new react vars New broken chems: Furranium Yeehaw --- .../chemistry/reagents/medicine_reagents.dm | 3 ++ code/modules/reagents/chemistry/recipes.dm | 3 ++ .../code/datums/status_effects/chems.dm | 19 +++++++ .../code/modules/arousal/organs/breasts.dm | 13 +++-- .../clothing/fermichemclothe/fermiclothes.dm | 16 ++++++ .../chemistry/reagents/fermi_reagents.dm | 52 ++++++++++++++++--- .../reagents/chemistry/recipes/fermi.dm | 33 ++++++------ 7 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 4e278d2ede..58926d0c69 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -60,6 +60,9 @@ M.SetSleeping(0, 0) M.jitteriness = 0 M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume = BLOOD_VOLUME_NORMAL + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.severity == DISEASE_SEVERITY_POSITIVE) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index f5f5eda104..59f4b4576c 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -35,6 +35,9 @@ var/FermiChem = FALSE //If the chemical uses the Fermichem reaction mechanics var/FermiExplode = FALSE //If the chemical explodes in a special way as a result of var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction + var/InverseChemVal = 0.3 + var/InverseChem = "toxin" + /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact) return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 61e7c7a90c..288a3ffd5b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -129,6 +129,25 @@ o.next_move_modifier = (round(P.length) - 11) ..() +/datum/status_effect/chem/OwO + id = "OwO" + +/datum/status_effect/chem/PElarger/tick(message) + if(copytext(message, 1, 2) != "*") + message = replacetext(message, "ne", "nye") + message = replacetext(message, "nu", "nyu") + message = replacetext(message, "na", "nya") + message = replacetext(message, "no", "nyo") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "th", "ff") + message = replacetext(message, "l", "w") + message = replacetext(message, "r", "w") + if(prob(20)) + message = replacetext(message, ".", "OwO.") + else if(prob(30)) + message = replacetext(message, ".", "uwu.") + message = lowertext(message) /*Doesn't work /datum/status_effect/chem/SDGF/candidates diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index ae4d05cc58..4095b32d29 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -7,8 +7,8 @@ slot = "breasts" w_class = 3 size = BREASTS_SIZE_DEF - var/cached_size = 3//for enlargement - var/prev_size = 3//For flavour texts + var/cached_size = null//for enlargement + var/prev_size = BREASTS_SIZE_DEF//For flavour texts var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) var/statuscheck = FALSE @@ -78,6 +78,9 @@ /obj/item/organ/genital/breasts/update_size()//wah //var/mob/living/carbon/human/o = owner //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") + if (cached_size == null) + prev_size = size + return message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") @@ -123,6 +126,6 @@ else if (cached_size == 16.2) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - icon_state = sanitize_text("breasts_[shape]_[size]") - owner.update_body() - update_icon() + //icon_state = sanitize_text("breasts_[shape]_[size]") + //owner.update_body() + //update_icon() diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm new file mode 100644 index 0000000000..80ae690ada --- /dev/null +++ b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm @@ -0,0 +1,16 @@ +//Fermiclothes! +//Clothes made from FermiChem + +/obj/item/clothing/head/hattip //Actually the M1 Helmet + name = "flak helmet" + con = 'icons/obj/clothing/hats.dmi' + icon_state = "top_hat" + desc = "A sythesized hat, you can't seem to take it off. And tips their hat." + +/obj/item/clothing/head/hattip/attack_hand(mob/user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(src == C.head) + M.emote("me",1,"tips their hat.",TRUE) + return + return ..() 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 2b07526ae7..56015b615d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -569,15 +569,15 @@ id = "astral" description = "An opalescent murky liquid that is said to distort your soul from your being." color = "#A080H4" // rgb: , 0, 255 - taste_description = "velvety brambles " - metabolization_rate = 0 + taste_description = "velvety brambles" + metabolization_rate = 0//Removal is exponential, see code overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null var/ODing = FALSE - var/Svol = volume + //var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction @@ -607,8 +607,8 @@ /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) G.mind.transfer_to(origin) qdel(G) - if(ODing = TRUE) - M.Sleeping(10*Svol, 0) + if(ODing == TRUE) + M.Sleeping(10*volume, 0) ODing = FALSE ..() @@ -651,10 +651,32 @@ to_chat(M, "Your body disperses from existence, as you become one with the universe.") to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") - qdel(M) + qdel(M) //Approx 60minutes till death from initial addiction ..() +/datum/reagent/fermi/mindControl + name = "Astrogen" + id = "astral" + description = "An opalescent murky liquid that is said to distort your soul from your being." + color = "#A080H4" // rgb: , 0, 255 + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" + metabolization_rate = 0 + overdose_threshold = 20 + addiction_threshold = 30 + addiction_stage1_end = 9999//Should never end. +/datum/reagent/fermi/furranium + name = "Furranium" + id = "furranium" + description = "OwO whats this?" + color = "#H04044" // rgb: , 0, 255 + taste_description = "dewicious degenyewacy" + +/datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) + M.apply_status_effect(/datum/status_effect/chem/OwO) + +/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) + M.remove_status_effect(/datum/status_effect/chem/OwO) /* /mob/living/simple_animal/hostile/retaliate/ghost incorporeal_move = 1 @@ -686,3 +708,21 @@ reduce viewrange? return nane.regen_rate = -7.5 */ + +/* + _________________________________________ +||Fermichem toxic / impure chems here. || +|| || +||_______________________________________|| +*/ + +/datum/reagent/fermi/SDGFTox + name = "Impure synthetic cells" + id = "SDGFtox" + description = "A chem that makes Fermis angry at you if you're reading this, how did you get this??." + color = "#A080H4" // rgb: , 0, 255 + taste_description = "Forbidden chemistry" //Check to make sure this doesn't proc taste when added to mobs + metabolization_rate = 1 //1u = 2clone damage (too much?) + +/datum/reagent/fermi/SDGFTox/on_mob_life(mob/living/M) + M.adjustCloneLoss(2, 0) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 604faaffef..af38b5fd8b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -35,21 +35,24 @@ 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 - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - 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 = 20 //Temperature change per 1u produced - HIonRelease = 0.01 //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 - ImpureChem = "toxin" //What chemical is produced with an inpure reaction + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 // Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + 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 = 20 // Temperature change per 1u produced + HIonRelease = 0.01 // 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 + ImpureChem = "SDGFTox" // What chemical is metabolised with an inpure reaction + InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal + /datum/chemical_reaction/BElarger From 55cb20ddc9e34a6034d4bba509f2759eeb2b8c49 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 29 Apr 2019 20:15:54 +0100 Subject: [PATCH 25/40] Small changes to SDGF. --- code/modules/reagents/chemistry/holder.dm | 3 - code/modules/reagents/chemistry/reagents.dm | 4 ++ .../chemistry/reagents/fermi_reagents.dm | 67 +++++++++---------- .../reagents/chemistry/recipes/fermi.dm | 8 ++- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index f68f51999f..c51c318e3e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -537,9 +537,6 @@ update_total() return reaction_occurred -/datum/reagents/proc/FermiExplode() - return - /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 1bf862bd5e..4a3579bf07 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -130,3 +130,7 @@ rs += "[R.name], [R.volume]" return rs.Join(" | ") + +//Handler for explosion reaction +/datum/reagents/proc/FermiExplode(turf/T, obj/O, mob/living/M, volume) + return 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 56015b615d..e07e8b04ae 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -47,15 +47,13 @@ var/teleBool = FALSE mob/living/carbon/purgeBody - - /* /datum/reagent/fermi/eigenstate/on_new() location_created = get_turf(loc) //Sets up coordinate of where it was created message_admins("Attempting to get creation location from init() [location_created]") //..() */ - +//Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) if(1) @@ -89,7 +87,7 @@ holder.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting ..() //loop function - +//Addiction /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. switch(src.addictCyc1) if(1) @@ -196,31 +194,12 @@ var/list/result = list() var/list/group = null var/pollStarted = FALSE + var/location_created //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting //var/mob/living/split_personality/owner //var/mob/living/carbon/SM -/* -/datum/reagent/fermi/SDGF/New() - candidates = 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. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll") -^^^breaks everything -*/ -/* -/datum/reagent/fermi/proc/sepPoll() - //var/list/procCandies = list() - //if (pollStarted == FALSE) - // procCandies = 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.") - sleep(300) - return procCandies -*/ - /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. - M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) - /datum/status_effect/chem/SDGF/candidates/candies = new /datum/status_effect/chem/SDGF/candidates - ///datum/status_effect/chem/SDGF/candidates/candies = M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) - //candies = pollGhostCandidates("Do you want to play as a clone of [M.name] 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. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll")*/ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone @@ -358,20 +337,33 @@ M.blood_volume += 100 if (M.nutrition < 1500) M.nutrition += 500 +//If the reaction explodes +/datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! + //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.name = "Living teratoma" + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi + to_chat(M, "The cells clump up into a horrifying tumour.") +//Fail state of SDGF /datum/reagent/fermi/SDZF name = "synthetic-derived zombie factor" id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 metabolization_rate = 0.25 * REAGENTS_METABOLISM + 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") 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.") + startHunger = M.nutrition if(21 to 29) + M.nutrition = M.nutrition + (M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") @@ -391,7 +383,7 @@ if(86) if (!holder.has_reagent("pen_acid"))//Counterplay is pent.) message_admins("Zombie spawned at [M.loc]") - M.nutrition -= 18500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE + M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") @@ -403,23 +395,26 @@ ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) - else + else//easier to deal with to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") + M.nutrition = startHunger - 500 + var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay + S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.name = "Living teratoma" + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi + //S.updateappearance(mutcolor_update=1) + holder.remove_reagent(src.id, 20) 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.nutrition -= 100 - var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") - S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - S.name = "Living teratoma" - S.real_name = "Living teratoma"//horrifying!! - S.rabid = 1//Make them an angery boi - //S.updateappearance(mutcolor_update=1) - holder.remove_reagent(src.id, 20) - M.adjustToxLoss(10, 0) - to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") + M.adjustToxLoss(1, 0) message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() + + to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") + + //breast englargement //Honestly the most requested chems //I'm not a very kinky person, sorry if it's not great diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index af38b5fd8b..a4dd17914a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -25,7 +25,8 @@ /datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) var/location = get_turf(holder.my_atom) - var/datum/reagent/fermi/eigenstate/location_created = location + var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list + E.location_created = location //serum /datum/chemical_reaction/SDGF @@ -53,7 +54,10 @@ InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal - +/datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) + var/location = get_turf(holder.my_atom) + var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list + E.location_created = location /datum/chemical_reaction/BElarger name = "" From 4bd2da202b2d2fffd323101a6711c5032b92b5cd Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 30 Apr 2019 01:02:01 +0100 Subject: [PATCH 26/40] Added OwO chem, Fixed asset growth Added new sprites --- code/modules/surgery/organs/tongue.dm | 24 +++ .../code/modules/arousal/organs/breasts.dm | 10 +- .../code/modules/arousal/organs/genitals.dm | 68 +++++++ .../code/modules/arousal/organs/penis.dm | 14 +- .../chemistry/reagents/fermi_reagents.dm | 176 ++++++++++++++---- .../icons/obj/genitals/breasts_onmob.dmi | Bin 1141 -> 1605 bytes 6 files changed, 249 insertions(+), 43 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index d5b2d16e67..e358e9ad43 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -196,3 +196,27 @@ /obj/item/organ/tongue/robot/get_spans() return ..() | SPAN_ROBOT + +//FermiChem +/obj/item/organ/tongue/OwO + name = "fluffy tongue" + desc = "OwO what's this?" + icon_state = "tonguenormal" + taste_sensitivity = 10 // extra sensitive and inquisitive uwu + +/obj/item/organ/tongue/OwO/TongueSpeech(var/message) + if(copytext(message, 1, 2) != "*") + message = replacetext(message, "ne", "nye") + message = replacetext(message, "nu", "nyu") + message = replacetext(message, "na", "nya") + message = replacetext(message, "no", "nyo") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "th", "ff") + message = replacetext(message, "l", "w") + message = replacetext(message, "r", "w") + if(prob(20)) + message = replacetext(message, ".", "OwO.") + else if(prob(30)) + message = replacetext(message, ".", "uwu.") + message = lowertext(message) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 4095b32d29..47c528072c 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -81,7 +81,7 @@ if (cached_size == null) prev_size = size return - message_admins("Breast size at start: [size], [cached_size], [owner]") + //message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") src.Remove(owner) @@ -116,7 +116,7 @@ size = "flat" if(isnum(prev_size)) prev_size = breast_sizes[prev_size] - message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") + //message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") else if (breast_values[size] < breast_values[prev_size]) @@ -129,3 +129,9 @@ //icon_state = sanitize_text("breasts_[shape]_[size]") //owner.update_body() //update_icon() + message_admins("attempting to update sprite") + var/mob/living/carbon/human/H = owner + H.update_genitals() + //owner.update_genitals() + //if(src.is_exposed()) + // update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index c10d444f07..aca3d9b964 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -348,3 +348,71 @@ for(var/L in relevant_layers) H.apply_overlay(L) +/* +/datum/species/proc/handle_breasts(mob/living/carbon/human/H) + //check for breasts first! + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) + return + + ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) Where did this come from? + //Variables: + var/size = B.size + var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) + var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[B.shape] + var/list/standing = list() + + if(!S || S.icon_state == "none") + return + for(var/layer in relevant_layers) + var/layertext = genitals_layertext(layer) + S = GLOB.breasts_shapes_list[B.shape] + + var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) + + //If breasts are hueg (larger than 5 only have one sprite atm) + if (size > 5) + genital_overlay.icon_state = "[B.slot]_pair_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! + else + genital_overlay.icon_state = "[B.slot]_[S.icon_state]_[size]_[B.aroused_state]_[layertext]" + + //center icon + if(S.center) + genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) + + //Check skin colour + if(use_skintones && H.dna.features["genitals_use_skintone"]) + genital_overlay.color = "#[skintone2hex(H.skin_tone)]" + else + switch(S.color_src) + if("cock_color") + genital_overlay.color = "#[H.dna.features["cock_color"]]" + if("breasts_color") + genital_overlay.color = "#[H.dna.features["breasts_color"]]" + if("vag_color") + genital_overlay.color = "#[H.dna.features["vag_color"]]" + if(MUTCOLORS) + if(fixed_mut_color) + genital_overlay.color = "#[fixed_mut_color]" + else + genital_overlay.color = "#[H.dna.features["mcolor"]]" + if(MUTCOLORS2) + if(fixed_mut_color2) + genital_overlay.color = "#[fixed_mut_color2]" + else + genital_overlay.color = "#[H.dna.features["mcolor2"]]" + if(MUTCOLORS3) + if(fixed_mut_color3) + genital_overlay.color = "#[fixed_mut_color3]" + else + genital_overlay.color = "#[H.dna.features["mcolor3"]]" + + standing += genital_overlay + //Standing..? + if(LAZYLEN(standing)) + H.overlays_standing[layer] = standing.Copy() + standing = list() + + for(var/L in relevant_layers) + H.apply_overlay(L) +*/ \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index c5ee246e9a..02f9792fa4 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -44,6 +44,13 @@ 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.") + 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) @@ -53,14 +60,17 @@ 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(size)] inch penis.") + 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)) - 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("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(size)] inch penis.") + 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("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(length)] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") //update_body() //P.update_icon() //Either of these don't work, why??? girth = (length * girth_ratio) + var/mob/living/carbon/human/H = owner + H.update_genitals() + //owner.update_genitals() /obj/item/organ/genital/penis/update_appearance() //var/mob/living/carbon/o = owner 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 e07e8b04ae..e0714af177 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -179,6 +179,42 @@ //eigenstate END +/*SDGF +//////////////////////////////////////////////////// +// synthetic-derived growth factor // +////////////////////////////////////////////////// +WHAT IT DOES + +Several outcomes are possible (in priority order): + +Before the chem is even created, there is a risk of the reaction "exploding", which produces an angry teratoma that attacks the player. +0. Before the chem is activated, the purity is checked, if the purity of the reagent is less than 0.5, then sythetic-derived zombie factor is metabolised instead + 0.1 If SDZF is injected, the chem appears to act the same as normal, with nutrition gain, until the end, where it becomes toxic instead, giving a short window of warning to the player + 0.1.2 If the player can take pent in time, the player will spawn a hostile teratoma on them (less damaging), if they don't, then a zombie is spawned instead, with a small defence increase propotional to the volume + 0.2 If the purity is above 0.5, then the remaining impure volume created SDGFtox instead, which reduces blood volume and causes clone damage +1.Normal function creates a (another)player controlled clone of the player, which is spawned nude, with damage to the clone + 1.1 The remaining volume is transferred to the clone, which heals it over time, thus the player has to make a substantial ammount of the chem in order to produce a healthy clone + 1.2 If the player is infected with a zombie tumor, the tumor is transferred to the ghost controlled clone ONLY. +2. If no player can be found, a brainless clone is created over a long period of time, this body has no controller. + 2.1 If the player dies with a clone, then they play as the clone instead. However no memories are retained after splitting. +3. If there is already a clone, then SDGF heals clone, fire and brute damage slowly. This shouldn't normalise this chem as the de facto clone healing chem, as it will always try to make a ghost clone, and then a brainless clone first. +4. If there is insuffient volume to complete the cloning process, there are two outcomes + 4.1 At lower volumes, the players nutrition and blood is refunded, with light healing + 4.2 At higher volumes a stronger heal is applied to the user + +IMPORTANT FACTORS TO CONSIDER WHILE BALANCING +1. The most important factor is the required volume, this is easily edited with the metabolism rate, this chem is HARD TO MAKE, You need to make a lot of it and it's a substantial effort on the players part. There is also a substantial risk; you could spawn a hotile teratoma during the reation, you could damage yourself with clone damage, you could accidentally spawn a zombie... Basically, you've a good chance of killing yourself. + 1.1 Additionally, if you're trying to make SDZF purposely, you've no idea if you have or not, and that reaction is even harder to do. Plus, the player has a huge time window to get to medical to deal with it. If you take pent while it's in you, it'll be removed before it can spawn, and only spawns a teratoma if it's late stage. +2. The rate in which the clone is made, This thing takes time to produce fruits, it slows you down and makes you useless in combat/working. Basically you can't do anything during it. It will only get you killed if you use it in combat, If you do use it and you spawn a player clone, they're gimped for a long time, as they have to heal off the clone damage. +3. The healing - it's pretty low and a cyropod is more Useful +4. If you're an antag, you've a 50% chance of making a clone that will help you with your efforts, and you've no idea if they will or not. While clones can't directly harm you and care for you, they can hinder your efforts. +5. If people are being arses when they're a clone, slap them for it, they are told to NOT bugger around with someone else character, if it gets bad I'll add a blacklist, or do a check to see if you've played X amount of hours. + 5.1 Another solution I'm okay with is to rename the clone to [M]'s clone, so it's obvious, this obviously ruins anyone trying to clone themselves to get an alibi however. I'd prefer this to not be the case. + 5.2 Additionally, this chem is a soft buff to changelings, which apparently need a buff! + 5.3 Other similar things exist though; impostors, split personalites, abductors, ect. +6. Giving this to someone without concent is against space law and gets you sent to gulag. +*/ + //Clone serum #chemClone /datum/reagent/fermi/SDGF //vars, mostly only care about keeping track if there's a player in the clone or not. name = "synthetic-derived growth factor" @@ -195,16 +231,19 @@ var/list/group = null var/pollStarted = FALSE var/location_created + var/startHunger //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting //var/mob/living/split_personality/owner //var/mob/living/carbon/SM +//Main SDGF chemical /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) if(1) + startHunger = M.nutrition if(pollStarted == FALSE) 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.") @@ -233,10 +272,10 @@ //var/typepath = owner.type //clone = new typepath(owner.loc) var/typepath = M.type - var/mob/living/carbon/fermi_Gclone = new typepath(M.loc) + var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) //var/mob/living/carbon/SM = owner //var/mob/living/carbon/M = M - var/mob/living/carbon/SM = fermi_Gclone + var/mob/living/carbon/human/SM = fermi_Gclone if(istype(SM) && istype(M)) SM.real_name = M.real_name M.dna.transfer_identity(SM) @@ -245,6 +284,7 @@ SM.key = C.key SM.mind.enslave_mind_to_creator(M) + //If they're a zombie, they can try to negate it with this. if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost. var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) ZI.Remove(M) @@ -257,18 +297,29 @@ M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) playerClone = TRUE - M.next_move_modifier = 1 - M.nutrition = 150 - - reaction_mob(SM, ) + M.nutrition -= 500 + //reaction_mob(SM, )I forget what this is for + //Damage the clone + SM.blood_volume = BLOOD_VOLUME_NORMAL/2 + SM.adjustCloneLoss(80, 0) + SM.setBrainLoss(20) + SM.nutrition = startHunger/2 + var/datum/reagents/SMR = SM + ///datum/reagents + //var/mob/living/carbon/human has a holder, carbon does not + // You need to add to a holder. + // reagentS not reagent (?) + //SM.create_reagents() + SMR = locate(/datum/reagents) in SM + SMR.add_reagent("SDGFheal", volume) holder.remove_reagent(src.id, 999) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) //qdel(src) - else //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). + else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). message_admins("Failed to find clone Candidate") src.unitCheck = TRUE if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. @@ -331,13 +382,15 @@ M.nutrition += 250 else if (src.unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. src.unitCheck = FALSE - to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system instead. you can fee") + to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") M.adjustBruteLoss(-10, 0) M.adjustFireLoss(-10, 0) M.blood_volume += 100 + M.next_move_modifier = 1 if (M.nutrition < 1500) M.nutrition += 500 //If the reaction explodes +/* /datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! //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 @@ -345,11 +398,36 @@ S.name = "Living teratoma" S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi - to_chat(M, "The cells clump up into a horrifying tumour.") + to_chat("The cells clump up into a horrifying tumour.") +*/ + +//Unobtainable, used in clone spawn. +/datum/reagent/fermi/SDGFheal + name = "synthetic-derived growth factor" + id = "SDGFheal" + metabolization_rate = 1 + +/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume += 10 + M.adjustCloneLoss(-2.5, 0) + M.setBrainLoss(-1) + M.nutrition += 10 + +//Unobtainable, used if SDGF is impure but not too impure +/datum/reagent/fermi/SDGFtox + name = "synthetic-derived growth factor" + id = "SDGFtox" + description = "A chem that makes Fermis angry at you if you're reading this, how did you get this???" + metabolization_rate = 1 + +/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting - the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) + M.blood_volume -= 10 + M.adjustCloneLoss(2, 0) //Fail state of SDGF /datum/reagent/fermi/SDZF - name = "synthetic-derived zombie factor" + name = "synthetic-derived growth factor" id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 @@ -363,7 +441,6 @@ to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") startHunger = M.nutrition if(21 to 29) - M.nutrition = M.nutrition + (M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") @@ -393,10 +470,12 @@ ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name + ZI.desc = "[M]'s clone, gone horribly wrong." + ZI.zombiejob = null //ZI.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) else//easier to deal with - to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") + to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") M.nutrition = startHunger - 500 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -430,11 +509,7 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size - /* - switch(current_cycle) - if(0) - */ - + var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. message_admins("No breasts found!") @@ -457,10 +532,11 @@ message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 if (B.cached_size >= 8.5 && B.cached_size < 9) - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.apply_damage(2, BRUTE, target) + if(H.w_uniform || H.wear_suit) + var/target = M.get_bodypart(BODY_ZONE_CHEST) + to_chat(M, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.apply_damage(2, BRUTE, target) B.update() ..() @@ -511,6 +587,7 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size + var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) message_admins("No penis found!")//They do have a preponderance for escapism, or so I've heard. @@ -526,9 +603,10 @@ P.cached_length = P.cached_length + 0.1 if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.apply_damage(5, BRUTE, target) + 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!") + M.apply_damage(5, BRUTE, target) P.update() ..() @@ -558,7 +636,6 @@ T = nT ..() - /datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! name = "Astrogen" id = "astral" @@ -668,10 +745,42 @@ taste_description = "dewicious degenyewacy" /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) - M.apply_status_effect(/datum/status_effect/chem/OwO) -/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) - M.remove_status_effect(/datum/status_effect/chem/OwO) + switch(current_cycle) + if(1 to 9) + if(prob(20)) + to_chat(M, "Your tongue feels... fluffy") + if(10 to 20) + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to meow!") + M.emote("nya") + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to howl!") + M.emote("awoo") + if(prob(20)) + var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + to_chat(M, "You notice [victim]'s bulge, OwO!") + if(21) + message_admins("holder define: [holder]") + var/obj/item/organ/tongue/T = M.getorganslot(BODY_ZONE_PRECISE_MOUTH) + var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO + T.Remove(M) + nT.Insert(M) + qdel(T) + if(22 to INFINITY) + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to meow!") + M.emote("nya") + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to howl!") + M.emote("awoo") + if(prob(20)) + var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + to_chat(M, "You notice [victim]'s bulge, OwO!") + ..() + /* /mob/living/simple_animal/hostile/retaliate/ghost incorporeal_move = 1 @@ -710,14 +819,3 @@ reduce viewrange? || || ||_______________________________________|| */ - -/datum/reagent/fermi/SDGFTox - name = "Impure synthetic cells" - id = "SDGFtox" - description = "A chem that makes Fermis angry at you if you're reading this, how did you get this??." - color = "#A080H4" // rgb: , 0, 255 - taste_description = "Forbidden chemistry" //Check to make sure this doesn't proc taste when added to mobs - metabolization_rate = 1 //1u = 2clone damage (too much?) - -/datum/reagent/fermi/SDGFTox/on_mob_life(mob/living/M) - M.adjustCloneLoss(2, 0) diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index 5be42c8e7eba00fa9b7a8df2e1b4be958ee3f498..b2496f1fc1c3b9181ef7866ec23dedbd10c29ce1 100644 GIT binary patch literal 1605 zcmYjRdr*>D6o*J#L!ZCUB$O%CStjpJxH=r3scez1Ozk``#@kZ`(y9Soio2P=lt&d-E+^$+8yX?v2gi9 z7z}3Nw;jJ127@zZ_k4uW6DldYY&5pJ1A=`FFoQrK7#|-u7!2Lr-CQoWuCC7LocN6U z*%$*S?+pxs;Y9CajX+2V4kP1_BpynLJ4KEo#lv7Jtdi?q$S0V^7sMh$X7aL%s*NQf z9%0@e{RNSEj^DhOPAdDQPQ$WfSI^W`#iG3D#e&{!r|HJ#YbYA$S!3iY(VEnnocNPB zkXPLf%7!1A?eSUuvO#r!i@AJfEh)r<@GrXI-G$+u>azpSRg z&R&i&(AUp~P-3e)Kf*y`R$1R`c9EHK=kNe@hgHu@Yfn5=T z9afzai}jUA&$n}--;9f0>gDJ5do4%EUkmU)v&arD?p(7e zPvd*hD0k4xTu(l>wX1}!yfxxqI2`}!g)UAhl8V5yNZwfYGY+FkuhqP$BqZnv)Jcze zIQph(P%8W`HRA|-N*A5vkuO_Yx`x-)rlL4P^Az)RMS~jOYC}*J*H&@uMyxZCjh+oolM< z4+udaY`Y%(5me$G0(}uKXX4A6fQqlCn;%Qn&Niiy=4_3M!D!K_cz-o z-(&O3TQfer{N>8B#phim$2cqxoU+xz!~7&4K(O@ zH_PQNQZ^s3FWiHU`WUd)#k!O{pl<31(IHB5zD%yvK6N@1HN4{U#`cHj*UNUDi9UHr zqqWZFX#|z|d*iQ7isdG5Iw)_d)8oomltM`$@^g6!b<`~6#V3f3~D-yo&))$?k@z*k}qQ=r@a$1|)Nm_4V=P(%kZC#gyNWWwA zUOS`~gXi|mEax4nO}AtL+r~CGN0|koK5Rd4k@CF5M2#>d6-1c*(<|qr>kR&=|KRjpv7u1_7^-_T5S`s?jFm-T4b^OtZid^`rc)VSP`V7W z^9lz0^j0d6>-aq@(49o(gNJ#o3IM#atS6~o3(5$K6)LkoV?O9+zG1DV1B^Exm3j;T zAjTyou#r{_S*(LHTQhb*_zs=!Kr?>>uVhpC4xpP%r(*bzZ>6sb2yEWcW= z0Np{`F;!Oa>kQhQ(wTx$K7Ex&^;-oOD;%HDYP2c~QjuCud&@_?8w5!+5L~00Q)J%> zw&~i+DUBE+Q{(;EcYu!P+#m&#)TKf}QQd?DQd6-UvcKX{>|VR}a}9HGVTr zsD#!Y&bWg*CR24iTTrz#i?(V%00001bW%=J06^y0W&i*HvU*flbVOxyV{&P5 zbZKvH004NLos&Ng!XOYwXZRGP-A${mE={X4h>3A0P_Bi+KLMg&-&SX1{B3u`yO%dy zDVlC4m1qx=KPaYfyNZoiFDlNS!DT-!t0iZi!szp7N!etY#==H2DJOk5A!?&5y*(Y( zx!}x&nC2^-4bfa^p6jnzjbIkDShl&oSBH6lUdxe=oaUM zMb45koI!;D{}VRZQkWjJCrwbw-S-ut49QDIj;|U}3IG5AK0)VoyHq|f^~2H~C8Hmn z%(cC@NXWsq`MYUirnmMhy082E1>>Lg-g8Qiw#@hR?RY?5xmR7Xz+?1=9Ziq6&CgUX zPNFDUMFX8eKx00000007|I z3-0Z``$U$`_D{{^Mg=Kh7!?Mmsvt)*yd=Jz6Ov$#m**8vc~PzF=q)dNb3H4gYIdfpNd@hm)Jcc;|zx3l_9b>KKz&4^Lk5 z7Uk0$|9sHlf}x>((!x~vY0BNO&I{h6Trd6eLH2@ZpR_RPvf9`MRe3>6*JwT{J}fAu zebTn9^3~?a3*Mnd^Fc3%ojL83qKBo5%DE^1`^+5_*C*BGmtBCpoB#5OCIA2c0002^ zPJu(@`Zz~St)H7cs)%`{LoUOiIz39P;&204kYq!RF za^`MlNBf-UVg7ex4L8}_pS{VNIq@8t6ijOO?w Date: Tue, 30 Apr 2019 05:43:49 +0100 Subject: [PATCH 27/40] Everything fixed. BE largement (probably) fully functional PE I think has issues ripping clothes? --- code/modules/surgery/organs/tongue.dm | 9 ++-- .../code/datums/status_effects/chems.dm | 17 ++++-- .../code/modules/arousal/organs/breasts.dm | 22 +++----- .../code/modules/arousal/organs/genitals.dm | 23 ++++---- .../code/modules/arousal/organs/penis.dm | 8 +-- .../chemistry/reagents/fermi_reagents.dm | 53 +++++++++---------- 6 files changed, 67 insertions(+), 65 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index e358e9ad43..13160479b4 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -212,11 +212,12 @@ message = replacetext(message, "no", "nyo") message = replacetext(message, "ove", "uv") message = replacetext(message, "ove", "uv") - message = replacetext(message, "th", "ff") + //message = replacetext(message, "th", "ff") //too incoherent in practice message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") if(prob(20)) - message = replacetext(message, ".", "OwO.") + message += "OwO" else if(prob(30)) - message = replacetext(message, ".", "uwu.") - message = lowertext(message) + message += "uwu" + message = lowertext(message) + return message diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 288a3ffd5b..40aae850d2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -23,7 +23,7 @@ /datum/status_effect/chem/SGDF/tick() //message_admins("SDGF ticking") if(owner.stat == DEAD) - message_admins("SGDF status swapping") + //message_admins("SGDF status swapping") if(fermi_Clone && fermi_Clone.stat != DEAD) if(owner.mind) owner.mind.transfer_to(fermi_Clone) @@ -49,8 +49,12 @@ o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) //message_admins("BElarge started!") - o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + + if(o.w_uniform || o.wear_suit) + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") + else + to_chat(o, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge @@ -101,8 +105,11 @@ if(W == o.w_uniform || W == o.wear_suit) o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") - to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + if(o.w_uniform || o.wear_suit) + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") + else + to_chat(o, "Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.") return ..() diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 47c528072c..e32c9987d3 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -8,9 +8,9 @@ w_class = 3 size = BREASTS_SIZE_DEF var/cached_size = null//for enlargement - var/prev_size = BREASTS_SIZE_DEF//For flavour texts - var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") - var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) + var/prev_size //For flavour texts + var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") + var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) var/statuscheck = FALSE fluid_id = "milk" var/amount = 2 @@ -119,19 +119,13 @@ //message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + var/mob/living/carbon/human/H = owner + H.Force_update_genitals() else if (breast_values[size] < breast_values[prev_size]) to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") + var/mob/living/carbon/human/H = owner + H.Force_update_genitals() prev_size = size else if (cached_size == 16.2) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - - //icon_state = sanitize_text("breasts_[shape]_[size]") - //owner.update_body() - //update_icon() - message_admins("attempting to update sprite") - var/mob/living/carbon/human/H = owner - H.update_genitals() - //owner.update_genitals() - //if(src.is_exposed()) - // update_icon() + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom.")// taking both of your hands to hold!.") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index aca3d9b964..a3ffcf3698 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -267,7 +267,13 @@ if(src && !QDELETED(src)) dna.species.handle_genitals(src) +/mob/living/carbon/human/proc/Force_update_genitals() + dna.species.handle_genitals(src) + //dna.species.handle_breasts(src) + + /datum/species/proc/handle_genitals(mob/living/carbon/human/H) + 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 @@ -276,15 +282,12 @@ return if(H.has_trait(TRAIT_HUSK)) return - var/list/genitals_to_add = list() var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) var/list/standing = list() var/size = null - for(var/L in relevant_layers) //Less hardcode H.remove_overlay(L) - //start scanning for genitals //var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again for(var/obj/item/organ/O in H.internal_organs) @@ -293,7 +296,6 @@ if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes genitals_to_add += H.getorganslot(G.slot) //Now we added all genitals that aren't internal and should be rendered - //start applying overlays for(var/layer in relevant_layers) var/layertext = genitals_layertext(layer) @@ -351,10 +353,11 @@ /* /datum/species/proc/handle_breasts(mob/living/carbon/human/H) //check for breasts first! - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + + var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) return - + message_admins("attempting to update sprite in a hacky way") ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) Where did this come from? //Variables: var/size = B.size @@ -372,7 +375,7 @@ //If breasts are hueg (larger than 5 only have one sprite atm) if (size > 5) - genital_overlay.icon_state = "[B.slot]_pair_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! + genital_overlay.icon_state = "[B.slot]_[B.shape]_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! else genital_overlay.icon_state = "[B.slot]_[S.icon_state]_[size]_[B.aroused_state]_[layertext]" @@ -385,10 +388,6 @@ genital_overlay.color = "#[skintone2hex(H.skin_tone)]" else switch(S.color_src) - if("cock_color") - genital_overlay.color = "#[H.dna.features["cock_color"]]" - if("breasts_color") - genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" if(MUTCOLORS) @@ -415,4 +414,4 @@ for(var/L in relevant_layers) H.apply_overlay(L) -*/ \ No newline at end of file +*/ diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 02f9792fa4..4dfef831b6 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -68,10 +68,12 @@ //update_body() //P.update_icon() //Either of these don't work, why??? girth = (length * girth_ratio) - var/mob/living/carbon/human/H = owner - H.update_genitals() + //var/mob/living/carbon/human/H = owner + //H.update_genitals() //owner.update_genitals() + //I have no idea on how to update sprites and I hate it + /obj/item/organ/genital/penis/update_appearance() //var/mob/living/carbon/o = owner var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" @@ -85,7 +87,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - owner.update_body() + //owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) 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 e0714af177..553f8aa6b2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -247,23 +247,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(pollStarted == FALSE) 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.") - - - /* - for(var/mob/dead/observer/G in GLOB.player_list) - group += G - for(var/m in group) - var/mob/W = m - message_admins("Attempting to poll") - showCandidatePollWindow(M, 190, "Do you want to play as a clone of [M.name] 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.", result, null, current_cycle, TRUE) - if(19) - for(var/mob/W in result) - if(!W.key || !W.client) - result -= W - candies = result - */ - - if(20 to INFINITY) 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! @@ -303,17 +286,23 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Damage the clone SM.blood_volume = BLOOD_VOLUME_NORMAL/2 SM.adjustCloneLoss(80, 0) - SM.setBrainLoss(20) + SM.setBrainLoss(40) SM.nutrition = startHunger/2 - var/datum/reagents/SMR = SM + //var/datum/reagents/SMR = SM ///datum/reagents //var/mob/living/carbon/human has a holder, carbon does not // You need to add to a holder. // reagentS not reagent (?) //SM.create_reagents() - SMR = locate(/datum/reagents) in SM - SMR.add_reagent("SDGFheal", volume) + + //Really hacky way to deal with this stupid problem I have + SM.reagents.add_reagent("SDGFheal", volume) + //holder.add_reagent("SDGFheal", volume) holder.remove_reagent(src.id, 999) + //SMR = locate(/datum/reagents in SM) + //holder.trans_to(SMR, volume) + + return //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -410,7 +399,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) if(M.blood_volume < BLOOD_VOLUME_NORMAL) M.blood_volume += 10 - M.adjustCloneLoss(-2.5, 0) + M.adjustCloneLoss(-2, 0) M.setBrainLoss(-1) M.nutrition += 10 @@ -424,6 +413,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting - the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) M.blood_volume -= 10 M.adjustCloneLoss(2, 0) + ..() //Fail state of SDGF /datum/reagent/fermi/SDZF @@ -508,6 +498,16 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING metabolization_rate = 0.5 var/mob/living/carbon/human/H +/datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") + if(!B) + return + var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) + B.prev_size = B.size + B.cached_size = [sizeConv[B.size]] + message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") + /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") @@ -529,7 +529,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.reagents.remove_reagent(src.id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size], [B.cached_size], [holder]") + //message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 if (B.cached_size >= 8.5 && B.cached_size < 9) if(H.w_uniform || H.wear_suit) @@ -553,7 +553,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(P) P.length = P.length - 0.1 - message_admins("Breast size: [P.size], [P.cached_length], [holder]") + message_admins("lewdsnek size: [P.size], [P.cached_length], [holder]") P.update() if(T) T.Remove(M) @@ -760,10 +760,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - to_chat(M, "You notice [victim]'s bulge, OwO!") + to_chat(M, "You notice [victim]'s bulge [pick("OwO!", "UwU!")]") if(21) - message_admins("holder define: [holder]") - var/obj/item/organ/tongue/T = M.getorganslot(BODY_ZONE_PRECISE_MOUTH) + var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO T.Remove(M) nT.Insert(M) From e70eac8f53faca5cba40fc6a66534f323ac98a6f Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 2 May 2019 08:44:06 +0100 Subject: [PATCH 28/40] Futher fixes and for some reason something broke arrrghhh. --- code/modules/surgery/organs/tongue.dm | 4 +- .../code/datums/status_effects/chems.dm | 4 ++ .../chemistry/reagents/fermi_reagents.dm | 47 ++++++++++--------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 13160479b4..3e202acf41 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -216,8 +216,8 @@ message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") if(prob(20)) - message += "OwO" + message += " OwO" else if(prob(30)) - message += "uwu" + message += " uwu" message = lowertext(message) return message diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 40aae850d2..df51df8ead 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -60,6 +60,10 @@ /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") + if(!B) + o.remove_movespeed_modifier("megamilk") + o.next_move_modifier = 1 + owner.remove_status_effect(src) var/items = o.get_contents() for(var/obj/item/W in items) if(W == o.w_uniform || W == o.wear_suit) 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 553f8aa6b2..0541d6ce71 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -56,7 +56,7 @@ //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) - if(1) + if(0) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) @@ -99,7 +99,7 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) switch(src.addictCyc2) - if(1) + if(0) to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") M.Jitter(50) M.Knockdown(100) @@ -163,7 +163,7 @@ M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) for (var/datum/mood_event/i in M) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i) //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) @@ -172,7 +172,7 @@ src.addictCyc4++ ..() - . = 1 + //. = 1 ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return @@ -223,7 +223,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING color = "#60A584" // rgb: 96, 0, 255 var/playerClone = FALSE var/unitCheck = FALSE - metabolization_rate = 0.25 * REAGENTS_METABOLISM + metabolization_rate = 0.5 * REAGENTS_METABOLISM //var/datum/status_effect/chem/SDGF/candidates/candies var/list/candies = list() //var/polling = FALSE @@ -421,7 +421,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 - metabolization_rate = 0.25 * REAGENTS_METABOLISM + metabolization_rate = 0.5 * REAGENTS_METABOLISM 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. @@ -474,16 +474,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.rabid = 1//Make them an angery boi //S.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) + 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") ..() - - - to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") - - //breast englargement //Honestly the most requested chems //I'm not a very kinky person, sorry if it's not great @@ -654,7 +650,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction switch(current_cycle) - if(1)//Require a minimum + if(0)//Require a minimum //var/mob/living/carbon/H = M //M.alpha = 255 origin = M @@ -684,7 +680,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ODing = FALSE ..() -/datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) +/datum/reagent/fermi/astral/overdose_process(mob/living/carbon/M) ODing = TRUE if (!G == null) if(prob(70)) @@ -719,16 +715,16 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(45) to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") M.alpha = M.alpha - 1 - if(M.alpha <= 30) - to_chat(M, "Your body disperses from existence, as you become one with the universe.") - to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. - M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") - qdel(M) //Approx 60minutes till death from initial addiction + if(0 to 30) + to_chat(M, "Your body disperses from existence, as you become one with the universe.") + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") + qdel(M) //Approx 60minutes till death from initial addiction ..() /datum/reagent/fermi/mindControl name = "Astrogen" - id = "astral" + id = "" description = "An opalescent murky liquid that is said to distort your soul from your being." color = "#A080H4" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" @@ -736,6 +732,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. + creatorID = //add here + +//Requires player to be within vicinity of creator +//bonuses to mood +//gives creator a silver(velvet?) tongue +//Addiction is applied when creator is out of viewer +// /datum/reagent/fermi/furranium name = "Furranium" @@ -759,8 +762,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.emote("awoo") if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - to_chat(M, "You notice [victim]'s bulge [pick("OwO!", "UwU!")]") + //for(var/victim in seen) + to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") if(21) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO @@ -777,7 +780,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - to_chat(M, "You notice [victim]'s bulge, OwO!") + to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") ..() /* From f92995bc13eb253a156aad099e3a2259c35614e4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 2 May 2019 11:34:42 +0100 Subject: [PATCH 29/40] Mid MC --- .../reagents/chemistry/recipes/others.dm | 10 +++++ .../code/datums/status_effects/chems.dm | 42 ++++++++++++++++++- .../chemistry/reagents/fermi_reagents.dm | 28 +++++++++---- .../reagents/chemistry/recipes/fermi.dm | 32 ++++++++++++++ 4 files changed, 104 insertions(+), 8 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index bcd08b1853..e34f34675c 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -528,6 +528,16 @@ /datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life") // Lol. +//This is missing, I'm adding it back (see tgwiki). Not sure why we don't have it. +/datum/chemical_reaction/life_friendly + name = "Life (Friendly)" + id = "life_friendly" + required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "sugar" = 1) + required_temp = 374 + +/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, created_volume) + chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) //Pray for cute cats + /datum/chemical_reaction/corgium name = "corgium" id = "corgium" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index df51df8ead..54fbea8ba1 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -120,6 +120,10 @@ /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") + if(!P) + o.remove_movespeed_modifier("hugedick") + o.next_move_modifier = 1 + owner.remove_status_effect(src) message_admins("PElarge tick!") var/items = o.get_contents() for(var/obj/item/W in items) @@ -140,6 +144,42 @@ o.next_move_modifier = (round(P.length) - 11) ..() + +/*////////////////////////////////////////// + Mind control functions +/////////////////////////////////////////// +*/ + +/datum/status_effect/chem/enthral + id = "enthral" + var/mob/living/E //E for enchanter + //var/mob/living/V = list() //V for victims + var/resistance = 0 + var/phase = 0 + var/enthralID + +/datum/status_effect/chem/enthra/on_apply(mob/living/carbon/M) + if(M.ID == ) + + +/datum/status_effect/chem/enthral/tick(mob/living/carbon/M) + redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) + switch(phase) + if(0) + return + if(1) + + + + +/datum/status_effect/chem/enthral/proc/owner_resist(mob/living/carbon/M) + to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") + if (M.canbearoused) + resistance += ((100 - M.arousalloss/100)/100) + else + resistance += 0.2 + +/* /datum/status_effect/chem/OwO id = "OwO" @@ -159,7 +199,7 @@ else if(prob(30)) message = replacetext(message, ".", "uwu.") message = lowertext(message) - +*/ /*Doesn't work /datum/status_effect/chem/SDGF/candidates id = "SGDFCandi" 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 0541d6ce71..b296bd293a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -211,7 +211,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING 5. If people are being arses when they're a clone, slap them for it, they are told to NOT bugger around with someone else character, if it gets bad I'll add a blacklist, or do a check to see if you've played X amount of hours. 5.1 Another solution I'm okay with is to rename the clone to [M]'s clone, so it's obvious, this obviously ruins anyone trying to clone themselves to get an alibi however. I'd prefer this to not be the case. 5.2 Additionally, this chem is a soft buff to changelings, which apparently need a buff! - 5.3 Other similar things exist though; impostors, split personalites, abductors, ect. + 5.3 Other similar things exist already though in the codebase; impostors, split personalites, abductors, ect. 6. Giving this to someone without concent is against space law and gets you sent to gulag. */ @@ -268,6 +268,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING SM.mind.enslave_mind_to_creator(M) //If they're a zombie, they can try to negate it with this. + //I seriously wonder if anyone will ever use this function. if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost. var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) ZI.Remove(M) @@ -402,6 +403,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustCloneLoss(-2, 0) M.setBrainLoss(-1) M.nutrition += 10 + ..() //Unobtainable, used if SDGF is impure but not too impure /datum/reagent/fermi/SDGFtox @@ -410,7 +412,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING description = "A chem that makes Fermis angry at you if you're reading this, how did you get this???" metabolization_rate = 1 -/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting - the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) +/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) M.blood_volume -= 10 M.adjustCloneLoss(2, 0) ..() @@ -722,17 +724,27 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING qdel(M) //Approx 60minutes till death from initial addiction ..() -/datum/reagent/fermi/mindControl - name = "Astrogen" - id = "" - description = "An opalescent murky liquid that is said to distort your soul from your being." +/datum/reagent/fermi/enthral + name = "Need a name" + id = "enthral" + 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 overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. - creatorID = //add here + var/creatorID //add here + +/datum/reagent/fermi/enthral/on_mob_life(mob/living/carbon/M) + if(!creatorID) + CRASH("Something went wrong in enthral creation") + if(M.ID == creatorID) + var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/silver + T.Remove(M) + nT.Insert(M) + qdel(T) //Requires player to be within vicinity of creator //bonuses to mood @@ -740,6 +752,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Addiction is applied when creator is out of viewer // +/////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/reagent/fermi/furranium name = "Furranium" id = "furranium" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a4dd17914a..23ad696d46 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -101,3 +101,35 @@ FermiChem = TRUE FermiExplode = FALSE ImpureChem = "carpotoxin" + +/datum/chemical_reaction/enthral + name = "need a name" + id = "enthral" + results = list("enthral" = 3) + 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 + ExplodeTemp = 550 // Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + 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 = 20 // Temperature change per 1u produced + HIonRelease = 0.01 // 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 + //ImpureChem = "SDGFTox" // What chemical is metabolised with an inpure reaction + //InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + //InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal + + +/datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + var/enthralID = B.get_blood_id() + var/datum/reagent/fermi/enthral/E = locate(/datum/reagent/fermi/enthral) in holder.reagent_list + E.enthralID = enthralID From bca578ab2c2183240f33c81a2a76dd019a151b75 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 3 May 2019 03:02:37 +0100 Subject: [PATCH 30/40] About 1/6th done of MC base code --- code/modules/surgery/organs/vocal_cords.dm | 594 ++++++++++++++++++ .../code/datums/mood_events/chem_events.dm | 18 + .../code/datums/status_effects/chems.dm | 9 +- .../chemistry/reagents/fermi_reagents.dm | 3 +- 4 files changed, 619 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 55ead3b5b4..c6c40de31a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -2,6 +2,10 @@ #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" @@ -608,6 +612,596 @@ return cooldown +////////////////////////////////////// +///////ENTHRAL SILVER TONGUE////////// +////////////////////////////////////// + +//Heavily modified voice of god code +/obj/item/organ/vocal_cords/velvet + name = "velvet chords" + desc = "The voice spoken from these just make you want to drift off, sleep and obey." + icon_state = "voice_of_god" + actions_types = list(/datum/action/item_action/organ_action/colossus) + var/next_command = 0 + var/cooldown_mod = 1 + var/base_multiplier = 1 + //spans = list("say","yell") + +/* +/datum/action/item_action/organ_action/colossus + name = "Voice of God" + var/obj/item/organ/vocal_cords/colossus/cords = null + +/datum/action/item_action/organ_action/colossus/New() + ..() + cords = target + +/datum/action/item_action/organ_action/colossus/IsAvailable() + if(world.time < cords.next_command) + return FALSE + if(!owner) + return FALSE + if(!owner.can_speak()) + return FALSE + if(check_flags & AB_CHECK_CONSCIOUS) + if(owner.stat) + return FALSE + return TRUE + +/datum/action/item_action/organ_action/colossus/Trigger() + . = ..() + if(!IsAvailable()) + if(world.time < cords.next_command) + to_chat(owner, "You must wait [DisplayTimeText(cords.next_command - world.time)] before Speaking again.") + return + var/command = input(owner, "Speak with the Voice of God", "Command") + if(QDELETED(src) || QDELETED(owner)) + return + if(!command) + return + owner.say(".x[command]") + +/obj/item/organ/vocal_cords/colossus/can_speak_with() + if(world.time < next_command) + to_chat(owner, "You must wait [DisplayTimeText(next_command - world.time)] before Speaking again.") + return FALSE + if(!owner) + return FALSE + if(!owner.can_speak()) + to_chat(owner, "You are unable to speak!") + return FALSE + return TRUE +*/ + +/obj/item/organ/vocal_cords/velvet/handle_speech(message) + var/cooldown = velvetspeec(hmessage, owner, spans, base_multiplier) + return //voice of god speaks for us + + + +/obj/item/organ/vocal_cords/velvet/speak_with(message) + var/cooldown = voice_of_god(message, owner, spans, base_multiplier) + next_command = world.time + (cooldown * cooldown_mod) + +////////////////////////////////////// +///////////FermiChem////////////////// +////////////////////////////////////// + +/proc/velvetspeech(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE) + var/cooldown = 0 + + if(!user || !user.can_speak() || user.stat) + return 0 //no cooldown + + var/log_message = message + if(!span_list || !span_list.len) //Not too sure what this does, I think it changes your output message depending if you're a cultist or not? I.e. font + if(iscultist(user)) + span_list = list("narsiesmall") + else if (is_servant_of_ratvar(user)) + span_list = list("ratvar") + else + span_list = list() + + user.say(message, sanitize = FALSE)//Removed spans = span_list, It should just augment normal speech + + message = lowertext(message) + var/mob/living/list/listeners = list() + for(var/mob/living/L in get_hearers_in_view(8, user)) + if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) + if(L.has_status_effect(/datum/status_effect/chem/enthral))//Check to see if they have the status + if(L == user && !include_speaker) + continue + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) + continue + if(istype(H.neck, /obj/item/clothing/neck/petcollar)) + power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet + if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) + 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. + listeners += L + + if(!listeners.len) + cooldown = COOLDOWN_NONE + return cooldown + + var/power_multiplier = base_multiplier + + // Not sure I want to give extra power to anyone at the moment...? We'll see how it turns out + if(user.mind) + //Chaplains are very good at indoctrinating + if(user.mind.assigned_role == "Chaplain") + power_multiplier *= 2 + //Command staff has authority + if(user.mind.assigned_role in GLOB.command_positions) + power_multiplier *= 1.4 + //Why are you speaking + if(user.mind.assigned_role == "Mime") + power_multiplier *= 0.5 + + //Cultists are closer to their gods and are more better at indoctrinating + if(iscultist(user)) + power_multiplier *= 2 + else if (is_servant_of_ratvar(user)) + power_multiplier *= 2 + else if (is_devil(user))//The devil is supposed to be seductive, right? + power_multiplier *= 2 + + //range = 0.5 - 4.2~ + //most cases = 1-2 + + //Try to check if the speaker specified a name or a job to focus on + var/list/specific_listeners = list() + var/found_string = null + + //Get the proper job titles + message = get_full_job_name(message) + + for(var/V in listeners) + if(dd_hasprefix(message, L.real_name)) + specific_listeners += L //focus on those with the specified name + //Cut out the name so it doesn't trigger commands + found_string = L.real_name + power_multiplier *= 2 + + else if(dd_hasprefix(message, L.first_name())) + specific_listeners += L //focus on those with the specified name + //Cut out the name so it doesn't trigger commands + found_string = L.first_name() + power_multiplier *= 2 + + else if(L.mind && L.mind.assigned_role && dd_hasprefix(message, L.mind.assigned_role)) + specific_listeners += L //focus on those with the specified job + //Cut out the job so it doesn't trigger commands + found_string = L.mind.assigned_role + power_multiplier *= 2 + + if(specific_listeners.len) + listeners = specific_listeners + //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP + message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) + + //phase 1 + var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile") + var/static/regex/reward_words = regex("good boy|good girl|good pet") + 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") + 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|") + //phase 2 + 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("wake up|awaken") + 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/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/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/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE + 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 + + + + //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words + //ENTHRAL + if(findtext(message, enthral_words)) + cooldown = COOLDOWN_VTHRAL + 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.enthralTally += power_multiplier + + 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(60 * power_multiplier) + + //KNOCKDOWN + else if(findtext(message, knockdown_words)) + cooldown = COOLDOWN_STUN + for(var/V in listeners) + var/mob/living/L = V + L.Knockdown(60 * power_multiplier) + + //SLEEP + else if((findtext(message, sleep_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + C.Sleeping(40 * power_multiplier) + + //VOMIT + else if((findtext(message, vomit_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + C.vomit(10 * power_multiplier, distance = power_multiplier) + + //SILENCE + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) + power_multiplier *= 3 + C.silent += (10 * power_multiplier) + + //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) + + //WAKE UP + else if((findtext(message, wakeup_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.SetSleeping(0) + + //HEAL + else if((findtext(message, heal_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, FALSE, FALSE) + + //BRUTE DAMAGE + else if((findtext(message, hurt_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST) + + //BLEED + else if((findtext(message, bleed_words))) + cooldown = COOLDOWN_DAMAGE + for(var/mob/living/carbon/human/H in listeners) + H.bleed_rate += (5 * power_multiplier) + + //FIRE + else if((findtext(message, burn_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.adjust_fire_stacks(1 * power_multiplier) + L.IgniteMob() + + //HOT + else if((findtext(message, hot_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.adjust_bodytemperature(50 * power_multiplier) + + //COLD + else if((findtext(message, cold_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.adjust_bodytemperature(-50 * power_multiplier) + + //REPULSE + else if((findtext(message, repulse_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + var/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(L, user))) + L.throw_at(throwtarget, 3 * power_multiplier, 1 * power_multiplier) + + //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) + + //WHO ARE YOU? + else if((findtext(message, whoareyou_words))) + cooldown = COOLDOWN_MEME + 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++ + + //SAY MY NAME + else if((findtext(message, saymyname_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /atom/movable/proc/say, user.name), 5 * i) + i++ + + //KNOCK KNOCK + else if((findtext(message, knockknock_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /atom/movable/proc/say, "Who's there?"), 5 * i) + i++ + + //STATE LAWS + else if((findtext(message, statelaws_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/silicon/S in listeners) + S.statelaws(force = 1) + + //MOVE + else if((findtext(message, move_words))) + cooldown = COOLDOWN_MEME + var/direction + if(findtext(message, up_words)) + direction = NORTH + else if(findtext(message, down_words)) + direction = SOUTH + else if(findtext(message, left_words)) + direction = WEST + else if(findtext(message, right_words)) + direction = EAST + for(var/iter in 1 to 5 * power_multiplier) + for(var/V in listeners) + 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 + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HELP), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //DISARM INTENT + else if((findtext(message, disarmintent_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_DISARM), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //GRAB INTENT + else if((findtext(message, grabintent_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_GRAB), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //HARM INTENT + else if((findtext(message, harmintent_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //THROW/CATCH + else if((findtext(message, throwmode_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/C in listeners) + C.throw_mode_on() + + //FLIP + else if((findtext(message, flip_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + L.emote("flip") + + //SPEAK + else if((findtext(message, speak_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + 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))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + for(var/obj/structure/chair/chair in get_turf(L)) + chair.buckle_mob(L) + break + + //STAND UP + else if((findtext(message, stand_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + if(L.buckled && istype(L.buckled, /obj/structure/chair)) + L.buckled.unbuckle_mob(L) + + //DANCE + else if((findtext(message, dance_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "dance"), 5 * i) + i++ + + //JUMP + else if((findtext(message, jump_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + if(prob(25)) + addtimer(CALLBACK(L, /atom/movable/proc/say, "HOW HIGH?!!"), 5 * i) + addtimer(CALLBACK(L, /mob/living/.proc/emote, "jump"), 5 * i) + i++ + + //SALUTE + else if((findtext(message, salute_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "salute"), 5 * i) + i++ + + //PLAY DEAD + else if((findtext(message, deathgasp_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) + i++ + + //PLEASE CLAP + else if((findtext(message, clap_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "clap"), 5 * i) + i++ + + //HONK + else if((findtext(message, honk_words))) + cooldown = COOLDOWN_MEME + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25) + if(user.mind && user.mind.assigned_role == "Clown") + for(var/mob/living/carbon/C in listeners) + C.slip(140 * power_multiplier) + cooldown = COOLDOWN_MEME + + //RIGHT ROUND + else if((findtext(message, multispin_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + L.SpinAnimation(speed = 10, loops = 5) + + //CITADEL CHANGES + //ORGASM + else if((findtext(message, orgasm_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/carbon/human/H = V + if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure + H.mob_climax(forced_climax=TRUE) + + //DAB + else if((findtext(message, dab_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/M = V + M.say("*dab") + + //SNAP + else if((findtext(message, snap_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/M = V + M.say("*snap") + + //BWOINK + else if((findtext(message, bwoink_words))) + cooldown = COOLDOWN_MEME + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/effects/adminhelp.ogg', 300, 1), 25) + //END CITADEL CHANGES + + else + cooldown = COOLDOWN_NONE + + 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) + + return cooldown + #undef COOLDOWN_STUN #undef COOLDOWN_DAMAGE diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index b1280c3559..78a4c28375 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -1,3 +1,21 @@ /datum/mood_event/eigenstate mood_change = -1 description = "Where the hell am I? Is this an alternative dimension ?\n" + +/datum/mood_event/enthrall + mood_change = 2 + description = "I am a good pet for master.\n" + +/datum/mood_event/enthrallpraise + mood_change = 5 + description = "Master praised me!!\n" + timeout = 1200 + +/datum/mood_event/enthrallscold + mood_change = -5 + description = "I have let master down.\n"//aaa I'm not kinky enough for this + timeout = 1200 + +/datum/mood_event/enthrallmissing1 + mood_change = -5 + description = "\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 54fbea8ba1..801938d721 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -154,7 +154,8 @@ id = "enthral" var/mob/living/E //E for enchanter //var/mob/living/V = list() //V for victims - var/resistance = 0 + var/enthralTally = 10 + var/resistanceTally = 0 var/phase = 0 var/enthralID @@ -168,16 +169,16 @@ if(0) return if(1) - + /datum/status_effect/chem/enthral/proc/owner_resist(mob/living/carbon/M) to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") if (M.canbearoused) - resistance += ((100 - M.arousalloss/100)/100) + resistance *= ((100 - M.arousalloss/100)/100) else - resistance += 0.2 + resistance *= 0.2 /* /datum/status_effect/chem/OwO 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 b296bd293a..5855574d76 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -739,12 +739,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/enthral/on_mob_life(mob/living/carbon/M) if(!creatorID) CRASH("Something went wrong in enthral creation") - if(M.ID == creatorID) + else if(M.ID == creatorID) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/silver T.Remove(M) nT.Insert(M) qdel(T) + else //Requires player to be within vicinity of creator //bonuses to mood From b71bc7d9dc08bdff185d80ef6056cd90314681cf Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 4 May 2019 17:50:43 +0100 Subject: [PATCH 31/40] Added happiness, psicodine, neurine and 2/6th of MC chem --- code/datums/mood_events/drug_events.dm | 16 ++++ .../chemistry/reagents/drug_reagents.dm | 78 ++++++++++++++++- .../chemistry/reagents/medicine_reagents.dm | 36 +++++++- .../reagents/chemistry/recipes/drugs.dm | 7 ++ .../reagents/chemistry/recipes/medicine.dm | 12 +++ code/modules/surgery/organs/vocal_cords.dm | 84 ++++++++++++++++--- .../code/datums/status_effects/chems.dm | 19 +++-- .../chemistry/reagents/fermi_reagents.dm | 12 +-- 8 files changed, 235 insertions(+), 29 deletions(-) diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 40c239180e..6ed33b0f00 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -37,3 +37,19 @@ /datum/mood_event/withdrawal_critical/add_effects(drug_name) description = "[drug_name]! [drug_name]! [drug_name]!\n" + +/datum/mood_event/happiness_drug + description = "I can't feel anything and I never want this to end.\n" + mood_change = 50 + +/datum/mood_event/happiness_drug_good_od + description = "YES! YES!! YES!!!\n" + mood_change = 100 + timeout = 300 + special_screen_obj = "mood_happiness_good" + +/datum/mood_event/happiness_drug_bad_od + description = "NO! NO!! NO!!!\n" + mood_change = -100 + timeout = 300 + special_screen_obj = "mood_happiness_bad" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index d77756a649..cd439b1899 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -359,6 +359,83 @@ ..() . = 1 +/datum/reagent/drug/happiness + name = "Happiness" + id = "happiness" + description = "Fills you with ecstasic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings." + reagent_state = LIQUID + color = "#FFF378" + addiction_threshold = 10 + overdose_threshold = 20 + +/datum/reagent/drug/happiness/on_mob_add(mob/living/L) + ..() + L.add_trait(TRAIT_FEARLESS, id) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug) + +/datum/reagent/drug/happiness/on_mob_delete(mob/living/L) + L.remove_trait(TRAIT_FEARLESS, id) + SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "happiness_drug") + ..() + +/datum/reagent/drug/happiness/on_mob_life(mob/living/carbon/M) + M.jitteriness = 0 + M.confused = 0 + M.disgust = 0 + M.adjustBrainLoss(0.2) + ..() + . = 1 + +/datum/reagent/drug/happiness/overdose_process(mob/living/M) + if(prob(30)) + var/reaction = rand(1,3) + switch(reaction) + if(1) + M.emote("laugh") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_good_od) + if(2) + M.emote("sway") + M.Dizzy(25) + if(3) + M.emote("frown") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_bad_od) + M.adjustBrainLoss(0.5) + ..() + . = 1 + +/datum/reagent/drug/happiness/addiction_act_stage1(mob/living/M)// all work and no play makes jack a dull boy + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(min(mood.sanity, SANITY_DISTURBED)) + M.Jitter(5) + if(prob(20)) + M.emote(pick("twitch","laugh","frown")) + ..() + +/datum/reagent/drug/happiness/addiction_act_stage2(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(min(mood.sanity, SANITY_UNSTABLE)) + M.Jitter(10) + if(prob(30)) + M.emote(pick("twitch","laugh","frown")) + ..() + +/datum/reagent/drug/happiness/addiction_act_stage3(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(min(mood.sanity, SANITY_CRAZY)) + M.Jitter(15) + if(prob(40)) + M.emote(pick("twitch","laugh","frown")) + ..() + +/datum/reagent/drug/happiness/addiction_act_stage4(mob/living/carbon/human/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(SANITY_INSANE) + M.Jitter(20) + if(prob(50)) + M.emote(pick("twitch","laugh","frown")) + ..() + . = 1 + /datum/reagent/drug/skooma name = "Skooma" id = "skooma" @@ -429,4 +506,3 @@ if(prob(40)) M.emote(pick("twitch","drool","moan")) ..() - diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 58926d0c69..34643085e7 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -62,7 +62,7 @@ M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) if(M.blood_volume < BLOOD_VOLUME_NORMAL) M.blood_volume = BLOOD_VOLUME_NORMAL - + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.severity == DISEASE_SEVERITY_POSITIVE) @@ -1286,3 +1286,37 @@ M.adjustStaminaLoss(1.5*REM, 0) ..() return TRUE + +/datum/reagent/medicine/psicodine + name = "Psicodine" + id = "psicodine" + description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage." + reagent_state = LIQUID + color = "#07E79E" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/medicine/psicodine/on_mob_add(mob/living/L) + ..() + L.add_trait(TRAIT_FEARLESS, id) + +/datum/reagent/medicine/psicodine/on_mob_delete(mob/living/L) + L.remove_trait(TRAIT_FEARLESS, id) + ..() + +/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M) + M.jitteriness = max(0, M.jitteriness-6) + M.dizziness = max(0, M.dizziness-6) + M.confused = max(0, M.confused-6) + M.disgust = max(0, M.disgust-6) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... + mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral + ..() + . = 1 + +/datum/reagent/medicine/psicodine/overdose_process(mob/living/M) + M.hallucination = min(max(0, M.hallucination + 5), 60) + M.adjustToxLoss(1, 0) + ..() + . = 1 diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index d91e2af7e9..27b1fe12ee 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -41,6 +41,13 @@ results = list("aranesp" = 3) required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) +/datum/chemical_reaction/happiness + name = "Happiness" + id = "happiness" + results = list("happiness" = 4) + required_reagents = list("nitrous_oxide" = 2, "epinephrine" = 1, "ethanol" = 1) + required_catalysts = list("plasma" = 5) + /datum/chemical_reaction/skooma name = "skooma" id = "skooma" diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index dc7c32d925..4cecf4216c 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -172,6 +172,12 @@ results = list("mutadone" = 3) required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) +/datum/chemical_reaction/neurine + name = "Neurine" + id = "neurine" + results = list("neurine" = 3) + required_reagents = list("mannitol" = 1, "acetone" = 1, "oxygen" = 1) + /datum/chemical_reaction/antihol name = "antihol" id = "antihol" @@ -252,3 +258,9 @@ results = list("modafinil" = 5) required_reagents = list("diethylamine" = 1, "ammonia" = 1, "phenol" = 1, "acetone" = 1, "sacid" = 1) required_catalysts = list("bromine" = 1) // as close to the real world synthesis as possible + +/datum/chemical_reaction/psicodine + name = "Psicodine" + id = "psicodine" + results = list("psicodine" = 5) + required_reagents = list( "mannitol" = 2, "water" = 2, "impedrezene" = 1) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index c6c40de31a..60734aafc6 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -762,19 +762,19 @@ specific_listeners += L //focus on those with the specified name //Cut out the name so it doesn't trigger commands found_string = L.real_name - power_multiplier *= 2 + power_multiplier += 0.5 else if(dd_hasprefix(message, L.first_name())) specific_listeners += L //focus on those with the specified name //Cut out the name so it doesn't trigger commands found_string = L.first_name() - power_multiplier *= 2 + power_multiplier += 0.5 else if(L.mind && L.mind.assigned_role && dd_hasprefix(message, L.mind.assigned_role)) specific_listeners += L //focus on those with the specified job //Cut out the job so it doesn't trigger commands found_string = L.mind.assigned_role - power_multiplier *= 2 + power_multiplier += 0.25 if(specific_listeners.len) listeners = specific_listeners @@ -782,7 +782,7 @@ message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) //phase 1 - var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile") + 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") 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") @@ -838,16 +838,81 @@ 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/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25) + var/static/regex/reward_words = regex("good boy|good girl|good pet") + var/static/regex/silence_words = regex("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/resist_words = regex("resist|snap out of it|come to your senses")//useful if two enthrallers are fighting + var/static/regex/forget_words = regex("forget|muddled|") //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words //ENTHRAL if(findtext(message, enthral_words)) - cooldown = COOLDOWN_VTHRAL 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.enthralTally += power_multiplier + power_multiplier *= distancelist[get_dist(user, V)+1] + //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if(message.len > 50) + E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. + else + E.enthralTally += power_multiplier*1.25 + cooldown = COOLDOWN_VTHRAL + + //REWARD + if(findtext(message, reward_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) + power_multiplier *= distancelist[get_dist(user, V)+1] + //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if (L.canbearoused) + //E.resistanceTally -= 1 + L.adjustArousalLoss(1*power_multiplier) + else + E.resistanceTally /= 2*power_multiplier + cooldown = COOLDOWN_VTHRAL + + //PUNISH + 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) + power_multiplier *= distancelist[get_dist(user, V)+1] + //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if (L.canbearoused) + E.resistanceTally /= 1*power_multiplier + L.adjustArousalLoss(-2*power_multiplier) + else + E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) + cooldown = COOLDOWN_VTHRAL + + //SILENCE + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_VSTUN + for(var/mob/living/carbon/C in listeners) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if L.phase == 3 //If target is fully enthralled, + C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) + else + C.silent += ((10 * power_multiplier) * E.phase + + //RESIST + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_VSTUN + for(var/mob/living/carbon/C in listeners) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.deltaResist += (power_multiplier) + + //FORGET + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_VSTUN + for(var/mob/living/carbon/C in listeners) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.deltaResist += (power_multiplier) + var/i = 0 //STUN @@ -877,13 +942,6 @@ for(var/mob/living/carbon/C in listeners) C.vomit(10 * power_multiplier, distance = power_multiplier) - //SILENCE - else if((findtext(message, silence_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/carbon/C in listeners) - if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) - power_multiplier *= 3 - C.silent += (10 * power_multiplier) //HALLUCINATE else if((findtext(message, hallucinate_words))) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 801938d721..724ab291f2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -150,21 +150,24 @@ /////////////////////////////////////////// */ -/datum/status_effect/chem/enthral - id = "enthral" +/datum/status_effect/chem/enthrall + id = "enthrall" var/mob/living/E //E for enchanter //var/mob/living/V = list() //V for victims - var/enthralTally = 10 + var/enthrallTally = 10 var/resistanceTally = 0 - var/phase = 0 + var/deltaResist + var/deltaEnthrall + var/phase = 1 //1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled + var/command var/enthralID -/datum/status_effect/chem/enthra/on_apply(mob/living/carbon/M) +/datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) if(M.ID == ) -/datum/status_effect/chem/enthral/tick(mob/living/carbon/M) - redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) +/datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) + redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed switch(phase) if(0) return @@ -173,7 +176,7 @@ -/datum/status_effect/chem/enthral/proc/owner_resist(mob/living/carbon/M) +/datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") if (M.canbearoused) resistance *= ((100 - M.arousalloss/100)/100) 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 5855574d76..c89a88af0b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -39,10 +39,10 @@ addiction_stage4_end = 43 //Incase it's too long var/location_created var/turf/open/location_return = null - var/addictCyc1 = 1 - var/addictCyc2 = 1 - var/addictCyc3 = 1 - var/addictCyc4 = 1 + var/addictCyc1 = 0 + var/addictCyc2 = 0 + var/addictCyc3 = 0 + var/addictCyc4 = 0 var/mob/living/fermi_Tclone = null var/teleBool = FALSE mob/living/carbon/purgeBody @@ -152,7 +152,7 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. switch(src.addictCyc4) - if(1) + if(0) do_sparks(5,FALSE,M) do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! do_sparks(5,FALSE,M) @@ -172,7 +172,7 @@ src.addictCyc4++ ..() - //. = 1 + . = 1 ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return From f31a46e029c195993c88812eb89f3522f29598b7 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 5 May 2019 20:32:07 +0100 Subject: [PATCH 32/40] Fixed a few things, 1/2 way through MC chem. --- code/__DEFINES/components.dm | 4 + code/modules/surgery/organs/tongue.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 158 ++++++++---------- .../code/datums/mood_events/chem_events.dm | 24 ++- .../code/datums/status_effects/chems.dm | 124 +++++++++++++- .../clothing/fermichemclothe/fermiclothes.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 22 +-- .../reagents/chemistry/recipes/fermi.dm | 1 + 8 files changed, 219 insertions(+), 122 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 3338fc1cda..8bcccbb02a 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -137,6 +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. + // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) @@ -145,6 +148,7 @@ #define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) #define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) + // /obj/item signals #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 3e202acf41..5437f4ee17 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -216,8 +216,6 @@ message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") if(prob(20)) - message += " OwO" - else if(prob(30)) - message += " uwu" + message += pick(" OwO", " uwu") message = lowertext(message) return message diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 60734aafc6..8b45e3e4cf 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -613,7 +613,7 @@ return cooldown ////////////////////////////////////// -///////ENTHRAL SILVER TONGUE////////// +///////ENTHRAL VELVET CHORDS////////// ////////////////////////////////////// //Heavily modified voice of god code @@ -674,8 +674,8 @@ */ /obj/item/organ/vocal_cords/velvet/handle_speech(message) - var/cooldown = velvetspeec(hmessage, owner, spans, base_multiplier) - return //voice of god speaks for us + var/cooldown = velvetspeech(message, owner, spans, base_multiplier) + return //velvetspeech should handle speech @@ -718,7 +718,7 @@ if(istype(H.neck, /obj/item/clothing/neck/petcollar)) power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) - 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. + 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. listeners += L if(!listeners.len) @@ -739,7 +739,7 @@ if(user.mind.assigned_role == "Mime") power_multiplier *= 0.5 - //Cultists are closer to their gods and are more better at indoctrinating + //Cultists are closer to their gods and are better at indoctrinating if(iscultist(user)) power_multiplier *= 2 else if (is_servant_of_ratvar(user)) @@ -778,7 +778,7 @@ if(specific_listeners.len) listeners = specific_listeners - //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP + //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP, power is judged internally on a thrall, so shouldn't be nessicary. message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) //phase 1 @@ -789,8 +789,11 @@ var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") var/static/regex/desire_words = regex("good boy|good girl|good pet") 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|") + var/static/regex/forget_words = regex("forget|muddled") //phase 2 + var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE + 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") @@ -808,7 +811,7 @@ 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/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") @@ -831,23 +834,19 @@ 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/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE - var/static/regex/dab_words = regex("dab|mood") //CITADEL CHANGE - var/static/regex/snap_words = regex("snap") //CITADEL CHANGE + //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/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25) - var/static/regex/reward_words = regex("good boy|good girl|good pet") - var/static/regex/silence_words = regex("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/resist_words = regex("resist|snap out of it|come to your senses")//useful if two enthrallers are fighting - var/static/regex/forget_words = regex("forget|muddled|") //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words + + //Tier 1 //ENTHRAL if(findtext(message, enthral_words)) for(var/V in listeners) @@ -859,7 +858,7 @@ E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. else E.enthralTally += power_multiplier*1.25 - cooldown = COOLDOWN_VTHRAL + cooldown = 100 //REWARD if(findtext(message, reward_words)) @@ -893,26 +892,70 @@ else if((findtext(message, silence_words))) cooldown = COOLDOWN_VSTUN for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthral/C = C.has_status_effect(/datum/status_effect/chem/enthral) + power_multiplier *= distancelist[get_dist(user, V)+1] if L.phase == 3 //If target is fully enthralled, C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) else - C.silent += ((10 * power_multiplier) * E.phase + C.silent += ((10 * power_multiplier) * E.phase) //RESIST else if((findtext(message, silence_words))) cooldown = COOLDOWN_VSTUN 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] E.deltaResist += (power_multiplier) - //FORGET + //FORGET (A way to cancel the process) else if((findtext(message, silence_words))) cooldown = COOLDOWN_VSTUN for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - E.deltaResist += (power_multiplier) + C.Sleeping(40) + to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") + E.phase = 0 + //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) + + //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) + 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). + + //awoo + else if((findtext(message, awoo_words))) + cooldown = 0 + for(var/V in listeners) + var/mob/living/M = V + M.say("*awoo") + + //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!") + + //SLEEP + else if((findtext(message, sleep_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + C.Sleeping(40 * power_multiplier) var/i = 0 //STUN @@ -930,11 +973,7 @@ var/mob/living/L = V L.Knockdown(60 * power_multiplier) - //SLEEP - else if((findtext(message, sleep_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/carbon/C in listeners) - C.Sleeping(40 * power_multiplier) + //VOMIT else if((findtext(message, vomit_words))) @@ -1006,12 +1045,7 @@ var/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(L, user))) L.throw_at(throwtarget, 3 * power_multiplier, 1 * power_multiplier) - //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) + //WHO ARE YOU? else if((findtext(message, whoareyou_words))) @@ -1171,24 +1205,6 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "dance"), 5 * i) i++ - //JUMP - else if((findtext(message, jump_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - if(prob(25)) - addtimer(CALLBACK(L, /atom/movable/proc/say, "HOW HIGH?!!"), 5 * i) - addtimer(CALLBACK(L, /mob/living/.proc/emote, "jump"), 5 * i) - i++ - - //SALUTE - else if((findtext(message, salute_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /mob/living/.proc/emote, "salute"), 5 * i) - i++ - //PLAY DEAD else if((findtext(message, deathgasp_words))) cooldown = COOLDOWN_MEME @@ -1197,14 +1213,6 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ - //PLEASE CLAP - else if((findtext(message, clap_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /mob/living/.proc/emote, "clap"), 5 * i) - i++ - //HONK else if((findtext(message, honk_words))) cooldown = COOLDOWN_MEME @@ -1221,34 +1229,6 @@ var/mob/living/L = V L.SpinAnimation(speed = 10, loops = 5) - //CITADEL CHANGES - //ORGASM - else if((findtext(message, orgasm_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/carbon/human/H = V - if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure - H.mob_climax(forced_climax=TRUE) - - //DAB - else if((findtext(message, dab_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/M = V - M.say("*dab") - - //SNAP - else if((findtext(message, snap_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/M = V - M.say("*snap") - - //BWOINK - else if((findtext(message, bwoink_words))) - cooldown = COOLDOWN_MEME - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/effects/adminhelp.ogg', 300, 1), 25) - //END CITADEL CHANGES else cooldown = COOLDOWN_NONE diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 78a4c28375..7f55607832 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -3,19 +3,27 @@ description = "Where the hell am I? Is this an alternative dimension ?\n" /datum/mood_event/enthrall - mood_change = 2 - description = "I am a good pet for master.\n" + mood_change = 5 + description = "I am a good pet for Master.\n" /datum/mood_event/enthrallpraise - mood_change = 5 + mood_change = 10 description = "Master praised me!!\n" - timeout = 1200 + timeout = 400 /datum/mood_event/enthrallscold - mood_change = -5 - description = "I have let master down.\n"//aaa I'm not kinky enough for this - timeout = 1200 + mood_change = -10 + description = "I have let Master down.\n"//aaa I'm not kinky enough for this + timeout = 400 /datum/mood_event/enthrallmissing1 mood_change = -5 - description = "\n" + description = "I miss Master's presence.\n" + +/datum/mood_event/enthrallmissing2 + mood_change = -10 + description = "I really miss Masters presence.\n" + +/datum/mood_event/enthrallmissing3 + mood_change = -25 + description = "Where are you Master??!\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 724ab291f2..9d68233ca5 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -1,7 +1,14 @@ /datum/status_effect/chem/SGDF id = "SGDF" var/mob/living/fermi_Clone + alert_type = null +/* +/obj/screen/alert/status_effect/SDGF + name = "SDGF" + desc = "You've cloned yourself! How cute." + icon_state = "SDGF" +*/ /datum/status_effect/chem/SGDF/on_apply() message_admins("SGDF status appied") @@ -36,6 +43,7 @@ /datum/status_effect/chem/BElarger id = "BElarger" + alert_type = null //var/list/items = list() //var/items = o.get_contents() @@ -100,6 +108,7 @@ /datum/status_effect/chem/PElarger id = "PElarger" + alert_type = null /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("PElarge started!") @@ -152,37 +161,134 @@ /datum/status_effect/chem/enthrall id = "enthrall" + 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/phase = 1 //1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled - var/command - var/enthralID + 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/mindbroken = FALSE + var/datum/weakref/redirect_component1 + var/datum/weakref/redirect_component2 /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) - if(M.ID == ) + if(M.ID == enthralID) + owner.remove_status_effect(src)//This should'nt happen, but just in case + redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# + redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) - redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed + if(M.has_trait(TRAIT_MINDSHIELD)) + resistanceTally += 5 + if(prob(20)) + to_chat(owner, "You feel your lucidity returning as the mindshield fights") + switch(phase) - if(0) + if(-1)//fully removed + owner.remove_status_effect(src) + if(0)// sleeper agent return - if(1) + if(1)//Initial enthrallment + if (enthrallTally > 100) + phase += 1 + return + if (resistanceTally > 100) + + if resist +/datum/status_effect/chem/enthrall/on_remove(mob/living/carbon/M) + qdel(redirect_component1.resolve()) + redirect_component1 = null + qdel(redirect_component2.resolve()) + redirect_component2 = 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) + if(enthralID.name in message || enthralID.first_name in message) + return + else + . = ..() +*/ + +/datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) + //3 stages, each getting worse /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) + if(prob(10)) + M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") + //base resistance if (M.canbearoused) - resistance *= ((100 - M.arousalloss/100)/100) + deltaResist*= ((100 - M.arousalloss/100)/100)//more aroused you are, the weaker resistance you can give else - resistance *= 0.2 + deltaResist *= 0.2 + //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. + if (user.has_reagent("mannitol")) + deltaResist *= 1.25 + if (user.has_reagent("neurine")) + deltaResist *= 1.5 + if (!H.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) + if (user.has_reagent("anaphro")) + deltaResist *= 1.5 + if (user.has_reagent("anaphro+")) + deltaResist *= 2 + if (user.has_reagent("aphro")) + deltaResist *= 0.75 + if (user.has_reagent("aphro+")) + deltaResist *= 0.5 + //Antag resistance + //cultists are already brainwashed by their god + if(iscultist(owner)) + deltaResist *= 2 + else if (is_servant_of_ratvar(user)) + deltaResist *= 2 + //antags should be able to resist, so they can do their other objectives. This chem does frustrate them, but they've all the tools to break free when an oportunity presents itself. + else if (owner.mind.assigned_role in GLOB.antagonists) + deltaResist *= 1.8 + + //role resistance + //Chaplains are already brainwashed by their god + if(owner.mind.assigned_role == "Chaplain") + deltaResist *= 1.5 + //Command staff has authority, + if(owner.mind.assigned_role in GLOB.command_positions) + deltaResist *= 1.4 + //if(owner.first_name == "skylar"); power_multiplier *= 0.8 //for skylar //I'm kidding + //Chemists should be familiar with drug effects + if(owner.mind.assigned_role == "Chemist") + deltaResist *= 1.3 + + //Happiness resistance + //Your Thralls are like pets, you need to keep them happy. + if(owner.nutrition < 250) + deltaResist += (250-owner.nutrition)/100 + if(owner.health < 120)//Harming your thrall will make them rebel harder. + deltaResist *= ((120-owner.health)/100)+1 + //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong) + //Mental health could play a role too in the other direction + + //If master gives you a collar, you get a sense of pride + if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) + deltaResist *= 0.8 + +/datum/status_effect/chem/enthrall/proc/owner_say(mob/living/carbon/M) //I can only hope this works + var/static/regex/owner_words = regex("[enthralID.real_name]|[enthralID.first_name()]") + if(findtext(message, enthral_words)) + if(enthralID.gender == FEMALE) + message = replacetext(message, enthralID.real_name, "Mistress") + message = replacetext(message, enthralID.first_name(, "Mistress") + else + message = replacetext(message, enthralID.real_name, "Master") + message = replacetext(message, enthralID.first_name(, "Master") + return message /* /datum/status_effect/chem/OwO id = "OwO" diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm index 80ae690ada..6dcfa20b95 100644 --- a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm +++ b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm @@ -1,8 +1,8 @@ //Fermiclothes! //Clothes made from FermiChem -/obj/item/clothing/head/hattip //Actually the M1 Helmet - name = "flak helmet" +/obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds + name = "Sythetic hat" con = 'icons/obj/clothing/hats.dmi' icon_state = "top_hat" desc = "A sythesized hat, you can't seem to take it off. And tips their hat." 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 c89a88af0b..ae71736d24 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -724,27 +724,27 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING qdel(M) //Approx 60minutes till death from initial addiction ..() -/datum/reagent/fermi/enthral - name = "Need a name" +/datum/reagent/fermi/enthrall + name = "MKUltra" id = "enthral" 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 - overdose_threshold = 20 - addiction_threshold = 30 - addiction_stage1_end = 9999//Should never end. + //overdose_threshold = 20 + //addiction_threshold = 30 + //addiction_stage1_end = 9999//Should never end. var/creatorID //add here -/datum/reagent/fermi/enthral/on_mob_life(mob/living/carbon/M) +/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) if(!creatorID) CRASH("Something went wrong in enthral creation") else if(M.ID == creatorID) - var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) - var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/silver - T.Remove(M) - nT.Insert(M) - qdel(T) + var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) + var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet + Vc.Remove(M) + nVc.Insert(M) + qdel(Vc) else //Requires player to be within vicinity of creator diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 23ad696d46..e6b23f6e67 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -107,6 +107,7 @@ id = "enthral" results = list("enthral" = 3) required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + required_catalysts = list("blood" = 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 From 1385e12fe323c1bf7a82ad49ac43dc4f2e853283 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 7 May 2019 23:38:50 +0100 Subject: [PATCH 33/40] MC 4/6th done --- code/modules/surgery/organs/tongue.dm | 1 - code/modules/surgery/organs/vocal_cords.dm | 73 +++++++++---- .../code/datums/mood_events/chem_events.dm | 18 ++-- .../code/datums/status_effects/chems.dm | 101 +++++++++++++++--- .../chemistry/reagents/fermi_reagents.dm | 10 +- .../reagents/chemistry/recipes/fermi.dm | 4 +- 6 files changed, 159 insertions(+), 48 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 5437f4ee17..64020bf167 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -211,7 +211,6 @@ message = replacetext(message, "na", "nya") message = replacetext(message, "no", "nyo") message = replacetext(message, "ove", "uv") - message = replacetext(message, "ove", "uv") //message = replacetext(message, "th", "ff") //too incoherent in practice message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8b45e3e4cf..dd9470d952 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -715,10 +715,6 @@ var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue - if(istype(H.neck, /obj/item/clothing/neck/petcollar)) - power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet - if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) - 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. listeners += L if(!listeners.len) @@ -781,6 +777,17 @@ //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP, power is judged internally on a thrall, so shouldn't be nessicary. message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) + var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + if (T.name == "fluffy tongue") //If you sound hillarious, it's hard to take you seriously. This is a way for other players to combat/reduce their effectiveness. + power_multiplier*0.75 + + /* CHECK THIS STUFF IN THE CHEM STATUS INSTEAD. + if(istype(H.neck, /obj/item/clothing/neck/petcollar)) + power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet + if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) + 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") @@ -789,9 +796,9 @@ var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") var/static/regex/desire_words = regex("good boy|good girl|good pet") 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") + var/static/regex/forget_words = regex("forget|muddled|awake and forget") //phase 2 - var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE + var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //lewd 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") @@ -800,7 +807,7 @@ 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("wake up|awaken") + var/static/regex/wakeup_words = regex("revert|awaken|*snap") 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") @@ -847,7 +854,7 @@ //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words //Tier 1 - //ENTHRAL + //ENTHRAL mixable if(findtext(message, enthral_words)) for(var/V in listeners) var/mob/living/L = V @@ -860,7 +867,7 @@ E.enthralTally += power_multiplier*1.25 cooldown = 100 - //REWARD + //REWARD mixable if(findtext(message, reward_words)) for(var/V in listeners) var/mob/living/L = V @@ -874,7 +881,7 @@ E.resistanceTally /= 2*power_multiplier cooldown = COOLDOWN_VTHRAL - //PUNISH + //PUNISH mixable if(findtext(message, punish_words)) for(var/V in listeners) var/mob/living/L = V @@ -948,14 +955,47 @@ 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) + 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!") //SLEEP else if((findtext(message, sleep_words))) cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) - C.Sleeping(40 * power_multiplier) + C.Sleeping(20 * power_multiplier *) + + //WAKE UP + else if((findtext(message, wakeup_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) + 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) + + + //TO ADD + //progam triggers and responses with mental costs + //Antiresist + //Figure out cooldown + + //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(2 to INFINITY)//Tier 2 only + E.phase = 1 + var/items = M.get_contents() + for(var/I in items) + M.dropItemToGround(I, TRUE) + + / var/i = 0 //STUN @@ -964,7 +1004,7 @@ 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(60 * power_multiplier) + L.Stun(30 * power_multiplier) //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -988,12 +1028,7 @@ for(var/mob/living/carbon/C in listeners) new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) - //WAKE UP - else if((findtext(message, wakeup_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - L.SetSleeping(0) + //HEAL else if((findtext(message, heal_words))) diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 7f55607832..f14a31a46d 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -7,22 +7,22 @@ description = "I am a good pet for Master.\n" /datum/mood_event/enthrallpraise - mood_change = 10 - description = "Master praised me!!\n" + mood_change = 12 + description = "I feel so happy! I'm a good pet who Master loves!\n" timeout = 400 /datum/mood_event/enthrallscold - mood_change = -10 - description = "I have let Master down.\n"//aaa I'm not kinky enough for this - timeout = 400 + mood_change = -12 + description = "I've failed my Master... I feel like crying.\n"//aaa I'm not kinky enough for this + timeout = 600 /datum/mood_event/enthrallmissing1 - mood_change = -5 - description = "I miss Master's presence.\n" + mood_change = -10 + description = "I feel empty when Master's not around..\n" /datum/mood_event/enthrallmissing2 - mood_change = -10 - description = "I really miss Masters presence.\n" + mood_change = -15 + description = "I feel so lost in this complicated world without Master, where are they?!\n" /datum/mood_event/enthrallmissing3 mood_change = -25 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 9d68233ca5..363cbad2a3 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -172,23 +172,31 @@ var/status = null var/statusStrength = 0 var/enthrallID + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_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/customTriggers /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) - if(M.ID == enthralID) + if(M.ID == enthrallID) owner.remove_status_effect(src)//This should'nt happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed - + //Might need to add recirect component for listening too. + mental_capacity = 500 - B.get_brain_damage() /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) if(M.has_trait(TRAIT_MINDSHIELD)) resistanceTally += 5 if(prob(20)) - to_chat(owner, "You feel your lucidity returning as the mindshield fights") + to_chat(owner, "You feel your lucidity returning as the mindshield attempts to return your brain to normal function.") + //phase specific events switch(phase) if(-1)//fully removed owner.remove_status_effect(src) @@ -197,11 +205,66 @@ if(1)//Initial enthrallment if (enthrallTally > 100) phase += 1 + mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. + enthrallTally = 0 return if (resistanceTally > 100) + enthrallTally *= 0.5 + phase -= 1 + resistanceTally = 0 + owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. + return + if(prob(10)) + to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name]", "[enthrallID.name]", "")].") - if resist + //distance calculations + switch(get_dist(enthrallID, owner)) + if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects. + enthrallTally += distancelist[get_dist(enthrallID, owner)+1] + var/withdrawal = FALSE + if(withdrawalTick > 0) + withdrawalTick -= 2 + if(9 to INFINITY)//If + var/withdrawal = TRUE + //chem calculations + if (user.has_reagent("MKUltra")) + enthrallTally += 2 + else + if (phase < 3) + resistance + if (mental_capacity <= 500) + if (user.has_reagent("mannitol")) + mental_capacity += 1 + if (user.has_reagent("neurine")) + mental_capacity += 2 + + //Withdrawal subproc: + if (withdrawal == TRUE)//Your minions are really REALLY needy. + switch(withdrawalTick) + if(20 to 40)//Gives wiggle room, so you're not SUPER needy + prob(10) + to_chat(owner, "You're starting to miss your Master/Mistress.") + prob(5) + M.adjustBrainLoss(1) + 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(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) + if(67 to 90) + M.emote("cry")//does this exist? + + + + withdrawalTick++ + +//Check for proximity of master DONE +//Place triggerreacts here - create a dictionary of triggerword and effect. +//message enthrallID "name appears to have mentally processed their last command." /datum/status_effect/chem/enthrall/on_remove(mob/living/carbon/M) qdel(redirect_component1.resolve()) @@ -211,16 +274,27 @@ /* /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) - if(enthralID.name in message || enthralID.first_name in message) + if(enthrallID.name in message || enthrallID.first_name in message) return else . = ..() */ +/datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + return +/* /datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) //3 stages, each getting worse - +*/ /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) + if (status == "Sleeper") + return + else if (status == "Antiresist")//If ordered to not resist + if (statusStrength > 0) + statusStrength -= 2 + return + else + status = null if(prob(10)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") @@ -279,15 +353,18 @@ if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) deltaResist *= 0.8 + if (deltaResist>0)//just in case + deltaResist /= phase//later phases require more resistance + /datum/status_effect/chem/enthrall/proc/owner_say(mob/living/carbon/M) //I can only hope this works - var/static/regex/owner_words = regex("[enthralID.real_name]|[enthralID.first_name()]") + var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") if(findtext(message, enthral_words)) - if(enthralID.gender == FEMALE) - message = replacetext(message, enthralID.real_name, "Mistress") - message = replacetext(message, enthralID.first_name(, "Mistress") + if(enthrallID.gender == FEMALE) + message = replacetext(message, enthrallID.real_name, "Mistress") + message = replacetext(message, enthrallID.first_name(, "Mistress") else - message = replacetext(message, enthralID.real_name, "Master") - message = replacetext(message, enthralID.first_name(, "Master") + message = replacetext(message, enthrallID.real_name, "Master") + message = replacetext(message, enthrallID.first_name(, "Master") return message /* /datum/status_effect/chem/OwO 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 ae71736d24..b5b9efb39a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -730,8 +730,8 @@ 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 - //overdose_threshold = 20 + metabolization_rate = 0.5 + overdose_threshold = 200 //addiction_threshold = 30 //addiction_stage1_end = 9999//Should never end. var/creatorID //add here @@ -778,7 +778,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") + to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") if(21) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO @@ -794,8 +794,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.emote("awoo") if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") + //for(var/victim in seen) + to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") ..() /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index e6b23f6e67..ced69baf42 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -131,6 +131,6 @@ /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - var/enthralID = B.get_blood_id() + var/enthrallID = B.get_blood_id() var/datum/reagent/fermi/enthral/E = locate(/datum/reagent/fermi/enthral) in holder.reagent_list - E.enthralID = enthralID + E.enthrallID = enthrallID From 854c0097d4b3660445ed03b4a3e3bb7629629f2c Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 8 May 2019 23:13:51 +0100 Subject: [PATCH 34/40] MC 5/6th done, probably. --- code/modules/surgery/organs/vocal_cords.dm | 55 ++++++++- .../code/datums/mood_events/chem_events.dm | 2 +- .../code/datums/status_effects/chems.dm | 112 +++++++++++++++--- 3 files changed, 149 insertions(+), 20 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index dd9470d952..96b8ce99e3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -702,7 +702,9 @@ else span_list = list() - user.say(message, sanitize = FALSE)//Removed spans = span_list, It should just augment normal speech + user.say(message, sanitize = TRUE)//Removed spans = span_list, It should just augment normal speech + + //FIND THRALLS message = lowertext(message) var/mob/living/list/listeners = list() @@ -721,6 +723,8 @@ cooldown = COOLDOWN_NONE return cooldown + //POWER CALCULATIONS + var/power_multiplier = base_multiplier // Not sure I want to give extra power to anyone at the moment...? We'll see how it turns out @@ -808,6 +812,8 @@ //phase 3 //var/static/regex/hallucinate_words = regex("see the truth|hallucinate") var/static/regex/wakeup_words = regex("revert|awaken|*snap") + var/static/regex/custom_words = regex("new trigger|listen to me") + var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|objective")//What a descriptive name! var/static/regex/heal_words = regex("live|heal|survive|mend|life|heroes never die") var/static/regex/hurt_words = regex("die|suffer|hurt|pain|death") var/static/regex/bleed_words = regex("bleed|there will be blood") @@ -977,6 +983,52 @@ to_chat(C, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") L.SetSleeping(0) + //CUSTOM TRIGGERS + else if((findtext(message, custom_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new trigger!") + return + else + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if E.mental_capacity > 150 || message == "objective" + var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) + if ((findtext(trigger, custom_words_words))) + if (trigger2 == "speak" || trigger2 == "echo") + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + E.customTriggers[trigger] = list(trigger2, trigger3) + else + E.customTriggers[trigger] = trigger2 + else + to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") + + //CUSTOM OBJECTIVE + else if((findtext(message, objective_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new objective!") + return + else + user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if E.mental_capacity > 150 || message == "objective" + var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) + if(!LAZYLEN(objectives)) + return + //Pets don't understand harm + objective = replacetext(lowertext(objective), "kill", "hug") + objective = replacetext(lowertext(objective), "murder", "cuddle") + objective = replacetext(lowertext(objective), "harm", "snuggle") + objective = replacetext(lowertext(objective), "decapitate", "headpat") + objective = replacetext(lowertext(objective), "strangle", "meow at") + E.objective += objectives + else + //TO ADD //progam triggers and responses with mental costs @@ -995,7 +1047,6 @@ for(var/I in items) M.dropItemToGround(I, TRUE) - / var/i = 0 //STUN diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index f14a31a46d..1d3a4100d7 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -13,7 +13,7 @@ /datum/mood_event/enthrallscold mood_change = -12 - description = "I've failed my Master... I feel like crying.\n"//aaa I'm not kinky enough for this + description = "I've failed Master... What a bad, bad pet!\n"//aaa I'm not kinky enough for this timeout = 600 /datum/mood_event/enthrallmissing1 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 363cbad2a3..4bb67e3183 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -180,29 +180,29 @@ var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) var/withdrawal = FALSE var/withdrawalTick = 0 - var/customTriggers + var/list/customTriggers = list() /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) if(M.ID == enthrallID) owner.remove_status_effect(src)//This should'nt happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed - //Might need to add recirect component for listening too. + //Might need to add redirect component for listening too. mental_capacity = 500 - B.get_brain_damage() /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) if(M.has_trait(TRAIT_MINDSHIELD)) resistanceTally += 5 if(prob(20)) - to_chat(owner, "You feel your lucidity returning as the mindshield attempts to return your brain to normal function.") + to_chat(owner, "You feel lucidity returning to your mind as the mindshield attempts to return your brain to normal function.") //phase specific events switch(phase) if(-1)//fully removed owner.remove_status_effect(src) - if(0)// sleeper agent + else if(0)// sleeper agent return - if(1)//Initial enthrallment + else if(1)//Initial enthrallment if (enthrallTally > 100) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. @@ -215,7 +215,19 @@ owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. return if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name]", "[enthrallID.name]", "")].") + to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name].", "You can't keep your eyes off [enthrallID.name].", "[enthrallID.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallID.name]", "[enthrallID.name] is so sexy and dominant, it feels right to obey them.")].") + else if (2) //partially enthralled + if (enthrallTally > 150) + phase += 1 + mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. + enthrallTally = 0 + return + if (resistanceTally > 150) + enthrallTally *= 0.5 + phase -= 1 + resistanceTally = 0 + owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. + return //distance calculations switch(get_dist(enthrallID, owner)) @@ -232,7 +244,8 @@ enthrallTally += 2 else if (phase < 3) - resistance + resistance += 10//If you've no chem, then you break out quickly + to_chat(owner, "You're starting to miss your Master/Mistress.") if (mental_capacity <= 500) if (user.has_reagent("mannitol")) mental_capacity += 1 @@ -246,7 +259,7 @@ prob(10) to_chat(owner, "You're starting to miss your Master/Mistress.") prob(5) - M.adjustBrainLoss(1) + owner.adjustBrainLoss(1) if(41) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) if(42 to 65) @@ -255,13 +268,22 @@ if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) + owner.stuttering += 20 + owner.jitteriness += 20 if(67 to 90) - M.emote("cry")//does this exist? + prob(10) + owner.SetStun(10, 0) + owner.emote("cry")//does this exist? + pro(10) + owner.adjustBrainLoss(2) + withdrawalTick++ + resistance += deltaResist + //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. //message enthrallID "name appears to have mentally processed their last command." @@ -281,13 +303,62 @@ */ /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + var/mob/living/carbon/C = owner + for (trigger in customTriggers) + if (trigger == message)//if trigger1 is the message + + //Speak (Forces player to talk) + if (customTriggers[trigger][1] == "speak")//trigger2 + C.visible_message("Your mouth moves on it's own, before you can even catch it. Though you find yourself fully believing in the validity of what you just said and don't think to question it.") + (C.say([customTriggers[trigger][2]]))//trigger3 + + + //Echo (repeats message!) + else if (customTriggers[trigger][1] == "echo")//trigger2 + (to_chat(owner, customTriggers[trigger][2]))//trigger3 + + //Shocking truth! + else if (customTriggers[trigger] == "shock") + if (C.canbearoused) + C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is + C.adjustArousalLoss(5) + to_chat(owner, "Your muscles seize up, then start spasming wildy!") + else + C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect + + //wah intensifies + else if (customTriggers[trigger][1] == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + if (C.canbearoused) + if (C.getArousalLoss() > 80) + C.mob_climax(forced_climax=TRUE) + else + C.adjustArousalLoss(10) + else + C.throw_at(get_step_towards(speaker,C), 3, 1) //cut this if it's too hard to get working + + //kneel (knockdown) + else if (customTriggers[trigger][1] == "kneel")//as close to kneeling as you can get, I suppose. + C.Knockdown(20) + + //strip (some) clothes + else if (customTriggers[trigger][1] == "strip")//This wasn't meant to just be a lewd thing oops + var/mob/living/carbon/human/o = owner + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + C.visible_message("You feel compelled to strip your clothes.") + + //add more fun stuff! + + return /* /datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) //3 stages, each getting worse */ /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) - if (status == "Sleeper") + if (status == "Sleeper" || phase == 0) return else if (status == "Antiresist")//If ordered to not resist if (statusStrength > 0) @@ -295,6 +366,10 @@ return else status = null + if (deltaResist != 0)//So you can't spam it, you get one deltaResistance per tick. + deltaResist += 0.1 //Though I commend your spamming efforts. + return + if(prob(10)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") @@ -335,7 +410,7 @@ //Command staff has authority, if(owner.mind.assigned_role in GLOB.command_positions) deltaResist *= 1.4 - //if(owner.first_name == "skylar"); power_multiplier *= 0.8 //for skylar //I'm kidding + //if(owner.has_status == "sub"); power_multiplier *= 0.8 //for skylar //I'm kidding <3 //Chemists should be familiar with drug effects if(owner.mind.assigned_role == "Chemist") deltaResist *= 1.3 @@ -344,14 +419,17 @@ //Your Thralls are like pets, you need to keep them happy. if(owner.nutrition < 250) deltaResist += (250-owner.nutrition)/100 - if(owner.health < 120)//Harming your thrall will make them rebel harder. + if(owner.health < 100)//Harming your thrall will make them rebel harder. deltaResist *= ((120-owner.health)/100)+1 //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong) //Mental health could play a role too in the other direction //If master gives you a collar, you get a sense of pride if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) - deltaResist *= 0.8 + deltaResist *= 0.5 + + if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) + power_multiplier *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance @@ -360,11 +438,11 @@ var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") if(findtext(message, enthral_words)) if(enthrallID.gender == FEMALE) - message = replacetext(message, enthrallID.real_name, "Mistress") - message = replacetext(message, enthrallID.first_name(, "Mistress") + message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Mistress") + message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Mistress") else - message = replacetext(message, enthrallID.real_name, "Master") - message = replacetext(message, enthrallID.first_name(, "Master") + message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Master") + message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Master") return message /* /datum/status_effect/chem/OwO From 7d567fee633b4e629cf6f4914634937988de97c6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 10 May 2019 02:00:17 +0100 Subject: [PATCH 35/40] MC chem 5.5/6 --- code/modules/surgery/organs/vocal_cords.dm | 203 +++++++----------- .../code/datums/status_effects/chems.dm | 44 +++- .../chemistry/reagents/fermi_reagents.dm | 14 +- 3 files changed, 133 insertions(+), 128 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 96b8ce99e3..95cefbe70c 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -717,7 +717,10 @@ var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue - listeners += L + 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) + continue + listeners += L if(!listeners.len) cooldown = COOLDOWN_NONE @@ -871,7 +874,7 @@ E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. else E.enthralTally += power_multiplier*1.25 - cooldown = 100 + E.cooldown += 1 //REWARD mixable if(findtext(message, reward_words)) @@ -885,7 +888,7 @@ L.adjustArousalLoss(1*power_multiplier) else E.resistanceTally /= 2*power_multiplier - cooldown = COOLDOWN_VTHRAL + E.cooldown += 1 //PUNISH mixable if(findtext(message, punish_words)) @@ -899,7 +902,7 @@ L.adjustArousalLoss(-2*power_multiplier) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) - cooldown = COOLDOWN_VTHRAL + E.cooldown += 1 //SILENCE else if((findtext(message, silence_words))) @@ -911,6 +914,7 @@ C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) else C.silent += ((10 * power_multiplier) * E.phase) + E.cooldown += 3 //RESIST else if((findtext(message, silence_words))) @@ -919,6 +923,7 @@ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) power_multiplier *= distancelist[get_dist(user, V)+1] E.deltaResist += (power_multiplier) + E.cooldown += 2 //FORGET (A way to cancel the process) else if((findtext(message, silence_words))) @@ -927,7 +932,12 @@ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) C.Sleeping(40) to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") - E.phase = 0 + switch(E.phase) + if(1 to 2) + E.phase = -1 + if(3) + E.phase = 0 + E.cooldown = 0 //ATTRACT else if((findtext(message, attract_words))) @@ -935,6 +945,7 @@ 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 @@ -948,6 +959,7 @@ 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 //awoo else if((findtext(message, awoo_words))) @@ -968,7 +980,12 @@ else if((findtext(message, sleep_words))) cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) - C.Sleeping(20 * power_multiplier *) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to 4) + C.Sleeping(20 * power_multiplier) + E.cooldown += 10 + //WAKE UP else if((findtext(message, wakeup_words))) @@ -988,46 +1005,59 @@ cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new trigger!") - return - else - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - if E.mental_capacity > 150 || message == "objective" - var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) - var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) - if ((findtext(trigger, custom_words_words))) - if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) - E.customTriggers[trigger] = list(trigger2, trigger3) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if(E.phase == 3) + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new trigger!") + return + else + if (E.mental_capacity >= 10) + var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) + if ((findtext(trigger, custom_words_words))) + if (trigger2 == "speak" || trigger2 == "echo") + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + E.customTriggers[trigger] = list(trigger2, trigger3) + else + E.customTriggers[trigger] = trigger2 + E.mental_capacity -= 10 else - E.customTriggers[trigger] = trigger2 + to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") else - to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") + to_chat(C, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new objective!") - return - else - user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - if E.mental_capacity > 150 || message == "objective" - var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) - if(!LAZYLEN(objectives)) - return - //Pets don't understand harm - objective = replacetext(lowertext(objective), "kill", "hug") - objective = replacetext(lowertext(objective), "murder", "cuddle") - objective = replacetext(lowertext(objective), "harm", "snuggle") - objective = replacetext(lowertext(objective), "decapitate", "headpat") - objective = replacetext(lowertext(objective), "strangle", "meow at") - E.objective += objectives + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if(E.phase == 3) + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new objective!") + return else + user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") + if (E.mental_capacity >= 150 || message == "objective") + var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) + if(!LAZYLEN(objectives)) + return + //Pets don't understand harm + objective = replacetext(lowertext(objective), "kill", "hug") + objective = replacetext(lowertext(objective), "murder", "cuddle") + objective = replacetext(lowertext(objective), "harm", "snuggle") + objective = replacetext(lowertext(objective), "decapitate", "headpat") + objective = replacetext(lowertext(objective), "strangle", "meow at") + E.objective += objectives + to_chat(L, "Your master whispers you a new objective.") + to_chat(L, "Your master whispers you a new objective.") + if(!L.objectives) + to_chat(owner, "[i]. [O.explanation_text]") + to_chat(owner, "[i]. [O.explanation_text]") + E.mental_capacity -= 150 + //else if (E.mental_capacity >= 150) + else + 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 @@ -1062,76 +1092,38 @@ 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) - - - //VOMIT - else if((findtext(message, vomit_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/carbon/C in listeners) - C.vomit(10 * power_multiplier, distance = power_multiplier) - - //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 + //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 - L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, FALSE, FALSE) - - //BRUTE DAMAGE - else if((findtext(message, hurt_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST) - - //BLEED - else if((findtext(message, bleed_words))) - cooldown = COOLDOWN_DAMAGE - for(var/mob/living/carbon/human/H in listeners) - H.bleed_rate += (5 * power_multiplier) - - //FIRE - else if((findtext(message, burn_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - L.adjust_fire_stacks(1 * power_multiplier) - L.IgniteMob() + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.status = "heal" + E.statusStrength = (5 * power_multiplier) //HOT else if((findtext(message, hot_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(50 * power_multiplier) + L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it //COLD else if((findtext(message, cold_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(-50 * power_multiplier) - - //REPULSE - else if((findtext(message, repulse_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - var/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(L, user))) - L.throw_at(throwtarget, 3 * power_multiplier, 1 * power_multiplier) - - + L.adjust_bodytemperature(-10 * power_multiplier)//This //WHO ARE YOU? else if((findtext(message, whoareyou_words))) @@ -1152,18 +1144,10 @@ cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, user.name), 5 * i) + addtimer(CALLBACK(L, /atom/movable/proc/say, "master"), 5 * i)//When I figure out how to do genedered names put them here i++ - //KNOCK KNOCK - else if((findtext(message, knockknock_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, "Who's there?"), 5 * i) - i++ - - //STATE LAWS + //STATE TRIGGERS else if((findtext(message, statelaws_words))) cooldown = COOLDOWN_STUN for(var/mob/living/silicon/S in listeners) @@ -1226,20 +1210,6 @@ addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) i++ - //HARM INTENT - else if((findtext(message, harmintent_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/human/H in listeners) - addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2) - addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) - i++ - - //THROW/CATCH - else if((findtext(message, throwmode_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/C in listeners) - C.throw_mode_on() - //FLIP else if((findtext(message, flip_words))) cooldown = COOLDOWN_MEME @@ -1247,7 +1217,7 @@ var/mob/living/L = V L.emote("flip") - //SPEAK + //SPEAK (Check what this does) else if((findtext(message, speak_words))) cooldown = COOLDOWN_MEME for(var/V in listeners) @@ -1299,23 +1269,6 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ - //HONK - else if((findtext(message, honk_words))) - cooldown = COOLDOWN_MEME - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25) - if(user.mind && user.mind.assigned_role == "Clown") - for(var/mob/living/carbon/C in listeners) - C.slip(140 * power_multiplier) - cooldown = COOLDOWN_MEME - - //RIGHT ROUND - else if((findtext(message, multispin_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - L.SpinAnimation(speed = 10, loops = 5) - - else cooldown = COOLDOWN_NONE diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 4bb67e3183..8f611e0e15 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -228,6 +228,14 @@ resistanceTally = 0 owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. return + else if (3) + + else if (4) + if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !user.has_reagent("MKUltra")) + phase = 2 + mental_capacity = 500 + mental_capacity -= resistanceTally + resistanceTally = 0 //distance calculations switch(get_dist(enthrallID, owner)) @@ -282,7 +290,31 @@ withdrawalTick++ + //Status subproc - statuses given to you from your Master + if (!status == null) + + switch(status) + if("Antiresist") + if (statusStrength == 0) + status = null + else + statusStrength -= 1 + + if("heal") + if (statusStrength == 0) + status = null + else + statusStrength -= 1 + owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) + + + //final tidying resistance += deltaResist + deltaResist = 0 + if (cooldown > 0) + cooldown -= 1 + else + to_chat(enthrallID, "Your pet [owner.name] appears to have finished internalising your last command.") //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. @@ -360,9 +392,17 @@ /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) if (status == "Sleeper" || phase == 0) return - else if (status == "Antiresist")//If ordered to not resist + else if (phase == 4) + 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 Master 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) - statusStrength -= 2 + to_chat(owner, "The order from your Master to give in is conflicting with your attempt to resist, drawing you deeper into trance.") + statusStrength += 1 + enthrallTally += 1 return else status = null 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 b5b9efb39a..0d6f66c658 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -65,7 +65,7 @@ do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) - message_admins("eigenstate state: [current_cycle]") + //message_admins("eigenstate state: [current_cycle]") ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location @@ -174,9 +174,11 @@ ..() . = 1 +//TODO ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return + //eigenstate END /*SDGF @@ -303,6 +305,16 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //SMR = locate(/datum/reagents in SM) //holder.trans_to(SMR, volume) + //Give the new clone an idea of their character + //SHOULD print last 5 messages said by the original to the clones chatbox + var/list/say_log = M.logging[LOG_SAY] + if(LAZYLEN(say_log) > 5) + recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list + else + for(var/spoken_memory in recent_speech) + to_chat(SM, spoken_memory) + + return //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? From ac8b7be45c23295d50dc56e9a8d37512adde57db Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 10 May 2019 03:10:42 +0100 Subject: [PATCH 36/40] Merges old penis enlargement pills into prexisiting Fermichem ones. (master (#8319) by BurgerLUA) --- code/__DEFINES/DNA.dm | 2 ++ code/_globalvars/lists/maintenance_loot.dm | 2 ++ code/game/objects/items/storage/firstaid.dm | 34 ++++++++++++++++++- .../reagents/reagent_containers/pill.dm | 10 ++++++ .../code/modules/arousal/organs/penis.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 5 +-- .../reagents/chemistry/recipes/fermi.dm | 5 --- 7 files changed, 51 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index aea7d42be6..9b2c196836 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -121,3 +121,5 @@ #define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop" #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" #define ORGAN_SLOT_TAIL "tail" +#define ORGAN_SLOT_PENIS "penis" +#define ORGAN_SLOT_BREASTS "breasts" diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d0506c7dcb..f91843a965 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -108,5 +108,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/toy/eightball = 1, /obj/item/reagent_containers/pill/floorpill = 1, /obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint + /obj/item/storage/pill_bottle/penis_enlargement = 2, + /obj/item/storage/pill_bottle/breast_enlargement = 2, "" = 3 )) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index c795726421..8ea252fca4 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -284,10 +284,42 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/lsd(src) -/obj/item/storage/pill_bottle/aranesp +obj/item/storage/pill_bottle/aranesp name = "suspicious pill bottle" desc = "The label says 'gotta go fast'." /obj/item/storage/pill_bottle/aranesp/PopulateContents() for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/aranesp(src) + +/obj/item/storage/pill_bottle/antirad_plus + name = "anti radiation deluxe pill bottle" + desc = "The label says 'Med-Co branded pills'." + +/obj/item/storage/pill_bottle/antirad_plus/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/antirad_plus(src) + +/obj/item/storage/pill_bottle/mutarad + name = "radiation treatment deluxe pill bottle" + desc = "The label says 'Med-Co branded pills' and below that 'Contains Mutadone in each pill!`." + +/obj/item/storage/pill_bottle/mutarad/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/mutarad(src) + +/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." + +/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/penis_enlargement(src) + +/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." + +/obj/item/storage/pill_bottle/breast_enlargement/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/breast_enlargement(src) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index b5d00d2ba4..85034a34f5 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -214,3 +214,13 @@ if(prob(20)) desc = pick(descs) +/obj/item/reagent_containers/pill/get_belt_overlay() + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch") + +/obj/item/reagent_containers/pill/penis_enlargement + name = "penis enlargement pill" + list_reagents = list("PEenlager" = 10) + +/obj/item/reagent_containers/pill/breast_enlargement + name = "breast enlargement pill" + list_reagents = list("BEenlager" = 10) diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 4dfef831b6..c653fafc57 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -4,7 +4,7 @@ icon_state = "penis" icon = 'modular_citadel/icons/obj/genitals/penis.dmi' zone = "groin" - slot = "penis" + slot = ORGAN_SLOT_PENIS w_class = 3 can_masturbate_with = TRUE masturbation_verb = "stroke" 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 0d6f66c658..cc041b4305 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -580,11 +580,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /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." //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? + 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 - taste_description = "a salty and sticky substance." + taste_description = "chinese dragon powder" overdose_threshold = 12 metabolization_rate = 0.5 + //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index ced69baf42..c5b48306d4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -54,11 +54,6 @@ InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal -/datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) - var/location = get_turf(holder.my_atom) - var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list - E.location_created = location - /datum/chemical_reaction/BElarger name = "" id = "e" From cb0e50be0a2af533fa2ad19708e7f6f09747f545 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 10 May 2019 03:12:28 +0100 Subject: [PATCH 37/40] Missed / in last pr --- code/game/objects/items/storage/firstaid.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 8ea252fca4..26322c3b44 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -284,7 +284,7 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/lsd(src) -obj/item/storage/pill_bottle/aranesp +/obj/item/storage/pill_bottle/aranesp name = "suspicious pill bottle" desc = "The label says 'gotta go fast'." From 29d4a2fddee359b35cf631bf515d63743f09bdc4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 00:14:04 +0100 Subject: [PATCH 38/40] Finished MCchem, now to fix compling errors. --- code/datums/components/mood.dm | 6 +- code/game/objects/items/storage/firstaid.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 369 ++++++++++-------- icons/mob/screen_gen.dmi | Bin 113633 -> 113920 bytes .../code/datums/mood_events/chem_events.dm | 10 +- .../code/datums/status_effects/chems.dm | 170 +++++--- .../chemistry/reagents/fermi_reagents.dm | 48 ++- 7 files changed, 372 insertions(+), 235 deletions(-) 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 77450b6ac30be172ccbebe5c19448db850a5cc0e..14f5540f389fa2e201ee556a061beff21225a4c3 100644 GIT binary patch delta 4343 zcmZ8jc|6qLyC239$sSp<%Tl&vH&i4`NkSr`EM*%@$~qsr6e1$oWgii0CJf_iERj%_ z31bE$$~I#e%P`#0?|bj--h2M|oO7Pf^E~HS&-=`5vqVu@(qw?DFdO^F#_mB60w4K5 zegyRcfkN`Wh=Qew5~;(tVS#2ugQ%CRcDPx=#Hy0iMAO^FL*V;a%w90UN9wk-BI#* z!CJ3zX*j8mmB3lYz=M-_#%arG_@?{ z<<->bTNHk-7tXC_LV!wX$-f$tn~EqD;^Q>X)pN$@KEUeyN+ z9pD^k0>Rx(rG|zjhn4dQ22FI|Rf2~?;7jA_zYM50A$+$5(T{dcX2Zt0+NYG07`$A+ zi6zaI2ADd!Bfi)PjWt|KDerdeV-Nqnz0Pu8_(f^SPi_RelQ27%Jo*dw(>t{~oc}x@ zdV7Dk_!S>eWw;sqNM!pd=4^8W>*VnYL+P>RW}zfPkQ$|o-m=OojwC8 zD}`)EoKo;o%)24?P_gvAhfaJWkx7nS)-$u5V?=1Qog` zb^2oLa`JOaxlVg8z5=VR_mpRf{5tJ&nfr3a&%Wa;<%xStk&=ggsdX@{`pm}q;TcI2 z?+=307L~Hx#iBA5>?M=?N~%miQ?oRir7EQ)Z^GZqc+iEjbz#UH2S4@&;-&HtLb-VM zQc(tHEGhw>1rsVVB|N_ocDb_)Kx#&5H{06iV2jJ8)QJyMh1&SUE)>IxuLtoU&#{0swwZ-A8=bi7oqi25x!I zJM@@WaMO_0>mNN)wePcNxI0xd+68weAr{Pw->yX(+vl}rTUy@{K7}JS{|XA-tsm1t z<=z8Q_O#trOc&e;iVm!7xSVT0s2>^=15fw&A#`}U_S4iU8CSxO?d@N=D^iaUt(_#2EN z>A@|DI#9%HXVOdD0VD6$LV%vfA+yW~<6N&Q2i6M_=eyv^E+W$ucciEik~qtb zr*~Tkme$O55+~X@rnVAQWFwX;VUFHDiGIjLW!Z=xCz=52fJ}Wyq`uRL+OzdelGpvi zfPM-EiXR@Alra7R_~gwwmxYvH8Jh zvYK42eh`qXmO*GrEk!oY5Y-yJ_h3pJc%=q@#svKjad08JD@i6HXg;>sgA8Moz>o1& z%znx>*_th#$g?O43}mXR*%d^ZtDVq5raD}|x8vNr-jtqeXD${WoV(|wbnX!xwsBOr zsY@@tLH88#PglUu_&Aa(4S5O6#YYaV5of_JP<2CW+ov|Sxk`{)r-5eb)VT;Gai+gc z;K279jGPsSKh{OQ*(etrFr$1%j?f{8KFrTLUXNoM6hMD^Qn))=DZ}!FI>5!M zb!$S^Z;D#87IHY9ikCIX4lCC#|a%vWZBh`9oPE$n;NA=f(9D4>Dyv#7nJ<6(L& zw-lH71eUR1wS&?GldBcih~g6Ms|2%#sTo33Q!}Sm1lse(3?j&V%>FGK;`zs59h${T&z` zr6|zr&WCk@iL-W)q8C8>tt2lLOr9Q?`W*AHG75dnx2Bnoho|*g4am}XMNlIO>>(a< zmgK0Q(lS8tlVkChl3Fx2aon<$UGLbrVr*=D`pjAh0Ft7Q63Y&{41J84a7-V~#=ax# zcAKPo+U~(Gv!f9!owC5d#8}U9d&BU623OjXWhRg8+yd*UCcgW6T2kB#-O5_~dv%0^ zv?<(?G(#Nh*sYlDf9h8ghz&}0t4g7=A*6!e-r5J(@i;--r`*}ot=>{o{`;Y@lPnzk zwSP`@@S^yLJ;JG2k3%p<^`mdsS(y;7aubnMmD~OAql{PsfbJ)BLl;$x8F%&sEfv`C ze8dz6Z9{LC=|rT~$9Qt%U!rICwq{;#P9%Ff$87WE5PCnnnw|=p_ro+@RhI_!OVq-J z3+Q(9qPEeH@BXW6Df*y`-@bVtpP_qjmJJU!{Gyq6mT;C)H8!M@d*E+OPM`4yWs_F` z4!q^=xQ3GC-43LBh~Bq;gHhfN*$BN@zC0hdTnrm$kv# zJUl$XZ`yBJrMdxI%m?MJ&LSiJwbj2qT^jMyC~bg8-z)5^EwO`lA=<3jdvR9N*u+p@ zt8ij9#)q;(XOGg;dE^F;?r#x zMRIsE>#bAQQdZw&UOvit-LxnaQ9%!?!~9VxN7&^b@w&%Y@aJ>48~_ z{wmRv^z7NQ-@kahI76yzx@bT6K=>mEx8kd_64#1Qsp`bl*ZzOF04rxMTP3b{4$B+M z;A|o=djDRlgIEv^8CJ18&Z^vlT+KAH{fhZ%U+dD?z}Ozn-dA7)RC?*qLw2)*jlaFD zLNCKCEWz7T!tm92q6*S8_Nx2VW6}x!nqL~2CdK&&^2g+O+2DtIrXtT#XI?vX&EMTL zR6Uj8N_i{?X7Xku^y0V`gErE!tc#GTsaQbaF@|>Onx_OIW06&Ht>y;Z;Z3L6T<$3< zdZW?X?o*3Rb+Z_2|A&LHP6L1B0W=)m8@t}T6d+Mx;GYA#&xPNz%kZinq-eXa1Q6Yz zr3OB9YTd(0$Ln+$b$SV2+l4Rj9rMm#_{nIk-T|m`+e=|6 z;xhQ@(xG4XuCT2)1ZbuJazRFIw=5rTM_aUWhNsda`|MhASUYV#iZ!1{ES?}rE>iD! zN6rO{JvIs9hXu9EW-curvOGcLFhQ;!B`r8wahh&fkwfT9!Ekuez_zw5@BE?u5or!$ zQbM^YpWxbt#d`s>WlK93jdnQK3yPNCpV1{4(S=9YBEUQ125s*8o1tmzus=!Aq10xP zd4ge^dql>z-=jO{WFljqj7+I!*GBkN>X1nH6v`tpp>)DGN~^eAjX+k!-{16`W5|9h zG%c{PVOHd$k+0cNbVno^ZQI>9UET!2NNnCf{WN53Xeo~n-cdQ~RmneGu+TbS`}~jn z6O4^{v4j1(J}G#B1aa;C{g3LxKK`$Dy~z@d)daM^dF$G$%k(b3%=+XZ^=n}1B64c{ zc*V%?@IA)CZJ3pF&%St}aW!nxUB$Ax70scUz^yuYqkz_Xab`lWzNV0VVL;Hpu5IPE z&;C}1=_s@%=t1@P zMB1N|2?%NF3ia4hNC>h$n`S6q_n5^cAtG&qbh1|e~!<8g^U=Q8p;qKnU;a_*+sXgrs{it<;O6DtJ|CABJ@1wZNtViF{ zoD^-}lj$GnZJ3^!%ID2+iy_3|0fH1K^l5wY(VxDB?v4HGQPPU$T4x*I{KmeQ�%Q zk}OR6*sr^JD{>cG1#vptlLwNTS!b93a|DkUN3jjU{pvNq)8cs~JnZPH*ffgTmGoTv z_hF^&f+*R{Yw~6etV+K9B9fjN(@uLDOaDDkg7PKbUkNp4asz4kI0IyGh3M{#g-Y)0 zlP=>pFTC$^5nUhM4XHrE5NWZhnDFZc>Hj`Iao+1maiq_1!sY7etzNm_<%v{){QezP z$!*aLyT;&cB(|IOzgeMn=%Y(zpE>Nv0jK?esE14eKO*v>)zTvxW#?C3Pc}fS1gTdFT2G27d=j& A4FCWD delta 4054 zcmZ8jc|4R|8y<~)Ermoxi4>yjTh_8uLe?ZHj3JC=+<}Wx8F0U z7YG!X)&IWVOF)@DY;fnE@gxczC+;&U7_!{nCfZud_NSsXhdx+00g7bhuHCdGR6JAQJ##MR%yOq}z@ z+7{`eYqt#`g+jLscB>CzCs#UxO|g|3X5s=-VP7eH3-%^sn&N9K9inY{wpMQ@<_tVd zhWzrkZoiipSJyAsqfehdT>3HhjBa~^^kbA|9#7e^{GO4UmiFV8mtbW#g!%31Vg$k@ zzOo@|Za_#kc9@dc&GEXB%%T*stTueMHqjhsW>F5f`Cn=0t;@tAAH!Rxy99V(QcDSo z4wJmv)-x@}2^NEXbB|0X(^0PSpWXb`RV$}%BUzzyzgGD;Fmofo4%i!Q^eD{Mrs}q+ z@-x8^tM^is_oHe&%?pZs(kt5?|1>v+$99SqODG`9w9}&6!96l^9S*4;@j4Zv)gQ+F zJ}m&ct8p#Tka?jA8)Pm0^Jdk&#k+}>L^~Y=N8BxikQl?8>y=G)blC3m^Jllu4z-0vVuPp}JEIZ3|f7QnLYY9n9PPtB%SaxUB@P~H6mnr)h zoz6XS`ix55XV3je;*v$cg8Drqe!0iYlf$siUL|@vl_^KI z$^T!#?tOi*{EcFyY-!UxZphE>smiGNwdtmK5>F`QkKHD_T2AS-dL~fHkW#6MW8SSRvg@HlX>S*2lpabR^C3MxUA}V(}JIQh0(T(cvTG zU7feCswn+i0`v|w-#f#rQWx}&B6egXPH66ERjs&SBkeBqe@KK_xDV;MSh8Nyd2BLS zEfh9W$h{4dRVkQ#8kIHMcm67t0%q^Jq2nZW>xstsY~=uZ-1D*C^lU!90EG9FX*%$k z&EtzDCc6-ODO;EXkx4R;@Too~gh4K>TOtwe%IkI?JpDXK^4kEq6@lj6liVUlQp*-Rs{s zCafvNrR~6Iy9O&Zs*7G5z#AzRUn6HLt=BL5F1Fn$@C|fQ4@T@OJt5v%`ZXo_lb&U2 z!t>|h;sX2PWt$X;hv;jv(ST<(u?{t(T|xk@pOl7Nxy%1KrNKhVHSzTqV2{IQ2E=Y3 zj_>0dr{Xsfv+*kEAT+n#{wo2ZX46r}i=&AYx{%KvWR5$6nJ4}-5N@~)gshTJCssHm z;AEE+FXZuFa5B6y=w6F}P>7-ftbyE85)nFIz0EG|CKYgtabXsV^w>E$z&b-8O3Z~9 zRX`v>0&=3_*LFsU21_xZ?a&#zcDseD+1jY7{1}-Q?KFiI7rFn5tM+hRe#c`4KRS*w z(=IUwtw-m+Q#+U|4`nNU*^8vM2TWn1BKJwIemdH9?-0bgV9azOtD_!c7*9jCjFaK6 zf(5k}H_kfkDC1zb8{fDm6?imD?dqU*Jq1Cn%Ea=Q3z-h^%|KBqbq2J42nEq{a?6EB zZHrGJTx~oxjrTW@%9p#)#^k9f!4w^}8F%Et2$=|FmSlf&cUJ;^zTH^k0HH?zh0{LN z9_<)5VkKtS8TmeNmnDe#(F(uDSrtzVNQ_Hk|D4W($nNSeF3^7+vdxk({S5COLZ{cBupuSNoPHhhml{yKQxW3v4s>}|)@e!h#N>VJ)QOj&Bo z(_JR-!lbmOUQFF&8RzbhdJ=(tNAJlpHwGjBdWpWb`4f_Yj4B_H$+c3O7}}QF2HH&! z&@hT{+rC*7MHo9gyjfHw{9rHFBxwh{lwprtBVx&l9+{ePTNLt6_7JpLK4xM9xG6+b z|1xj8#O~di!RJ_bY;|GADh>4Ca%qT);sFWCLEdCV z>RUnF(jGjBdcBaz{sg+QXF3)x-dCqEXz;pNc$@oFP5VBVUXh9lpwdEr4i#qLZAKvM z*#k1=!p#g~D0nbzqmxHhhvC5FPQ|LJu5NYaI9*oETR!+ zV|>NBJEld`Z#JW2VqzpLiWR90Cr{Drx7hJ8%~&3R#6@XlXg+B-?3AJA7LZ^a)&ZO2 zJ{=E`HyOtUP2vC$}>2Z>?Wa z4!>+f&Cl?bzOXQ1@?pX6cgk^eIq{9<=9)KoDKHz6OyhFgl^l`#T*-H5(Q~ez$6Fg( zegcI)+saBMs4M(D8^-2q1#+aW7JoSjXvhYc8j)I*f-7dH`li@GRwosC+I{cM+rA7~ z`t~i#*X&6YosHI%rM#Nv3r8c8#=)V@*LpWaHV{Z1b5a^{BkVLSQZY$yP#WnsC*CWv z-v6SAeLGq;u(7|d`8s#ISV&_8dh*?S=O1iqU#$Q8Ta_8kL8>P^M=Mhu>3Y?GUW9|1$cDRgIxY6D~n=I``{m zF5|ZRMI58WXPnOkH1F;nxL*Fp8hLySXL~VQm^tJ{y2q>IygZNs*I8n!Cj1DPo0%pB zOY2Ed23LLqZ&xXsE#<99WjrpD>N2f*xv1KO(8JISy%yo;rA~4isrO$O=)IunuaQc= zSMYJjr$L6~reaFbip%O~O<|i_N~VE7P5X=Qr$fGnJ7c{07XmFe40mV|???8gcDXzy z4mHT?Xf{5maH?Z}P766E29{>-+uFN$ZX*o|fJw-gBS`f#CALDHUwas(;x*b)_ambJauvS;Inb0kU>C)iy!iw*fBd|jewJ!b>( z3wtOvtC}r*%Rf|PYwsBG%;yg*!>FUi>u4|Q#@@w@C7)K-HR$biFlF@!R-2(#>KQ1+ zG`9jyTM-{1{PvVDPH9k209&23zUYv&SK+$%sw$t>JJDpfsm58sbsX?hH0%9*f5vqQ zT=msE2?1Fz2#(a5vbxX1ddj5jdr=Lbye6)pI{pET@&t)wr+S8CzFx1CUONvjh?(g`n5NZ4?a{ROi_H?G zH~zQBzCPG!CFlr)vF*9Zu|%6vJw^eNDy{6FovYS?7?>Tq@QT@zE^Ro%c|d;O*rr$S z=u1@SQpStRvBAyp?pNmFc%pqx@+((G<1%^oZ#*;G$AeMFPT&Q39$S%%zWeTF15R1Y zYBP=Y<+Dye(8=Px-#2OXh&&*f6aM14t_s-f&TrqrLO)LZsMFX*J#=BFLs1tNk!N1x zpk0-rp?ggm2mRuC8ry%+NCs4BmB#UrNdD9+MB^kHe5SB#xeaWtuD7@DB5bypfiNMi%XBT#iXDP`bKN3lkB9PS}I%noq zv!fz!3*DM)-;d=hjX!^1npO29XZk-E1!%y!k(`9~2OLa&Oi(lnZtp_`I+NaqU;e3F zpz7ksL64#{Kf1q1dxneA`}i`+rYour 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 From 6466ef562c36b3ed5a19d13c36749a944b978c1f Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 02:05:25 +0100 Subject: [PATCH 39/40] 100 down, 66 to go. --- code/datums/components/mood.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 157 +++++++++--------- .../code/datums/status_effects/chems.dm | 53 +++--- .../chemistry/reagents/fermi_reagents.dm | 29 ++-- .../reagents/chemistry/recipes/fermi.dm | 8 +- 5 files changed, 128 insertions(+), 121 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 2660aaabc0..01162889fd 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -118,7 +118,7 @@ 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? + else if (owner.has_status_effect(/datum/status_effect/chem/enthrall))//Fermichem enthral chem, maybe change? screen_obj.icon_state = "mood_entrance" else screen_obj.icon_state = "mood[mood_level]" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 5a1a06f954..887653f63e 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -621,7 +621,7 @@ var/next_command = 0 var/cooldown_mod = 1 var/base_multiplier = 1 - //spans = list("say","yell") + spans = list("say","yell") /* /datum/action/item_action/organ_action/colossus @@ -670,13 +670,13 @@ */ /obj/item/organ/vocal_cords/velvet/handle_speech(message) - var/cooldown = velvetspeech(message, owner, spans, base_multiplier) + velvetspeech(message, owner, spans, base_multiplier) return //velvetspeech should handle speech /obj/item/organ/vocal_cords/velvet/speak_with(message) - var/cooldown = voice_of_god(message, owner, spans, base_multiplier) + velvetspeech(message, owner, spans, base_multiplier) next_command = world.time + (cooldown * cooldown_mod) ////////////////////////////////////// @@ -706,14 +706,14 @@ var/mob/living/list/listeners = list() for(var/mob/living/L in get_hearers_in_view(8, user)) if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) - if(L.has_status_effect(/datum/status_effect/chem/enthral))//Check to see if they have the status + if(L.has_status_effect(/datum/status_effect/chem/enthrall))//Check to see if they have the status if(L == user && !include_speaker) continue if(ishuman(L)) var/mob/living/carbon/human/H = L 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 + 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. continue listeners += L @@ -757,6 +757,7 @@ message = get_full_job_name(message) for(var/V in listeners) + var/mob/living/L = V if(dd_hasprefix(message, L.real_name)) specific_listeners += L //focus on those with the specified name //Cut out the name so it doesn't trigger commands @@ -780,9 +781,9 @@ //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP, power is judged internally on a thrall, so shouldn't be nessicary. message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) - var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/T = user.getorganslot(ORGAN_SLOT_TONGUE) if (T.name == "fluffy tongue") //If you sound hillarious, it's hard to take you seriously. This is a way for other players to combat/reduce their effectiveness. - power_multiplier*0.75 + power_multiplier *= 0.75 /* CHECK THIS STUFF IN THE CHEM STATUS INSTEAD. if(istype(H.neck, /obj/item/clothing/neck/petcollar)) @@ -795,7 +796,6 @@ 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") //phase 0 var/static/regex/saymyname_words = regex("say my name|who am i|whoami") var/static/regex/wakeup_words = regex("revert|awaken|*snap") @@ -838,20 +838,20 @@ if(findtext(message, enthral_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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values - if(message.len > 50) - E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. + if(length(message)) + E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word. else - E.enthralTally += power_multiplier*1.25 + E.enthrallTally += power_multiplier*1.25 E.cooldown += 1 //REWARD mixable if(findtext(message, reward_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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values if (L.canbearoused) @@ -866,7 +866,7 @@ 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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values if (L.canbearoused) @@ -882,13 +882,13 @@ 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 + addtimer(CALLBACK(L, /atom/movable/proc/say, "Master"), 5)//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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(0) E.phase = 3 @@ -900,9 +900,9 @@ //SILENCE else if((findtext(message, silence_words))) 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] - if L.phase == 3 //If target is fully enthralled, + 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) else C.silent += ((10 * power_multiplier) * E.phase) @@ -912,7 +912,7 @@ 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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) E.status = "Antiresist" E.statusStrength = (1 * power_multiplier * E.phase) E.cooldown += 6//Too short? @@ -920,15 +920,15 @@ //RESIST 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] + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) + power_multiplier *= distancelist[get_dist(user, C)+1] E.deltaResist += (power_multiplier) E.cooldown += 2 //FORGET (A way to cancel the process) 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) + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) C.Sleeping(40) to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") switch(E.phase) @@ -942,6 +942,7 @@ else if((findtext(message, attract_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) L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) E.cooldown += 3 @@ -950,15 +951,15 @@ else if((findtext(message, orgasm_words))) for(var/V in listeners) var/mob/living/carbon/human/H = V - var/datum/status_effect/chem/enthral/E = H.has_status_effect(/datum/status_effect/chem/enthral) + 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.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthralTally += power_multiplier + E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthrallTally += 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 + 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 @@ -967,28 +968,30 @@ //awoo else if((findtext(message, awoo_words))) for(var/V in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) var/mob/living/M = V - M.say("*awoo") + H.say("*awoo") E.cooldown += 1 //Nya else if((findtext(message, nya_words))) for(var/V in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) 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!") + H.emote("me","lets out a nya!") E.cooldown += 1 //SLEEP else if((findtext(message, sleep_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) + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) C.Sleeping(20 * power_multiplier) @@ -997,14 +1000,14 @@ //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) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY)//Tier 2 only E.phase = 1 - var/items = M.get_contents() + var/items = H.get_contents() for(var/I in items) - M.dropItemToGround(I, TRUE) + H.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 @@ -1012,7 +1015,7 @@ 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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY)//Tier 2 only if(L.m_intent != MOVE_INTENT_WALK) @@ -1023,7 +1026,7 @@ 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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY)//Tier 2 only if(L.m_intent != MOVE_INTENT_RUN) @@ -1034,7 +1037,7 @@ 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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 2 only L.Knockdown(20 * power_multiplier * E.phase) @@ -1045,54 +1048,54 @@ //STATE TRIGGERS else if((findtext(message, statecustom_words))) for(var/V in listeners) - var/speaktrigger =="" + var/speaktrigger = "" var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + 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 (trigger in E.customTriggers) + for (var/trigger in E.customTriggers) speaktrigger = "[trigger]\n" L.say(speaktrigger) //CUSTOM TRIGGERS else if((findtext(message, custom_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) + 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 == 3) - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new trigger!") + 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!") return else if (E.mental_capacity >= 10) - var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) - var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) + var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) if ((findtext(trigger, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) - E.customTriggers[trigger] = list(trigger2, trigger3) + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + E.customTriggers[trigger] = list(trigger2, trigger3) else E.customTriggers[trigger] = trigger2 E.mental_capacity -= 10 else - to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") + to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else - 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_chat(user, "Your pet looks at you with a vacant blase expression, you don't think you can program anything else into them") //CUSTOM OBJECTIVE else if((findtext(message, objective_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) + 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 == 3) - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new objective!") + 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!") return else - user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote("me", "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") if (E.mental_capacity >= 150 || message == "objective") - var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) - if(!LAZYLEN(objectives)) + var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) + if(!LAZYLEN(objective)) return //Pets don't understand harm objective = replacetext(lowertext(objective), "kill", "hug") @@ -1100,16 +1103,15 @@ objective = replacetext(lowertext(objective), "harm", "snuggle") objective = replacetext(lowertext(objective), "decapitate", "headpat") objective = replacetext(lowertext(objective), "strangle", "meow at") - E.objective += objectives - to_chat(L, "Your master whispers you a new objective.") - to_chat(L, "Your master whispers you a new objective.") - if(!L.objectives) - to_chat(owner, "[i]. [O.explanation_text]") - to_chat(owner, "[i]. [O.explanation_text]") + H.objective += objective + to_chat(H, "Your master whispers you a new objective.") + if(!H.objectives) + to_chat(H, "[LAZYLEN(H.objectives)]. [H.objectives.explanation_text]") + to_chat(H, "[LAZYLEN(H.objectives)]. [H.objectives.explanation_text]") E.mental_capacity -= 150 //else if (E.mental_capacity >= 150) else - 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_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") //I dunno how to do state objectives without them revealing they're an antag @@ -1118,7 +1120,7 @@ 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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only E.status = "heal" @@ -1130,7 +1132,7 @@ if(findtext(message, stun_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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only L.Stun(30 * power_multiplier) @@ -1140,7 +1142,7 @@ else if((findtext(message, hallucinate_words))) for(var/V in listeners) var/mob/living/carbon/C = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) @@ -1149,7 +1151,7 @@ else if((findtext(message, hot_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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it @@ -1159,7 +1161,7 @@ else if((findtext(message, cold_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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only L.adjust_bodytemperature(-10 * power_multiplier)//This @@ -1170,7 +1172,7 @@ else if((findtext(message, getup_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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only if(L.resting) @@ -1184,7 +1186,7 @@ else if((findtext(message, pacify_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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only E.status = "pacify" @@ -1194,7 +1196,7 @@ 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) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only E.status = "charge" @@ -1292,15 +1294,12 @@ i++ */ - else - cooldown = COOLDOWN_NONE - 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", "Velvet_voice", 1, log_message) - return cooldown + return #undef COOLDOWN_STUN diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 18281da27b..0d59646e28 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -172,7 +172,6 @@ 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/mental_cost //Current cost of custom triggers var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 @@ -182,6 +181,7 @@ 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) + var/cooldown = 0 /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) if(M.ID == enthrallID) @@ -189,6 +189,7 @@ 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. + var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) @@ -243,7 +244,7 @@ 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")) + if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !M.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 E.customTriggers = list() @@ -268,17 +269,17 @@ var/withdrawal = TRUE //chem calculations - if (user.has_reagent("MKUltra")) + if (M.has_reagent("MKUltra")) if (phase >= 2) enthrallTally += phase else if (phase < 3) - resistance += 10//If you've no chem, then you break out quickly + deltaResist += 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 || phase == 4) - if (user.has_reagent("mannitol")) + if (owner.has_reagent("mannitol")) mental_capacity += 1 - if (user.has_reagent("neurine")) + if (owner.has_reagent("neurine")) mental_capacity += 2 //Withdrawal subproc: @@ -306,8 +307,8 @@ owner.jitteriness += 20 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) + 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 Master.") if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? @@ -391,10 +392,10 @@ //M.adjustStaminaLoss(-5*REM) //final tidying - resistance += deltaResist + resistanceTally += deltaResist deltaResist = 0 if (cooldown > 0) - cooldown -= 1 + cooldown -= (1 + (mental_capacity/1000 )) else to_chat(enthrallID, "Your pet [owner.name] appears to have finished internalising your last command.") @@ -418,18 +419,18 @@ /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner - for (trigger in customTriggers) - if (trigger == message)//if trigger1 is the message + for (var/trigger in customTriggers) + if (trigger == message)//if trigger1 is the message //Speak (Forces player to talk) - if (customTriggers[trigger][1] == "speak")//trigger2 + if (customTriggers[trigger][1] == "speak")//trigger2 C.visible_message("Your mouth moves on it's own, before you can even catch it. Though you find yourself fully believing in the validity of what you just said and don't think to question it.") - (C.say([customTriggers[trigger][2]]))//trigger3 + (C.say(customTriggers[trigger][2]))//trigger3 //Echo (repeats message!) else if (customTriggers[trigger][1] == "echo")//trigger2 - (to_chat(owner, customTriggers[trigger][2]))//trigger3 + (to_chat(owner, customTriggers[trigger][2]))//trigger3 //Shocking truth! else if (customTriggers[trigger] == "shock") @@ -501,25 +502,25 @@ else deltaResist *= 0.2 //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. - if (user.has_reagent("mannitol")) + if (M.has_reagent("mannitol")) deltaResist *= 1.25 - if (user.has_reagent("neurine")) + if (M.has_reagent("neurine")) deltaResist *= 1.5 - if (!H.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) - if (user.has_reagent("anaphro")) + if (!owner.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) + if (owner.has_reagent("anaphro")) deltaResist *= 1.5 - if (user.has_reagent("anaphro+")) + if (owner.has_reagent("anaphro+")) deltaResist *= 2 - if (user.has_reagent("aphro")) + if (owner.has_reagent("aphro")) deltaResist *= 0.75 - if (user.has_reagent("aphro+")) + if (owner.has_reagent("aphro+")) deltaResist *= 0.5 //Antag resistance //cultists are already brainwashed by their god if(iscultist(owner)) deltaResist *= 2 - else if (is_servant_of_ratvar(user)) + else if (is_servant_of_ratvar(owner)) deltaResist *= 2 //antags should be able to resist, so they can do their other objectives. This chem does frustrate them, but they've all the tools to break free when an oportunity presents itself. else if (owner.mind.assigned_role in GLOB.antagonists) @@ -551,14 +552,14 @@ deltaResist *= 0.5 if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) - power_multiplier *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. + deltaResist *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance -/datum/status_effect/chem/enthrall/proc/owner_say(mob/living/carbon/M) //I can only hope this works +/datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") - if(findtext(message, enthral_words)) + if(findtext(message, owner_words)) if(enthrallID.gender == FEMALE) message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Mistress") message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Mistress") 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 ebef9087e4..f0bccabe49 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -308,10 +308,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Give the new clone an idea of their character //SHOULD print last 5 messages said by the original to the clones chatbox var/list/say_log = M.logging[LOG_SAY] - if(LAZYLEN(say_log) > 5) - recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list - else - for(var/spoken_memory in recent_speech) + if(LAZYLEN(say_log) > 5) + var/recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list + else + for(var/spoken_memory in recent_speech) to_chat(SM, spoken_memory) @@ -749,6 +749,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //addiction_threshold = 30 //addiction_stage1_end = 9999//Should never end. var/creatorID //add here + var/creatorGender + var/creatorName /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) ..() @@ -760,22 +762,25 @@ 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.") + to_chat(M, "You feel your vocal chords tingle as your voice becomes more sultry.") else M.apply_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + E.enthrallID = creatorID /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) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) 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.add_trait(TRAIT_PACIFISM, "MKUltra") + if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) 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].") + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + E.enthrallID = creatorID + to_chat(M, "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 @@ -817,7 +822,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") + to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(21) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO @@ -834,7 +839,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") + to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") ..() /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index c5b48306d4..f40792c849 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -126,6 +126,8 @@ /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - var/enthrallID = B.get_blood_id() - var/datum/reagent/fermi/enthral/E = locate(/datum/reagent/fermi/enthral) in holder.reagent_list - E.enthrallID = enthrallID + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list + E.creatorGender = B.["gender"] + E.creatorName = B.["real_name"] + var/enthrallID = B.get_blood_data() + E.creatorID = enthrallID \ No newline at end of file From 6a17d66323fafaf7a0c7224ae7cdbed0eac2af84 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 14:04:43 +0100 Subject: [PATCH 40/40] Should be most compiling errors fixed outside of outdated merge problems --- code/modules/surgery/organs/vocal_cords.dm | 11 +- .../code/datums/status_effects/chems.dm | 122 +++++++++--------- .../chemistry/reagents/fermi_reagents.dm | 25 ++-- .../reagents/chemistry/recipes/fermi.dm | 11 +- 4 files changed, 88 insertions(+), 81 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 887653f63e..6700acc201 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -677,7 +677,7 @@ /obj/item/organ/vocal_cords/velvet/speak_with(message) velvetspeech(message, owner, spans, base_multiplier) - next_command = world.time + (cooldown * cooldown_mod) + //next_command = world.time + (cooldown * cooldown_mod) ////////////////////////////////////// ///////////FermiChem////////////////// @@ -972,7 +972,6 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - var/mob/living/M = V H.say("*awoo") E.cooldown += 1 @@ -994,8 +993,8 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - C.Sleeping(20 * power_multiplier) - E.cooldown += 10 + C.Sleeping(20 * power_multiplier) + E.cooldown += 10 //STRIP else if((findtext(message, strip_words))) @@ -1071,7 +1070,7 @@ var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) if ((findtext(trigger, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN) E.customTriggers[trigger] = list(trigger2, trigger3) else E.customTriggers[trigger] = trigger2 @@ -1083,7 +1082,6 @@ //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) - cooldown = COOLDOWN_DAMAGE 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) @@ -1127,7 +1125,6 @@ E.statusStrength = (5 * power_multiplier) E.cooldown += 5 - var/i = 0 //STUN if(findtext(message, stun_words)) for(var/V in listeners) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 0d59646e28..319f69e664 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -167,14 +167,17 @@ 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/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 //status effects var/statusStrength = 0 //strength of status effect - var/enthrallID //Enchanter's name/ID + var/mob/living/master //Enchanter's person + var/enthrallID //Enchanter's ckey + var/enthrallGender //Use master or mistress + //var/mob/living/master == null var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. - var/mental_cost //Current cost of custom triggers - var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 + //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 @@ -184,7 +187,7 @@ var/cooldown = 0 /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) - if(M.ID == enthrallID) + if(M.key == enthrallID) 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 @@ -194,10 +197,27 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) + + //chem calculations + if (owner.reagents.has_reagent("MKUltra")) + if (phase >= 2) + enthrallTally += phase + else + if (phase < 3) + deltaResist += 5//If you've no chem, then you break out quickly + if(prob(20)) + to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.") + if (mental_capacity <= 500 || phase == 4) + if (owner.reagents.has_reagent("mannitol")) + mental_capacity += 1 + if (owner.reagents.has_reagent("neurine")) + mental_capacity += 2 + + //mindshield check if(M.has_trait(TRAIT_MINDSHIELD)) resistanceTally += 5 if(prob(20)) - to_chat(owner, "You feel lucidity returning to your mind as the mindshield attempts to return your brain to normal function.") + to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") //phase specific events switch(phase) @@ -212,42 +232,38 @@ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 to_chat(owner, "Your conciousness slips, as you sink deeper into trance.") - continue - if (resistanceTally > 100) + 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!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. - 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.")].") + to_chat(owner, "[pick("It feels so good to listen to [master.name].", "You can't keep your eyes off [master.name].", "[master.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [master.name]", "[master.name] is so sexy and dominant, it feels right to obey them.")].") else if (2) //partially enthralled if (enthrallTally > 150) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 - 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) + to_chat(owner, "Your mind gives, eagerly obeying and serving [master.name].") + to_chat(owner, "You are now fully enthralled to [master.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 [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot server 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 resistanceTally = 0 - 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].") + to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master.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.") + 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.") else if (4) //mindbroken - if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !M.has_reagent("MKUltra")) + if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 - E.customTriggers = list() + 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 @@ -256,38 +272,24 @@ //distance calculations - switch(get_dist(enthrallID, owner)) + 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(enthrallID, owner)+1] - var/withdrawal = FALSE + enthrallTally += distancelist[get_dist(master, owner)+1] + 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 (M.has_reagent("MKUltra")) - if (phase >= 2) - enthrallTally += phase - else - if (phase < 3) - deltaResist += 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 || phase == 4) - if (owner.has_reagent("mannitol")) - mental_capacity += 1 - if (owner.has_reagent("neurine")) - mental_capacity += 2 + withdrawal = TRUE //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(prob(10)) - to_chat(owner, "You're starting to miss your Master/Mistress.") + to_chat(owner, "You're starting to miss your [enthrallGender].") if(prob(10)) owner.adjustBrainLoss(0.5) to_chat(owner, "They'll surely be back soon") //denial @@ -298,7 +300,7 @@ 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.") + 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(-2) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? @@ -309,11 +311,11 @@ if(prob(30)) 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 Master.") + to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your [enthrallGender].") 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.") + to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore.") if(91 to 120)//depression if(prob(20)) owner.adjustBrainLoss(1) @@ -324,12 +326,12 @@ 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.") + to_chat(owner, "You can hardly find the strength to continue without your [enthrallGender].") if(120 to 140) //depression if(prob(25)) owner.SetStun(20, 0) 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 Master oncemore overwhelms you.") + 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(2) owner.stuttering += 2 owner.jitteriness += 2 @@ -339,7 +341,7 @@ if(prob(20)) deltaResist += 5 if(prob(20)) - to_chat(owner, "Maybe you'll be okay without your Master.") + to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") if(prob(10)) owner.adjustBrainLoss(1) M.hallucination += 5 @@ -370,7 +372,7 @@ 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!") + to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") else if ("charged") if (statusStrength == 0) @@ -397,7 +399,7 @@ if (cooldown > 0) cooldown -= (1 + (mental_capacity/1000 )) else - to_chat(enthrallID, "Your pet [owner.name] appears to have finished internalising your last command.") + to_chat(master, "Your pet [owner.name] appears to have finished internalising your last command.") //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. @@ -479,11 +481,11 @@ 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 Master 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 Master 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 @@ -502,18 +504,18 @@ else deltaResist *= 0.2 //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. - if (M.has_reagent("mannitol")) + if (owner.reagents.has_reagent("mannitol")) deltaResist *= 1.25 - if (M.has_reagent("neurine")) + if (owner.reagents.has_reagent("neurine")) deltaResist *= 1.5 if (!owner.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) - if (owner.has_reagent("anaphro")) + if (owner.reagents.has_reagent("anaphro")) deltaResist *= 1.5 - if (owner.has_reagent("anaphro+")) + if (owner.reagents.has_reagent("anaphro+")) deltaResist *= 2 - if (owner.has_reagent("aphro")) + if (owner.reagents.has_reagent("aphro")) deltaResist *= 0.75 - if (owner.has_reagent("aphro+")) + if (owner.reagents.has_reagent("aphro+")) deltaResist *= 0.5 //Antag resistance @@ -548,7 +550,7 @@ //Mental health could play a role too in the other direction //If master gives you a collar, you get a sense of pride - if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) + if(istype(M.wear_neck, /obj/item/clothing/neck/petcollar)) deltaResist *= 0.5 if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) @@ -558,14 +560,10 @@ deltaResist /= phase//later phases require more resistance /datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works - var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") + var/static/regex/owner_words = regex("[master.real_name]|[master.first_name()]") if(findtext(message, owner_words)) - if(enthrallID.gender == FEMALE) - message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Mistress") - message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Mistress") - else - message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Master") - message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Master") + message = replacetext(lowertext(message), lowertext(master.real_name), "[enthrallGender]") + message = replacetext(lowertext(message), lowertext(master.name), "[enthrallGender]") return message /* /datum/status_effect/chem/OwO 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 f0bccabe49..fbd2be02a9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -515,7 +515,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING return var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size - B.cached_size = [sizeConv[B.size]] + B.cached_size = sizeConv[B.size] message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size @@ -748,39 +748,46 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING 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 + var/creatorID //ckey var/creatorGender var/creatorName + var/mob/living/creator /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) + else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?) var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet Vc.Remove(M) nVc.Insert(M) qdel(Vc) - to_chat(M, "You feel your vocal chords tingle as your voice becomes more sultry.") + to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") + creator = M else M.apply_status_effect(/datum/status_effect/chem/enthrall) - var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = creator + /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/enthrall) + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallTally += 1 M.adjustBrainLoss(0.1) ..() /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M) M.add_trait(TRAIT_PACIFISM, "MKUltra") + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) M.apply_status_effect(/datum/status_effect/chem/enthrall) - var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) - E.enthrallID = creatorID - to_chat(M, "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].") + E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = creator + to_chat(M, "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 [creatorName].") M.slurring = 100 M.confused = 100 E.phase = 4 diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index f40792c849..d8b80a9c91 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -127,7 +127,12 @@ /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list - E.creatorGender = B.["gender"] + if (B.["gender"] == "female") + E.creatorGender = "Mistress" + else + E.creatorGender = "Master" E.creatorName = B.["real_name"] - var/enthrallID = B.get_blood_data() - E.creatorID = enthrallID \ No newline at end of file + E.creatorID = B.["ckey"] + var/mob/living/creator = holder + E.creator = creator + //var/enthrallID = B.get_blood_data()