@@ -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
|
||||
|
||||
@@ -72,6 +72,8 @@
|
||||
#define TRAIT_PHOTOGRAPHER "photographer"
|
||||
#define TRAIT_MUSICIAN "musician"
|
||||
#define TRAIT_CROCRIN_IMMUNE "crocin_immune"
|
||||
#define TRAIT_NYMPHO "nymphomania"
|
||||
#define TRAIT_HIGH_BLOOD "high_blood"
|
||||
|
||||
// common trait sources
|
||||
#define TRAIT_GENERIC "generic"
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -255,7 +255,7 @@
|
||||
if(the_event.timeout)
|
||||
addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE)
|
||||
return 0 //Don't have to update the event.
|
||||
the_event = new type(src, param)//This causes a runtime for some reason, was this me?
|
||||
the_event = new type(src, param)//This causes a runtime for some reason, was this me? No - there's an event floating around missing a definition.
|
||||
|
||||
mood_events[category] = the_event
|
||||
update_mood()
|
||||
|
||||
@@ -44,7 +44,7 @@ Bonus
|
||||
if(4, 5)
|
||||
M.adjustOxyLoss(-7, 0)
|
||||
M.losebreath = max(0, M.losebreath - 4)
|
||||
if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio))
|
||||
M.blood_volume += 1
|
||||
else
|
||||
if(prob(base_message_chance))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
return
|
||||
|
||||
// If the human is losing too much blood, beep.
|
||||
if(attached.blood_volume < BLOOD_VOLUME_SAFE && prob(5))
|
||||
if(attached.blood_volume < ( (BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) ) )
|
||||
visible_message("[src] beeps loudly.")
|
||||
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
|
||||
attached.transfer_blood_to(beaker, amount)
|
||||
@@ -224,4 +224,4 @@
|
||||
to_chat(user, "<span class='notice'>[attached ? attached : "No one"] is attached.</span>")
|
||||
|
||||
#undef IV_TAKING
|
||||
#undef IV_INJECTING
|
||||
#undef IV_INJECTING
|
||||
|
||||
@@ -310,7 +310,7 @@ SLIME SCANNER
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(H.bleed_rate)
|
||||
msg += "<span class='danger'>Subject is bleeding!</span>\n"
|
||||
var/blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100)
|
||||
var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
|
||||
var/blood_type = C.dna.blood_type
|
||||
if(blood_id != "blood")//special blood substance
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id]
|
||||
@@ -318,9 +318,9 @@ SLIME SCANNER
|
||||
blood_type = R.name
|
||||
else
|
||||
blood_type = blood_id
|
||||
if(C.blood_volume <= BLOOD_VOLUME_SAFE && C.blood_volume > BLOOD_VOLUME_OKAY)
|
||||
if(C.blood_volume <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.blood_volume > (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>LOW blood level [blood_percent] %, [C.blood_volume] cl,</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else if(C.blood_volume <= BLOOD_VOLUME_OKAY)
|
||||
else if(C.blood_volume <= (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>CRITICAL blood level [blood_percent] %, [C.blood_volume] cl,</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else
|
||||
msg += "<span class='info'>Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]</span>\n"
|
||||
|
||||
+2
-1
@@ -29,6 +29,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
|
||||
send_speech(message, 7, src, , spans, message_language=language)
|
||||
|
||||
/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
//message_admins("Pre: [message], [speaker], [message_language], [raw_message], [radio_freq], [spans], [message_mode]")
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
|
||||
|
||||
/atom/movable/proc/can_speak()
|
||||
@@ -97,7 +98,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
|
||||
var/spanned = attach_spans(input, spans)
|
||||
return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]"
|
||||
// Citadel edit [spanned ? ", \"[spanned]\"" : ""]"
|
||||
|
||||
|
||||
/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode)
|
||||
if(has_language(language))
|
||||
var/atom/movable/AM = speaker.GetSource()
|
||||
|
||||
@@ -652,15 +652,15 @@
|
||||
if(H.stat == DEAD)
|
||||
to_chat(user,"<span class='warning'>Only a revive rune can bring back the dead!</span>")
|
||||
return
|
||||
if(H.blood_volume < BLOOD_VOLUME_SAFE)
|
||||
var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume
|
||||
if(H.blood_volume < (BLOOD_VOLUME_SAFE*H.blood_ratio))
|
||||
var/restore_blood = (BLOOD_VOLUME_SAFE*H.blood_ratio) - H.blood_volume
|
||||
if(uses*2 < restore_blood)
|
||||
H.blood_volume += uses*2
|
||||
to_chat(user,"<span class='danger'>You use the last of your blood rites to restore what blood you could!</span>")
|
||||
uses = 0
|
||||
return ..()
|
||||
else
|
||||
H.blood_volume = BLOOD_VOLUME_SAFE
|
||||
H.blood_volume = (BLOOD_VOLUME_SAFE*H.blood_ratio)
|
||||
uses -= round(restore_blood/2)
|
||||
to_chat(user,"<span class='warning'>Your blood rites have restored [H == user ? "your" : "[H.p_their()]"] blood to safe levels!</span>")
|
||||
var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss()
|
||||
@@ -695,7 +695,7 @@
|
||||
if(H.cultslurring)
|
||||
to_chat(user,"<span class='danger'>[H.p_their(TRUE)] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!</span>")
|
||||
return
|
||||
if(H.blood_volume > BLOOD_VOLUME_SAFE)
|
||||
if(H.blood_volume > (BLOOD_VOLUME_SAFE*H.blood_ratio))
|
||||
H.blood_volume -= 100
|
||||
uses += 50
|
||||
user.Beam(H,icon_state="drainbeam",time=10)
|
||||
@@ -796,4 +796,4 @@
|
||||
to_chat(user, "<span class='cultlarge'><b>Your hands glow with POWER OVERWHELMING!!!</b></span>")
|
||||
else
|
||||
to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>")
|
||||
qdel(rite)
|
||||
qdel(rite)
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
var/mob/living/simple_animal/M = L
|
||||
if(M.health < M.maxHealth)
|
||||
M.adjustHealth(-3)
|
||||
if(ishuman(L) && L.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(ishuman(L) && L.blood_volume < (BLOOD_VOLUME_NORMAL * L.blood_ratio))
|
||||
L.blood_volume += 1.0
|
||||
CHECK_TICK
|
||||
if(last_corrupt <= world.time)
|
||||
|
||||
@@ -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;}
|
||||
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
/mob/living/carbon/monkey/handle_blood()
|
||||
if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio))
|
||||
blood_volume += 0.1 // regenerate blood VERY slowly
|
||||
if(blood_volume < BLOOD_VOLUME_OKAY)
|
||||
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
|
||||
if(blood_volume < (BLOOD_VOLUME_OKAY * blood_ratio))
|
||||
adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/handle_blood()
|
||||
@@ -33,7 +33,7 @@
|
||||
if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL && !has_trait(TRAIT_NOHUNGER))
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !has_trait(TRAIT_NOHUNGER))
|
||||
var/nutrition_ratio = 0
|
||||
switch(nutrition)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
@@ -49,26 +49,26 @@
|
||||
if(satiety > 80)
|
||||
nutrition_ratio *= 1.25
|
||||
nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR)
|
||||
blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio)
|
||||
blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio)
|
||||
|
||||
//Effects of bloodloss
|
||||
var/word = pick("dizzy","woozy","faint")
|
||||
switch(blood_volume)
|
||||
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
|
||||
if((BLOOD_VOLUME_OKAY * blood_ratio) to (BLOOD_VOLUME_SAFE * blood_ratio))
|
||||
if(prob(5))
|
||||
to_chat(src, "<span class='warning'>You feel [word].</span>")
|
||||
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
|
||||
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
|
||||
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
|
||||
adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1))
|
||||
if((BLOOD_VOLUME_BAD * blood_ratio) to (BLOOD_VOLUME_OKAY*blood_ratio))
|
||||
adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
|
||||
if(prob(5))
|
||||
blur_eyes(6)
|
||||
to_chat(src, "<span class='warning'>You feel very [word].</span>")
|
||||
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
|
||||
if((BLOOD_VOLUME_SURVIVE * blood_ratio) to (BLOOD_VOLUME_BAD * blood_ratio))
|
||||
adjustOxyLoss(5)
|
||||
if(prob(15))
|
||||
Unconscious(rand(20,60))
|
||||
to_chat(src, "<span class='warning'>You feel extremely [word].</span>")
|
||||
if(-INFINITY to BLOOD_VOLUME_SURVIVE)
|
||||
if(-INFINITY to (BLOOD_VOLUME_SURVIVE * blood_ratio))
|
||||
if(!has_trait(TRAIT_NODEATH))
|
||||
death()
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
blood_volume = initial(blood_volume)
|
||||
|
||||
/mob/living/carbon/human/restore_blood()
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
|
||||
bleed_rate = 0
|
||||
|
||||
/****************************************************
|
||||
@@ -122,7 +122,7 @@
|
||||
/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced)
|
||||
if(!blood_volume || !AM.reagents)
|
||||
return 0
|
||||
if(blood_volume < BLOOD_VOLUME_BAD && !forced)
|
||||
if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced)
|
||||
return 0
|
||||
|
||||
if(blood_volume < amount)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
create_reagents(1000)
|
||||
update_body_parts() //to update the carbon's new bodyparts appearance
|
||||
GLOB.carbon_list += src
|
||||
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
|
||||
|
||||
/mob/living/carbon/Destroy()
|
||||
//This must be done first, so the mob ghosts correctly before DNA etc is nulled
|
||||
@@ -910,3 +911,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
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
if(DISGUST_LEVEL_DISGUSTED to INFINITY)
|
||||
msg += "[t_He] look[p_s()] extremely disgusted.\n"
|
||||
|
||||
if(blood_volume < BLOOD_VOLUME_SAFE)
|
||||
if(blood_volume < (BLOOD_VOLUME_SAFE*blood_ratio))
|
||||
msg += "[t_He] [t_has] pale skin.\n"
|
||||
|
||||
if(bleedsuppress)
|
||||
|
||||
@@ -46,14 +46,14 @@
|
||||
H.adjustBruteLoss(5)
|
||||
to_chat(H, "<span class='danger'>You feel empty!</span>")
|
||||
|
||||
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(H.blood_volume < (BLOOD_VOLUME_NORMAL * H.blood_ratio))
|
||||
if(H.nutrition >= NUTRITION_LEVEL_STARVING)
|
||||
H.blood_volume += 3
|
||||
H.nutrition -= 2.5
|
||||
if(H.blood_volume < BLOOD_VOLUME_OKAY)
|
||||
if(H.blood_volume < (BLOOD_VOLUME_OKAY*H.blood_ratio))
|
||||
if(prob(5))
|
||||
to_chat(H, "<span class='danger'>You feel drained!</span>")
|
||||
if(H.blood_volume < BLOOD_VOLUME_BAD)
|
||||
if(H.blood_volume < (BLOOD_VOLUME_BAD*H.blood_ratio))
|
||||
Cannibalize_Body(H)
|
||||
if(regenerate_limbs)
|
||||
regenerate_limbs.UpdateButtonIcon()
|
||||
@@ -85,7 +85,7 @@
|
||||
var/list/limbs_to_heal = H.get_missing_limbs()
|
||||
if(limbs_to_heal.len < 1)
|
||||
return 0
|
||||
if(H.blood_volume >= BLOOD_VOLUME_OKAY+40)
|
||||
if(H.blood_volume >= (BLOOD_VOLUME_OKAY*H.blood_ratio)+40)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -96,13 +96,13 @@
|
||||
to_chat(H, "<span class='notice'>You feel intact enough as it is.</span>")
|
||||
return
|
||||
to_chat(H, "<span class='notice'>You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...</span>")
|
||||
if(H.blood_volume >= 40*limbs_to_heal.len+BLOOD_VOLUME_OKAY)
|
||||
if(H.blood_volume >= 40*limbs_to_heal.len+(BLOOD_VOLUME_OKAY*H.blood_ratio))
|
||||
H.regenerate_limbs()
|
||||
H.blood_volume -= 40*limbs_to_heal.len
|
||||
to_chat(H, "<span class='notice'>...and after a moment you finish reforming!</span>")
|
||||
return
|
||||
else if(H.blood_volume >= 40)//We can partially heal some limbs
|
||||
while(H.blood_volume >= BLOOD_VOLUME_OKAY+40)
|
||||
while(H.blood_volume >= (BLOOD_VOLUME_OKAY*H.blood_ratio)+40)
|
||||
var/healed_limb = pick(limbs_to_heal)
|
||||
H.regenerate_limb(healed_limb)
|
||||
limbs_to_heal -= healed_limb
|
||||
@@ -136,7 +136,7 @@
|
||||
bodies -= C // This means that the other bodies maintain a link
|
||||
// so if someone mindswapped into them, they'd still be shared.
|
||||
bodies = null
|
||||
C.blood_volume = min(C.blood_volume, BLOOD_VOLUME_NORMAL)
|
||||
C.blood_volume = min(C.blood_volume, (BLOOD_VOLUME_NORMAL*C.blood_ratio))
|
||||
..()
|
||||
|
||||
/datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
@@ -727,4 +727,4 @@
|
||||
to_chat(H, "<span class='notice'>You connect [target]'s mind to your slime link!</span>")
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You can't seem to link [target]'s mind...</span>")
|
||||
to_chat(target, "<span class='warning'>The foreign presence leaves your mind.</span>")
|
||||
to_chat(target, "<span class='warning'>The foreign presence leaves your mind.</span>")
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
C.adjustCloneLoss(-4)
|
||||
return
|
||||
C.blood_volume -= 0.75
|
||||
if(C.blood_volume <= BLOOD_VOLUME_SURVIVE)
|
||||
if(C.blood_volume <= (BLOOD_VOLUME_SURVIVE*C.blood_ratio))
|
||||
to_chat(C, "<span class='danger'>You ran out of blood!</span>")
|
||||
C.dust()
|
||||
var/area/A = get_area(C)
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
for(var/datum/brain_trauma/trauma in get_traumas())
|
||||
message = trauma.on_say(message)
|
||||
message = ..(message)
|
||||
|
||||
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)
|
||||
if(!T) //hoooooouaah!
|
||||
var/regex/tongueless_lower = new("\[gdntke]+", "g")
|
||||
@@ -45,4 +52,4 @@
|
||||
return
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/trauma = T
|
||||
message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
|
||||
message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
|
||||
|
||||
@@ -525,7 +525,7 @@
|
||||
var/trail_type = getTrail()
|
||||
if(trail_type)
|
||||
var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1)
|
||||
if(blood_volume && blood_volume > max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold
|
||||
if(blood_volume && blood_volume > max((BLOOD_VOLUME_NORMAL*blood_ratio)*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold
|
||||
blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage.
|
||||
var/newdir = get_dir(target_turf, start)
|
||||
if(newdir != direction)
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added
|
||||
|
||||
var/blood_volume = 0 //how much blood the mob has
|
||||
var/blood_ratio = 1 //How much blood the mob needs, in terms of ratio (i.e 1.2 will require BLOOD_VOLUME_NORMAL of 672) DO NOT GO ABOVE 3.55 Well, actually you can but, then they can't get enough blood.
|
||||
var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override
|
||||
|
||||
var/see_override = 0 //0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight()
|
||||
|
||||
@@ -273,6 +273,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()
|
||||
|
||||
@@ -56,3 +56,39 @@ Where what the reactions do, the code that sets what they do.
|
||||
|
||||
~\ss13\Citadel-Station-13\tgui\src\interfaces~
|
||||
This contains the 4 scripts for generation of the UI for operation of the various chemical equipments.
|
||||
|
||||
//Mixables
|
||||
var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works
|
||||
var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words works
|
||||
var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words works
|
||||
//phase 0
|
||||
var/static/regex/saymyname_words = regex("say my name|who am i|whoami") //works I think
|
||||
var/static/regex/wakeup_words = regex("revert|awaken|snap") //works
|
||||
//phase1
|
||||
var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") //works
|
||||
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")
|
||||
var/static/regex/attract_words = regex("come here|come to me|get over here|attract")
|
||||
//phase 2
|
||||
var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //wah, lewd
|
||||
var/static/regex/awoo_words = regex("howl|awoo|bark")
|
||||
var/static/regex/nya_words = regex("nya|meow|mewl")
|
||||
var/static/regex/sleep_words = regex("sleep|slumber|rest")
|
||||
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/knockdown_words = regex("drop|fall|trip|knockdown|kneel")
|
||||
//phase 3
|
||||
var/static/regex/statecustom_words = regex("state triggers|state your triggers")
|
||||
var/static/regex/custom_words = regex("new trigger|listen to me")
|
||||
var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name!
|
||||
var/static/regex/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/pacify_words = regex("more and more docile|complaisant|friendly|pacifist")
|
||||
var/static/regex/charge_words = regex("charge|oorah|attack")
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
@@ -462,8 +449,8 @@ im
|
||||
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)
|
||||
|
||||
//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)
|
||||
multiplier = min(multiplier, (get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup)
|
||||
//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.
|
||||
@@ -476,7 +463,7 @@ im
|
||||
|
||||
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
|
||||
@@ -494,6 +481,10 @@ im
|
||||
//else
|
||||
// fermiIsReacting = FALSE
|
||||
// STOP_PROCESSING(SSfastprocess, src)
|
||||
else if (chem_temp > C.ExplodeTemp)
|
||||
var/datum/chemical_reaction/fermi/Ferm = selected_reaction
|
||||
Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH)
|
||||
return 0
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -543,64 +534,82 @@ im
|
||||
return 0//end!
|
||||
|
||||
/datum/reagents/process()
|
||||
var/datum/chemical_reaction/C = fermiReactID
|
||||
var/datum/chemical_reaction/fermi/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
|
||||
//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()
|
||||
update_total()
|
||||
var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id]
|
||||
Ferm.FermiFinish(src, multiplier)
|
||||
//var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id]
|
||||
C.FermiFinish(src, my_atom, multiplier)
|
||||
//C.on_reaction(src, multiplier, special_react_result)
|
||||
//Reaction sounds and words
|
||||
playsound(get_turf(my_atom), C.mix_sound, 80, 1)
|
||||
var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers
|
||||
var/iconhtml = icon2html(my_atom, seen)
|
||||
for(var/mob/M in seen)
|
||||
to_chat(M, "<span class='notice'>[iconhtml] [C.mix_message]</span>")
|
||||
return
|
||||
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()
|
||||
update_total()
|
||||
var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id]
|
||||
Ferm.FermiFinish(src, multiplier)
|
||||
//var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id]
|
||||
C.FermiFinish(src, my_atom, multiplier)
|
||||
//C.on_reaction(src, multiplier, special_react_result)
|
||||
//Reaction sounds and words
|
||||
playsound(get_turf(my_atom), C.mix_sound, 80, 1)
|
||||
var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers
|
||||
var/iconhtml = icon2html(my_atom, seen)
|
||||
for(var/mob/M in seen)
|
||||
to_chat(M, "<span class='notice'>[iconhtml] [C.mix_message]</span>")
|
||||
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
|
||||
handle_reactions()
|
||||
update_total()
|
||||
var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id]
|
||||
Ferm.FermiFinish(src, multiplier)
|
||||
//var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id]
|
||||
C.FermiFinish(src, my_atom, multiplier)
|
||||
//C.on_reaction(src, multiplier, special_react_result)
|
||||
//Reaction sounds and words
|
||||
playsound(get_turf(my_atom), C.mix_sound, 80, 1)
|
||||
var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers
|
||||
var/iconhtml = icon2html(my_atom, seen)
|
||||
for(var/mob/M in seen)
|
||||
to_chat(M, "<span class='notice'>[iconhtml] [C.mix_message]</span>")
|
||||
return
|
||||
|
||||
//handle_reactions()
|
||||
@@ -615,28 +624,30 @@ 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)
|
||||
return
|
||||
|
||||
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)
|
||||
return
|
||||
|
||||
//For now, purity is handled elsewhere
|
||||
|
||||
@@ -660,10 +671,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)
|
||||
@@ -672,61 +683,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
|
||||
@@ -873,18 +894,15 @@ 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)
|
||||
my_atom.on_reagent_change(ADD_REAGENT)
|
||||
//if(R.FermiChem == TRUE)
|
||||
// R.on_mob_add(my_atom)
|
||||
R.on_merge(data, amount)
|
||||
R.on_merge(data, amount, my_atom, other_purity)
|
||||
if(!no_react)
|
||||
handle_reactions()
|
||||
|
||||
@@ -901,6 +919,8 @@ im
|
||||
if(data)
|
||||
R.data = data
|
||||
R.on_new(data)
|
||||
if(R.addProc == TRUE)
|
||||
R.on_new(my_atom)
|
||||
if(istype(D, /datum/reagent/fermi))//Is this a fermichem?
|
||||
var/datum/reagent/fermi/Ferm = D //It's Fermi time!
|
||||
Ferm.FermiNew(my_atom) //Seriously what is "data" ????
|
||||
@@ -914,7 +934,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
|
||||
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
var/self_consuming = FALSE
|
||||
//Fermichem vars:
|
||||
var/purity = 1
|
||||
var/addProc = FALSE //When this reagent is added to a new beaker, it does something.
|
||||
//var/ImpureChem = "toxin"
|
||||
var/loc = null //Should be the creation location!
|
||||
var/pH = 7
|
||||
|
||||
@@ -576,8 +576,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
|
||||
|
||||
/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C)
|
||||
if(C.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
C.blood_volume = min(BLOOD_VOLUME_NORMAL, C.blood_volume + 3) //Bloody Mary quickly restores blood loss.
|
||||
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
|
||||
C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss.
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/brave_bull
|
||||
|
||||
@@ -61,8 +61,8 @@
|
||||
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
|
||||
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.blood_volume = (BLOOD_VOLUME_NORMAL*M.blood_ratio)
|
||||
|
||||
for(var/thing in M.diseases)
|
||||
var/datum/disease/D = thing
|
||||
|
||||
@@ -288,7 +288,7 @@
|
||||
M.adjustOxyLoss(-2, 0)
|
||||
M.adjustBruteLoss(-2, 0)
|
||||
M.adjustFireLoss(-2, 0)
|
||||
if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(ishuman(M) && M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.blood_volume += 3
|
||||
else // Will deal about 90 damage when 50 units are thrown
|
||||
M.adjustBrainLoss(3, 150)
|
||||
@@ -906,7 +906,7 @@
|
||||
color = "#C8A5DC" // rgb: 200, 165, 220
|
||||
|
||||
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
|
||||
if(C.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
|
||||
C.blood_volume += 0.5
|
||||
..()
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
color = "#792300" // rgb: 121, 35, 0
|
||||
toxpwr = 2.5
|
||||
taste_description = "mushroom"
|
||||
pH = 13
|
||||
|
||||
/datum/reagent/toxin/mutagen
|
||||
name = "Unstable mutagen"
|
||||
@@ -32,6 +33,7 @@
|
||||
toxpwr = 0
|
||||
taste_description = "slime"
|
||||
taste_mult = 0.9
|
||||
pH = 2
|
||||
|
||||
/datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume)
|
||||
if(!..())
|
||||
@@ -61,6 +63,7 @@
|
||||
taste_mult = 1.5
|
||||
color = "#8228A0"
|
||||
toxpwr = 3
|
||||
pH = 4
|
||||
|
||||
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
|
||||
if(holder.has_reagent("epinephrine"))
|
||||
@@ -93,6 +96,7 @@
|
||||
color = "#7DC3A0"
|
||||
toxpwr = 0
|
||||
taste_description = "acid"
|
||||
pH = 1.2
|
||||
|
||||
/datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/C)
|
||||
. = TRUE
|
||||
@@ -115,6 +119,7 @@
|
||||
toxpwr = 0
|
||||
taste_description = "slime"
|
||||
taste_mult = 1.3
|
||||
pH = 10
|
||||
|
||||
/datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(10))
|
||||
@@ -133,6 +138,7 @@
|
||||
color = "#CF3600" // rgb: 207, 54, 0
|
||||
toxpwr = 0
|
||||
taste_description = "mint"
|
||||
pH = 8
|
||||
|
||||
/datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M)
|
||||
if(M.has_trait(TRAIT_FAT))
|
||||
@@ -146,6 +152,7 @@
|
||||
color = "#003333" // rgb: 0, 51, 51
|
||||
toxpwr = 2
|
||||
taste_description = "fish"
|
||||
pH = 12
|
||||
|
||||
/datum/reagent/toxin/zombiepowder
|
||||
name = "Zombie Powder"
|
||||
@@ -155,6 +162,7 @@
|
||||
color = "#669900" // rgb: 102, 153, 0
|
||||
toxpwr = 0.5
|
||||
taste_description = "death"
|
||||
pH = 13
|
||||
|
||||
/datum/reagent/toxin/zombiepowder/on_mob_add(mob/living/L)
|
||||
..()
|
||||
@@ -177,6 +185,7 @@
|
||||
color = "#664700" // rgb: 102, 71, 0
|
||||
toxpwr = 0.8
|
||||
taste_description = "death"
|
||||
pH = 14.5
|
||||
|
||||
/datum/reagent/toxin/ghoulpowder/on_mob_add(mob/living/L)
|
||||
..()
|
||||
@@ -198,6 +207,7 @@
|
||||
color = "#B31008" // rgb: 139, 166, 233
|
||||
toxpwr = 0
|
||||
taste_description = "sourness"
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M)
|
||||
M.hallucination += 5
|
||||
@@ -210,6 +220,7 @@
|
||||
color = "#49002E" // rgb: 73, 0, 46
|
||||
toxpwr = 1
|
||||
taste_mult = 1
|
||||
pH = 2
|
||||
|
||||
/datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume)
|
||||
if(istype(O, /obj/structure/alien/weeds))
|
||||
@@ -234,6 +245,7 @@
|
||||
id = "weedkiller"
|
||||
description = "A harmful toxic mixture to kill weeds. Do not ingest!"
|
||||
color = "#4B004B" // rgb: 75, 0, 75
|
||||
pH = 3
|
||||
|
||||
/datum/reagent/toxin/pestkiller
|
||||
name = "Pest Killer"
|
||||
@@ -241,6 +253,7 @@
|
||||
description = "A harmful toxic mixture to kill pests. Do not ingest!"
|
||||
color = "#4B004B" // rgb: 75, 0, 75
|
||||
toxpwr = 1
|
||||
pH = 3.2
|
||||
|
||||
/datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
..()
|
||||
@@ -254,6 +267,7 @@
|
||||
description = "A natural toxin produced by blob spores that inhibits vision when ingested."
|
||||
color = "#9ACD32"
|
||||
toxpwr = 1
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C)
|
||||
C.damageoverlaytemp = 60
|
||||
@@ -268,6 +282,7 @@
|
||||
color = "#9ACD32"
|
||||
toxpwr = 0.5
|
||||
taste_description = "burning"
|
||||
pH = 13
|
||||
|
||||
/datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/M)
|
||||
M.adjust_fire_stacks(2)
|
||||
@@ -282,6 +297,7 @@
|
||||
color = "#000067" // rgb: 0, 0, 103
|
||||
toxpwr = 0
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/toxin/chloralhydrate/on_mob_life(mob/living/carbon/M)
|
||||
switch(current_cycle)
|
||||
@@ -325,6 +341,7 @@
|
||||
glass_icon_state = "beerglass"
|
||||
glass_name = "glass of beer"
|
||||
glass_desc = "A freezing pint of beer."
|
||||
pH = 2
|
||||
|
||||
/datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/M)
|
||||
switch(current_cycle)
|
||||
@@ -342,6 +359,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#5B2E0D" // rgb: 91, 46, 13
|
||||
toxpwr = 0.5
|
||||
pH = 4.2
|
||||
|
||||
/datum/reagent/toxin/teapowder
|
||||
name = "Ground Tea Leaves"
|
||||
@@ -350,6 +368,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#7F8400" // rgb: 127, 132, 0
|
||||
toxpwr = 0.5
|
||||
pH = 4.9
|
||||
|
||||
/datum/reagent/toxin/mutetoxin //the new zombie powder.
|
||||
name = "Mute Toxin"
|
||||
@@ -358,6 +377,7 @@
|
||||
color = "#F0F8FF" // rgb: 240, 248, 255
|
||||
toxpwr = 0
|
||||
taste_description = "silence"
|
||||
pH = 12.2
|
||||
|
||||
/datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M)
|
||||
M.silent = max(M.silent, 3)
|
||||
@@ -815,6 +835,7 @@
|
||||
var/acidpwr = 10 //the amount of protection removed from the armour
|
||||
taste_description = "acid"
|
||||
self_consuming = TRUE
|
||||
pH = 2.75
|
||||
|
||||
/datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
|
||||
if(!istype(C))
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/obj/item/reagent_containers/attack(mob/M, mob/user, def_zone)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
|
||||
/*Checking to see if I can delete this
|
||||
/obj/item/reagent_containers/attack(obj/item/W, mob/user, params)
|
||||
..()
|
||||
if(!istype(W, /obj/item/pHpaper))
|
||||
@@ -85,7 +85,7 @@
|
||||
if(-INFINITY to 1)
|
||||
P.color = "#ef1d26"
|
||||
P.used = TRUE
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
/datum/nanite_program/blood_restoring/check_conditions()
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(C.blood_volume >= BLOOD_VOLUME_SAFE)
|
||||
if(C.blood_volume >= (BLOOD_VOLUME_SAFE*C.blood_ratio))
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
@@ -248,4 +248,3 @@
|
||||
log_game("[C] has been successfully defibrillated by nanites.")
|
||||
else
|
||||
playsound(C, 'sound/machines/defib_failed.ogg', 50, 0)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -87,6 +87,8 @@
|
||||
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
|
||||
var/breathModifier = (5-(5*(damage/maxHealth)/2)) //range 2.5 - 5
|
||||
if((H.status_flags & GODMODE))
|
||||
return
|
||||
if(H.has_trait(TRAIT_NOBREATH))
|
||||
@@ -157,7 +159,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(-breathModifier) //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 +188,7 @@
|
||||
else
|
||||
H.failed_last_breath = FALSE
|
||||
if(H.health >= H.crit_threshold)
|
||||
H.adjustOxyLoss(-5*((damage/maxHealth)/2))
|
||||
H.adjustOxyLoss(-breathModifier)
|
||||
gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES]
|
||||
H.clear_alert("nitro")
|
||||
|
||||
@@ -223,7 +225,7 @@
|
||||
else
|
||||
H.failed_last_breath = FALSE
|
||||
if(H.health >= H.crit_threshold)
|
||||
H.adjustOxyLoss(-5*((damage/maxHealth)/2))
|
||||
H.adjustOxyLoss(-breathModifier)
|
||||
gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES]
|
||||
H.clear_alert("not_enough_co2")
|
||||
|
||||
@@ -253,7 +255,7 @@
|
||||
else
|
||||
H.failed_last_breath = FALSE
|
||||
if(H.health >= H.crit_threshold)
|
||||
H.adjustOxyLoss(-5*((damage/maxHealth)/2))
|
||||
H.adjustOxyLoss(-breathModifier)
|
||||
gas_breathed = breath_gases[/datum/gas/plasma][MOLES]
|
||||
H.clear_alert("not_enough_tox")
|
||||
|
||||
|
||||
@@ -575,7 +575,7 @@
|
||||
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
|
||||
if(H.canbearoused && H.has_dna() && H.has_trait(TRAIT_NYMPHO)) // probably a redundant check but for good measure
|
||||
H.mob_climax(forced_climax=TRUE)
|
||||
|
||||
//DAB
|
||||
@@ -616,35 +616,26 @@
|
||||
/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)
|
||||
icon_state = "in_love"
|
||||
//actions_types = list(/datum/action/item_action/organ_action/velvet)
|
||||
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/velvet
|
||||
name = "Velvet voice"
|
||||
var/obj/item/organ/vocal_cords/velvet/cords = null
|
||||
|
||||
/datum/action/item_action/organ_action/colossus/New()
|
||||
/datum/action/item_action/organ_action/velvet/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
|
||||
/datum/action/item_action/organ_action/velvet/IsAvailable()
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/organ_action/colossus/Trigger()
|
||||
/datum/action/item_action/organ_action/velvet/Trigger()
|
||||
. = ..()
|
||||
if(!IsAvailable())
|
||||
if(world.time < cords.next_command)
|
||||
@@ -658,16 +649,12 @@
|
||||
owner.say(".x[command]")
|
||||
|
||||
/obj/item/organ/vocal_cords/colossus/can_speak_with()
|
||||
if(world.time < next_command)
|
||||
to_chat(owner, "<span class='notice'>You must wait [DisplayTimeText(next_command - world.time)] before Speaking again.</span>")
|
||||
return FALSE
|
||||
if(!owner)
|
||||
return FALSE
|
||||
if(!owner.can_speak())
|
||||
to_chat(owner, "<span class='warning'>You are unable to speak!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
*/
|
||||
|
||||
/obj/item/organ/vocal_cords/velvet/handle_speech(message)
|
||||
velvetspeech(message, owner, spans, base_multiplier)
|
||||
@@ -678,18 +665,19 @@
|
||||
/obj/item/organ/vocal_cords/velvet/speak_with(message)
|
||||
velvetspeech(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
|
||||
//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 = FALSE)
|
||||
//message_admins("Velvet speech proc'd on [user]")
|
||||
|
||||
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")
|
||||
@@ -697,8 +685,8 @@
|
||||
span_list = list("ratvar")
|
||||
else
|
||||
span_list = list()
|
||||
|
||||
user.say(message, sanitize = TRUE)//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//DO NOT ENABLE, RECURSION HELL
|
||||
|
||||
//FIND THRALLS
|
||||
|
||||
@@ -714,13 +702,12 @@
|
||||
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(!listeners.len)
|
||||
cooldown = COOLDOWN_NONE
|
||||
return cooldown
|
||||
return 0
|
||||
|
||||
//POWER CALCULATIONS
|
||||
|
||||
@@ -779,12 +766,15 @@
|
||||
if(specific_listeners.len)
|
||||
listeners = specific_listeners
|
||||
//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)
|
||||
message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1)//I have no idea what this does
|
||||
|
||||
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
|
||||
|
||||
if(debug == TRUE)
|
||||
to_chat(world, "[user]'s power is [power_multiplier].")
|
||||
|
||||
/* 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
|
||||
@@ -793,14 +783,14 @@
|
||||
*/
|
||||
|
||||
//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/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works
|
||||
var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words works
|
||||
var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words works
|
||||
//phase 0
|
||||
var/static/regex/saymyname_words = regex("say my name|who am i|whoami")
|
||||
var/static/regex/wakeup_words = regex("revert|awaken|snap")
|
||||
var/static/regex/saymyname_words = regex("say my name|who am i|whoami") //works I think
|
||||
var/static/regex/wakeup_words = regex("revert|awaken|snap") //works
|
||||
//phase1
|
||||
var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush")
|
||||
var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") //works
|
||||
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")
|
||||
@@ -813,11 +803,13 @@
|
||||
var/static/regex/strip_words = regex("strip|derobe|nude")
|
||||
var/static/regex/walk_words = regex("slow down")
|
||||
var/static/regex/run_words = regex("run")
|
||||
var/static/regex/liedown_words = regex("lie down") //TO ADD
|
||||
var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel")
|
||||
//phase 3
|
||||
var/static/regex/statecustom_words = regex("state triggers|state your triggers")
|
||||
var/static/regex/custom_words = regex("new trigger|listen to me")
|
||||
var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|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/recognise_words = regex("recognise me|i'm back|did you miss me?")
|
||||
var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed")
|
||||
var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die")
|
||||
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
|
||||
@@ -825,16 +817,17 @@
|
||||
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/pacify_words = regex("More and more docile|complaisant|friendly|pacifist")
|
||||
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)
|
||||
|
||||
var/distancelist = list(2,2,1.5,1.3,1.15,1,0.8,0.6,0.5,0.25)
|
||||
|
||||
//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
|
||||
//ENTHRAL mixable (works I think)
|
||||
if(findtext(message, enthral_words))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
@@ -845,56 +838,78 @@
|
||||
E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word.
|
||||
else
|
||||
E.enthrallTally += power_multiplier*1.25
|
||||
if(L.canbearoused)
|
||||
if(L.lewd)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='nicegreen'><i><b>[E.enthrallGender] is so nice to listen to.</b></i></span>"), 5)
|
||||
E.cooldown += 1
|
||||
|
||||
//REWARD mixable
|
||||
//REWARD mixable works
|
||||
if(findtext(message, reward_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)
|
||||
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)
|
||||
if (L.lewd)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='nicegreen'>[E.enthrallGender] has praised me!!</b></span>"), 5)
|
||||
if(L.has_trait(TRAIT_NYMPHO))
|
||||
L.adjustArousalLoss(2*power_multiplier)
|
||||
else
|
||||
E.resistanceTally /= 2*power_multiplier
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='nicegreen'><b><i>I've been praised for doing a good job!</b></i></span>"), 5)
|
||||
E.resistanceTally -= power_multiplier
|
||||
E.enthrallTally += 1
|
||||
var/descmessage = "[(L.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]"
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise, descmessage)
|
||||
E.cooldown += 1
|
||||
|
||||
//PUNISH mixable
|
||||
//PUNISH mixable works
|
||||
else if(findtext(message, punish_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)
|
||||
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)
|
||||
if (L.lewd)
|
||||
E.resistanceTally /= 1*power_multiplier
|
||||
L.adjustArousalLoss(-2*power_multiplier)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='warning'>I've let [E.enthrallGender] down...</b></span>"), 5)
|
||||
else
|
||||
E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously)
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='warning'>I've failed [E.master]...</b></span>"), 5)
|
||||
|
||||
var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]"
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold, descmessage)
|
||||
E.resistanceTally += 1
|
||||
E.enthrallTally += power_multiplier
|
||||
E.cooldown += 1
|
||||
|
||||
//teir 0
|
||||
//SAY MY NAME
|
||||
//SAY MY NAME works
|
||||
if((findtext(message, saymyname_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
addtimer(CALLBACK(L, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here
|
||||
var/mob/living/carbon/C = V
|
||||
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
C.remove_trait(TRAIT_MUTE, "enthrall")
|
||||
if(C.lewd)
|
||||
addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5)
|
||||
else
|
||||
addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5)//The least lewdest I could think of
|
||||
|
||||
//WAKE UP
|
||||
else if((findtext(message, wakeup_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.SetSleeping(0)//Can you hear while asleep?
|
||||
switch(E.phase)
|
||||
if(0)
|
||||
E.phase = 3
|
||||
E.status = null
|
||||
to_chat(L, "<span class='warning'>The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.</b></span>")
|
||||
L.SetSleeping(0)//Can you hear while asleep?
|
||||
user.emote("snap")
|
||||
if(L.lewd)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='big warning'>The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve.</b></span>"), 5)
|
||||
else
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='big warning'>The snapping of [E.master]'s fingers brings you back to being under their command.</b></span>"), 5)
|
||||
//to_chat(L, )
|
||||
|
||||
|
||||
//tier 1
|
||||
//SILENCE
|
||||
@@ -903,11 +918,19 @@
|
||||
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
|
||||
|
||||
//SPEAK
|
||||
else if((findtext(message, silence_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.remove_trait(TRAIT_MUTE, "enthrall")
|
||||
E.cooldown += 3
|
||||
|
||||
|
||||
//Antiresist
|
||||
else if((findtext(message, antiresist_words)))
|
||||
for(var/V in listeners)
|
||||
@@ -923,20 +946,27 @@
|
||||
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.owner_resist()
|
||||
E.cooldown += 2
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "<span class='notice'>You are spurred into resisting from [user]'s words!'</b></span>"), 5)
|
||||
|
||||
//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/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
C.Sleeping(40)
|
||||
to_chat(C, "<span class='warning'>You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!</b></span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "<span class='warning'>You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!</b></span>"), 5)
|
||||
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
|
||||
if(C.lewd)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "<span class='big warning'>You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened.</b></span>"), 5)
|
||||
else
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "<span class='big warning'>You revert to who you were before, with no memory of what happened with [E.master].</b></span>"), 5)
|
||||
|
||||
//ATTRACT
|
||||
else if((findtext(message, attract_words)))
|
||||
@@ -945,42 +975,24 @@
|
||||
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
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You are drawn towards [user]!</b></span>"), 5)
|
||||
|
||||
|
||||
//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
|
||||
|
||||
|
||||
//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(E.phase > 1)
|
||||
if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure
|
||||
if(H.has_trait(TRAIT_NYMPHO) && 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).
|
||||
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
|
||||
E.cooldown += 6
|
||||
|
||||
|
||||
//awoo
|
||||
@@ -1000,9 +1012,8 @@
|
||||
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)
|
||||
H.emote("me","lets out a nya!")
|
||||
playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1)
|
||||
H.emote("me", 1, "lets out a nya!")
|
||||
E.cooldown += 1
|
||||
|
||||
//SLEEP
|
||||
@@ -1011,7 +1022,7 @@
|
||||
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)
|
||||
C.Sleeping(30 * power_multiplier)
|
||||
E.cooldown += 10
|
||||
|
||||
//STRIP
|
||||
@@ -1023,12 +1034,13 @@
|
||||
if(2 to INFINITY)//Tier 2 only
|
||||
E.phase = 1
|
||||
var/items = H.get_contents()
|
||||
for(var/I in items)
|
||||
H.dropItemToGround(I, TRUE)
|
||||
to_chat(H, "<span class='warning'>Before you can even think about it, you quickly remove your clothes in response to your Master's command.</b></span>")
|
||||
for(var/obj/item/W in items)
|
||||
if(W == H.w_uniform || W == H.wear_suit)
|
||||
H.dropItemToGround(W, TRUE)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "<span class='warning'>Before you can even think about it, you quickly remove your clothes in response to [(H.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")].</b></span>"), 5)
|
||||
E.cooldown += 10
|
||||
|
||||
//WALK
|
||||
//WALK doesn't work?
|
||||
else if((findtext(message, walk_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
@@ -1039,7 +1051,7 @@
|
||||
L.toggle_move_intent()
|
||||
E.cooldown += 1
|
||||
|
||||
//RUN
|
||||
//RUN doesn't work?
|
||||
else if((findtext(message, run_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
@@ -1057,21 +1069,25 @@
|
||||
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)
|
||||
L.Knockdown(30 * power_multiplier * E.phase)
|
||||
E.cooldown += 8
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You suddenly drop to the ground!'</b></span>"), 5)
|
||||
|
||||
//tier3
|
||||
|
||||
//STATE TRIGGERS
|
||||
else if((findtext(message, statecustom_words)))
|
||||
else if((findtext(message, statecustom_words)))//doesn't work
|
||||
for(var/V in listeners)
|
||||
var/speaktrigger = ""
|
||||
var/mob/living/L = V
|
||||
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
if (!E.customTriggers == list())//i.e. if it's not empty
|
||||
var/mob/living/carbon/C = V
|
||||
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
if (E.phase > 3)
|
||||
for (var/trigger in E.customTriggers)
|
||||
speaktrigger = "[trigger]\n"
|
||||
L.say(speaktrigger)
|
||||
speaktrigger += "[trigger], "
|
||||
C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself!
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5)
|
||||
C.remove_trait(TRAIT_DEAF, "Triggers")
|
||||
|
||||
|
||||
//CUSTOM TRIGGERS
|
||||
else if((findtext(message, custom_words)))
|
||||
@@ -1080,19 +1096,22 @@
|
||||
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
|
||||
user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'")
|
||||
if (E.mental_capacity >= 10)
|
||||
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)))
|
||||
trigger2 = lowertext(trigger2)
|
||||
if ((findtext(trigger2, custom_words_words)))
|
||||
if (trigger2 == "speak" || trigger2 == "echo")
|
||||
var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN)
|
||||
E.customTriggers[trigger] = list(trigger2, trigger3)
|
||||
else
|
||||
E.customTriggers[trigger] = trigger2
|
||||
E.mental_capacity -= 10
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "<span class='notice'>[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger.</span>"), 5)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Your pet looks at you confused, it seems they don't understand that effect!</b></span>")
|
||||
else
|
||||
@@ -1105,11 +1124,11 @@
|
||||
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("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")
|
||||
user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'")
|
||||
if (E.mental_capacity >= 250 || message == "objective")
|
||||
var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN)
|
||||
if(!LAZYLEN(objective))
|
||||
return
|
||||
@@ -1119,18 +1138,28 @@
|
||||
objective = replacetext(lowertext(objective), "harm", "snuggle")
|
||||
objective = replacetext(lowertext(objective), "decapitate", "headpat")
|
||||
objective = replacetext(lowertext(objective), "strangle", "meow at")
|
||||
to_chat(H, "<span class='warning'>Your master whispers you a new objective.</span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "<span class='notice'>[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new objective.</span>"), 5)
|
||||
brainwash(H, objective)
|
||||
E.mental_capacity -= 150
|
||||
E.mental_capacity -= 250
|
||||
//else if (E.mental_capacity >= 150)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them</b></span>")
|
||||
|
||||
|
||||
//RECOGNISE
|
||||
else if((findtext(message, recognise_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/carbon/human/H = V
|
||||
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
if(E.phase > 1)
|
||||
if(user.ckey == E.enthrallID && user.real_name == E.master.real_name)
|
||||
E.master = user
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "<span class='nicegreen'>[(H.lewd?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]</b></span>"), 5)
|
||||
|
||||
//I dunno how to do state objectives without them revealing they're an antag
|
||||
|
||||
//HEAL (maybe make this nap instead?)
|
||||
else if((findtext(message, heal_words)))
|
||||
else if(findtext(message, heal_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)
|
||||
@@ -1139,19 +1168,22 @@
|
||||
E.status = "heal"
|
||||
E.statusStrength = (5 * power_multiplier)
|
||||
E.cooldown += 5
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You begin to lick your wounds.</b></span>"), 5)
|
||||
L.Stun(40)
|
||||
|
||||
//STUN
|
||||
if(findtext(message, stun_words))
|
||||
else if(findtext(message, stun_words))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
switch(E.phase)
|
||||
if(3 to INFINITY)//Tier 3 only
|
||||
L.Stun(30 * power_multiplier)
|
||||
L.Stun(40 * power_multiplier)
|
||||
E.cooldown += 8
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You freeze up!</b></span>"), 5)
|
||||
|
||||
//HALLUCINATE
|
||||
else if((findtext(message, hallucinate_words)))
|
||||
else if(findtext(message, hallucinate_words))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/carbon/C = V
|
||||
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
@@ -1160,28 +1192,28 @@
|
||||
new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0)
|
||||
|
||||
//HOT
|
||||
else if((findtext(message, hot_words)))
|
||||
else if(findtext(message, hot_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)
|
||||
switch(E.phase)
|
||||
if(3 to INFINITY)//Tier 3 only
|
||||
L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it
|
||||
to_chat(L, "<span class='warning'>You feel your metabolism speed up!</b></span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You feel your metabolism speed up!</b></span>"), 5)
|
||||
|
||||
//COLD
|
||||
else if((findtext(message, cold_words)))
|
||||
else if(findtext(message, cold_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)
|
||||
switch(E.phase)
|
||||
if(3 to INFINITY)//Tier 3 only
|
||||
L.adjust_bodytemperature(-10 * power_multiplier)//This
|
||||
to_chat(L, "<span class='warning'>You feel your metabolism slow down!</b></span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You feel your metabolism slow down!</b></span>"), 5)
|
||||
|
||||
|
||||
//GET UP
|
||||
else if((findtext(message, getup_words)))
|
||||
else if(findtext(message, getup_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)
|
||||
@@ -1193,9 +1225,10 @@
|
||||
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
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You jump to your feel from sheer willpower!</b></span>"), 5)
|
||||
|
||||
//PACIFY
|
||||
else if((findtext(message, pacify_words)))
|
||||
else if(findtext(message, pacify_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)
|
||||
@@ -1205,7 +1238,7 @@
|
||||
E.cooldown += 10
|
||||
|
||||
//CHARGE
|
||||
else if((findtext(message, charge_words)))
|
||||
else if(findtext(message, charge_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)
|
||||
@@ -1305,11 +1338,12 @@
|
||||
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].")
|
||||
SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message)
|
||||
//SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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;}
|
||||
|
||||
|
||||
@@ -1,41 +1,55 @@
|
||||
/datum/mood_event/eigenstate
|
||||
mood_change = -1
|
||||
mood_change = -3
|
||||
description = "<span class='warning'>Where the hell am I? Is this an alternative dimension ?</span>\n"
|
||||
|
||||
/datum/mood_event/enthrall
|
||||
mood_change = 5
|
||||
description = "<span class='nicegreen'>I am a good pet for Master.</span>\n"
|
||||
mood_change = 5
|
||||
|
||||
/datum/mood_event/enthrall/add_effects(message)
|
||||
description = "<span class='nicegreen'>[message]</span>\n"
|
||||
|
||||
/datum/mood_event/enthrallpraise
|
||||
mood_change = 12
|
||||
description = "<span class='nicegreen'>I feel so happy! I'm a good pet who Master loves!</span>\n"
|
||||
timeout = 600
|
||||
mood_change = 10
|
||||
timeout = 600
|
||||
|
||||
/datum/mood_event/enthrallpraise/add_effects(message)
|
||||
description = "<span class='nicegreen'>[message]</span>\n"
|
||||
|
||||
/datum/mood_event/enthrallscold
|
||||
mood_change = -12
|
||||
description = "<span class='warning'>I've failed Master... What a bad, bad pet!</span>\n"//aaa I'm not kinky enough for this
|
||||
timeout = 600
|
||||
mood_change = -10
|
||||
timeout = 600
|
||||
|
||||
/datum/mood_event/enthrallscold/add_effects(message)
|
||||
description = "<span class='warning'>[message]</span>\n"//aaa I'm not kinky enough for this
|
||||
|
||||
/datum/mood_event/enthrallmissing1
|
||||
mood_change = -5
|
||||
description = "<span class='warning'>I feel empty when Master's not around..</span>\n"
|
||||
mood_change = -5
|
||||
|
||||
/datum/mood_event/enthrallmissing1/add_effects(message)
|
||||
description = "<span class='warning'>[message]</span>\n"
|
||||
|
||||
/datum/mood_event/enthrallmissing2
|
||||
mood_change = -10
|
||||
description = "<span class='warning'>I feel so lost in this complicated world without Master, where are they?!</span>\n"
|
||||
mood_change = -10
|
||||
|
||||
/datum/mood_event/enthrallmissing2/add_effects(message)
|
||||
description = "<span class='warning'>[message]</span>\n"
|
||||
|
||||
/datum/mood_event/enthrallmissing3
|
||||
mood_change = -15
|
||||
description = "<span class='warning'>Where are you Master??!</span>\n"
|
||||
mood_change = -15
|
||||
|
||||
/datum/mood_event/enthrallmissing3/add_effects(message)
|
||||
description = "<span class='warning'>[message]</span>\n"
|
||||
|
||||
/datum/mood_event/enthrallmissing4
|
||||
mood_change = -25
|
||||
description = "<span class='warning'>I'm all alone, It's so hard to continute without Master...</span>\n"
|
||||
mood_change = -25
|
||||
|
||||
/datum/mood_event/enthrallmissing4/add_effects(message)
|
||||
description = "<span class='warning'>[message]</span>\n"
|
||||
|
||||
/datum/mood_event/InLove
|
||||
mood_change = 10
|
||||
description = "<span class='nicegreen'>I'm in love!!</span>\n"
|
||||
mood_change = 10
|
||||
description = "<span class='nicegreen'>I'm in love!!</span>\n"
|
||||
|
||||
/datum/mood_event/MissingLove
|
||||
mood_change = -10
|
||||
description = "<span class='warning'>I can't keep my crush off my mind, I need to see them again!</span>\n"
|
||||
mood_change = -20
|
||||
description = "<span class='warning'>I can't keep my crush off my mind, I need to see them again!</span>\n"
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
//message_admins("SDGF ticking")
|
||||
if(owner.stat == DEAD)
|
||||
//message_admins("SGDF status swapping")
|
||||
if(fermi_Clone && fermi_Clone.stat != DEAD)
|
||||
if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null))
|
||||
if(owner.mind)
|
||||
owner.mind.transfer_to(fermi_Clone)
|
||||
owner.visible_message("<span class='warning'>Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.</span>")
|
||||
@@ -44,6 +44,8 @@
|
||||
/datum/status_effect/chem/BElarger
|
||||
id = "BElarger"
|
||||
alert_type = null
|
||||
var/moveCalc = 1
|
||||
//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/list/items = list()
|
||||
//var/items = o.get_contents()
|
||||
|
||||
@@ -66,9 +68,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")
|
||||
moveCalc = 1+((round(B.cached_size) - 9)/10) //Afffects how fast you move, and how often you can click.
|
||||
if(!B)
|
||||
o.remove_movespeed_modifier("megamilk")
|
||||
o.next_move_modifier = 1
|
||||
o.next_move_modifier /= moveCalc
|
||||
owner.remove_status_effect(src)
|
||||
var/items = o.get_contents()
|
||||
for(var/obj/item/W in items)
|
||||
@@ -76,29 +79,34 @@
|
||||
o.dropItemToGround(W, TRUE)
|
||||
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
|
||||
to_chat(owner, "<span class='warning'>Your enormous breasts are way too large to fit anything over them!</b></span>")
|
||||
switch(round(B.cached_size))
|
||||
if(9)
|
||||
if (!(B.breast_sizes[B.prev_size] == B.size))
|
||||
to_chat(o, "<span class='notice'>Your expansive chest has become a more managable size, liberating your movements.</b></span>")
|
||||
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, "<span class='warning'>Your indulgent busom is so substantial, it's affecting your movements!</b></span>")
|
||||
o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = ((round(B.cached_size) - 8))/3)
|
||||
o.next_move_modifier = (round(B.cached_size) - 8)/3
|
||||
if(prob(5))
|
||||
to_chat(H, "<span class='notice'>Your back is feeling a little sore.</b></span>")
|
||||
..()
|
||||
if (B.breast_values[B.size] > B.breast_values[B.prev_size])
|
||||
o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
|
||||
o.next_move_modifier *= moveCalc
|
||||
else if (B.breast_values[B.size] < B.breast_values[B.prev_size])
|
||||
o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
|
||||
o.next_move_modifier /= moveCalc
|
||||
if(round(B.cached_size) < 16)
|
||||
switch(round(B.cached_size))
|
||||
if(9)
|
||||
if (!(B.breast_sizes[B.prev_size] == B.size))
|
||||
to_chat(o, "<span class='notice'>Your expansive chest has become a more managable size, liberating your movements.</b></span>")
|
||||
if(10 to INFINITY)
|
||||
if (!(B.breast_sizes[B.prev_size] == B.size))
|
||||
to_chat(H, "<span class='warning'>Your indulgent busom is so substantial, it's affecting your movements!</b></span>")
|
||||
if(prob(5))
|
||||
to_chat(H, "<span class='notice'>Your back is feeling a little sore.</b></span>")
|
||||
..()
|
||||
|
||||
/datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M)
|
||||
owner.remove_movespeed_modifier("megamilk")
|
||||
owner.next_move_modifier = 1
|
||||
owner.next_move_modifier /= moveCalc
|
||||
|
||||
|
||||
/datum/status_effect/chem/PElarger
|
||||
id = "PElarger"
|
||||
alert_type = null
|
||||
var/bloodCalc
|
||||
var/moveCalc
|
||||
|
||||
/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!")
|
||||
@@ -119,9 +127,11 @@
|
||||
/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")
|
||||
moveCalc = 1+((round(P.length) - 21)/10) //effects how fast you can move
|
||||
bloodCalc = 1+((round(P.length) - 21)/10) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.)
|
||||
if(!P)
|
||||
o.remove_movespeed_modifier("hugedick")
|
||||
o.next_move_modifier = 1
|
||||
o.blood_ratio /= bloodCalc //If someone else uses blood_ratio, turn this into a multiplier(I should make a handler huh)
|
||||
owner.remove_status_effect(src)
|
||||
message_admins("PElarge tick!")
|
||||
var/items = o.get_contents()
|
||||
@@ -132,26 +142,38 @@
|
||||
to_chat(owner, "<span class='warning'>Your enormous package is way to large to fit anything over!</b></span>")
|
||||
switch(round(P.cached_length))
|
||||
if(21)
|
||||
if (!(P.prev_size == P.size))
|
||||
if (P.prev_size > P.size)
|
||||
to_chat(o, "<span class='notice'>Your rascally willy has become a more managable size, liberating your movements.</b></span>")
|
||||
o.remove_movespeed_modifier("hugedick")
|
||||
o.next_move_modifier = 1
|
||||
o.blood_ratio /= bloodCalc
|
||||
if(22 to INFINITY)
|
||||
if (!(P.prev_size == P.size))
|
||||
to_chat(o, "<span class='warning'>Your indulgent johnson is so substantial, it's affecting your movements!</b></span>")
|
||||
o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 21.1))
|
||||
o.next_move_modifier = (round(P.length) - 21)
|
||||
to_chat(o, "<span class='warning'>Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!</b></span>")
|
||||
o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
|
||||
o.blood_ratio *= bloodCalc
|
||||
..()
|
||||
|
||||
/datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/M)
|
||||
/datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o)
|
||||
owner.remove_movespeed_modifier("hugedick")
|
||||
owner.next_move_modifier = 1
|
||||
o.blood_ratio /= bloodCalc
|
||||
|
||||
|
||||
/*//////////////////////////////////////////
|
||||
Mind control functions
|
||||
///////////////////////////////////////////
|
||||
*/
|
||||
|
||||
//Preamble
|
||||
/mob/living
|
||||
var/lewd = TRUE //Maybe false?
|
||||
|
||||
/mob/living/verb/toggle_lewd()
|
||||
set category = "IC"
|
||||
set name = "Toggle Lewdchem"
|
||||
set desc = "Allows you to toggle if you'd like lewd flavour messages."
|
||||
lewd = !(lewd)
|
||||
to_chat(usr, "You [(lewd?"will":"no longer")] receive lewdchem messages.")
|
||||
|
||||
/datum/status_effect/chem/enthrall
|
||||
id = "enthrall"
|
||||
alert_type = null
|
||||
@@ -171,43 +193,56 @@
|
||||
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/datum/weakref/redirect_component1 //resistance
|
||||
var/datum/weakref/redirect_component2 //say
|
||||
var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) //Distance multipliers
|
||||
var/datum/weakref/redirect_component //resistance
|
||||
//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
|
||||
var/list/customTriggers = list() //the list of custom triggers (maybe have to split into two)
|
||||
var/cooldown = 0
|
||||
var/cooldownMsg = TRUE
|
||||
var/cTriggered = FALSE
|
||||
|
||||
/datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M)
|
||||
/datum/status_effect/chem/enthrall/on_apply()
|
||||
var/mob/living/carbon/M = owner
|
||||
var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list
|
||||
if(!E.creatorID)
|
||||
message_admins("WARNING: FermiChem No master found in thrall, this makes me max sad.")
|
||||
enthrallID = E.creatorID
|
||||
enthrallGender = E.creatorGender
|
||||
master = E.creator
|
||||
master = get_mob_by_key(enthrallID)
|
||||
if(!E)
|
||||
message_admins("WARNING: No chem found in thrall!!!!")
|
||||
if(!master)
|
||||
message_admins("WARNING: No master! found in thrall!!!!")
|
||||
if(M.key == enthrallID)
|
||||
if(M.ckey == 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_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()
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall)
|
||||
var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]"
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message)
|
||||
to_chat(owner, "<span class='big warning'><i>You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can still repeatedly resist their effects! (Mash resist to fight back!!)</i></span>")
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/chem/enthrall/tick(mob/living/carbon/M)
|
||||
message_admins("Enthrall processing for [M]: ")
|
||||
/datum/status_effect/chem/enthrall/tick()
|
||||
//. = ..() //loop Please
|
||||
var/mob/living/carbon/M = owner
|
||||
|
||||
//chem calculations
|
||||
if (owner.reagents.has_reagent("MKUltra"))
|
||||
if (owner.reagents.has_reagent("enthrall"))
|
||||
if (phase >= 2)
|
||||
enthrallTally += phase
|
||||
else
|
||||
if (phase < 3)
|
||||
deltaResist += 5//If you've no chem, then you break out quickly
|
||||
if(prob(20))
|
||||
if (phase < 3 && phase != 0)
|
||||
deltaResist += 3//If you've no chem, then you break out quickly
|
||||
if(prob(10))
|
||||
to_chat(owner, "<span class='notice'><i>Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.</i></span>")
|
||||
if (mental_capacity <= 500 || phase == 4)
|
||||
if (owner.reagents.has_reagent("mannitol"))
|
||||
@@ -216,53 +251,73 @@
|
||||
mental_capacity += 10
|
||||
|
||||
//mindshield check
|
||||
if(M.has_trait(TRAIT_MINDSHIELD))
|
||||
if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ.
|
||||
resistanceTally += 5
|
||||
if(prob(20))
|
||||
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>")
|
||||
if(phase == 4)
|
||||
mental_capacity += 5
|
||||
|
||||
//phase specific events
|
||||
switch(phase)
|
||||
if(-1)//fully removed
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall")
|
||||
owner.remove_status_effect(src)
|
||||
else if(0)// sleeper agent
|
||||
if(0)// sleeper agent
|
||||
return
|
||||
else if(1)//Initial enthrallment
|
||||
if(1)//Initial enthrallment
|
||||
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='notice'><i>Your conciousness slips, as you sink deeper into trance.</i></span>")
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='hypnophrase'><i>Your conciousness slips, as you sink deeper into trance and servitude.</i></span>")
|
||||
else
|
||||
|
||||
else if (resistanceTally > 100)
|
||||
enthrallTally *= 0.5
|
||||
phase = -1
|
||||
resistanceTally = 0
|
||||
to_chat(owner, "<span class='notice'><i>You break free of the influence in your mind, your thoughts suddenly turning lucid!</i></span>")
|
||||
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 sexy and dominant, it feels right to obey them.")].</i></span>")
|
||||
else if (2) //partially enthralled
|
||||
if(owner.lewd)
|
||||
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
|
||||
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 server 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.
|
||||
resistanceTally /= 2
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='notice'><i>Your mind gives, eagerly obeying and serving [master].</i></span>")
|
||||
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 unable to resort to violence. 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
|
||||
to_chat(owner, "<span class='big nicegreen'><i>You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. </i></span>")
|
||||
owner.add_trait(TRAIT_PACIFISM, "MKUltra")
|
||||
else if (resistanceTally > 150)
|
||||
enthrallTally *= 0.5
|
||||
phase -= 1
|
||||
resistanceTally = 0
|
||||
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>")
|
||||
to_chat(owner, "<span class='notice'><i>You manage to shake some of the effects 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,
|
||||
else if (3)//fully entranced
|
||||
if (resistanceTally >= 250 && withdrawalTick >= 150)
|
||||
if(prob(10))
|
||||
if(owner.lewd)
|
||||
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 >= 200 && withdrawalTick >= 150) || (M.has_trait(TRAIT_MINDSHIELD) && resistanceTally >= 100))
|
||||
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>")
|
||||
else if (4) //mindbroken
|
||||
if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra"))
|
||||
to_chat(owner, "<span class='notice'><i>The separation from [(owner.lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.</i></span>")
|
||||
owner.remove_trait(TRAIT_PACIFISM, "MKUltra")
|
||||
if(prob(2))
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='notice'><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 || M.has_trait(TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra"))
|
||||
phase = 2
|
||||
mental_capacity = 500
|
||||
customTriggers = list()
|
||||
@@ -276,119 +331,146 @@
|
||||
//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
|
||||
M.hallucination = max(0, M.hallucination - 2)
|
||||
M.stuttering = max(0, M.stuttering - 2)
|
||||
M.jitteriness = max(0, M.jitteriness - 2)
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
|
||||
if(9 to INFINITY)//If
|
||||
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 [enthrallGender].")
|
||||
if(prob(10))
|
||||
if(5)//To reduce spam
|
||||
to_chat(owner, "<span class='big warning'><i>You are unable to complete your [master]'s orders without their presence, and any commands given to you prior are not in effect until you are back with them.</i></span>")
|
||||
if(10 to 35)//Gives wiggle room, so you're not SUPER needy
|
||||
if(prob(5))
|
||||
to_chat(owner, "<span class='notice'><i>You're starting to miss [(owner.lewd?"your [enthrallGender]":"[master]")].</i></span>")
|
||||
if(prob(5))
|
||||
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)//barganing
|
||||
to_chat(owner, "<i>[(owner.lewd?"[enthrallGender]":"[master]")] will surely be back soon</i>") //denial
|
||||
if(36)
|
||||
var/message = "[(owner.lewd?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]"
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1, message)
|
||||
if(37 to 65)//barganing
|
||||
if(prob(10))
|
||||
to_chat(owner, "They are coming back, right...?")
|
||||
to_chat(owner, "<i>They are coming back, right...?</i>")
|
||||
owner.adjustBrainLoss(1)
|
||||
if(prob(20))
|
||||
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(prob(10))
|
||||
if(owner.lewd)
|
||||
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
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
|
||||
var/message = "[(owner.lewd?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]"
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message)
|
||||
owner.stuttering += 200
|
||||
owner.jitteriness += 200
|
||||
if(67 to 90) //anger
|
||||
if(prob(30))
|
||||
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].")
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='warning'>You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!</span>")
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You are overwhelmed with anger and suddenly lash out!</span>")
|
||||
owner.adjustBrainLoss(1)
|
||||
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, "<span class='warning'><i>You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore.</i></span>")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
|
||||
var/message = "[(owner.lewd?"Where are you [enthrallGender]??!":"I need to find [master]!")]"
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3, message)
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='warning'><i>You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore!</i></span>")
|
||||
else
|
||||
to_chat(owner, "<span class='warning'><i>You need to find [master] at all costs, you can't hold yourself back anymore!</i></span>")
|
||||
if(91 to 120)//depression
|
||||
if(prob(20))
|
||||
owner.adjustBrainLoss(1)
|
||||
owner.stuttering += 2
|
||||
owner.jitteriness += 2
|
||||
owner.adjustBrainLoss(2.5)
|
||||
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)
|
||||
var/message = "[(owner.lewd?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]"
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message)
|
||||
to_chat(owner, "<span class='warning'><i>You can hardly find the strength to continue without your [enthrallGender].</i></span>")
|
||||
if(120 to 140) //depression
|
||||
if(prob(25))
|
||||
owner.SetStun(20, 0)
|
||||
if(prob(15))
|
||||
owner.Stun(50)
|
||||
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(2)
|
||||
owner.stuttering += 2
|
||||
owner.jitteriness += 2
|
||||
if(prob(10))
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='warning'><i>You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.</i></span>")
|
||||
else
|
||||
to_chat(owner, "<span class='warning'><i>You are overwheled with withdrawl from [master].</i></span>")
|
||||
owner.adjustBrainLoss(5)
|
||||
owner.stuttering += 20
|
||||
owner.jitteriness += 20
|
||||
if(prob(5))
|
||||
deltaResist += 5
|
||||
if(140 to INFINITY) //acceptance
|
||||
if(prob(20))
|
||||
if(prob(15))
|
||||
deltaResist += 5
|
||||
if(prob(20))
|
||||
to_chat(owner, "Maybe you'll be okay without your [enthrallGender].")
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<i><span class='small green'>Maybe you'll be okay without your [enthrallGender].</i></span>")
|
||||
else
|
||||
to_chat(owner, "<i><span class='small green'>You feel your mental functions slowly begin to return.</i></span>")
|
||||
if(prob(10))
|
||||
owner.adjustBrainLoss(1)
|
||||
M.hallucination += 5
|
||||
owner.adjustBrainLoss(2)
|
||||
M.hallucination += 50
|
||||
|
||||
withdrawalTick++
|
||||
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)
|
||||
|
||||
switch(status)
|
||||
if("Antiresist")
|
||||
if (statusStrength == 0)
|
||||
status = null
|
||||
to_chat(owner, "You feel able to resist oncemore.")
|
||||
else
|
||||
statusStrength -= 1
|
||||
|
||||
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 [enthrallGender]'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")
|
||||
if(status == "Antiresist")
|
||||
if (statusStrength < 0)
|
||||
status = null
|
||||
to_chat(owner, "Your mind feels able to resist oncemore.")
|
||||
else
|
||||
statusStrength -= 1
|
||||
|
||||
else if(status == "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(status == "charge")
|
||||
owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra")
|
||||
status = "charged"
|
||||
if(master.lewd)
|
||||
to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!")
|
||||
else
|
||||
to_chat(owner, "[master]'s command fills you with a burst of speed!")
|
||||
|
||||
else if (status == "charged")
|
||||
if (statusStrength < 0)
|
||||
status = null
|
||||
owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra")
|
||||
owner.Knockdown(50)
|
||||
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 (status == "pacify")
|
||||
owner.add_trait(TRAIT_PACIFISM, "MKUltraStatus")
|
||||
status = null
|
||||
|
||||
//Truth serum?
|
||||
//adrenals?
|
||||
@@ -399,20 +481,32 @@
|
||||
resistanceTally += deltaResist
|
||||
deltaResist = 0
|
||||
if (cooldown > 0)
|
||||
cooldown -= (1 + (mental_capacity/1000 ))
|
||||
else
|
||||
to_chat(master, "<span class='notice'><i>Your pet [owner.name] appears to have finished internalising your last command.</i></span>")
|
||||
..()
|
||||
cooldown -= (1 + (mental_capacity/1000))
|
||||
cooldownMsg = FALSE
|
||||
else if (cooldownMsg == FALSE)
|
||||
if(master.lewd)
|
||||
to_chat(master, "<span class='notice'><i>Your pet [owner] appears to have finished internalising your last command.</i></span>")
|
||||
else
|
||||
to_chat(master, "<span class='notice'><i>Your thrall [owner] appears to have finished internalising your last command.</i></span>")
|
||||
cooldownMsg = TRUE
|
||||
cooldown = 0
|
||||
//..()
|
||||
|
||||
//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())
|
||||
redirect_component1 = null
|
||||
//qdel(redirect_component2.resolve())
|
||||
//redirect_component2 = null
|
||||
//Remove all stuff
|
||||
/datum/status_effect/chem/enthrall/on_remove()
|
||||
var/mob/living/carbon/M = owner
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallpraise")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallscold")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4")
|
||||
qdel(redirect_component.resolve())
|
||||
redirect_component = null
|
||||
UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
|
||||
owner.remove_trait(TRAIT_PACIFISM, "MKUltra")
|
||||
//UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL)
|
||||
|
||||
/*
|
||||
/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)
|
||||
@@ -421,34 +515,46 @@
|
||||
else
|
||||
. = ..()
|
||||
*/
|
||||
//WORKS!! AAAAA
|
||||
|
||||
/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(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
if (cTriggered == TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = owner
|
||||
//message_admins("[C] heard something!")
|
||||
raw_message = lowertext(raw_message)
|
||||
for (var/trigger in customTriggers)
|
||||
if (trigger == message)//if trigger1 is the message
|
||||
var/cached_trigger = lowertext(trigger)
|
||||
//message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]")
|
||||
if (findtext(raw_message, cached_trigger))//if trigger1 is the message
|
||||
message_admins("[C] has been triggered with [trigger]!")
|
||||
cTriggered = TRUE
|
||||
|
||||
//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. Though you find yourself fully believing in the validity of what you just said and don't think to question it.</span>")
|
||||
//Speak (Forces player to talk) works
|
||||
if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2
|
||||
var/saytext = "Your mouth moves on it's own before you can even catch it."
|
||||
if(C.has_trait(TRAIT_NYMPHO))
|
||||
saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it."
|
||||
to_chat(C, "<span class='notice'><i>[saytext]</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
|
||||
//Echo (repeats message!) works
|
||||
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")
|
||||
//Shocking truth! works
|
||||
else if (lowertext(customTriggers[trigger]) == "shock")
|
||||
if (C.canbearoused)
|
||||
C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is
|
||||
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
|
||||
if (C.canbearoused)
|
||||
//wah intensifies wah-rks
|
||||
else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
if (C.has_trait(TRAIT_NYMPHO))
|
||||
if (C.getArousalLoss() > 80)
|
||||
C.mob_climax(forced_climax=TRUE)
|
||||
else
|
||||
@@ -457,38 +563,58 @@
|
||||
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)
|
||||
else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose.
|
||||
to_chat(owner, "<span class='notice'><i>You drop to the ground unsurreptitiously.</i></span>")
|
||||
C.resting = 1
|
||||
C.lying = 1
|
||||
|
||||
//strip (some) clothes
|
||||
else if (customTriggers[trigger][1] == "strip")//This wasn't meant to just be a lewd thing oops
|
||||
else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops, is this pref breaking?
|
||||
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>")
|
||||
to_chat(owner,"<span class='notice'><i>You feel compelled to strip your clothes.</i></span>")
|
||||
|
||||
//trance
|
||||
else if (lowertext(customTriggers[trigger]) == "trance")//Maaaybe too strong.
|
||||
var/mob/living/carbon/human/o = owner
|
||||
o.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
|
||||
|
||||
//add more fun stuff!
|
||||
|
||||
|
||||
cTriggered = FALSE
|
||||
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)
|
||||
/datum/status_effect/chem/enthrall/proc/owner_resist()
|
||||
var/mob/living/carbon/M = owner
|
||||
to_chat(owner, "<span class='notice'><i>You attempt to fight against against [(owner.lewd?"[enthrallGender]":"[master]")]'s influence!'</i></span>")
|
||||
message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally]")
|
||||
//message_admins("[M] is trying to resist!")
|
||||
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>")
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='warning'><i>Your mind is too far gone to even entertain the thought of resisting. Unless you can fix the brain damage, you won't be able to break free of your [enthrallGender]'s control.</i></span>")
|
||||
else
|
||||
to_chat(owner, "<span class='warning'><i>Your brain is too overwhelmed with from the high volume of chemicals in your system, rendering you unable to resist, unless you can fix the brain damage.</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>")
|
||||
else if (phase == 3 && withdrawal == FALSE)
|
||||
if(owner.lewd)
|
||||
to_chat(owner, "<span class='hypnophrase'><i>The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. Try getting away from them.</i></span>")
|
||||
else
|
||||
to_chat(owner, "<span class='hypnophrase'><i>You are unable to resist [master] in your current state. Try getting away from them.</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>")
|
||||
if(owner.lewd)
|
||||
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! You'll have to wait a bit before attemping again, lest your attempts become frustrated again.</i></span>")
|
||||
else
|
||||
to_chat(owner, "<span class='warning'><i>The order from your [master] to give in is conflicting with your attempt to resist. You'll have to wait a bit before attemping again, lest your attempts become frustrated again.</i></span>")
|
||||
statusStrength += 1
|
||||
enthrallTally += 1
|
||||
return
|
||||
@@ -497,15 +623,18 @@
|
||||
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
|
||||
else
|
||||
deltaResist = 1
|
||||
|
||||
if(prob(10))
|
||||
if(prob(5))
|
||||
M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes
|
||||
deltaResist *= 1.5
|
||||
to_chat(owner, "You attempt to shake the mental cobwebs from your mind!")
|
||||
//base resistance
|
||||
if (M.canbearoused)
|
||||
if (M.canbearoused && M.has_trait(TRAIT_NYMPHO))//I'm okay with this being removed.
|
||||
deltaResist*= ((100 - M.arousalloss/100)/100)//more aroused you are, the weaker resistance you can give
|
||||
else
|
||||
deltaResist *= 0.2
|
||||
//else
|
||||
// deltaResist *= 0.5
|
||||
//chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist.
|
||||
if (owner.reagents.has_reagent("mannitol"))
|
||||
deltaResist *= 1.25
|
||||
@@ -524,12 +653,12 @@
|
||||
//Antag resistance
|
||||
//cultists are already brainwashed by their god
|
||||
if(iscultist(owner))
|
||||
deltaResist *= 2
|
||||
deltaResist *= 1.5
|
||||
else if (is_servant_of_ratvar(owner))
|
||||
deltaResist *= 2
|
||||
deltaResist *= 1.5
|
||||
//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
|
||||
deltaResist *= 1.4
|
||||
|
||||
//role resistance
|
||||
//Chaplains are already brainwashed by their god
|
||||
@@ -549,55 +678,30 @@
|
||||
deltaResist += (250-owner.nutrition)/100
|
||||
if(owner.health < 100)//Harming your thrall will make them rebel harder.
|
||||
deltaResist *= ((120-owner.health)/100)+1
|
||||
//if()
|
||||
//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 you've a collar, you get a sense of pride
|
||||
if(istype(M.wear_neck, /obj/item/clothing/neck/petcollar))
|
||||
deltaResist *= 0.5
|
||||
|
||||
if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused)
|
||||
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(M.has_trait(TRAIT_MINDSHIELD))
|
||||
deltaResist += 5//even faster!
|
||||
|
||||
if (deltaResist>0)//just in case
|
||||
deltaResist /= phase//later phases require more resistance
|
||||
message_admins("[M] is trying to resist with a delta of [deltaResist]!")
|
||||
return
|
||||
|
||||
//I think this can be left out, but I'll leave the code incase anyone wants to add to it.
|
||||
/*
|
||||
/datum/status_effect/chem/enthrall/proc/owner_say(mob/speaker, message) //I can only hope this works
|
||||
|
||||
/datum/status_effect/chem/enthrall/proc/owner_say(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")
|
||||
var/static/regex/owner_words = regex("[master]")
|
||||
if(findtext(message, owner_words))
|
||||
message = replacetext(lowertext(message), lowertext(master), "[enthrallGender]")
|
||||
return message
|
||||
|
||||
/*
|
||||
/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
|
||||
id = "SGDFCandi"
|
||||
var/mob/living/fermi_Clone
|
||||
var/list/candies = list()
|
||||
|
||||
/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 ..()
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// Citadel-specific Negative Traits
|
||||
|
||||
/datum/quirk/Hypno
|
||||
name = "Hypnotherapy user"
|
||||
desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though."
|
||||
mob_trait = "hypnotherapy"
|
||||
value = -1 //I mean, it can be a really bad trait to have, but on the other hand, some people want it?
|
||||
gain_text = "<span class='notice'>You really think the hypnotherapy helped you out.</span>"
|
||||
//lose_text = "<span class='notice'>You forget about the hypnotherapy you had, or did you even have it?</span>"
|
||||
|
||||
/datum/quirk/Hypno/add()
|
||||
//You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic!
|
||||
addtimer(CALLBACK(quirk_holder, /datum/quirk/Hypno/proc/triggered, quirk_holder), rand(12000, 36000))
|
||||
|
||||
/datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added.
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
var/list/seen = viewers(8, get_turf(H))
|
||||
if(LAZYLEN(seen) == 0)
|
||||
to_chat(H, "<span class='notice'><i>That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!</i></span>")
|
||||
else
|
||||
to_chat(H, "<span class='notice'><i>[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!</i></span>")
|
||||
H.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
|
||||
qdel(src)
|
||||
@@ -1,5 +1,6 @@
|
||||
// Citadel-specific Neutral Traits
|
||||
|
||||
//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat:
|
||||
/datum/quirk/libido
|
||||
name = "Nymphomania"
|
||||
desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual."
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// Citadel-specific Positive Traits
|
||||
|
||||
/datum/quirk/BloodPressure
|
||||
name = "Synthetic blood"
|
||||
desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you!"
|
||||
value = 1
|
||||
mob_trait = TRAIT_HIGH_BLOOD
|
||||
gain_text = "<span class='notice'>You feel full of blood!</span>"
|
||||
lose_text = "<span class='notice'>You feel like your blood pressure went down.</span>"
|
||||
|
||||
/datum/quirk/BloodPressure/add()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.blood_ratio = 1.2
|
||||
@@ -6,9 +6,9 @@
|
||||
zone = "chest"
|
||||
slot = "breasts"
|
||||
w_class = 3
|
||||
size = BREASTS_SIZE_DEF
|
||||
var/cached_size = null//for enlargement
|
||||
var/prev_size //For flavour texts
|
||||
size = BREASTS_SIZE_DEF //SHOULD BE A LETTER
|
||||
var/cached_size = null//for enlargement SHOULD BE A NUMBER
|
||||
var/prev_size //For flavour texts SHOULD BE A LETTER
|
||||
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
|
||||
@@ -26,6 +26,8 @@
|
||||
reagents.add_reagent(fluid_id, fluid_max_volume)
|
||||
prev_size = size
|
||||
cached_size = breast_values[size]
|
||||
if (cached_size == "c")//fix for a weird bug that has something to do with how they're set up on the character create screen.
|
||||
cached_size = 3
|
||||
|
||||
/obj/item/organ/genital/breasts/on_life()
|
||||
if(QDELETED(src))
|
||||
@@ -84,7 +86,7 @@
|
||||
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!!
|
||||
if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!(Why does this runtime??)
|
||||
to_chat(owner, "<span class='warning'>You feel your breasts shrinking away from your body as your chest flattens out.</b></span>")
|
||||
src.Remove(owner)
|
||||
switch(round(cached_size))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
/datum/reagent/fermi
|
||||
name = "Fermi" //Why did I putthis here?
|
||||
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.
|
||||
taste_description = "affection and love!"
|
||||
var/ImpureChem = "fermiTox" // What chemical is metabolised with an inpure reaction
|
||||
var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising
|
||||
var/InverseChem = "fermiTox" // 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)
|
||||
@@ -24,8 +24,6 @@
|
||||
//return ..()
|
||||
|
||||
//Called when reaction stops. #STOP_PROCESSING
|
||||
/datum/reagent/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
|
||||
return
|
||||
|
||||
//Called when added to a beaker without any of the reagent present. #add_reagent
|
||||
/datum/reagent/fermi/proc/FermiNew(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
|
||||
@@ -33,46 +31,56 @@
|
||||
|
||||
//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 ..()
|
||||
message_admins("purity of chem is [purity]")
|
||||
return
|
||||
message_admins("adding to human [purity]")
|
||||
if(src.purity < 0)
|
||||
CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!")
|
||||
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)
|
||||
message_admins("all convered to [src.InverseChem]")
|
||||
return
|
||||
else
|
||||
//var/pureVol = volume * purity
|
||||
var/impureVol = volume * (1 - (volume * purity))
|
||||
M.reagents.remove_reagent(src, (volume*impureVol), FALSE)
|
||||
M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1)
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/on_merge(mob/living/carbon/M, amount, other_purity)
|
||||
if(!M)
|
||||
return ..()
|
||||
if(other_purity < 0)
|
||||
CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!")
|
||||
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))
|
||||
M.reagents.remove_reagent(src, impureVol, FALSE)
|
||||
//var/pureVol = amount * puritys
|
||||
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
|
||||
..()
|
||||
|
||||
//When merging two fermichems
|
||||
/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging
|
||||
. = ..()
|
||||
if(!ishuman(M))
|
||||
return
|
||||
message_admins("merging to human [purity]")
|
||||
if (purity < 0)
|
||||
CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!")
|
||||
if (purity == 1 || src.DoNotSplit == TRUE)
|
||||
return
|
||||
else if (src.InverseChemVal > purity)
|
||||
M.reagents.remove_reagent(src.id, amount, FALSE)
|
||||
M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1)
|
||||
for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
|
||||
if(R.name == "")
|
||||
R.name = src.name//Negative effects are hidden
|
||||
message_admins("all convered to [src.InverseChem]")
|
||||
return
|
||||
else
|
||||
//var/pureVol =
|
||||
var/impureVol = amount * (1 - purity)
|
||||
message_admins("splitting [src] [amount] into [src.ImpureChem] [impureVol]")
|
||||
M.reagents.remove_reagent(src.id, impureVol, FALSE)
|
||||
M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1)
|
||||
for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
|
||||
if(R.name == "")
|
||||
R.name = src.name//Negative effects are hidden
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -107,11 +115,11 @@
|
||||
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
|
||||
addiction_stage4_end = 43 //Incase it's too long
|
||||
addiction_stage3_end = 41
|
||||
addiction_stage4_end = 44 //Incase it's too long
|
||||
var/location_created
|
||||
var/turf/open/location_return = null
|
||||
var/addictCyc1 = 0
|
||||
@@ -181,6 +189,8 @@
|
||||
M.Stun(40)
|
||||
|
||||
var/items = M.get_contents()
|
||||
if(!LAZYLEN(items))
|
||||
return ..()//This'll work, right?
|
||||
var/obj/item/I = pick(items)
|
||||
M.dropItemToGround(I, TRUE)
|
||||
do_sparks(5,FALSE,I)
|
||||
@@ -245,9 +255,9 @@
|
||||
if(prob(20))
|
||||
do_sparks(5,FALSE,M)
|
||||
src.addictCyc4++
|
||||
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[src.id]_overdose")//holdover until above fix works
|
||||
..()
|
||||
. = 1
|
||||
//. = 1
|
||||
|
||||
//TODO
|
||||
///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M)
|
||||
@@ -330,9 +340,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
pollStarted = TRUE
|
||||
candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.")
|
||||
if(20 to INFINITY)
|
||||
message_admins("Number of candidates [LAZYLEN(candies)]")
|
||||
//message_admins("Number of candidates [LAZYLEN(candies)]")
|
||||
if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there!
|
||||
message_admins("Candidate found!")
|
||||
message_admins("Candidate found! [candies] is becomeing a clone of [M]! Hee~!! Exciting!!")
|
||||
to_chat(M, "<span class='warning'>The cells reach a critical micelle concentration, nucleating rapidly within your body!</span>")
|
||||
//var/typepath = owner.type
|
||||
//clone = new typepath(owner.loc)
|
||||
@@ -367,7 +377,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
M.nutrition -= 500
|
||||
//reaction_mob(SM, )I forget what this is for
|
||||
//Damage the clone
|
||||
SM.blood_volume = BLOOD_VOLUME_NORMAL/2
|
||||
SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2
|
||||
SM.adjustCloneLoss(60, 0)
|
||||
SM.setBrainLoss(40)
|
||||
SM.nutrition = startHunger/2
|
||||
@@ -416,6 +426,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
M.adjustBruteLoss(-1, 0)
|
||||
M.adjustFireLoss(-1, 0)
|
||||
M.heal_bodypart_damage(1,1)
|
||||
M.reagents.remove_reagent(src.id, 1)//faster rate of loss.
|
||||
else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split.
|
||||
switch(current_cycle)
|
||||
if(21)
|
||||
@@ -444,7 +455,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
if(87 to INFINITY)
|
||||
M.reagents.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing.
|
||||
message_admins("Purging SGDF [volume]")
|
||||
message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77")
|
||||
//message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77")
|
||||
|
||||
|
||||
..()
|
||||
@@ -492,7 +503,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
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)
|
||||
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.blood_volume += 10
|
||||
M.adjustCloneLoss(-2, 0)
|
||||
M.setBrainLoss(-1)
|
||||
@@ -521,7 +532,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>")
|
||||
@@ -573,7 +584,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")
|
||||
..()
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -610,7 +621,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
overdose_threshold = 12
|
||||
metabolization_rate = 0.5
|
||||
ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth
|
||||
InverseChemVal = 0.25
|
||||
InverseChemVal = 0.3
|
||||
InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse
|
||||
|
||||
/datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M)
|
||||
@@ -618,6 +629,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts")
|
||||
if(!B)
|
||||
message_admins("No breasts found on init!")
|
||||
return
|
||||
var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5)
|
||||
B.prev_size = B.size
|
||||
@@ -717,10 +729,21 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
overdose_threshold = 12 //ODing makes you male and removes female genitals
|
||||
metabolization_rate = 0.5
|
||||
ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth
|
||||
InverseChemVal = 0.25
|
||||
InverseChemVal = 0.3
|
||||
InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse
|
||||
//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/penis/P = H.getorganslot("penis")
|
||||
if(!P)
|
||||
message_admins("No penis found on init!")
|
||||
return
|
||||
P.prev_size = P.length
|
||||
P.cached_length = P.length
|
||||
message_admins("init P len: [P.length], prev: [P.prev_size], cache = [P.cached_length]")
|
||||
|
||||
/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")
|
||||
@@ -755,7 +778,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
message_admins("PE Breast status: [B]")
|
||||
if(M.gender == FEMALE)
|
||||
M.gender = MALE
|
||||
M.visible_message("<span class='boldnotice'>[M] suddenly looks more masculine!</span>", "<span class='boldwarning'>You suddenly feel more masculine as your !</span>")
|
||||
M.visible_message("<span class='boldnotice'>[M] suddenly looks more masculine!</span>", "<span class='boldwarning'>You suddenly feel more masculine!</span>")
|
||||
|
||||
if(B)
|
||||
B.cached_size = B.cached_size - 0.1
|
||||
@@ -817,13 +840,14 @@ 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!
|
||||
//M.alpha = 255//Reset addiction
|
||||
//antiGenetics = 255// DOesn't work for some reason?
|
||||
switch(current_cycle)
|
||||
if(0)//Require a minimum
|
||||
if(1)//Require a minimum
|
||||
origin = M
|
||||
if (G == null)
|
||||
G = new(get_turf(M.loc))
|
||||
@@ -845,7 +869,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason
|
||||
if(prob(50))
|
||||
to_chat(G, "<span class='warning'>The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!</b></span>")
|
||||
do_teleport(G, M.loc)
|
||||
M.reagents.remove_reagent(src.id, current_cycle, FALSE)
|
||||
M.reagents.remove_reagent(src.id, current_cycle-1, FALSE)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M)
|
||||
@@ -1053,18 +1077,37 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses"
|
||||
overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please.
|
||||
DoNotSplit = TRUE
|
||||
data// = list("creatorID" = null, "creatorGender" = null, "creatorName" = null)
|
||||
data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null)
|
||||
var/creatorID //ckey
|
||||
var/creatorGender
|
||||
var/creatorName
|
||||
var/mob/living/creator
|
||||
|
||||
/datum/reagent/fermi/enthrall/test
|
||||
name = "MKUltraTest"
|
||||
id = "enthrallTest"
|
||||
description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it."
|
||||
color = "#2C051A" // rgb: , 0, 255
|
||||
//ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth
|
||||
//InverseChemVal = 0.25
|
||||
//InverseChem = "enthrall" //At really impure vols, it just becomes 100% inverse
|
||||
data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Isabelle Foster")
|
||||
creatorID = "honkatonkbramblesnatch"//ckey
|
||||
creatorGender = "Mistress"
|
||||
creatorName = "Isabelle Foster"
|
||||
purity = 1
|
||||
|
||||
/datum/reagent/fermi/enthrall/test/on_new()
|
||||
id = "enthrall"
|
||||
..()
|
||||
creator = get_mob_by_key(creatorID)
|
||||
|
||||
/datum/reagent/fermi/enthrall/on_new(list/data)
|
||||
message_admins("FermiNew for enthral proc'd")
|
||||
creatorID = data.["creatorID"]
|
||||
creatorGender = data.["creatorGender"]
|
||||
creatorName = data.["creatorName"]
|
||||
creator = get_mob_by_key(creatorID)
|
||||
message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender]")
|
||||
/*
|
||||
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list
|
||||
@@ -1077,33 +1120,22 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
creatorID = B.data.["ckey"]
|
||||
*/
|
||||
|
||||
/datum/reagent/fermi/enthrall/FermiFinish(datum/reagents/holder)
|
||||
message_admins("On finish for enthral proc'd")
|
||||
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
|
||||
if (B.data.["gender"] == "female")
|
||||
E.data.["creatorGender"] = "Mistress"
|
||||
else
|
||||
E.data.["creatorGender"] = "Master"
|
||||
E.data["creatorName"] = B.data.["real_name"]
|
||||
E.data.["creatorID"] = B.data.["ckey"]
|
||||
message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]")
|
||||
|
||||
/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M)
|
||||
. = ..()
|
||||
if(!creatorID)
|
||||
CRASH("Something went wrong in enthral creation")
|
||||
message_admins("key: [M.key] vs [creatorID], ")
|
||||
message_admins("Something went wrong in enthral creation THIS SHOULD NOT APPEAR")
|
||||
return
|
||||
message_admins("key: [M.ckey] vs [creatorID], ")
|
||||
if(purity < 0.5)//Impure chems don't function as you expect
|
||||
return
|
||||
else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?)
|
||||
if((M.ckey == 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)
|
||||
if(Vc)
|
||||
Vc.Remove(M)
|
||||
nVc.Insert(M)
|
||||
qdel(Vc)
|
||||
to_chat(M, "<span class='notice'><i>You feel your vocal chords tingle as your voice comes out in a more sultry tone.</span>")
|
||||
creator = M
|
||||
else
|
||||
M.apply_status_effect(/datum/status_effect/chem/enthrall)
|
||||
//var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
@@ -1117,7 +1149,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
|
||||
/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M)
|
||||
if(purity < 0.5)//Placeholder for now. I'd like to get this done.
|
||||
if (M.key == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them.
|
||||
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them.
|
||||
if(M.has_status_effect(STATUS_EFFECT_INLOVE))
|
||||
return
|
||||
var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
|
||||
@@ -1137,22 +1169,46 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
M.reagents.remove_reagent(src.id, src.volume)
|
||||
FallInLove(C, M)
|
||||
return
|
||||
var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing.
|
||||
return
|
||||
var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended
|
||||
if(!E)
|
||||
CRASH("No enthrall status found in [M]!")
|
||||
E.enthrallTally += 1
|
||||
M.adjustBrainLoss(0.1)
|
||||
M.reagents.remove_reagent(src.id, 10)
|
||||
M.apply_status_effect(/datum/status_effect/chem/enthrall)
|
||||
message_admins("No enthrall status found in [M]!")
|
||||
else
|
||||
E.enthrallTally += 1
|
||||
if(prob(50))
|
||||
M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it.
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly.
|
||||
/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly. I made it so the creator is set to gain the status for someone random.
|
||||
. = ..()
|
||||
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 150u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.)
|
||||
var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
|
||||
for(var/mob/living/carbon/victim in seen)
|
||||
if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey
|
||||
seen = seen - victim
|
||||
if(!victim.ckey)
|
||||
seen = seen - victim
|
||||
var/mob/living/carbon/chosen = pick(seen)
|
||||
creatorID = chosen.ckey
|
||||
if (chosen.gender == "female")
|
||||
creatorGender = "Mistress"
|
||||
else
|
||||
creatorGender = "Master"
|
||||
creatorName = chosen.real_name
|
||||
creator = get_mob_by_key(creatorID)
|
||||
M.add_trait(TRAIT_PACIFISM, "MKUltra")
|
||||
var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
var/datum/status_effect/chem/enthrall/E
|
||||
if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
|
||||
E = M.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
M.apply_status_effect(/datum/status_effect/chem/enthrall)
|
||||
E.enthrallID = creatorID
|
||||
E.enthrallGender = creatorGender
|
||||
E.master = creator
|
||||
else
|
||||
E = M.has_status_effect(/datum/status_effect/chem/enthrall)
|
||||
to_chat(M, "<span class='warning'><i>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].</i></span>")
|
||||
M.slurring = 100
|
||||
M.confused = 100
|
||||
@@ -1161,7 +1217,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
E.customTriggers = list()
|
||||
|
||||
/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M)
|
||||
M.adjustBrainLoss(0.2)
|
||||
M.adjustBrainLoss(0.1)//should be 15 in total
|
||||
..()
|
||||
|
||||
//Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system.
|
||||
@@ -1189,13 +1245,18 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
to_chat(M, "<span class='notice'>You develop deep feelings for [love], your heart beginning to race as you look upon them with new eyes.</span>")
|
||||
else
|
||||
if(get_dist(M, love) < 8)
|
||||
//if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated.
|
||||
M.adjustArousalLoss(5)
|
||||
if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated.
|
||||
M.adjustArousalLoss(5)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove)
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
|
||||
else
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove)
|
||||
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
|
||||
if(prob(10))
|
||||
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)
|
||||
@@ -1392,14 +1453,14 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
|
||||
/datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method)
|
||||
var/target = C.get_bodypart(BODY_ZONE_CHEST)
|
||||
C.adjustFireLoss(1, 0)
|
||||
var/acidstr = (5-C.reagents.pH)
|
||||
C.adjustFireLoss(acidstr, 0)
|
||||
if(method==VAPOR)
|
||||
if(prob(20))
|
||||
to_chat(C, "<span class='warning'>You can feel your lungs burning!</b></span>")
|
||||
var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
L.adjustLungLoss(2)
|
||||
C.apply_damage(1, BURN, target)
|
||||
var/acidstr = (5-C.reagents.pH)
|
||||
L.adjustLungLoss(acidstr)
|
||||
C.apply_damage(acidstr/2, BURN, target)
|
||||
C.acid_act(acidstr, volume)
|
||||
..()
|
||||
|
||||
@@ -1418,3 +1479,106 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
|
||||
var/acidstr = (5-holder.pH)
|
||||
T.acid_act(acidstr, volume)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/fermiTest
|
||||
name = "Fermis Test Reagent"
|
||||
id = "fermiTest"
|
||||
description = "You should be really careful with this...! Also, how did you get this?"
|
||||
//data = list("Big bang" = 1, "please work" = 2)
|
||||
addProc = TRUE
|
||||
|
||||
/datum/reagent/fermi/fermiTest/on_new()
|
||||
..()
|
||||
if(LAZYLEN(holder.reagent_list) == 1)
|
||||
return
|
||||
else
|
||||
holder.remove_reagent("fermiTest", 1000)//Avoiding recurrsion
|
||||
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/fermiTox
|
||||
name = ""//defined on setup
|
||||
id = "fermiTox"
|
||||
description = "You should be really careful with this...! Also, how did you get this?"
|
||||
|
||||
/datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method)
|
||||
if(C.dna && istype(C.dna.species, /datum/species/jelly))
|
||||
C.adjustToxLoss(-1)
|
||||
else
|
||||
C.adjustToxLoss(1)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/fermiABuffer
|
||||
name = "Acidic buffer"//defined on setup
|
||||
id = "fermiABuffer"
|
||||
description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another."
|
||||
addProc = TRUE
|
||||
pH = 3
|
||||
|
||||
/datum/reagent/fermi/fermiABuffer/on_new()
|
||||
if(LAZYLEN(holder.reagent_list) == 1)
|
||||
return
|
||||
pH = ((holder.pH * holder.total_volume)+(3 * src.volume))/(holder.total_volume + src.volume)
|
||||
holder.remove_reagent(src.id, 1000)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/fermiBBuffer
|
||||
name = "Basic buffer"//defined on setup
|
||||
id = "fermiBBuffer"
|
||||
description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another."
|
||||
addProc = TRUE
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/fermi/fermiBBuffer/on_new()
|
||||
if(LAZYLEN(holder.reagent_list) == 1)
|
||||
return
|
||||
pH = ((holder.pH * holder.total_volume)+(11 * src.volume))/(holder.total_volume + src.volume)
|
||||
holder.remove_reagent(src.id, 1000)
|
||||
..()
|
||||
|
||||
/*
|
||||
/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()
|
||||
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()
|
||||
*/
|
||||
|
||||
@@ -1,25 +1,34 @@
|
||||
//TO TWEAK:
|
||||
|
||||
/datum/chemical_reaction/fermi
|
||||
mix_sound = 'modular_citadel/sound/voice/merowr.ogg'
|
||||
|
||||
//Called for every reaction step
|
||||
/datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
|
||||
return
|
||||
|
||||
//Called when reaction STOP_PROCESSING
|
||||
/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
|
||||
return
|
||||
|
||||
//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
|
||||
if(!pH)//Dunno how things got here without a pH.
|
||||
pH = 7
|
||||
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
|
||||
@@ -42,8 +51,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)
|
||||
@@ -58,11 +67,11 @@
|
||||
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)
|
||||
required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1)
|
||||
results = list("eigenstate" = 0.1)
|
||||
required_reagents = list("bluespace" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1)
|
||||
mix_message = "zaps brightly into existance, diffusing the energy from the localised gravity well as light"
|
||||
//FermiChem vars:
|
||||
OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions
|
||||
@@ -75,7 +84,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
|
||||
@@ -91,9 +100,9 @@
|
||||
/datum/chemical_reaction/fermi/SDGF
|
||||
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)
|
||||
results = list("SDGF" = 0.3)
|
||||
//required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1)
|
||||
required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "synthflesh" = 1, "blood" = 1)
|
||||
//FermiChem vars:
|
||||
OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions
|
||||
OptimalTempMax = 500 // Upper end for above
|
||||
@@ -111,107 +120,110 @@
|
||||
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
|
||||
S.color = "#810010"
|
||||
to_chat("<span class='warning'>The cells clump up into a horrifying tumour!</span>")
|
||||
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)
|
||||
required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "aphro" = 2)
|
||||
required_reagents = list("salglu_solution" = 0.1, "milk" = 0.5, "synthflesh" = 0.2, "silicon" = 0.2, "aphro" = 0.2)
|
||||
//FermiChem vars:
|
||||
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
|
||||
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)
|
||||
required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1)
|
||||
results = list("PElarger" = 0.3)
|
||||
required_reagents = list("plasma" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1)
|
||||
//required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10)
|
||||
//FermiChem vars:
|
||||
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
|
||||
my_atom.reagents.clear_reagents()
|
||||
..()
|
||||
|
||||
/datum/chemical_reaction/fermi/astral //Vars needed
|
||||
/datum/chemical_reaction/fermi/astral //done //BORKEN
|
||||
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)
|
||||
results = list("astral" = 0.3)
|
||||
required_reagents = list("eigenstate" = 0.1, "plasma" = 0.1, "synaptizine" = 0.1, "aluminium" = 0.5)
|
||||
//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)
|
||||
required_reagents = list("iron" = 1, "iodine" = 1)
|
||||
results = list("enthrall" = 0.3)
|
||||
required_reagents = list("iron" = 0.1, "iodine" = 0.1)
|
||||
//required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1)
|
||||
required_catalysts = list("blood" = 1)
|
||||
required_catalysts = list("blood" = 0.1)
|
||||
//required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10)
|
||||
//FermiChem vars:
|
||||
OptimalTempMin = 780
|
||||
@@ -230,6 +242,29 @@
|
||||
FermiExplode = TRUE
|
||||
PurityMin = 0.15
|
||||
|
||||
|
||||
|
||||
/datum/chemical_reaction/fermi/enthrall/FermiFinish(datum/reagents/holder, var/atom/my_atom)
|
||||
message_admins("On finish for enthral proc'd")
|
||||
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list
|
||||
var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list
|
||||
if(!B.data)
|
||||
var/list/seen = viewers(5, get_turf(holder.my_atom))
|
||||
for(var/mob/M in seen)
|
||||
to_chat(M, "<span class='warning'>The reaction splutters and fails to react.</span>")
|
||||
E.purity = 0
|
||||
if (B.data.["gender"] == "female")
|
||||
E.data.["creatorGender"] = "Mistress"
|
||||
E.creatorGender = "Mistress"
|
||||
else
|
||||
E.data.["creatorGender"] = "Master"
|
||||
E.creatorGender = "Master"
|
||||
E.data["creatorName"] = B.data.["real_name"]
|
||||
E.creatorName = B.data.["real_name"]
|
||||
E.data.["creatorID"] = B.data.["ckey"]
|
||||
E.creatorID = B.data.["ckey"]
|
||||
message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]")
|
||||
|
||||
//Apprently works..?Negative
|
||||
/*
|
||||
/datum/chemical_reaction/fermi/enthrall/on_reaction(datum/reagents/holder)
|
||||
@@ -248,21 +283,21 @@
|
||||
//var/enthrallID = B.get_blood_data()
|
||||
*/
|
||||
|
||||
/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, var/atom/my_atom, volume, temp, pH, Reaction)
|
||||
/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(350)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
var/datum/effect_system/smoke_spread/chem/s = new()
|
||||
R.add_reagent("enthrallExplo", volume)
|
||||
R.add_reagent("enthrallExplo", volume/2)
|
||||
s.set_up(R, volume, T)
|
||||
s.start()
|
||||
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)
|
||||
results = list("hatmium" = 0.5)
|
||||
required_reagents = list("whiskey" = 0.1, "nutriment" = 0.3, "cooking_oil" = 0.2, "iron" = 0.1)
|
||||
//mix_message = ""
|
||||
//FermiChem vars:
|
||||
OptimalTempMin = 500
|
||||
@@ -274,26 +309,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>")
|
||||
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)
|
||||
results = list("furranium" = 0.5)
|
||||
required_reagents = list("aphro" = 0.1, "moonsugar" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1)
|
||||
//mix_message = ""
|
||||
//FermiChem vars:
|
||||
OptimalTempMin = 350
|
||||
@@ -313,11 +349,11 @@
|
||||
//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)
|
||||
required_reagents = list("synthflesh" = 5, "uranium" = 1, "iron" = 1, "salglu_solution" = 3)
|
||||
results = list("naninte_b_gone" = 0.5)
|
||||
required_reagents = list("synthflesh" = 0.5, "uranium" = 0.1, "iron" = 0.1, "salglu_solution" = 0.3)
|
||||
mix_message = "the reaction gurgles, encapsulating the reagents in flesh."
|
||||
//FermiChem vars:
|
||||
OptimalTempMin = 450
|
||||
@@ -329,9 +365,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
|
||||
|
||||
@@ -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,24 @@
|
||||
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!"
|
||||
message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message admins brightens up your day.")
|
||||
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
|
||||
|
||||
@@ -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"
|
||||
@@ -2806,7 +2807,9 @@
|
||||
#include "modular_citadel\code\datums\mutations\hulk.dm"
|
||||
#include "modular_citadel\code\datums\status_effects\chems.dm"
|
||||
#include "modular_citadel\code\datums\status_effects\debuffs.dm"
|
||||
#include "modular_citadel\code\datums\traits\negative.dm"
|
||||
#include "modular_citadel\code\datums\traits\neutral.dm"
|
||||
#include "modular_citadel\code\datums\traits\positive.dm"
|
||||
#include "modular_citadel\code\datums\wires\airlock.dm"
|
||||
#include "modular_citadel\code\datums\wires\autoylathe.dm"
|
||||
#include "modular_citadel\code\game\area\cit_areas.dm"
|
||||
|
||||
Reference in New Issue
Block a user