diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 3f88d8c4f62..0b2c5d0fda2 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -22,7 +22,7 @@
F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
"
//ADMINVERBS
-/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos") )
+/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor") )
set name = "Investigate"
set category = "Admin"
if(!holder) return
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 86e5d9ffee3..84c2ebf1336 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -50,7 +50,7 @@
/obj/machinery/r_n_d/experimentor/verb/forceReaction()
set name = "Force Experimentor Reaction"
set category = "Debug"
- set src in oview(1, src)
+ set src in oview(1)
var/reaction = input(usr,"What reaction?") in list(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE)
var/oldReaction = item_reactions["[loaded_item.type]"]
item_reactions["[loaded_item.type]"] = reaction
@@ -256,6 +256,7 @@
/obj/machinery/r_n_d/experimentor/proc/experiment(var/exp,var/obj/item/exp_on)
recentlyExperimented = 1
icon_state = "h_lathe_wloop"
+ var/chosenchem
var/criticalReaction = locate(exp_on) in critical_items ? TRUE : FALSE
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_POKE)
@@ -267,6 +268,7 @@
visible_message("[src] malfunctions and destroys [exp_on], lashing it's arms out at nearby people!.")
for(var/mob/living/m in oview(1, src))
m.apply_damage(15,"brute",pick("head","chest","groin"))
+ investigate_log("Experimentor dealt minor brute to [m].", "experimentor")
ejectItem(TRUE)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions!.")
@@ -276,6 +278,7 @@
var/mob/living/target = locate(/mob/living) in oview(7,src)
if(target)
var/obj/item/throwing = loaded_item
+ investigate_log("Experimentor has thrown [loaded_item] at [target]", "experimentor")
ejectItem()
if(throwing)
throwing.throw_at(target, 10, 1)
@@ -286,11 +289,13 @@
visible_message("[exp_on] has activated an unknown subroutine!")
cloneMode = TRUE
cloneCount = badThingCoeff
+ investigate_log("Experimentor has made a clone of [exp_on]", "experimentor")
ejectItem()
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and leaking radiation!.")
for(var/mob/living/m in oview(1, src))
m.apply_effect(25,IRRADIATE)
+ investigate_log("Experimentor has irradiated [m]", "experimentor") //One entry per person so we know what was irradiated.
ejectItem(TRUE)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, spewing toxic waste!.")
@@ -304,6 +309,7 @@
var/newPath = pickWeighted(valid_items)
loaded_item = new newPath(src)
visible_message("[src] malfunctions, transforming [savedName] into [loaded_item]!.")
+ investigate_log("Experimentor has transformed [savedName] into [loaded_item]", "experimentor")
if(istype(loaded_item,/obj/item/weapon/grenade/chem_grenade))
var/obj/item/weapon/grenade/chem_grenade/CG = loaded_item
CG.prime()
@@ -316,10 +322,11 @@
new /obj/item/stack/sheet/mineral/plasma(get_turf(pick(oview(1,src))))
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] destroys [exp_on], leaking dangerous gas!.")
- var/list/chems = list("carbon","radium","toxin","condensedcapsaicin","mushroomhallucinogen","space_drugs","ethanol","beepskysmash")
+ chosenchem = pick("carbon","radium","toxin","condensedcapsaicin","mushroomhallucinogen","space_drugs","ethanol","beepskysmash")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
- R.add_reagent(pick(chems) , 50)
+ R.add_reagent(chosenchem , 50)
+ investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor")
var/datum/effect/effect/system/chem_smoke_spread/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
@@ -328,10 +335,9 @@
ejectItem(TRUE)
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src]'s chemical chamber has sprung a leak!.")
- var/list/chems = list("mutationtoxin","nanomachines","xenomicrobes")
+ chosenchem = pick("mutationtoxin","nanomachines","xenomicrobes")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
- var/chosenchem = pick(chems)
R.add_reagent(chosenchem , 50)
var/datum/effect/effect/system/chem_smoke_spread/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
@@ -340,12 +346,14 @@
R.delete()
ejectItem(TRUE)
warn_admins(usr, "[chosenchem] smoke")
+ investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor")
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, spewing harmless gas!.")
throwSmoke(src.loc)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] melts [exp_on], ionizing the air around it!.")
empulse(src.loc, 4, 6)
+ investigate_log("Experimentor has generated an Electromagnetic Pulse.", "experimentor")
ejectItem(TRUE)
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_HEAT)
@@ -354,16 +362,19 @@
visible_message("[src]'s emergency coolant system gives off a small ding!")
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
var/obj/item/weapon/reagent_containers/food/drinks/coffee/C = new /obj/item/weapon/reagent_containers/food/drinks/coffee(get_turf(pick(oview(1,src))))
- var/list/chems = list("plasma","capsaicin","ethanol")
+ chosenchem = pick("plasma","capsaicin","ethanol")
C.reagents.remove_any(25)
- C.reagents.add_reagent(pick(chems) , 50)
+ C.reagents.add_reagent(chosenchem , 50)
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
+ investigate_log("Experimentor has made a cup of [chosenchem] coffee.", "experimentor")
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
var/turf/start = get_turf(src)
- var/turf/MT = get_turf(locate(/mob/living) in oview(src, 3))
+ var/mob/M = locate(/mob/living) in view(src, 3)
+ var/turf/MT = get_turf(M)
if(MT)
visible_message("[src] dangerously overheats, launching a flaming fuel orb!")
+ investigate_log("Experimentor has launched a fireball at [M]!", "experimentor")
var/obj/item/projectile/magic/fireball/FB = new /obj/item/projectile/magic/fireball(start)
FB.original = MT
FB.current = start
@@ -373,6 +384,7 @@
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!.")
explosion(src.loc, -1, 0, 0, 0, 0, flame_range = 2)
+ investigate_log("Experimentor started a fire.", "experimentor")
ejectItem(TRUE)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and leaking hot air!.")
@@ -386,12 +398,14 @@
removed.temperature = min((removed.temperature*heat_capacity + 100000)/heat_capacity, 1000)
env.merge(removed)
air_update_turf()
+ investigate_log("Experimentor has released hot air.", "experimentor")
ejectItem(TRUE)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, activating it's emergency coolant systems!.")
throwSmoke(src.loc)
for(var/mob/living/m in oview(1, src))
m.apply_damage(5,"burn",pick("head","chest","groin"))
+ investigate_log("Experimentor has dealt minor burn damage to [m]", "experimentor")
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_COLD)
@@ -400,16 +414,18 @@
visible_message("[src]'s emergency coolant system gives off a small ding!")
var/obj/machinery/vending/coffee/C = new /obj/machinery/vending/coffee(get_turf(pick(oview(1,src))))
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //Ding! Your death coffee is ready!
- var/list/chems = list("uranium","frostoil","ephedrine")
+ chosenchem = pick("uranium","frostoil","ephedrine")
C.reagents.remove_any(25)
- C.reagents.add_reagent(pick(chems) , 50)
+ C.reagents.add_reagent(chosenchem , 50)
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
+ investigate_log("Experimentor has made a cup of [chosenchem] coffee.", "experimentor")
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
R.add_reagent("frostoil" , 50)
+ investigate_log("Experimentor has released frostoil gas.", "experimentor")
var/datum/effect/effect/system/chem_smoke_spread/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
@@ -428,6 +444,7 @@
removed.temperature = (removed.temperature*heat_capacity - 75000)/heat_capacity
env.merge(removed)
air_update_turf()
+ investigate_log("Experimentor has released cold air.", "experimentor")
ejectItem(TRUE)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!.")
@@ -447,6 +464,7 @@
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src]'s crusher goes way too many levels too high, crushing right through space-time!")
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3)
+ investigate_log("Experimentor has triggered the 'throw things' reaction.", "experimentor")
var/list/throwAt = list()
for(var/i in oview(7,src))
if(istype(i,/obj/item) || istype(i,/mob/living))
@@ -458,6 +476,7 @@
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src]'s crusher goes one level too high, crushing right into space-time!.")
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3)
+ investigate_log("Experimentor has triggered the 'minor throw things' reaction.", "experimentor")
var/list/oViewStuff = oview(7,src)
var/list/throwAt = list()
for(var/i in oViewStuff)
@@ -479,6 +498,7 @@
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 3, -1)
var/obj/item/weapon/relic/R = loaded_item
R.reveal()
+ investigate_log("Experimentor has revealed a relic with [R.realProc] effect.", "experimentor")
ejectItem()
//Global reactions
@@ -494,30 +514,37 @@
if(trackedIan)
throwSmoke(trackedIan.loc)
trackedIan.loc = src.loc
+ investigate_log("Experimentor has stolen Ian!", "experimentor") //...if anyone ever fixes it...
else
new /mob/living/simple_animal/corgi(src.loc)
+ investigate_log("Experimentor has spawned a new corgi.", "experimentor")
ejectItem(TRUE)
if(globalMalf > 36 && globalMalf < 50)
visible_message("[src] improves [exp_on], drawing the life essence of those nearby!")
for(var/mob/living/m in view(4,src))
m << "You feel your flesh being torn from you, mists of blood drifting to [src]!"
m.apply_damage(50,"brute","chest")
+ investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", "experimentor")
var/list/reqs = ConvertReqString2List(exp_on.origin_tech)
for(var/T in reqs)
reqs[T] = reqs[T] + 1
exp_on.origin_tech = ConvertReqList2String(reqs)
+ investigate_log("Experimentor has set the origin tech of [exp_on] to [exp_on.origin_tech]", "experimentor")
if(globalMalf > 51 && globalMalf < 75)
visible_message("[src] encounters a run-time error!")
throwSmoke(src.loc)
if(trackedRuntime)
throwSmoke(trackedRuntime.loc)
trackedRuntime.loc = src.loc
+ investigate_log("Experimentor has stolen Runtime!", "experimentor")
else
new /mob/living/simple_animal/cat(src.loc)
+ investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", "experimentor")
ejectItem(TRUE)
if(globalMalf > 76)
visible_message("[src] begins to smoke and hiss, shaking violently!")
use_power(500000)
+ investigate_log("Experimentor has drained power from its APC", "experimentor")
spawn(resetTime)
icon_state = "h_lathe"