why do I even bother

This commit is contained in:
Fermi
2019-05-21 02:53:17 +01:00
parent 773431bb8d
commit a9bc75fc0e
21 changed files with 483 additions and 236 deletions

View File

@@ -24,7 +24,7 @@
// start global signals with "!", this used to be necessary but now it's just a formatting choice
#define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
#define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args)
#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" //global living say plug - use sparingly: (mob/speaker , message)
//////////////////////////////////////////////////////////////////
// /datum signals
@@ -137,8 +137,9 @@
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage)
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: ()
#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent.
#define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing.
//#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent.
// #define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing.
//#define
// /mob/living/carbon signals

View File

@@ -0,0 +1,53 @@
/datum/brain_trauma/hypnosis
name = "Hypnosis"
desc = "Patient's unconscious is completely enthralled by a word or sentence, focusing their thoughts and actions on it."
scan_desc = "looping thought pattern"
gain_text = ""
lose_text = ""
resilience = TRAUMA_RESILIENCE_SURGERY
var/hypnotic_phrase = ""
var/regex/target_phrase
/datum/brain_trauma/hypnosis/New(phrase)
if(!phrase)
qdel(src)
hypnotic_phrase = phrase
try
target_phrase = new("(\\b[hypnotic_phrase]\\b)","ig")
catch(var/exception/e)
stack_trace("[e] on [e.file]:[e.line]")
qdel(src)
..()
/datum/brain_trauma/hypnosis/on_gain()
message_admins("[ADMIN_LOOKUPFLW(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.")
log_game("[key_name(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.")
to_chat(owner, "<span class='reallybig hypnophrase'>[hypnotic_phrase]</span>")
to_chat(owner, "<span class='notice'>[pick("You feel your thoughts focusing on this phrase... you can't seem to get it out of your head.",\
"Your head hurts, but this is all you can think of. It must be vitally important.",\
"You feel a part of your mind repeating this over and over. You need to follow these words.",\
"Something about this sounds... right, for some reason. You feel like you should follow these words.",\
"These words keep echoing in your mind. You find yourself completely fascinated by them.")]</span>")
to_chat(owner, "<span class='boldwarning'>You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\
as long as you act like the words are your highest priority.</span>")
..()
/datum/brain_trauma/hypnosis/on_lose()
message_admins("[ADMIN_LOOKUPFLW(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.")
log_game("[key_name(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.")
to_chat(owner, "<span class='userdanger'>You suddenly snap out of your hypnosis. The phrase '[hypnotic_phrase]' no longer feels important to you.</span>")
..()
/datum/brain_trauma/hypnosis/on_life()
..()
if(prob(2))
switch(rand(1,2))
if(1)
to_chat(owner, "<i>...[lowertext(hypnotic_phrase)]...</i>")
if(2)
new /datum/hallucination/chat(owner, TRUE, FALSE, "<span class='hypnophrase'>[hypnotic_phrase]</span>")
/datum/brain_trauma/hypnosis/on_hear(message, speaker, message_language, raw_message, radio_freq)
message = target_phrase.Replace(message, "<span class='hypnophrase'>$1</span>")
return message

View File

@@ -203,4 +203,20 @@
/datum/brain_trauma/severe/pacifism/on_lose()
owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT)
..()
..()
/datum/brain_trauma/severe/hypnotic_stupor
name = "Hypnotic Stupor"
desc = "Patient is prone to episodes of extreme stupor that leaves them extremely suggestible."
scan_desc = "oneiric feedback loop"
gain_text = "<span class='warning'>You feel somewhat dazed.</span>"
lose_text = "<span class='notice'>You feel like a fog was lifted from your mind.</span>"
/datum/brain_trauma/severe/hypnotic_stupor/on_lose() //hypnosis must be cleared separately, but brain surgery should get rid of both anyway
..()
owner.remove_status_effect(/datum/status_effect/trance)
/datum/brain_trauma/severe/hypnotic_stupor/on_life()
..()
if(prob(1) && !owner.has_status_effect(/datum/status_effect/trance))
owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE)

View File

@@ -507,3 +507,57 @@
desc = "Your body is covered in blue ichor! You can't be revived by vitality matrices."
icon_state = "ichorial_stain"
alerttooltipstyle = "clockcult"
/datum/status_effect/trance
id = "trance"
status_type = STATUS_EFFECT_UNIQUE
duration = 300
tick_interval = 10
examine_text = "<span class='warning'>SUBJECTPRONOUN seems slow and unfocused.</span>"
var/stun = TRUE
alert_type = /obj/screen/alert/status_effect/trance
/obj/screen/alert/status_effect/trance
name = "Trance"
desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..."
icon_state = "high"
/datum/status_effect/trance/tick()
if(stun)
owner.Stun(60, TRUE, TRUE)
owner.dizziness = 20
/datum/status_effect/trance/on_apply()
if(!iscarbon(owner))
return FALSE
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize)
owner.add_trait(TRAIT_MUTE, "trance")
if(!owner.has_quirk(/datum/quirk/monochromatic))
owner.add_client_colour(/datum/client_colour/monochrome)
owner.visible_message("[stun ? "<span class='warning'>[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point.</span>" : ""]", \
"<span class='warning'>[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]</span>")
return TRUE
/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE)
duration = _duration
stun = _stun
return ..()
/datum/status_effect/trance/on_remove()
UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
owner.remove_trait(TRAIT_MUTE, "trance")
owner.dizziness = 0
if(!owner.has_quirk(/datum/quirk/monochromatic))
owner.remove_client_colour(/datum/client_colour/monochrome)
to_chat(owner, "<span class='warning'>You snap out of your trance!</span>")
/datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
if(!owner.can_hear())
return
if(speaker == owner)
return
var/mob/living/carbon/C = owner
C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis
addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10)
addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it
qdel(src)

View File

@@ -393,6 +393,22 @@ h1.alert, h2.alert {color: #000000;}
.redtext {color: #FF0000; font-size: 24px;}
.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;}
@keyframes hypnocolor {
0% { color: #202020; }
25% { color: #4b02ac; }
50% { color: #9f41f1; }
75% { color: #541c9c; }
100% { color: #7adbf3; }
}
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
0% { color: #f75a5a; }
50% { color: #dd0000; }
100% { color: #f75a5a; }
}
.icon {height: 1em; width: auto;}

View File

@@ -910,3 +910,17 @@
/mob/living/carbon/can_resist()
return bodyparts.len > 2 && ..()
/mob/living/carbon/proc/hypnosis_vulnerable()//unused atm, but added in case
if(src.has_trait(TRAIT_MINDSHIELD))
return FALSE
if(hallucinating())
return TRUE
if(IsSleeping())
return TRUE
if(src.has_trait(TRAIT_DUMB))
return TRUE
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
if(mood.sanity < SANITY_UNSTABLE)
return TRUE

View File

@@ -6,6 +6,7 @@
var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE)
if(Vc)
if(Vc.name == "velvet chords" )
..()
velvetspeech(message, src)
var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)

View File

@@ -205,6 +205,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message
spans |= SPAN_ITALICS
//global say component
//SEND_GLOBAL_SIGNAL(COMSIG_LIVING_SAY, src, message)
//if(SEND_SIGNAL(COMSIG_LIVING_SAY,src,message) == COMPONENT_NO_SAY)
// return
send_speech(message, message_range, src, bubble_type, spans, language, message_mode)
if(succumbed)
@@ -273,6 +278,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode)
else
AM.Hear(rendered, src, message_language, message, , spans, message_mode)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message)
//speech bubble
var/list/speech_bubble_recipients = list()

View File

@@ -49,6 +49,7 @@ im
var/atom/my_atom = null
var/chem_temp = 150
var/pH = REAGENT_NORMAL_PH//This is definately 7, right?
var/overallPurity = 1
var/last_tick = 1
var/addiction_tick = 1
var/list/datum/reagent/addiction_list = new/list()
@@ -355,17 +356,6 @@ im
var/reaction_occurred = 0 // checks if reaction, binary variable
var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi.
//if(fermiIsReacting == TRUE)
/* if (reactedVol >= targetVol && targetVol != 0)
STOP_PROCESSING(SSprocessing, src)
fermiIsReacting = FALSE
message_admins("FermiChem processing stopped in reaction handler")
reaction_occurred = 1
return
else
message_admins("FermiChem processing passed in reaction handler")
return
*/
do //What does do do in byond? It sounds very redundant? is it a while loop?
@@ -429,9 +419,6 @@ im
if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot!
if (C.FermiExplode == TRUE)
//To be added!
else
FermiExplode()
//explode function!!
TODO: make plastic beakers melt at 447 kalvin, all others at ~850 and meta-material never break.
*/
@@ -472,11 +459,11 @@ im
var/datum/chemical_reaction/C = selected_reaction
if (C.FermiChem == TRUE && !continue_reacting)
message_admins("FermiChem Proc'd")
//message_admins("FermiChem Proc'd")
for(var/P in selected_reaction.results)
targetVol = cached_results[P]*multiplier
message_admins("FermiChem target volume: [targetVol]")
//message_admins("FermiChem target volume: [targetVol]")
if ((chem_temp > C.OptimalTempMin) && (pH > (C.OptimalpHMin - C.ReactpHLim)) && (pH < (C.OptimalpHMax + C.ReactpHLim)))//To prevent pointless reactions
//if (reactedVol < targetVol)
@@ -486,7 +473,7 @@ im
//reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results)
//selected_reaction.on_reaction(src, my_atom, multiplier)
START_PROCESSING(SSprocessing, src)
message_admins("FermiChem processing started")
//message_admins("FermiChem processing started")
selected_reaction.on_reaction(src, my_atom, multiplier)
fermiIsReacting = TRUE
fermiReactID = selected_reaction
@@ -496,7 +483,7 @@ im
// STOP_PROCESSING(SSfastprocess, src)
else if (chem_temp > C.ExplodeTemp)
var/datum/chemical_reaction/fermi/Ferm = selected_reaction
Ferm.FermiExplode(src, my_atom, total_volume, chem_temp, pH)
Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH)
return 0
else
return 0
@@ -554,13 +541,13 @@ im
var/multiplier = INFINITY
//var/special_react_result = C.check_special_react(src) Only add if I add in the fermi-izer chem
message_admins("updating targetVol from [targetVol]")
//message_admins("updating targetVol from [targetVol]")
for(var/B in cached_required_reagents) //
multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))
if (multiplier == 0)
STOP_PROCESSING(SSprocessing, src)
fermiIsReacting = FALSE
message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]")
//message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]")
reactedVol = 0
targetVol = 0
handle_reactions()
@@ -572,20 +559,20 @@ im
for(var/P in cached_results)
targetVol = cached_results[P]*multiplier
message_admins("to [targetVol]")
//message_admins("to [targetVol]")
if (fermiIsReacting == FALSE)
message_admins("THIS SHOULD NEVER APPEAR!")
//message_admins("THIS SHOULD NEVER APPEAR!")
CRASH("Fermi has refused to stop reacting even though we asked her nicely.")
if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions
if (reactedVol < targetVol)
reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier)
message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]")
//message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]")
else
STOP_PROCESSING(SSprocessing, src)
fermiIsReacting = FALSE
message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]")
//message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]")
reactedVol = 0
targetVol = 0
handle_reactions()
@@ -596,7 +583,7 @@ im
return
else
STOP_PROCESSING(SSprocessing, src)
message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]")
//message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]")
fermiIsReacting = FALSE
reactedVol = 0
targetVol = 0
@@ -619,28 +606,28 @@ im
var/purity = 1
//var/tempVol = totalVol
message_admins("Loop beginning")
//message_admins("Loop beginning")
//Begin Parse
//update_holder_purity(C)//updates holder's purity
//Check extremes first
if (cached_temp > C.ExplodeTemp)
//go to explode proc
message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]")
//message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]")
C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH)
if (pH > 14)
pH = 14
message_admins("pH is lover limit, cur pH: [pH]")
//message_admins("pH is lover limit, cur pH: [pH]")
else if (pH < 0)
pH = 0
//Create chemical sludge eventually(for now just destroy the beaker I guess?)
//TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions)
message_admins("pH is lover limit, cur pH: [pH]")
//message_admins("pH is lover limit, cur pH: [pH]")
if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up.
C.FermiExplode(src, (reactedVol+targetVol), cached_temp, pH, C)
C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH)
//For now, purity is handled elsewhere
@@ -664,10 +651,10 @@ im
deltapH = 1
//This should never proc:
else
message_admins("Fermichem's pH broke!! Please let Fermis know!!")
//message_admins("Fermichem's pH broke!! Please let Fermis know!!")
WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])")
//TODO Add CatalystFact
message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]")
//message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]")
//Calculate DeltaT (Deviation of T from optimal)
if (cached_temp < C.OptimalTempMax && cached_temp >= C.OptimalTempMin)
@@ -676,61 +663,71 @@ im
deltaT = 1
else
deltaT = 0
message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]")
//message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]")
stepChemAmmount = deltaT //used to have multipler, now it doesn't
if (stepChemAmmount > C.RateUpLim)
stepChemAmmount = C.RateUpLim
else if (stepChemAmmount <= 0.01)
message_admins("stepChem underflow [stepChemAmmount]")
//message_admins("stepChem underflow [stepChemAmmount]")
stepChemAmmount = 0.01
if ((reactedVol + stepChemAmmount) > targetVol)
stepChemAmmount = targetVol - reactedVol
message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]")
//message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]")
//if (reactedVol > 0)
// purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product
//else
purity = deltapH//set purity equal to pH offset
purity = (deltapH)//set purity equal to pH offset
//TODO: Check overall beaker purity with proc
//Then adjust purity of result AND yeild ammount with said purity.
// End.
/*
for(var/B in cached_required_reagents) //
tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup)
*/
message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]")
//message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]")
for(var/B in cached_required_reagents)
message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]")
//message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]")
remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function.
for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results?
//reactedVol = max(reactedVol, 1) //this shouldnt happen ...
SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log
add_reagent(P, cached_results[P]*stepChemAmmount, null, cached_temp, purity)//add reagent function!! I THINK I can do this:
add_reagent(P, cached_results[P]*(stepChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this:
//Above should reduce yeild based on holder purity.
C.FermiCreate(src)
message_admins("purity: [purity], purity of beaker")
message_admins("Temp before change: [chem_temp], pH after change: [pH]")
//message_admins("purity: [purity], purity of beaker")
//message_admins("Temp before change: [chem_temp], pH after change: [pH]")
//Apply pH changes and thermal output of reaction to beaker
chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!!
//adjust_thermal_energy((cached_temp*(C.ThermicConstant * stepChemAmmount *100)), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000)
pH += (C.HIonRelease * stepChemAmmount)
message_admins("Temp after change: [chem_temp], pH after change: [pH]")
//message_admins("Temp after change: [chem_temp], pH after change: [pH]")
reactedVol = reactedVol + stepChemAmmount
return (reactedVol)
/* MOVED TO REAGENTS.DM
/datum/reagents/proc/FermiExplode()
return
*/
/datum/reagents/proc/update_holder_purity(var/datum/chemical_reaction/fermi/C)
var/list/cached_reagents = reagent_list
var/i
var/cachedPurity
//var/fermiChem
for(var/reagent in C.required_reagents)
cachedPurity += cached_reagents[reagent].purity
i++
overallPurity = cachedPurity/i
/datum/reagents/proc/isolate_reagent(reagent)
var/list/cached_reagents = reagent_list
@@ -877,11 +874,8 @@ im
//WIP_TAG //check my maths for purity calculations
//Add amount and equalize purity
R.volume += amount
//Maybe make a pH for reagents, not sure. it's hard to imagine where the H+ ions would go. I'm okay with this solution for now.
//R.purity = (our_pure_moles + their_pure_moles) / (R.volume)
message_admins("Purity before addition: [R.purity], vol:[R.volume]. Adding [other_purity], vol: [amount]")
R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product
message_admins("Purity after [R.purity]")
update_total()
if(my_atom)
@@ -918,7 +912,7 @@ im
if(!no_react)
handle_reactions()
if(isliving(my_atom))
R.on_mob_add(my_atom)
R.on_mob_add(my_atom, amount)
return TRUE

View File

@@ -16,8 +16,9 @@
var/convert_damage = FALSE //If you want to convert the caster's health to the shift, and vice versa.
var/convert_damage_type = BRUTE //Since simplemobs don't have advanced damagetypes, what to convert damage back into.
var/shapeshift_type
var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! Racist
var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\
/mob/living/simple_animal/pet/cat,\
/mob/living/simple_animal/pet/dog/corgi,\
/mob/living/simple_animal/hostile/carp/ranged/chaos,\
/mob/living/simple_animal/bot/ed209,\
@@ -167,4 +168,4 @@
/datum/soullink/shapeshift/sharerDies(gibbed, mob/living/sharer)
if(source)
source.shapeDeath(gibbed)
source.shapeDeath(gibbed)

View File

@@ -87,6 +87,7 @@
M.Dizzy(1)
/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
//TODO: add lung damage = less oxygen gains
if((H.status_flags & GODMODE))
return
if(H.has_trait(TRAIT_NOBREATH))
@@ -157,7 +158,7 @@
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-5*((damage/maxHealth)/2)) //More damaged lungs = slower oxy rate up to a factor of half
H.adjustOxyLoss(-5) //More damaged lungs = slower oxy rate up to a factor of half
gas_breathed = breath_gases[/datum/gas/oxygen][MOLES]
H.clear_alert("not_enough_oxy")
@@ -186,7 +187,7 @@
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-5*((damage/maxHealth)/2))
H.adjustOxyLoss(-5)
gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES]
H.clear_alert("nitro")
@@ -223,7 +224,7 @@
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-5*((damage/maxHealth)/2))
H.adjustOxyLoss(-5)
gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES]
H.clear_alert("not_enough_co2")
@@ -253,7 +254,7 @@
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-5*((damage/maxHealth)/2))
H.adjustOxyLoss(-5)
gas_breathed = breath_gases[/datum/gas/plasma][MOLES]
H.clear_alert("not_enough_tox")

View File

@@ -670,7 +670,7 @@
///////////FermiChem//////////////////
//////////////////////////////////////
//Removed span_list from input arguments. //mob/living/user
/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = TRUE)
/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = FALSE)
message_admins("Velvet speech proc'd on [user]")
var/cooldown = 0
@@ -703,7 +703,7 @@
if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
continue
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//Check to see if pet is on cooldown from last command
if (E.cooldown >= 0)//If they're on cooldown you can't give them more commands.
if (E.cooldown > 0)//If they're on cooldown you can't give them more commands.
continue
listeners += L
if(debug == TRUE)
@@ -812,7 +812,7 @@
//phase 3
var/static/regex/statecustom_words = regex("state triggers|state your triggers")
var/static/regex/custom_words = regex("new trigger|listen to me")
var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|objective")//What a descriptive name!
var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name!
var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed")
var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die")
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
@@ -827,6 +827,8 @@
//enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words
//CALLBACKS ARE USED FOR MESSAGES BECAUSE SAY IS HANDLED AFTER THE PROCESSING.
//Tier 1
//ENTHRAL mixable
if(findtext(message, enthral_words))
@@ -876,7 +878,7 @@
if((findtext(message, saymyname_words)))
for(var/V in listeners)
var/mob/living/carbon/C = V
C.remove_trait(TRAIT_MUTE, TRAUMA_TRAIT)
C.remove_trait(TRAIT_MUTE, "enthrall")
addtimer(CALLBACK(C, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here
//WAKE UP
@@ -889,7 +891,7 @@
if(0)
E.phase = 3
E.status = null
addtimer(CALLBACK(L, /atom/movable/proc/to_chat, "<span class='warning'>The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.</b></span>"), 5)
addtimer(CALLBACK(L, /proc/to_chat, "<span class='warning'>The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.</b></span>"), 5)
//to_chat(L, )
@@ -900,7 +902,7 @@
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
power_multiplier *= distancelist[get_dist(user, C)+1]
if (E.phase == 3) //If target is fully enthralled,
C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT)
C.add_trait(TRAIT_MUTE, "enthrall")
else
C.silent += ((10 * power_multiplier) * E.phase)
E.cooldown += 3
@@ -933,11 +935,12 @@
else if((findtext(message, forget_words)))
for(var/mob/living/carbon/C in listeners)
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
C.Sleeping(50)
to_chat(C, "<span class='warning'>You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!</b></span>")
C.Sleeping(50)
switch(E.phase)
if(1 to 2)
E.phase = -1
to_chat(C, "<span class='big warning'>You have no recollection of being enthralled by [E.master]</b></span>")
if(3)
E.phase = 0
E.cooldown = 0
@@ -951,22 +954,6 @@
E.cooldown += 3
//ORGASM
else if((findtext(message, orgasm_words)))
for(var/V in listeners)
var/mob/living/carbon/human/H = V
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure
H.mob_climax(forced_climax=TRUE)
H.setArousalLoss(H.min_arousal)
E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
E.enthrallTally += power_multiplier
else
E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
E.enthrallTally += power_multiplier*1.1
to_chat(H, "<span class='warning'>Your Masters command whites out your mind in bliss!</b></span>")
E.cooldown += 6
//teir 2
@@ -976,7 +963,7 @@
var/mob/living/carbon/human/H = V
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
if(E.phase > 1)
if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure
if(H.canbearoused) // probably a redundant check but for good measure
H.mob_climax(forced_climax=TRUE)
H.setArousalLoss(H.min_arousal)
E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
@@ -1007,7 +994,7 @@
if(2 to INFINITY)
var/mob/living/M = V
playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1)
H.emote(H,"lets out a nya!")
M.emote(M,"lets out a nya!")
E.cooldown += 1
//SLEEP
@@ -1072,10 +1059,10 @@
for(var/V in listeners)
var/speaktrigger = ""
var/mob/living/L = V
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
if (!E.customTriggers == list())//i.e. if it's not empty
for (var/trigger in E.customTriggers)
speaktrigger = "[trigger]\n"
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty
for (var/trigger in E.customTriggers)
speaktrigger = "[trigger]\n"
if(!speaktrigger == "")
L.say(speaktrigger)
//CUSTOM TRIGGERS
@@ -1085,7 +1072,7 @@
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
if(E.phase == 3)
if (get_dist(user, H) > 1)//Requires user to be next to their pet.
to_chat(H, "<span class='warning'>You need to be next to your pet to give them a new trigger!</b></span>")
to_chat(user, "<span class='warning'>You need to be next to your pet to give them a new trigger!</b></span>")
return
else
if (E.mental_capacity >= 10)
@@ -1110,7 +1097,7 @@
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
if(E.phase == 3)
if (get_dist(user, H) > 1)//Requires user to be next to their pet.
to_chat(H, "<span class='warning'>You need to be next to your pet to give them a new objective!</b></span>")
to_chat(user, "<span class='warning'>You need to be next to your pet to give them a new objective!</b></span>")
return
else
user.emote(user, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'")
@@ -1310,7 +1297,8 @@
addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i)
i++
*/
else
return
if(message_admins)
message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")

View File

@@ -346,6 +346,22 @@ em {font-style: normal; font-weight: bold;}
.greentext {color: #00FF00; font-size: 3;}
.redtext {color: #FF0000; font-size: 3;}
.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;}
@keyframes hypnocolor {
0% { color: #202020; }
25% { color: #4b02ac; }
50% { color: #9f41f1; }
75% { color: #541c9c; }
100% { color: #7adbf3; }
}
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
0% { color: #f75a5a; }
50% { color: #dd0000; }
100% { color: #f75a5a; }
}
big img.icon {width: 32px; height: 32px;}
@@ -359,4 +375,4 @@ big img.icon {width: 32px; height: 32px;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
.hidden {display: none; visibility: hidden;}

View File

@@ -153,6 +153,21 @@ h1.alert, h2.alert {color: #000000;}
.redtext {color: #FF0000; font-size: 3;}
.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
.hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite;}
@keyframes hypnocolor {
0% { color: #0d0d0d; }
25% { color: #410194; }
50% { color: #7f17d8; }
75% { color: #410194; }
100% { color: #3bb5d3; }
}
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
0% { color: #0d0d0d; }
50% { color: #dd0000; }
100% { color: #0d0d0d; }
}
.icon {height: 1em; width: auto;}

View File

@@ -172,7 +172,8 @@
//var/mental_cost //Current cost of custom triggers
//var/mindbroken = FALSE //Not sure I use this, replaced with phase 4
var/datum/weakref/redirect_component //resistance
var/datum/weakref/redirect_component2 //say
//var/datum/weakref/redirect_component2 //say
//var/datum/weakref/redirect_component3 //hear
var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers
var/withdrawal = FALSE //withdrawl
var/withdrawalTick = 0 //counts how long withdrawl is going on for
@@ -194,6 +195,9 @@
owner.remove_status_effect(src)//This shouldn't happen, but just in case
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed#
//redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed
//redirect_component3 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_HEAR = CALLBACK(src, .proc/owner_hear)))) //Do resistance calc if resist is pressed
RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say)
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear)
//Might need to add redirect component for listening too.
var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain!
mental_capacity = 500 - B.get_brain_damage()
@@ -221,7 +225,7 @@
//mindshield check
if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ.
resistanceTally += 2
resistanceTally += 5
if(prob(10))
to_chat(owner, "<span class='notice'><i>You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.</i></span>")
@@ -236,23 +240,26 @@
if (enthrallTally > 100)
phase += 1
mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity.
resistanceTally /= 2
enthrallTally = 0
to_chat(owner, "<span class='warning'><i>Your conciousness slips, as you sink deeper into trance and servitude.</i></span>")
to_chat(owner, "<span class='hypnophrase'><i>Your conciousness slips, as you sink deeper into trance and servitude.</i></span>")
else if (resistanceTally > 100)
enthrallTally *= 0.5
phase = -1
resistanceTally = 0
to_chat(owner, "<span class='warning'><i>You break free of the influence in your mind, your thoughts suddenly turning lucid!</i></span>")
to_chat(owner, "<span class='big redtext'><i>You're now free of [master]'s influence, and fully independant oncemore.'</i></span>")
owner.remove_status_effect(src) //If resisted in phase 1, effect is removed.
if(prob(10))
to_chat(owner, "<span class='notice'><i>[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].</i></span>")
to_chat(owner, "<span class='small hypnophrase'><i>[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].</i></span>")
if (2) //partially enthralled
if (enthrallTally > 150)
phase += 1
mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity.
enthrallTally = 0
resistanceTally /= 2
to_chat(owner, "<span class='notice'><i>Your mind gives, eagerly obeying and serving [master].</i></span>")
to_chat(owner, "<span class='warning'><i>You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. </i></span>")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP.
to_chat(owner, "<span class='big nicegreen'><i>You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. </i></span>")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP.
else if (resistanceTally > 150)
enthrallTally *= 0.5
phase -= 1
@@ -260,15 +267,15 @@
to_chat(owner, "<span class='notice'><i>You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].</i></span>")
//owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment,
if(prob(10))
to_chat(owner, "<span class='notice'><i>[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].</i></span>")
to_chat(owner, "<span class='hypnophrase'><i>[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].</i></span>")
if (3)//fully entranced
if (resistanceTally >= 250 && withdrawalTick >= 150)
if (resistanceTally >= 200 && withdrawalTick >= 150)
enthrallTally = 0
phase -= 1
resistanceTally = 0
to_chat(owner, "<span class='notice'><i>The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.</i></span>")
if(prob(2))
to_chat(owner, "<span class='notice'><i>[pick("I belong to [enthrallGender].", "[enthrallGender] known's whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].</i></span>")
if(prob(3))
to_chat(owner, "<span class='hypnophrase'><i>[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].</i></span>")
if (4) //mindbroken
if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra"))
phase = 2
@@ -284,7 +291,8 @@
//distance calculations
switch(get_dist(master, owner))
if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects.
enthrallTally += distancelist[get_dist(master, owner)+1]
if(phase <= 2)
enthrallTally += distancelist[get_dist(master, owner)+1]
withdrawal = FALSE
if(withdrawalTick > 0)
withdrawalTick -= 2
@@ -301,31 +309,31 @@
//Withdrawal subproc:
if (withdrawal == TRUE)//Your minions are really REALLY needy.
switch(withdrawalTick)//denial
if(20 to 40)//Gives wiggle room, so you're not SUPER needy
if(10 to 35)//Gives wiggle room, so you're not SUPER needy
if(prob(5))
to_chat(owner, "You're starting to miss your [enthrallGender].")
to_chat(owner, "<span class='notice'><i>You're starting to miss your [enthrallGender].</i></span>")
if(prob(5))
owner.adjustBrainLoss(0.5)
to_chat(owner, "Master will surely be back soon") //denial
if(41)
to_chat(owner, "<i>Master will surely be back soon</i>") //denial
if(36)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1)
if(42 to 65)//barganing
if(prob(5))
to_chat(owner, "They are coming back, right...?")
if(37 to 65)//barganing
if(prob(10))
to_chat(owner, "<i>They are coming back, right...?</i>")
owner.adjustBrainLoss(1)
if(prob(5))
to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.")
if(prob(10))
to_chat(owner, "<i>I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.</i>")
owner.adjustBrainLoss(-1)
if(66)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work?
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2)
owner.stuttering += 20
owner.jitteriness += 20
owner.stuttering += 200
owner.jitteriness += 200
if(67 to 90) //anger
if(prob(10))
addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2)
addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2)
to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your [enthrallGender].")
to_chat(owner, "<span class='warning'>You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!</span>")
owner.adjustBrainLoss(1)
if(90)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work?
@@ -334,10 +342,10 @@
if(91 to 120)//depression
if(prob(20))
owner.adjustBrainLoss(2.5)
owner.stuttering += 2
owner.jitteriness += 2
owner.stuttering += 20
owner.jitteriness += 20
if(prob(25))
M.hallucination += 2
M.hallucination += 20
if(121)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4)
@@ -348,34 +356,34 @@
owner.emote("cry")//does this exist?
to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.")
owner.adjustBrainLoss(5)
owner.stuttering += 2
owner.jitteriness += 2
owner.stuttering += 20
owner.jitteriness += 20
if(prob(5))
deltaResist += 5
if(140 to INFINITY) //acceptance
if(prob(15))
deltaResist += 5
if(prob(20))
to_chat(owner, "Maybe you'll be okay without your [enthrallGender].")
to_chat(owner, "<i><span class='small green'>Maybe you'll be okay without your [enthrallGender].</i></span>")
if(prob(10))
owner.adjustBrainLoss(2)
M.hallucination += 5
M.hallucination += 50
withdrawalTick += 0.5
//Status subproc - statuses given to you from your Master
//currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist.
if (!status == null)
if (status)
if(status = "Antiresist")
if (statusStrength == 0)
if(status == "Antiresist")
if (statusStrength < 0)
status = null
to_chat(owner, "You feel able to resist oncemore.")
else
statusStrength -= 1
else if(status = "heal")
if (statusStrength == 0)
else if(status == "heal")
if (statusStrength < 0)
status = null
to_chat(owner, "You finish licking your wounds.")
else
@@ -383,13 +391,13 @@
owner.heal_overall_damage(1, 1, 0, FALSE, FALSE)
cooldown += 1 //Cooldown doesn't process till status is done
else if(status = "charge")
else if(status == "charge")
owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra")
status = "charged"
to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!")
else if (status = "charged")
if (statusStrength == 0)
else if (status == "charged")
if (statusStrength < 0)
status = null
owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra")
owner.Knockdown(30)
@@ -398,7 +406,7 @@
statusStrength -= 1
cooldown += 1 //Cooldown doesn't process till status is done
else if (status = "pacify")
else if (status == "pacify")
owner.add_trait(TRAIT_PACIFISM, "MKUltra")
status = null
@@ -432,6 +440,10 @@
redirect_component = null
//qdel(redirect_component2.resolve())
//redirect_component2 = null
UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL)
//qdel(redirect_component3.resolve())
//redirect_component3 = null
/*
/datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
@@ -441,34 +453,37 @@
. = ..()
*/
//Doesn't work
/datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
/datum/status_effect/chem/enthrall/proc/owner_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
var/mob/living/carbon/C = owner
message_admins("[C] heard something!")
//message_admins("[C] heard something!")
for (var/trigger in customTriggers)
if (trigger == message)//if trigger1 is the message
//cached_trigger = lowertext(trigger)
message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]")
if ("[trigger]" == raw_message)//if trigger1 is the message
message_admins("[C] has been triggered with [trigger]!")
//Speak (Forces player to talk)
if (customTriggers[trigger][1] == "speak")//trigger2
C.visible_message("<span class='notice'>Your mouth moves on it's own, before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.</span>")
if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2
to_chat(C, "<span class='notice'><i>Your mouth moves on it's own, before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.</i></span>")
(C.say(customTriggers[trigger][2]))//trigger3
//Echo (repeats message!)
else if (customTriggers[trigger][1] == "echo")//trigger2
(to_chat(owner, customTriggers[trigger][2]))//trigger3
else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2
(to_chat(owner, "<span class='hypnophrase'><i>[customTriggers[trigger][2]]</i></span>"))//trigger3
//Shocking truth!
else if (customTriggers[trigger] == "shock")
else if (lowertext(customTriggers[trigger]) == "shock")
if (C.canbearoused)
C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is
C.adjustArousalLoss(5)
to_chat(owner, "<span class='notice'><i>Your muscles seize up, then start spasming wildy!</i></span>")
to_chat(owner, "<span class='warning'><i>Your muscles seize up, then start spasming wildy!</i></span>")
else
C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect
//wah intensifies
else if (customTriggers[trigger][1] == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
if (C.canbearoused)
if (C.getArousalLoss() > 80)
C.mob_climax(forced_climax=TRUE)
@@ -478,17 +493,22 @@
C.throw_at(get_step_towards(speaker,C), 3, 1) //cut this if it's too hard to get working
//kneel (knockdown)
else if (customTriggers[trigger][1] == "kneel")//as close to kneeling as you can get, I suppose.
else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose.
C.Knockdown(20)
//strip (some) clothes
else if (customTriggers[trigger][1] == "strip")//This wasn't meant to just be a lewd thing oops
else if (customTriggers[trigger] == "strip")//This wasn't meant to just be a lewd thing oops
var/mob/living/carbon/human/o = owner
var/items = o.get_contents()
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
C.visible_message("<span class='notice'>You feel compelled to strip your clothes.</span>")
C.visible_message("<span class='notice'><i>You feel compelled to strip your clothes.</i></span>")
//trance
else if (customTriggers[trigger] == "trance")
var/mob/living/carbon/human/o = owner
o.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
//add more fun stuff!
@@ -505,14 +525,14 @@
if (status == "Sleeper" || phase == 0)
return
else if (phase == 4)
to_chat(owner, "<span class='notice'><i>Your mind is too far gone to even entertain the thought of resisting.</i></span>")
to_chat(owner, "<span class='hypnophrase'><i>Your mind is too far gone to even entertain the thought of resisting.</i></span>")
return
else if (phase == 3 && withdrawal == FALSE)
to_chat(owner, "<span class='notice'><i>The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.</i></span>")
to_chat(owner, "<span class='hypnophrase'><i>The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.</i></span>")
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, "<span class='notice'><i>The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.</i></span>")
to_chat(owner, "<span class='warning'><i>The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.</i></span>")
statusStrength += 1
enthrallTally += 1
return
@@ -593,7 +613,8 @@
message_admins("[M] is trying to resist with a delta of [deltaResist]!")
return
/datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works
/datum/status_effect/chem/enthrall/proc/owner_say(mob/speaker, message) //I can only hope this works
//var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall)
//var/mob/living/master = E.master
message_admins("[owner] said something")

View File

@@ -273,7 +273,7 @@
//H.update_body()
/datum/species/proc/handle_genitals(mob/living/carbon/human/H)
message_admins("attempting to update sprite")
//message_admins("attempting to update sprite")
if(!H)//no args
CRASH("H = null")
if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done

View File

@@ -21,6 +21,10 @@
var/statuscheck = FALSE
var/prev_size = 6
/obj/item/organ/genital/penis/Initialize()
. = ..()
prev_size = length
cached_length = length
/obj/item/organ/genital/penis/update_size()
var/mob/living/carbon/human/o = owner
@@ -33,32 +37,32 @@
length = cached_length
size = 1
if(statuscheck == TRUE)
message_admins("Attempting to remove.")
//message_admins("Attempting to remove.")
o.remove_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = FALSE
if(5 to 8) //If modest size
length = cached_length
size = 2
if(statuscheck == TRUE)
message_admins("Attempting to remove.")
//message_admins("Attempting to remove.")
o.remove_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = FALSE
if(9 to INFINITY) //If massive
length = cached_length
size = 3 //no new sprites for anything larger yet
if(statuscheck == FALSE)
message_admins("Attempting to apply.")
//message_admins("Attempting to apply.")
o.remove_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = TRUE
if(15 to INFINITY)
length = cached_length
size = 3 //no new sprites for anything larger yet
if(statuscheck == FALSE)
message_admins("Attempting to apply.")
//message_admins("Attempting to apply.")
o.apply_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = TRUE
message_admins("Pinas size: [size], [cached_length], [o]")
message_admins("2. size vs prev_size")
//message_admins("Pinas size: [size], [cached_length], [o]")
//message_admins("2. size vs prev_size")
if (round(length) > round(prev_size))
to_chat(o, "<span class='warning'>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.</b></span>")
else if (round(length) < round(prev_size))

View File

@@ -14,8 +14,8 @@
id = "fermi" //It's meeee
taste_description = "If affection had a taste, this would be it."
var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction
var/InverseChemVal = 0 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising
var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it.
var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising
var/InverseChem = "toxin" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it.
var/DoNotSplit = FALSE // If impurity is handled within the main chem itself
///datum/reagent/fermi/on_mob_life(mob/living/carbon/M)
@@ -34,7 +34,7 @@
//This should process fermichems to find out how pure they are and what effect to do.
//TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M)
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount)
. = ..()
if(!M)
return
@@ -44,15 +44,15 @@
if (src.purity == 1 || src.DoNotSplit == TRUE)
return
else if (src.InverseChemVal > src.purity)
M.reagents.remove_reagent(src, volume, FALSE)
M.reagents.add_reagent(src.InverseChem, volume, FALSE, other_purity = 1)
M.reagents.remove_reagent(src.id, amount, FALSE)
M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1)
message_admins("all convered to [src.InverseChem]")
return
else
//var/pureVol = volume * purity
var/impureVol = volume * (1 - (volume * purity))
message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]")
M.reagents.remove_reagent(src, (volume*impureVol), FALSE)
//var/pureVol = amount * purity
var/impureVol = amount * (1 - purity)
message_admins("splitting [src.id] [amount] into [src.ImpureChem] [impureVol]")
M.reagents.remove_reagent(src.id, (impureVol), FALSE)
M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1)
return
@@ -66,15 +66,15 @@
if (other_purity == 1 || src.DoNotSplit == TRUE)
return
else if (src.InverseChemVal > other_purity)
M.reagents.remove_reagent(src, amount, FALSE)
M.reagents.remove_reagent(src.id, amount, FALSE)
M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1)
message_admins("all convered to [src.InverseChem]")
return
else
//var/pureVol =
var/impureVol = amount * (1 - (amount * other_purity))
message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]")
M.reagents.remove_reagent(src, impureVol, FALSE)
var/impureVol = amount * (1 - other_purity)
message_admins("splitting [src] [amount] into [src.ImpureChem] [impureVol]")
M.reagents.remove_reagent(src.id, impureVol, FALSE)
M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1)
return
@@ -111,7 +111,7 @@
taste_description = "wiggly cosmic dust."
color = "#5020H4" // rgb: 50, 20, 255
overdose_threshold = 15
addiction_threshold = 20
addiction_threshold = 15
metabolization_rate = 0.5 * REAGENTS_METABOLISM
addiction_stage2_end = 30
addiction_stage3_end = 40
@@ -525,7 +525,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
var/startHunger
/datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
message_admins("SGZF ingested")
//message_admins("SGZF ingested")
switch(current_cycle)//Pretends to be normal
if(20)
to_chat(M, "<span class='notice'>You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.</span>")
@@ -577,7 +577,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
to_chat(M, "<span class='warning'>A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...</span>")
if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant.
M.adjustToxLoss(1, 0)
message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20")
//message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20")
..()
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -821,6 +821,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason
var/mob/living/simple_animal/hostile/retaliate/ghost/G = null
var/antiGenetics = 255
var/sleepytime = 0
InverseChemVal = 0.25
//var/Svol = volume
/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment!
@@ -1215,10 +1216,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
if(prob(10))
owner.Stun(10)
owner.emote("whimper")//does this exist?
to_chat(owner, "You're overcome with a desire to see [love].")
owner.adjustBrainLoss(5)
M.Stun(10)
M.emote("whimper")//does this exist?
to_chat(M, "You're overcome with a desire to see [love].")
M.adjustBrainLoss(5)
..()
/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M)
@@ -1446,9 +1447,36 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
name = "Fermis Test Reagent"
id = "fermiTest"
description = "You should be really careful with this...! Also, how did you get this?"
data = "Big bang"
data = list("Big bang" = 1, "please work" = 2)
/datum/reagent/fermi/fermiTest/on_new()
..()
message_admins("FermiTest addition!")
var/location = get_turf(holder.my_atom)
if(purity < 0.34 || purity == 1)
var/datum/effect_system/foam_spread/s = new()
s.set_up(volume*2, location, holder)
s.start()
if((purity < 0.67 && purity >= 0.34)|| purity == 1)
var/datum/effect_system/smoke_spread/chem/s = new()
s.set_up(holder, volume*2, location)
s.start()
if(purity >= 0.67)
for (var/datum/reagent/reagent in holder.reagent_list)
if (istype(reagent, /datum/reagent/fermi))
var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id]
Ferm.FermiExplode(src, holder.my_atom, holder, holder.total_volume, holder.chem_temp, holder.pH)
else
var/datum/chemical_reaction/Ferm = GLOB.chemical_reagents_list[reagent.id]
Ferm.on_reaction(holder, reagent.volume)
for(var/mob/M in viewers(8, location))
to_chat(M, "<span class='danger'>The solution reacts dramatically, with a meow!</span>")
playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
holder.clear_reagents()
/datum/reagent/fermi/fermiTest/on_merge()
..()
message_admins("FermiTest addition!")
var/location = get_turf(holder.my_atom)
if(purity < 0.34 || purity == 1)
var/datum/effect_system/foam_spread/s = new()

View File

@@ -10,7 +10,7 @@
//Called when temperature is above a certain threshold
//....Is this too much?
/datum/chemical_reaction/fermi/proc/FermiExplode(src, var/atom/my_atom, datum/reagents/holder, volume, temp, pH, Reaction, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
/datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
//var/Svol = volume
if (Exploding == TRUE)
return
@@ -19,13 +19,13 @@
var/ImpureTot = 0
var/pHmod = 1
var/turf/T = get_turf(my_atom)
if(temp>600)//if hot, start a fire
if(temp>500)//if hot, start a fire
switch(temp)
if (601 to 800)
if (500 to 750)
for(var/turf/turf in range(1,T))
new /obj/effect/hotspot(turf)
//volume /= 3
if (801 to 1100)
if (751 to 1100)
for(var/turf/turf in range(2,T))
new /obj/effect/hotspot(turf)
//volume /= 4
@@ -48,8 +48,8 @@
pHmod = 1.5
for (var/datum/reagent/reagent in my_atom.reagents.reagent_list)
if (istype(reagent, /datum/reagent/fermi))
var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id]
Ferm.FermiExplode(src, my_atom, holder, volume, temp, pH, Exploding = TRUE)
//var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id]
//Ferm.FermiExplode(src, my_atom, volume, temp, pH, Exploding = TRUE)
continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain)
R.add_reagent(reagent, reagent.volume)
if (reagent.purity < 0.6)
@@ -64,7 +64,7 @@
my_atom.reagents.clear_reagents()
return
/datum/chemical_reaction/fermi/eigenstate
/datum/chemical_reaction/fermi/eigenstate//done
name = "Eigenstasium"
id = "eigenstate"
results = list("eigenstate" = 1)
@@ -81,7 +81,7 @@
CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = -2.5 //Temperature change per 1u produced
HIonRelease = 0.01 //pH change per 1u reaction
HIonRelease = 0.08 //pH change per 1u reaction
RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect
FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
FermiExplode = FALSE //If the chemical explodes in a special way
@@ -98,8 +98,8 @@
name = "Synthetic-derived growth factor"
id = "SDGF"
results = list("SDGF" = 3)
required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1)
//required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10)
//required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1)
required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10)
//FermiChem vars:
OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 500 // Upper end for above
@@ -117,17 +117,17 @@
FermiExplode = TRUE // If the chemical explodes in a special way
PurityMin = 0.25
/datum/chemical_reaction/fermi/SDGF/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies
var/turf/T = get_turf(holder)
/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies
var/turf/T = get_turf(my_atom)
var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory
S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny
S.name = "Living teratoma"
S.real_name = "Living teratoma"//horrifying!!
S.rabid = 1//Make them an angery boi, grr grr
to_chat("<span class='warning'>The cells clump up into a horrifying tumour!</span>")
holder.clear_reagents()
my_atom.reagents.clear_reagents()
/datum/chemical_reaction/fermi/BElarger
/datum/chemical_reaction/fermi/BElarger //done
name = "Sucubus milk"
id = "BElarger"
results = list("BElarger" = 6)
@@ -136,29 +136,29 @@
OptimalTempMin = 200
OptimalTempMax = 800
ExplodeTemp = 900
OptimalpHMin = 5
OptimalpHMax = 10
OptimalpHMin = 8
OptimalpHMax = 12
ReactpHLim = 3
CatalystFact = 0
CurveSharpT = 2
CurveSharppH = 2
ThermicConstant = 1
HIonRelease = 0.1
RateUpLim = 10
HIonRelease = 0.5
RateUpLim = 5
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.1
/datum/chemical_reaction/fermi/BElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)
/datum/chemical_reaction/fermi/BElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
//var/obj/item/organ/genital/breasts/B =
new /obj/item/organ/genital/breasts(get_turf(holder))
var/list/seen = viewers(5, get_turf(holder))
new /obj/item/organ/genital/breasts(get_turf(my_atom))
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
to_chat(M, "<span class='warning'>The reaction suddenly condenses, creating a pair of breasts!</b></span>")//OwO
holder.clear_reagents()
my_atom.reagents.clear_reagents()
..()
/datum/chemical_reaction/fermi/PElarger //Vars needed
/datum/chemical_reaction/fermi/PElarger //done
name = "Incubus draft"
id = "PElarger"
results = list("PElarger" = 3)
@@ -168,53 +168,52 @@
OptimalTempMin = 200
OptimalTempMax = 800
ExplodeTemp = 900
OptimalpHMin = 5
OptimalpHMax = 10
OptimalpHMin = 2
OptimalpHMax = 6
ReactpHLim = 3
CatalystFact = 0
CurveSharpT = 2
CurveSharppH = 2
ThermicConstant = 1
HIonRelease = 0.1
RateUpLim = 10
HIonRelease = -0.5
RateUpLim = 5
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.1
/datum/chemical_reaction/fermi/PElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)
/datum/chemical_reaction/fermi/PElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
//var/obj/item/organ/genital/penis/nP =
new /obj/item/organ/genital/penis(get_turf(holder))
var/list/seen = viewers(5, get_turf(holder))
new /obj/item/organ/genital/penis(get_turf(my_atom))
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
to_chat(M, "<span class='warning'>The reaction suddenly condenses, creating a penis!</b></span>")//OwO
holder.clear_reagents()
my_atom.reagents.clear_reagents()
..()
/datum/chemical_reaction/fermi/astral //Vars needed
/datum/chemical_reaction/fermi/astral //done
name = "Astrogen"
id = "astral"
results = list("astral" = 3)
required_reagents = list("eigenstasium" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5)
//required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10)
//FermiChem vars:
OptimalTempMin = 200
OptimalTempMax = 800
ExplodeTemp = 900
OptimalpHMin = 5
OptimalpHMax = 10
ReactpHLim = 3
OptimalpHMin = 12
OptimalpHMax = 13
ReactpHLim = 2
CatalystFact = 0
CurveSharpT = 2
CurveSharpT = 4
CurveSharppH = 2
ThermicConstant = 1
HIonRelease = 0.1
ThermicConstant = 10
HIonRelease = 0.5
RateUpLim = 10
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.25
PurityMin = 0.25 // explode purity!
/datum/chemical_reaction/fermi/enthrall //Vars needed
/datum/chemical_reaction/fermi/enthrall//done
name = "MKUltra"
id = "enthrall"
results = list("enthrall" = 3)
@@ -275,21 +274,21 @@
//var/enthrallID = B.get_blood_data()
*/
/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)
var/turf/T = get_turf(holder)
/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
var/turf/T = get_turf(my_atom)
var/datum/reagents/R = new/datum/reagents(1000)
var/datum/effect_system/smoke_spread/chem/s = new()
R.add_reagent("enthrallExplo", volume)
s.set_up(R, volume, T)
s.start()
holder.clear_reagents()
my_atom.reagents.clear_reagents()
//..() //Please don't kill everyone too.
/datum/chemical_reaction/fermi/hatmium
/datum/chemical_reaction/fermi/hatmium // done
name = "Hat growth serum"
id = "hatmium"
results = list("hatmium" = 5)
required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1, "blackpepper" = 3)
required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1)
//mix_message = ""
//FermiChem vars:
OptimalTempMin = 500
@@ -301,27 +300,27 @@
//CatalystFact = 0 //To do 1
CurveSharpT = 4
CurveSharppH = 0.5
ThermicConstant = -2.5
HIonRelease = 0.01
ThermicConstant = -2
HIonRelease = -0.05
RateUpLim = 5
FermiChem = TRUE
//FermiExplode = FALSE
//PurityMin = 0.15
/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)
var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(holder.my_atom))
/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH)
var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
hat.animate_atom_living()
var/list/seen = viewers(5, get_turf(holder.my_atom))
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
to_chat(M, "<span class='warning'>The makes an off sounding pop, as a hat suddenly climbs out of the beaker!</b></span>")
holder.clear_reagents()
my_atom.reagents.clear_reagents()
..()
/datum/chemical_reaction/fermi/furranium //low temp and medium pH
/datum/chemical_reaction/fermi/furranium //low temp and medium pH - done
name = "Furranium"
id = "furranium"
results = list("furranium" = 5)
required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 1, "salglu_solution" = 1)
required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1)
//mix_message = ""
//FermiChem vars:
OptimalTempMin = 350
@@ -341,7 +340,7 @@
//PurityMin = 0.15
//Nano-b-gone
/datum/chemical_reaction/fermi/naninte_b_gone
/datum/chemical_reaction/fermi/naninte_b_gone//done
name = "Naninte bain"
id = "naninte_b_gone"
results = list("naninte_b_gone" = 5)
@@ -357,9 +356,9 @@
//CatalystFact = 0 //To do 1
CurveSharpT = 4
CurveSharppH = 2
ThermicConstant = -2.5
ThermicConstant = 1
HIonRelease = 0.01
RateUpLim = 5
RateUpLim = 100
FermiChem = TRUE
//FermiExplode = FALSE
//PurityMin = 0.15

View File

@@ -9,6 +9,11 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
item_flags = NODROP //Tips their hat!
/*
/obj/item/clothing/head/hattip/equipped(mob/living/carbon/human/user, slot)
C = user //grumble grumble loc
*/
/obj/item/clothing/head/hattip/attack_hand(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
@@ -19,10 +24,23 @@
user.emote("me",1,"admires such a spiffy hat.",TRUE)
return ..()
/obj/item/clothing/head/hattip/speechModification(message)
/obj/item/clothing/head/hattip/speechModification(message, /mob/living/carbon/C)
..()
var/mob/living/carbon/C = get_wearer()//user
//if(istype(C, /mob/living/carbon/C))
var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
if (T.name == "fluffy tongue")
if(prob(0.01))
message += "\" and tips their hat. \"swpy's sappin' my swentwy uwu!!"
return message
message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]"
return message
if(prob(0.01))
message += "\" and tips their hat. \"Spy's sappin' my Sentry!"
return message
message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]"
return message
/obj/item/clothing/head/hattip/proc/get_wearer()
return loc

View File

@@ -328,6 +328,7 @@
#include "code\datums\actions\beam_rifle.dm"
#include "code\datums\actions\ninja.dm"
#include "code\datums\brain_damage\brain_trauma.dm"
#include "code\datums\brain_damage\hypnosis.dm"
#include "code\datums\brain_damage\imaginary_friend.dm"
#include "code\datums\brain_damage\mild.dm"
#include "code\datums\brain_damage\phobia.dm"