diff --git a/baystation12.dme b/baystation12.dme
index 438295c7e70..f12daf760b0 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -167,7 +167,6 @@
#define FILE_DIR "code/WorkInProgress/animusstation"
#define FILE_DIR "code/WorkInProgress/Apples"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/BirdMan"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Tajara"
@@ -1126,6 +1125,7 @@
#include "code\modules\recycling\disposal-construction.dm"
#include "code\modules\recycling\disposal.dm"
#include "code\modules\recycling\sortingmachinery.dm"
+#include "code\modules\research\artifacts.dm"
#include "code\modules\research\circuitprinter.dm"
#include "code\modules\research\designs.dm"
#include "code\modules\research\destructive_analyzer.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/sculpture.dm b/code/WorkInProgress/Cael_Aislinn/sculpture.dm
index b380091a732..9dde8b37dd1 100644
--- a/code/WorkInProgress/Cael_Aislinn/sculpture.dm
+++ b/code/WorkInProgress/Cael_Aislinn/sculpture.dm
@@ -257,4 +257,7 @@
/mob/living/simple_animal/sculpture/Bumped(atom/movable/AM as mob, yes)
if(!G)
- GrabMob(AM)
\ No newline at end of file
+ GrabMob(AM)
+
+/mob/living/simple_animal/sculpture/ex_act(var/severity)
+ //nothing
\ No newline at end of file
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index c9fcec5e234..29f1ac90dd3 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -72,6 +72,7 @@
var/mineralAmtList = list("Uranium" = 5, "Iron" = 5, "Diamond" = 5, "Gold" = 5, "Silver" = 5, "Plasma" = 5/*, "Adamantine" = 5*/)
var/mineralSpawnChanceList = list("Uranium" = 5, "Iron" = 50, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Plasma" = 25/*, "Adamantine" =5*/)//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 10 //means 10% chance of this plot changing to a mineral deposit
+ var/artifactChance = 1
/turf/simulated/mineral/random/New()
..()
@@ -98,6 +99,11 @@
if(M)
src = M
M.levelupdate()
+
+ else if (prob(artifactChance))
+ //spawn a rare, xeno-archaelogical artifact here
+ new/obj/machinery/artifact(src)
+
return
/turf/simulated/mineral/random/high_chance
diff --git a/code/modules/research/artifacts.dm b/code/modules/research/artifacts.dm
new file mode 100644
index 00000000000..c4936e369eb
--- /dev/null
+++ b/code/modules/research/artifacts.dm
@@ -0,0 +1,912 @@
+//Part of ISaidNo's public release around July 2011(ish)
+//much thanks from everyone
+
+// this goes in gameticker.dm's setup() proc and works in conjuction with landmarks manually placed on the map
+ /*var/list/artispawn = list()
+ for(var/obj/landmark/S in world)
+ if (S.name == "Artifact spawn")
+ artispawn.Add(S.loc)
+ if(artispawn.len)
+ var/artiamt = rand(2,8)
+ while(artiamt > 0)
+ var/artiloc = pick(artispawn)
+ if (prob(66)) new/obj/machinery/artifact(artiloc)
+ --artiamt*/
+
+// this is the entirety of artifacts.dm
+
+// Artifact Research - these are used in the research system, depending on how yours is set up these could probably be
+// ignored if not incorporatable
+/*
+/datum/artiresearch/
+ var/name = "artifact research"
+ var/bonustype = null // What kind of artifact it gives a bonus to identifying
+ var/bonusamtO = 0 // Bonus % to identifying origin
+ var/bonusamtT = 0 // Bonus % to identifying trigger
+ var/bonusamtE = 0 // Bonus % to identifying effect/range
+ var/bonusTime = 0 // Seconds reduced from analysis time
+
+/datum/artiresearch/ancient1
+ name = "Ancient Artifacts"
+ bonustype = "ancient"
+ bonusamtO = 75
+ bonusamtT = 5
+ bonusamtE = 5
+
+/datum/artiresearch/martian1
+ name = "Martian Artifacts"
+ bonustype = "martian"
+ bonusamtO = 75
+ bonusamtT = 5
+ bonusamtE = 5
+
+/datum/artiresearch/crystal1
+ name = "Wizard Artifacts"
+ bonustype = "wizard"
+ bonusamtO = 75
+ bonusamtT = 5
+ bonusamtE = 5
+
+/datum/artiresearch/eldritch1
+ name = "Eldritch Artifacts"
+ bonustype = "eldritch"
+ bonusamtO = 75
+ bonusamtT = 5
+ bonusamtE = 5
+
+/datum/artiresearch/precursor1
+ name = "Precursor Artifacts"
+ bonustype = "precursor"
+ bonusamtO = 75
+ bonusamtT = 5
+ bonusamtE = 5
+
+/datum/artiresearch/general1
+ name = "General Artifacts"
+ bonustype = "all"
+ bonusamtO = 15
+ bonusamtT = 5
+ bonusamtE = 5
+
+/datum/artiresearch/analyser1
+ name = "Analysis Algorithms"
+ bonustype = "analyser"
+ bonusTime = 10
+
+/datum/artiresearch/ancient2
+ name = "Ancient Mechanisms"
+ bonustype = "ancient"
+ bonusamtO = 10
+ bonusamtT = 75
+ bonusamtE = 5
+
+/datum/artiresearch/martian2
+ name = "Martian Bio-triggers"
+ bonustype = "martian"
+ bonusamtO = 10
+ bonusamtT = 75
+ bonusamtE = 5
+
+/datum/artiresearch/crystal2
+ name = "Wizard Rituals"
+ bonustype = "wizard"
+ bonusamtO = 10
+ bonusamtT = 75
+ bonusamtE = 5
+
+/datum/artiresearch/eldritch2
+ name = "Eldritch Invocations"
+ bonustype = "eldritch"
+ bonusamtO = 10
+ bonusamtT = 75
+ bonusamtE = 5
+
+/datum/artiresearch/precursor2
+ name = "Precursor Sequencing"
+ bonustype = "precursor"
+ bonusamtO = 10
+ bonusamtT = 75
+ bonusamtE = 5
+
+/datum/artiresearch/general2
+ name = "General Activation Procedure"
+ bonustype = "all"
+ bonusamtO = 5
+ bonusamtT = 15
+ bonusamtE = 5
+
+/datum/artiresearch/analyser2
+ name = "Advanced Analysis Software"
+ bonustype = "analyser"
+ bonusTime = 10
+
+/datum/artiresearch/ancient3
+ name = "Ancient Technology"
+ bonustype = "ancient"
+ bonusamtO = 10
+ bonusamtT = 15
+ bonusamtE = 80
+
+/datum/artiresearch/martian3
+ name = "Martian Bioengineering"
+ bonustype = "martian"
+ bonusamtO = 10
+ bonusamtT = 15
+ bonusamtE = 80
+
+/datum/artiresearch/crystal3
+ name = "Wizard Enchantments"
+ bonustype = "wizard"
+ bonusamtO = 10
+ bonusamtT = 15
+ bonusamtE = 80
+
+/datum/artiresearch/eldritch3
+ name = "Eldritch Curses"
+ bonustype = "eldritch"
+ bonusamtO = 10
+ bonusamtT = 15
+ bonusamtE = 80
+
+/datum/artiresearch/precursor3
+ name = "Precursor Circuits"
+ bonustype = "precursor"
+ bonusamtO = 10
+ bonusamtT = 15
+ bonusamtE = 80
+
+/datum/artiresearch/general3
+ name = "General Power Capacity"
+ bonustype = "all"
+ bonusamtO = 5
+ bonusamtT = 5
+ bonusamtE = 15
+
+/datum/artiresearch/analyser3
+ name = "High-Grade Analysis Process"
+ bonustype = "analyser"
+ bonusTime = 15
+ */
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// the actual code for artifacts
+
+/obj/machinery/artifact
+ name = "alien artifact"
+ desc = "A large alien device."
+ icon = 'anomaly.dmi'
+ icon_state = "ano0"
+ anchored = 0
+ density = 1
+ var/activated = 0 // Whether or not the artifact has been unlocked.
+ var/charged = 1 // Whether the artifact is ready to have it's effect.
+ var/chargetime = 0 // How much time until the artifact is charged.
+ var/recharge = 5 // How long does it take this artifact to recharge?
+ var/origin = null // Used in the randomisation/research of the artifact.
+ var/trigger = "touch" // What activates it?
+ var/triggerX = "none" // Used for more varied triggers
+ var/effecttype = "healing" // What does it do?
+ var/effectmode = "aura" // How does it carry out the effect?
+ var/aurarange = 4 // How far the artifact will extend an aura effect.
+
+ New()
+ ..()
+ // Origin and appearance randomisation
+ // cael - need some more icons
+ src.origin = pick("ancient","martian","wizard","eldritch","precursor")
+ switch(src.origin)
+ if("ancient") src.icon_state = pick("ano2")
+ if("martian") src.icon_state = pick("ano4")
+ if("wizard") src.icon_state = pick("ano0","ano1")
+ if("eldritch") src.icon_state = pick("ano3")
+ if("precursor") src.icon_state = pick("ano5")
+ // Low-ish random chance to not look like it's origin
+ if(prob(20)) src.icon_state = pick("ano0","ano1","ano2","ano3","ano4","ano5")
+ // Power randomisation
+ src.trigger = pick("force","energy","chemical","heat")
+ if (src.trigger == "chemical") src.triggerX = pick("hydrogen","corrosive","volatile","toxic")
+ // Ancient Artifacts focus on robotic/technological effects
+ // Martian Artifacts focus on biological effects
+ // Wizard Artifacts focus on weird shit
+ // Eldritch Artifacts are 100% bad news
+ // Precursor Artifacts do everything
+ switch(src.origin)
+ if("ancient") src.effecttype = pick("roboheal","robohurt","cellcharge","celldrain")
+ if("martian") src.effecttype = pick("healing","injure","stun","planthelper")
+ if("wizard") src.effecttype = pick("stun","forcefield","teleport")
+ if("eldritch") src.effecttype = pick("injure","stun","robohurt","celldrain")
+ if("precursor") src.effecttype = pick("healing","injure","stun","roboheal","robohurt","cellcharge","celldrain","planthelper","forcefield","teleport")
+ // Select range based on the power
+ var/canworldpulse = 1
+ switch(src.effecttype)
+ if("healing") src.effectmode = pick("aura","pulse","contact")
+ if("injure") src.effectmode = pick("aura","pulse","contact")
+ if("stun") src.effectmode = pick("aura","pulse","contact")
+ if("roboheal") src.effectmode = pick("aura","pulse","contact")
+ if("robohurt") src.effectmode = pick("aura","pulse","contact")
+ if("cellcharge") src.effectmode = pick("aura","pulse")
+ if("celldrain") src.effectmode = pick("aura","pulse")
+ if("planthelper")
+ src.effectmode = pick("aura","pulse")
+ canworldpulse = 0
+ if("forcefield")
+ src.effectmode = "contact"
+ canworldpulse = 0
+ if("teleport") src.effectmode = pick("pulse","contact")
+ // Recharge timer & range setup
+ if (src.effectmode == "aura") src.aurarange = rand(1,4)
+ if (src.effectmode == "contact")
+ src.recharge = rand(5,15)
+ if (src.effectmode == "pulse")
+ src.aurarange = rand(2,14)
+ src.recharge = rand(5,20)
+ if (canworldpulse == 1 && prob(1))
+ src.effectmode = "worldpulse"
+ src.recharge = rand(40,120)
+
+ attack_hand(var/mob/user as mob)
+ if (istype(user, /mob/living/silicon/ai) || istype(user, /mob/dead/)) return
+ if (istype(user, /mob/living/silicon/robot))
+ if (get_dist(user, src) > 1)
+ user << "\red You can't reach [src] from here."
+ return
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[] touches [].", user, src), 1)
+ src.add_fingerprint(user)
+ src.Artifact_Contact(user)
+
+ attackby(obj/item/weapon/W as obj, mob/living/user as mob)
+ /*if (istype(W, /obj/item/weapon/cargotele))
+ W:cargoteleport(src, user)
+ return*/
+ if (src.trigger == "chemical" && istype(W, /obj/item/weapon/reagent_containers/))
+ switch(src.triggerX)
+ if("hydrogen")
+ if (W.reagents.has_reagent("hydrogen") || W.reagents.has_reagent("water")) src.Artifact_Activate()
+ if("corrosive")
+ if (W.reagents.has_reagent("acid") || W.reagents.has_reagent("pacid") || W.reagents.has_reagent("diethylamine")) src.Artifact_Activate()
+ if("volatile")
+ if (W.reagents.has_reagent("plasma") || W.reagents.has_reagent("thermite")) src.Artifact_Activate()
+ if("toxic")
+ if (W.reagents.has_reagent("toxin") || W.reagents.has_reagent("cyanide") || W.reagents.has_reagent("amanitin") || W.reagents.has_reagent("neurotoxin")) src.Artifact_Activate()
+ ..()
+ if (src.trigger == "force" && W.force >= 30 && !src.activated) src.Artifact_Activate()
+ if (src.trigger == "energy")
+ if (istype(W,/obj/item/weapon/melee/baton) && W:status) src.Artifact_Activate()
+ if (istype(W,/obj/item/weapon/melee/energy)) src.Artifact_Activate()
+ if (istype(W,/obj/item/weapon/melee/cultblade)) src.Artifact_Activate()
+ if (istype(W,/obj/item/weapon/gun/energy/)) src.Artifact_Activate()
+ if (istype(W,/obj/item/device/multitool)) src.Artifact_Activate()
+ if (istype(W,/obj/item/weapon/card/emag)) src.Artifact_Activate()
+ if (src.trigger == "heat")
+ if (istype(W,/obj/item/weapon/match) && W:lit) src.Artifact_Activate()
+ if (istype(W, /obj/item/weapon/weldingtool) && W:welding) src.Artifact_Activate()
+ if (istype(W, /obj/item/weapon/lighter) && W:lit) src.Artifact_Activate()
+
+ //Bump(atom/A)
+
+ Bumped(M as mob|obj)
+ if (istype(M,/obj/item/weapon/) && src.trigger == "force" && M:throwforce >= 30) src.Artifact_Activate()
+
+ bullet_act(var/obj/item/projectile/P)
+ if (src.trigger == "force")
+ if(istype(P,/obj/item/projectile/bullet)) src.Artifact_Activate()
+ else if(istype(P,/obj/item/projectile/hivebotbullet)) src.Artifact_Activate()
+ if (src.trigger == "energy")
+ if(istype(P,/obj/item/projectile/beam)) src.Artifact_Activate()
+ else if(istype(P,/obj/item/projectile/ion)) src.Artifact_Activate()
+ else if(istype(P,/obj/item/projectile/energy)) src.Artifact_Activate()
+ else if(istype(P,/obj/item/projectile/bluetag)) src.Artifact_Activate()
+ else if(istype(P,/obj/item/projectile/redtag)) src.Artifact_Activate()
+ if (src.trigger == "heat")
+ if(istype(P,/obj/item/projectile/temp)) src.Artifact_Activate()
+
+ ex_act(severity)
+ switch(severity)
+ if(1.0) del src
+ if(2.0)
+ if (prob(50)) del src
+ if (src.trigger == "force") src.Artifact_Activate()
+ if (src.trigger == "heat") src.Artifact_Activate()
+ if(3.0)
+ if (src.trigger == "force") src.Artifact_Activate()
+ if (src.trigger == "heat") src.Artifact_Activate()
+ return
+
+ temperature_expose(null, temp, volume)
+ if (src.trigger == "heat") src.Artifact_Activate()
+
+ process()
+ ..()
+ if (!src.activated) return
+ if (src.chargetime > 0)
+ src.chargetime--
+ else src.charged = 1
+ if (src.effectmode == "aura")
+ switch(src.effecttype)
+ if("healing")
+ for (var/mob/living/carbon/M in range(src.aurarange,src))
+ if(prob(10)) M << "\blue You feel a soothing energy radiating from something nearby."
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ M.adjustToxLoss(-1)
+ M.adjustOxyLoss(-1)
+ M.adjustBrainLoss(-1)
+ if("injure")
+ for (var/mob/living/carbon/M in range(src.aurarange,src))
+ if(prob(10)) M << "\red You feel a painful force radiating from something nearby."
+ M.adjustBruteLoss(1)
+ M.adjustFireLoss(1)
+ M.adjustToxLoss(1)
+ M.adjustOxyLoss(1)
+ M.adjustBrainLoss(1)
+ if("stun")
+ for (var/mob/living/carbon/M in range(src.aurarange,src))
+ if(prob(10)) M << "\red Energy radiating from the [src] is making you feel numb."
+ if(prob(20))
+ M << "\red Your body goes numb for a moment."
+ M.stunned += 2
+ M.weakened += 2
+ M.stuttering += 2
+ if("roboheal")
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ if(prob(10)) M << "\blue SYSTEM ALERT: Beneficial energy field detected!"
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ M.updatehealth()
+ if("robohurt")
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ if(prob(10)) M << "\red SYSTEM ALERT: Harmful energy field detected!"
+ M.adjustBruteLoss(1)
+ M.adjustFireLoss(1)
+ if("cellcharge")
+ for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/B in C.contents)
+ B.charge += 10
+ for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge += 20
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/D in M.contents)
+ D.charge += 10
+ if(prob(10)) M << "\blue SYSTEM ALERT: Energy boosting field detected!"
+ if("celldrain")
+ for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/B in C.contents)
+ B.charge -= 10
+ for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge -= 20
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/D in M.contents)
+ D.charge -= 10
+ if(prob(10)) M << "\red SYSTEM ALERT: Energy draining field detected!"
+ if("planthelper")
+ for (var/obj/machinery/hydroponics/H in range(src.aurarange,src))
+ //makes weeds and shrooms and stuff more potent too
+ if(H.planted)
+ H.waterlevel += 2
+ H.nutrilevel += 2
+ if(H.toxic > 0)
+ H.toxic -= 1
+ H.health += 1
+ if(H.pestlevel > 0)
+ H.pestlevel -= 1
+ if(H.weedlevel > 0)
+ H.weedlevel -= 1
+ H.lastcycle += 5
+ if (src.effectmode == "pulse")
+ if (!src.charged) return
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[] emits a pulse of energy!", src), 1)
+ switch(src.effecttype)
+ if("healing")
+ for (var/mob/living/carbon/M in range(src.aurarange,src))
+ M << "\blue A wave of energy invigorates you."
+ M.adjustBruteLoss(5)
+ M.adjustFireLoss(5)
+ M.adjustToxLoss(5)
+ M.adjustOxyLoss(5)
+ M.adjustBrainLoss(5)
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("injure")
+ for (var/mob/living/carbon/M in range(src.aurarange,src))
+ M << "\red A wave of energy causes you great pain!"
+ M.adjustBruteLoss(5)
+ M.adjustFireLoss(5)
+ M.adjustToxLoss(5)
+ M.adjustOxyLoss(5)
+ M.adjustBrainLoss(5)
+ M.stunned += 3
+ M.weakened += 3
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("stun")
+ for (var/mob/living/carbon/M in range(src.aurarange,src))
+ M << "\red A wave of energy overwhelms your senses!"
+ M.paralysis += 3
+ M.stunned += 4
+ M.weakened += 4
+ M.stuttering += 4
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("roboheal")
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ M << "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!"
+ M.adjustBruteLoss(-10)
+ M.adjustFireLoss(-10)
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("robohurt")
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ M << "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!"
+ M.adjustBruteLoss(10)
+ M.adjustFireLoss(10)
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("cellcharge")
+ for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/B in C.contents)
+ B.charge += 250
+ for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge += 400
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/D in M.contents)
+ D.charge += 250
+ M << "\blue SYSTEM ALERT: Large energy boost detected!"
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("celldrain")
+ for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/B in C.contents)
+ B.charge -= 500
+ for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge -= 400
+ for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
+ for (var/obj/item/weapon/cell/D in M.contents)
+ D.charge -= 500
+ M << "\red SYSTEM ALERT: Severe energy drain detected!"
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("planthelper")
+ //makes weeds and shrooms and stuff more potent too
+ for (var/obj/machinery/hydroponics/H in range(src.aurarange,src))
+ if(H.planted)
+ H.dead = 0
+ H.waterlevel = 200
+ H.nutrilevel = 200
+ H.toxic = 0
+ H.health = 100
+ H.pestlevel = 0
+ H.weedlevel = 0
+ H.lastcycle = H.cycledelay
+ if("teleport")
+ for (var/mob/living/M in range(src.aurarange,src))
+ var/list/randomturfs = new/list()
+ for(var/turf/T in orange(M, 30))
+ if(!istype(T, /turf/simulated/floor) || T.density)
+ continue
+ randomturfs.Add(T)
+ if(randomturfs.len > 0)
+ M << "\red You are displaced by a strange force!"
+ M.loc = pick(randomturfs)
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, get_turf(src)) //no idea what the 0 is
+ sparks.start()
+ src.charged = 0
+ src.chargetime = src.recharge
+ if (src.effectmode == "worldpulse")
+ if (!src.charged) return
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[] emits a powerful burst of energy!", src), 1)
+ switch(src.effecttype)
+ if("healing")
+ for (var/mob/living/carbon/M in world)
+ M << "\blue Waves of soothing energy wash over you."
+ M.adjustBruteLoss(-3)
+ M.adjustFireLoss(-3)
+ M.adjustToxLoss(-3)
+ M.adjustOxyLoss(-3)
+ M.adjustBrainLoss(-3)
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("injure")
+ for (var/mob/living/carbon/M in world)
+ M << "\red A wave of painful energy strikes you!"
+ M.adjustBruteLoss(3)
+ M.adjustFireLoss(3)
+ M.adjustToxLoss(3)
+ M.adjustOxyLoss(3)
+ M.adjustBrainLoss(3)
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("stun")
+ for (var/mob/living/carbon/M in world)
+ M << "\red A powerful force causes you to black out momentarily."
+ M.paralysis += 5
+ M.stunned += 8
+ M.weakened += 8
+ M.stuttering += 8
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("roboheal")
+ for (var/mob/living/silicon/robot/M in world)
+ M << "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!"
+ M.adjustBruteLoss(-5)
+ M.adjustFireLoss(-5)
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("robohurt")
+ for (var/mob/living/silicon/robot/M in world)
+ M << "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!"
+ M.adjustBruteLoss(5)
+ M.adjustFireLoss(5)
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("cellcharge")
+ for (var/obj/machinery/power/apc/C in world)
+ for (var/obj/item/weapon/cell/B in C.contents)
+ B.charge += 100
+ for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge += 250
+ for (var/mob/living/silicon/robot/M in world)
+ for (var/obj/item/weapon/cell/D in M.contents)
+ D.charge += 100
+ M << "\blue SYSTEM ALERT: Energy boost detected!"
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("celldrain")
+ for (var/obj/machinery/power/apc/C in world)
+ for (var/obj/item/weapon/cell/B in C.contents)
+ B.charge -= 250
+ for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge -= 250
+ for (var/mob/living/silicon/robot/M in world)
+ for (var/obj/item/weapon/cell/D in M.contents)
+ D.charge -= 250
+ M << "\red SYSTEM ALERT: Energy drain detected!"
+ src.charged = 0
+ src.chargetime = src.recharge
+ if("teleport")
+ for (var/mob/living/M in world)
+ var/list/randomturfs = new/list()
+ for(var/turf/T in orange(M, 15))
+ if(!istype(T, /turf/simulated/floor) || T.density)
+ continue
+ randomturfs.Add(T)
+ if(randomturfs.len > 0)
+ M << "\red You are displaced by a strange force!"
+ M.loc = pick(randomturfs)
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, get_turf(src)) //no idea what the 0 is
+ sparks.start()
+ src.charged = 0
+ src.chargetime = src.recharge
+
+/obj/machinery/artifact/proc/Artifact_Activate()
+ src.activated = 1
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[] activates!", src), 1)
+ var/artioverlay = src.icon_state + "-[rand(1,3)]"
+ src.overlays += image('artifacts.dmi', artioverlay)
+
+/obj/machinery/artifact/proc/Artifact_Contact(var/mob/user as mob)
+ // Trigger Code
+ if (istype (user,/mob/living/carbon/) && src.trigger == "touch" && !src.activated) src.Artifact_Activate()
+ else if (src.trigger != "touch" && !src.activated) user << "Nothing happens."
+ // Effect Code
+ if (src.effectmode == "contact" && src.activated && src.charged)
+ switch(src.effecttype)
+ if("healing")
+ if (istype(user, /mob/living/carbon/human/))
+ user << "\blue You feel a soothing energy invigorate you."
+
+ var/mob/living/carbon/human/H = user
+ for(var/A in H.organs)
+ var/datum/organ/external/affecting = null
+ if(!H.organs[A]) continue
+ affecting = H.organs[A]
+ if(!istype(affecting, /datum/organ/external)) continue
+ affecting.heal_damage(25, 25) //fixes getting hit after ingestion, killing you when game updates organ health
+ for(var/datum/organ/wound/W in affecting.wounds)
+ W.stopbleeding()
+ W.is_healing = 1
+ //user:heal_organ_damage(25, 25)
+ //
+ user.adjustOxyLoss(-25)
+ user.adjustToxLoss(-25)
+ user.adjustBruteLoss(-25)
+ user.adjustFireLoss(-25)
+ user.adjustBrainLoss(-25)
+ user.radiation -= min(user.radiation, 25)
+ user.nutrition += 50
+ H.bodytemperature = initial(H.bodytemperature)
+ //
+ H.vessel.add_reagent("blood",50)
+ spawn(1)
+ H.fixblood()
+ H.update_body()
+ H.update_face()
+ H.UpdateDamageIcon()
+ //
+ src.charged = 0
+ src.chargetime = src.recharge
+ else user << "Nothing happens."
+ if("injure")
+ if (istype(user, /mob/living/carbon/))
+ user << "\red A painful discharge of energy strikes you!"
+ user.adjustOxyLoss(25)
+ user.adjustToxLoss(25)
+ user.adjustBruteLoss(25)
+ user.adjustFireLoss(25)
+ user.adjustBrainLoss(25)
+ user.radiation += 25
+ user.nutrition -= min(50, user.nutrition)
+ user.stunned += 6
+ user.weakened += 6
+ src.charged = 0
+ src.chargetime = src.recharge
+ else user << "Nothing happens."
+ if("stun")
+ if (istype(user, /mob/living/carbon/))
+ user << "\red A powerful force overwhelms your consciousness."
+ user.paralysis += 30
+ user.stunned += 45
+ user.weakened += 45
+ user.stuttering += 45
+ src.charged = 0
+ src.chargetime = src.recharge
+ else user << "Nothing happens."
+ if("roboheal")
+ if (istype(user, /mob/living/silicon/robot))
+ user << "\blue Your systems report damaged components mending by themselves!"
+ user.adjustBruteLoss(-30)
+ user.adjustFireLoss(-30)
+ src.charged = 0
+ src.chargetime = src.recharge
+ else user << "Nothing happens."
+ if("robohurt")
+ if (istype(user, /mob/living/silicon/robot))
+ user << "\red Your systems report severe damage has been inflicted!"
+ user.adjustBruteLoss(40)
+ user.adjustFireLoss(40)
+ src.charged = 0
+ src.chargetime = src.recharge
+ else user << "Nothing happens."
+ if("forcefield")
+ var/obj/effect/energy_field/E = new /obj/effect/energy_field(locate(src.x + 2,src.y,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x + 2,src.y + 1,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x + 2,src.y + 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x + 2,src.y - 1,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x + 2,src.y - 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x - 2,src.y,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x - 2,src.y + 1,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x - 2,src.y + 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x - 2,src.y - 1,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x - 2,src.y - 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x,src.y + 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x + 1,src.y + 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x - 1,src.y + 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x,src.y - 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x + 1,src.y - 2,src.z))
+ E.strength = 1
+ E = new /obj/effect/energy_field(locate(src.x - 1,src.y - 2,src.z))
+ E.strength = 1
+ src.charged = 0
+ src.chargetime = src.recharge
+ spawn (src.recharge)
+ for(var/obj/effect/energy_field/F in range(5,src))
+ del F
+ if("teleport")
+ var/list/randomturfs = new/list()
+ for(var/turf/T in orange(user, 50))
+ if(!istype(T, /turf/simulated/floor) || T.density)
+ continue
+ randomturfs.Add(T)
+ if(randomturfs.len > 0)
+ user << "\red You are suddenly zapped away elsewhere!"
+ user.loc = pick(randomturfs)
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, get_turf(src)) //no idea what the 0 is
+ sparks.start()
+
+ else if (src.effectmode == "contact" && src.activated && !src.charged) user << "The artifact feels warm, but nothing interesting happens."
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*
+/obj/submachine/artifact_analyser
+ name = "Artifact Analyser"
+ desc = "Studies the structure of artifacts to discover their uses."
+ icon = 'artifacts.dmi'
+ icon_state = "AAn-off"
+ anchored = 1
+ density = 1
+ var/working = 0
+ var/accuO = 0
+ var/accuT = 0
+ var/accuE1 = 0
+ var/accuE2 = 0
+ var/aorigin = "None"
+ var/atrigger = "None"
+ var/aeffect1 = "None"
+ var/aeffect2 = "None"
+ var/list/allorigins = list("Ancient Robots","Martian","Wizard Federation","Extradimensional","Precursor")
+ var/list/alltriggers = list("Contact with Living Organism","Heavy Impact","Contact with Energy Source","Contact with Hydrogen","Contact with Corrosive Substance","Contact with Volatile Substance","Contact with Toxins","Exposure to Heat")
+ var/list/alleffects = list("Healing Device","Anti-biological Weapon","Non-lethal Stunning Trap","Mechanoid Repair Module","Mechanoid Deconstruction Device","Power Generator","Power Drain","Stellar Mineral Attractor","Agriculture Regulator","Shield Generator","Space-Time Displacer")
+ var/list/allranges = list("Constant Short-Range Energy Field","Medium Range Energy Pulses","Long Range Energy Pulses","Extreme Range Energy Pulses","Requires contact with subject")
+
+ attack_hand(var/mob/user as mob)
+ user.machine = src
+ if (!src.working)
+ var/dat = {"Artifact Analyser
+