[MIRROR] [Ready] Fermichem part 2.3 Adds a new reagent: Eigenstasium (#4445)

* [Ready] Fermichem part 2.3 Adds a new reagent: Eigenstasium

* Update quirks.dm

* Update closets.dm

* aaaaaaa

* Update lizardpeople.dm

* Update mothmen.dm

* Update species.dm

* Update species.dm

Co-authored-by: Thalpy <33956696+Thalpy@users.noreply.github.com>
Co-authored-by: Gandalf <jzo123@hotmail.com>
Co-authored-by: Azarak <azarak10@gmail.com>
This commit is contained in:
SkyratBot
2021-03-30 10:12:19 +02:00
committed by GitHub
parent faf4762e63
commit 1fbe38a51a
30 changed files with 866 additions and 184 deletions

View File

@@ -114,6 +114,8 @@
#define COLOR_THEME_GLASS "#75A4C4"
#define COLOR_THEME_CLOCKWORK "#CFBA47"
///Colors for eigenstates
#define COLOR_PERIWINKLEE "#9999FF"
/**
* Some defines to generalise colours used in lighting.
*

View File

@@ -741,6 +741,16 @@
///from [/obj/structure/closet/supplypod/proc/preOpen]:
#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom"
///Closets
///From base of [/obj/structure/closet/proc/insert]: (atom/movable/inserted)
#define COMSIG_CLOSET_INSERT "closet_insert"
///used to interrupt insertion
#define COMPONENT_CLOSET_INSERT_INTERRUPT (1<<0)
///Eigenstasium
///From base of [/datum/controller/subsystem/eigenstates/proc/use_eigenlinked_atom]: (var/target)
#define COMSIG_EIGENSTATE_ACTIVATE "eigenstate_activate"
// /obj signals for economy
///called when the payment component tries to charge an account.
#define COMSIG_OBJ_ATTEMPT_CHARGE "obj_attempt_simple_charge"

View File

@@ -9,6 +9,12 @@
#define STATUS_EFFECT_REFRESH 3 // if it only allows one, and new instances just instead refresh the timer
///Processing flags - used to define the speed at which the status will work
///This is fast - 0.2s between ticks (I believe!)
#define STATUS_EFFECT_FAST_PROCESS 0
///This is slower and better for more intensive status effects - 1s between ticks
#define STATUS_EFFECT_NORMAL_PROCESS 1
///////////
// BUFFS //
///////////
@@ -127,6 +133,8 @@
#define STATUS_EFFECT_HIGHFIVE /datum/status_effect/high_fiving // you are angling for a high five
#define STATUS_EFFECT_SURRENDER /datum/status_effect/grouped/surrender // gives an alert to quickly surrender
#define STATUS_EFFECT_EIGEN /datum/status_effect/eigenstasium
/////////////
// SLIME //
/////////////

View File

@@ -0,0 +1,112 @@
///Subsystem used to teleport people to a linked web of itterative entries. If one entry is deleted, the 2 around it will forge a link instead.
SUBSYSTEM_DEF(eigenstates)
name = "Eigenstates"
flags = SS_NO_INIT | SS_NO_FIRE
///The list of objects that something is linked to indexed by UID
var/list/eigen_targets = list()
///UID to object reference
var/list/eigen_id = list()
///Unique id counter
var/id_counter = 1
///Limit the number of sparks created when teleporting multiple atoms to 1
var/spark_time = 0
///Creates a new link of targets unique to their own id
/datum/controller/subsystem/eigenstates/proc/create_new_link(targets)
if(length(targets) <= 1)
return FALSE
for(var/atom/target as anything in targets) //Clear out any connected
var/already_linked = eigen_id[target]
if(!already_linked)
continue
if(length(eigen_targets[already_linked]) > 1) //Eigenstates are notorious for having cliques!
target.visible_message("[target] fizzes, it's already linked to something else!")
targets -= target
continue
target.visible_message("[target] fizzes, collapsing it's unique wavefunction into the others!") //If we're in a eigenlink all on our own and are open to new friends
remove_eigen_entry(target) //clearup for new stuff
//Do we still have targets?
if(!length(targets))
return FALSE
var/atom/visible_atom = targets[1] //The object that'll handle the messages
if(length(targets) == 1)
visible_atom.visible_message("[targets[1]] fizzes, there's nothing it can link to!")
return FALSE
eigen_targets["[id_counter]"] = list() //Add to the master list
for(var/atom/target as anything in targets)
eigen_targets["[id_counter]"] += target
eigen_id[target] = "[id_counter]"
RegisterSignal(target, COMSIG_CLOSET_INSERT, .proc/use_eigenlinked_atom)
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/remove_eigen_entry)
RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), .proc/tool_interact)
target.RegisterSignal(target, COMSIG_EIGENSTATE_ACTIVATE, /obj/structure/closet/proc/bust_open)
var/obj/item = target
if(item)
item.color = COLOR_PERIWINKLEE //Tint the locker slightly.
item.alpha = 200
do_sparks(3, FALSE, item)
visible_atom.visible_message("The items shimmer and fizzle, turning a shade of violet blue.")
id_counter++
return TRUE
///reverts everything back to start
/datum/controller/subsystem/eigenstates/Destroy()
for(var/index in 1 to id_counter)
for(var/entry in eigen_targets["[index]"])
remove_eigen_entry(entry)
eigen_targets = null
eigen_id = null
id_counter = 1
return ..()
///removes an object reference from the master list
/datum/controller/subsystem/eigenstates/proc/remove_eigen_entry(atom/entry)
var/id = eigen_id[entry]
eigen_targets[id] -= entry
eigen_id -= entry
entry.color = COLOR_WHITE
entry.alpha = 255
UnregisterSignal(entry, list(
COMSIG_PARENT_QDELETING,
COMSIG_CLOSET_INSERT,
COMSIG_ATOM_TOOL_ACT(TOOL_WELDER),
))
entry.UnregisterSignal(entry, COMSIG_EIGENSTATE_ACTIVATE) //This is a signal on the object itself so we have to call it from that
///Remove the current entry if we're empty
for(var/targets in eigen_targets)
if(!length(eigen_targets[targets]))
eigen_targets -= targets
///Finds the object within the master list, then sends the thing to the object's location
/datum/controller/subsystem/eigenstates/proc/use_eigenlinked_atom(atom/object_sent_from, atom/movable/thing_to_send)
var/id = eigen_id[object_sent_from]
if(!id)
stack_trace("[object_sent_from] attempted to eigenlink to something that didn't have a valid id!")
return FALSE
var/list/items = eigen_targets[id]
var/index = (items.Find(object_sent_from))+1 //index + 1
if(!index)
stack_trace("[object_sent_from] attempted to eigenlink to something that didn't contain it!")
return FALSE
if(index > length(eigen_targets[id]))//If we're at the end of the list (or we're 1 length long)
index = 1
var/atom/eigen_target = eigen_targets[id][index]
if(!eigen_target)
stack_trace("No eigen target set for the eigenstate component!")
return FALSE
thing_to_send.forceMove(get_turf(eigen_target))
//Create ONE set of sparks for ALL times in iteration
if(spark_time != world.time)
do_sparks(5, FALSE, eigen_target)
do_sparks(5, FALSE, object_sent_from)
spark_time = world.time
//Calls a special proc for the atom if needed (closets use bust_open())
SEND_SIGNAL(eigen_target, COMSIG_EIGENSTATE_ACTIVATE)
return COMPONENT_CLOSET_INSERT_INTERRUPT
///Prevents tool use on the item
/datum/controller/subsystem/eigenstates/proc/tool_interact(atom/source, mob/user, obj/item/item)
to_chat(user, "<span class='notice'>The unstable nature of [source] makes it impossible to use [item] on [source.p_them()]!</span>")
return COMPONENT_BLOCK_TOOL_ATTACK

View File

@@ -1,4 +1,6 @@
#define EXP_ASSIGN_WAYFINDER 1200
#define RANDOM_QUIRK_BONUS 3
#define MINIMUM_RANDOM_QUIRKS 3
//Used to process and handle roundstart quirks
// - Quirk strings are used for faster checking in code
// - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string
@@ -80,3 +82,68 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
for(var/V in cli.prefs.fooddislikes)
H.dna.species.disliked_food |= cli.prefs.fooddislikes[V]
// SKYRAT EDIT ADDITION END
/*
*Randomises the quirks for a specified mob
*/
/datum/controller/subsystem/processing/quirks/proc/randomise_quirks(mob/living/user)
var/bonus_quirks = max((length(user.roundstart_quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS)
var/added_quirk_count = 0 //How many we've added
var/list/quirks_to_add = list() //Quirks we're adding
var/good_count = 0 //Maximum of 6 good perks
var/score //What point score we're at
///Cached list of possible quirks
var/list/possible_quirks = quirks.Copy()
//Create a random list of stuff to start with
while(bonus_quirks > added_quirk_count)
var/quirk = pick(possible_quirks) //quirk is a string
if(quirk in quirk_blacklist) //prevent blacklisted
possible_quirks -= quirk
continue
if(quirk_points[quirk] > 0)
good_count++
score += quirk_points[quirk]
quirks_to_add += quirk
possible_quirks -= quirk
added_quirk_count++
//But lets make sure we're balanced
while(score > 0)
if(!length(possible_quirks))//Lets not get stuck
break
var/quirk = pick(quirks)
if(quirk in quirk_blacklist) //prevent blacklisted
possible_quirks -= quirk
continue
if(!quirk_points[quirk] < 0)//negative only
possible_quirks -= quirk
continue
good_count++
score += quirk_points[quirk]
quirks_to_add += quirk
//And have benefits too
while(score < 0 && good_count <= MAX_QUIRKS)
if(!length(possible_quirks))//Lets not get stuck
break
var/quirk = pick(quirks)
if(quirk in quirk_blacklist) //prevent blacklisted
possible_quirks -= quirk
continue
if(!quirk_points[quirk] > 0) //positive only
possible_quirks -= quirk
continue
good_count++
score += quirk_points[quirk]
quirks_to_add += quirk
for(var/datum/quirk/quirk as anything in user.roundstart_quirks)
if(quirk.name in quirks_to_add) //Don't delete ones we keep
quirks_to_add -= quirk.name //Already there, no need to add.
continue
user.remove_quirk(quirk.type) //these quirks are objects
for(var/datum/quirk/quirk as anything in quirks_to_add)
user.add_quirk(quirks[quirk], spawn_effects = TRUE)//these are typepaths converted from string
#undef RANDOM_QUIRK_BONUS
#undef MINIMUM_RANDOM_QUIRKS

View File

@@ -79,6 +79,23 @@
mood_change = 6
timeout = 3 MINUTES
#define EIGENTRIP_MOOD_RANGE 10
/datum/mood_event/eigentrip
description = "<span class='nicegreen'>I swapped places with an alternate reality version of myself!</span>\n"
mood_change = 0
timeout = 10 MINUTES
/datum/mood_event/eigentrip/add_effects(param)
var/value = rand(-EIGENTRIP_MOOD_RANGE,EIGENTRIP_MOOD_RANGE)
mood_change = value
if(value < 0)
description = "<span class='warning'>I swapped places with an alternate reality version of myself! I want to go home!</span>\n"
else
description = "<span class='nicegreen'>I swapped places with an alternate reality version of myself! Though, this place is much better than my old life.</span>\n"
#undef EIGENTRIP_MOOD_RANGE
/datum/mood_event/nicotine_withdrawal_moderate
description = "<span class='warning'>Haven't had a smoke in a while. Feeling a little on edge... </span>\n"
mood_change = -5

View File

@@ -202,15 +202,7 @@
id = "Exercised"
duration = 1200
alert_type = null
/datum/status_effect/exercised/on_creation(mob/living/new_owner, ...)
. = ..()
STOP_PROCESSING(SSfastprocess, src)
START_PROCESSING(SSprocessing, src) //this lasts 20 minutes, so SSfastprocess isn't needed.
/datum/status_effect/exercised/Destroy()
. = ..()
STOP_PROCESSING(SSprocessing, src)
processing_speed = STATUS_EFFECT_NORMAL_PROCESS
//Hippocratic Oath: Applied when the Rod of Asclepius is activated.
/datum/status_effect/hippocratic_oath

View File

@@ -342,3 +342,201 @@
tick_interval = INFINITY
status_type = STATUS_EFFECT_REFRESH
alert_type = null
#define EIGENSTASIUM_MAX_BUFFER -250
#define EIGENSTASIUM_STABILISATION_RATE 5
#define EIGENSTASIUM_PHASE_1_END 50
#define EIGENSTASIUM_PHASE_2_END 80
#define EIGENSTASIUM_PHASE_3_START 100
#define EIGENSTASIUM_PHASE_3_END 150
/datum/status_effect/eigenstasium
id = "eigenstasium"
status_type = STATUS_EFFECT_UNIQUE
alert_type = null
processing_speed = STATUS_EFFECT_NORMAL_PROCESS
///So we know what cycle we're in during the status
var/current_cycle = EIGENSTASIUM_MAX_BUFFER //Consider it your stability
///The addiction looper for addiction stage 3
var/phase_3_cycle = -0 //start off delayed
///Your clone from another reality
var/mob/living/carbon/alt_clone = null
///If we display the stabilised message or not
var/stable_message = FALSE
/datum/status_effect/eigenstasium/Destroy()
if(alt_clone)
UnregisterSignal(alt_clone, COMSIG_PARENT_QDELETING)
QDEL_NULL(alt_clone)
return ..()
/datum/status_effect/eigenstasium/tick()
. = ..()
//This stuff runs every cycle
if(prob(5))
do_sparks(5, FALSE, owner)
//If we have a reagent that blocks the effects
var/block_effects = FALSE
if(owner.has_reagent(/datum/reagent/bluespace))
current_cycle = max(EIGENSTASIUM_MAX_BUFFER, (current_cycle - (EIGENSTASIUM_STABILISATION_RATE * 1.5))) //cap to -250
block_effects = TRUE
if(owner.has_reagent(/datum/reagent/stabilizing_agent))
current_cycle = max(EIGENSTASIUM_MAX_BUFFER, (current_cycle - EIGENSTASIUM_STABILISATION_RATE))
block_effects = TRUE
var/datum/reagent/eigen = owner.has_reagent(/datum/reagent/eigenstate)
if(eigen)
if(eigen.overdosed)
block_effects = FALSE
else
current_cycle = max(EIGENSTASIUM_MAX_BUFFER, (current_cycle - (EIGENSTASIUM_STABILISATION_RATE * 2)))
block_effects = TRUE
if(!QDELETED(alt_clone)) //catch any stragglers
do_sparks(5, FALSE, alt_clone)
owner.visible_message("[owner] is snapped across to a different alternative reality!")
QDEL_NULL(alt_clone)
if(block_effects)
if(!stable_message)
owner.visible_message("You feel stable...for now.")
stable_message = TRUE
return
stable_message = FALSE
//These run on specific cycles
switch(current_cycle)
if(0)
to_chat(owner, "<span class='userdanger'>You feel like you're being pulled across to somewhere else. You feel empty inside.</span>")
//phase 1
if(1 to EIGENSTASIUM_PHASE_1_END)
owner.Jitter(2)
owner.adjust_nutrition(-4)
//phase 2
if(EIGENSTASIUM_PHASE_1_END to EIGENSTASIUM_PHASE_2_END)
if(current_cycle == 51)
to_chat(owner, "<span class='userdanger'>You start to convlse violently as you feel your consciousness merges across realities, your possessions flying wildy off your body!</span>")
owner.Jitter(200)
owner.Knockdown(10)
var/items = owner.get_contents()
if(!LAZYLEN(items))
return ..()
var/obj/item/item = pick(items)
owner.dropItemToGround(item, TRUE)
do_sparks(5,FALSE,item)
do_teleport(item, get_turf(item), 3, no_effects=TRUE);
do_sparks(5,FALSE,item)
//phase 3 - little break to get your items
if(EIGENSTASIUM_PHASE_3_START to EIGENSTASIUM_PHASE_3_END)
//Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in
switch(phase_3_cycle) //Loops 0 -> 1 -> 2 -> 1 -> 2 -> 1 ...ect.
if(0)
owner.Jitter(100)
to_chat(owner, "<span class='userdanger'>Your eigenstate starts to rip apart, drawing in alternative reality versions of yourself!</span>")
if(1)
var/typepath = owner.type
alt_clone = new typepath(owner.loc)
alt_clone.appearance = owner.appearance
alt_clone.real_name = owner.real_name
RegisterSignal(alt_clone, COMSIG_PARENT_QDELETING, .proc/remove_clone_from_var)
owner.visible_message("[owner] splits into seemingly two versions of themselves!")
do_teleport(alt_clone, get_turf(alt_clone), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one!
do_sparks(5,FALSE,alt_clone)
alt_clone.emote("spin")
owner.emote("spin")
var/static/list/say_phrases = list(
"Bugger me, whats all this then?",
"Sacre bleu! Ou suis-je?!",
"I knew powering the station using a singularity engine would lead to something like this...",
"Wow, I can't believe in your universe Cencomm got rid of cloning.",
"WHAT IS HAPPENING?!",
"YOU'VE CREATED A TIME PARADOX!",
"You trying to steal my job?",
"So that's what I'd look like if I was ugly...",
"So, two alternate universe twins walk into a bar...",
"YOU'VE DOOMED THE TIMELINE!",
"Ruffle a cat once in a while!",
"I'm starting to get why no one wants to hang out with me.",
"Why haven't you gotten around to starting that band?!",
"No!! I was just about to greentext!",
"Kept you waiting huh?",
"Oh god I think I'm ODing I'm seeing a fake version of me.",
"Hey, I remember that phase, glad I grew out of it.",
"Keep going lets see if more of us show up.",
"I bet we can finally take the clown now.",
"LING DISGUISED AS ME!",
"El psy congroo.",
"At long last! My evil twin!",
"Keep going lets see if more of us show up.",
"No! Dark spirits, do not torment me with these visions of my future self! It's horrible!",
"Good. Now that the council is assembled the meeting can begin.",
"Listen! I only have so much time before I'm ripped away. The secret behind the gas giants are...",
"Das ist nicht deutschland. Das ist nicht akzeptabel!!!",
"I've come from the future to warn you about eigenstasium! Oh no! I'm too late!",
"You fool! You took too much eigenstasium! You've doomed us all!",
"Don't trust any bagels you see until next month!",
"What...what's with these teleports? It's like one of my Japanese animes...!",
"Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?",
"Wake the fuck up spaceman we have a gas giant to burn",
"This is one hell of a beepsky smash.",
"Now neither of us will be virgins!")
alt_clone.say(pick(say_phrases))
if(2)
phase_3_cycle = 0 //counter
phase_3_cycle++
do_teleport(owner, get_turf(owner), 2, no_effects=TRUE) //Teleports player randomly
do_sparks(5, FALSE, owner)
//phase 4
if(EIGENSTASIUM_PHASE_3_END to INFINITY)
//clean up and remove status
SSblackbox.record_feedback("tally", "chemical_reaction", 1, "Eigenstasium wild rides ridden")
do_sparks(5, FALSE, owner)
do_teleport(owner, get_turf(owner), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one!
do_sparks(5, FALSE, owner)
owner.Sleeping(100)
owner.Jitter(50)
to_chat(owner, "<span class='userdanger'>You feel your eigenstate settle, as \"you\" become an alternative version of yourself!</span>")
owner.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE)
log_game("FERMICHEM: [owner] ckey: [owner.key] has become an alternative universe version of themselves.")
//new you new stuff
SSquirks.randomise_quirks(owner)
owner.reagents.remove_all(1000)
var/datum/component/mood/mood = owner.GetComponent(/datum/component/mood)
mood.remove_temp_moods() //New you, new moods.
var/mob/living/carbon/human/human_mob = owner
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "Eigentrip", /datum/mood_event/eigentrip)
if(QDELETED(human_mob))
return
if(prob(1))//low chance of the alternative reality returning to monkey
var/obj/item/organ/tail/monkey/monkey_tail = new ()
monkey_tail.Insert(human_mob, drop_if_replaced = FALSE)
var/datum/species/human_species = human_mob.dna?.species
if(human_species)
human_species.randomize_main_appearance_element(human_mob)
human_species.randomize_active_underwear(human_mob)
owner.remove_status_effect(STATUS_EFFECT_EIGEN)
//Finally increment cycle
current_cycle++
/datum/status_effect/eigenstasium/proc/remove_clone_from_var()
UnregisterSignal(alt_clone, COMSIG_PARENT_QDELETING)
/datum/status_effect/eigenstasium/on_remove()
if(!QDELETED(alt_clone))//catch any stragilers
do_sparks(5, FALSE, alt_clone)
owner.visible_message("One of the [owner]s suddenly phases out of reality in front of you!")
QDEL_NULL(alt_clone)
return ..()
#undef EIGENSTASIUM_MAX_BUFFER
#undef EIGENSTASIUM_STABILISATION_RATE
#undef EIGENSTASIUM_PHASE_1_END
#undef EIGENSTASIUM_PHASE_2_END
#undef EIGENSTASIUM_PHASE_3_START
#undef EIGENSTASIUM_PHASE_3_END

View File

@@ -12,6 +12,8 @@
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
var/alert_type = /atom/movable/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
var/atom/movable/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
///Processing speed - used to define if the status effect should be using SSfastprocess or SSprocessing
var/processing_speed = STATUS_EFFECT_FAST_PROCESS
/datum/status_effect/New(list/arguments)
on_creation(arglist(arguments))
@@ -32,11 +34,19 @@
A.attached_effect = src //so the alert can reference us, if it needs to
linked_alert = A //so we can reference the alert, if we need to
if(duration > 0 || initial(tick_interval) > 0) //don't process if we don't care
START_PROCESSING(SSfastprocess, src)
switch(processing_speed)
if(STATUS_EFFECT_FAST_PROCESS)
START_PROCESSING(SSfastprocess, src)
if (STATUS_EFFECT_NORMAL_PROCESS)
START_PROCESSING(SSprocessing, src)
return TRUE
/datum/status_effect/Destroy()
STOP_PROCESSING(SSfastprocess, src)
switch(processing_speed)
if(STATUS_EFFECT_FAST_PROCESS)
STOP_PROCESSING(SSfastprocess, src)
if (STATUS_EFFECT_NORMAL_PROCESS)
STOP_PROCESSING(SSprocessing, src)
if(owner)
linked_alert = null
owner.clear_alert(id)

View File

@@ -468,6 +468,9 @@ GENE SCANNER
else
render_list += "<span class='notice ml-1'>Subject is not addicted to any types of drug.</span>\n"
if(M.has_status_effect(/datum/status_effect/eigenstasium))
render_list += "<span class='notice ml-1'>Subject is temporally unstable. Stabilising agent is recommended to reduce disturbances.</span>\n"
to_chat(user, jointext(render_list, ""), trailing_newline = FALSE) // we handled the last <br> so we don't need handholding
/obj/item/healthanalyzer/verb/toggle_mode()

View File

@@ -1,3 +1,5 @@
#define LOCKER_FULL -1
/obj/structure/closet//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE
name = "closet"
desc = "It's a basic storage unit."
@@ -40,7 +42,6 @@
/// Whether a skittish person can dive inside this closet. Disable if opening the closet causes "bad things" to happen or that it leads to a logical inconsistency.
var/divable = TRUE
/obj/structure/closet/Initialize(mapload)
if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
addtimer(CALLBACK(src, .proc/take_contents), 0)
@@ -146,7 +147,7 @@
/obj/structure/closet/proc/take_contents()
var/atom/L = drop_location()
for(var/atom/movable/AM in L)
if(AM != src && insert(AM) == -1) // limit reached
if(AM != src && insert(AM) == LOCKER_FULL) // limit reached
break
for(var/i in reverseRange(L.GetAllContents()))
var/atom/movable/thing = i
@@ -172,14 +173,15 @@
/obj/structure/closet/proc/after_open(mob/living/user, force = FALSE)
return
/obj/structure/closet/proc/insert(atom/movable/AM)
if(contents.len >= storage_capacity)
return -1
if(insertion_allowed(AM))
AM.forceMove(src)
return TRUE
else
/obj/structure/closet/proc/insert(atom/movable/inserted)
if(length(contents) >= storage_capacity)
return LOCKER_FULL
if(!insertion_allowed(inserted))
return FALSE
if(SEND_SIGNAL(src, COMSIG_CLOSET_INSERT, inserted) & COMPONENT_CLOSET_INSERT_INTERRUPT)
return TRUE
inserted.forceMove(src)
return TRUE
/obj/structure/closet/proc/insertion_allowed(atom/movable/AM)
if(ismob(AM))
@@ -440,6 +442,7 @@
to_chat(user, "<span class='warning'>You fail to break out of [src]!</span>")
/obj/structure/closet/proc/bust_open()
SIGNAL_HANDLER
welded = FALSE //applies to all lockers
locked = FALSE //applies to critter crates and secure lockers only
broken = TRUE //applies to secure lockers only
@@ -517,6 +520,7 @@
/obj/structure/closet/AllowDrop()
return TRUE
/obj/structure/closet/return_temperature()
return
#undef LOCKER_FULL

View File

@@ -24,7 +24,7 @@
mob_react = FALSE
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/tofu/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/tofu/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/tofu(location)
@@ -42,7 +42,7 @@
required_reagents = list(/datum/reagent/consumable/soymilk = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/sugar = 2)
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/chocolate_bar/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/chocolate_bar/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/chocolatebar(location)
@@ -53,7 +53,7 @@
mob_react = FALSE
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/chocolate_bar2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/chocolate_bar2/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/chocolatebar(location)
@@ -63,7 +63,7 @@
required_reagents = list(/datum/reagent/consumable/milk = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/sugar = 2)
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/chocolate_bar3/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/chocolate_bar3/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/chocolatebar(location)
@@ -89,7 +89,8 @@
results = list(/datum/reagent/carbon = 1)
required_reagents = list(/datum/reagent/consumable/caramel = 1)
required_temp = 483.15
optimal_temp = 600
optimal_temp = 1000
rate_up_lim = 10
mob_react = FALSE
/datum/chemical_reaction/food/cheesewheel
@@ -97,7 +98,7 @@
required_catalysts = list(/datum/reagent/consumable/enzyme = 5)
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/cheesewheel/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/cheesewheel/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/cheese/wheel(location)
@@ -107,7 +108,7 @@
mob_react = FALSE
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/synthmeat/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/synthmeat/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/meat/slab/synthmeat(location)
@@ -126,7 +127,7 @@
mix_message = "The mixture becomes similar to carp meat."
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/imitationcarpmeat/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/imitationcarpmeat/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/food/fishmeat/carp/imitation(location)
if(holder?.my_atom)
@@ -137,7 +138,7 @@
mix_message = "The ingredients form a dough."
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/dough/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/dough/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/dough(location)
@@ -147,7 +148,7 @@
mix_message = "The ingredients form a cake batter."
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/cakebatter/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/cakebatter/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/cakebatter(location)
@@ -165,7 +166,7 @@
mix_message = "The rice absorbs the water."
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/food/ricebowl/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/food/ricebowl/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/food/salad/ricebowl(location)
if(holder?.my_atom)

View File

@@ -979,6 +979,27 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(BODY_FRONT_LAYER)
return "FRONT"
///Proc that will randomise the hair, or primary appearance element (i.e. for moths wings) of a species' associated mob
/datum/species/proc/randomize_main_appearance_element(mob/living/carbon/human/human_mob)
//SKYRAT EDIT ADDITION BEGIN
for(var/key in mutant_bodyparts) //Randomize currently attached mutant bodyparts, organs should update when they need to (detachment)
var/datum/sprite_accessory/SP = random_accessory_of_key_for_species(key, src)
var/list/color_list = SP.get_default_color(human_mob.dna.features, src)
var/list/final_list = list()
final_list[MUTANT_INDEX_NAME] = SP.name
final_list[MUTANT_INDEX_COLOR_LIST] = color_list
mutant_bodyparts[key] = final_list
human_mob.update_mutant_bodyparts()
//SKYRAT EDIT ADDITION END
human_mob.hairstyle = random_hairstyle(human_mob.gender)
human_mob.update_hair()
///Proc that will randomise the underwear (i.e. top, pants and socks) of a species' associated mob
/datum/species/proc/randomize_active_underwear(mob/living/carbon/human/human_mob)
human_mob.undershirt = random_undershirt(human_mob.gender)
human_mob.underwear = random_underwear(human_mob.gender)
human_mob.socks = random_socks(human_mob.gender)
human_mob.update_body()
/datum/species/proc/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(HAS_TRAIT(H, TRAIT_NOBREATH))

View File

@@ -106,6 +106,16 @@
*/
//SKYRAT EDIT REMOVAL END
//SKYRAT EDIT REMOVAL BEGIN
/*
/datum/species/lizard/randomize_main_appearance_element(mob/living/carbon/human/human_mob)
var/tail = pick(GLOB.tails_list_lizard)
human_mob.dna.features["tail_lizard"] = tail
mutant_bodyparts["tail_lizard"] = tail
human_mob.update_body()
*/
//SKYRAT EDIT REMOVAL END
/*
Lizard subspecies: ASHWALKERS
*/

View File

@@ -79,6 +79,17 @@
if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible
return TRUE
//SKYRAT EDIT REMOVAL BEGIN
/*
/datum/species/moth/randomize_main_appearance_element(mob/living/carbon/human/human_mob)
var/wings = pick(GLOB.moth_wings_list)
mutant_bodyparts["wings"] = wings
mutant_bodyparts["moth_wings"] = wings
human_mob.dna.features["wings"] = wings
human_mob.dna.features["moth_wings"] = wings
human_mob.update_body()
*/
//SKYRAT EDIT REMOVAL END
/datum/species/moth/spec_fully_heal(mob/living/carbon/human/H)
. = ..()

View File

@@ -376,18 +376,21 @@ All the important duct code:
duct_color = new_color
add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY)
/obj/item/stack/ducts/afterattack(atom/A, user, proximity)
/obj/item/stack/ducts/afterattack(atom/target, user, proximity)
. = ..()
if(!proximity)
return
if(istype(A, /obj/machinery/duct))
var/obj/machinery/duct/D = A
if(istype(target, /obj/machinery/duct))
var/obj/machinery/duct/D = target
if(!D.anchored)
add(1)
qdel(D)
if(istype(A, /turf/open) && use(1))
var/turf/open/OT = A
new /obj/machinery/duct(OT, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer])
check_attach_turf(target)
/obj/item/stack/ducts/proc/check_attach_turf(atom/target)
if(istype(target, /turf/open) && use(1))
var/turf/open/open_turf = target
new /obj/machinery/duct(open_turf, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer])
playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE)
/obj/item/stack/ducts/fifty

View File

@@ -204,17 +204,18 @@
* Checks overheated() and overly_impure() of a reaction
* This was moved from the start, to the end - after a reaction, so post reaction temperature changes aren't ignored.
* overheated() is first - so double explosions can't happen (i.e. explosions that blow up the holder)
* step_volume_added is how much product (across all products) was added for this single step
*/
/datum/equilibrium/proc/check_fail_states(vol_added)
/datum/equilibrium/proc/check_fail_states(step_volume_added)
//Are we overheated?
if(reaction.is_cold_recipe)
if(holder.chem_temp < reaction.overheat_temp && reaction.overheat_temp != NO_OVERHEAT) //This is before the process - this is here so that overly_impure and overheated() share the same code location (and therefore vars) for calls.
SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overheated reaction steps")
reaction.overheated(holder, src, vol_added)
reaction.overheated(holder, src, step_volume_added)
else
if(holder.chem_temp > reaction.overheat_temp)
SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overheated reaction steps")
reaction.overheated(holder, src, vol_added)
reaction.overheated(holder, src, step_volume_added)
//is our product too impure?
for(var/product in reaction.results)
@@ -223,7 +224,7 @@
continue
if (reagent.purity < reaction.purity_min)//If purity is below the min, call the proc
SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overly impure reaction steps")
reaction.overly_impure(holder, src, vol_added)
reaction.overly_impure(holder, src, step_volume_added)
//did we explode?
if(!holder.my_atom || holder.reagent_list.len == 0)
@@ -302,7 +303,7 @@
return
//Call any special reaction steps BEFORE addition
if(reaction.reaction_step(src, holder, delta_t, delta_ph, step_target_vol) == END_REACTION)
if(reaction.reaction_step(holder, src, delta_t, delta_ph, step_target_vol) == END_REACTION)
to_delete = TRUE
return

View File

@@ -935,7 +935,7 @@
qdel(equilibrium)
else
//Adding is done in new(), deletion is in qdel
equilibrium.reaction.on_reaction(equilibrium, src, equilibrium.multiplier)
equilibrium.reaction.on_reaction(src, equilibrium, equilibrium.multiplier)
equilibrium.react_timestep(1)//Get an initial step going so there's not a delay between setup and start - DO NOT ADD THIS TO equilibrium.NEW()
if(LAZYLEN(reaction_list))
@@ -997,6 +997,7 @@
* * mix_message - the associated mix message of a reaction
*/
/datum/reagents/proc/end_reaction(datum/equilibrium/equilibrium)
equilibrium.reaction.reaction_finish(src, equilibrium, equilibrium.reacted_vol)
if(!equilibrium.holder || !equilibrium.reaction) //Somehow I'm getting empty equilibrium. This is here to handle them
LAZYREMOVE(reaction_list, equilibrium)
qdel(equilibrium)
@@ -1005,7 +1006,7 @@
if(equilibrium.holder != src) //When called from Destroy() eqs are nulled in smoke. This is very strange. This is probably causing it to spam smoke because of the runtime interupting the removal.
stack_trace("The equilibrium datum currently processing in this reagents datum had a desynced holder to the ending reaction. src holder:[my_atom] | equilibrium holder:[equilibrium.holder.my_atom] || src type:[my_atom.type] | equilibrium holder:[equilibrium.holder.my_atom.type]")
LAZYREMOVE(reaction_list, equilibrium)
equilibrium.reaction.reaction_finish(src, equilibrium.reacted_vol)
var/reaction_message = equilibrium.reaction.mix_message
if(equilibrium.reaction.mix_sound)
playsound(get_turf(my_atom), equilibrium.reaction.mix_sound, 80, TRUE)
@@ -1163,7 +1164,7 @@
extract.name = "used slime extract"
extract.desc = "This extract has been used up."
selected_reaction.on_reaction(null, src, multiplier)
selected_reaction.on_reaction(src, null, multiplier)
///Possibly remove - see if multiple instant reactions is okay (Though, this "sorts" reactions by temp decending)
///Presently unused

View File

@@ -54,6 +54,28 @@
color = "#270d03"
glass_price = DRINK_PRICE_HIGH
// Unique
/datum/reagent/impurity/eigenswap
name = "Eigenswap"
description = "This reagent is known to swap the handedness of a patient."
ph = 3.3
chemical_flags = REAGENT_DONOTSPLIT
/datum/reagent/impurity/eigenswap/on_mob_life(mob/living/carbon/carbon_mob)
. = ..()
if(!prob(creation_purity * 100))
return
var/list/cached_hand_items = carbon_mob.held_items
var/index = 1
for(var/thing in cached_hand_items)
index++
if(index > length(cached_hand_items))//If we're past the end of the list, go back to start
index = 1
if(!thing)
continue
carbon_mob.put_in_hand(thing, index, forced = TRUE, ignore_anim = TRUE)
playsound(carbon_mob, 'sound/effects/phasein.ogg', 20, TRUE)
/*
* Freezes the player in a block of ice, 1s = 1u
* Will be removed when the required reagent is removed too

View File

@@ -0,0 +1,107 @@
/*eigenstate themed Chem
*Teleports you to the creation location on consumption and back when the reagent is removed from you
*OD teleports you randomly around the Station and gives you a status effect
*The status effect slowly send you on a wild ride and replaces you with an alternative reality version of yourself unless you consume eigenstasium/bluespace dust/stabilising agent.
*During the process you get really hungry,
*Then some of your items slowly start teleport around you,
*then alternative versions of yourself are brought in from a different universe and they yell at you.
*and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative
*Spraying this on lockers allows you to create eigenlinked lockers - see the eigenstate subsystem for using this to create your own links
*/
/datum/reagent/eigenstate
name = "Eigenstasium"
description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient"
taste_description = "wiggly cosmic dust."
color = "#5020F4"
overdose_threshold = 15
metabolization_rate = 1 * REAGENTS_METABOLISM
ph = 3.7
purity = 0.5
creation_purity = 0.5
impure_chem = /datum/reagent/impurity/eigenswap
inverse_chem = null
inverse_chem_val = 0
failed_chem = /datum/reagent/bluespace //crashes out
chemical_flags = REAGENT_DEAD_PROCESS //So if you die with it in your body, you still get teleported back to the location as a corpse
data = list("location_created" = null)//So we retain the target location and creator between reagent instances
///The creation point assigned during the reaction
var/turf/location_created
///The return point indicator
var/obj/effect/overlay/holo_pad_hologram/eigenstate
///The point you're returning to after the reagent is removed
var/turf/open/location_return = null
/datum/reagent/eigenstate/on_new(list/data)
location_created = data["location_created"]
/datum/reagent/eigenstate/expose_mob(mob/living/living_mob, methods, reac_volume, show_message, touch_protection)
. = ..()
if(!(methods & INGEST))
return
if(creation_purity > 0.9 && location_created) //Teleports you home if it's pure enough
do_sparks(5,FALSE,living_mob)
do_teleport(living_mob, location_created, 0, asoundin = 'sound/effects/phasein.ogg')
do_sparks(5,FALSE,living_mob)
//Main functions
/datum/reagent/eigenstate/on_mob_add(mob/living/living_mob, amount)
//make hologram at return point
eigenstate = new (living_mob.loc)
eigenstate.appearance = living_mob.appearance
eigenstate.alpha = 170
eigenstate.add_atom_colour(LIGHT_COLOR_LIGHT_CYAN, FIXED_COLOUR_PRIORITY)
eigenstate.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it.
eigenstate.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
eigenstate.anchored = 1//So space wind cannot drag it.
eigenstate.name = "[living_mob.name]'s eigenstate"//If someone decides to right click.
eigenstate.set_light(2) //hologram lighting
location_return = get_turf(living_mob) //sets up return point
to_chat(living_mob, "<span class='userdanger'>You feel like part of yourself has split off!</span>")
return ..()
/datum/reagent/eigenstate/on_mob_life(mob/living/carbon/living_mob)
if(prob(20))
do_sparks(5,FALSE,living_mob)
return ..()
/datum/reagent/eigenstate/on_mob_delete(mob/living/living_mob) //returns back to original location
do_sparks(5,FALSE,living_mob)
to_chat(living_mob, "<span class='userdanger'>You feel strangely whole again.</span>")
if(!living_mob.reagents.has_reagent(/datum/reagent/stabilizing_agent))
do_teleport(living_mob, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
do_sparks(5,FALSE,living_mob)
qdel(eigenstate)
return ..()
/datum/reagent/eigenstate/overdose_start(mob/living/living_mob) //Overdose, makes you teleport randomly
to_chat(living_mob, "<span class='userdanger'>You feel like your perspective is being ripped apart as you begin flitting in and out of reality!</span>")
living_mob.Jitter(20)
metabolization_rate += 0.5 //So you're not stuck forever teleporting.
if(iscarbon(living_mob))
var/mob/living/carbon/carbon_mob = living_mob
carbon_mob.apply_status_effect(STATUS_EFFECT_EIGEN)
return ..()
/datum/reagent/eigenstate/overdose_process(mob/living/living_mob) //Overdose, makes you teleport randomly
do_sparks(5, FALSE, living_mob)
do_teleport(living_mob, get_turf(living_mob), 10, asoundin = 'sound/effects/phasein.ogg')
do_sparks(5, FALSE, living_mob)
return ..()
//FOR ADDICTION-LIKE EFFECTS, SEE datum/status_effect/eigenstasium
///Lets you link lockers together
/datum/reagent/eigenstate/expose_turf(turf/exposed_turf, reac_volume)
. = ..()
if(creation_purity < 0.8)
return
var/list/lockers = list()
for(var/obj/structure/closet/closet in exposed_turf.contents)
lockers += closet
if(!length(lockers))
return
SSeigenstates.create_new_link(lockers)

View File

@@ -88,7 +88,7 @@
* * holder - the datum that holds this reagent, be it a beaker or anything else
* * created_volume - volume created when this is mixed. look at 'var/list/results'.
*/
/datum/chemical_reaction/proc/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
return
//I recommend you set the result amount to the total volume of all components.
@@ -107,7 +107,7 @@
* Outputs:
* * returning END_REACTION will end the associated reaction - flagging it for deletion and preventing any reaction in that timestep from happening. Make sure to set the vars in the holder to one that can't start it from starting up again.
*/
/datum/chemical_reaction/proc/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/proc/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
return
/**
@@ -124,7 +124,7 @@
* * holder - the datum that holds this reagent, be it a beaker or anything else
* * react_volume - volume created across the whole reaction
*/
/datum/chemical_reaction/proc/reaction_finish(datum/reagents/holder, react_vol)
/datum/chemical_reaction/proc/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol)
//failed_chem handler
var/cached_temp = holder.chem_temp
for(var/id in results)
@@ -143,9 +143,7 @@
* * reagent - the target reagent to convert
*/
/datum/chemical_reaction/proc/convert_into_failed(datum/reagent/reagent, datum/reagents/holder)
if(!reagent.failed_chem)
return
if(reagent.purity < purity_min)
if(reagent.purity < purity_min && reagent.failed_chem)
var/cached_volume = reagent.volume
holder.remove_reagent(reagent.type, cached_volume, FALSE)
holder.add_reagent(reagent.failed_chem, cached_volume, FALSE, added_purity = 1)
@@ -190,8 +188,9 @@
* Arguments:
* * holder - the datum that holds this reagent, be it a beaker or anything else
* * equilibrium - the equilibrium datum that contains the equilibrium reaction properties and methods
* * step_volume_added - how much product (across all products) was added for this single step
*/
/datum/chemical_reaction/proc/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/proc/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
for(var/id in results)
var/datum/reagent/reagent = holder.get_reagent(id)
if(!reagent)
@@ -208,8 +207,9 @@
* Arguments:
* * holder - the datum that holds this reagent, be it a beaker or anything else
* * equilibrium - the equilibrium datum that contains the equilibrium reaction properties and methods
* * step_volume_added - how much product (across all products) was added for this single step
*/
/datum/chemical_reaction/proc/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/proc/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
var/affected_list = results + required_reagents
for(var/_reagent in affected_list)
var/datum/reagent/reagent = holder.get_reagent(_reagent)
@@ -511,7 +511,7 @@
* * initial_delay - The number of seconds of delay to add on creation
*/
/datum/chemical_reaction/proc/off_cooldown(datum/reagents/holder, datum/equilibrium/equilibrium, seconds = 1, id = "default", initial_delay = 0)
id = id+"_cooldown"
id = "[id]_cooldown"
if(isnull(equilibrium.data[id]))
equilibrium.data[id] = 0
if(initial_delay)

View File

@@ -22,7 +22,7 @@
reaction_flags = REACTION_PH_VOL_CONSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE
/datum/chemical_reaction/medicine/helbital/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/helbital/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
explode_fire_vortex(holder, equilibrium, 1, 1, "impure")
holder.chem_temp += 2.5
var/datum/reagent/helbital = holder.get_reagent(/datum/reagent/medicine/c2/helbital)
@@ -35,11 +35,11 @@
holder.chem_temp += 5
holder.my_atom.audible_message("<span class='notice'>[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The impurity of the reacting helbital is too great causing [holder.my_atom] to let out a hearty burst of flame, evaporating part of the product!</span>")
/datum/chemical_reaction/medicine/helbital/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/helbital/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()//drains product
explode_fire_vortex(holder, equilibrium, 2, 2, "overheat", TRUE)
/datum/chemical_reaction/medicine/helbital/reaction_finish(datum/reagents/holder, react_vol)
/datum/chemical_reaction/medicine/helbital/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol)
. = ..()
var/datum/reagent/helbital = holder.get_reagent(/datum/reagent/medicine/c2/helbital)
if(!helbital)
@@ -125,7 +125,7 @@
reaction_flags = REACTION_PH_VOL_CONSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN
/datum/chemical_reaction/medicine/aiuri/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/aiuri/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
for(var/mob/living/living_mob in orange(3, get_turf(holder.my_atom)))
if(living_mob.flash_act(1, length = 5))
@@ -151,7 +151,7 @@
reaction_flags = REACTION_PH_VOL_CONSTANT | REACTION_CLEAR_INVERSE
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN
/datum/chemical_reaction/medicine/hercuri/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/hercuri/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
if(off_cooldown(holder, equilibrium, 2, "hercuri_freeze"))
return
playsound(holder.my_atom, 'sound/magic/ethereal_exit.ogg', 50, 1)
@@ -182,7 +182,7 @@
reaction_flags = REACTION_PH_VOL_CONSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OXY
/datum/chemical_reaction/medicine/convermol/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/medicine/convermol/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
. = ..()
var/datum/reagent/oxy = holder.has_reagent(/datum/reagent/oxygen)
if(oxy)
@@ -197,10 +197,10 @@
else
explode_shockwave(holder, equilibrium, range, damage = 2)
/datum/chemical_reaction/medicine/convermol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/convermol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
overheated(holder, equilibrium, impure = TRUE)
clear_reactants(holder, vol_added*2)
clear_reactants(holder, step_volume_added*2)
/datum/chemical_reaction/medicine/tirimol
@@ -223,7 +223,7 @@
reaction_flags = REACTION_PH_VOL_CONSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OXY
/datum/chemical_reaction/medicine/tirimol/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/medicine/tirimol/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
. = ..()
var/datum/reagent/oxy = holder.has_reagent(/datum/reagent/oxygen)
if(oxy)
@@ -241,7 +241,7 @@
else
explode_invert_smoke(holder, equilibrium, 3)
/datum/chemical_reaction/medicine/tirimol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/tirimol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
overheated(holder, equilibrium, TRUE)
clear_reactants(holder, 2)
@@ -269,10 +269,10 @@
reaction_flags = REACTION_PH_VOL_CONSTANT | REACTION_CLEAR_INVERSE
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_TOXIN
/datum/chemical_reaction/medicine/seiver/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/seiver/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
if(off_cooldown(holder, equilibrium, 1, "seiver_rads"))
return
var/modifier = max((100 - holder.chem_temp)*0.025, 0)*vol_added //0 - 5 * volume based off temperature(colder is more)
var/modifier = max((100 - holder.chem_temp)*0.025, 0)*step_volume_added //0 - 5 * volume based off temperature(colder is more)
radiation_pulse(holder.my_atom, modifier, 0.5, can_contaminate=FALSE) //Please advise on this, I don't have a good handle on the numbers
/datum/chemical_reaction/medicine/multiver
@@ -295,7 +295,7 @@
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_PLANT | REACTION_TAG_TOXIN
//You get nothing! I'm serious about staying under the heating requirements!
/datum/chemical_reaction/medicine/multiver/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/multiver/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
var/datum/reagent/monover = holder.has_reagent(/datum/reagent/inverse/healing/monover)
if(monover)
@@ -304,7 +304,7 @@
explode_fire_square(holder, equilibrium, 1)
holder.my_atom.fire_act(holder.chem_temp, monover.volume)//I'm kinda banking on this setting the thing on fire. If you see this, then it didn't!
/datum/chemical_reaction/medicine/multiver/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/medicine/multiver/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
. = ..()
if(delta_ph < 0.35)
//normalise delta_ph
@@ -331,7 +331,7 @@
reaction_flags = REACTION_PH_VOL_CONSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_TOXIN
/datum/chemical_reaction/medicine/syriniver/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/medicine/syriniver/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
. = ..()
reaction.delta_t = delta_t * delta_ph
@@ -354,7 +354,7 @@
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_TOXIN
//overheat beats like a heart! (or is it overbeat?)
/datum/chemical_reaction/medicine/penthrite/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/penthrite/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
if(off_cooldown(holder, equilibrium, 1, "lub"))
explode_shockwave(holder, equilibrium, 3, 2)
@@ -365,5 +365,5 @@
explode_fire_vortex(holder, equilibrium, 1, 1)
//enabling hardmode
/datum/chemical_reaction/medicine/penthrite/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medicine/penthrite/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
holder.chem_temp += 15

View File

@@ -20,8 +20,8 @@
rate_up_lim = 1
purity_min = 0
/datum/chemical_reaction/medical_speed_catalyst/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medical_speed_catalyst/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
explode_invert_smoke(holder, equilibrium) //Will be better when the inputs have proper invert chems
/datum/chemical_reaction/medical_speed_catalyst/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/medical_speed_catalyst/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
explode_invert_smoke(holder, equilibrium)

View File

@@ -36,22 +36,22 @@
reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DRUG | REACTION_TAG_DANGEROUS
//The less pure it is, the faster it heats up. tg please don't hate me for making your meth even more dangerous
/datum/chemical_reaction/methamphetamine/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/methamphetamine/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
var/datum/reagent/meth = holder.get_reagent(/datum/reagent/drug/methamphetamine)
if(!meth)//First step
reaction.thermic_mod = (1-delta_ph)*5
return
reaction.thermic_mod = (1-meth.purity)*5
/datum/chemical_reaction/methamphetamine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/methamphetamine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
temp_meth_explosion(holder, equilibrium.reacted_vol)
/datum/chemical_reaction/methamphetamine/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/methamphetamine/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
temp_meth_explosion(holder, equilibrium.reacted_vol)
/datum/chemical_reaction/methamphetamine/reaction_finish(datum/reagents/holder, react_vol)
/datum/chemical_reaction/methamphetamine/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol)
var/datum/reagent/meth = holder.get_reagent(/datum/reagent/drug/methamphetamine)
if(!meth)//Other procs before this can already blow us up
return ..()

View File

@@ -219,7 +219,7 @@
required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 20, /datum/reagent/medicine/polypyr = 15) //This might be a bit much, reagent cost should be reviewed after implementation.
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE
/datum/chemical_reaction/medicine/medsuture/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/medicine/medsuture/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/medical/suture/medicated(location)
@@ -228,7 +228,7 @@
required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10)
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN
/datum/chemical_reaction/medicine/medmesh/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/medicine/medmesh/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/medical/mesh/advanced(location)
@@ -237,7 +237,7 @@
required_reagents = list(/datum/reagent/toxin/bungotoxin = 20, /datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20)
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN
/datum/chemical_reaction/medicine/poultice/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/medicine/poultice/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i in 1 to created_volume)
new /obj/item/stack/medical/poultice(location)

View File

@@ -51,7 +51,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/plasma_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/plasma_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/sheet/mineral/plasma(location)
@@ -62,7 +62,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/gold_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/gold_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/sheet/mineral/gold(location)
@@ -73,7 +73,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/uranium_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/uranium_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/sheet/mineral/uranium(location)
@@ -90,7 +90,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/soapification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/soap/homemade(location)
@@ -104,7 +104,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/omegasoapification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/omegasoapification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/soap/omega(location)
@@ -116,7 +116,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/candlefication/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/candle(location)
@@ -127,7 +127,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/meatification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/food/meat/slab/meatproduct(location)
@@ -151,7 +151,7 @@
rate_up_lim = 25 //Give a chance to pull back
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL
/datum/chemical_reaction/nitrous_oxide/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/nitrous_oxide/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
var/turf/exposed_turf = get_turf(holder.my_atom)
if(!exposed_turf)
@@ -159,7 +159,7 @@
exposed_turf.atmos_spawn_air("n2o=[equilibrium.step_target_vol/2];TEMP=[holder.chem_temp]")
clear_products(holder, equilibrium.step_target_vol)
/datum/chemical_reaction/nitrous_oxide/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/nitrous_oxide/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
return //This is empty because the explosion reaction will occur instead (see pyrotechnics.dm). This is just here to update the lookup ui.
@@ -224,7 +224,7 @@
var/level_max = 2
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/mix_virus/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B?.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
@@ -291,7 +291,7 @@
required_reagents = list(/datum/reagent/medicine/synaptizine = 1)
required_catalysts = list(/datum/reagent/blood = 1)
/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B?.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
@@ -302,7 +302,7 @@
required_reagents = list(/datum/reagent/toxin/formaldehyde = 1)
required_catalysts = list(/datum/reagent/blood = 1)
/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B?.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
@@ -325,7 +325,7 @@
mob_react = FALSE
reaction_flags = REACTION_INSTANT
/datum/chemical_reaction/foam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.create_foam(/datum/effect_system/foam_spread,2*created_volume,notification="<span class='danger'>The solution spews out foam!</span>")
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
@@ -335,7 +335,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/metalfoam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,1,"<span class='danger'>The solution spews out a metallic foam!</span>")
/datum/chemical_reaction/smart_foam
@@ -344,7 +344,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/smart_foam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/smart_foam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.create_foam(/datum/effect_system/foam_spread/metal/smart,5*created_volume,1,"<span class='danger'>The solution spews out metallic foam!</span>")
/datum/chemical_reaction/ironfoam
@@ -353,7 +353,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/ironfoam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,2,"<span class='danger'>The solution spews out a metallic foam!</span>")
/datum/chemical_reaction/foaming_agent
@@ -488,7 +488,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/life/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN
/datum/chemical_reaction/life_friendly
@@ -497,7 +497,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/life_friendly/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN)
/datum/chemical_reaction/corgium
@@ -506,7 +506,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/corgium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = rand(1, created_volume), i <= created_volume, i++) // More lulz.
new /mob/living/simple_animal/pet/dog/corgi(location)
@@ -523,7 +523,7 @@
required_reagents = list(/datum/reagent/monkey_powder = 50, /datum/reagent/water = 1)
mix_message = "<span class='danger'>Expands into a brown mass before shaping itself into a monkey!.</span>"
/datum/chemical_reaction/monkey/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/monkey/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/mob/living/carbon/M = holder.my_atom
var/location = get_turf(M)
if(istype(M, /mob/living/carbon))
@@ -545,7 +545,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/butterflium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = rand(1, created_volume), i <= created_volume, i++)
new /mob/living/simple_animal/butterfly(location)
@@ -557,7 +557,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/scream/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/scream/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
playsound(holder.my_atom, pick(list( 'sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg', 'sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg', 'sound/voice/human/wilhelm_scream.ogg')), created_volume*5,TRUE)
/datum/chemical_reaction/hair_dye
@@ -613,7 +613,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL
/datum/chemical_reaction/plastic_polymers/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i in 1 to created_volume)
new /obj/item/stack/sheet/plastic(location)
@@ -643,7 +643,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME
/datum/chemical_reaction/slime_extractification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/slime_extract/grey(location)
@@ -653,7 +653,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen)
for(var/datum/reagent/R in holder.reagent_list)
if(R.material && R.volume >= 40)
@@ -710,12 +710,12 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL
/datum/chemical_reaction/silver_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/silver_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i in 1 to created_volume)
new /obj/item/stack/sheet/mineral/silver(location)
//////////////////////////////////// Water ////////////////////////////////////////////////
////Ice and water
/datum/chemical_reaction/ice
results = list(/datum/reagent/consumable/ice = 1.09)//density
@@ -732,6 +732,7 @@
purity_min = 0
mix_message = "The solution freezes up into ice!"
reaction_flags = REACTION_COMPETITIVE
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DRINK
/datum/chemical_reaction/water
results = list(/datum/reagent/water = 0.92)//rough density excahnge
@@ -746,6 +747,7 @@
rate_up_lim = 50
purity_min = 0
mix_message = "The ice melts back into water!"
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DRINK
////////////////////////////////////
@@ -762,4 +764,83 @@
rate_up_lim = 50
purity_min = 0
mix_message = "The mixture's colors swirl together."
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL
/datum/chemical_reaction/eigenstate
results = list(/datum/reagent/eigenstate = 1)
required_reagents = list(/datum/reagent/bluespace = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/consumable/caramel = 1)
mix_message = "the reaction zaps suddenly!"
mix_sound = 'sound/chemistry/bluespace.ogg'
//FermiChem vars:
required_temp = 350
optimal_temp = 600
overheat_temp = 650
optimal_ph_min = 9
optimal_ph_max = 12
determin_ph_range = 5
temp_exponent_factor = 1.5
ph_exponent_factor = 3
thermic_constant = 12
H_ion_release = -0.05
rate_up_lim = 10
purity_min = 0.4
reaction_flags = REACTION_HEAT_ARBITARY
reaction_tags = REACTION_TAG_HARD | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/eigenstate/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol)
. = ..()
var/turf/open/location = get_turf(holder.my_atom)
if(reaction.data["ducts_teleported"] == TRUE) //If we teleported an duct, then we reconnect it at the end
for(var/obj/item/stack/ducts/duct in range(location, 3))
duct.check_attach_turf(duct.loc)
var/datum/reagent/eigenstate/eigen = holder.has_reagent(/datum/reagent/eigenstate)
if(!eigen)
return
if(location)
eigen.location_created = location
eigen.data["location_created"] = location
do_sparks(5,FALSE,location)
playsound(location, 'sound/effects/phasein.ogg', 80, TRUE)
/datum/chemical_reaction/eigenstate/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
if(!off_cooldown(holder, equilibrium, 0.5, "eigen"))
return
var/turf/location = get_turf(holder.my_atom)
do_sparks(3,FALSE,location)
playsound(location, 'sound/effects/phasein.ogg', 80, TRUE)
for(var/mob/living/nearby_mob in range(location, 3))
do_sparks(3,FALSE,nearby_mob)
do_teleport(nearby_mob, get_turf(holder.my_atom), 3, no_effects=TRUE)
nearby_mob.Knockdown(20, TRUE)
nearby_mob.add_atom_colour("#cebfff", WASHABLE_COLOUR_PRIORITY)
to_chat()
do_sparks(3,FALSE,nearby_mob)
clear_products(holder, step_volume_added)
/datum/chemical_reaction/eigenstate/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
if(!off_cooldown(holder, equilibrium, 1, "eigen"))
return
var/turf/location = get_turf(holder.my_atom)
do_sparks(3,FALSE,location)
holder.chem_temp += 10
playsound(location, 'sound/effects/phasein.ogg', 80, TRUE)
for(var/obj/machinery/duct/duct in range(location, 3))
do_teleport(duct, location, 3, no_effects=TRUE)
equilibrium.data["ducts_teleported"] = TRUE //If we teleported a duct - call the process in
var/lets_not_go_crazy = 15 //Teleport 15 items at max
var/list/items = list()
for(var/obj/item/item in range(location, 3))
items += item
shuffle(items)
for(var/obj/item/item in items)
do_teleport(item, location, 3, no_effects=TRUE)
lets_not_go_crazy -= 1
item.add_atom_colour("#c4b3fd", WASHABLE_COLOUR_PRIORITY)
if(!lets_not_go_crazy)
clear_products(holder, step_volume_added)
return
clear_products(holder, step_volume_added)
holder.my_atom.audible_message("<span class='notice'>[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The reaction gives out a fizz, teleporting items everywhere!</span>")

View File

@@ -5,7 +5,7 @@
reaction_tags = REACTION_TAG_EXPLOSIVE | REACTION_TAG_MODERATE | REACTION_TAG_DANGEROUS
required_temp = 0 //Prevent impromptu RPGs
/datum/chemical_reaction/reagent_explosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
explode(holder, created_volume)
/datum/chemical_reaction/reagent_explosion/proc/explode(datum/reagents/holder, created_volume)
@@ -34,7 +34,7 @@
required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/toxin/acid = 1)
strengthdiv = 2
/datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 25, CHEMICAL_QUANTISATION_LEVEL)))
return
@@ -53,7 +53,7 @@
required_temp = 404
strengthdiv = 8
/datum/chemical_reaction/reagent_explosion/rdx/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/rdx/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/stabilizing_agent))
return
holder.remove_reagent(/datum/reagent/rdx, created_volume*2)
@@ -70,7 +70,7 @@
strengthdiv = 3.5 //actually a decrease of 1 becaused of how explosions are calculated. This is due to the fact we require 2 reagents
modifier = 4
/datum/chemical_reaction/reagent_explosion/rdx_explosion2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/rdx_explosion2/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/fire_range = round(created_volume/30)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/target as anything in RANGE_TURFS(fire_range,T))
@@ -84,7 +84,7 @@
modifier = 6
/datum/chemical_reaction/reagent_explosion/rdx_explosion3/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/rdx_explosion3/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/fire_range = round(created_volume/20)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/turf as anything in RANGE_TURFS(fire_range,T))
@@ -101,7 +101,7 @@
/datum/chemical_reaction/reagent_explosion/tatp/update_info()
required_temp = 450 + rand(-49,49) //this gets loaded only on round start
/datum/chemical_reaction/reagent_explosion/tatp/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/tatp/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 50, CHEMICAL_QUANTISATION_LEVEL))) // we like exotic stabilizer
return
holder.remove_reagent(/datum/reagent/tatp, created_volume)
@@ -112,7 +112,7 @@
required_temp = 550 // this makes making tatp before pyro nades, and extreme pain in the ass to make
strengthdiv = 3
/datum/chemical_reaction/reagent_explosion/tatp_explosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/tatp_explosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/strengthdiv_adjust = created_volume / ( 2100 / initial(strengthdiv))
strengthdiv = max(initial(strengthdiv) - strengthdiv_adjust + 1.5 ,1.5) //Slightly better than nitroglycerin
. = ..()
@@ -138,7 +138,7 @@
required_reagents = list(/datum/reagent/water/holywater = 1, /datum/reagent/potassium = 1)
strengthdiv = 20
/datum/chemical_reaction/reagent_explosion/holyboom/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/holyboom/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(created_volume >= 150)
strengthdiv = 8
///turf where to play sound
@@ -176,7 +176,7 @@
modifier = 5
mix_message = "<span class='boldannounce'>Sparks start flying around the gunpowder!</span>"
/datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
addtimer(CALLBACK(src, .proc/explode, holder, created_volume), rand(5,10) SECONDS)
/datum/chemical_reaction/thermite
@@ -188,7 +188,7 @@
required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/emp_pulse/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
// 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
// 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
@@ -200,7 +200,7 @@
required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/uranium/radium = 1)
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/beesplosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = holder.my_atom.drop_location()
if(created_volume < 5)
playsound(location,'sound/effects/sparks1.ogg', 100, TRUE)
@@ -230,7 +230,7 @@
overheat_temp = 1050
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DANGEROUS | REACTION_TAG_BURN
/datum/chemical_reaction/clf3/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/target as anything in RANGE_TURFS(1,T))
new /obj/effect/hotspot(target)
@@ -243,8 +243,7 @@
modifier = 5
mob_react = FALSE
/datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/target in RANGE_TURFS(1,T))
new /obj/effect/hotspot(target)
@@ -260,7 +259,7 @@
required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1)
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/sorium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/stabilizing_agent))
return
holder.remove_reagent(/datum/reagent/sorium, created_volume*4)
@@ -273,7 +272,7 @@
required_temp = 474
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
var/range = clamp(sqrt(created_volume), 1, 6)
goonchem_vortex(T, 1, range)
@@ -283,7 +282,7 @@
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/carbon = 1)
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/stabilizing_agent))
return
holder.remove_reagent(/datum/reagent/liquid_dark_matter, created_volume*3)
@@ -296,7 +295,7 @@
required_temp = 474
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
var/range = clamp(sqrt(created_volume/2), 1, 6)
goonchem_vortex(T, 0, range)
@@ -307,7 +306,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/flash_powder/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/stabilizing_agent))
return
var/location = get_turf(holder.my_atom)
@@ -329,7 +328,7 @@
required_temp = 374
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
do_sparks(2, TRUE, location)
var/range = created_volume/10
@@ -349,7 +348,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/smoke_powder/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/smoke_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/stabilizing_agent))
return
holder.remove_reagent(/datum/reagent/smoke_powder, created_volume*3)
@@ -371,7 +370,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
var/smoke_radius = round(sqrt(created_volume / 2), 1)
var/datum/effect_system/smoke_spread/chem/S = new
@@ -388,7 +387,7 @@
required_reagents = list(/datum/reagent/oxygen = 1, /datum/reagent/consumable/space_cola = 1, /datum/reagent/phosphorus = 1)
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/sonic_powder/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/stabilizing_agent))
return
holder.remove_reagent(/datum/reagent/sonic_powder, created_volume*3)
@@ -402,7 +401,7 @@
required_temp = 374
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
playsound(location, 'sound/effects/bang.ogg', 25, TRUE)
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
@@ -413,7 +412,7 @@
required_reagents = list(/datum/reagent/phosphorus = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/stable_plasma = 1)
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/phlogiston/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(holder.has_reagent(/datum/reagent/stabilizing_agent))
return
var/turf/open/T = get_turf(holder.my_atom)
@@ -449,7 +448,7 @@
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_ORGAN
//Halve beaker temp on reaction
/datum/chemical_reaction/cryostylane/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/cryostylane/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/datum/reagent/oxygen = holder.has_reagent(/datum/reagent/oxygen) //If we have oxygen, bring in the old cooling effect
if(oxygen)
holder.chem_temp = max(holder.chem_temp - (10 * oxygen.volume * 2),0)
@@ -457,7 +456,7 @@
return
//purity != temp (above 50) - the colder you are the more impure it becomes
/datum/chemical_reaction/cryostylane/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/cryostylane/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
. = ..()
if(holder.chem_temp < CRYOSTYLANE_UNDERHEAT_TEMP)
overheated(holder, reaction, step_reaction_vol)
@@ -467,7 +466,7 @@
return
reaction.delta_ph *= step_temp
/datum/chemical_reaction/cryostylane/reaction_finish(datum/reagents/holder, react_vol)
/datum/chemical_reaction/cryostylane/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol)
. = ..()
if(holder.chem_temp < CRYOSTYLANE_UNDERHEAT_TEMP)
overheated(holder, null, react_vol) //replace null with fix win 2.3 is merged
@@ -525,7 +524,7 @@
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.chem_temp += 10*created_volume
/datum/chemical_reaction/pyrosium
@@ -538,7 +537,7 @@
thermic_constant = 0
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE
/datum/chemical_reaction/pyrosium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/pyrosium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.chem_temp = 20 // also cools the fuck down
return
@@ -564,8 +563,8 @@
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison.
/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison.
var/T2 = created_volume * 50
var/T3 = created_volume * 120
var/added_delay = 0.5 SECONDS
@@ -595,7 +594,7 @@
required_temp = 575
modifier = 1
/datum/chemical_reaction/reagent_explosion/nitrous_oxide/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/reagent_explosion/nitrous_oxide/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.remove_reagent(/datum/reagent/sorium, created_volume*2)
var/turf/turfie = get_turf(holder.my_atom)
//generally half as strong as sorium.

View File

@@ -80,19 +80,19 @@
reaction_flags = REACTION_COMPETITIVE //Competes with /datum/chemical_reaction/prefactor_a/competitive
reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_DANGEROUS | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPETITIVE
/datum/chemical_reaction/prefactor_b/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol)
/datum/chemical_reaction/prefactor_b/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol)
. = ..()
if(holder.has_reagent(/datum/reagent/bluespace))
holder.remove_reagent(/datum/reagent/bluespace, 1)
reaction.delta_t *= 5
/datum/chemical_reaction/prefactor_b/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/prefactor_b/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
. = ..()
explode_shockwave(holder, equilibrium)
var/vol = max(20, holder.total_volume/5) //Not letting you have more than 5
clear_reagents(holder, vol)//Lest we explode forever
/datum/chemical_reaction/prefactor_b/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added)
/datum/chemical_reaction/prefactor_b/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added)
explode_fire(holder, equilibrium)
var/vol = max(20, holder.total_volume/5) //Not letting you have more than 5
clear_reagents(holder, vol)

View File

@@ -1,10 +1,10 @@
/datum/chemical_reaction/slime
var/deletes_extract = TRUE
reaction_flags = REACTION_INSTANT
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME
/datum/chemical_reaction/slime/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
use_slime_core(holder)
/datum/chemical_reaction/slime/proc/use_slime_core(datum/reagents/holder)
@@ -23,7 +23,7 @@
required_container = /obj/item/slime_extract/grey
required_other = TRUE
/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey")
S.visible_message("<span class='danger'>Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!</span>")
..()
@@ -39,7 +39,7 @@
required_container = /obj/item/slime_extract/grey
required_other = TRUE
/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
for(var/i in 1 to 3)
new /obj/item/food/monkeycube(get_turf(holder.my_atom))
..()
@@ -69,7 +69,7 @@
required_container = /obj/item/slime_extract/metal
required_other = TRUE
/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/plasteel(location, 5)
new /obj/item/stack/sheet/iron(location, 15)
@@ -80,7 +80,7 @@
required_container = /obj/item/slime_extract/metal
required_other = TRUE
/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/rglass(location, 5)
new /obj/item/stack/sheet/glass(location, 15)
@@ -94,7 +94,7 @@
deletes_extract = FALSE //we do delete, but we don't do so instantly
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
summon_mobs(holder, T)
var/obj/item/slime_extract/M = holder.my_atom
@@ -135,7 +135,7 @@
required_container = /obj/item/slime_extract/silver
required_other = TRUE
/datum/chemical_reaction/slime/slimebork/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
//BORK BORK BORK
var/turf/T = get_turf(holder.my_atom)
@@ -177,7 +177,7 @@
required_container = /obj/item/slime_extract/blue
required_other = TRUE
/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/slime/stabilizer(get_turf(holder.my_atom))
..()
@@ -186,7 +186,7 @@
required_container = /obj/item/slime_extract/blue
required_other = TRUE
/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
holder.create_foam(/datum/effect_system/foam_spread,80, "<span class='danger'>[src] spews out foam!</span>")
//Dark Blue
@@ -196,7 +196,7 @@
required_other = TRUE
deletes_extract = FALSE
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract starts to feel extremely cold!</span>")
addtimer(CALLBACK(src, .proc/freeze, holder), 50)
@@ -217,7 +217,7 @@
required_container = /obj/item/slime_extract/darkblue
required_other = TRUE
/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/fireproof(get_turf(holder.my_atom))
..()
@@ -234,7 +234,7 @@
required_other = TRUE
deletes_extract = FALSE
/datum/chemical_reaction/slime/slimefire/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
addtimer(CALLBACK(src, .proc/slime_burn, holder), 50)
@@ -263,7 +263,7 @@
required_other = TRUE
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
empulse(get_turf(holder.my_atom), 3, 7)
..()
@@ -272,7 +272,7 @@
required_container = /obj/item/slime_extract/yellow
required_other = TRUE
/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.</span>")
new /obj/item/flashlight/slime(T)
@@ -284,7 +284,7 @@
required_container = /obj/item/slime_extract/purple
required_other = TRUE
/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/slime/steroid(get_turf(holder.my_atom))
..()
@@ -300,7 +300,7 @@
required_container = /obj/item/slime_extract/darkpurple
required_other = TRUE
/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/stack/sheet/mineral/plasma(get_turf(holder.my_atom), 3)
..()
@@ -310,7 +310,7 @@
required_container = /obj/item/slime_extract/red
required_other = TRUE
/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/slime/mutator(get_turf(holder.my_atom))
..()
@@ -320,7 +320,7 @@
required_other = TRUE
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
if(slime.docile) //Undoes docility, but doesn't make rabid.
slime.visible_message("<span class='danger'>[slime] forgets its training, becoming wild once again!</span>")
@@ -336,7 +336,7 @@
required_container = /obj/item/slime_extract/red
required_other = TRUE
/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/speed(get_turf(holder.my_atom))
..()
@@ -346,7 +346,7 @@
required_container = /obj/item/slime_extract/pink
required_other = TRUE
/datum/chemical_reaction/slime/docility/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/slime/docility(get_turf(holder.my_atom))
..()
@@ -355,7 +355,7 @@
required_container = /obj/item/slime_extract/pink
required_other = TRUE
/datum/chemical_reaction/slime/gender/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom))
..()
@@ -374,7 +374,7 @@
deletes_extract = FALSE
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
var/lastkey = holder.my_atom.fingerprintslast
var/touch_msg = "N/A"
@@ -407,7 +407,7 @@
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_other = TRUE
/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/slime/sentience(get_turf(holder.my_atom))
..()
@@ -416,7 +416,7 @@
required_reagents = list(/datum/reagent/water = 1)
required_other = TRUE
/datum/chemical_reaction/slime/renaming/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/renaming/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/slime/renaming(holder.my_atom.drop_location())
..()
@@ -427,7 +427,7 @@
required_container = /obj/item/slime_extract/adamantine
required_other = TRUE
/datum/chemical_reaction/slime/adamantine/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/adamantine/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/stack/sheet/mineral/adamantine(get_turf(holder.my_atom))
..()
@@ -437,7 +437,7 @@
required_container = /obj/item/slime_extract/bluespace
required_other = TRUE
/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25)
..()
@@ -447,7 +447,7 @@
required_container = /obj/item/slime_extract/bluespace
required_other = TRUE
/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/obj/item/stack/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom))
BC.visible_message("<span class='notice'>The [BC.name] appears out of thin air!</span>")
..()
@@ -457,7 +457,7 @@
required_container = /obj/item/slime_extract/bluespace
required_other = TRUE
/datum/chemical_reaction/slime/slimeradio/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimeradio/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/slime/slimeradio(get_turf(holder.my_atom))
..()
@@ -467,7 +467,7 @@
required_container = /obj/item/slime_extract/cerulean
required_other = TRUE
/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom))
..()
@@ -476,7 +476,7 @@
required_container = /obj/item/slime_extract/cerulean
required_other = TRUE
/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom))
..()
@@ -486,7 +486,7 @@
required_container = /obj/item/slime_extract/sepia
required_other = TRUE
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
addtimer(CALLBACK(src, .proc/slime_stop, holder), 5 SECONDS)
/datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder)
@@ -505,7 +505,7 @@
required_container = /obj/item/slime_extract/sepia
required_other = TRUE
/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/camera(get_turf(holder.my_atom))
new /obj/item/camera_film(get_turf(holder.my_atom))
..()
@@ -515,7 +515,7 @@
required_container = /obj/item/slime_extract/sepia
required_other = TRUE
/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25)
..()
@@ -525,7 +525,7 @@
required_container = /obj/item/slime_extract/pyrite
required_other = TRUE
/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/chosen = pick(subtypesof(/obj/item/paint))
new chosen(get_turf(holder.my_atom))
..()
@@ -535,7 +535,7 @@
required_container = /obj/item/slime_extract/pyrite
required_other = TRUE
/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan)))
new chosen(get_turf(holder.my_atom))
..()
@@ -546,7 +546,7 @@
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slime_rng/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slime_rng/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
if(created_volume >= 5)
var/obj/item/grenade/clusterbuster/slime/S = new (get_turf(holder.my_atom))
S.visible_message("<span class='danger'>Infused with plasma, the core begins to expand uncontrollably!</span>")
@@ -563,7 +563,7 @@
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slimebomb/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slimebomb/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/turf/T = get_turf(holder.my_atom)
var/obj/item/grenade/clusterbuster/slime/volatile/S = new (T)
S.visible_message("<span class='danger'>Infused with slime jelly, the core begins to expand uncontrollably!</span>")
@@ -584,7 +584,7 @@
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/slimepotion/transference(get_turf(holder.my_atom))
..()
@@ -593,6 +593,6 @@
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume)
/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
new /obj/item/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom))
..()

View File

@@ -330,6 +330,7 @@
#include "code\controllers\subsystem\discord.dm"
#include "code\controllers\subsystem\disease.dm"
#include "code\controllers\subsystem\economy.dm"
#include "code\controllers\subsystem\eigenstate.dm"
#include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\explosions.dm"
#include "code\controllers\subsystem\fire_burning.dm"
@@ -3085,6 +3086,7 @@
#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\reaction_agents_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\unique\eigenstasium.dm"
#include "code\modules\reagents\chemistry\reagents\impure_reagents\impure_medicine_reagents.dm"
#include "code\modules\reagents\chemistry\recipes\cat2_medicines.dm"
#include "code\modules\reagents\chemistry\recipes\catalysts.dm"