diff --git a/baystation12.dme b/baystation12.dme
index 2a699386a9..8731451301 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -679,6 +679,9 @@
#include "code\modules\admin\verbs\possess.dm"
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
+#include "code\modules\admin\verbs\SDQL.dm"
+#include "code\modules\admin\verbs\SDQL_2.dm"
+#include "code\modules\admin\verbs\SDQL_2_parser.dm"
#include "code\modules\admin\verbs\striketeam.dm"
#include "code\modules\admin\verbs\striketeam_syndicate.dm"
#include "code\modules\admin\verbs\ticklag.dm"
@@ -1190,22 +1193,18 @@
#include "code\modules\research\xenoarchaeology\finds\finds_fossils.dm"
#include "code\modules\research\xenoarchaeology\finds\finds_misc.dm"
#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm"
-#include "code\modules\research\xenoarchaeology\machinery\analysis_accelerator.dm"
-#include "code\modules\research\xenoarchaeology\machinery\analysis_base.dm"
-#include "code\modules\research\xenoarchaeology\machinery\analysis_fourier_transform.dm"
-#include "code\modules\research\xenoarchaeology\machinery\analysis_gas_chromatography.dm"
-#include "code\modules\research\xenoarchaeology\machinery\analysis_hyperspectral.dm"
-#include "code\modules\research\xenoarchaeology\machinery\analysis_ion_mobility.dm"
-#include "code\modules\research\xenoarchaeology\machinery\analysis_isotope_ratio.dm"
#include "code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm"
#include "code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm"
#include "code\modules\research\xenoarchaeology\machinery\artifact_scanner.dm"
+#include "code\modules\research\xenoarchaeology\machinery\coolant.dm"
+#include "code\modules\research\xenoarchaeology\machinery\geosample_scanner.dm"
#include "code\modules\research\xenoarchaeology\tools\ano_device_battery.dm"
#include "code\modules\research\xenoarchaeology\tools\anomaly_suit.dm"
#include "code\modules\research\xenoarchaeology\tools\bunsen_burner.dm"
#include "code\modules\research\xenoarchaeology\tools\gearbelt.dm"
#include "code\modules\research\xenoarchaeology\tools\suspension_generator.dm"
#include "code\modules\research\xenoarchaeology\tools\tools.dm"
+#include "code\modules\research\xenoarchaeology\tools\tools_anoscanner.dm"
#include "code\modules\research\xenoarchaeology\tools\tools_coresampler.dm"
#include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm"
#include "code\modules\research\xenoarchaeology\tools\tools_locater.dm"
@@ -1291,7 +1290,6 @@
#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_gen_external.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\LaserComputer.dm"
-#include "code\WorkInProgress\Cael_Aislinn\Supermatter\SuperMatter.dm"
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm"
#include "code\WorkInProgress\Chinsky\ashtray.dm"
#include "code\WorkInProgress\Cib\MedicalSideEffects.dm"
@@ -1300,6 +1298,7 @@
#include "code\WorkInProgress\Ported\policetape.dm"
#include "code\WorkInProgress\SkyMarshal\officer_stuff.dm"
#include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm"
+#include "code\WorkInProgress\Yinadele\Supermatter.dm"
#include "code\ZAS\Airflow.dm"
#include "code\ZAS\Connection.dm"
#include "code\ZAS\Debug.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fusion_reactions.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fusion_reactions.dm
index c083cad713..8293e060f4 100644
--- a/code/WorkInProgress/Cael_Aislinn/Rust/fusion_reactions.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Rust/fusion_reactions.dm
@@ -145,14 +145,14 @@ datum/fusion_reaction/pergium_tritium
energy_production = 0
radiation = 5
-datum/fusion_reaction/pergium_deuterium
+datum/fusion_reaction/pergium_obdurium
primary_reactant = "Pergium"
secondary_reactant = "Obdurium"
energy_consumption = 5
energy_production = 0
radiation = 5
-datum/fusion_reaction/pergium_tritium
+datum/fusion_reaction/pergium_solonium
primary_reactant = "Pergium"
secondary_reactant = "Solonium"
energy_consumption = 5
diff --git a/code/WorkInProgress/Cael_Aislinn/Supermatter/SuperMatter.dm b/code/WorkInProgress/Cael_Aislinn/Supermatter/SuperMatter.dm
deleted file mode 100644
index fd3bf8eea6..0000000000
--- a/code/WorkInProgress/Cael_Aislinn/Supermatter/SuperMatter.dm
+++ /dev/null
@@ -1,186 +0,0 @@
-#define NITROGEN_RETARDATION_FACTOR 12 //Higher == N2 slows reaction more
-#define THERMAL_RELEASE_MODIFIER 0.55 //Percentage of output power given to heat generation.
-
-#define PLASMA_RELEASE_MODIFIER 0.24 //Percentage of output power given to plasma generation.
-#define PLASMA_CONVERSION_FACTOR 50 //How much energy per mole of plasma
-#define MAX_PLASMA_RELATIVE_INCREASE 0.3 //Percentage of current plasma amounts that can be added to preexisting plasma.
-
-#define OXYGEN_RELEASE_MODIFIER 0.13 //Percentage of output power given to oxygen generation.
-#define OXYGEN_CONVERSION_FACTOR 150 //How much energy per mole of oxygen.
-#define MAX_OXYGEN_RELATIVE_INCREASE 0.2 //Percentage of current oxygen amounts that can be added to preexisting oxygen.
-
-#define RADIATION_POWER_MODIFIER 0.03 //How much power goes to irradiating the area.
-#define RADIATION_FACTOR 10
-#define HALLUCINATION_POWER_MODIFIER 0.05 //How much power goes to hallucinations.
-#define HALLUCINATION_FACTOR 20
-
-#define REACTION_POWER_MODIFIER 4 //Higher == more overall power
-
-#define WARNING_DELAY 45 //45 seconds between warnings.
-
-/obj/machinery/power/supermatter
- name = "Supermatter"
- desc = "A strangely translucent and iridescent crystal. \red You get headaches just from looking at it."
- icon = 'icons/obj/engine.dmi'
- icon_state = "darkmatter"
- density = 1
- anchored = 0
-
- var/gasefficency = 0.25
-
- var/base_icon_state = "darkmatter"
-
- var/damage = 0
- var/damage_archived = 0
- var/safe_alert = "Crystaline hyperstructure returning to safe operating levels."
- var/warning_point = 100
- var/warning_alert = "Danger! Crystal hyperstructure instability!"
- var/emergency_point = 700
- var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT"
- var/explosion_point = 1000
-
- var/emergency_issued = 0
-
- var/explosion_power = 8
-
- var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
-
- var/power = 0
-
-
- shard //Small subtype, less efficient and more sensitive, but less boom.
- name = "Supermatter Shard"
- desc = "A strangely translucent and iridescent crystal. Looks like it used to be part of a larger structure. \red You get headaches just from looking at it."
- icon_state = "darkmatter_shard"
- base_icon_state = "darkmatter_shard"
-
- warning_point = 50
- emergency_point = 500
- explosion_point = 900
-
- gasefficency = 0.125
-
- explosion_power = 3 //3,6,9,12? Or is that too small?
-
-
- process()
-
- var/turf/L = loc
-
- if(!istype(L)) //If we are not on a turf, uh oh.
- del src
-
- //Ok, get the air from the turf
- var/datum/gas_mixture/env = L.return_air()
-
- //Remove gas from surrounding area
- var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles)
-
- if (!removed)
- return 1
-
- if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
- if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
-
- if(damage > emergency_point)
- //radioalert("states, \"[emergency_alert]\"","Supermatter Monitor")
- lastwarning = world.timeofday
- else if(damage >= damage_archived) // The damage is still going up
- //radioalert("states, \"[warning_alert]\"","Supermatter Monitor")
- lastwarning = world.timeofday-150
- else // Phew, we're safe
- //radioalert("states, \"[safe_alert]\"","Supermatter Monitor")
- lastwarning = world.timeofday
-
- if(damage > explosion_point)
- explosion(loc,explosion_power,explosion_power*2,explosion_power*3,explosion_power*4,1)
- del src
-
- damage_archived = damage
- damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
-
- if(!removed.total_moles)
- damage += max((power-1600)/10,0)
- power = max(power,1600)
- return 1
-
- var/nitrogen_mod = abs((removed.nitrogen / removed.total_moles)) * NITROGEN_RETARDATION_FACTOR
- var/oxygen = max(min(removed.oxygen / removed.total_moles - nitrogen_mod, 1), 0)
-
- var/temp_factor = 0
- if(oxygen > 0.8)
- // with a perfect gas mix, make the power less based on heat
- temp_factor = 100
- icon_state = "[base_icon_state]_glow"
- else
- // in normal mode, base the produced energy around the heat
- temp_factor = 60
- icon_state = base_icon_state
-
- //Calculate power released as heat and gas, in as the sqrt of the power.
- var/power_factor = (power/500) ** 3
- var/device_energy = oxygen * power_factor
- power = max(round((removed.temperature - T0C) / temp_factor) + power - power_factor, 0) //Total laser power plus an overload factor
-
- //Final energy calcs.
- device_energy = max(device_energy * REACTION_POWER_MODIFIER,0)
-
- //To figure out how much temperature to add each tick, consider that at one atmosphere's worth
- //of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature
- //that the device energy is around 2140. At that stage, we don't want too much heat to be put out
- //Since the core is effectively "cold"
-
- //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock
- //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall.
-
- var/plasma_energy = device_energy * PLASMA_RELEASE_MODIFIER
- var/oxygen_energy = device_energy * OXYGEN_RELEASE_MODIFIER
- var/other_energy = device_energy * (1- (OXYGEN_RELEASE_MODIFIER + PLASMA_RELEASE_MODIFIER))
-
- //Put as much plasma out as is permitted.
- if( plasma_energy > removed.total_moles * PLASMA_CONVERSION_FACTOR * MAX_PLASMA_RELATIVE_INCREASE / gasefficency)
- removed.toxins += (MAX_PLASMA_RELATIVE_INCREASE * removed.total_moles / gasefficency)
- other_energy += plasma_energy - (removed.total_moles * PLASMA_CONVERSION_FACTOR * MAX_PLASMA_RELATIVE_INCREASE / gasefficency)
- else
- removed.toxins += plasma_energy/PLASMA_CONVERSION_FACTOR
-
- //Put as much plasma out as is permitted.
- if( oxygen_energy > removed.total_moles * OXYGEN_CONVERSION_FACTOR * MAX_OXYGEN_RELATIVE_INCREASE / gasefficency)
- removed.oxygen += (MAX_OXYGEN_RELATIVE_INCREASE * removed.total_moles / gasefficency)
- other_energy += oxygen_energy - (removed.total_moles * OXYGEN_CONVERSION_FACTOR * MAX_OXYGEN_RELATIVE_INCREASE / gasefficency)
- else
- removed.oxygen += oxygen_energy/OXYGEN_CONVERSION_FACTOR
-
-
- var/heat_energy = (other_energy*THERMAL_RELEASE_MODIFIER)/(1-(OXYGEN_RELEASE_MODIFIER + PLASMA_RELEASE_MODIFIER))
- var/hallucination_energy = (other_energy*HALLUCINATION_POWER_MODIFIER*HALLUCINATION_FACTOR)/(1-(OXYGEN_RELEASE_MODIFIER + PLASMA_RELEASE_MODIFIER))
- var/rad_energy = (other_energy*RADIATION_POWER_MODIFIER*RADIATION_FACTOR)/(1-(OXYGEN_RELEASE_MODIFIER + PLASMA_RELEASE_MODIFIER))
-
- var/heat_applied = max(heat_energy,0)
- if(heat_applied + removed.temperature > 800)
- removed.temperature = 800
- var/energy_to_reconsider = (heat_applied + removed.temperature - 800)
- hallucination_energy += (energy_to_reconsider*HALLUCINATION_POWER_MODIFIER)/(HALLUCINATION_POWER_MODIFIER+RADIATION_POWER_MODIFIER)
- rad_energy += (energy_to_reconsider*RADIATION_POWER_MODIFIER)/(HALLUCINATION_POWER_MODIFIER+RADIATION_POWER_MODIFIER)
- else
- removed.temperature += heat_applied
-
- removed.update_values()
-
- env.merge(removed)
-
- for(var/mob/living/carbon/human/l in view(src, round(hallucination_energy**0.25))) // you have to be seeing the core to get hallucinations
- if(prob(10) && !istype(l.glasses, /obj/item/clothing/glasses/meson))
- l.hallucination += hallucination_energy/((get_dist(l,src)**2))
-
- for(var/mob/living/l in range(src,round(rad_energy**0.25)))
- var/rads = rad_energy/((get_dist(l,src)**2))
- l.apply_effect(rads, IRRADIATE)
-
- return 1
-
-
- bullet_act(var/obj/item/projectile/Proj)
- if(Proj.flag != "bullet")
- power += Proj.damage
- return 0
\ No newline at end of file
diff --git a/code/WorkInProgress/Yinadele/Supermatter.dm b/code/WorkInProgress/Yinadele/Supermatter.dm
new file mode 100644
index 0000000000..b9af01b938
--- /dev/null
+++ b/code/WorkInProgress/Yinadele/Supermatter.dm
@@ -0,0 +1,257 @@
+
+#define NITROGEN_RETARDATION_FACTOR 4 //Higher == N2 slows reaction more
+#define THERMAL_RELEASE_MODIFIER 10 //Higher == less heat released during reaction
+#define PLASMA_RELEASE_MODIFIER 1500 //Higher == less plasma released by reaction
+#define OXYGEN_RELEASE_MODIFIER 750 //Higher == less oxygen released at high temperature/power
+#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power
+
+
+//These would be what you would get at point blank, decreases with distance
+#define DETONATION_RADS 200
+#define DETONATION_HALLUCINATION 600
+
+
+#define WARNING_DELAY 60 //45 seconds between warnings.
+
+/obj/machinery/power/supermatter
+ name = "Supermatter"
+ desc = "A strangely translucent and iridescent crystal. \red You get headaches just from looking at it."
+ icon = 'icons/obj/engine.dmi'
+ icon_state = "darkmatter"
+ density = 1
+ anchored = 0
+
+ var/gasefficency = 0.25
+
+ var/base_icon_state = "darkmatter"
+
+ var/damage = 0
+ var/damage_archived = 0
+ var/safe_alert = "Crystaline hyperstructure returning to safe operating levels."
+ var/warning_point = 100
+ var/warning_alert = "Danger! Crystal hyperstructure instability!"
+ var/emergency_point = 700
+ var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT."
+ var/explosion_point = 1000
+
+ var/emergency_issued = 0
+
+ var/explosion_power = 8
+
+ var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
+
+ var/power = 0
+
+ //Temporary values so that we can optimize this
+ //How much the bullets damage should be multiplied by when it is added to the internal variables
+ var/config_bullet_energy = 2
+ //How much of the power is left after processing is finished?
+// var/config_power_reduction_per_tick = 0.5
+ //How much hallucination should it produce per unit of power?
+ var/config_hallucination_power = 0.1
+
+ var/obj/item/device/radio/radio
+
+ shard //Small subtype, less efficient and more sensitive, but less boom.
+ name = "Supermatter Shard"
+ desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. \red You get headaches just from looking at it."
+ icon_state = "darkmatter_shard"
+ base_icon_state = "darkmatter_shard"
+
+ warning_point = 50
+ emergency_point = 500
+ explosion_point = 900
+
+ gasefficency = 0.125
+
+ explosion_power = 3 //3,6,9,12? Or is that too small?
+
+
+/obj/machinery/power/supermatter/New()
+ . = ..()
+ radio = new (src)
+
+
+/obj/machinery/power/supermatter/Del()
+ del radio
+ . = ..()
+
+/obj/machinery/power/supermatter/proc/explode()
+ explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1)
+ del src
+ return
+
+/obj/machinery/power/supermatter/process()
+
+ var/turf/L = loc
+
+ if(!istype(L)) //If we are not on a turf, uh oh.
+ del src
+
+ //Ok, get the air from the turf
+ var/datum/gas_mixture/env = L.return_air()
+
+ //Remove gas from surrounding area
+ var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles)
+
+ if(!removed || !removed.total_moles)
+ damage += max((power-1600)/10, 0)
+ power = min(power, 1600)
+ return 1
+
+ if (!removed)
+ return 1
+
+ damage_archived = damage
+ damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
+
+ if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
+ if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
+
+ if(damage > emergency_point)
+ radio.autosay(emergency_alert, "Supermatter Monitor")
+ lastwarning = world.timeofday
+
+ else if(damage >= damage_archived) // The damage is still going up
+ radio.autosay(warning_alert, "Supermatter Monitor")
+ lastwarning = world.timeofday - 150
+
+ else // Phew, we're safe
+ radio.autosay(safe_alert, "Supermatter Monitor")
+ lastwarning = world.timeofday
+
+ if(damage > explosion_point)
+ for(var/mob/living/mob in living_mob_list)
+ if(istype(mob, /mob/living/carbon/human))
+ //Hilariously enough, running into a closet should make you get hit the hardest.
+ mob:hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
+ var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
+ mob.apply_effect(rads, IRRADIATE)
+
+ explode()
+
+ //Ok, 100% oxygen atmosphere = best reaction
+ //Maxes out at 100% oxygen pressure
+ var/oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0)
+
+ var/temp_factor = 100
+
+ if(oxygen > 0.8)
+ // with a perfect gas mix, make the power less based on heat
+ icon_state = "[base_icon_state]_glow"
+ else
+ // in normal mode, base the produced energy around the heat
+ temp_factor = 60
+ icon_state = base_icon_state
+
+ power = max( (removed.temperature * temp_factor / T0C) * oxygen + power, 0) //Total laser power plus an overload
+
+ //We've generated power, now let's transfer it to the collectors for storing/usage
+ transfer_energy()
+
+ var/device_energy = power * REACTION_POWER_MODIFIER
+
+ //To figure out how much temperature to add each tick, consider that at one atmosphere's worth
+ //of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature
+ //that the device energy is around 2140. At that stage, we don't want too much heat to be put out
+ //Since the core is effectively "cold"
+
+ //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock
+ //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall.
+ removed.temperature += (device_energy / THERMAL_RELEASE_MODIFIER)
+
+ removed.temperature = max(0, min(removed.temperature, 2500))
+
+ //Calculate how much gas to release
+ removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
+
+ removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
+
+ removed.update_values()
+
+ env.merge(removed)
+
+ for(var/mob/living/carbon/human/l in view(src, round(power ** 0.25))) // you have to be seeing the core to get hallucinations
+ if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
+ l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / get_dist(l, src) ) ) )
+
+ for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
+ var/rads = (power / 10) * sqrt( 1 / get_dist(l, src) )
+ l.apply_effect(rads, IRRADIATE)
+
+ power -= (power/500)**3
+
+ return 1
+
+
+/obj/machinery/power/supermatter/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.flag != "bullet")
+ power += Proj.damage * config_bullet_energy
+ else
+ damage += Proj.damage * config_bullet_energy
+ return 0
+
+
+/obj/machinery/power/supermatter/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+
+/obj/machinery/power/supermatter/attack_robot(mob/user as mob)
+ return attack_hand(user)
+
+
+/obj/machinery/power/supermatter/attack_hand(mob/user as mob)
+ user.visible_message("\The [user] reaches out and touches \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\
+ "You reach out and touch \the [src], everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\
+ "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")
+
+ Consume(user)
+
+/obj/machinery/power/supermatter/proc/transfer_energy()
+ for(var/obj/machinery/power/rad_collector/R in rad_collectors)
+ if(get_dist(R, src) <= 15) // Better than using orange() every process
+ R.receive_pulse(power)
+ return
+
+/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
+ user.visible_message("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\
+ "You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\
+ "Everything suddenly goes silent.")
+
+ user.drop_from_inventory(W)
+ Consume(W)
+
+ user.apply_effect(150, IRRADIATE)
+
+
+/obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj)
+ if(istype(AM, /mob/living))
+ AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\
+ "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\
+ "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")
+ else
+ AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.",\
+ "You hear a loud crack as you are washed with a wave of heat.")
+
+ Consume(AM)
+
+
+/obj/machinery/power/supermatter/proc/Consume(var/mob/living/user)
+ if(istype(user))
+ user.dust()
+ power += 200
+ else
+ del user
+
+ power += 200
+
+ //Some poor sod got eaten, go ahead and irradiate people nearby.
+ for(var/mob/living/l in range(10))
+ if(l in view())
+ l.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\
+ "The unearthly ringing subsides and you notice you have new radiation burns.", 2)
+ else
+ l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2)
+ var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) )
+ l.apply_effect(rads, IRRADIATE)
+
diff --git a/code/WorkInProgress/kilakk/fax.dm b/code/WorkInProgress/kilakk/fax.dm
index 7ab0440a6b..76bcc0baa4 100644
--- a/code/WorkInProgress/kilakk/fax.dm
+++ b/code/WorkInProgress/kilakk/fax.dm
@@ -1,19 +1,35 @@
+var/list/obj/machinery/faxmachine/allfaxes = list()
+var/list/alldepartments = list("Central Command")
+
/obj/machinery/faxmachine
name = "fax machine"
icon = 'icons/obj/library.dmi'
icon_state = "fax"
- req_access = list(access_lawyer)
+ req_one_access = list(access_lawyer, access_heads)
anchored = 1
density = 1
use_power = 1
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
+
var/obj/item/weapon/card/id/scan = null // identification
var/authenticated = 0
- var/obj/item/weapon/paper/tofax = null // what we're sending to central
+
+ var/obj/item/weapon/paper/tofax = null // what we're sending
var/sendcooldown = 0 // to avoid spamming fax messages
+ var/department = "Unknown" // our department
+
+ var/dpt = "Central Command" // the department we're sending to
+
+/obj/machinery/faxmachine/New()
+ ..()
+ allfaxes += src
+
+ if( !("[department]" in alldepartments) )
+ alldepartments += department
+
/obj/machinery/faxmachine/process()
return 0
@@ -26,7 +42,7 @@
/obj/machinery/faxmachine/attack_hand(mob/user as mob)
user.set_machine(src)
- var/dat = "Central Command Fax Machine
"
+ var/dat = "Fax Machine
"
var/scan_name
if(scan)
@@ -54,14 +70,15 @@
else
dat += "Send
"
- dat += "Currently sending: [tofax.name]"
+ dat += "Currently sending: [tofax.name]
"
+ dat += "Sending to: [dpt]
"
else
if(sendcooldown)
- dat += "Please insert paper to send to Central Command via secure connection.
"
+ dat += "Please insert paper to send via secure connection.
"
dat += "Transmitter arrays realigning. Please stand by.
"
else
- dat += "Please insert paper to send to Central Command via secure connection.
"
+ dat += "Please insert paper to send via secure connection.
"
else
dat += "Proper authentication is required to use this device.
"
@@ -76,10 +93,18 @@
/obj/machinery/faxmachine/Topic(href, href_list)
if(href_list["send"])
if(tofax)
- Centcomm_fax(tofax.info, tofax.name, usr)
- usr << "Message transmitted."
- sendcooldown = 1
- spawn(3000) // three minute cooldown. might mess with this number a bit as time goes on
+
+ if(dpt == "Central Command")
+ Centcomm_fax(tofax.info, tofax.name, usr)
+ sendcooldown = 1800
+
+ else
+ SendFax(tofax.info, tofax.name, usr, dpt)
+ sendcooldown = 600
+
+ usr << "Message transmitted successfully."
+
+ spawn(sendcooldown) // cooldown time
sendcooldown = 0
if(href_list["remove"])
@@ -107,6 +132,9 @@
scan = I
authenticated = 0
+ if(href_list["dept"])
+ dpt = input(usr, "Which department?", "Choose a department", "") as null|anything in alldepartments
+
if(href_list["auth"])
if ( (!( authenticated ) && (scan)) )
if (check_access(scan))
@@ -148,3 +176,20 @@
var/msg = "\blue CENTCOMM FAX: [key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (RPLY): Receiving '[sentname]' via secure connection ... view message"
admins << msg
+
+proc/SendFax(var/sent, var/sentname, var/mob/Sender, var/dpt)
+
+ for(var/obj/machinery/faxmachine/F in allfaxes)
+ if( F.department == dpt )
+ if(! (F.stat & (BROKEN|NOPOWER) ) )
+
+ flick("faxreceive", F)
+
+ // give the sprite some time to flick
+ spawn(20)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( F.loc )
+ P.name = "[sentname]"
+ P.info = "[sent]"
+ P.update_icon()
+
+ playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 297bdb890d..664b065d1c 100755
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -456,6 +456,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "fuel tank crate"
group = "Engineering"
+/datum/supply_packs/coolanttank
+ name = "Coolant tank crate"
+ contains = list(/obj/structure/reagent_dispensers/coolanttank)
+ cost = 16
+ containertype = /obj/structure/largecrate
+ containername = "coolant tank crate"
+ group = "Medical / Science"
+
/datum/supply_packs/solar
name = "Solar Pack crate"
contains = list(/obj/item/solar_assembly,
@@ -945,6 +953,25 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Engineering"
access = access_ce
+/datum/supply_packs/smbig
+ name = "Supermatter Core"
+ contains = list(/obj/machinery/power/supermatter)
+ cost = 50
+ containertype = /obj/structure/closet/crate/secure/plasma
+ containername = "Supermatter crate (CAUTIION)"
+ access = access_ce
+ group = "Engineering"
+
+
+/datum/supply_packs/smsmall
+ name = "Supermatter Shard"
+ contains = list(/obj/machinery/power/supermatter/shard)
+ cost = 25
+ containertype = /obj/structure/closet/crate/secure/plasma
+ containername = "Supermatter crate (CAUTIION)"
+ access = access_ce
+ group = "Engineering"
+
/datum/supply_packs/shield_cap
contains = list(/obj/item/weapon/circuitboard/shield_cap)
name = "Experimental shield capacitor circuitry"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 6695fe4402..fbf8001483 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -179,18 +179,23 @@
/area/proc/updateicon()
if ((fire || eject || party) && ((!requires_power)?(!requires_power):power_environ))//If it doesn't require power, can still activate this proc.
if(fire && !eject && !party)
- icon_state = "blue"
+ icon_state = "red"
+ blend_mode = BLEND_MULTIPLY
/*else if(atmosalm && !fire && !eject && !party)
icon_state = "bluenew"*/
else if(!fire && eject && !party)
icon_state = "red"
+ blend_mode = BLEND_MULTIPLY
else if(party && !fire && !eject)
icon_state = "party"
+ blend_mode = BLEND_MULTIPLY
else
icon_state = "blue-red"
+ blend_mode = BLEND_MULTIPLY
else
// new lighting behaviour with obj lights
icon_state = null
+ blend_mode = BLEND_DEFAULT
/*
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index c50767d2f5..f1a0fd2e26 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -26,6 +26,7 @@
supervisors = "your laws and the AI" //Nodrak
selection_color = "#ddffdd"
minimal_player_age = 21
+ alt_titles = list("Android", "Robot")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 2db4c1594e..477fd67cab 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -28,6 +28,7 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/surgicaldrill(),\
new /obj/item/weapon/retractor(),\
new /obj/item/weapon/cautery(),\
+ new /obj/item/weapon/hemostat(),\
new /obj/item/weapon/reagent_containers/glass/beaker(), \
new /obj/item/weapon/reagent_containers/glass/beaker/large(), \
new /obj/item/weapon/reagent_containers/glass/beaker/vial(), \
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 8cee9f811c..911ccace95 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -152,7 +152,7 @@
carddesc += ""
carddesc += ""
carddesc += "Stored account number: "
- carddesc += ""
+ carddesc += ""
carddesc += ""
carddesc += "Assignment: "
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 1476b13d0a..20415b6721 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -148,6 +148,14 @@
else if(istype(W, /obj/item/weapon/card) && currently_vending)
var/obj/item/weapon/card/I = W
scan_card(I)
+
+ else if(src.panel_open)
+
+ for(var/datum/data/vending_product/R in product_records)
+ if(istype(W, R.product_path))
+ stock(R, user)
+ del(W)
+
else
..()
@@ -407,6 +415,13 @@
src.updateUsrDialog()
+/obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user)
+ if(src.panel_open)
+ user << "\blue You stock the [src] with \a [R.product_name]"
+ R.amount++
+
+ src.updateUsrDialog()
+
/obj/machinery/vending/process()
if(stat & (BROKEN|NOPOWER))
return
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index a7e6d57bb3..30fcfbdd49 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -2,6 +2,8 @@
* Contains:
* Glass sheets
* Reinforced glass sheets
+ * Plasma Glass Sheets
+ * Reinforced Plasma Glass Sheets (AKA Holy fuck strong windows)
* Glass shards - TODO: Move this into code/game/object/item/weapons
*/
@@ -15,6 +17,7 @@
icon_state = "sheet-glass"
g_amt = 3750
origin_tech = "materials=1"
+ var/created_window = /obj/structure/window/basic
/obj/item/stack/sheet/glass/attack_self(mob/user as mob)
@@ -81,9 +84,8 @@
if(!found)
dir_to_set = direction
break
-
var/obj/structure/window/W
- W = new /obj/structure/window/basic( user.loc, 0 )
+ W = new created_window( user.loc, 0 )
W.dir = dir_to_set
W.ini_dir = W.dir
W.anchored = 0
@@ -98,7 +100,7 @@
user << "\red There is a window in the way."
return 1
var/obj/structure/window/W
- W = new /obj/structure/window/basic( user.loc, 0 )
+ W = new created_window( user.loc, 0 )
W.dir = SOUTHWEST
W.ini_dir = SOUTHWEST
W.anchored = 0
@@ -293,3 +295,54 @@
H.UpdateDamageIcon()
H.updatehealth()
..()
+
+
+
+
+/*
+ * Plasma Glass sheets
+ */
+/obj/item/stack/sheet/glass/plasmaglass
+ name = "plasma glass"
+ desc = "A very strong and very resistant sheet of a plasma-glass alloy."
+ singular_name = "glass sheet"
+ icon_state = "sheet-plasmaglass"
+ g_amt = 7500
+ origin_tech = "materials=3;plasma=2"
+ created_window = /obj/structure/window/plasmabasic
+
+/obj/item/stack/sheet/glass/plasmaglass/attack_self(mob/user as mob)
+ construct_window(user)
+
+/obj/item/stack/sheet/glass/plasmaglass/attackby(obj/item/W, mob/user)
+ ..()
+ if( istype(W, /obj/item/stack/rods) )
+ var/obj/item/stack/rods/V = W
+ var/obj/item/stack/sheet/glass/plasmarglass/RG = new (user.loc)
+ RG.add_fingerprint(user)
+ RG.add_to_stacks(user)
+ V.use(1)
+ var/obj/item/stack/sheet/glass/G = src
+ src = null
+ var/replace = (user.get_inactive_hand()==G)
+ G.use(1)
+ if (!G && !RG && replace)
+ user.put_in_hands(RG)
+ else
+ return ..()
+
+/*
+ * Reinforced plasma glass sheets
+ */
+/obj/item/stack/sheet/glass/plasmarglass
+ name = "reinforced plasma glass"
+ desc = "Plasma glass which seems to have rods or something stuck in them."
+ singular_name = "reinforced plasma glass sheet"
+ icon_state = "sheet-plasmarglass"
+ g_amt = 7500
+ m_amt = 1875
+ origin_tech = "materials=4;plasma=2"
+ created_window = /obj/structure/window/plasmareinforced
+
+/obj/item/stack/sheet/glass/plasmarglass/attack_self(mob/user as mob)
+ construct_window(user)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index ee6f96161a..937e22975e 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -122,7 +122,8 @@
Step eight: Put in the new, full power cell - if you don't have one, continue with step 15.
Step nine: Quickly put on a Radiation suit.
Step ten: Check if the singularity field generators withstood the down-time - if they didn't, continue with step 15.
- Step eleven: Since disaster was averted you now have to ensure it doesn't repeat. If it was a powersink which caused it and if the engineering apc is wired to the same powernet, which the powersink is on, you have to remove the piece of wire which links the apc to the powernet. If it wasn't a powersink which caused it, then skip to step 14.
+ Step eleven: Since disaster was averted you now have to ensure it doesn't repeat. If it was a powersink which caused it and if the engineering apc is wired to the same powernet,
+ which the powersink is on, you have to remove the piece of wire which links the apc to the powernet. If it wasn't a powersink which caused it, then skip to step 14.
Step twelve: Grab your crowbar and pry away the tile closest to the APC.
Step thirteen: Use the wirecutters to cut the wire which is conecting the grid to the terminal.
Step fourteen: Go to the bar and tell the guys how you saved them all. Stop reading this guide here.
@@ -189,7 +190,9 @@
If you’ve gotten this far, congratulations! You have mastered the art of cloning. Now, the real problem is how to resurrect yourself after that traitor had his way with you for cloning his target. @@ -248,7 +265,7 @@ /obj/item/weapon/book/manual/ripley_build_and_repair name = "APLU \"Ripley\" Construction and Operation Manual" icon_state ="book" - author = "Weyland-Yutani Corp" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + author = "Randall Varn, Einstein Engines Senior Mechanic" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned title = "APLU \"Ripley\" Construction and Operation Manual" dat = {" @@ -347,23 +364,38 @@ Those are the basic steps to furthing science. What do you do science with, however? Well, you have four major tools: R&D Console, the Destructive Analyzer, the Protolathe, and the Circuit Imprinter.