Winding down to the final commits.

This commit is contained in:
Fermi
2019-05-25 01:04:00 +01:00
parent 05aaeb4d70
commit faf6585b69
13 changed files with 401 additions and 184 deletions
+1 -1
View File
@@ -73,7 +73,7 @@
#define TRAIT_MUSICIAN "musician"
#define TRAIT_CROCRIN_IMMUNE "crocin_immune"
#define TRAIT_NYMPHO "nymphomania"
#define TRAIT_HIGH_BLOOD "high_blood"
#define TRAIT_HIGH_BLOOD "high_blood"
// common trait sources
#define TRAIT_GENERIC "generic"
+48
View File
@@ -313,3 +313,51 @@
/obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
activate()
return ..()
//ported from tg - check to make sure it can't appear where it's not supposed to.
/obj/item/assembly/flash/hypnotic
desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance."
//flashing_overlay = "flash-hypno" doesn't seem to be in citcode yet.
light_color = LIGHT_COLOR_PINK
cooldown = 20
/obj/item/assembly/flash/hypnotic/burn_out()
return
/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE)
if(!istype(M))
return
if(user)
log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src)
else //caused by emp/remote signal
M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]",LOG_ATTACK)
if(generic_message && M != user)
to_chat(M, "<span class='disarm'>[src] emits a soothing light...</span>")
if(targeted)
if(M.flash_act(1, 1))
var/hypnosis = FALSE
if(M.hypnosis_vulnerable())
hypnosis = TRUE
if(user)
user.visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>", "<span class='danger'>You hypno-flash [M]!</span>")
if(!hypnosis)
to_chat(M, "<span class='notice'>The light makes you feel oddly relaxed...</span>")
M.confused += min(M.confused + 10, 20)
M.dizziness += min(M.dizziness + 10, 20)
M.drowsyness += min(M.drowsyness + 10, 20)
//M.apply_status_effect(STATUS_EFFECT_PACIFY, 100) for when we port apply_status_effect pacifist (maybe I'll do it)
else
M.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
else if(user)
user.visible_message("<span class='disarm'>[user] fails to blind [M] with the flash!</span>", "<span class='warning'>You fail to hypno-flash [M]!</span>")
else
to_chat(M, "<span class='danger'>[src] fails to blind you!</span>")
else if(M.flash_act())
to_chat(M, "<span class='notice'>Such a pretty light...</span>")
M.confused += min(M.confused + 4, 20)
M.dizziness += min(M.dizziness + 4, 20)
M.drowsyness += min(M.drowsyness + 4, 20)
//M.apply_status_effect(STATUS_EFFECT_PACIFY, 40) for when we port apply_status_effect pacifist (maybe I'll do it)
+15 -11
View File
@@ -566,6 +566,7 @@ im
//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]))
multiplier*=10
if (multiplier == 0)
STOP_PROCESSING(SSprocessing, src)
fermiIsReacting = FALSE
@@ -646,12 +647,12 @@ im
var/purity = 1
//var/tempVol = totalVol
//message_admins("Loop beginning")
message_admins("multiplier [multiplier], target vol:[targetVol], rate lim: [C.RateUpLim], reactedVol: [reactedVol]")
//Begin Parse
WARNING("Purity precalc: [overallPurity]")
update_holder_purity(C)//updates holder's purity
WARNING("Purity postcalc: [overallPurity]")
//WARNING("Purity precalc: [overallPurity]")
//update_holder_purity(C)//updates holder's purity
//WARNING("Purity postcalc: [overallPurity]")
//Check extremes first
if (cached_temp > C.ExplodeTemp)
@@ -709,8 +710,7 @@ im
deltaT = 0
//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
stepChemAmmount = CLAMP((deltaT * C.RateUpLim), 0, (targetVol - reactedVol)) //used to have multipler, now it doesn't
if (stepChemAmmount > C.RateUpLim)
stepChemAmmount = C.RateUpLim
else if (stepChemAmmount <= 0.01)
@@ -728,7 +728,7 @@ im
//TODO: Check overall beaker purity with proc
//Then adjust purity of result AND yeild ammount with said purity.
stepChemAmmount *= overallPurity
stepChemAmmount *= reactant_purity(C)
// End.
/*
@@ -764,7 +764,7 @@ im
return (reactedVol)
/datum/reagents/proc/update_holder_purity(var/datum/chemical_reaction/fermi/C, holder)
/datum/reagents/proc/reactant_purity(var/datum/chemical_reaction/fermi/C, holder)
var/list/cached_reagents = reagent_list
var/i
var/cachedPurity
@@ -773,7 +773,7 @@ im
if (R in cached_reagents)
cachedPurity += R.purity
i++
overallPurity = cachedPurity/i
return cachedPurity/i
/datum/reagents/proc/isolate_reagent(reagent)
var/list/cached_reagents = reagent_list
@@ -881,12 +881,12 @@ im
if (pH <= 2)
var/datum/effect_system/smoke_spread/chem/s = new
var/turf/T = get_turf(my_atom)
var/datum/reagents/R = new/datum/re agents(3000)//I don't want to hold it back..!
var/datum/reagents/R = new/datum/reagents(3000)//I don't want to hold it back..!
R.add_reagent("fermiAcid", amount)
for (var/datum/reagent/reagentgas in reagent_list)
R.add_reagent(reagentgas, amount/5)
remove_reagent(reagentgas, amount/5)
s.set_up(R, CLAMP(amount/10, 0, 3), T)
s.set_up(R, CLAMP(amount/10, 0, 1), T)
s.start()
return FALSE
@@ -937,6 +937,10 @@ im
//if(R.FermiChem == TRUE)
// R.on_mob_add(my_atom)
R.on_merge(data, amount, my_atom, other_purity)
if(istype(D, /datum/reagent/fermi))//Is this a fermichem?
var/datum/reagent/fermi/Ferm = D //It's Fermi time!
if(Ferm.OnMobMergeCheck == TRUE) //// Ooooooh fermifermifermi
R.on_mob_add(my_atom, amount)
if(!no_react)
handle_reactions()
@@ -1930,6 +1930,7 @@
if(prob(20))
to_chat(M, "You find yourself unable to supress the desire to meow!")
M.emote("nya")
..()
//Kept for legacy, I think it will break everything if you enable it.
/datum/reagent/penis_enlargement
+63 -23
View File
@@ -717,21 +717,21 @@
if(user.mind)
//Chaplains are very good at indoctrinating
if(user.mind.assigned_role == "Chaplain")
power_multiplier *= 2
power_multiplier *= 1.2
//Command staff has authority
if(user.mind.assigned_role in GLOB.command_positions)
power_multiplier *= 1.4
power_multiplier *= 1.1
//Why are you speaking
if(user.mind.assigned_role == "Mime")
power_multiplier *= 0.5
//Cultists are closer to their gods and are better at indoctrinating
if(iscultist(user))
power_multiplier *= 2
power_multiplier *= 1.2
else if (is_servant_of_ratvar(user))
power_multiplier *= 2
power_multiplier *= 1.2
else if (is_devil(user))//The devil is supposed to be seductive, right?
power_multiplier *= 2
power_multiplier *= 1.2
//range = 0.5 - 4.2~
//most cases = 1-2
@@ -854,10 +854,16 @@
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)
/* TODO: ADD THIS IN WHEN MASO IS MERGED
if(L.has_trait(TRAIT_MASO))
E.enthrallTally -= power_multiplier
E.resistanceTally += power_multiplier
E.cooldown += 1
*/
else
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
E.enthrallTally += power_multiplier
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
@@ -867,18 +873,25 @@
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 *= 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
var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]"
if (L.lewd)
E.resistanceTally /= 1*power_multiplier
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='warning'>I've let [E.enthrallGender] down...</b></span>"), 5)
/* TODO: ADD THIS IN WHEN MASO IS MERGED
if(L.has_trait(TRAIT_MASO))
L.adjustArousalLoss(3*power_multiplier)
descmessage += " And yet, it feels good..!"
E.enthrallTally += power_multiplier
E.resistanceTally -= power_multiplier
E.cooldown += 1
*/
else
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.cooldown += 1
E.resistanceTally += power_multiplier
E.enthrallTally += power_multiplier
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold, descmessage)
E.cooldown += 1
//teir 0
@@ -891,7 +904,7 @@
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
addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5)
//WAKE UP
else if((findtext(message, wakeup_words)))
@@ -938,7 +951,7 @@
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
E.status = "Antiresist"
E.statusStrength = (1 * power_multiplier * E.phase)
E.cooldown += 6//Too short?
E.cooldown += 15//Too short? yes, made 15
//RESIST
else if((findtext(message, resist_words)))
@@ -993,6 +1006,9 @@
E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
E.enthrallTally += power_multiplier
E.cooldown += 6
else
H.throw_at(get_step_towards(user,H), 3 * power_multiplier, 1 * power_multiplier)
//awoo
@@ -1022,7 +1038,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(40 * power_multiplier)
C.Sleeping(45 * power_multiplier)
E.cooldown += 10
//STRIP
@@ -1039,7 +1055,7 @@
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 doesn't work?
//WALK doesn't work? it does, randomly, work now
else if((findtext(message, walk_words)))
for(var/V in listeners)
var/mob/living/L = V
@@ -1061,13 +1077,24 @@
L.toggle_move_intent()
E.cooldown += 1
//LIE DOWN
else if(findtext(message, liedown_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(2 to INFINITY)//Tier 2 only
L.lay_down()
E.cooldown += 10
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You suddenly lie down!'</b></span>"), 5)
//KNOCKDOWN
else if(findtext(message, knockdown_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 2 only
if(2 to INFINITY)//Tier 2 only
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)
@@ -1080,7 +1107,7 @@
var/speaktrigger = ""
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)
if (E.phase > 2)
for (var/trigger in E.customTriggers)
speaktrigger += "[trigger], "
C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself!
@@ -1099,6 +1126,8 @@
return
else
user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'")
user.SetStun(1000)//Hands are handy, so you have to stay still
H.SetStun(1000)
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)
@@ -1107,14 +1136,18 @@
if (trigger2 == "speak" || trigger2 == "echo")
var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN)
E.customTriggers[trigger] = list(trigger2, trigger3)
message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].")
else
E.customTriggers[trigger] = trigger2
message_admins("[H] has been implanted by [user] with [trigger], triggering [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
to_chat(user, "<span class='warning'>Your pet looks at you with a vacant blase expression, you don't think you can program anything else into them</b></span>")
user.SetStun(0)
H.SetStun(0)
//CUSTOM OBJECTIVE
else if((findtext(message, objective_words)))
@@ -1127,6 +1160,8 @@
return
else
user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'")
user.SetStun(1000)//So you can't run away!
H.SetStun(1000)
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))
@@ -1137,12 +1172,16 @@
objective = replacetext(lowertext(objective), "harm", "snuggle")
objective = replacetext(lowertext(objective), "decapitate", "headpat")
objective = replacetext(lowertext(objective), "strangle", "meow at")
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)
objective = replacetext(lowertext(objective), "suicide", "self-love")
message_admins("[H] has been implanted by [user] with the objective [objective].")
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 -= 250
E.mental_capacity -= 200
//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>")
user.SetStun(0)
H.SetStun(0)
//RECOGNISE
@@ -1168,7 +1207,7 @@
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)
L.Stun(5 * power_multiplier)
//STUN
else if(findtext(message, stun_words))
@@ -1197,7 +1236,7 @@
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
L.adjust_bodytemperature(50 * power_multiplier)//This seems nuts, reduced it, but then it didn't do anything, so I reverted it.
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You feel your metabolism speed up!</b></span>"), 5)
//COLD
@@ -1207,7 +1246,7 @@
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
L.adjust_bodytemperature(-50 * power_multiplier)//This
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "<span class='notice'>You feel your metabolism slow down!</b></span>"), 5)
@@ -1243,6 +1282,7 @@
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
switch(E.phase)
if(3 to INFINITY)//Tier 3 only
E.statusStrength = 2* power_multiplier
E.status = "charge"
E.cooldown += 10
+8 -1
View File
@@ -1504,7 +1504,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 15
restricted_roles = list("Clown")
/datum/uplink_item/device_tools/honkpins //Idealy so they can place it into their own guns without needing cargo
/datum/uplink_item/device_tools/honkpins //Idealy so they can place it into their own guns without needing cargo
name = "Hilarious firing pin"
desc = "A single firing pin made for Clown agents, this firing pin makes any gun honk when fired if not a true clown! \
This firing pin also helps you fire the gun correctly. May the HonkMother HONK you agent."
@@ -1552,6 +1552,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
cost = 2
//ported from tg as is along with functions, feel free to edit/remove
/datum/uplink_item/device_tools/hypnotic_flash
name = "Hypnotic Flash"
desc = "A modified flash able to hypnotize targets. If the target is not in a mentally vulnerable state, it will only confuse and pacify them temporarily."
item = /obj/item/assembly/flash/hypnotic
cost = 7
/datum/uplink_item/badass/balloon
name = "Syndicate Balloon"
desc = "For showing that you are THE BOSS: A useless red balloon with the Syndicate logo on it. \
@@ -212,6 +212,9 @@
var/cooldown = 0
var/cooldownMsg = TRUE
var/cTriggered = FALSE
var/resistGrowth = 0
var/DistApart = 1
var/tranceTime = 0
/datum/status_effect/chem/enthrall/on_apply()
var/mob/living/carbon/M = owner
@@ -273,7 +276,7 @@
if(0)// sleeper agent
return
if(1)//Initial enthrallment
if (enthrallTally > 100)
if (enthrallTally > 150)
phase += 1
mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity.
resistanceTally /= 2
@@ -282,7 +285,7 @@
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)
else if (resistanceTally > 150)
enthrallTally *= 0.5
phase = -1
resistanceTally = 0
@@ -293,7 +296,7 @@
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)
if (enthrallTally > 200)
phase += 1
mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity.
enthrallTally = 0
@@ -303,8 +306,8 @@
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)
owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT
else if (resistanceTally > 200)
enthrallTally *= 0.5
phase -= 1
resistanceTally = 0
@@ -336,7 +339,8 @@
//distance calculations
switch(get_dist(master, owner))
DistApart = get_dist(master, owner)
switch(DistApart)
if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects.
if(phase <= 2)
enthrallTally += distancelist[get_dist(master, owner)+1]
@@ -438,7 +442,7 @@
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.
//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, ANTIRESIST - frustrates resist presses.
if (status)
if(status == "Antiresist")
@@ -497,6 +501,10 @@
to_chat(master, "<span class='notice'><i>Your thrall [owner] appears to have finished internalising your last command.</i></span>")
cooldownMsg = TRUE
cooldown = 0
if (tranceTime > 0) //custom trances only last 50 ticks.
tranceTime -= 1
else
M.remove_status_effect(/datum/status_effect/trance)
//..()
//Remove all stuff
@@ -572,8 +580,7 @@
//kneel (knockdown)
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
C.lay_down()
//strip (some) clothes
else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops, is this pref breaking?
@@ -585,9 +592,10 @@
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.
else if (lowertext(customTriggers[trigger]) == "trance")//Maaaybe too strong. Weakened it, only lasts 50 ticks.
var/mob/living/carbon/human/o = owner
o.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
tranceTime = 50
//add more fun stuff!
@@ -601,7 +609,8 @@
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!")
//Able to resist checks
if (status == "Sleeper" || phase == 0)
return
else if (phase == 4)
@@ -627,21 +636,33 @@
return
else
status = null
//base resistance
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
deltaResist = 2 + resistGrowth
resistGrowth += 0.1
//distance modifer
switch(DistApart)
if(0)
deltaResist *= 0.8
if(1 to 8)//If they're far away, increase resistance.
deltaResist *= (1+(DistApart/10))
if(9 to INFINITY)//If
deltaResist *= 2
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
//nymphomania
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.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
@@ -681,11 +702,11 @@
//Happiness resistance
//Your Thralls are like pets, you need to keep them happy.
if(owner.nutrition < 250)
deltaResist += (250-owner.nutrition)/100
if(owner.nutrition < 300)
deltaResist += (300-owner.nutrition)/6
if(owner.health < 100)//Harming your thrall will make them rebel harder.
deltaResist *= ((120-owner.health)/100)+1
//if()
//if(owner.mood.mood) //datum/component/mood TO ADD in FERMICHEM 2
//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
@@ -695,9 +716,11 @@
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]!")
*/
message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally], delta: [deltaResist]")
return
//I think this can be left out, but I'll leave the code incase anyone wants to add to it.
@@ -12,10 +12,11 @@
//You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic!
addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it.
//DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective.
/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))
seen - quirk_holder
seen -= quirk_holder
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
@@ -11,3 +11,4 @@
/datum/quirk/BloodPressure/add()
var/mob/living/M = quirk_holder
M.blood_ratio = 1.2
M.blood_volume += 100
@@ -24,8 +24,8 @@
/obj/item/organ/genital/breasts/Initialize()
. = ..()
reagents.add_reagent(fluid_id, fluid_max_volume)
prev_size = size
cached_size = breast_values[size]
//prev_size = size
//cached_size = breast_values[size]
/* This breaks the character creation sceen. for some reason sizes are set to numbers there.
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
@@ -56,7 +56,7 @@
else
desc = "You see some breasts, they seem to be quite exotic."
if(isnum(size))
desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter."
desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(size)]cm in diameter."
else if (!isnum(size))
if (size == "flat")
desc += " They're very small and flatchested, however."
@@ -93,6 +93,7 @@
//var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts")
if (cached_size == null)
prev_size = size
cached_size = breast_values[size]
return
//message_admins("Breast size at start: [size], [cached_size], [owner]")
if(!isnum(cached_size))
@@ -23,13 +23,18 @@
/obj/item/organ/genital/penis/Initialize()
. = ..()
/* I hate genitals.
var/mob/living/carbon/human/o = owner
length = o.dna.features["cock_length"] //for whatever reason, this doesn't set up correctly.
prev_size = length
cached_length = length
*/
/obj/item/organ/genital/penis/update_size()
var/mob/living/carbon/human/o = owner
if(!cached_length)
prev_size = length
cached_length = length
if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!!
var/obj/item/organ/genital/penis/P = o.getorganslot("penis")
to_chat(o, "<span class='warning'>You feel your tallywacker shrinking away from your body as your groin flattens out!</b></span>")
@@ -42,23 +47,30 @@
//message_admins("Attempting to remove.")
o.remove_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = FALSE
if(5 to 8) //If modest size
if(5 to 10) //If modest size
length = cached_length
size = 2
if(statuscheck == TRUE)
//message_admins("Attempting to remove.")
o.remove_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = FALSE
if(9 to INFINITY) //If massive
if(11 to 20) //If massive
length = cached_length
size = 3 //no new sprites for anything larger yet
size = 3
if(statuscheck == FALSE)
//message_admins("Attempting to apply.")
o.remove_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = TRUE
if(15 to INFINITY)
if(21 to 29)
length = cached_length
size = 3 //no new sprites for anything larger yet
size = 3
if(statuscheck == FALSE)
//message_admins("Attempting to apply.")
o.apply_status_effect(/datum/status_effect/chem/PElarger)
statuscheck = TRUE
if(30 to INFINITY)
length = cached_length
size = 4 //no new sprites for anything larger yet
if(statuscheck == FALSE)
//message_admins("Attempting to apply.")
o.apply_status_effect(/datum/status_effect/chem/PElarger)
@@ -66,9 +78,9 @@
//message_admins("Pinas size: [length], [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", "Chase Redtail", "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>")
to_chat(o, "<span class='warning'>Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "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(round(length))] inch penis.</b></span>")
else 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", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(length)] inch penis.</b></span>")
to_chat(o, "<span class='warning'>Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.</b></span>")
prev_size = length
icon_state = sanitize_text("penis_[shape]_[size]")
//update_body()
@@ -17,6 +17,7 @@
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
var/OnMobMergeCheck = FALSE
//var/addProc = FALSE //When this reagent is added to a new beaker, it does something.
///datum/reagent/fermi/on_mob_life(mob/living/carbon/M)
@@ -130,6 +131,7 @@
var/mob/living/fermi_Tclone = null
var/teleBool = FALSE
mob/living/carbon/purgeBody
pH = 3.7
/*
/datum/reagent/fermi/eigenstate/on_new()
@@ -1084,26 +1086,29 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
color = "#2C051A" // rgb: , 0, 255
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
InverseChemVal = 0.5
InverseChem = "enthrallInverse" //At really impure vols, it just becomes 100% inverse
//DoNotSplit = TRUE
data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null)
var/creatorID //ckey
var/creatorGender
var/creatorName
var/mob/living/creator
pH = 10
OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human
/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."
description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, 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
//InverseChemVal = 0.5
//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"
creatorName = "Fermis Yakumo"
purity = 1
/datum/reagent/fermi/enthrall/test/on_new()
@@ -1128,12 +1133,15 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
creatorName = B.data.["real_name"]
creatorID = B.data.["ckey"]
*/
//FERMICHEM2 split into different chems
/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M)
. = ..()
if(!creatorID)
message_admins("Something went wrong in enthral creation THIS SHOULD NOT APPEAR")
return
var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)
if(E)
return
message_admins("key: [M.ckey] vs [creatorID], ")
if(purity < 0.5)//Impure chems don't function as you expect
return
@@ -1157,33 +1165,17 @@ 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.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
for(var/victim in seen)
if((victim == /mob/living/simple_animal/pet/) || (victim == M))
seen = seen - victim
if(!seen)
return
M.reagents.remove_reagent(src.id, src.volume)
FallInLove(M, pick(seen))
return
else // If someone else drinks it, the creator falls in love with them!
var/mob/living/carbon/C = get_mob_by_key(creatorID)
if(C.has_status_effect(STATUS_EFFECT_INLOVE))
return
if(C in viewers(7, get_turf(M)))
M.reagents.remove_reagent(src.id, src.volume)
FallInLove(C, M)
return
if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing.
return
if(!M.client)
metabolization_rate = 0 //Stops powergamers from quitting to avoid affects.
return
if(metabolization_rate == 0)
metabolization_rate = 0.5
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)
M.reagents.remove_reagent(src.id, 10)
M.apply_status_effect(/datum/status_effect/chem/enthrall)
M.reagents.remove_reagent(src.id, 1)
//M.apply_status_effect(/datum/status_effect/chem/enthrall)
message_admins("No enthrall status found in [M]!")
else
E.enthrallTally += 1
@@ -1193,7 +1185,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
/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.)
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, 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
@@ -1229,6 +1221,39 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
M.adjustBrainLoss(0.1)//should be 15 in total
..()
/datum/reagent/fermi/enthrall/Inverse
name = "MKUltra"
id = "enthrall"
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
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses"
DoNotSplit = TRUE
/datum/reagent/fermi/enthrall/Inverse/on_mob_life(mob/living/carbon/M)
if(purity < 0.5)//Placeholder for now. I'd like to get this done.
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
for(var/victim in seen)
if((victim == /mob/living/simple_animal/pet/) || (victim == M))
seen = seen - victim
if(!seen)
return
M.reagents.remove_reagent(src.id, src.volume)
FallInLove(M, pick(seen))
return
else // If someone else drinks it, the creator falls in love with them!
var/mob/living/carbon/C = get_mob_by_key(creatorID)
if(C.has_status_effect(STATUS_EFFECT_INLOVE))
return
if(C in viewers(7, get_turf(M)))
M.reagents.remove_reagent(src.id, src.volume)
FallInLove(C, M)
return
if(volume < 1)//You don't get to escape that easily
FallInLove(pick(GLOB.player_list), M)
//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.
/datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes
name = "MKUltra"
@@ -1236,7 +1261,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
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
metabolization_rate = 0.1
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses"
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses."
DoNotSplit = TRUE
var/mob/living/carbon/love
/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system.
@@ -1274,7 +1300,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
..()
/datum/reagent/fermi/enthrall/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love)
/datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love)
if(Lover.has_status_effect(STATUS_EFFECT_INLOVE))
to_chat(Lover, "<span class='warning'>You are already fully devoted to someone else!</span>")
return
@@ -1462,11 +1488,12 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
name = "Acid vapour"
id = "fermiAcid"
description = "Someone didn't do like an otter, and add acid to water."
taste_description = "acid burns, ow!!"
pH = 0
/datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method)
var/target = C.get_bodypart(BODY_ZONE_CHEST)
var/acidstr = (5-C.reagents.pH)
var/acidstr = ((5-C.reagents.pH)*2)
C.adjustFireLoss(acidstr, 0)
if(method==VAPOR)
if(prob(20))
@@ -1545,10 +1572,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
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
taste_description = "an acidy sort of taste, blech."
addProc = FALSE
pH = 3
/datum/reagent/fermi/fermiABuffer/on_new()
if(addProc == FALSE)//This is so it doesn't react when made.
addProc = TRUE
if(LAZYLEN(holder.reagent_list) == 1)
return
pH = ((holder.pH * holder.total_volume)+(3 * src.volume))/(holder.total_volume + src.volume)
@@ -1559,10 +1589,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
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
taste_description = "an soapy sort of taste, blech."
addProc = FALSE
pH = 11
/datum/reagent/fermi/fermiBBuffer/on_new()
if(addProc == FALSE)//This is so it doesn't react when made.
addProc = TRUE
if(LAZYLEN(holder.reagent_list) == 1)
return
pH = ((holder.pH * holder.total_volume)+(11 * src.volume))/(holder.total_volume + src.volume)
@@ -1,7 +1,7 @@
//TO TWEAK:
/datum/chemical_reaction/fermi
mix_sound = 'modular_citadel/sound/voice/merowr.ogg'
mix_sound = 'sound/effects/bubbles.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???
@@ -22,6 +22,24 @@
var/ImpureTot = 0
var/pHmod = 1
var/turf/T = get_turf(my_atom)
var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case.
var/datum/effect_system/smoke_spread/chem/s = new()
if(pH < 4) //if acidic, make acid spray
//s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T)
R.add_reagent("fermiAcid", ((volume/3)/pH))
pHmod = 2
for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents
if (istype(reagent, /datum/reagent/fermi))
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)
ImpureTot = (ImpureTot + (1-reagent.purity)) / 2
if(R.reagent_list)
s.set_up(R, (volume/10)*pHmod, 10, T)
s.start()
if(temp>500)//if hot, start a fire
switch(temp)
if (500 to 750)
@@ -37,32 +55,16 @@
new /obj/effect/hotspot(turf)
//volume /= 5
//var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new
var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case.
var/datum/effect_system/smoke_spread/chem/s = new()
if(pH < 4)
//s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T)
R.add_reagent("fermiAcid", ((volume/3)/pH))
pHmod = 2
if (pH > 10)
if(!ImpureTot == 0) //If impure, v.small emp
ImpureTot *= volume
empulse(T, volume/10, ImpureTot/10, 1)
if (pH > 10) //if alkaline, small explosion.
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(round((volume/30)*(pH-9)), T, 0, 0)
e.start()
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, 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)
ImpureTot = (ImpureTot + (1-reagent.purity)) / 2
if(R.reagent_list)
s.set_up(R, (volume/10)*pHmod, 10, T)
s.start()
if(!ImpureTot == 0)
ImpureTot *= volume
empulse(T, volume/10, ImpureTot/10, 1)
message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]")
my_atom.reagents.clear_reagents()
return
@@ -75,47 +77,46 @@
mix_message = "the reaction zaps suddenly!"
//FermiChem vars:
OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 500 // Upper end for above
ExplodeTemp = 550 //Temperature at which reaction explodes
OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
OptimalpHMax = 9.5 // Higest value for above
ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase)
OptimalTempMax = 600 // Upper end for above
ExplodeTemp = 750 //Temperature at which reaction explodes
OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
OptimalpHMax = 8 // Higest value for above
ReactpHLim = 4 // How far out pH wil react, giving impurity place (Exponential phase)
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
CurveSharpT = 0.6 // 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.08 //pH change per 1u reaction
RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect
ThermicConstant = 5 //Temperature change per 1u produced
HIonRelease = -0.1 //pH change per 1u reaction
RateUpLim = 5.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
/datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does.
var/location = get_turf(holder.my_atom)
var/location = get_turf(my_atom)
var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
E.location_created = location
//add on_new() handling of vars
//serum
/datum/chemical_reaction/fermi/SDGF
/datum/chemical_reaction/fermi/SDGF //DONE
name = "Synthetic-derived growth factor"
id = "SDGF"
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)
mix_message = "the reaction gives off a blorble!"
//FermiChem vars:
OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 500 // Upper end for above
ExplodeTemp = 550 // Temperature at which reaction explodes
OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
OptimalpHMax = 9.5 // Higest value for above
OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 630 // Upper end for above
ExplodeTemp = 635 // Temperature at which reaction explodes
OptimalpHMin = 3 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
OptimalpHMax = 3.5 // Higest value for above
ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase)
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = 20 // Temperature change per 1u produced
HIonRelease = 0.01 // pH change per 1u reaction
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = -5 // Temperature change per 1u produced
HIonRelease = 0.05 // 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 = TRUE // If the chemical explodes in a special way
@@ -129,8 +130,10 @@
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()
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
to_chat(M, "<span class='warning'>The cells clump up into a horrifying tumour!</span>")
/datum/chemical_reaction/fermi/BElarger //done
name = "Sucubus milk"
@@ -156,21 +159,20 @@
PurityMin = 0.1
/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(my_atom))
var/obj/item/organ/genital/breasts/B = 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
var/datum/reagent/fermi/BElarger/BE = locate(/datum/reagent/fermi/BElarger) in my_atom.reagents.reagent_list
B.size = ((BE.volume * BE.purity) / 10) //half as effective.
my_atom.reagents.clear_reagents()
..()
/datum/chemical_reaction/fermi/PElarger //done
name = "Incubus draft"
id = "PElarger"
results = list("PElarger" = 0.3)
required_reagents = list("plasma" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1)
required_reagents = list("blood" = 0.5, "synthflesh" = 0.2, "carbon" = 0.2, "aphro" = 0.2, "salglu_solution" = 0.1,)
mix_message = ""
//required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10)
//FermiChem vars:
OptimalTempMin = 200
OptimalTempMax = 800
@@ -189,31 +191,32 @@
PurityMin = 0.1
/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(my_atom))
var/obj/item/organ/genital/penis/P = 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
var/datum/reagent/fermi/PElarger/PE = locate(/datum/reagent/fermi/PElarger) in my_atom.reagents.reagent_list
P.length = ((PE.volume * PE.purity) / 10)//half as effective.
my_atom.reagents.clear_reagents()
..()
//..()
/datum/chemical_reaction/fermi/astral //done //BORKEN
name = "Astrogen"
id = "astral"
results = list("astral" = 0.3)
required_reagents = list("eigenstate" = 0.1, "plasma" = 0.1, "synaptizine" = 0.1, "aluminium" = 0.5)
results = list("astral" = 0.5)
required_reagents = list("eigenstate" = 0.1, "plasma" = 0.2, "synaptizine" = 0.1, "aluminium" = 0.5)
//FermiChem vars:
OptimalTempMin = 200
OptimalTempMin = 700
OptimalTempMax = 800
ExplodeTemp = 900
OptimalpHMin = 12
ExplodeTemp = 1150
OptimalpHMin = 10
OptimalpHMax = 13
ReactpHLim = 2
CatalystFact = 0
CurveSharpT = 4
CurveSharppH = 2
ThermicConstant = 10
HIonRelease = 0.5
CurveSharpT = 1
CurveSharppH = 1
ThermicConstant = 20
HIonRelease = -0.5
RateUpLim = 10
FermiChem = TRUE
FermiExplode = TRUE
@@ -238,12 +241,12 @@
//CatalystFact = 0
CurveSharpT = 0.5
CurveSharppH = 4
ThermicConstant = 20
ThermicConstant = 10
HIonRelease = -0.1
RateUpLim = 5
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.15
PurityMin = 0.2
@@ -255,7 +258,7 @@
var/list/seen = viewers(5, get_turf(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
//E.purity = 0
if (B.data.["gender"] == "female")
E.data.["creatorGender"] = "Mistress"
E.creatorGender = "Mistress"
@@ -288,8 +291,8 @@
OptimalTempMin = 500
OptimalTempMax = 650
ExplodeTemp = 750
OptimalpHMin = 10
OptimalpHMax = 14
OptimalpHMin = 2
OptimalpHMax = 5
ReactpHLim = 1
//CatalystFact = 0 //To do 1
CurveSharpT = 4
@@ -298,8 +301,8 @@
HIonRelease = -0.05
RateUpLim = 5
FermiChem = TRUE
//FermiExplode = FALSE
//PurityMin = 0.15
FermiExplode = TRUE
PurityMin = 0.5
/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))
@@ -308,7 +311,6 @@
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 - done
name = "Furranium"
@@ -326,33 +328,77 @@
//CatalystFact = 0 //To do 1
CurveSharpT = 2
CurveSharppH = 0.5
ThermicConstant = -2
ThermicConstant = -10
HIonRelease = -0.1
RateUpLim = 10
FermiChem = TRUE
//FermiExplode = FALSE
//PurityMin = 0.15
PurityMin = 0.30
//Nano-b-gone
/datum/chemical_reaction/fermi/naninte_b_gone//done
/datum/chemical_reaction/fermi/naninte_b_gone//done test
name = "Naninte bain"
id = "naninte_b_gone"
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."
results = list("naninte_b_gone" = 20)
required_reagents = list("synthflesh" = 5, "uranium" = 5, "iron" = 5, "salglu_solution" = 5)
mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off."
required_temp = 499//To force fermireactions before EMP.
//FermiChem vars:
OptimalTempMin = 450
OptimalTempMin = 500
OptimalTempMax = 600
ExplodeTemp = 700
OptimalpHMin = 6
OptimalpHMax = 8
ReactpHLim = 1
OptimalpHMax = 6.25
ReactpHLim = 3
//CatalystFact = 0 //To do 1
CurveSharpT = 4
CurveSharppH = 2
ThermicConstant = 1
CurveSharpT = 0
CurveSharppH = 1
ThermicConstant = 5
HIonRelease = 0.01
RateUpLim = 100
FermiChem = TRUE
//FermiExplode = FALSE
//PurityMin = 0.15
PurityMin = 0.15
/datum/chemical_reaction/fermi/fermiABuffer//done test
name = "Acetic acid buffer"
id = "fermiABuffer"
results = list("fermiABuffer" = 20) //acetic acid
required_reagents = list("salglu_solution" = 2, "ethanol" = 6, "oxygen" = 6, "water" = 6)
//FermiChem vars:
OptimalTempMin = 250
OptimalTempMax = 500
ExplodeTemp = 9999 //check to see overflow doesn't happen!
OptimalpHMin = 2.5
OptimalpHMax = 3.5
ReactpHLim = 0
//CatalystFact = 0 //To do 1
CurveSharpT = 1
CurveSharppH = 0
ThermicConstant = 0
HIonRelease = -0.01
RateUpLim = 20
FermiChem = TRUE
//datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this
/datum/chemical_reaction/fermi/fermiBBuffer//done test
name = "Ethyl Ethanoate buffer"
id = "fermiBBuffer"
results = list("fermiBBuffer" = 15)
required_reagents = list("fermiABuffer" = 5, "ethanol" = 5, "salglu_solution" = 1, "water" = 5)
required_catalysts = list("sacid" = 5) //vagely acetic
//FermiChem vars:
OptimalTempMin = 250
OptimalTempMax = 500
ExplodeTemp = 9999 //check to see overflow doesn't happen!
OptimalpHMin = 10.5
OptimalpHMax = 11.5
ReactpHLim = 0
//CatalystFact = 0 //To do 1
CurveSharpT = 1
CurveSharppH = 0
ThermicConstant = 0
HIonRelease = 0.01
RateUpLim = 20
FermiChem = TRUE
///datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this