diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index fd76f355035..5148cf4f3c1 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -4462,6 +4462,7 @@
"bHP" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
"bHQ" = (/turf/simulated/floor/plasteel,/area/medical/morgue)
"bHR" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"bHS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/bookcase/manuals/medical,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"bHU" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue)
"bHX" = (/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bIa" = (/turf/simulated/wall,/area/assembly/robotics)
@@ -5693,7 +5694,6 @@
"chA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/door_control{id = "staffroom"; name = "Staff Room Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"chB" = (/obj/machinery/camera{c_tag = "Medbay Break Room"; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"chC" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"chD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"chE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/genetics)
"chF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/woodentable,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"chG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics)
@@ -9089,7 +9089,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQcbScbVcbTcbUcbWcbYcbXccacbZcccccbccfccdcceccgccjcchccicckccqcclccmbEnccnbFOccoccpccrbFOccscaAccvcctccuccwccxbUecczccyccBccAccDccCccFccEccHccGccIbWaccKbZuccJccMccLccOccNccPbXNccQbXQbXQbXQccRbWgcbdccTccSccVccUccXccWcdbcbfccYccZcdacbjcbjcdccbocddcdfcdecdhcdgbGmcdicdkbYjcdndfcbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIcdlcdmcdpcdlcdobRGbRAbRAbRGbRAcdrcdqcdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdvcdtcducducducdtcdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdycdxcdAcdzbYLcdBcdDcdCcdEbYMbOwcdGcdFbTybTycdHcdKcdIcdJcclcdOcdLcdOcdMcdNcdNcdQcdPcdRcdNcdNcdTcdNcdScdNcclccmbEncdVcdUcdXcdWcdZcdYbFOcaAcebcctceaccucedbUececceecegcefceicehcekcejbUecelcembWaceocencencercepceqcetcesbXNceucevbXQcexcewbWgcbdcezceyceBceAceDceCceGcbfceEccZceFceFcbjceHceJceIceLceKceNceMbGnceOceSbYjcaccLhbGpbGobGsaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGceRceRceRceRceRceTbRAbRAbRGbPIbPIbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceVceUceUceUceWaaaaaaaaaaaaaaaaaaaaaceXceZceYceZcfaaaaaaaaaacamcamcamcffcfbcdAcfcbYLcfdcbMcfecfgbYMbOwcfhcfjcficflcfkcfncfmcfpcfocfrcfqcfucfscftcftcfxcfvcfvcfvcfvcfvcfvcfwcfAcfycfzcfBcfDcfCcfFcfEcfHcfGcfIcaAcfJcctccucfKcedbUececceecfMcfLcfOcfNcfQcfPbUmcfRcfSbWabWacfUcfUbWacepbWdcfTcfVbWgcfXcfWcfZcfYcgabWgcbdcgccgbcgecgdcghcgfcggcbfcgiccZceFceFcbjcgjcgmcgkcglcgncgpcgocgrcgqcgvbYjcaccgscgtcgscgucgycgucgucguaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMcgRcgQcgTcgScgScgUcgXcgVcgScgWcgWcgYchbcgZcgWcgWchacclcclchechcchcchcchdchgchcchcchfchichhchhchjchhaCuchkchhchnchmchpcaAchochqcecchschrchtchvchuchwchrbUecelchychxchAchzchCchBchFchDchEchGchLchHchIchJchKchNbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXchWbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMcgRcgQcgTcgScgScgUcgXcgVcgScgWcgWcgYchbcgZcgWcgWchacclcclchechcchcchcchdchgchcchcchfchichhchhchjchhaCuchkchhchnchmchpcaAchochqcecchschrchtchvchuchwchrbUecelchychxchAchzchCchBchFbHSchEchGchLchHchIchJchKchNbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXchWbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRGbRAbRAcikbRAbRAbRAciobRAcilbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbYPcipciqcamcitcfbcircisciyciubYMcivciwcixcizbYMcgQcgQciCcgSciAciBciEciDciHcgWciFciGciJciIciKcgWciMciLciNchcciPciOciSciQciRciTciVciUciXciWciZciYcjbcjacjdcjccjgcjecjfcjhcjjcjicjkceecjocjlcjmcjncjqcjpbUmcjrcjtcjscjuchCcjvcjvcjxcjwbWgcjycjAcjzcjCcjBcjEaYobWicjFcjHcjGcjIcjGcjGcjLcjJcjKcjPcjMcjNcjOcbjcjQcjRcbnbPtbGGcjTcjScjUcjUcjScjUcjYcgscjVcjWchZciackecjXcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRckfbRGbRAbRAbRGckgbRAbRAckjckhbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFckicimcimckkcklcfbcfbckmckncfbcfbcisckqckobYMbYMbYMbYMbYMbYMckpcgQcksckrckxcktcktcktckucgWckvckwckwckwckzckyckBckAckDckCckFckEckHckGckJckIchcchfckKchhckMckLckOckNckPchhcebccuceaccuckRckQckUckSckTckVckXckWckYchrclackZclcclbclecldclgclfcljclhbWgbWgbWgbWgbWgclicllclkbWiclncjGcjGclmclocjGcltclpcbjclqccZclrclrcbjcbmclscbnbPtcgsclvcgscgscgscgscgscgscgscluclwcguclxclzclycguafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOclBcjZcjZclAciecieckbckbclHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRGbRAclFbRGclGclIbRAbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbYPclJclMclKckncfbcfbclLclOclNclQclPclPclPclTcgQcgQcgQciCcgSclRcktclScktclVcgWckvckwclUckwclWcgWclYclXclZchccmccmacmbcmecmdcmhcmfcmgcmjcmicmlcmkcmocmmcmnchhcfJccuccucmpckRckQcmrcmqcmucjlcmscmtaYqcmvcmycmxcmAcmzcmCcmBcmEcmDcjvcmHchxcmFcmGcmJcmIcmKcmNcmLclpclncmMcjGcjGcjGcmQcmOclpcbjcmPccZclrclrcbjcmTcmRcbnbPtcmScmVcmUcgscmWcmYcmXcnbcmZcnacnfcgucnccndcnecgucgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnkcieclBciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index be2336d6a37..7b87deadb3e 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -4,11 +4,11 @@
name = "glass shard"
icon = 'icons/obj/shards.dmi'
icon_state = "large"
- sharp = 1
+ sharp = TRUE
desc = "Could probably be used as ... a throwing weapon?"
w_class = WEIGHT_CLASS_TINY
- force = 5.0
- throwforce = 10.0
+ force = 5
+ throwforce = 10
item_state = "shard-glass"
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
@@ -20,19 +20,18 @@
return (BRUTELOSS)
/obj/item/weapon/shard/New()
- src.icon_state = pick("large", "medium", "small")
- switch(src.icon_state)
- if("small")
- src.pixel_x = rand(-12, 12)
- src.pixel_y = rand(-12, 12)
- if("medium")
- src.pixel_x = rand(-8, 8)
- src.pixel_y = rand(-8, 8)
- if("large")
- src.pixel_x = rand(-5, 5)
- src.pixel_y = rand(-5, 5)
- else
..()
+ icon_state = pick("large", "medium", "small")
+ switch(icon_state)
+ if("small")
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-12, 12)
+ if("medium")
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8, 8)
+ if("large")
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
/obj/item/weapon/shard/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity || !(src in user))
@@ -53,7 +52,7 @@
H.updatehealth()
/obj/item/weapon/shard/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/weldingtool))
+ if(iswelder(I))
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
@@ -65,7 +64,8 @@
G.attackby(NG, user)
to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.")
qdel(src)
- ..()
+ else
+ return ..()
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(isliving(AM))
@@ -73,7 +73,7 @@
if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
return
to_chat(M, "You step on \the [src]!")
- playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
+ playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -87,4 +87,42 @@
if(affecting.take_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
- ..()
\ No newline at end of file
+ ..()
+
+/obj/item/weapon/shard/plasma
+ name = "plasma shard"
+ desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window."
+ force = 8
+ throwforce = 15
+ icon_state = "plasmalarge"
+ sharp = TRUE
+
+/obj/item/weapon/shard/plasma/New()
+ ..()
+ icon_state = pick("plasmalarge", "plasmamedium", "plasmasmall")
+ switch(icon_state)
+ if("plasmasmall")
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-12, 12)
+ if("plasmamedium")
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8, 8)
+ if("plasmalarge")
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+
+/obj/item/weapon/shard/plasma/attackby(obj/item/weapon/W, mob/user, params)
+ if(iswelder(W))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0, user))
+ var/obj/item/stack/sheet/plasmaglass/NG = new (user.loc)
+ for(var/obj/item/stack/sheet/plasmaglass/G in user.loc)
+ if(G == NG)
+ continue
+ if(G.amount >= G.max_amount)
+ continue
+ G.attackby(NG, user, params)
+ to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.")
+ qdel(src)
+ else
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index d1f1372caf3..197b742f307 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -167,15 +167,7 @@
/obj/proc/hear_talk(mob/M as mob, text)
- if(talking_atom)
- talking_atom.catchMessage(text, M)
-
-/*
- var/mob/mo = locate(/mob) in src
- if(mo)
- var/rendered = "[M.name]: [text]"
- mo.show_message(rendered, 2)
-*/
+ return
/obj/proc/hear_message(mob/M as mob, text)
diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm
index 910981974d0..bab097c2e87 100644
--- a/code/game/objects/structures/misc.dm
+++ b/code/game/objects/structures/misc.dm
@@ -61,7 +61,7 @@
/obj/structure/respawner
name = "\improper Long-Distance Cloning Machine"
desc = "Top-of-the-line Nanotrasen technology allows for cloning of crew members from off-station upon bluespace request."
- icon = 'icons/obj/xenoarchaeology.dmi'
+ icon = 'icons/obj/objects.dmi'
icon_state = "borgcharger1(old)"
anchored = 1
density = 1
@@ -121,3 +121,12 @@
if(last_ghost_alert + ghost_alert_delay < world.time)
notify_ghosts("[src] active in [get_area(src)].", 'sound/effects/ghost2.ogg', title = alert_title, source = attack_atom, action = (attack_atom == src ? NOTIFY_JUMP : NOTIFY_ATTACK))
last_ghost_alert = world.time
+
+/obj/structure/boulder
+ name = "boulder"
+ desc = "A large rock."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "boulder1"
+ density = TRUE
+ opacity = TRUE
+ anchored = TRUE
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index aa1e644e506..5f35096dbd7 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -56,20 +56,8 @@
interface_desc = "A diamond-tipped industrial drill."
suit_overlay_active = "mounted-drill"
suit_overlay_inactive = "mounted-drill"
-
device_type = /obj/item/weapon/pickaxe/diamonddrill
-/obj/item/rig_module/device/anomaly_scanner
- name = "hardsuit anomaly scanner"
- desc = "You think it's called an Elder Sarsparilla or something."
- icon_state = "eldersasparilla"
- interface_name = "Alden-Saraspova counter"
- interface_desc = "An exotic particle detector commonly used by xenoarchaeologists."
- engage_string = "Begin Scan"
- usable = 1
- selectable = 0
- device_type = /obj/item/device/ano_scanner
-
/obj/item/rig_module/device/orescanner
name = "ore scanner module"
desc = "A clunky old ore scanner."
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index a0e236daee7..966f54973bc 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -156,7 +156,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/ert
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon)
req_access = list()
req_one_access = list()
@@ -167,9 +167,7 @@
initial_modules = list(
/obj/item/rig_module/ai_container,
- /obj/item/rig_module/maneuvering_jets,
- /obj/item/rig_module/device/anomaly_scanner
- )
+ /obj/item/rig_module/maneuvering_jets)
/obj/item/weapon/rig/medical
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 873b6c798d1..cf987c654bc 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -251,11 +251,4 @@
score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet)
/obj/item/weapon/ore/ex_act()
- return
-
-/obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/device/core_sampler))
- var/obj/item/device/core_sampler/C = W
- C.sample_item(src, user)
- else
- return ..()
+ return
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/areas.dm b/code/modules/research/xenoarchaeology/areas.dm
deleted file mode 100644
index 9bbbcc6a6f9..00000000000
--- a/code/modules/research/xenoarchaeology/areas.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-
-/area/research_outpost
- name = "Research Outpost"
- icon_state = "anomaly"
-
-/area/research_outpost/hallway
- name = "Research Outpost Hallway"
- icon_state = "hallC"
-
-/area/research_outpost/gearstore
- name = "Expedition Preparation"
- icon_state = "anog"
-
-/area/research_outpost/power
- name = "Research Outpost Power"
- icon_state = "engine"
-
-/area/research_outpost/atmos
- name = "Research Outpost Atmospherics"
- icon_state = "atmos"
-
-/area/research_outpost/maint
- name = "Research Outpost Maintenance"
- icon_state = "maintcentral"
-
-/area/research_outpost/iso1
- name = "Isolation Cell"
- icon_state = "iso1"
-
-/area/research_outpost/iso2
- name = "Isolation Cell"
- icon_state = "iso2"
-
-/area/research_outpost/iso3
- name = "Isolation Cell"
- icon_state = "iso3"
-
-/area/research_outpost/harvesting
- name = "Exotic Particles Collection"
- icon_state = "anolab"
-
-/area/research_outpost/sample
- name = "Sample Preparation Room"
- icon_state = "anosample"
-
-/area/research_outpost/spectro
- name = "Mass Spectrometry Lab"
- icon_state = "anospectro"
-
-/area/research_outpost/anomaly
- name = "Anomalous Materials Lab"
- icon_state = "anolab"
-
-/area/research_outpost/med
- name = "Research Outpost Medbay"
- icon_state = "medbay3"
-
-/area/research_outpost/entry
- name = "Research Outpost Shuttle Dock"
- icon_state = "entry"
-
-/area/research_outpost/longtermstorage
- name = "Long-Term Storage"
- icon_state = "primarystorage"
-
-/area/research_outpost/tempstorage
- name = "Temporary Storage"
- icon_state = "storage"
-
-/area/research_outpost/maintstore1
- name = "Auxiliary Storage"
- icon_state = "auxstorage"
-
-/area/research_outpost/maintstore2
- name = "Maintenance Storage"
- icon_state = "auxstorage"
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm
deleted file mode 100644
index 366ce13107b..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact.dm
+++ /dev/null
@@ -1,118 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Large finds - (Potentially) active alien machinery from the dawn of time
-
-/datum/artifact_find
- var/artifact_id
- var/artifact_find_type
- var/artifact_detect_range
-
-/datum/artifact_find/New()
- artifact_detect_range = rand(5,300)
-
- artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
-
- artifact_find_type = pick(\
- 5;/obj/structure/constructshell,\
- 5;/obj/machinery/wish_granter,\
- 25;/obj/machinery/power/supermatter_shard,\
- 50;/obj/structure/cult/pylon,\
- 100;/obj/machinery/auto_cloner,\
- 100;/obj/machinery/giga_drill,\
- 100;/obj/mecha/working/hoverpod,\
- 100;/obj/machinery/replicator,\
- 150;/obj/structure/crystal,\
- 1000;/obj/machinery/artifact)
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Boulders - sometimes turn up after excavating turf - excavate further to try and find large xenoarch finds
-
-/obj/structure/boulder
- name = "rocky debris"
- desc = "Leftover rock from an excavation, it's been partially dug out already but there's still a lot to go."
- icon = 'icons/obj/mining.dmi'
- icon_state = "boulder1"
- density = 1
- opacity = 1
- anchored = 1
- var/excavation_level = 0
- var/datum/geosample/geological_data
- var/datum/artifact_find/artifact_find
-
-/obj/structure/boulder/New()
- icon_state = "boulder[rand(1,4)]"
- excavation_level = rand(5,50)
-
-/obj/structure/boulder/Bumped(AM)
- . = ..()
- if(istype(AM,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = AM
- if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand))
- attackby(H.l_hand,H)
- else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand)
- attackby(H.r_hand,H)
-
- else if(istype(AM,/mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = AM
- if(istype(R.module_active,/obj/item/weapon/pickaxe))
- attackby(R.module_active,R)
-
- else if(istype(AM,/obj/mecha))
- var/obj/mecha/M = AM
- if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill))
- M.selected.action(src)
-
-/obj/structure/boulder/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/device/core_sampler))
- if(geological_data)
- src.geological_data.artifact_distance = rand(-100,100) / 100
- src.geological_data.artifact_id = artifact_find.artifact_id
-
- var/obj/item/device/core_sampler/C = W
- C.sample_item(src, user)
- return
-
- if(istype(W, /obj/item/device/depth_scanner))
- var/obj/item/device/depth_scanner/C = W
- C.scan_atom(user, src)
- return
-
- if(istype(W, /obj/item/device/measuring_tape))
- var/obj/item/device/measuring_tape/P = W
- user.visible_message("[user] extends [P] towards [src].","You extend [P] towards [src].")
- if(do_after(user, 40, target = src))
- to_chat(user, "[bicon(P)] [src] has been excavated to a depth of [2*src.excavation_level]cm.")
- return
-
- if(istype(W, /obj/item/weapon/pickaxe))
- var/obj/item/weapon/pickaxe/P = W
-
- to_chat(user, "You start [P.drill_verb] [src].")
-
- if(!do_after(user, P.digspeed, target = src))
- return
-
- to_chat(user, "You finish [P.drill_verb] [src].")
- excavation_level += P.excavation_amount
-
- if(excavation_level > 100)
- //failure
- user.visible_message("[src] suddenly crumbles away.",\
- "[src] has disintegrated under your onslaught, any secrets it was holding are long gone.")
- qdel(src)
- return
-
- if(prob(excavation_level))
- //success
- if(artifact_find)
- var/spawn_type = artifact_find.artifact_find_type
- var/obj/O = new spawn_type(get_turf(src))
- if(istype(O,/obj/machinery/artifact))
- var/obj/machinery/artifact/X = O
- if(X.my_effect)
- X.my_effect.artifact_id = artifact_find.artifact_id
- src.visible_message("[src] suddenly crumbles away.")
- else
- user.visible_message("[src] suddenly crumbles away.",\
- "[src] has been whittled away under your careful excavation, but there was nothing of interest inside.")
- qdel(src)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
deleted file mode 100644
index 410f05a925c..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
+++ /dev/null
@@ -1,89 +0,0 @@
-
-/obj/machinery/auto_cloner
- name = "mysterious pod"
- desc = "It's full of a viscous liquid, but appears dark and silent."
- icon = 'icons/obj/cryogenics.dmi'
- icon_state = "cellold0"
- var/spawn_type
- var/time_spent_spawning = 0
- var/time_per_spawn = 0
- var/last_process= 0
- density = 1
- var/previous_power_state = 0
-
- use_power = 1
- active_power_usage = 2000
- idle_power_usage = 1000
-
-/obj/machinery/auto_cloner/New()
- ..()
-
- time_per_spawn = rand(1200,3600)
-
- //33% chance to spawn nasties
- if(prob(33))
- spawn_type = pick(\
- /mob/living/simple_animal/hostile/poison/giant_spider/nurse,\
- /mob/living/simple_animal/hostile/alien,\
- /mob/living/simple_animal/hostile/bear,\
- /mob/living/simple_animal/hostile/creature,\
- /mob/living/simple_animal/hostile/panther,\
- /mob/living/simple_animal/hostile/snake\
- )
- else
- spawn_type = pick(\
- /mob/living/simple_animal/pet/cat,\
- /mob/living/simple_animal/pet/corgi,\
- /mob/living/simple_animal/pet/corgi/puppy,\
- /mob/living/simple_animal/chicken,\
- /mob/living/simple_animal/cow,\
- /mob/living/simple_animal/parrot,\
- /mob/living/simple_animal/slime,\
- /mob/living/simple_animal/crab,\
- /mob/living/simple_animal/mouse,\
- /mob/living/simple_animal/hostile/retaliate/goat\
- )
-
-//todo: how the hell is the asteroid permanently powered?
-/obj/machinery/auto_cloner/process()
- if(powered(power_channel))
- if(!previous_power_state)
- previous_power_state = 1
- icon_state = "cellold1"
- src.visible_message("[bicon(src)] [src] suddenly comes to life!")
-
- //slowly grow a mob
- if(prob(5))
- src.visible_message("[bicon(src)] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].")
-
- //if we've finished growing...
- if(time_spent_spawning >= time_per_spawn)
- time_spent_spawning = 0
- use_power = 1
- src.visible_message("[bicon(src)] [src] pings!")
- icon_state = "cellold1"
- desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow."
- if(spawn_type)
- new spawn_type(src.loc)
-
- //if we're getting close to finished, kick into overdrive power usage
- if(time_spent_spawning / time_per_spawn > 0.75)
- use_power = 2
- icon_state = "cellold2"
- desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow. A dark shape appears to be forming inside..."
- else
- use_power = 1
- icon_state = "cellold1"
- desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow."
-
- time_spent_spawning = time_spent_spawning + world.time - last_process
- else
- if(previous_power_state)
- previous_power_state = 0
- icon_state = "cellold0"
- src.visible_message("[bicon(src)] [src] suddenly shuts down.")
-
- //cloned mob slowly breaks down
- time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0)
-
- last_process = world.time
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm b/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
deleted file mode 100644
index 54bdf4fd961..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
+++ /dev/null
@@ -1,36 +0,0 @@
-
-/obj/structure/crystal
- name = "large crystal"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "crystal"
- density = 1
-
-/obj/structure/crystal/New()
- ..()
-
- icon_state = pick("ano70","ano80")
-
- desc = pick(\
- "It shines faintly as it catches the light.",\
- "It appears to have a faint inner glow.",\
- "It seems to draw you inward as you look it at.",\
- "Something twinkles faintly as you look at it.",\
- "It's mesmerizing to behold.")
-
-/obj/structure/crystal/Destroy()
- src.visible_message("\The [src] shatters!")
- if(prob(75))
- new /obj/item/weapon/shard/plasma(loc)
- if(prob(50))
- new /obj/item/weapon/shard/plasma(loc)
- if(prob(25))
- new /obj/item/weapon/shard/plasma(loc)
- if(prob(75))
- new /obj/item/weapon/shard(loc)
- if(prob(50))
- new /obj/item/weapon/shard(loc)
- if(prob(25))
- new /obj/item/weapon/shard(loc)
- return ..()
-
-//todo: laser_act
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm b/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm
deleted file mode 100644
index 96b9f2e2fb4..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-
-/obj/machinery/giga_drill
- name = "alien drill"
- desc = "A giant, alien drill mounted on long treads."
- icon = 'icons/obj/mining.dmi'
- icon_state = "gigadrill"
- var/active = 0
- var/drill_time = 10
- var/turf/drilling_turf
- density = 1
- layer = 3.1 //to go over ores
-
-/obj/machinery/giga_drill/attack_hand(mob/user as mob)
- if(active)
- active = 0
- icon_state = "gigadrill"
- to_chat(user, "You press a button and [src] slowly spins down.")
- else
- active = 1
- icon_state = "gigadrill_mov"
- to_chat(user, "You press a button and [src] shudders to life.")
-
-/obj/machinery/giga_drill/Bump(atom/A)
- if(active && !drilling_turf)
- if(istype(A,/turf/simulated/mineral))
- var/turf/simulated/mineral/M = A
- drilling_turf = get_turf(src)
- src.visible_message("[src] begins to drill into [M]!")
- anchored = 1
- spawn(drill_time)
- if(get_turf(src) == drilling_turf && active)
- M.gets_drilled()
- src.loc = M
- drilling_turf = null
- anchored = 0
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_hoverpod.dm b/code/modules/research/xenoarchaeology/artifact/artifact_hoverpod.dm
deleted file mode 100644
index 6544deb1d68..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact_hoverpod.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/obj/mecha/working/hoverpod
- name = "hover pod"
- icon_state = "engineering_pod"
- desc = "Stubby and round, it has a human sized access hatch on the top."
- wreckage = /obj/effect/decal/mecha_wreckage/hoverpod
- stepsound = 'sound/machines/hiss.ogg'
-
-/obj/mecha/working/hoverpod/Process_Spacemove(var/movement_dir = 0)
- return 1 // puts the hover in hoverpod
-
-/obj/effect/decal/mecha_wreckage/hoverpod
- name = "Hover pod wreckage"
- icon_state = "engineering_pod-broken"
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
deleted file mode 100644
index d87c71dbc72..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
+++ /dev/null
@@ -1,153 +0,0 @@
-
-/obj/machinery/replicator
- name = "alien machine"
- desc = "It's some kind of pod with strange wires and gadgets all over it."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "borgcharger0(old)"
- density = 1
-
- idle_power_usage = 100
- active_power_usage = 1000
- use_power = 1
-
- var/spawn_progress_time = 0
- var/max_spawn_time = 50
- var/last_process_time = 0
-
- var/list/construction = list()
- var/list/spawning_types = list()
- var/list/stored_materials = list()
-
- var/fail_message
-
-/obj/machinery/replicator/New()
- ..()
-
- var/list/viables = list(\
- /obj/item/roller,\
- /obj/structure/closet/crate,\
- /obj/structure/closet/acloset,\
- /mob/living/simple_animal/hostile/mimic,\
- /mob/living/simple_animal/hostile/viscerator,\
- /mob/living/simple_animal/hostile/hivebot,\
- /obj/item/device/analyzer,\
- /obj/item/device/camera,\
- /obj/item/device/flash,\
- /obj/item/device/flashlight,\
- /obj/item/device/healthanalyzer,\
- /obj/item/device/multitool,\
- /obj/item/device/paicard,\
- /obj/item/device/radio,\
- /obj/item/device/radio/headset,\
- /obj/item/device/radio/beacon,\
- /obj/item/weapon/autopsy_scanner,\
- /obj/item/weapon/bikehorn,\
- /obj/item/weapon/bonesetter,\
- /obj/item/weapon/kitchen/knife/butcher,\
- /obj/item/weapon/caution,\
- /obj/item/clothing/head/cone,\
- /obj/item/weapon/crowbar,\
- /obj/item/weapon/clipboard,\
- /obj/item/weapon/stock_parts/cell,\
- /obj/item/weapon/circular_saw,\
- /obj/item/weapon/hatchet,\
- /obj/item/weapon/restraints/handcuffs,\
- /obj/item/weapon/hemostat,\
- /obj/item/weapon/kitchen/knife,\
- /obj/item/weapon/lighter,\
- /obj/item/weapon/lighter,\
- /obj/item/weapon/light/bulb,\
- /obj/item/weapon/light/tube,\
- /obj/item/weapon/pickaxe,\
- /obj/item/weapon/shovel,\
- /obj/item/weapon/table_parts,\
- /obj/item/weapon/weldingtool,\
- /obj/item/weapon/wirecutters,\
- /obj/item/weapon/wrench,\
- /obj/item/weapon/screwdriver,\
- /obj/item/weapon/grenade/chem_grenade/cleaner,\
- /obj/item/weapon/grenade/chem_grenade/metalfoam\
- )
-
- var/quantity = rand(5,15)
- for(var/i=0, i"
-
-/obj/machinery/replicator/process()
- if(spawning_types.len && powered())
- spawn_progress_time += world.time - last_process_time
- if(spawn_progress_time > max_spawn_time)
- src.visible_message("[bicon(src)] [src] pings!")
-
- var/obj/source_material = pop(stored_materials)
- var/spawn_type = pop(spawning_types)
- var/obj/spawned_obj = new spawn_type(src.loc)
- if(source_material)
- if(lentext(source_material.name) < MAX_MESSAGE_LEN)
- spawned_obj.name = "[source_material] " + spawned_obj.name
- if(lentext(source_material.desc) < MAX_MESSAGE_LEN * 2)
- if(spawned_obj.desc)
- spawned_obj.desc += " It is made of [source_material]."
- else
- spawned_obj.desc = "It is made of [source_material]."
- source_material.loc = null
-
- spawn_progress_time = 0
- max_spawn_time = rand(30,100)
-
- if(!spawning_types.len || !stored_materials.len)
- use_power = 1
- icon_state = "borgcharger0(old)"
-
- else if(prob(5))
- src.visible_message("[bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
-
- last_process_time = world.time
-
-/obj/machinery/replicator/attack_hand(mob/user as mob)
- interact(user)
-
-/obj/machinery/replicator/interact(mob/user)
- var/dat = "The control panel displays an incomprehensible selection of controls, many with unusual markings or text around them.
"
- dat += "
"
- for(var/index=1, index<=construction.len, index++)
- dat += "\[[construction[index]]\]
"
-
- user << browse(dat, "window=alien_replicator")
-
-/obj/machinery/replicator/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
- user.drop_item()
- W.loc = src
- stored_materials.Add(W)
- src.visible_message("[user] inserts [W] into [src].")
-
-/obj/machinery/replicator/Topic(href, href_list)
-
- if(href_list["activate"])
- var/index = text2num(href_list["activate"])
- if(index > 0 && index <= construction.len)
- if(stored_materials.len > spawning_types.len)
- if(spawning_types.len)
- src.visible_message("[bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
- else
- src.visible_message("[bicon(src)] [src]'s front compartment slides shut.")
-
- spawning_types.Add(construction[construction[index]])
- spawn_progress_time = 0
- use_power = 2
- icon_state = "borgcharger1(old)"
- else
- src.visible_message(fail_message)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
deleted file mode 100644
index 894f54dc3bc..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
+++ /dev/null
@@ -1,362 +0,0 @@
-
-#define EFFECT_TOUCH 0
-#define EFFECT_AURA 1
-#define EFFECT_PULSE 2
-#define MAX_EFFECT 2
-
-#define TRIGGER_TOUCH 0
-#define TRIGGER_WATER 1
-#define TRIGGER_ACID 2
-#define TRIGGER_VOLATILE 3
-#define TRIGGER_TOXIN 4
-#define TRIGGER_FORCE 5
-#define TRIGGER_ENERGY 6
-#define TRIGGER_HEAT 7
-#define TRIGGER_COLD 8
-#define TRIGGER_PLASMA 9
-#define TRIGGER_OXY 10
-#define TRIGGER_CO2 11
-#define TRIGGER_NITRO 12
-#define MAX_TRIGGER 12
-/*
-//sleeping gas appears to be bugged, currently
-var/list/valid_primary_effect_types = list(\
- /datum/artifact_effect/cellcharge,\
- /datum/artifact_effect/celldrain,\
- /datum/artifact_effect/forcefield,\
- /datum/artifact_effect/gasoxy,\
- /datum/artifact_effect/gasplasma,\
-/* /datum/artifact_effect/gassleeping,\*/
- /datum/artifact_effect/heal,\
- /datum/artifact_effect/hurt,\
- /datum/artifact_effect/emp,\
- /datum/artifact_effect/teleport,\
- /datum/artifact_effect/robohurt,\
- /datum/artifact_effect/roboheal)
-
-var/list/valid_secondary_effect_types = list(\
- /datum/artifact_effect/cold,\
- /datum/artifact_effect/badfeeling,\
- /datum/artifact_effect/cellcharge,\
- /datum/artifact_effect/celldrain,\
- /datum/artifact_effect/dnaswitch,\
- /datum/artifact_effect/emp,\
- /datum/artifact_effect/gasco2,\
- /datum/artifact_effect/gasnitro,\
- /datum/artifact_effect/gasoxy,\
- /datum/artifact_effect/gasplasma,\
-/* /datum/artifact_effect/gassleeping,\*/
- /datum/artifact_effect/goodfeeling,\
- /datum/artifact_effect/heal,\
- /datum/artifact_effect/hurt,\
- /datum/artifact_effect/radiate,\
- /datum/artifact_effect/roboheal,\
- /datum/artifact_effect/robohurt,\
- /datum/artifact_effect/sleepy,\
- /datum/artifact_effect/stun,\
- /datum/artifact_effect/teleport)
- */
-
-/obj/machinery/artifact
- name = "alien artifact"
- desc = "A large alien device."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "ano00"
- var/icon_num = 0
- density = 1
- var/datum/artifact_effect/my_effect
- var/datum/artifact_effect/secondary_effect
- var/being_used = 0
-
-/obj/machinery/artifact/New()
- ..()
-
- //setup primary effect - these are the main ones (mixed)
- var/effecttype = pick(subtypesof(/datum/artifact_effect))
- my_effect = new effecttype(src)
-
- //75% chance to have a secondary stealthy (and mostly bad) effect
- if(prob(75))
- effecttype = pick(subtypesof(/datum/artifact_effect))
- secondary_effect = new effecttype(src)
- if(prob(75))
- secondary_effect.ToggleActivate(0)
-
- icon_num = rand(0,11)
- icon_state = "ano[icon_num]0"
- if(icon_num == 7 || icon_num == 8)
- name = "large crystal"
- desc = pick("It shines faintly as it catches the light.",\
- "It appears to have a faint inner glow.",\
- "It seems to draw you inward as you look it at.",\
- "Something twinkles faintly as you look at it.",\
- "It's mesmerizing to behold.")
- if(prob(50))
- my_effect.trigger = TRIGGER_ENERGY
- else if(icon_num == 9)
- name = "alien computer"
- desc = "It is covered in strange markings."
- if(prob(75))
- my_effect.trigger = TRIGGER_TOUCH
- else if(icon_num == 10)
- desc = "A large alien device, there appear to be some kind of vents in the side."
- if(prob(50))
- my_effect.trigger = rand(6,12)
- else if(icon_num == 11)
- name = "sealed alien pod"
- desc = "A strange alien device."
- if(prob(25))
- my_effect.trigger = rand(1,4)
-
-#define TRIGGER_PLASMA 9
-#define TRIGGER_OXY 10
-#define TRIGGER_CO2 11
-#define TRIGGER_NITRO 12
-
-/obj/machinery/artifact/process()
- if(my_effect)
- my_effect.process()
- if(secondary_effect)
- secondary_effect.process()
-
- if(pulledby)
- Bumped(pulledby)
-
- //if either of our effects rely on environmental factors, work that out
- var/trigger_cold = 0
- var/trigger_hot = 0
- var/trigger_plasma = 0
- var/trigger_oxy = 0
- var/trigger_co2 = 0
- var/trigger_nitro = 0
- if( (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) || (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) )
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/env = T.return_air()
- if(env)
- if(env.temperature < 225)
- trigger_cold = 1
- else if(env.temperature > 375)
- trigger_hot = 1
-
- if(env.toxins >= 10)
- trigger_plasma = 1
- if(env.oxygen >= 10)
- trigger_oxy = 1
- if(env.carbon_dioxide >= 10)
- trigger_co2 = 1
- if(env.nitrogen >= 10)
- trigger_nitro = 1
-
- //COLD ACTIVATION
- if(trigger_cold)
- if(my_effect.trigger == TRIGGER_COLD && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_COLD && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //HEAT ACTIVATION
- if(trigger_hot)
- if(my_effect.trigger == TRIGGER_HEAT && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_HEAT && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //PLASMA GAS ACTIVATION
- if(trigger_plasma)
- if(my_effect.trigger == TRIGGER_PLASMA && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PLASMA && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_PLASMA && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PLASMA && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //OXYGEN GAS ACTIVATION
- if(trigger_oxy)
- if(my_effect.trigger == TRIGGER_OXY && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_OXY && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //CO2 GAS ACTIVATION
- if(trigger_co2)
- if(my_effect.trigger == TRIGGER_CO2 && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_CO2 && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //NITROGEN GAS ACTIVATION
- if(trigger_nitro)
- if(my_effect.trigger == TRIGGER_NITRO && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_NITRO && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/attack_hand(var/mob/user as mob)
- if(get_dist(user, src) > 1)
- to_chat(user, "You can't reach [src] from here.")
- return
- if(ishuman(user) && user:gloves)
- to_chat(user, "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
- return
-
- src.add_fingerprint(user)
-
- if(my_effect.trigger == TRIGGER_TOUCH)
- to_chat(user, "You touch [src].")
- my_effect.ToggleActivate()
- else
- to_chat(user, "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
-
- if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH)
- secondary_effect.ToggleActivate(0)
-
- if(my_effect.effect == EFFECT_TOUCH)
- my_effect.DoEffectTouch(user)
-
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated)
- secondary_effect.DoEffectTouch(user)
-
-/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
-
- if(istype(W, /obj/item/weapon/reagent_containers/))
- if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1))
- if(my_effect.trigger == TRIGGER_WATER)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("facid", 1) || W.reagents.has_reagent("diethylamine", 1))
- if(my_effect.trigger == TRIGGER_ACID)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("plasma", 1) || W.reagents.has_reagent("thermite", 1))
- if(my_effect.trigger == TRIGGER_VOLATILE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_VOLATILE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amanitin", 1) || W.reagents.has_reagent("neurotoxin", 1))
- if(my_effect.trigger == TRIGGER_TOXIN)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOXIN && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\
- istype(W,/obj/item/weapon/melee/energy) ||\
- istype(W,/obj/item/weapon/melee/cultblade) ||\
- istype(W,/obj/item/weapon/card/emag) ||\
- istype(W,/obj/item/device/multitool))
- if(my_effect.trigger == TRIGGER_ENERGY)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25))
- secondary_effect.ToggleActivate(0)
-
- else if(istype(W,/obj/item/weapon/match) && W:lit ||\
- istype(W,/obj/item/weapon/weldingtool) && W:welding ||\
- istype(W,/obj/item/weapon/lighter) && W:lit)
- if(my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && prob(25))
- secondary_effect.ToggleActivate(0)
- else
- ..()
- if(my_effect.trigger == TRIGGER_FORCE && W.force >= 10)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/Bumped(M as mob|obj)
- ..()
- if(istype(M,/obj))
- if(M:throwforce >= 10)
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves))
- var/warn = 0
-
- if(my_effect.trigger == TRIGGER_TOUCH && prob(50))
- my_effect.ToggleActivate()
- warn = 1
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25))
- secondary_effect.ToggleActivate(0)
- warn = 1
-
- if(my_effect.effect == EFFECT_TOUCH && prob(50))
- my_effect.DoEffectTouch(M)
- warn = 1
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50))
- secondary_effect.DoEffectTouch(M)
- warn = 1
-
- if(warn)
- to_chat(M, "You accidentally touch [src].")
- ..()
-
-/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P)
- if(istype(P,/obj/item/projectile/bullet) ||\
- istype(P,/obj/item/projectile/hivebotbullet))
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
-
- else if(istype(P,/obj/item/projectile/beam) ||\
- istype(P,/obj/item/projectile/ion) ||\
- istype(P,/obj/item/projectile/energy))
- if(my_effect.trigger == TRIGGER_ENERGY)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25))
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/ex_act(severity)
- switch(severity)
- if(1.0) qdel(src)
- if(2.0)
- if(prob(50))
- qdel(src)
- else
- if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
- secondary_effect.ToggleActivate(0)
- if(3.0)
- if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
- secondary_effect.ToggleActivate(0)
- return
-
-/obj/machinery/artifact/Move()
- ..()
- if(my_effect)
- my_effect.UpdateMove()
- if(secondary_effect)
- secondary_effect.UpdateMove()
diff --git a/code/modules/research/xenoarchaeology/artifact/effect.dm b/code/modules/research/xenoarchaeology/artifact/effect.dm
deleted file mode 100644
index 981cea4156d..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effect.dm
+++ /dev/null
@@ -1,110 +0,0 @@
-
-//override procs in children as necessary
-/datum/artifact_effect
- var/effecttype = "unknown" //purely used for admin checks ingame, not needed any more
- var/effect = EFFECT_TOUCH
- var/effectrange = 4
- var/trigger = TRIGGER_TOUCH
- var/atom/holder
- var/activated = 0
- var/chargelevel = 0
- var/chargelevelmax = 10
- var/artifact_id = ""
- var/effect_type = 0
-
-//0 = Unknown / none detectable
-//1 = Concentrated energy
-//2 = Intermittent psionic wavefront
-//3 = Electromagnetic energy
-//4 = Particle field
-//5 = Organically reactive exotic particles
-//6 = Interdimensional/bluespace? phasing
-//7 = Atomic synthesis
-
-/datum/artifact_effect/New(var/atom/location)
- ..()
- holder = location
- effect = rand(0,MAX_EFFECT)
- trigger = rand(0,MAX_TRIGGER)
-
- //this will be replaced by the excavation code later, but it's here just in case
- artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
-
- //random charge time and distance
- switch(pick(100;1, 50;2, 25;3))
- if(1)
- //short range, short charge time
- chargelevelmax = rand(3, 20)
- effectrange = rand(1, 3)
- if(2)
- //medium range, medium charge time
- chargelevelmax = rand(15, 40)
- effectrange = rand(5, 15)
- if(3)
- //large range, long charge time
- chargelevelmax = rand(20, 120)
- effectrange = rand(20, 200)
-
-/datum/artifact_effect/proc/ToggleActivate(var/reveal_toggle = 1)
- //so that other stuff happens first
- spawn(0)
- if(activated)
- activated = 0
- else
- activated = 1
- if(reveal_toggle && holder)
- if(istype(holder, /obj/machinery/artifact))
- var/obj/machinery/artifact/A = holder
- A.icon_state = "ano[A.icon_num][activated]"
- var/display_msg
- if(activated)
- display_msg = pick("momentarily glows brightly!","distorts slightly for a moment!","flickers slightly!","vibrates!","shimmers slightly for a moment!")
- else
- display_msg = pick("grows dull!","fades in intensity!","suddenly becomes very still!","suddenly becomes very quiet!")
- var/atom/toplevelholder = holder
- while(!istype(toplevelholder.loc, /turf))
- toplevelholder = toplevelholder.loc
- toplevelholder.visible_message("[bicon(toplevelholder)] [toplevelholder] [display_msg]")
-
-/datum/artifact_effect/proc/DoEffectTouch(var/mob/user)
-/datum/artifact_effect/proc/DoEffectAura(var/atom/holder)
-/datum/artifact_effect/proc/DoEffectPulse(var/atom/holder)
-/datum/artifact_effect/proc/UpdateMove()
-
-/datum/artifact_effect/proc/process()
- if(chargelevel < chargelevelmax)
- chargelevel++
-
- if(activated)
- if(effect == EFFECT_AURA)
- DoEffectAura()
- else if(effect == EFFECT_PULSE && chargelevel >= chargelevelmax)
- chargelevel = 0
- DoEffectPulse()
-
-//returns 0..1, with 1 being no protection and 0 being fully protected
-proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H)
- if(!H || !istype(H))
- return 1
-
- var/protected = 0
-
- //anomaly suits give best protection, but excavation suits are almost as good
- if(istype(H.wear_suit,/obj/item/clothing/suit/bio_suit/anomaly))
- protected += 0.6
- else if(istype(H.wear_suit,/obj/item/clothing/suit/space/eva/anomaly))
- protected += 0.5
-
- if(istype(H.head,/obj/item/clothing/head/bio_hood/anomaly))
- protected += 0.3
- else if(istype(H.head,/obj/item/clothing/head/helmet/space/eva/anomaly))
- protected += 0.2
-
- //latex gloves and science goggles also give a bit of bonus protection
- if(istype(H.gloves,/obj/item/clothing/gloves/color/latex))
- protected += 0.1
-
- if(istype(H.glasses,/obj/item/clothing/glasses/science))
- protected += 0.1
-
- return 1 - protected
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm
deleted file mode 100644
index 16862948644..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm
+++ /dev/null
@@ -1,24 +0,0 @@
-
-//inverse of /datum/artifact_effect/heat, the two effects split up for neatness' sake
-/datum/artifact_effect/cold
- effecttype = "cold"
- var/target_temp
-
-/datum/artifact_effect/cold/New()
- ..()
- target_temp = rand(0, 250)
- effect = pick(EFFECT_TOUCH, EFFECT_AURA)
- effect_type = pick(5,6,7)
-
-/datum/artifact_effect/cold/DoEffectTouch(var/mob/user)
- if(holder)
- to_chat(user, "A chill passes up your spine!")
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env)
- env.temperature = max(env.temperature - rand(5,50), 0)
-
-/datum/artifact_effect/cold/DoEffectAura()
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env && env.temperature > target_temp)
- env.temperature -= pick(0, 0, 1)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
deleted file mode 100644
index 0e83e5812c3..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
+++ /dev/null
@@ -1,70 +0,0 @@
-
-/datum/artifact_effect/badfeeling
- effecttype = "badfeeling"
- effect_type = 2
- var/list/messages = list("You feel worried.",\
- "Something doesn't feel right.",\
- "You get a strange feeling in your gut.",\
- "Your instincts are trying to warn you about something.",\
- "Someone just walked over your grave.",\
- "There's a strange feeling in the air.",\
- "There's a strange smell in the air.",\
- "The tips of your fingers feel tingly.",\
- "You feel witchy.",\
- "You have a terrible sense of foreboding.",\
- "You've got a bad feeling about this.",\
- "Your scalp prickles.",\
- "The light seems to flicker.",\
- "The shadows seem to lengthen.",\
- "The walls are getting closer.",\
- "Something is wrong")
-
- var/list/drastic_messages = list("You've got to get out of here!",\
- "Someone's trying to kill you!",\
- "There's something out there!",\
- "What's happening to you?",\
- "OH GOD!",\
- "HELP ME!")
-
-/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user)
- if(user)
- if(istype(user, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- if(prob(50))
- if(prob(75))
- to_chat(H, "[pick(drastic_messages)]")
- else
- to_chat(H, "[pick(messages)]")
-
- if(prob(50))
- H.AdjustDizzy(rand(3,5))
-
-/datum/artifact_effect/badfeeling/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(src.effectrange,T))
- if(prob(5))
- if(prob(75))
- to_chat(H, "[pick(messages)]")
- else
- to_chat(H, "[pick(drastic_messages)]")
-
- if(prob(10))
- H.AdjustDizzy(rand(3,5))
- return 1
-
-/datum/artifact_effect/badfeeling/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(src.effectrange,T))
- if(prob(50))
- if(prob(95))
- to_chat(H, "[pick(drastic_messages)]")
- else
- to_chat(H, "[pick(messages)]")
-
- if(prob(50))
- H.AdjustDizzy(rand(3,5))
- else if(prob(25))
- H.AdjustDizzy(rand(5,15))
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
deleted file mode 100644
index 8d6735e3a31..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
+++ /dev/null
@@ -1,42 +0,0 @@
-
-//todo
-/datum/artifact_effect/cellcharge
- effecttype = "cellcharge"
- effect_type = 3
-
-/datum/artifact_effect/cellcharge/DoEffectTouch(var/mob/user)
- if(user)
- if(istype(user, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = user
- for(var/obj/item/weapon/stock_parts/cell/D in R.contents)
- D.charge += rand() * 100 + 50
- to_chat(R, "SYSTEM ALERT: Large energy boost detected!")
- return 1
-
-/datum/artifact_effect/cellcharge/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/obj/machinery/power/apc/C in range(200, T))
- for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
- B.charge += 25
- for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
- S.charge += 25
- for(var/mob/living/silicon/robot/M in mob_list)
- for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
- D.charge += 25
- to_chat(M, "SYSTEM ALERT: Energy boost detected!")
- return 1
-
-/datum/artifact_effect/cellcharge/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/obj/machinery/power/apc/C in range(200, T))
- for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
- B.charge += rand() * 100
- for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
- S.charge += 250
- for(var/mob/living/silicon/robot/M in mob_list)
- for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
- D.charge += rand() * 100
- to_chat(M, "SYSTEM ALERT: Energy boost detected!")
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
deleted file mode 100644
index 44be592e7fa..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-
-//todo
-/datum/artifact_effect/celldrain
- effecttype = "celldrain"
- effect_type = 3
-
-/datum/artifact_effect/celldrain/DoEffectTouch(var/mob/user)
- if(user)
- if(istype(user, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = user
- for(var/obj/item/weapon/stock_parts/cell/D in R.contents)
- D.charge = max(D.charge - rand() * 100, 0)
- to_chat(R, "SYSTEM ALERT: Energy drain detected!")
- return 1
-
- return 1
-
-/datum/artifact_effect/celldrain/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/obj/machinery/power/apc/C in range(200, T))
- for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
- B.charge = max(B.charge - 50,0)
- for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
- S.charge = max(S.charge - 100,0)
- for(var/mob/living/silicon/robot/M in mob_list)
- for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
- D.charge = max(D.charge - 50,0)
- to_chat(M, "SYSTEM ALERT: Energy drain detected!")
- return 1
-
-/datum/artifact_effect/celldrain/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/obj/machinery/power/apc/C in range(200, T))
- for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
- B.charge = max(B.charge - rand() * 150,0)
- for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
- S.charge = max(S.charge - 250,0)
- for(var/mob/living/silicon/robot/M in mob_list)
- for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
- D.charge = max(D.charge - rand() * 150,0)
- to_chat(M, "SYSTEM ALERT: Energy drain detected!")
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm
deleted file mode 100644
index f31788602ad..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-
-//todo
-/datum/artifact_effect/dnaswitch
- effecttype = "dnaswitch"
- effect_type = 5
- var/severity
-
-/datum/artifact_effect/dnaswitch/New()
- ..()
- if(effect == EFFECT_AURA)
- severity = rand(5,30)
- else
- severity = rand(25,95)
-
-/datum/artifact_effect/dnaswitch/DoEffectTouch(var/mob/toucher)
- var/weakness = GetAnomalySusceptibility(toucher)
- if(ishuman(toucher) && prob(weakness * 100))
- to_chat(toucher, pick("You feel a little different.",
- "You feel very strange.",
- "Your stomach churns.",
- "Your skin feels loose.",
- "You feel a stabbing pain in your head.",
- "You feel a tingling sensation in your chest.",
- "Your entire body vibrates."))
- if(prob(75))
- scramble(1, toucher, weakness * severity)
- else
- scramble(0, toucher, weakness * severity)
- return 1
-
-/datum/artifact_effect/dnaswitch/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(src.effectrange,T))
- var/weakness = GetAnomalySusceptibility(H)
- if(prob(weakness * 100))
- if(prob(30))
- to_chat(H, pick("You feel a little different.",
- "You feel very strange.",
- "Your stomach churns.",
- "Your skin feels loose.",
- "You feel a stabbing pain in your head.",
- "You feel a tingling sensation in your chest.",
- "Your entire body vibrates."))
- if(prob(50))
- scramble(1, H, weakness * severity)
- else
- scramble(0, H, weakness * severity)
-
-/datum/artifact_effect/dnaswitch/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(200, T))
- var/weakness = GetAnomalySusceptibility(H)
- if(prob(weakness * 100))
- if(prob(75))
- to_chat(H, pick("You feel a little different.",
- "You feel very strange.",
- "Your stomach churns.",
- "Your skin feels loose.",
- "You feel a stabbing pain in your head.",
- "You feel a tingling sensation in your chest.",
- "Your entire body vibrates."))
- if(prob(25))
- if(prob(75))
- scramble(1, H, weakness * severity)
- else
- scramble(0, H, weakness * severity)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm
deleted file mode 100644
index 18165cf0d41..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-
-/datum/artifact_effect/emp
- effecttype = "emp"
- effect_type = 3
-
-/datum/artifact_effect/emp/New()
- ..()
- effect = EFFECT_PULSE
-
-/datum/artifact_effect/emp/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- empulse(T, effectrange/2, effectrange)
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm
deleted file mode 100644
index df7fa75c848..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm
+++ /dev/null
@@ -1,26 +0,0 @@
-
-/datum/artifact_effect/gasco2
- effecttype = "gasco2"
- var/max_pressure
- var/target_percentage
-
-/datum/artifact_effect/heat/New()
- ..()
- effect_type = pick(6,7)
-
-/datum/artifact_effect/gasco2/New()
- ..()
- effect = pick(EFFECT_TOUCH, EFFECT_AURA)
- max_pressure = rand(115,1000)
-
-/datum/artifact_effect/gasco2/DoEffectTouch(var/mob/user)
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env)
- env.carbon_dioxide += rand(2,15)
-
-/datum/artifact_effect/gasco2/DoEffectAura()
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env && env.total_moles() < max_pressure)
- env.carbon_dioxide += pick(0, 0, 0.1, rand())
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm
deleted file mode 100644
index 55e667e5264..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-
-/datum/artifact_effect/gasnitro
- effecttype = "gasnitro"
- var/max_pressure
- var/target_percentage
-
-/datum/artifact_effect/gasnitro/New()
- ..()
- effect = pick(EFFECT_TOUCH, EFFECT_AURA)
- effect_type = pick(6,7)
- max_pressure = rand(115,1000)
-
-/datum/artifact_effect/gasnitro/DoEffectTouch(var/mob/user)
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env)
- env.nitrogen += rand(2,15)
-
-/datum/artifact_effect/gasnitro/DoEffectAura()
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env && env.total_moles() < max_pressure)
- env.nitrogen += pick(0, 0, 0.1, rand())
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm
deleted file mode 100644
index e4c30bd0cbd..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-
-/datum/artifact_effect/gasoxy
- effecttype = "gasoxy"
- var/max_pressure
-
-/datum/artifact_effect/gasoxy/New()
- ..()
- effect = pick(EFFECT_TOUCH, EFFECT_AURA)
- max_pressure = rand(115,1000)
- effect_type = pick(6,7)
-
-
-/datum/artifact_effect/gasoxy/DoEffectTouch(var/mob/user)
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env)
- env.oxygen += rand(2,15)
-
-/datum/artifact_effect/gasoxy/DoEffectAura()
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env && env.total_moles() < max_pressure)
- env.oxygen += pick(0, 0, 0.1, rand())
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm
deleted file mode 100644
index 68719264f02..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-
-/datum/artifact_effect/gasplasma
- effecttype = "gasplasma"
- var/max_pressure
- var/target_percentage
-
-/datum/artifact_effect/gasplasma/New()
- ..()
- effect = pick(EFFECT_TOUCH, EFFECT_AURA)
- max_pressure = rand(115,1000)
- effect_type = pick(6,7)
-
-/datum/artifact_effect/gasplasma/DoEffectTouch(var/mob/user)
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env)
- env.toxins += rand(2,15)
-
-/datum/artifact_effect/gasplasma/DoEffectAura()
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env && env.total_moles() < max_pressure)
- env.toxins += pick(0, 0, 0.1, rand())
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm
deleted file mode 100644
index 76cd29069f0..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-
-/datum/artifact_effect/gassleeping
- effecttype = "gassleeping"
- var/max_pressure
- var/target_percentage
-
-/datum/artifact_effect/gassleeping/New()
- ..()
- effect = pick(EFFECT_TOUCH, EFFECT_AURA)
- max_pressure = rand(115,1000)
- effect_type = pick(6,7)
-
-/datum/artifact_effect/gassleeping/DoEffectTouch(var/mob/user)
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env)
- var/datum/gas/sleeping_agent/trace_gas = new
- env.trace_gases += trace_gas
- trace_gas.moles = rand(2,15)
- env.update_values()
-
-
-/datum/artifact_effect/gassleeping/DoEffectAura()
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env && env.total_moles() < max_pressure)
- var/datum/gas/sleeping_agent/trace_gas = new
- env.trace_gases += trace_gas
- trace_gas.moles = pick(0, 0, 0.1, rand())
- env.update_values()
-
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
deleted file mode 100644
index dd42c44204c..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-
-/datum/artifact_effect/goodfeeling
- effecttype = "goodfeeling"
- effect_type = 2
- var/list/messages = list("You feel good.",\
- "Everything seems to be going alright",\
- "You've got a good feeling about this",\
- "Your instincts tell you everything is going to be getting better.",\
- "There's a good feeling in the air.",\
- "Something smells... good.",\
- "The tips of your fingers feel tingly.",\
- "You've got a good feeling about this.",\
- "You feel happy.",\
- "You fight the urge to smile.",\
- "Your scalp prickles.",\
- "All the colours seem a bit more vibrant.",\
- "Everything seems a little lighter.",\
- "The troubles of the world seem to fade away.")
-
- var/list/drastic_messages = list("You want to hug everyone you meet!",\
- "Everything is going so well!",\
- "You feel euphoric.",\
- "You feel giddy.",\
- "You're so happy suddenly, you almost want to dance and sing.",\
- "You feel like the world is out to help you.")
-
-/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user)
- if(user)
- if(istype(user, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- if(prob(50))
- if(prob(75))
- to_chat(H, "[pick(drastic_messages)]")
- else
- to_chat(H, "[pick(messages)]")
-
- if(prob(50))
- H.AdjustDizzy(rand(3,5))
-
-/datum/artifact_effect/goodfeeling/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(src.effectrange,T))
- if(prob(5))
- if(prob(75))
- to_chat(H, "[pick(messages)]")
- else
- to_chat(H, "[pick(drastic_messages)]")
-
- if(prob(5))
- H.AdjustDizzy(rand(3,5))
- return 1
-
-/datum/artifact_effect/goodfeeling/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(src.effectrange,T))
- if(prob(50))
- if(prob(95))
- to_chat(H, "[pick(drastic_messages)]")
- else
- to_chat(H, "[pick(messages)]")
-
- if(prob(50))
- H.AdjustDizzy(rand(3,5))
- else if(prob(25))
- H.AdjustDizzy(rand(5,15))
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
deleted file mode 100644
index f3b82e18ecd..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
+++ /dev/null
@@ -1,64 +0,0 @@
-
-/datum/artifact_effect/heal
- effecttype = "heal"
- effect_type = 5
-
-/datum/artifact_effect/heal/DoEffectTouch(var/mob/toucher)
- //todo: check over this properly
- if(toucher && iscarbon(toucher))
- var/weakness = GetAnomalySusceptibility(toucher)
- if(prob(weakness * 100))
- var/mob/living/carbon/C = toucher
- to_chat(C, "You feel a soothing energy invigorate you.")
-
- if(ishuman(toucher))
- var/mob/living/carbon/human/H = toucher
- for(var/obj/item/organ/external/affecting in H.bodyparts)
- if(affecting && istype(affecting))
- affecting.heal_damage(25 * weakness, 25 * weakness)
- //H:heal_organ_damage(25, 25)
- H.blood_volume += 5
- H.nutrition += 50 * weakness
- H.adjustBrainLoss(-25 * weakness)
- var/radiation = min(H.radiation, 25 * weakness)
- H.apply_effect(-radiation,IRRADIATE,0)
- H.bodytemperature = initial(H.bodytemperature)
- //
- C.adjustOxyLoss(-25 * weakness)
- C.adjustToxLoss(-25 * weakness)
- C.adjustBruteLoss(-25 * weakness)
- C.adjustFireLoss(-25 * weakness)
- //
- C.regenerate_icons()
- return 1
-
-/datum/artifact_effect/heal/DoEffectAura()
- //todo: check over this properly
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/C in range(src.effectrange,T))
- var/weakness = GetAnomalySusceptibility(C)
- if(prob(weakness * 100))
- if(prob(10))
- to_chat(C, "You feel a soothing energy radiating from something nearby.")
- C.adjustBruteLoss(-1 * weakness)
- C.adjustFireLoss(-1 * weakness)
- C.adjustToxLoss(-1 * weakness)
- C.adjustOxyLoss(-1 * weakness)
- C.adjustBrainLoss(-1 * weakness)
- C.updatehealth()
-
-/datum/artifact_effect/heal/DoEffectPulse()
- //todo: check over this properly
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/C in range(src.effectrange,T))
- var/weakness = GetAnomalySusceptibility(C)
- if(prob(weakness * 100))
- to_chat(C, "A wave of energy invigorates you.")
- C.adjustBruteLoss(-5 * weakness)
- C.adjustFireLoss(-5 * weakness)
- C.adjustToxLoss(-5 * weakness)
- C.adjustOxyLoss(-5 * weakness)
- C.adjustBrainLoss(-5 * weakness)
- C.updatehealth()
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm
deleted file mode 100644
index fb1f9645735..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-
-//inverse of /datum/artifact_effect/cold, the two effects split up for neatness' sake
-/datum/artifact_effect/heat
- effecttype = "heat"
- var/target_temp
-
-/datum/artifact_effect/heat/New()
- ..()
- effect_type = pick(5,6,7)
-
-/datum/artifact_effect/heat/New()
- ..()
- target_temp = rand(300,600)
- effect = pick(EFFECT_TOUCH, EFFECT_AURA)
-
-/datum/artifact_effect/heat/DoEffectTouch(var/mob/user)
- if(holder)
- to_chat(user, "You feel a wave of heat travel up your spine!")
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env)
- env.temperature += rand(5,50)
-
-/datum/artifact_effect/heat/DoEffectAura()
- if(holder)
- var/datum/gas_mixture/env = holder.loc.return_air()
- if(env && env.temperature < target_temp)
- env.temperature += pick(0, 0, 1)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
deleted file mode 100644
index f9e3803ff9f..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-
-/datum/artifact_effect/hurt
- effecttype = "harm"
- effect_type = 5
-
-/datum/artifact_effect/hurt/DoEffectTouch(var/mob/toucher)
- if(toucher)
- var/weakness = GetAnomalySusceptibility(toucher)
- if(iscarbon(toucher) && prob(weakness * 100))
- var/mob/living/carbon/C = toucher
- to_chat(C, "A painful discharge of energy strikes you!")
- C.adjustOxyLoss(rand(5,25) * weakness)
- C.adjustToxLoss(rand(5,25) * weakness)
- C.adjustBruteLoss(rand(5,25) * weakness)
- C.adjustFireLoss(rand(5,25) * weakness)
- C.adjustBrainLoss(rand(5,25) * weakness)
- C.apply_effect(25 * weakness,IRRADIATE,0)
- C.nutrition -= min(50 * weakness, C.nutrition)
- C.Dizzy(6 * weakness)
- C.AdjustWeakened(6 * weakness)
-
-/datum/artifact_effect/hurt/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/C in range(src.effectrange,T))
- var/weakness = GetAnomalySusceptibility(C)
- if(prob(weakness * 100))
- if(prob(10))
- to_chat(C, "You feel a painful force radiating from something nearby.")
- C.adjustBruteLoss(1 * weakness)
- C.adjustFireLoss(1 * weakness)
- C.adjustToxLoss(1 * weakness)
- C.adjustOxyLoss(1 * weakness)
- C.adjustBrainLoss(1 * weakness)
- C.updatehealth()
-
-/datum/artifact_effect/hurt/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/C in range(effectrange, T))
- var/weakness = GetAnomalySusceptibility(C)
- if(prob(weakness * 100))
- to_chat(C, "A wave of painful energy strikes you!")
- C.adjustBruteLoss(3 * weakness)
- C.adjustFireLoss(3 * weakness)
- C.adjustToxLoss(3 * weakness)
- C.adjustOxyLoss(3 * weakness)
- C.adjustBrainLoss(3 * weakness)
- C.updatehealth()
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm
deleted file mode 100644
index f27a4f4219b..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-
-/datum/artifact_effect/radiate
- effecttype = "radiate"
- var/radiation_amount
-
-/datum/artifact_effect/radiate/New()
- ..()
- radiation_amount = rand(1, 10)
- effect_type = pick(4,5)
-
-/datum/artifact_effect/radiate/DoEffectTouch(var/mob/living/user)
- if(user)
- user.apply_effect(radiation_amount * 5,IRRADIATE,0)
- user.updatehealth()
- return 1
-
-/datum/artifact_effect/radiate/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/M in range(src.effectrange,T))
- M.apply_effect(radiation_amount,IRRADIATE,0)
- M.updatehealth()
- return 1
-
-/datum/artifact_effect/radiate/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/M in range(src.effectrange,T))
- M.apply_effect(radiation_amount * 25,IRRADIATE,0)
- M.updatehealth()
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
deleted file mode 100644
index 191c0beb3fe..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-
-/datum/artifact_effect/roboheal
- effecttype = "roboheal"
-
-/datum/artifact_effect/roboheal/New()
- ..()
- effect_type = pick(3,4)
-
-/datum/artifact_effect/roboheal/DoEffectTouch(var/mob/user)
- if(user)
- if(istype(user, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = user
- to_chat(R, "Your systems report damaged components mending by themselves!")
- R.adjustBruteLoss(rand(-10,-30))
- R.adjustFireLoss(rand(-10,-30))
- return 1
-
-/datum/artifact_effect/roboheal/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
- if(prob(10))
- to_chat(M, "SYSTEM ALERT: Beneficial energy field detected!")
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- M.updatehealth()
- return 1
-
-/datum/artifact_effect/roboheal/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
- to_chat(M, "SYSTEM ALERT: Structural damage has been repaired by energy pulse!")
- M.adjustBruteLoss(-10)
- M.adjustFireLoss(-10)
- M.updatehealth()
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
deleted file mode 100644
index 43f49a6ee36..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-
-/datum/artifact_effect/robohurt
- effecttype = "robohurt"
-
-/datum/artifact_effect/robohurt/New()
- ..()
- effect_type = pick(3,4)
-
-/datum/artifact_effect/robohurt/DoEffectTouch(var/mob/user)
- if(user)
- if(istype(user, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = user
- to_chat(R, "Your systems report severe damage has been inflicted!")
- R.adjustBruteLoss(rand(10,50))
- R.adjustFireLoss(rand(10,50))
- return 1
-
-/datum/artifact_effect/robohurt/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
- if(prob(10))
- to_chat(M, "SYSTEM ALERT: Harmful energy field detected!")
- M.adjustBruteLoss(1)
- M.adjustFireLoss(1)
- M.updatehealth()
- return 1
-
-/datum/artifact_effect/robohurt/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
- to_chat(M, "SYSTEM ALERT: Structural damage inflicted by energy pulse!")
- M.adjustBruteLoss(10)
- M.adjustFireLoss(10)
- M.updatehealth()
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
deleted file mode 100644
index ec3c5ced009..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-
-//todo
-/datum/artifact_effect/sleepy
- effecttype = "sleepy"
-
-/datum/artifact_effect/sleepy/New()
- ..()
- effect_type = pick(5,2)
-
-/datum/artifact_effect/sleepy/DoEffectTouch(var/mob/toucher)
- if(toucher)
- var/weakness = GetAnomalySusceptibility(toucher)
- if(ishuman(toucher) && prob(weakness * 100))
- var/mob/living/carbon/human/H = toucher
- to_chat(H, pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired."))
- H.AdjustDrowsy(rand(5,25) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
- H.AdjustEyeBlurry(rand(1,3) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
- return 1
- else if(isrobot(toucher))
- to_chat(toucher, "SYSTEM ALERT: CPU cycles slowing down.")
- return 1
-
-/datum/artifact_effect/sleepy/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(src.effectrange,T))
- var/weakness = GetAnomalySusceptibility(H)
- if(prob(weakness * 100))
- if(prob(10))
- to_chat(H, pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired."))
- H.AdjustDrowsy(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
- H.AdjustEyeBlurry(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
- for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
- to_chat(R, "SYSTEM ALERT: CPU cycles slowing down.")
- return 1
-
-/datum/artifact_effect/sleepy/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/human/H in range(src.effectrange, T))
- var/weakness = GetAnomalySusceptibility(H)
- if(prob(weakness * 100))
- to_chat(H, pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired."))
- H.AdjustDrowsy(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
- H.AdjustEyeBlurry(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
- for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
- to_chat(R, "SYSTEM ALERT: CPU cycles slowing down.")
- return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
deleted file mode 100644
index bc2aa655e34..00000000000
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-
-/datum/artifact_effect/stun
- effecttype = "stun"
-
-/datum/artifact_effect/stun/New()
- ..()
- effect_type = pick(2,5)
-
-/datum/artifact_effect/stun/DoEffectTouch(var/mob/toucher)
- if(toucher && iscarbon(toucher))
- var/mob/living/carbon/C = toucher
- var/susceptibility = GetAnomalySusceptibility(C)
- if(prob(susceptibility * 100))
- to_chat(C, "A powerful force overwhelms your consciousness.")
- C.Weaken(rand(1,10) * susceptibility)
- C.stuttering += 30 * susceptibility
- C.Stun(rand(1,10) * susceptibility)
-
-/datum/artifact_effect/stun/DoEffectAura()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/C in range(src.effectrange,T))
- var/susceptibility = GetAnomalySusceptibility(C)
- if(prob(10 * susceptibility))
- to_chat(C, "Your body goes numb for a moment.")
- C.Weaken(2)
- C.stuttering += 2
- if(prob(10))
- C.Stun(1)
- else if(prob(10))
- to_chat(C, "You feel numb.")
-
-/datum/artifact_effect/stun/DoEffectPulse()
- if(holder)
- var/turf/T = get_turf(holder)
- for(var/mob/living/carbon/C in range(src.effectrange,T))
- var/susceptibility = GetAnomalySusceptibility(C)
- if(prob(100 * susceptibility))
- to_chat(C, "A wave of energy overwhelms your senses!")
- C.SetWeakened(4 * susceptibility)
- C.stuttering = 4 * susceptibility
- if(prob(10))
- C.SetStunned(1 * susceptibility)
diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm
deleted file mode 100644
index 7094f2d00f4..00000000000
--- a/code/modules/research/xenoarchaeology/chemistry.dm
+++ /dev/null
@@ -1,54 +0,0 @@
-/obj/item/weapon/reagent_containers/glass/solution_tray
- name = "solution tray"
- desc = "A small, open-topped glass container for delicate research samples. It sports a re-useable strip for labelling with a pen."
- icon = 'icons/obj/device.dmi'
- icon_state = "solution_tray"
- materials = list(MAT_GLASS=5)
- w_class = WEIGHT_CLASS_TINY
- amount_per_transfer_from_this = 1
- possible_transfer_amounts = list(1, 2)
- volume = 2
- flags = OPENCONTAINER
-
-obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
- if(istype(W, /obj/item/weapon/pen))
- var/new_label = input("What should the new label be?","Label solution tray")
- if(new_label)
- name = "solution tray ([new_label])"
- to_chat(user, "You write on the label of the solution tray.")
- else
- ..(W, user)
-
-/obj/item/weapon/storage/box/solution_trays
- name = "solution tray box"
- icon_state = "solution_trays"
-
- New()
- ..()
- new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
- new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
- new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
- new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
- new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
- new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
- new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
-
-/obj/item/weapon/reagent_containers/glass/beaker/oxygen
- name = "beaker 'oxygen'"
- list_reagents = list("oxygen" = 50)
-
-/obj/item/weapon/reagent_containers/glass/beaker/sodium
- name = "beaker 'sodium'"
- list_reagents = list("sodium" = 50)
-
-/obj/item/weapon/reagent_containers/glass/beaker/lithium
- name = "beaker 'lithium'"
- list_reagents = list("lithium" = 50)
-
-/obj/item/weapon/reagent_containers/glass/beaker/water
- name = "beaker 'water'"
- list_reagents = list("water" = 50)
-
-/obj/item/weapon/reagent_containers/glass/beaker/fuel
- name = "beaker 'fuel'"
- list_reagents = list("fuel" = 50)
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm
deleted file mode 100644
index 1b1788eb1a1..00000000000
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ /dev/null
@@ -1,554 +0,0 @@
-//original code and idea from Alfie275 (luna era) and ISaidNo (goonservers) - with thanks
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Xenoarchaeological finds
-
-/datum/find
- var/find_type = 0 //random according to the digsite type
- var/excavation_required = 0 //random 5-95%
- var/view_range = 20 //how close excavation has to come to show an overlay on the turf
- var/clearance_range = 3 //how close excavation has to come to extract the item
- //if excavation hits var/excavation_required exactly, it's contained find is extracted cleanly without the ore
- var/prob_delicate = 90 //probability it requires an active suspension field to not insta-crumble
- var/dissonance_spread = 1 //proportion of the tile that is affected by this find
- //used in conjunction with analysis machines to determine correct suspension field type
-
-/datum/find/New(var/digsite, var/exc_req)
- excavation_required = exc_req
- find_type = get_random_find_type(digsite)
- clearance_range = rand(2,6)
- dissonance_spread = rand(1500,2500) / 100
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Strange rocks
-
-//have all strange rocks be cleared away using welders for now
-/obj/item/weapon/ore/strangerock
- name = "Strange rock"
- desc = "Seems to have some unusal strata evident throughout it."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "strange"
- var/obj/item/weapon/inside
- var/method = 0// 0 = fire, 1 = brush, 2 = pick
- origin_tech = "materials=5"
-
-/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0)
- ..(loc)
-
- //method = rand(0,2)
- if(inside_item_type)
- inside = new/obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type)
- if(!inside)
- inside = locate() in contents
-
-/*/obj/item/weapon/ore/strangerock/ex_act(var/severity)
- if(severity && prob(30))
- src.visible_message("The [src] crumbles away, leaving some dust and gravel behind.")*/
-
-/obj/item/weapon/ore/strangerock/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/weldingtool/))
- var/obj/item/weapon/weldingtool/w = W
- if(w.isOn())
- if(w.get_fuel() >= 4 && !src.method)
- if(inside)
- inside.loc = get_turf(src)
- for(var/mob/M in viewers(world.view, user))
- M.show_message("[src] burns away revealing [inside].",1)
- else
- for(var/mob/M in viewers(world.view, user))
- M.show_message("[src] burns away into nothing.",1)
- qdel(src)
- w.remove_fuel(4)
- else
- for(var/mob/M in viewers(world.view, user))
- M.show_message("A few sparks fly off [src], but nothing else happens.",1)
- w.remove_fuel(1)
- return
-
- else if(istype(W,/obj/item/device/core_sampler/))
- var/obj/item/device/core_sampler/S = W
- S.sample_item(src, user)
- return
-
- ..()
- if(prob(33))
- src.visible_message("[src] crumbles away, leaving some dust and gravel behind.")
- qdel(src)
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Archaeological finds
-
-/obj/item/weapon/archaeological_find
- name = "object"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "ano01"
- var/find_type = 0
-
-/obj/item/weapon/archaeological_find/New(loc, var/new_item_type)
- if(new_item_type)
- find_type = new_item_type
- else
- find_type = rand(1,33) //update this when you add new find types
-
- var/item_type = "object"
- icon_state = "unknown[rand(1,4)]"
- var/additional_desc = ""
- var/obj/item/weapon/new_item
- var/source_material = ""
- var/apply_material_decorations = 1
- var/apply_image_decorations = 0
- var/material_descriptor = ""
- var/apply_prefix = 1
- if(prob(40))
- material_descriptor = pick("rusted ","dusty ","archaic ","fragile ")
- source_material = pick("cordite","quadrinium","steel","titanium","aluminium","ferritic-alloy","plasteel","duranium")
-
- var/talkative = 0
- if(prob(5))
- talkative = 1
-
- //for all items here:
- //icon_state
- //item_state
- switch(find_type)
- if(1)
- item_type = "bowl"
- if(prob(33))
- new_item = new /obj/item/weapon/reagent_containers/glass/replenishing(src.loc)
- else
- new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
- new_item.icon = 'icons/obj/xenoarchaeology.dmi'
- new_item.icon_state = "bowl"
- apply_image_decorations = 1
- if(prob(20))
- additional_desc = "There appear to be [pick("dark","faintly glowing","pungent","bright")] [pick("red","purple","green","blue")] stains inside."
- if(2)
- item_type = "urn"
- if(prob(33))
- new_item = new /obj/item/weapon/reagent_containers/glass/replenishing(src.loc)
- else
- new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
- new_item.icon = 'icons/obj/xenoarchaeology.dmi'
- new_item.icon_state = "urn"
- apply_image_decorations = 1
- if(prob(20))
- additional_desc = "It [pick("whispers faintly","makes a quiet roaring sound","whistles softly","thrums quietly","throbs")] if you put it to your ear."
- if(3)
- item_type = "[pick("fork","spoon","knife")]"
- if(prob(25))
- new_item = new /obj/item/weapon/kitchen/utensil/fork(src.loc)
- else if(prob(50))
- new_item = new /obj/item/weapon/kitchen/knife(src.loc)
- else
- new_item = new /obj/item/weapon/kitchen/utensil/spoon(src.loc)
- additional_desc = "[pick("It's like no [item_type] you've ever seen before",\
- "It's a mystery how anyone is supposed to eat with this",\
- "You wonder what the creator's mouth was shaped like")]."
- if(4)
- name = "statuette"
- item_type = "statuette"
- icon_state = "statuette"
- additional_desc = "It depicts a [pick("small","ferocious","wild","pleasing","hulking")] \
- [pick("alien figure","rodent-like creature","reptilian alien","primate","unidentifiable object")] \
- [pick("performing unspeakable acts","posing heroically","in a fetal position","cheering","sobbing","making a plaintive gesture","making a rude gesture")]."
- if(prob(25))
- new_item = new /obj/item/weapon/vampiric(src.loc)
- if(5)
- item_type = "instrument"
- icon_state = "instrument"
- if(prob(30))
- apply_image_decorations = 1
- additional_desc = "[pick("You're not sure how anyone could have played this",\
- "You wonder how many mouths the creator had",\
- "You wonder what it sounds like",\
- "You wonder what kind of music was made with it")]."
- if(6)
- item_type = "[pick("bladed knife","serrated blade","sharp cutting implement")]"
- new_item = new /obj/item/weapon/kitchen/knife(src.loc)
- additional_desc = "[pick("It doesn't look safe.",\
- "It looks wickedly jagged",\
- "There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges")]."
- if(7)
- //assuming there are 10 types of coins
- var/chance = 10
- for(var/type in typesof(/obj/item/weapon/coin))
- if(prob(chance))
- new_item = new type(src.loc)
- break
- chance += 10
-
- item_type = new_item.name
- apply_prefix = 0
- apply_material_decorations = 0
- apply_image_decorations = 1
- if(8)
- item_type = "handcuffs"
- new_item = new /obj/item/weapon/restraints/handcuffs(src.loc)
- additional_desc = "[pick("They appear to be for securing two things together","Looks kinky","Doesn't seem like a children's toy")]."
- if(9)
- item_type = "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]"
- apply_prefix = 0
- new_item = new /obj/item/weapon/restraints/legcuffs/beartrap(src.loc)
- additional_desc = "[pick("It looks like it could take a limb off",\
- "Could be some kind of animal trap",\
- "There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along part of it")]."
- if(10)
- item_type = "[pick("cylinder","tank","chamber")]"
- new_item = new /obj/item/weapon/lighter(src.loc)
- additional_desc = "There is a tiny device attached."
- if(prob(30))
- apply_image_decorations = 1
- if(11)
- item_type = "box"
- new_item = new /obj/item/weapon/storage/box(src.loc)
- new_item.icon = 'icons/obj/xenoarchaeology.dmi'
- new_item.icon_state = "box"
- var/obj/item/weapon/storage/box/new_box = new_item
- new_box.max_w_class = pick(1,2,2,3,3,3,4,4)
- new_box.max_combined_w_class = rand(new_box.max_w_class, new_box.max_w_class * 10)
- if(prob(30))
- apply_image_decorations = 1
- if(12)
- item_type = "[pick("cylinder","tank","chamber")]"
- if(prob(25))
- new_item = new /obj/item/weapon/tank/air(src.loc)
- else if(prob(50))
- new_item = new /obj/item/weapon/tank/anesthetic(src.loc)
- else
- new_item = new /obj/item/weapon/tank/plasma(src.loc)
- icon_state = pick("oxygen","oxygen_fr","oxygen_f","plasma","anesthetic")
- additional_desc = "It [pick("gloops","sloshes")] slightly when you shake it."
- if(13)
- item_type = "tool"
- if(prob(25))
- new_item = new /obj/item/weapon/wrench(src.loc)
- else if(prob(25))
- new_item = new /obj/item/weapon/crowbar(src.loc)
- else
- new_item = new /obj/item/weapon/screwdriver(src.loc)
- additional_desc = "[pick("It doesn't look safe.",\
- "You wonder what it was used for",\
- "There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains on it")]."
- if(14)
- apply_material_decorations = 0
- var/list/possible_spawns = list()
- possible_spawns += /obj/item/stack/sheet/metal
- possible_spawns += /obj/item/stack/sheet/plasteel
- possible_spawns += /obj/item/stack/sheet/glass
- possible_spawns += /obj/item/stack/sheet/rglass
- possible_spawns += /obj/item/stack/sheet/mineral/plasma
- possible_spawns += /obj/item/stack/sheet/mineral/gold
- possible_spawns += /obj/item/stack/sheet/mineral/silver
- possible_spawns += /obj/item/stack/sheet/mineral/enruranium
- possible_spawns += /obj/item/stack/sheet/mineral/sandstone
- possible_spawns += /obj/item/stack/sheet/mineral/silver
-
- var/new_type = pick(possible_spawns)
- new_item = new new_type(src.loc)
- new_item:amount = rand(5,45)
- if(15)
- if(prob(75))
- new_item = new /obj/item/weapon/pen(src.loc)
- else
- new_item = new /obj/item/weapon/pen/sleepy(src.loc)
- if(prob(30))
- apply_image_decorations = 1
- if(16)
- apply_prefix = 0
- if(prob(25))
- item_type = "smooth green crystal"
- icon_state = "Green lump"
- else if(prob(33))
- item_type = "irregular purple crystal"
- icon_state = "Phazon"
- else if(prob(50))
- item_type = "rough red crystal"
- icon_state = "changerock"
- else
- item_type = "smooth red crystal"
- icon_state = "ore"
- additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.")
-
- apply_material_decorations = 0
- if(prob(10))
- apply_image_decorations = 1
- if(prob(25))
- new_item = new /obj/item/device/soulstone(src.loc)
- new_item.icon = 'icons/obj/xenoarchaeology.dmi'
- new_item.icon_state = icon_state
- if(17)
- //cultblade
- apply_prefix = 0
- new_item = new /obj/item/weapon/melee/cultblade(src.loc)
- apply_material_decorations = 0
- apply_image_decorations = 0
- if(18)
- new_item = new /obj/item/device/radio/beacon(src.loc)
- talkative = 0
- new_item.icon_state = "unknown[rand(1,4)]"
- new_item.icon = 'icons/obj/xenoarchaeology.dmi'
- new_item.desc = ""
- if(19)
- apply_prefix = 0
- new_item = new /obj/item/weapon/claymore(src.loc)
- new_item.force = 10
- item_type = new_item.name
- if(20)
- //arcane clothing
- apply_prefix = 0
- var/list/possible_spawns = list(/obj/item/clothing/head/magus,
- /obj/item/clothing/head/helmet/space/cult)
-
- var/new_type = pick(possible_spawns)
- new_item = new new_type(src.loc)
- if(21)
- //soulstone
- apply_prefix = 0
- new_item = new /obj/item/device/soulstone(src.loc)
- item_type = new_item.name
- apply_material_decorations = 0
- if(22)
- if(prob(50))
- new_item = new /obj/item/weapon/shard(loc)
- else
- new_item = new /obj/item/weapon/shard/plasma(loc)
-
- apply_prefix = 0
- apply_image_decorations = 0
- apply_material_decorations = 0
- if(23)
- apply_prefix = 0
- new_item = new /obj/item/stack/rods(src.loc)
- apply_image_decorations = 0
- apply_material_decorations = 0
- if(24)
- var/list/possible_spawns = subtypesof(/obj/item/weapon/stock_parts)
- possible_spawns -= /obj/item/weapon/stock_parts/subspace
-
- var/new_type = pick(possible_spawns)
- new_item = new new_type(src.loc)
- item_type = new_item.name
- apply_material_decorations = 0
- if(25)
- apply_prefix = 0
- new_item = new /obj/item/weapon/katana(src.loc)
- new_item.force = 10
- item_type = new_item.name
- if(26)
- //energy gun
- var/spawn_type = pick(\
- /obj/item/weapon/gun/energy/laser/practice,\
- /obj/item/weapon/gun/energy/laser,\
- /obj/item/weapon/gun/energy/xray,\
- /obj/item/weapon/gun/energy/laser/captain)
- if(spawn_type)
- var/obj/item/weapon/gun/energy/new_gun = new spawn_type(src.loc)
- new_item = new_gun
- new_item.icon_state = pick("laser","retro","laser","caplaser","xray","energy","laser")
- new_gun.desc = "This is an antique energy weapon, you're not sure if it will fire or not."
-
- //5% chance to explode when first fired
- //10% chance to have an unchargeable cell
- //15% chance to gain a random amount of starting energy, otherwise start with an empty cell
- if(prob(5))
- new_gun.power_supply.rigged = 1
- if(prob(10))
- new_gun.power_supply.maxcharge = 0
- if(prob(15))
- new_gun.power_supply.charge = rand(0, new_gun.power_supply.maxcharge)
- else
- new_gun.power_supply.charge = 0
-
- item_type = "gun"
-/* if(27)
- //revolver
- var/obj/item/weapon/gun/projectile/revolver/new_gun = new /obj/item/weapon/gun/projectile/revolver(src.loc)
- new_item = new_gun
- new_item.icon_state = "gun[rand(1,4)]"
- new_item.icon = 'icons/obj/xenoarchaeology.dmi'
-
- //33% chance to be able to reload the gun with human ammunition
- if(prob(66))
- new_gun.caliber = "999"
-
- //33% chance to fill it with a random amount of bullets
- new_gun.max_shells = rand(1,12)
- if(prob(33))
- var/num_bullets = rand(1,new_gun.max_shells)
- if(num_bullets < new_gun.loaded.len)
- new_gun.loaded.Cut()
- for(var/i = 1, i <= num_bullets, i++)
- var/A = text2path(new_gun.ammo_type)
- new_gun.loaded += new A(new_gun)
- else
- for(var/obj/item/I in new_gun)
- if(new_gun.loaded.len > num_bullets)
- if(I in new_gun.loaded)
- new_gun.loaded.Remove(I)
- I.loc = null
- else
- break
- else
- for(var/obj/item/I in new_gun)
- if(I in new_gun.loaded)
- new_gun.loaded.Remove(I)
- I.loc = null
-
- item_type = "gun"*/
- if(28)
- //completely unknown alien device
- if(prob(50))
- apply_image_decorations = 0
- if(29)
- //fossil bone/skull
- //new_item = new /obj/item/weapon/fossil/base(src.loc)
-
- //the replacement item propogation isn't working, and it's messy code anyway so just do it here
- var/list/candidates = list("/obj/item/weapon/fossil/bone"=9,"/obj/item/weapon/fossil/skull"=3,
- "/obj/item/weapon/fossil/skull/horned"=2)
- var/spawn_type = pickweight(candidates)
- new_item = new spawn_type(src.loc)
-
- apply_prefix = 0
- additional_desc = "A fossilised part of an alien, long dead."
- apply_image_decorations = 0
- apply_material_decorations = 0
- if(30)
- //fossil shell
- new_item = new /obj/item/weapon/fossil/shell(src.loc)
- apply_prefix = 0
- additional_desc = "A fossilised, pre-Stygian alien crustacean."
- apply_image_decorations = 0
- apply_material_decorations = 0
- if(prob(10))
- apply_image_decorations = 1
- if(31)
- //fossil plant
- new_item = new /obj/item/weapon/fossil/plant(src.loc)
- item_type = new_item.name
- additional_desc = "A fossilised shred of alien plant matter."
- apply_image_decorations = 0
- apply_material_decorations = 0
- apply_prefix = 0
- if(32)
- //humanoid remains
- apply_prefix = 0
- item_type = "humanoid [pick("remains","skeleton")]"
- icon = 'icons/effects/blood.dmi'
- icon_state = "remains"
- additional_desc = pick("They appear almost human.",\
- "They are contorted in a most gruesome way.",\
- "They look almost peaceful.",\
- "The bones are yellowing and old, but remarkably well preserved.",\
- "The bones are scored by numerous burns and partially melted.",\
- "The are battered and broken, in some cases less than splinters are left.",\
- "The mouth is wide open in a death rictus, the victim would appear to have died screaming.")
- apply_image_decorations = 0
- apply_material_decorations = 0
- if(33)
- //robot remains
- apply_prefix = 0
- item_type = "[pick("mechanical","robotic","cyborg")] [pick("remains","chassis","debris")]"
- icon = 'icons/effects/blood.dmi'
- icon_state = "remainsrobot"
- additional_desc = pick("Almost mistakeable for the remains of a modern cyborg.",\
- "They are barely recognisable as anything other than a pile of waste metals.",\
- "It looks like the battered remains of an ancient robot chassis.",\
- "The chassis is rusting and old, but remarkably well preserved.",\
- "The chassis is scored by numerous burns and partially melted.",\
- "The chassis is battered and broken, in some cases only chunks of metal are left.",\
- "A pile of wires and crap metal that looks vaguely robotic.")
- apply_image_decorations = 0
- apply_material_decorations = 0
- if(27)
- //xenos remains
- apply_prefix = 0
- item_type = "alien [pick("remains","skeleton")]"
- icon = 'icons/effects/blood.dmi'
- icon_state = "remainsxeno"
- additional_desc = pick("It looks vaguely reptilian, but with more teeth.",\
- "They are faintly unsettling.",\
- "There is a faint aura of unease about them.",\
- "The bones are yellowing and old, but remarkably well preserved.",\
- "The bones are scored by numerous burns and partially melted.",\
- "The are battered and broken, in some cases less than splinters are left.",\
- "This creature would have been twisted and monstrous when it was alive.",\
- "It doesn't look human.")
- apply_image_decorations = 0
- apply_material_decorations = 0
- if(35)
- //gas mask
- if(prob(25))
- new_item = new /obj/item/clothing/mask/gas/poltergeist(src.loc)
- else
- new_item = new /obj/item/clothing/mask/gas(src.loc)
- var/decorations = ""
- if(apply_material_decorations)
- source_material = pick("cordite","quadrinium","steel","titanium","aluminium","ferritic-alloy","plasteel","duranium")
- desc = "A [material_descriptor ? "[material_descriptor] " : ""][item_type] made of [source_material], all craftsmanship is of [pick("the lowest","low","average","high","the highest")] quality."
-
- var/list/descriptors = list()
- if(prob(30))
- descriptors.Add("is encrusted with [pick("","synthetic ","multi-faceted ","uncut ","sparkling ") + pick("rubies","emeralds","diamonds","opals","lapiz lazuli")]")
- if(prob(30))
- descriptors.Add("is studded with [pick("gold","silver","aluminium","titanium")]")
- if(prob(30))
- descriptors.Add("is encircled with bands of [pick("quadrinium","cordite","ferritic-alloy","plasteel","duranium")]")
- if(prob(30))
- descriptors.Add("menaces with spikes of [pick("solid plasma","uranium","white pearl","black steel")]")
- if(descriptors.len > 0)
- decorations = "It "
- for(var/index=1, index <= descriptors.len, index++)
- if(index > 1)
- if(index == descriptors.len)
- decorations += " and "
- else
- decorations += ", "
- decorations += descriptors[index]
- decorations += "."
- if(decorations)
- desc += " " + decorations
-
- var/engravings = ""
- if(apply_image_decorations)
- engravings = "[pick("Engraved","Carved","Etched")] on the item is [pick("an image of","a frieze of","a depiction of")] \
- [pick("an alien humanoid","an amorphic blob","a short, hairy being","a rodent-like creature","a robot","a primate","a reptilian alien","an unidentifiable object","a statue","a starship","unusual devices","a structure")] \
- [pick("surrounded by","being held aloft by","being struck by","being examined by","communicating with")] \
- [pick("alien humanoids","amorphic blobs","short, hairy beings","rodent-like creatures","robots","primates","reptilian aliens")]"
- if(prob(50))
- engravings += ", [pick("they seem to be enjoying themselves","they seem extremely angry","they look pensive","they are making gestures of supplication","the scene is one of subtle horror","the scene conveys a sense of desperation","the scene is completely bizarre")]"
- engravings += "."
-
- if(desc)
- desc += " "
- desc += engravings
-
- if(apply_prefix)
- name = "[pick("Strange","Ancient","Alien","")] [item_type]"
- else
- name = item_type
-
- if(desc)
- desc += " "
- desc += additional_desc
- if(!desc)
- desc = "This item is completely [pick("alien","bizarre")]."
-
- //icon and icon_state should have already been set
- if(new_item)
- new_item.name = name
- new_item.desc = src.desc
-
- if(talkative)
- new_item.talking_atom = new()
- if(talking_atom)
- talking_atom.holder_atom = new_item
- talking_atom.init()
-
- qdel(src)
-
- else if(talkative)
- src.talking_atom = new()
- if(talking_atom)
- talking_atom.holder_atom = src
- talking_atom.init()
diff --git a/code/modules/research/xenoarchaeology/finds/finds_defines.dm b/code/modules/research/xenoarchaeology/finds/finds_defines.dm
deleted file mode 100644
index 2c6337ec0fa..00000000000
--- a/code/modules/research/xenoarchaeology/finds/finds_defines.dm
+++ /dev/null
@@ -1,281 +0,0 @@
-
-#define ARCHAEO_BOWL 1
-#define ARCHAEO_URN 2
-#define ARCHAEO_CUTLERY 3
-#define ARCHAEO_STATUETTE 4
-#define ARCHAEO_INSTRUMENT 5
-#define ARCHAEO_KNIFE 6
-#define ARCHAEO_COIN 7
-#define ARCHAEO_HANDCUFFS 8
-#define ARCHAEO_BEARTRAP 9
-#define ARCHAEO_LIGHTER 10
-#define ARCHAEO_BOX 11
-#define ARCHAEO_GASTANK 12
-#define ARCHAEO_TOOL 13
-#define ARCHAEO_METAL 14
-#define ARCHAEO_PEN 15
-#define ARCHAEO_CRYSTAL 16
-#define ARCHAEO_CULTBLADE 17
-#define ARCHAEO_TELEBEACON 18
-#define ARCHAEO_CLAYMORE 19
-#define ARCHAEO_CULTROBES 20
-#define ARCHAEO_SOULSTONE 21
-#define ARCHAEO_SHARD 22
-#define ARCHAEO_RODS 23
-#define ARCHAEO_STOCKPARTS 24
-#define ARCHAEO_KATANA 25
-#define ARCHAEO_LASER 26
-#define ARCHAEO_GUN 27
-#define ARCHAEO_UNKNOWN 28
-#define ARCHAEO_FOSSIL 29
-#define ARCHAEO_SHELL 30
-#define ARCHAEO_PLANT 31
-#define ARCHAEO_REMAINS_HUMANOID 32
-#define ARCHAEO_REMAINS_ROBOT 33
-#define ARCHAEO_REMAINS_XENO 34
-#define ARCHAEO_GASMASK 35
-#define MAX_ARCHAEO 35
-//eggs
-//droppings
-//footprints
-//alien clothing
-
-//DNA sampling from fossils, or a new archaeo type specifically for it?
-
-//descending order of likeliness to spawn
-#define DIGSITE_GARDEN 1
-#define DIGSITE_ANIMAL 2
-#define DIGSITE_HOUSE 3
-#define DIGSITE_TECHNICAL 4
-#define DIGSITE_TEMPLE 5
-#define DIGSITE_WAR 6
-
-/proc/get_responsive_reagent(var/find_type)
- switch(find_type)
- if(ARCHAEO_BOWL)
- return "mercury"
- if(ARCHAEO_URN)
- return "mercury"
- if(ARCHAEO_CUTLERY)
- return "mercury"
- if(ARCHAEO_STATUETTE)
- return "mercury"
- if(ARCHAEO_INSTRUMENT)
- return "mercury"
- if(ARCHAEO_COIN)
- return "iron"
- if(ARCHAEO_KNIFE)
- return "iron"
- if(ARCHAEO_HANDCUFFS)
- return "mercury"
- if(ARCHAEO_BEARTRAP)
- return "mercury"
- if(ARCHAEO_LIGHTER)
- return "mercury"
- if(ARCHAEO_BOX)
- return "mercury"
- if(ARCHAEO_GASTANK)
- return "mercury"
- if(ARCHAEO_TOOL)
- return "iron"
- if(ARCHAEO_METAL)
- return "iron"
- if(ARCHAEO_PEN)
- return "mercury"
- if(ARCHAEO_CRYSTAL)
- return "nitrogen"
- if(ARCHAEO_CULTBLADE)
- return "potassium"
- if(ARCHAEO_TELEBEACON)
- return "potassium"
- if(ARCHAEO_CLAYMORE)
- return "iron"
- if(ARCHAEO_CULTROBES)
- return "potassium"
- if(ARCHAEO_SOULSTONE)
- return "nitrogen"
- if(ARCHAEO_SHARD)
- return "nitrogen"
- if(ARCHAEO_RODS)
- return "iron"
- if(ARCHAEO_STOCKPARTS)
- return "potassium"
- if(ARCHAEO_KATANA)
- return "iron"
- if(ARCHAEO_LASER)
- return "iron"
- if(ARCHAEO_GUN)
- return "iron"
- if(ARCHAEO_UNKNOWN)
- return "mercury"
- if(ARCHAEO_FOSSIL)
- return "carbon"
- if(ARCHAEO_SHELL)
- return "carbon"
- if(ARCHAEO_PLANT)
- return "carbon"
- if(ARCHAEO_REMAINS_HUMANOID)
- return "carbon"
- if(ARCHAEO_REMAINS_ROBOT)
- return "carbon"
- if(ARCHAEO_REMAINS_XENO)
- return "carbon"
- if(ARCHAEO_GASMASK)
- return "carbon"
- return "plasma"
-
-//see /turf/simulated/mineral/New() in code/modules/mining/mine_turfs.dm
-/proc/get_random_digsite_type()
- return pick(100;DIGSITE_GARDEN,95;DIGSITE_ANIMAL,90;DIGSITE_HOUSE,85;DIGSITE_TECHNICAL,80;DIGSITE_TEMPLE,75;DIGSITE_WAR)
-
-/proc/get_random_find_type(var/digsite)
-
- var/find_type = 0
- switch(digsite)
- if(DIGSITE_GARDEN)
- find_type = pick(\
- 100;ARCHAEO_PLANT,\
- 25;ARCHAEO_SHELL,\
- 25;ARCHAEO_FOSSIL,\
- 5;ARCHAEO_BEARTRAP\
- )
- if(DIGSITE_ANIMAL)
- find_type = pick(\
- 100;ARCHAEO_FOSSIL,\
- 50;ARCHAEO_SHELL,\
- 50;ARCHAEO_PLANT,\
- 25;ARCHAEO_BEARTRAP\
- )
- if(DIGSITE_HOUSE)
- find_type = pick(\
- 100;ARCHAEO_BOWL,\
- 100;ARCHAEO_URN,\
- 100;ARCHAEO_CUTLERY,\
- 100;ARCHAEO_STATUETTE,\
- 100;ARCHAEO_INSTRUMENT,\
- 100;ARCHAEO_PEN,\
- 100;ARCHAEO_LIGHTER,\
- 100;ARCHAEO_BOX,\
- 75;ARCHAEO_GASMASK,\
- 75;ARCHAEO_COIN,\
- 75;ARCHAEO_UNKNOWN,\
- 50;ARCHAEO_SHARD,\
- 50;ARCHAEO_RODS,\
- 25;ARCHAEO_METAL\
- )
- if(DIGSITE_TECHNICAL)
- find_type = pick(\
- 125;ARCHAEO_GASMASK,\
- 100;ARCHAEO_METAL,\
- 100;ARCHAEO_GASTANK,\
- 100;ARCHAEO_TELEBEACON,\
- 100;ARCHAEO_TOOL,\
- 100;ARCHAEO_STOCKPARTS,\
- 75;ARCHAEO_SHARD,\
- 75;ARCHAEO_RODS,\
- 75;ARCHAEO_UNKNOWN,\
- 50;ARCHAEO_HANDCUFFS,\
- 50;ARCHAEO_BEARTRAP,\
- )
- if(DIGSITE_TEMPLE)
- find_type = pick(\
- 200;ARCHAEO_CULTROBES,\
- 200;ARCHAEO_STATUETTE,\
- 100;ARCHAEO_URN,\
- 100;ARCHAEO_BOWL,\
- 100;ARCHAEO_KNIFE,\
- 100;ARCHAEO_CRYSTAL,\
- 75;ARCHAEO_CULTBLADE,\
- 50;ARCHAEO_SOULSTONE,\
- 50;ARCHAEO_UNKNOWN,\
- 25;ARCHAEO_HANDCUFFS,\
- 25;ARCHAEO_BEARTRAP,\
- 10;ARCHAEO_KATANA,\
- 10;ARCHAEO_CLAYMORE,\
- 10;ARCHAEO_SHARD,\
- 10;ARCHAEO_RODS,\
- 10;ARCHAEO_METAL,\
- 10;ARCHAEO_GASMASK,\
- )
- if(DIGSITE_WAR)
- find_type = pick(\
- 100;ARCHAEO_GUN,\
- 100;ARCHAEO_KNIFE,\
- 75;ARCHAEO_LASER,\
- 75;ARCHAEO_KATANA,\
- 75;ARCHAEO_CLAYMORE,\
- 50;ARCHAEO_UNKNOWN,\
- 50;ARCHAEO_CULTROBES,\
- 50;ARCHAEO_CULTBLADE,\
- 50;ARCHAEO_GASMASK,\
- 25;ARCHAEO_HANDCUFFS,\
- 25;ARCHAEO_BEARTRAP,\
- 25;ARCHAEO_TOOL\
- )
- return find_type
-
-var/list/responsive_carriers = list( \
- "carbon", \
- "potassium", \
- "hydrogen", \
- "nitrogen", \
- "mercury", \
- "iron", \
- "chlorine", \
- "phosphorus", \
- "plasma")
-
-var/list/finds_as_strings = list( \
- "Trace organic cells", \
- "Long exposure particles", \
- "Trace water particles", \
- "Crystalline structures", \
- "Metallic derivative", \
- "Metallic composite", \
- "Metamorphic/igneous rock composite", \
- "Metamorphic/sedimentary rock composite", \
- "Anomalous material" )
-
-#undef ARCHAEO_BOWL
-#undef ARCHAEO_URN
-#undef ARCHAEO_CUTLERY
-#undef ARCHAEO_STATUETTE
-#undef ARCHAEO_INSTRUMENT
-#undef ARCHAEO_KNIFE
-#undef ARCHAEO_COIN
-#undef ARCHAEO_HANDCUFFS
-#undef ARCHAEO_BEARTRAP
-#undef ARCHAEO_LIGHTER
-#undef ARCHAEO_BOX
-#undef ARCHAEO_GASTANK
-#undef ARCHAEO_TOOL
-#undef ARCHAEO_METAL
-#undef ARCHAEO_PEN
-#undef ARCHAEO_CRYSTAL
-#undef ARCHAEO_CULTBLADE
-#undef ARCHAEO_TELEBEACON
-#undef ARCHAEO_CLAYMORE
-#undef ARCHAEO_CULTROBES
-#undef ARCHAEO_SOULSTONE
-#undef ARCHAEO_SHARD
-#undef ARCHAEO_RODS
-#undef ARCHAEO_STOCKPARTS
-#undef ARCHAEO_KATANA
-#undef ARCHAEO_LASER
-#undef ARCHAEO_GUN
-#undef ARCHAEO_UNKNOWN
-#undef ARCHAEO_FOSSIL
-#undef ARCHAEO_SHELL
-#undef ARCHAEO_PLANT
-#undef ARCHAEO_REMAINS_HUMANOID
-#undef ARCHAEO_REMAINS_ROBOT
-#undef ARCHAEO_REMAINS_XENO
-#undef ARCHAEO_GASMASK
-#undef MAX_ARCHAEO
-
-#undef DIGSITE_GARDEN
-#undef DIGSITE_ANIMAL
-#undef DIGSITE_HOUSE
-#undef DIGSITE_TECHNICAL
-#undef DIGSITE_TEMPLE
-#undef DIGSITE_WAR
diff --git a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm
deleted file mode 100644
index be176c114f4..00000000000
--- a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm
+++ /dev/null
@@ -1,104 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// fossils
-
-/obj/item/weapon/fossil
- name = "Fossil"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "bone"
- desc = "It's a fossil."
- var/animal = 1
-
-/obj/item/weapon/fossil/base/New()
- var/list/l = list("/obj/item/weapon/fossil/bone"=9,"/obj/item/weapon/fossil/skull"=3,
- "/obj/item/weapon/fossil/skull/horned"=2)
- var/t = pickweight(l)
- var/obj/item/weapon/W = new t(src.loc)
- var/turf/T = get_turf(src)
- if(istype(T, /turf/simulated/mineral))
- T:last_find = W
- qdel(src)
-
-/obj/item/weapon/fossil/bone
- name = "Fossilised bone"
- icon_state = "bone"
- desc = "It's a fossilised bone."
-
-/obj/item/weapon/fossil/skull
- name = "Fossilised skull"
- icon_state = "skull"
- desc = "It's a fossilised skull."
-
-/obj/item/weapon/fossil/skull/horned
- icon_state = "hskull"
- desc = "It's a fossilised, horned skull."
-
-/obj/item/weapon/fossil/skull/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/fossil/bone))
- var/obj/o = new /obj/skeleton(get_turf(src))
- var/a = new /obj/item/weapon/fossil/bone
- var/b = new src.type
- o.contents.Add(a)
- o.contents.Add(b)
- qdel(W)
- qdel(src)
-
-/obj/skeleton
- name = "Incomplete skeleton"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "uskel"
- desc = "Incomplete skeleton."
- var/bnum = 1
- var/breq
- var/bstate = 0
- var/plaque_contents = "Unnamed alien creature"
-
-/obj/skeleton/New()
- src.breq = rand(6)+3
- src.desc = "An incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones."
-
-/obj/skeleton/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/fossil/bone))
- if(!bstate)
- bnum++
- src.contents.Add(new/obj/item/weapon/fossil/bone)
- qdel(W)
- if(bnum==breq)
- usr = user
- icon_state = "skel"
- src.bstate = 1
- src.density = 1
- src.name = "alien skeleton display"
- if(src.contents.Find(/obj/item/weapon/fossil/skull/horned))
- src.desc = "A creature made of [src.contents.len-1] assorted bones and a horned skull. The plaque reads \'[plaque_contents]\'."
- else
- src.desc = "A creature made of [src.contents.len-1] assorted bones and a skull. The plaque reads \'[plaque_contents]\'."
- else
- src.desc = "Incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones."
- to_chat(user, "Looks like it could use [src.breq-src.bnum] more bones.")
- else
- ..()
- else if(istype(W,/obj/item/weapon/pen))
- plaque_contents = input("What would you like to write on the plaque:","Skeleton plaque","")
- user.visible_message("[user] writes something on the base of [src].","You relabel the plaque on the base of [bicon(src)] [src].")
- if(src.contents.Find(/obj/item/weapon/fossil/skull/horned))
- src.desc = "A creature made of [src.contents.len-1] assorted bones and a horned skull. The plaque reads \'[plaque_contents]\'."
- else
- src.desc = "A creature made of [src.contents.len-1] assorted bones and a skull. The plaque reads \'[plaque_contents]\'."
- else
- ..()
-
-//shells and plants do not make skeletons
-/obj/item/weapon/fossil/shell
- name = "Fossilised shell"
- icon_state = "shell"
- desc = "It's a fossilised shell."
-
-/obj/item/weapon/fossil/plant
- name = "Fossilised plant"
- icon_state = "plant1"
- desc = "It's fossilised plant remains."
- animal = 0
-
-/obj/item/weapon/fossil/plant/New()
- icon_state = "plant[rand(1,4)]"
diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm
deleted file mode 100644
index 8582575867f..00000000000
--- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm
+++ /dev/null
@@ -1,72 +0,0 @@
-
-/obj/item/weapon/shard/plasma
- name = "plasma shard"
- desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window."
- force = 8.0
- throwforce = 15.0
- icon_state = "plasmalarge"
- sharp = 1
-
-/obj/item/weapon/shard/plasma/New()
-
- src.icon_state = pick("plasmalarge", "plasmamedium", "plasmasmall")
- switch(src.icon_state)
- if("plasmasmall")
- src.pixel_x = rand(-12, 12)
- src.pixel_y = rand(-12, 12)
- if("plasmamedium")
- src.pixel_x = rand(-8, 8)
- src.pixel_y = rand(-8, 8)
- if("plasmalarge")
- src.pixel_x = rand(-5, 5)
- src.pixel_y = rand(-5, 5)
- else
- return
-
-/obj/item/weapon/shard/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if( istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- var/obj/item/stack/sheet/plasmaglass/NG = new (user.loc)
- for(var/obj/item/stack/sheet/plasmaglass/G in user.loc)
- if(G==NG)
- continue
- if(G.amount>=G.max_amount)
- continue
- G.attackby(NG, user, params)
- to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.")
- //SN src = null
- qdel(src)
- return
- return ..()
-
-//legacy crystal
-/obj/machinery/crystal
- name = "Crystal"
- icon = 'icons/obj/mining.dmi'
- icon_state = "crystal"
-
-/obj/machinery/crystal/New()
- if(prob(50))
- icon_state = "crystal2"
-
-//large finds
- /*
- /obj/machinery/syndicate_beacon
- /obj/machinery/wish_granter
- if(18)
- item_type = "jagged green crystal"
- additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.")
- icon_state = "crystal"
- apply_material_decorations = 0
- if(prob(10))
- apply_image_decorations = 1
- if(19)
- item_type = "jagged pink crystal"
- additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.")
- icon_state = "crystal2"
- apply_material_decorations = 0
- if(prob(10))
- apply_image_decorations = 1
- */
- //machinery type artifacts?
diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm
deleted file mode 100644
index cf0c1cfa273..00000000000
--- a/code/modules/research/xenoarchaeology/finds/finds_special.dm
+++ /dev/null
@@ -1,203 +0,0 @@
-
-
-
-//endless reagents!
-/obj/item/weapon/reagent_containers/glass/replenishing
- var/spawning_id
-
-/obj/item/weapon/reagent_containers/glass/replenishing/New()
- ..()
- processing_objects.Add(src)
- spawning_id = pick("blood","holywater","lube","morphine","ethanol","ice","glycerol","fuel","cleaner")
-
-/obj/item/weapon/reagent_containers/glass/replenishing/process()
- reagents.add_reagent(spawning_id, 0.3)
-
-
-
-//a talking gas mask!
-/obj/item/clothing/mask/gas/poltergeist
- var/list/heard_talk = list()
- var/last_twitch = 0
- var/max_stored_messages = 100
-
-/obj/item/clothing/mask/gas/poltergeist/New()
- processing_objects.Add(src)
-
-/obj/item/clothing/mask/gas/poltergeist/process()
- if(heard_talk.len && istype(src.loc, /mob/living) && prob(10))
- var/mob/living/M = src.loc
- M.say(pick(heard_talk))
-
-/obj/item/clothing/mask/gas/poltergeist/hear_talk(mob/M as mob, text)
- ..()
- if(heard_talk.len > max_stored_messages)
- heard_talk.Remove(pick(heard_talk))
- heard_talk.Add(text)
- if(istype(src.loc, /mob/living) && world.time - last_twitch > 50)
- last_twitch = world.time
-
-
-
-//a vampiric statuette
-//todo: cult integration
-/obj/item/weapon/vampiric
- name = "statuette"
- icon_state = "statuette"
- icon = 'icons/obj/xenoarchaeology.dmi'
- var/charges = 0
- var/list/nearby_mobs = list()
- var/last_bloodcall = 0
- var/bloodcall_interval = 50
- var/last_eat = 0
- var/eat_interval = 100
- var/wight_check_index = 1
- var/list/shadow_wights = list()
-
-/obj/item/weapon/vampiric/New()
- ..()
- processing_objects.Add(src)
-
-/obj/item/weapon/vampiric/process()
- //see if we've identified anyone nearby
- if(world.time - last_bloodcall > bloodcall_interval && nearby_mobs.len)
- var/mob/living/carbon/human/M = pop(nearby_mobs)
- if(M in view(7,src) && M.health > 20)
- if(prob(50))
- bloodcall(M)
- nearby_mobs.Add(M)
-
- //suck up some blood to gain power
- if(world.time - last_eat > eat_interval)
- var/obj/effect/decal/cleanable/blood/B = locate() in range(2,src)
- if(B)
- last_eat = world.time
- B.loc = null
- if(istype(B, /obj/effect/decal/cleanable/blood/drip))
- charges += 0.25
- else
- charges += 1
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1, -3)
-
- //use up stored charges
- if(charges >= 10)
- charges -= 10
- new /obj/structure/spider/eggcluster(pick(view(1,src)))
-
- if(charges >= 3)
- if(prob(5))
- charges -= 1
- var/spawn_type = pick(/mob/living/simple_animal/hostile/creature)
- new spawn_type(pick(view(1,src)))
- playsound(src.loc, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3)
-
- if(charges >= 1)
- if(shadow_wights.len < 5 && prob(5))
- shadow_wights.Add(new /obj/effect/shadow_wight(src.loc))
- playsound(src.loc, 'sound/effects/ghost.ogg', 50, 1, -3)
- charges -= 0.1
-
- if(charges >= 0.1)
- if(prob(5))
- src.visible_message("[bicon(src)] [src]'s eyes glow ruby red for a moment!")
- charges -= 0.1
-
- //check on our shadow wights
- if(shadow_wights.len)
- wight_check_index++
- if(wight_check_index > shadow_wights.len)
- wight_check_index = 1
-
- var/obj/effect/shadow_wight/W = shadow_wights[wight_check_index]
- if(isnull(W))
- shadow_wights.Remove(wight_check_index)
- else if(isnull(W.loc))
- shadow_wights.Remove(wight_check_index)
- else if(get_dist(W, src) > 10)
- shadow_wights.Remove(wight_check_index)
-
-/obj/item/weapon/vampiric/hear_talk(mob/M as mob, text)
- ..()
- if(world.time - last_bloodcall >= bloodcall_interval && M in view(7, src))
- bloodcall(M)
-
-/obj/item/weapon/vampiric/proc/bloodcall(var/mob/living/carbon/human/M)
- last_bloodcall = world.time
- if(istype(M))
- playsound(src.loc, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3)
- nearby_mobs.Add(M)
-
- var/target = pick("chest","groin","head","l_arm","r_arm","r_leg","l_leg","l_hand","r_hand","l_foot","r_foot")
- M.apply_damage(rand(5, 10), BRUTE, target)
- to_chat(M, "The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out.")
- var/obj/effect/decal/cleanable/blood/splatter/animated/B = new(M.loc)
- B.target_turf = pick(range(1, src))
- B.blood_DNA = list()
- B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
- M.blood_volume -= rand(25,50)
-
-//animated blood 2 SPOOKY
-/obj/effect/decal/cleanable/blood/splatter/animated
- var/turf/target_turf
- var/loc_last_process
-
-/obj/effect/decal/cleanable/blood/splatter/animated/New()
- ..()
- processing_objects.Add(src)
- loc_last_process = src.loc
-
-/obj/effect/decal/cleanable/blood/splatter/animated/process()
- if(target_turf && src.loc != target_turf)
- step_towards(src,target_turf)
- if(src.loc == loc_last_process)
- target_turf = null
- loc_last_process = src.loc
-
- //leave some drips behind
- if(prob(50))
- var/obj/effect/decal/cleanable/blood/drip/D = new(src.loc)
- D.blood_DNA = src.blood_DNA.Copy()
- if(prob(50))
- D = new(src.loc)
- D.blood_DNA = src.blood_DNA.Copy()
- if(prob(50))
- D = new(src.loc)
- D.blood_DNA = src.blood_DNA.Copy()
- else
- ..()
-
-/obj/effect/shadow_wight
- name = "shadow wight"
- icon = 'icons/mob/mob.dmi'
- icon_state = "shade"
- density = 1
-
-/obj/effect/shadow_wight/New()
- processing_objects.Add(src)
-
-/obj/effect/shadow_wight/process()
- if(src.loc)
- src.loc = get_turf(pick(orange(1,src)))
- var/mob/living/carbon/M = locate() in src.loc
- if(M)
- playsound(src.loc, pick('sound/hallucinations/behind_you1.ogg',\
- 'sound/hallucinations/behind_you2.ogg',\
- 'sound/hallucinations/i_see_you1.ogg',\
- 'sound/hallucinations/i_see_you2.ogg',\
- 'sound/hallucinations/im_here1.ogg',\
- 'sound/hallucinations/im_here2.ogg',\
- 'sound/hallucinations/look_up1.ogg',\
- 'sound/hallucinations/look_up2.ogg',\
- 'sound/hallucinations/over_here1.ogg',\
- 'sound/hallucinations/over_here2.ogg',\
- 'sound/hallucinations/over_here3.ogg',\
- 'sound/hallucinations/turn_around1.ogg',\
- 'sound/hallucinations/turn_around2.ogg',\
- ), 50, 1, -3)
- M.Sleeping(rand(5,10))
- src.loc = null
- else
- processing_objects.Remove(src)
-
-/obj/effect/shadow_wight/Bump(var/atom/obstacle)
- to_chat(obstacle, "You feel a chill run down your spine!")
diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
deleted file mode 100644
index 178e0600ff7..00000000000
--- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
+++ /dev/null
@@ -1,125 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Formerly talking crystals - these procs are now modular so that you can make any /obj/item/weapon 'parrot' player speech back to them
-// This could be extended to atoms, but it's bad enough as is
-// I genuinely tried to Add and Remove them from var and proc lists, but just couldn't get it working
-
-//for easy reference
-/obj/var/datum/talking_atom/talking_atom
-
-/datum/talking_atom
- var/list/heard_words = list()
- var/last_talk_time = 0
- var/atom/holder_atom
- var/talk_interval = 50
- var/talk_chance = 10
-
-/datum/talking_atom/proc/init()
- if(holder_atom)
- processing_objects.Add(src)
-
-/datum/talking_atom/proc/process()
- if(!holder_atom)
- processing_objects.Remove(src)
-
- else if(heard_words.len >= 1 && world.time > last_talk_time + talk_interval && prob(talk_chance))
- SaySomething()
-
-/datum/talking_atom/proc/catchMessage(var/msg, var/mob/source)
- if(!holder_atom)
- return
-
- var/list/seperate = list()
- if(findtext(msg,"(("))
- return
- else if(findtext(msg,"))"))
- return
- else if(findtext(msg," ")==0)
- return
- else
- /*var/l = lentext(msg)
- if(findtext(msg," ",l,l+1)==0)
- msg+=" "*/
- seperate = splittext(msg, " ")
-
- for(var/Xa = 1,Xa 20 + rand(10,20))
- heard_words.Remove(heard_words[1])
- if(!heard_words["[lowertext(seperate[Xa])]"])
- heard_words["[lowertext(seperate[Xa])]"] = list()
- var/list/w = heard_words["[lowertext(seperate[Xa])]"]
- if(w)
- w.Add("[lowertext(seperate[next])]")
-// to_chat(world, "Adding [lowertext(seperate[next])] to [lowertext(seperate[Xa])]")
-
- if(prob(30))
- var/list/options = list("[holder_atom] seems to be listening intently to [source]...",\
- "[holder_atom] seems to be focussing on [source]...",\
- "[holder_atom] seems to turn it's attention to [source]...")
- holder_atom.loc.visible_message("[bicon(holder_atom)] [pick(options)]")
-
- if(prob(20))
- spawn(2)
- SaySomething(pick(seperate))
-
-/*/obj/item/weapon/talkingcrystal/proc/debug()
- //set src in view()
- for(var/v in heard_words)
- to_chat(world, "[uppertext(v)]")
- var/list/d = heard_words["[v]"]
- for(var/X in d)
- to_chat(world, "[X]")*/
-
-/datum/talking_atom/proc/SaySomething(var/word = null)
- if(!holder_atom)
- return
-
- var/msg
- var/limit = rand(max(5,heard_words.len/2))+3
- var/text
- if(!word)
- text = "[pick(heard_words)]"
- else
- text = pick(splittext(word, " "))
- if(lentext(text)==1)
- text=uppertext(text)
- else
- var/cap = copytext(text,1,2)
- cap = uppertext(cap)
- cap += copytext(text,2,lentext(text)+1)
- text=cap
- var/q = 0
- msg+=text
- if(msg=="What" | msg == "Who" | msg == "How" | msg == "Why" | msg == "Are")
- q=1
-
- text=lowertext(text)
- for(var/ya,ya <= limit,ya++)
-
- if(heard_words.Find("[text]"))
- var/list/w = heard_words["[text]"]
- text=pick(w)
- else
- text = "[pick(heard_words)]"
- msg+=" [text]"
- if(q)
- msg+="?"
- else
- if(rand(0,10))
- msg+="."
- else
- msg+="!"
-
- var/list/listening = viewers(holder_atom)
- for(var/mob/M in mob_list)
- if(!M.client)
- continue //skip monkeys and leavers
- if(istype(M, /mob/new_player))
- continue
- if(M.stat == DEAD && M.get_preference(CHAT_GHOSTEARS))
- listening|=M
-
- for(var/mob/M in listening)
- to_chat(M, "[bicon(holder_atom)] [holder_atom] reverberates, \"[msg]\"")
- last_talk_time = world.time
diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
deleted file mode 100644
index 654b1a9ccde..00000000000
--- a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-/mob/living/simple_animal/hostile/samak
- name = "samak"
- desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain."
- faction = list("samak")
- icon_state = "samak"
- icon_living = "samak"
- icon_dead = "samak_dead"
- move_to_delay = 2
- maxHealth = 125
- health = 125
- speed = 2
- melee_damage_lower = 5
- melee_damage_upper = 15
- attacktext = "mauls"
- cold_damage_per_tick = 0
- speak_chance = 5
- speak = list("Hruuugh!","Hrunnph")
- emote_see = list("paws the ground","shakes its mane","stomps")
- emote_hear = list("snuffles")
- gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
-
-/mob/living/simple_animal/hostile/diyaab
- name = "diyaab"
- desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
- faction = list("diyaab")
- icon_state = "diyaab"
- icon_living = "diyaab"
- icon_dead = "diyaab_dead"
- move_to_delay = 1
- maxHealth = 25
- health = 25
- speed = 1
- melee_damage_lower = 1
- melee_damage_upper = 8
- attacktext = "gouges"
- cold_damage_per_tick = 0
- speak_chance = 5
- speak = list("Awrr?","Aowrl!","Worrl")
- emote_see = list("sniffs the air cautiously","looks around")
- emote_hear = list("snuffles")
- gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
-
-/mob/living/simple_animal/hostile/shantak
- name = "shantak"
- desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though."
- faction = list("shantak")
- icon_state = "shantak"
- icon_living = "shantak"
- icon_dead = "shantak_dead"
- move_to_delay = 1
- maxHealth = 75
- health = 75
- speed = 1
- melee_damage_lower = 3
- melee_damage_upper = 12
- attacktext = "gouges"
- cold_damage_per_tick = 0
- speak_chance = 5
- speak = list("Shuhn","Shrunnph?","Shunpf")
- emote_see = list("scratches the ground","shakes out it's mane","tinkles gently")
- gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
-
-/mob/living/simple_animal/yithian
- name = "yithian"
- desc = "A friendly creature vaguely resembling an oversized snail without a shell."
- icon_state = "yithian"
- icon_living = "yithian"
- icon_dead = "yithian_dead"
- gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
-
-/mob/living/simple_animal/tindalos
- name = "tindalos"
- desc = "It looks like a large, flightless grasshopper."
- icon_state = "tindalos"
- icon_living = "tindalos"
- icon_dead = "tindalos_dead"
- gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_plants.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_plants.dm
deleted file mode 100644
index 997993898cb..00000000000
--- a/code/modules/research/xenoarchaeology/genetics/prehistoric_plants.dm
+++ /dev/null
@@ -1,80 +0,0 @@
-/obj/item/weapon/reagent_containers/food/snacks/grown/telriis_clump
- name = "telriis grass"
- desc = "A clump of telriis grass, not recommended for consumption by sentients."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "telriisclump"
- New(var/loc, var/potency)
- ..()
- reagents.add_reagent("pwine", potency * 5)
- reagents.add_reagent("nutriment", potency)
- bitesize = 1+round(reagents.total_volume / 2, 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/thaadrabloom
- name = "thaa'dra bloom"
- desc = "Looks chewy, might be good to eat."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "thaadrabloom"
- New(var/loc, var/potency)
- ..()
- reagents.add_reagent("frostoil", potency * 1.5 + 5)
- reagents.add_reagent("nutriment", potency)
- bitesize = 1+round(reagents.total_volume / 2, 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/jurlmah
- name = "jurl'mah pod"
- desc = "Bulbous and veiny, it appears to pulse slightly as you look at it."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "jurlmahpod"
- New(var/loc, var/potency)
- ..()
- reagents.add_reagent("serotrotium", potency)
- reagents.add_reagent("nutriment", potency)
- bitesize = 1+round(reagents.total_volume / 2, 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/amauri
- name = "amauri fruit"
- desc = "It is small, round and hard. Its skin is a thick dark purple."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "amaurifruit"
- New(var/loc, var/potency)
- ..()
- reagents.add_reagent("condensedcapsaicin", potency * 5)
- reagents.add_reagent("nutriment", potency)
- bitesize = 1+round(reagents.total_volume / 2, 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/gelthi
- name = "gelthi berries"
- desc = "They feel fluffy and slightly warm to the touch."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "gelthiberries"
- New(var/loc, var/potency)
- ..()
- //this may prove a little strong
- reagents.add_reagent("morphine", (potency * potency) / 5)
- reagents.add_reagent("capsaicin", (potency * potency) / 5)
- reagents.add_reagent("nutriment", potency)
- bitesize = 1+round(reagents.total_volume / 2, 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/vale
- name = "vale leaves"
- desc = "Small, curly leaves covered in a soft pale fur."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "valeleaves"
- New(var/loc, var/potency)
- ..()
- reagents.add_reagent("sal_acid", potency * 5)
- reagents.add_reagent("salbutamol", potency * 2)
- reagents.add_reagent("nutriment", potency)
- bitesize = 1+round(reagents.total_volume / 2, 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/surik
- name = "surik fruit"
- desc = "Multiple layers of blue skin peeling away to reveal a spongey core, vaguely resembling an ear."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "surikfruit"
- New(var/loc, var/potency)
- ..()
- reagents.add_reagent("haloperidol", potency * 3)
- reagents.add_reagent("synaptizine", potency * 2)
- reagents.add_reagent("nutriment", potency)
- bitesize = 1+round(reagents.total_volume / 2, 1)
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_seeds.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_seeds.dm
deleted file mode 100644
index 5597d275322..00000000000
--- a/code/modules/research/xenoarchaeology/genetics/prehistoric_seeds.dm
+++ /dev/null
@@ -1,139 +0,0 @@
-/datum/seed/telriis
-
- name = "telriis"
- seed_name = "telriis"
- display_name = "telriis grass"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/telriis_clump)
- packet_icon = "seed-alien1"
- plant_icon = "telriis"
-
- lifespan = 50
- endurance = 50
- maturation = 5
- production = 5
- yield = 4
- potency = 5
- growth_stages = 4
-
-/datum/seed/thaadra
-
- name = "thaadra"
- seed_name = "thaa'dra"
- display_name = "thaa'dra lichen"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/thaadrabloom)
- packet_icon = "seed-alien3"
- plant_icon = "thaadra"
-
- lifespan = 20
- endurance = 10
- maturation = 5
- production = 9
- yield = 2
- potency = 5
- growth_stages = 4
-
-/datum/seed/jurlmah
-
- name = "jurlmah"
- seed_name = "jurl'mah"
- display_name = "jurl'mah reeds"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/jurlmah)
- packet_icon = "seed-alien3"
- plant_icon = "jurlmah"
-
- lifespan = 20
- endurance = 12
- maturation = 8
- production = 9
- yield = 3
- potency = 10
- growth_stages = 5
-
-/datum/seed/amauri
-
- name = "amauri"
- seed_name = "amauri"
- display_name = "amauri plant"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/amauri)
- packet_icon = "seed-alien3"
- plant_icon = "amauri"
-
- lifespan = 30
- endurance = 10
- maturation = 8
- production = 9
- yield = 4
- potency = 10
- growth_stages = 3
-
-/datum/seed/gelthi
-
- name = "gelthi"
- seed_name = "gelthi"
- display_name = "gelthi plant"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/gelthi)
- packet_icon = "seed-alien2"
- plant_icon = "gelthi"
-
- lifespan = 20
- endurance = 15
- maturation = 6
- production = 6
- yield = 2
- potency = 1
- growth_stages = 3
-
-/datum/seed/vale
-
- name = "vale"
- seed_name = "vale"
- display_name = "vale bush"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/vale)
- packet_icon = "seed-alien2"
- plant_icon = "vale"
-
- lifespan = 25
- endurance = 15
- maturation = 8
- production = 10
- yield = 3
- potency = 3
- growth_stages = 4
-
-/datum/seed/surik
-
- name = "surik"
- seed_name = "surik"
- display_name = "surik vine"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/surik)
- packet_icon = "seed-alien3"
- plant_icon = "surik"
-
- lifespan = 30
- endurance = 18
- maturation = 7
- production = 7
- yield = 3
- potency = 3
- growth_stages = 4
-
-/obj/item/seeds/jurlmah
- seed_type = "jurlmah"
-
-/obj/item/seeds/amauri
- seed_type = "amauri"
-
-/obj/item/seeds/gelthi
- seed_type = "gelthi"
-
-/obj/item/seeds/vale
- seed_type = "vale"
-
-/obj/item/seeds/surik
- seed_type = "surik"
-
-/obj/item/seeds/telriis
- seed_type = "telriis"
-
-/obj/item/seeds/thaadra
- seed_type = "thaadra"
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
deleted file mode 100644
index a4a52b3ea5f..00000000000
--- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
+++ /dev/null
@@ -1,319 +0,0 @@
-//gene sequence datum
-datum/genesequence
- var/spawned_type
- var/spawned_type_text
- var/list/full_genome_sequence = list()
-
-
-
-#define SCANFOSSIL_RETVAL_WRONGTYPE 1
-#define SCANFOSSIL_RETVAL_NOMOREGENESEQ 2
-#define SCANFOSSIL_RETVAL_SUCCESS 4
-
-/obj/machinery/computer/reconstitutor
- name = "flora reconstitution console"
- icon = 'icons/obj/computer.dmi'
- icon_keyboard = "med_key"
- icon_screen = "dna"
- circuit = /obj/item/weapon/circuitboard/reconstitutor
- req_access = list(access_heads) //Only used for record deletion right now.
- var/obj/machinery/clonepod/pod1 = 1 //Linked cloning pod.
- var/temp = ""
- var/menu = 1 //Which menu screen to display
- var/list/records = list()
- var/datum/dna2/record/active_record = null
- var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
- var/loading = 0 // Nice loading text
- var/list/undiscovered_genesequences = null
- var/list/discovered_genesequences = list()
- var/list/completed_genesequences = list()
- var/list/undiscovered_genomes = list()
- var/list/manually_placed_genomes = list()
- var/list/discovered_genomes = list("! Clear !")
- var/list/accepted_fossil_types = list(/obj/item/weapon/fossil/plant)
-
-
-/obj/machinery/computer/reconstitutor/initialize()
- if(!undiscovered_genesequences)
- undiscovered_genesequences = master_controller.all_plant_genesequences.Copy()
- ..()
-
-/obj/machinery/computer/reconstitutor/animal
- name = "fauna reconstitution console"
- accepted_fossil_types = list(/obj/item/weapon/fossil/bone,/obj/item/weapon/fossil/shell,/obj/item/weapon/fossil/skull)
- pod1 = null
- circuit = /obj/item/weapon/circuitboard/reconstitutor/animal
-
-/obj/machinery/computer/reconstitutor/animal/initialize()
- undiscovered_genesequences = master_controller.all_animal_genesequences.Copy()
- ..()
-
-/obj/machinery/computer/reconstitutor/attackby(obj/item/W, mob/user, params)
- if(istype(W,/obj/item/weapon/fossil))
- user.drop_item()
- W.loc = src.loc
- switch(scan_fossil(W))
- if(1)
- src.visible_message("[bicon(src)] [src] scans the fossil and rejects it.")
- if(2)
- visible_message("[bicon(src)] [src] can not extract any more genetic data from new fossils.")
- if(4)
- src.visible_message("[bicon(src)] [user] inserts [W] into [src], the fossil is consumed as [src] extracts genetic data from it.")
- qdel(W)
- updateDialog()
- else if(istype(W, /obj/item/weapon/storage))
- var/obj/item/weapon/storage/S = W
- S.hide_from(usr)
- var/numaccepted = 0
- var/numrejected = 0
- var/full = 0
- for(var/obj/item/weapon/fossil/F in S.contents)
- switch(scan_fossil(F))
- if(SCANFOSSIL_RETVAL_WRONGTYPE)
- numrejected += 1
- if(SCANFOSSIL_RETVAL_NOMOREGENESEQ)
- full = 1
- if(SCANFOSSIL_RETVAL_SUCCESS)
- numaccepted += 1
- S.remove_from_storage(F, src) //This will move the item to this item's contents
- qdel(F)
- updateDialog()
- var/outmsg = "You empty all the fossils from [S] into [src]."
- if(numaccepted)
- outmsg += " [numaccepted] fossils were accepted and consumed as [src] extracts genetic data from them."
- if(numrejected)
- outmsg += " [numrejected] fossils were rejected."
- if(full)
- outmsg += " [src] can not extract any more genetic data from new fossils."
- visible_message(outmsg)
-
- else
- ..()
-
-/obj/machinery/computer/reconstitutor/attack_hand(var/mob/user as mob)
- src.add_fingerprint(user)
- interact(user)
-
-/obj/machinery/computer/reconstitutor/interact(mob/user)
- if(stat & (NOPOWER|BROKEN) || get_dist(src, user) > 1)
- user.unset_machine(src)
- return
-
- var/dat = "Garland Corp genetic reconstitutor
"
- dat += "
"
- if(!pod1)
- pod1 = locate() in orange(1, src)
-
- if(!pod1)
- dat += "Unable to locate cloning pod.
"
- else if(istype(pod1))
- dat += "Cloning pod connected.
"
-
- dat += ""
- dat += ""
- dat += "| GENE1 | "
- dat += "GENE2 | "
- dat += "GENE3 | "
- dat += "GENE4 | "
- dat += "GENE5 | "
- dat += "GENE6 | "
- dat += "GENE7 | "
- dat += " | "
- dat += " | "
- dat += "
"
-
- //WIP gene sequences
- for(var/sequence_num = 1, sequence_num <= discovered_genesequences.len, sequence_num += 1)
- var/datum/genesequence/cur_genesequence = discovered_genesequences[sequence_num]
- dat += ""
- var/num_correct = 0
- for(var/curindex = 1, curindex <= 7, curindex++)
- var/bgcolour = "#ffffff"//white ffffff, red ff0000
-
- //background colour hints at correct positioning
- if(manually_placed_genomes[sequence_num][curindex])
- //green background if slot is correctly filled
- if(manually_placed_genomes[sequence_num][curindex] == cur_genesequence.full_genome_sequence[curindex])
- bgcolour = "#008000"
- num_correct += 1
- if(num_correct == 7)
- discovered_genesequences -= cur_genesequence
- completed_genesequences += cur_genesequence
- manually_placed_genomes[sequence_num] = new/list(7)
- interact(user)
- return
- //yellow background if adjacent to correct slot
- if(curindex > 1 && manually_placed_genomes[sequence_num][curindex] == cur_genesequence.full_genome_sequence[curindex - 1])
- bgcolour = "#ffff00"
- else if(curindex < 7 && manually_placed_genomes[sequence_num][curindex] == cur_genesequence.full_genome_sequence[curindex + 1])
- bgcolour = "#ffff00"
-
- var/this_genome_slot = manually_placed_genomes[sequence_num][curindex]
- if(!this_genome_slot)
- this_genome_slot = "- - - - -"
- dat += "| [this_genome_slot] | "
- dat += "Reset | "
- //dat += "Clone | "
- dat += "
"
-
- //completed gene sequences
- for(var/sequence_num = 1, sequence_num <= completed_genesequences.len, sequence_num += 1)
- var/datum/genesequence/cur_genesequence = completed_genesequences[sequence_num]
- dat += ""
- for(var/curindex = 1, curindex <= 7, curindex++)
- var/this_genome_slot = cur_genesequence.full_genome_sequence[curindex]
- dat += "| [this_genome_slot] | "
- dat += "Wipe | "
- dat += "Clone | "
- dat += "
"
-
- dat += "
"
-
- dat += "
"
- dat += "
"
- dat += "Close"
- user << browse(dat, "window=reconstitutor;size=600x500")
- user.set_machine(src)
- onclose(user, "reconstitutor")
-
-/obj/machinery/computer/reconstitutor/animal/Topic(href, href_list)
- if(href_list["clone"])
- var/sequence_num = text2num(href_list["sequence_num"])
- var/datum/genesequence/cloned_genesequence = completed_genesequences[sequence_num]
- if(pod1)
- if(pod1.occupant)
- visible_message("[bicon(src)] The cloning pod is currently occupied.")
- else if(pod1.biomass < CLONE_BIOMASS)
- visible_message("[bicon(src)] Not enough biomass in the cloning pod.")
- else if(pod1.mess)
- visible_message("[bicon(src)] Error: clonepod malfunction.")
- else
- visible_message("[bicon(src)] [src] clones something from a reconstituted gene sequence!")
- playsound(src.loc, 'sound/effects/screech.ogg', 50, 1, -3)
- pod1.occupant = new cloned_genesequence.spawned_type(pod1)
- pod1.icon_state = "pod_1"
- //pod1.occupant.name = "[pod1.occupant.name] ([rand(0,999)])"
- pod1.biomass -= CLONE_BIOMASS
- else
- to_chat(usr, "[bicon(src)] Unable to locate cloning pod!")
- else
- ..()
-
-/obj/machinery/computer/reconstitutor/Topic(href, href_list)
- if(href_list["insertpos"])
-// to_chat(world, "inserting gene for genesequence [href_list["insertgenome"]] at pos [text2num(href_list["insertpos"])]")
- var/sequence_num = text2num(href_list["sequence_num"])
- var/insertpos = text2num(href_list["insertpos"])
-
- var/old_genome = manually_placed_genomes[sequence_num][insertpos]
- discovered_genomes = sortList(discovered_genomes)
- var/new_genome = input(usr, "Which genome do you want to insert here?") as null|anything in discovered_genomes
- if(new_genome == "! Clear !")
- manually_placed_genomes[sequence_num][insertpos] = null
- else if(new_genome)
- manually_placed_genomes[sequence_num][insertpos] = new_genome
- discovered_genomes.Remove(new_genome)
- if(old_genome)
- discovered_genomes.Add(old_genome)
- updateDialog()
-
- else if(href_list["reset"])
- var/sequence_num = text2num(href_list["sequence_num"])
- for(var/curindex = 1, curindex <= 7, curindex++)
- var/old_genome = manually_placed_genomes[sequence_num][curindex]
- manually_placed_genomes[sequence_num][curindex] = null
- if(old_genome)
- discovered_genomes.Add(old_genome)
- updateDialog()
-
- else if(href_list["wipe"])
- var/sequence_num = text2num(href_list["sequence_num"])
- var/datum/genesequence/wiped_genesequence = completed_genesequences[sequence_num]
- completed_genesequences.Remove(wiped_genesequence)
- discovered_genesequences.Add(wiped_genesequence)
-
- discovered_genomes.Add(wiped_genesequence.full_genome_sequence)
- discovered_genomes = sortList(discovered_genomes)
- updateDialog()
-
- else if(href_list["clone"])
- var/sequence_num = text2num(href_list["sequence_num"])
- var/datum/genesequence/cloned_genesequence = completed_genesequences[sequence_num]
- visible_message("[bicon(src)] [src] clones a packet of seeds from a reconstituted gene sequence!")
- playsound(src.loc, 'sound/effects/screech.ogg', 50, 1, -3)
- new cloned_genesequence.spawned_type(src.loc)
-
- else if(href_list["close"])
- usr.unset_machine(src)
- usr << browse(null, "window=reconstitutor")
-
- else
- ..()
-
-/obj/machinery/computer/reconstitutor/proc/scan_fossil(var/obj/item/weapon/fossil/scan_fossil)
- //see whether we accept these kind of fossils
- if(accepted_fossil_types.len && !accepted_fossil_types.Find(scan_fossil.type))
- return SCANFOSSIL_RETVAL_WRONGTYPE
-
- //see whether we are going to discover a new sequence, new genome for existing sequence or nothing
- var/new_genome_prob = discovered_genesequences.len * 50
-
- if( (new_genome_prob >= 100 || prob(new_genome_prob)) && undiscovered_genomes.len)
- //create a new genome for an existing gene sequence
- var/newly_discovered_genome = pick(undiscovered_genomes)
- undiscovered_genomes -= newly_discovered_genome
- discovered_genomes.Add(newly_discovered_genome)
-
- //chance to discover a second genome
- if(prob(75))
- newly_discovered_genome = pick(undiscovered_genomes)
- undiscovered_genomes -= newly_discovered_genome
- discovered_genomes.Add(newly_discovered_genome)
- //chance to discover a third genome
- if(prob(50))
- newly_discovered_genome = pick(undiscovered_genomes)
- undiscovered_genomes -= newly_discovered_genome
- discovered_genomes.Add(newly_discovered_genome)
-
- else if(undiscovered_genesequences.len)
- //discover new gene sequence
- var/datum/genesequence/newly_discovered_genesequence = pick(undiscovered_genesequences)
- undiscovered_genesequences -= newly_discovered_genesequence
- discovered_genesequences += newly_discovered_genesequence
- //add genomes for new gene sequence to pool of discoverable genomes
- undiscovered_genomes.Add(newly_discovered_genesequence.full_genome_sequence)
- manually_placed_genomes.Add(null)
- manually_placed_genomes[manually_placed_genomes.len] = new/list(7)
-
- else
- //there's no point scanning any more fossils, we've already discovered everything
- return SCANFOSSIL_RETVAL_NOMOREGENESEQ
-
- return SCANFOSSIL_RETVAL_SUCCESS
-
-#undef SCANFOSSIL_RETVAL_WRONGTYPE
-#undef SCANFOSSIL_RETVAL_NOMOREGENESEQ
-#undef SCANFOSSIL_RETVAL_SUCCESS
-
-
-/obj/item/weapon/circuitboard/reconstitutor
- name = "Circuit board (Flora Reconstitution Console)"
- build_path = "/obj/machinery/computer/reconstitutor"
- origin_tech = "programming=2;biotech=3;materials=4"
- frame_desc = "Requires 2 Advanced Scanning Module, 1 Nano Manipulator, 1 Matter Bin and 1 Advanced Capacitor."
- req_components = list(
- "/obj/item/weapon/stock_parts/scanning_module/adv" = 2,
- "/obj/item/weapon/stock_parts/manipulator/nano" = 1,
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/capacitor/adv" = 1)
-
-/obj/item/weapon/circuitboard/reconstitutor/animal
- name = "Circuit board (Fauna Reconstitution Console)"
- build_path = "/obj/machinery/computer/reconstitutor/animal"
- origin_tech = "programming=2;biotech=4;materials=6"
- frame_desc = "Requires 2 Advanced Scanning Module, 1 Nano Manipulator, 1 Matter Bin and 1 Advanced Capacitor."
- req_components = list(
- "/obj/item/weapon/stock_parts/scanning_module/adv" = 2,
- "/obj/item/weapon/stock_parts/manipulator/nano" = 1,
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/capacitor/adv" = 1)
diff --git a/code/modules/research/xenoarchaeology/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm
deleted file mode 100644
index 6d32b4e0ca9..00000000000
--- a/code/modules/research/xenoarchaeology/geosample.dm
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
-#define FIND_PLANT 1
-#define FIND_BIO 2
-#define FIND_METEORIC 3
-#define FIND_ICE 4
-#define FIND_CRYSTALLINE 5
-#define FIND_METALLIC 6
-#define FIND_IGNEOUS 7
-#define FIND_METAMORPHIC 8
-#define FIND_SEDIMENTARY 9
-#define FIND_NOTHING 10
-*/
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Rock sliver
-
-/obj/item/weapon/rocksliver
- name = "rock sliver"
- desc = "It looks extremely delicate."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "sliver1" //0-4
- w_class = WEIGHT_CLASS_TINY
- sharp = 1
- //item_state = "electronic"
- var/source_rock = "/turf/simulated/mineral/"
- var/datum/geosample/geological_data
-
-/obj/item/weapon/rocksliver/New()
- icon_state = "sliver[rand(1,3)]"
- pixel_x = rand(0,16)-8
- pixel_y = rand(0,8)-8
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Geosample datum
-
-/datum/geosample
- var/age = 0 //age can correspond to different archaeological finds
- var/age_thousand = 0
- var/age_million = 0
- var/age_billion = 0
- var/artifact_id = "" //id of a nearby artifact, if there is one
- var/artifact_distance = -1 //proportional to distance
- var/source_mineral = "chlorine" //machines will pop up a warning telling players that the sample may be confused
- //
- //var/source_mineral
- //all potential finds are initialised to null, so nullcheck before you access them
- var/list/find_presence = list()
-
-/datum/geosample/New(var/turf/simulated/mineral/container)
-
- UpdateTurf(container)
-
-//this should only need to be called once
-/datum/geosample/proc/UpdateTurf(var/turf/simulated/mineral/container)
- set background = 1
- if(!container || !istype(container))
- return
-
- age = rand(1,999)
-
- if(container.mineralName)
- switch(container.mineralName)
- if("Uranium")
- age_million = rand(1, 704)
- age_thousand = rand(1,999)
- find_presence["potassium"] = rand(1,1000) / 100
- source_mineral = "potassium"
- if("Iron")
- age_thousand = rand(1, 999)
- age_million = rand(1, 999)
- find_presence["iron"] = rand(1,1000) / 100
- source_mineral = "iron"
- if("Diamond")
- age_thousand = rand(1,999)
- age_million = rand(1,999)
- find_presence["nitrogen"] = rand(1,1000) / 100
- source_mineral = "nitrogen"
- if("Gold")
- age_thousand = rand(1,999)
- age_million = rand(1,999)
- age_billion = rand(3,4)
- find_presence["iron"] = rand(1,1000) / 100
- source_mineral = "iron"
- if("Silver")
- age_thousand = rand(1,999)
- age_million = rand(1,999)
- find_presence["iron"] = rand(1,1000) / 100
- source_mineral = "iron"
- if("Plasma")
- age_thousand = rand(1,999)
- age_million = rand(1,999)
- age_billion = rand(10, 13)
- find_presence["plasma"] = rand(1,1000) / 100
- source_mineral = "plasma"
- if("Clown")
- age = rand(-1,-999) //thats the joke
- age_thousand = rand(-1,-999)
- find_presence["plasma"] = rand(1,1000) / 100
- source_mineral = "plasma"
- if("Bluespace crystal")
- age_thousand = rand(1,999)
- find_presence["plasma"] = rand(1,1000) / 100
- if("Gibtonite")
- age_thousand = rand(1, 50)
- find_presence["plasma"] = rand(1,1000) / 100
-
- if(prob(75))
- find_presence["phosphorus"] = rand(1,500) / 100
- if(prob(25))
- find_presence["mercury"] = rand(1,500) / 100
- find_presence["chlorine"] = rand(500,2500) / 100
-
- //loop over finds, grab any relevant stuff
- for(var/datum/find/F in container.finds)
- var/responsive_reagent = get_responsive_reagent(F.find_type)
- find_presence[responsive_reagent] = F.dissonance_spread
-
- //loop over again to reset values to percentages
- var/total_presence = 0
- for(var/carrier in find_presence)
- total_presence += find_presence[carrier]
- for(var/carrier in find_presence)
- find_presence[carrier] = find_presence[carrier] / total_presence
-
- /*for(var/entry in find_presence)
- total_spread += find_presence[entry]*/
-
-//have this separate from UpdateTurf() so that we dont have a billion turfs being updated (redundantly) every time an artifact spawns
-/datum/geosample/proc/UpdateNearbyArtifactInfo(var/turf/simulated/mineral/container)
- if(!container || !istype(container))
- return
-
- if(container.artifact_find)
- artifact_distance = rand()
- artifact_id = container.artifact_find.artifact_id
- else
- for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs)
- if(T.artifact_find)
- var/cur_dist = get_dist(container, T) * 2
- if( (artifact_distance < 0 || cur_dist < artifact_distance) && cur_dist <= T.artifact_find.artifact_detect_range )
- artifact_distance = cur_dist + rand() * 2 - 1
- artifact_id = T.artifact_find.artifact_id
- else
- master_controller.artifact_spawning_turfs.Remove(T)
-
-/*
-#undef FIND_PLANT
-#undef FIND_BIO
-#undef FIND_METEORIC
-#undef FIND_ICE
-#undef FIND_CRYSTALLINE
-#undef FIND_METALLIC
-#undef FIND_IGNEOUS
-#undef FIND_METAMORPHIC
-#undef FIND_SEDIMENTARY
-#undef FIND_NOTHING
-*/
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
deleted file mode 100644
index 83c3551bde4..00000000000
--- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
+++ /dev/null
@@ -1,250 +0,0 @@
-
-/obj/machinery/artifact_analyser
- name = "anomaly analyser"
- desc = "Studies the emissions of anomalous materials to discover their uses."
- icon = 'icons/obj/virology.dmi'
- icon_state = "isolator"
- anchored = 1
- density = 1
- var/scan_in_progress = 0
- var/scan_num = 0
- var/obj/scanned_obj
- var/obj/machinery/artifact_scanpad/owned_scanner = null
- var/scan_completion_time = 0
- var/scan_duration = 120
- var/obj/scanned_object
- var/report_num = 0
-
-/obj/machinery/artifact_analyser/New()
- ..()
- reconnect_scanner()
-
-/obj/machinery/artifact_analyser/proc/reconnect_scanner()
- //connect to a nearby scanner pad
- owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir)
- if(!owned_scanner)
- owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src)
-
-/obj/machinery/artifact_analyser/attack_hand(var/mob/user as mob)
- src.add_fingerprint(user)
- interact(user)
-
-/obj/machinery/artifact_analyser/interact(mob/user)
- if(stat & (NOPOWER|BROKEN) || get_dist(src, user) > 1)
- user.unset_machine(src)
- return
-
- var/dat = "Anomalous material analyser
"
- dat += "
"
- if(!owned_scanner)
- owned_scanner = locate() in orange(1, src)
-
- if(!owned_scanner)
- dat += "Unable to locate analysis pad.
"
- else if(scan_in_progress)
- dat += "Please wait. Analysis in progress.
"
- dat += "Halt scanning.
"
- else
- dat += "Scanner is ready.
"
- dat += "Begin scanning.
"
-
- dat += "
"
- dat += "
"
- dat += "Refresh Close"
- user << browse(dat, "window=artanalyser;size=450x500")
- user.set_machine(src)
- onclose(user, "artanalyser")
-
-/obj/machinery/artifact_analyser/process()
- if(scan_in_progress && world.time > scan_completion_time)
- //finish scanning
- scan_in_progress = 0
- updateDialog()
-
- //print results
- var/results = ""
- if(!owned_scanner)
- reconnect_scanner()
- if(!owned_scanner)
- results = "Error communicating with scanner."
- else if(!scanned_object || scanned_object.loc != owned_scanner.loc)
- results = "Unable to locate scanned object. Ensure it was not moved in the process."
- else
- results = get_scan_info(scanned_object)
-
- src.visible_message("[name] states, \"Scanning complete.\"")
- playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
- var/obj/item/weapon/paper/P = new(src.loc)
- P.name = "[src] report #[++report_num]"
- P.info = "[src] analysis report #[report_num]
"
- P.info += "
"
- P.info += "[bicon(scanned_object)] [results]"
- P.stamped = list(/obj/item/weapon/stamp)
- P.overlays = list("paper_stamped")
-
- if(scanned_object && istype(scanned_object, /obj/machinery/artifact))
- var/obj/machinery/artifact/A = scanned_object
- A.anchored = 0
- A.being_used = 0
-
-/obj/machinery/artifact_analyser/Topic(href, href_list)
- if(href_list["begin_scan"])
- if(!owned_scanner)
- reconnect_scanner()
- if(owned_scanner)
- var/artifact_in_use = 0
- scanned_object = null
- for(var/obj/O in owned_scanner.loc)
- if(O == owned_scanner)
- continue
- if(O.invisibility)
- continue
- if(istype(O, /obj/machinery/artifact))
- var/obj/machinery/artifact/A = O
- if(A.being_used)
- artifact_in_use = 1
- else
- A.anchored = 1
- A.being_used = 1
-
- if(artifact_in_use)
- src.visible_message("[name] states, \"Cannot harvest. Too much interference.\"")
- else
- scanned_object = O
- scan_in_progress = 1
- scan_completion_time = world.time + scan_duration
- src.visible_message("[name] states, \"Scanning begun.\"")
- break
- if(!scanned_object)
- src.visible_message("[name] states, \"Unable to isolate scan target.\"")
- if(href_list["halt_scan"])
- scan_in_progress = 0
- src.visible_message("[name] states, \"Scanning halted.\"")
-
- if(href_list["close"])
- usr.unset_machine(src)
- usr << browse(null, "window=artanalyser")
-
- ..()
- updateDialog()
-
-//hardcoded responses, oh well
-/obj/machinery/artifact_analyser/proc/get_scan_info(var/obj/scanned_obj)
- switch(scanned_obj.type)
- if(/obj/machinery/auto_cloner)
- return "Automated cloning pod - appears to rely on organic nanomachines with a self perpetuating \
- ecosystem involving self cannibalism and a symbiotic relationship with the contained liquid.
\
- Structure is composed of a carbo-titanium alloy with interlaced reinforcing energy fields, and the contained liquid \
- resembles proto-plasmic residue supportive of single cellular developmental conditions."
- if(/obj/machinery/power/supermatter_shard)
- return "Super dense plasma clump - Appears to have been shaped or hewn, structure is composed of matter 2000% denser than ordinary carbon matter residue.\
- Potential application as unrefined plasma source."
- if(/obj/structure/constructshell)
- return "Tribal idol - Item resembles statues/emblems built by superstitious pre-warp civilisations to honour their gods. Material appears to be a \
- rock/plastcrete composite."
- if(/obj/machinery/giga_drill)
- return "Automated mining drill - structure composed of titanium-carbide alloy, with tip and drill lines edged in an alloy of diamond and plasma."
- if(/obj/structure/cult/pylon)
- return "Tribal pylon - Item resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations."
- if(/obj/mecha/working/hoverpod)
- return "Vacuum capable repair pod - Item is a remarkably intact single man repair craft capable of flight in a vacuum. Outer shell composed of primarily \
- post-warp hull alloys, with internal wiring and circuitry consistent with modern electronics and engineering."
- if(/obj/machinery/replicator)
- return "Automated construction unit - Item appears to be able to synthesize synthetic items, some with simple internal circuitry. Method unknown, \
- phasing suggested?"
- if(/obj/structure/crystal)
- return "Crystal formation - Pseudo organic crystalline matrix, unlikely to have formed naturally. No known technology exists to synthesize this exact composition."
- if(/obj/machinery/artifact)
- //the fun one
- var/obj/machinery/artifact/A = scanned_obj
- var/out = "Anomalous alien device - Composed of an unknown alloy, "
-
- //primary effect
- if(A.my_effect)
- //what kind of effect the artifact has
- switch(A.my_effect.effect_type)
- if(1)
- out += "concentrated energy emissions"
- if(2)
- out += "intermittent psionic wavefront"
- if(3)
- out += "electromagnetic energy"
- if(4)
- out += "high frequency particles"
- if(5)
- out += "organically reactive exotic particles"
- if(6)
- out += "interdimensional/bluespace? phasing"
- if(7)
- out += "atomic synthesis"
- else
- out += "low level energy emissions"
- out += " have been detected "
-
- //how the artifact does it's effect
- switch(A.my_effect.effect_type)
- if(1)
- out += " emitting in an ambient energy field."
- if(2)
- out += " emitting in periodic bursts."
- else
- out += " interspersed throughout substructure and shell."
-
- if(A.my_effect.trigger >= 0 && A.my_effect.trigger <= 4)
- out += " Activation index involves physical interaction with artifact surface."
- else if(A.my_effect.trigger >= 5 && A.my_effect.trigger <= 8)
- out += " Activation index involves energetic interaction with artifact surface."
- else if(A.my_effect.trigger >= 9 && A.my_effect.trigger <= 12)
- out += " Activation index involves precise local atmospheric conditions."
- else
- out += " Unable to determine any data about activation trigger."
-
- //secondary:
- if(A.secondary_effect && A.secondary_effect.activated)
- //sciencey words go!
- out += "
Warning, internal scans indicate ongoing [pick("subluminous","subcutaneous","superstructural")] activity operating \
- independantly from primary systems. Auxiliary activity involves "
-
- //what kind of effect the artifact has
- switch(A.secondary_effect.effect_type)
- if(1)
- out += "concentrated energy emissions"
- if(2)
- out += "intermittent psionic wavefront"
- if(3)
- out += "electromagnetic energy"
- if(4)
- out += "high frequency particles"
- if(5)
- out += "organically reactive exotic particles"
- if(6)
- out += "interdimensional/bluespace? phasing"
- if(7)
- out += "atomic synthesis"
- else
- out += "low level radiation"
-
- //how the artifact does it's effect
- switch(A.secondary_effect.effect_type)
- if(1)
- out += " emitting in an ambient energy field."
- if(2)
- out += " emitting in periodic bursts."
- else
- out += " interspersed throughout substructure and shell."
-
- if(A.secondary_effect.trigger >= 0 && A.secondary_effect.trigger <= 4)
- out += " Activation index involves physical interaction with artifact surface, but subsystems indicate \
- anomalous interference with standard attempts at triggering."
- else if(A.secondary_effect.trigger >= 5 && A.secondary_effect.trigger <= 8)
- out += " Activation index involves energetic interaction with artifact surface, but subsystems indicate \
- anomalous interference with standard attempts at triggering."
- else if(A.secondary_effect.trigger >= 9 && A.secondary_effect.trigger <= 12)
- out += " Activation index involves precise local atmospheric conditions, but subsystems indicate \
- anomalous interference with standard attempts at triggering."
- else
- out += " Unable to determine any data about activation trigger."
- return out
- else
- //it was an ordinary item
- return "[scanned_obj.name] - Mundane application, composed of carbo-ferritic alloy composite."
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
deleted file mode 100644
index 38eaa00c6a2..00000000000
--- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
+++ /dev/null
@@ -1,254 +0,0 @@
-
-/obj/machinery/artifact_harvester
- name = "exotic particle harvester"
- icon = 'icons/obj/virology.dmi'
- icon_state = "incubator" //incubator_on
- anchored = 1
- density = 1
- idle_power_usage = 50
- active_power_usage = 750
- use_power = 1
- var/harvesting = 0
- var/obj/item/weapon/anobattery/inserted_battery
- var/obj/machinery/artifact/cur_artifact
- var/obj/machinery/artifact_scanpad/owned_scanner = null
- var/last_process = 0
-
-/obj/machinery/artifact_harvester/New()
- ..()
- //connect to a nearby scanner pad
- owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir)
- if(!owned_scanner)
- owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src)
-
-/obj/machinery/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob, params)
- if(istype(I,/obj/item/weapon/anobattery))
- if(!inserted_battery)
- to_chat(user, "You insert [I] into [src].")
- user.drop_item()
- I.loc = src
- src.inserted_battery = I
- updateDialog()
- else
- to_chat(user, "There is already a battery in [src].")
- else
- return..()
-
-/obj/machinery/artifact_harvester/attack_hand(var/mob/user as mob)
- src.add_fingerprint(user)
- interact(user)
-
-/obj/machinery/artifact_harvester/interact(var/mob/user as mob)
- if(stat & (NOPOWER|BROKEN))
- return
- user.set_machine(src)
- var/dat = "Artifact Power Harvester
"
- dat += "
"
- //
- if(owned_scanner)
- if(harvesting)
- if(harvesting > 0)
- dat += "Please wait. Harvesting in progress ([round((inserted_battery.stored_charge/inserted_battery.capacity)*100)]%).
"
- else
- dat += "Please wait. Energy dump in progress ([round((inserted_battery.stored_charge/inserted_battery.capacity)*100)]%).
"
- dat += "Halt early
"
- else
- if(inserted_battery)
- dat += "[inserted_battery.name] inserted, charge level: [inserted_battery.stored_charge]/[inserted_battery.capacity] ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%)
"
- dat += "Energy signature ID:[inserted_battery.battery_effect ? (inserted_battery.battery_effect.artifact_id == "" ? "???" : "[inserted_battery.battery_effect.artifact_id]") : "NA"]
"
- dat += "Eject battery
"
- dat += "Drain battery of all charge
"
- dat += "Begin harvesting
"
-
- else
- dat += "No battery inserted.
"
- else
- dat += "Unable to locate analysis pad.
"
- //
- dat += "
"
- dat += "Refresh Close
"
- user << browse(dat, "window=artharvester;size=450x500")
- onclose(user, "artharvester")
-
-/obj/machinery/artifact_harvester/process()
- if(stat & (NOPOWER|BROKEN))
- return
-
- if(harvesting > 0)
- //charge at 33% consumption rate
- inserted_battery.stored_charge += (world.time - last_process) / 3
- last_process = world.time
-
- //check if we've finished
- if(inserted_battery.stored_charge >= inserted_battery.capacity)
- use_power = 1
- harvesting = 0
- cur_artifact.anchored = 0
- cur_artifact.being_used = 0
- cur_artifact = null
- src.visible_message("[name] states, \"Battery is full.\"")
- icon_state = "incubator"
-
- else if(harvesting < 0)
- //dump some charge
- inserted_battery.stored_charge -= (world.time - last_process) / 3
-
- //do the effect
- if(inserted_battery.battery_effect)
- inserted_battery.battery_effect.process()
-
- //if the effect works by touch, activate it on anyone viewing the console
- if(inserted_battery.battery_effect.effect == EFFECT_TOUCH)
- var/list/nearby = viewers(1, src)
- for(var/mob/M in nearby)
- if(M.machine == src)
- inserted_battery.battery_effect.DoEffectTouch(M)
-
- //if there's no charge left, finish
- if(inserted_battery.stored_charge <= 0)
- use_power = 1
- inserted_battery.stored_charge = 0
- harvesting = 0
- if(inserted_battery.battery_effect && inserted_battery.battery_effect.activated)
- inserted_battery.battery_effect.ToggleActivate()
- src.visible_message("[name] states, \"Battery dump completed.\"")
- icon_state = "incubator"
-
-/obj/machinery/artifact_harvester/Topic(href, href_list)
-
- if(href_list["harvest"])
- if(!inserted_battery)
- src.visible_message("[src] states, \"Cannot harvest. No battery inserted.\"")
-
- else if(inserted_battery.stored_charge >= inserted_battery.capacity)
- src.visible_message("[src] states, \"Cannot harvest. battery is full.\"")
-
- else
-
- //locate artifact on analysis pad
- cur_artifact = null
- var/articount = 0
- var/obj/machinery/artifact/analysed
- for(var/obj/machinery/artifact/A in get_turf(owned_scanner))
- analysed = A
- articount++
-
- if(articount <= 0)
- var/message = "[src] states, \"Cannot harvest. No noteworthy energy signature isolated.\""
- src.visible_message(message)
-
- else if(analysed && analysed.being_used)
- src.visible_message("[src] states, \"Cannot harvest. Source already being harvested.\"")
-
- else
- if(articount > 1)
- atom_say("Cannot harvest. Too many artifacts on the pad.")
- else if(analysed)
- cur_artifact = analysed
-
- //if both effects are active, we can't harvest either
- if(cur_artifact.my_effect && cur_artifact.my_effect.activated && cur_artifact.secondary_effect.activated)
- src.visible_message("[src] states, \"Cannot harvest. Source is emitting conflicting energy signatures.\"")
- else if(!cur_artifact.my_effect.activated && !cur_artifact.secondary_effect.activated)
- src.visible_message("[src] states, \"Cannot harvest. No energy emitting from source.\"")
-
- else
- //see if we can clear out an old effect
- //delete it when the ids match to account for duplicate ids having different effects
- if(inserted_battery.battery_effect && inserted_battery.stored_charge <= 0)
- qdel(inserted_battery.battery_effect)
-
- //
- var/datum/artifact_effect/source_effect
-
- //if we already have charge in the battery, we can only recharge it from the source artifact
- if(inserted_battery.stored_charge > 0)
- var/battery_matches_primary_id = 0
- if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.my_effect.artifact_id)
- battery_matches_primary_id = 1
- if(battery_matches_primary_id && cur_artifact.my_effect.activated)
- //we're good to recharge the primary effect!
- source_effect = cur_artifact.my_effect
-
- var/battery_matches_secondary_id = 0
- if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.secondary_effect.artifact_id)
- battery_matches_secondary_id = 1
- if(battery_matches_secondary_id && cur_artifact.secondary_effect.activated)
- //we're good to recharge the secondary effect!
- source_effect = cur_artifact.secondary_effect
-
- if(!source_effect)
- src.visible_message("[src] states, \"Cannot harvest. Battery is charged with a different energy signature.\"")
- else
- //we're good to charge either
- if(cur_artifact.my_effect.activated)
- //charge the primary effect
- source_effect = cur_artifact.my_effect
-
- else if(cur_artifact.secondary_effect.activated)
- //charge the secondary effect
- source_effect = cur_artifact.secondary_effect
-
-
- if(source_effect)
- harvesting = 1
- use_power = 2
- cur_artifact.anchored = 1
- cur_artifact.being_used = 1
- icon_state = "incubator_on"
- var/message = "[src] states, \"Beginning energy harvesting.\""
- src.visible_message(message)
- last_process = world.time
-
- //duplicate the artifact's effect datum
- if(!inserted_battery.battery_effect)
- var/effecttype = source_effect.type
- var/datum/artifact_effect/E = new effecttype(inserted_battery)
-
- //duplicate it's unique settings
- for(var/varname in list("chargelevelmax","artifact_id","effect","effectrange","trigger"))
- E.vars[varname] = source_effect.vars[varname]
-
- //copy the new datum into the battery
- inserted_battery.battery_effect = E
- inserted_battery.stored_charge = 0
-
- if(href_list["stopharvest"])
- if(harvesting)
- if(harvesting < 0 && inserted_battery.battery_effect && inserted_battery.battery_effect.activated)
- inserted_battery.battery_effect.ToggleActivate()
- harvesting = 0
- cur_artifact.anchored = 0
- cur_artifact.being_used = 0
- cur_artifact = null
- src.visible_message("[name] states, \"Energy harvesting interrupted.\"")
- icon_state = "incubator"
-
- if(href_list["ejectbattery"])
- src.inserted_battery.loc = src.loc
- src.inserted_battery = null
-
- if(href_list["drainbattery"])
- if(inserted_battery)
- if(inserted_battery.battery_effect && inserted_battery.stored_charge > 0)
- if(alert("This action will dump all charge, safety gear is recommended before proceeding","Warning","Continue","Cancel"))
- if(!inserted_battery.battery_effect.activated)
- inserted_battery.battery_effect.ToggleActivate(1)
- last_process = world.time
- harvesting = -1
- use_power = 2
- icon_state = "incubator_on"
- var/message = "[src] states, \"Warning, battery charge dump commencing.\""
- src.visible_message(message)
- else
- var/message = "[src] states, \"Cannot dump energy. Battery is drained of charge already.\""
- src.visible_message(message)
- else
- var/message = "[src] states, \"Cannot dump energy. No battery inserted.\""
- src.visible_message(message)
-
- if(href_list["close"])
- usr << browse(null, "window=artharvester")
- usr.unset_machine(src)
-
- updateDialog()
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm b/code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm
deleted file mode 100644
index a93c92a176e..00000000000
--- a/code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-
-/obj/machinery/artifact_scanpad
- name = "anomaly scanner pad"
- desc = "Place things here for scanning."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "tele0"
- anchored = 1
- density = 0
diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm
deleted file mode 100644
index ffbf02c23bc..00000000000
--- a/code/modules/research/xenoarchaeology/machinery/coolant.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-
-/datum/reagent/coolant
- name = "Coolant"
- id = "coolant"
- description = "Industrial cooling substance."
- reagent_state = LIQUID
- color = "#C8A5DC" // rgb: 200, 165, 220
-
-/obj/structure/reagent_dispensers/coolanttank
- name = "coolant tank"
- desc = "A tank of industrial coolant"
- icon_state = "coolanttank"
- reagent_id = "coolant"
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
deleted file mode 100644
index 7bbd7408173..00000000000
--- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
+++ /dev/null
@@ -1,356 +0,0 @@
-
-/obj/machinery/radiocarbon_spectrometer
- name = "Radiocarbon spectrometer"
- desc = "A specialised, complex scanner for gleaning information on all manner of small things."
- anchored = 1
- density = 1
- icon = 'icons/obj/virology.dmi'
- icon_state = "analyser"
-
- use_power = 1 //1 = idle, 2 = active
- idle_power_usage = 20
- active_power_usage = 300
-
- //var/obj/item/weapon/reagent_containers/glass/coolant_container
- var/scanning = 0
- var/report_num = 0
- //
- var/obj/item/scanned_item
- var/last_scan_data = "No scans on record."
- //
- var/last_process_worldtime = 0
- //
- var/scanner_progress = 0
- var/scanner_rate = 1.25 //80 seconds per scan
- var/scanner_rpm = 0
- var/scanner_rpm_dir = 1
- var/scanner_temperature = 0
- var/scanner_seal_integrity = 100
- //
- var/coolant_usage_rate = 0 //measured in u/microsec
- var/fresh_coolant = 0
- var/coolant_purity = 0
- var/datum/reagents/coolant_reagents
- var/used_coolant = 0
- var/list/coolant_reagents_purity = list()
- //
- var/maser_wavelength = 0
- var/optimal_wavelength = 0
- var/optimal_wavelength_target = 0
- var/tleft_retarget_optimal_wavelength = 0
- var/maser_efficiency = 0
- //
- var/radiation = 0 //0-100 mSv
- var/t_left_radspike = 0
- var/rad_shield = 0
-
-/obj/machinery/radiocarbon_spectrometer/New()
- ..()
- create_reagents(500)
- coolant_reagents_purity["water"] = 0.5
- coolant_reagents_purity["icecoffee"] = 0.6
- coolant_reagents_purity["icetea"] = 0.6
- coolant_reagents_purity["milkshake"] = 0.6
- coolant_reagents_purity["teporone"] = 0.7
- coolant_reagents_purity["sterilizine"] = 0.7
- coolant_reagents_purity["cryoxadone"] = 0.9
- coolant_reagents_purity["coolant"] = 1
- coolant_reagents_purity["adminordrazine"] = 2
-
-/obj/machinery/radiocarbon_spectrometer/attack_hand(var/mob/user as mob)
- ui_interact(user)
-
-/obj/machinery/radiocarbon_spectrometer/attackby(var/obj/I as obj, var/mob/user as mob, params)
- if(scanning)
- to_chat(user, "You can't do that while [src] is scanning!")
- else
- if(istype(I, /obj/item/stack/nanopaste))
- var/choice = alert("What do you want to do with the nanopaste?","Radiometric Scanner","Scan nanopaste","Fix seal integrity")
- if(choice == "Fix seal integrity")
- var/obj/item/stack/nanopaste/N = I
- var/amount_used = min(N.amount, 10 - scanner_seal_integrity / 10)
- N.use(amount_used)
- scanner_seal_integrity = round(scanner_seal_integrity + amount_used * 10)
- return
- if(istype(I, /obj/item/weapon/reagent_containers/glass))
- var/choice = alert("What do you want to do with the container?","Radiometric Scanner","Add coolant","Empty coolant","Scan container")
- if(choice == "Add coolant")
- var/obj/item/weapon/reagent_containers/glass/G = I
- var/amount_transferred = min(src.reagents.maximum_volume - src.reagents.total_volume, G.reagents.total_volume)
- G.reagents.trans_to(src, amount_transferred)
- to_chat(user, "You empty [amount_transferred]u of coolant into [src].")
- update_coolant()
- return
- else if(choice == "Empty coolant")
- var/obj/item/weapon/reagent_containers/glass/G = I
- var/amount_transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, src.reagents.total_volume)
- src.reagents.trans_to(G, amount_transferred)
- to_chat(user, "You remove [amount_transferred]u of coolant from [src].")
- update_coolant()
- return
- user.drop_item()
- I.loc = src
- scanned_item = I
-
-/obj/machinery/radiocarbon_spectrometer/proc/update_coolant()
- var/total_purity = 0
- fresh_coolant = 0
- coolant_purity = 0
- var/num_reagent_types = 0
- for(var/datum/reagent/current_reagent in src.reagents.reagent_list)
- if(!current_reagent)
- continue
- var/cur_purity = coolant_reagents_purity[current_reagent.id]
- if(!cur_purity)
- cur_purity = 0.1
- else if(cur_purity > 1)
- cur_purity = 1
- total_purity += cur_purity * current_reagent.volume
- fresh_coolant += current_reagent.volume
- num_reagent_types += 1
- if(total_purity && fresh_coolant)
- coolant_purity = total_purity / fresh_coolant
-
-/obj/machinery/radiocarbon_spectrometer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(user.stat)
- return
-
- // update the ui if it exists, returns null if no ui is passed/found
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- // the ui does not exist, so we'll create a new() one
- // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
- ui = new(user, src, ui_key, "geoscanner.tmpl", "High Res Radiocarbon Spectrometer", 900, 825)
- // open the new ui window
- ui.open()
- // auto update every Master Controller tick
- ui.set_auto_update(1)
-
-/obj/machinery/radiocarbon_spectrometer/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
- var/data[0]
- data["scanned_item"] = (scanned_item ? scanned_item.name : "")
- data["scanned_item_desc"] = (scanned_item ? (scanned_item.desc ? scanned_item.desc : "No information on record.") : "")
- data["last_scan_data"] = last_scan_data
- //
- data["scan_progress"] = round(scanner_progress)
- data["scanning"] = scanning
- //
- data["scanner_seal_integrity"] = round(scanner_seal_integrity)
- data["scanner_rpm"] = round(scanner_rpm)
- data["scanner_temperature"] = round(scanner_temperature)
- //
- data["coolant_usage_rate"] = "[coolant_usage_rate]"
- data["unused_coolant_abs"] = round(fresh_coolant)
- data["unused_coolant_per"] = round(fresh_coolant / reagents.maximum_volume * 100)
- data["coolant_purity"] = "[coolant_purity * 100]"
- //
- data["optimal_wavelength"] = round(optimal_wavelength)
- data["maser_wavelength"] = round(maser_wavelength)
- data["maser_efficiency"] = round(maser_efficiency * 100)
- //
- data["radiation"] = round(radiation)
- data["t_left_radspike"] = round(t_left_radspike)
- data["rad_shield_on"] = rad_shield
- return data
-
-/obj/machinery/radiocarbon_spectrometer/process()
- if(scanning)
- if(!scanned_item || scanned_item.loc != src)
- scanned_item = null
- stop_scanning()
- else if(scanner_progress >= 100)
- complete_scan()
- else
- //calculate time difference
- var/deltaT = (world.time - last_process_worldtime) * 0.1
-
- //modify the RPM over time
- //i want 1u to last for 10 sec at 500 RPM, scaling linearly
- scanner_rpm += scanner_rpm_dir * 50 * deltaT
- if(scanner_rpm > 1000)
- scanner_rpm = 1000
- scanner_rpm_dir = -1 * pick(0.5, 2.5, 5.5)
- else if(scanner_rpm < 1)
- scanner_rpm = 1
- scanner_rpm_dir = 1 * pick(0.5, 2.5, 5.5)
-
- //heat up according to RPM
- //each unit of coolant
- scanner_temperature += scanner_rpm * deltaT * 0.05
-
- //radiation
- t_left_radspike -= deltaT
- if(t_left_radspike > 0)
- //ordinary radiation
- radiation = rand() * 15
- else
- //radspike
- if(t_left_radspike > -5)
- radiation = rand() * 15 + 85
- if(!rad_shield)
- //irradiate nearby mobs
- for(var/mob/living/M in view(7,src))
- M.apply_effect(radiation / 25, IRRADIATE, 0)
- else
- t_left_radspike = pick(10,15,25)
-
- //use some coolant to cool down
- if(coolant_usage_rate > 0)
- var/coolant_used = min(fresh_coolant, coolant_usage_rate * deltaT)
- if(coolant_used > 0)
- fresh_coolant -= coolant_used
- used_coolant += coolant_used
- scanner_temperature = max(scanner_temperature - coolant_used * coolant_purity * 20, 0)
-
- //modify the optimal wavelength
- tleft_retarget_optimal_wavelength -= deltaT
- if(tleft_retarget_optimal_wavelength <= 0)
- tleft_retarget_optimal_wavelength = pick(4,8,15)
- optimal_wavelength_target = rand() * 9900 + 100
- //
- if(optimal_wavelength < optimal_wavelength_target)
- optimal_wavelength = min(optimal_wavelength + 700 * deltaT, optimal_wavelength_target)
- else if(optimal_wavelength > optimal_wavelength_target)
- optimal_wavelength = max(optimal_wavelength - 700 * deltaT, optimal_wavelength_target)
- //
- maser_efficiency = 1 - max(min(10000, abs(optimal_wavelength - maser_wavelength) * 3), 1) / 10000
-
- //make some scan progress
- if(!rad_shield)
- scanner_progress = min(100, scanner_progress + scanner_rate * maser_efficiency * deltaT)
-
- //degrade the seal over time according to temperature
- //i want temperature of 50K to degrade at 1%/sec
- scanner_seal_integrity -= (max(scanner_temperature, 1) / 1000) * deltaT
-
- //emergency stop if seal integrity reaches 0
- if(scanner_seal_integrity <= 0 || (scanner_temperature >= 1273 && !rad_shield))
- stop_scanning()
- src.visible_message("[bicon(src)] buzzes unhappily. It has failed mid-scan!", 2)
-
- if(prob(5))
- src.visible_message("[bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")].", 2)
- else
- //gradually cool down over time
- if(scanner_temperature > 0)
- scanner_temperature = max(scanner_temperature - 5 - 10 * rand(), 0)
- if(prob(0.75))
- src.visible_message("[bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2)
- last_process_worldtime = world.time
-
-/obj/machinery/radiocarbon_spectrometer/proc/stop_scanning()
- scanning = 0
- scanner_rpm_dir = 1
- scanner_rpm = 0
- optimal_wavelength = 0
- maser_efficiency = 0
- maser_wavelength = 0
- coolant_usage_rate = 0
- radiation = 0
- t_left_radspike = 0
- if(used_coolant)
- src.reagents.remove_any(used_coolant)
- used_coolant = 0
-
-/obj/machinery/radiocarbon_spectrometer/proc/complete_scan()
- src.visible_message("[bicon(src)] makes an insistent chime.", 2)
-
- if(scanned_item)
- //create report
- playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
- var/obj/item/weapon/paper/P = new(src)
- P.name = "[src] report #[++report_num]: [scanned_item.name]"
- P.stamped = list(/obj/item/weapon/stamp)
- P.overlays = list("paper_stamped")
-
- //work out data
- var/data = " - Mundane object: [scanned_item.desc ? scanned_item.desc : "No information on record."]
"
- var/datum/geosample/G
- switch(scanned_item.type)
- if(/obj/item/weapon/ore)
- var/obj/item/weapon/ore/O = scanned_item
- if(O.geologic_data)
- G = O.geologic_data
-
- if(/obj/item/weapon/rocksliver)
- var/obj/item/weapon/rocksliver/O = scanned_item
- if(O.geological_data)
- G = O.geological_data
-
- if(/obj/item/weapon/archaeological_find)
- data = " - Mundane object (archaic xenos origins)
"
-
- var/obj/item/weapon/archaeological_find/A = scanned_item
- if(A.talking_atom)
- data = " - Exhibits properties consistent with sonic reproduction and audio capture technologies.
"
-
- var/anom_found = 0
- if(G)
- data = " - Spectometric analysis on mineral sample has determined type [finds_as_strings[responsive_carriers.Find(G.source_mineral)]]
"
- if(G.age_billion > 0)
- data += " - Radiometric dating shows age of [G.age_billion].[G.age_million] billion years
"
- else if(G.age_million > 0)
- data += " - Radiometric dating shows age of [G.age_million].[G.age_thousand] million years
"
- else
- data += " - Radiometric dating shows age of [G.age_thousand * 1000 + G.age] years
"
- data += " - Chromatographic analysis shows the following materials present:
"
- for(var/carrier in G.find_presence)
- if(G.find_presence[carrier])
- var/index = responsive_carriers.Find(carrier)
- if(index > 0 && index <= finds_as_strings.len)
- data += " > [100 * G.find_presence[carrier]]% [finds_as_strings[index]]
"
-
- if(G.artifact_id && G.artifact_distance >= 0)
- anom_found = 1
- data += " - Hyperspectral imaging reveals exotic energy wavelength detected with ID: [G.artifact_id]
"
- data += " - Fourier transform analysis on anomalous energy absorption indicates energy source located inside emission radius of [G.artifact_distance]m
"
-
- if(!anom_found)
- data += " - No anomalous data
"
-
- P.info = "[src] analysis report #[report_num]
"
- P.info += "Scanned item: [scanned_item.name]
" + data
- last_scan_data = P.info
- P.loc = src.loc
-
- scanned_item.loc = src.loc
- scanned_item = null
-
-/obj/machinery/radiocarbon_spectrometer/Topic(href, href_list)
- if(stat & (NOPOWER|BROKEN))
- return 0 // don't update UIs attached to this object
-
- if(href_list["scanItem"])
- if(scanning)
- stop_scanning()
- else
- if(scanned_item)
- if(scanner_seal_integrity > 0)
- scanner_progress = 0
- scanning = 1
- t_left_radspike = pick(5,10,15)
- to_chat(usr, "Scan initiated.")
- else
- to_chat(usr, "Could not initiate scan, seal requires replacing.")
- else
- to_chat(usr, "Insert an item to scan.")
-
- if(href_list["maserWavelength"])
- maser_wavelength = max(min(maser_wavelength + 1000 * text2num(href_list["maserWavelength"]), 10000), 1)
-
- if(href_list["coolantRate"])
- coolant_usage_rate = max(min(coolant_usage_rate + text2num(href_list["coolantRate"]), 10000), 0)
-
- if(href_list["toggle_rad_shield"])
- if(rad_shield)
- rad_shield = 0
- else
- rad_shield = 1
-
- if(href_list["ejectItem"])
- if(scanned_item)
- scanned_item.loc = src.loc
- scanned_item = null
-
- add_fingerprint(usr)
- return 1 // update UIs attached to this object
diff --git a/code/modules/research/xenoarchaeology/manuals.dm b/code/modules/research/xenoarchaeology/manuals.dm
deleted file mode 100644
index 99be3a6849c..00000000000
--- a/code/modules/research/xenoarchaeology/manuals.dm
+++ /dev/null
@@ -1,370 +0,0 @@
-
-/obj/item/weapon/book/manual/excavation
- name = "Out on the dig"
- icon_state = "excavation"
- author = "Professor Patrick Mason, Curator of the Antiquities Museum on Ichar VII"
- title = "Out on the dig"
- dat = {"
-
-
-
-
-
-
-
- - Prepping the expedition
- - Knowing your tools
- - Finding the dig
- - Analysing deposits
- - Extracting your first find
-
-
-
-
- Every digsite I've been to, someone has forgotten something and I've never yet been to a dig that hasn't had me hiking to get to it - so gather your gear
- and get it to the site the first time. You learn quick that time is money, when you've got a shipful of bandits searching for you the next valley over,
- but don't be afraid to clear some space if there are any inconvenient boulders in the way.
-
- Floodlights (if it's dark)
- Wooden trestle tables (for holding tools and finds)
- Suspension field generator
- Load bearing servitors (such as a mulebot, or hover-tray)
- Spare energy packs
-
- Contents
-
-
- Every archaeologist has a plethora of tools at their disposal, but here's the important ones:
-
- Picks, pickaxes and brushes - don't underestimate the the smallest or largest in your arsenal, each one clears a different amount
- of the rockface so each one has a use.
- Measuring tape - don't leave home without it, you can use it to measure the depth a rock face has been excavated to.
- GPS locater - knowing where you are is the first step to not be lost.
- Core sampler - use this to take core samples from rock faces, which you can then run to the lab for analysis.
- Depth scanner - uses x-ray diffraction to locate anomalous densities in rock, indicating archaeological deposits or mineral veins.
- Comes with a handy reference log containing co-ordinates and time of each scan.
- Alden-Saraspova counter - uses a patented application of Fourier Transform analysis to determine the difference between background and
- exotic radiation. Use it to determine how far you are from anomalous energy sources.
- Radio beacon locater - leave a beacon at an item of interest, then track it down later with this handy gadget. Watch for interference from other
- devices though.
- Flashlight or portable light source - Self explanatory, I hope.
- Environmental safety gear - This one's dependant on the environment you're working in, but enclosed footwear and pack of internals
- could save your life.
- Anomaly safety gear - A biosealed and catalysis-resistant suit along with eye shielding, tinted hood and non-reactive disposable gloves are
- the best kind of protection you can hope for from the errors our forbears may have unleashed.
- Personal defence weapon - Never know what you'll find on the dig: pirates, natives, ancient guardians, carnivorous wildlife...
- it pays in blood to be prepared.
-
- Contents
-
-
- Wouldn't be an archaeologist without their dig, but everyone has to start somewhere. Here's a basic procedure I go through when cataloguing a new planet:
-
- Get in touch with the locals (in particular geologists, miners and farmers) - Never know what's been turned up by accident, then left to
- gather dust on a shelf.
- Check the obvious areas first - even if you're pressed for time, these ones are the generally easiest to search, and the most likely targets
- of your rivals.
- Do some prospecting - the earth mother isn't in the habit of displaying her secrets to the world (although sometimes you get lucky).
- Drop a shaft and clear away a bit of surface rock here and there, you never know what might be lurking below the surface.
- Tips on unearthing a deposit - How do you know when you're golden? Look for telltale white strata that looks strange or out of place, or if
- something has broken under your pick while you're digging. Your depth scanner is your best friend, but even it can't distinguish between
- ordinary minerals and ancient leavings, if in doubt then err on the side of caution.
-
- Contents
-
-
- You've found some unusual strata, but it's not all peaches from here. No archaeologist ever managed to pull a bone from the earth without doing thorough
- chemical analysis on every two meters of rock face nearby.
-
- Take core samples - Grab a rock core for every 4m^2.
- Clear around any potential finds - Clear away ordinary rock, leaving your prizes reachable in a clearly marked area.
- Haul off excess rock - It's easy for a dig to get cluttered, and a neat archaeologist is a successful archaeologist.
- Don't be afraid to be cautious - It's slower sometimes, but the extra time will be worth the payoff when you find an Exolitic relic.
- Chemical analysis - I won't go into detail here, but the labwork is essential to any successful extraction. Marshal your core samples, and
- send them off to the labcoated geniuses
-
- Contents
-
-
-
- Scan the rock - Use a depth scanner to determine the find's depth and clearance. DON'T FORGET THESE.
- Choose stasis field - Chemical analysis on a core sample from the rock face will tell you which field is necessary to extract the find safely
- Setup field gen - Bolt it down, choose the field, check the charge and activate it. If you forget it, you'll wish you hadn't when that priceless
- Uryom vase crumbles as it sees the light of day.
- FUNCTIONAL AND SAFE digging - Dig into the rock until you've cleared away a depth equal to (the anomaly depth MINUS the clearance range). The find
- should come loose on it's own, but it will be in the midst of a chunk of rock. Use a welder or miniature excavation tool to clear away the excess.
- FANCY AND SPEEDY digging - Dig into the rock until you've cleared away a depth equal to the anomaly depth, but without any of your strokes
- entering the clearance range.
- The Big Find - Sometimes, you'll chance upon something big, both literally and figuratively. Giant statues and functioning remnants of Precursor
- technology are just as exciting, to the right buyers. If your digging leaves a large boulder behind, dig into it normally and see if anything's hidden
- inside.
-
- Contents
-
-
-
- "}
-
-/obj/item/weapon/book/manual/mass_spectrometry
- name = "High power mass spectrometry, a comprehensive guide"
- icon_state = "analysis"
- author = "Winton Rice, Chief Mass Spectrometry Technician at the Institute of Applied Sciences on Arcadia"
- title = "High powered mass spectrometry, a comprehensive guide"
- dat = {"
-
-
-
-
-
-
-
- - A note on terms
- - Analysis progression
- - Heat management
- - Ambient radiation
-
-
-
-
-
- Mass spectrometry - MS is the procedure used used to measure and quantify the components of matter. The most prized tool in the field of
- 'Materials analysis'
- Radiometric dating - MS applied using the right carrier reagents can be used to accurately determine the age of a sample.
- Dissonance ratio - This is a pseudoarbitrary value indicating the overal presence of a particular element in a greater composite.
- It takes into account volume, density, molecular excitation and isotope spread.
- Vacuum seal integrity - A reference to how close an airtight seal is to failure.
-
- Contents
-
-
- Modern mass spectrometry requires constant attention from the diligant researcher in order to be successul. There are many different elements to juggle,
- and later chapters will delve into them. For the spectrometry assistant, the first thing you need to know is that the scanner wavelength is automatically
- calculated for you. Just tweak the settings and try to match it with the actual wavelength as closely as possible.
-
- Contents
-
-
- In order to maintain sterile and environmentally static procedures, a special chamber is setup inside the spectrometer. It's protected by a proprietary vacuum seal
- produced by top tier industrial science. It will only last for a certain number of scans before failing outright, but it can be resealed through use of nanite paste.
- Unfortunately, it's susceptible to malforming under heat stress so exposing it to higher temperatures will cause it's operation life to drop significantly.
-
- Contents
-
-
- The scanner relies on a gyro-rotational system that varies in speed and intensity. Over the course of an ordinary scan, the RPMs can change dramatically. Higher RPMs
- means greater heat generation, but is necessary for the ongoing continuation of the scan. To offset heat production, spectrometers have an inbuilt cooling system.
- Researchers can modify the flow rate of coolant to aid in dropping temperature as necessary, but are advised that frequent coolant replacements may be necessary
- depending on coolant purity. Water and substances such as cryoxadone are viable substitutes, but nowhere near as effective as pure coolant itself.
-
- Contents
-
-
- Researchers are warned that while operational, mass spectrometers emit period bursts of radiation and are thus advised to wear protective gear. In the event of
- radiation spikes, there is also a special shield that can be lowered to block emissions. Lowering this, however, will have the effect of blocking the scanner
- so use it sparingly.
-
- Contents
-
-
-
- "}
-
-/obj/item/weapon/book/manual/anomaly_spectroscopy
- name = "Spectroscopy: Analysing the anomalies of the cosmos"
- icon_state = "anomaly"
- author = "Doctor Martin Boyle, Director Research at the Lower Hydrolian Sector Listening Array"
- title = "Spectroscopy: Analysing the anomalies of the cosmos"
- dat = {"
-
-
-
-
-
- It's perhaps one of the most exciting times to be alive, with the recent breakthroughs in understanding and categorisation of things we may one day no longer call
- 'anomalies,' but rather 'infrequent or rare occurrences of certain celestial weather or phenomena.' Perhaps a little more long winded, but no less eloquent all the
- same! Why, look at the strides we're making in piercing the walls of bluespace or our steadily improving ability to clarify and stabilise subspace emissions; it's
- certainly an exciting time to be alive. For the moment the Hydrolian hasn't seen two spatial anomalies alike but the day will come and it is soon, I can feel it.
- "}
-
-/obj/item/weapon/book/manual/materials_chemistry_analysis
- name = "Materials analysis and the chemical implications"
- icon_state = "chemistry"
- author = "Jasper Pascal, Senior Lecturer in Materials Analysis at the University of Jol'Nar"
- title = "Materials analysis and the chemical implications"
- dat = {"
-
-
-
-
-
- In today's high tech research fields, leaps and bounds are being made every day. Whether it's great strides forward in our understanding of the physical universe
- or the operation of some fancy new piece of equipment, it seems like all the cool fields are producing new toys to play with leaving doddery old fields such as
- materials analysis and chemistry relegated to the previous few centuries, when we were still learning the makeup and structure of the elements.
-
- Well, when you're out there building the next gryo-whatsitron or isotope mobility thingummy, remember how the field of archaeology experienced a massive new rebirth
- following the excavations at Paranol IV and consider how all of the scientific greats will come crawling back to basic paradigms of natural philosophy when they discover
- a new element that defies classification. I defy you to classify it without reviving this once great field!
- "}
-
-/obj/item/weapon/book/manual/anomaly_testing
- name = "Anomalous materials and energies"
- icon_state = "triangulate"
- author = "Norman York, formerly of the Tyrolion Institute on Titan"
- title = "Anomalous materials and energies"
- dat = {"
-
-
-
-
-
-
-
- - Forward: Modern attitude towards anomalies
- - Triangulating anomalous energy readings
- - Harvesting and utilising anomalous energy signatures
-
-
-
- It's only when confronted with things we don't know, that we may push back our knowledge of the world around us. Nowhere is this more obvious than the
- vast and inscrutable mysterious of the cosmos that scholars from such august institutions as the Elysian Institute of the Sciences present
- formulas and hypotheses for every few decades.
-
- Using our vast telescopic array installations and deep space satellite networks, we are able to detect anomalous energy fields and formations in deep space,
- but are limited to those that are large enough to output energy that will stretch across light years worth of distance between stars.
-
- While some sectors (such as the Hydrolian Rift and Keppel's Run) are replete with inexplicable energetic activity and unique phenomena found nowhere else in
- the galaxy, the majority of space is dry, barren and cold - and if past experience has told us anything, it is that there are always more things we are
- unable to explain.
-
- Indeed, a great source of knowledge and technology has always been those who come before us, in the form of the multitudinous ancient alien precursors that
- have left scattered remnants of their great past all over settled (and unexplored) space.
-
- It is from xenoarchaeologists, high energy materials researchers and technology reconstruction authorities that we are able to theorise on the gifts these
- species have left behind, and in some cases even reverse engineer or rebuild the technology in question. My colleague Doctor Raymond Ward of the
- Tyrolian Institute on Titan has made great breakthroughs in a related field through his pioneering development of universally reflective materials capable
- of harvesting and 'bottling' up virtually any energy emissions yet encountered by spacefaring civilisations.
-
- And yet, there are some amongst us who do not see the benefits of those who have come before us - indeed, some among them profess the opinion that there
- is no species that could possibly match humanity in it's achievements and knowledge, or simply that employing non-human technology is dangerous and unethical.
- Folly, say I. If it is their desire to throw onto the wayside the greatest achievements in the history of the galaxy, simply for preferment of the
- greatest achievements in the history of mankind, then they have no business in the establishment of science.
- Contents
-
-
- Strong energy emissions, when remaining constant from any one fixed location for millenia, can leave an 'imprint' or distinctive energy signature on other
- matter composites that are spatially fixed relative to the source.
-
- By taking samples of such 'fixed' matter, we can apply complex analytics such as the modified Fourier Transform Procedure to reverse engineer the path of the
- energy, and determine the approximate distance and direction that the energy source is, relative to the sample's point in space. Modern portable devices can do
- all this purely by taking readings of local radiation.
-
- A canny researcher can thusly analyse radiationat pre-chosen points strategically scattered around an area, and if there are any anomalous energy
- emissions in range of those points, combined the researcher can triangulate the source.
- Contents
-
-
- As mentioned in the forward, my colleague from the Tyrolian Institute on Saturn's moon of Titan, in the Sol System, Doctor Raymond Ward has made great strides
- in the area of harvesting and application of the energy emitted by anomalous phenomena from around the galaxy (although I profess I have not yet seen him
- venture further from his birthplace on Earth than the comfortable distance of the Sol Cis-Oort Satellite Sphere).
-
- By employing a patented semi-phased alloy with unique and fascinating bluespace interaction properties, Ward's contraption is able to 'harvest' energy, store
- it and redirect it later at will (with appropriate electronic mechanisms, of course). Although he professes to see or desire no commercial or material gain
- for the application and use of said energy once it is harvested, there are no doubt myriad ways we can come to benefit from such things beyond mere research,
- such as the reconstruction of torn cartiligenous tissue that a peculiar radiation from an amphibious species on Brachis IV was found to emit.
- Contents
-
-
-
- "}
-
-/obj/item/weapon/book/manual/stasis
- name = "Cellular suspension, the new Cryogenics?"
- icon_state = "stasis"
- author = "Elvin Schmidt"
- title = "Cellular suspension, the new Cryogenics?"
- dat = {"
-
-
-
-
-
-
-
- - Forward: A replacement for cryosleep?
- - The breakthrough
- - Applying this new principle
-
-
-
- The development of rudimentary cryofreezing in the 20th and 21st centuries was hailed as a crank science by some, but many early visionaries recognised the
- potential it had to change the way we approach so many fields, such as medicine, therapeutics and space travel. It was breakthroughs in the field in the 22nd and
- later centures that turned the procedure from science fiction to science fact, however. Since then, cryogenics has become a hallmark of modern science, and
- regarded as one of the great achievements of our era. As with all sciences however, they have their time and are superseded by newer technological miracles when
- it is over.
- Contents
-
-
- It was in examining the effects of decellerated, blue-space high energy particles when transphased through bluespace that the effects where primarily noticed.
- Due to exigent properties of that dimension, transphasing those particles capable of existing in bluespace with high stability levels has the effect of bringing
- some of those effects into realspace. Examining the Hoffman emissions in particular, it was discovered that they exhibited a-entropic behaviour, and in what is
- now termed the 'Effete Hoffman Principle,' it was found that metastabilising the Hoffman radiation resulted in the effect being applied across other physical
- interactions, in particular forces and reactions.
- Contents
-
-
- When combined with an appropriate energy-effect replicate for cryogenics (slowing down biological activity, thus stabilising the organics), the effect is
- effectively identical to cryogenics, and while it consumes vastly more power and requires extremely complex equipment, it's (for all intents and purposes) superior
- to cryogenics, all that remains is to 'commercialise' the process by enabling cheaper development and mass production.
- The Effete Hoffman Principle can be tweak-combined with other effects however, for different purposes. A division of PMC Research initially developed the application
- in prisons as a literal 'suspension field' where convincts are held immobile in the air, and the use quickly spread to numerous other areas.
-
- By examining the material resonance properties of certain strong waveforms when combined with Hoffman radiation, an effect was produced able to reverse energy
- transferral through matter, and to slow the effects of gravity. When combined with energy repulse technology, the triple effects compound themselves into a much
- stronger field, although all three componenets do slightly different things. High energy researchers assure me of the following key points:
-
- - The energy repulsion factor provides a 'shell' capable of weak suspension.
- - The Hoffman emissions nullify energy transferral and other kinetic activity, maintaining stability inside the field.
- - The resonant waveform combines the effects of the above two points, and applies it magnified onto it's synched 'resonance' materials.
-
- As an interesting aside, a carbon waveform was chosen for the field in prison suspension fields, due to it's resonance with organic matter.
- Contents
-
-
-
- "}
diff --git a/code/modules/research/xenoarchaeology/master_controller.dm b/code/modules/research/xenoarchaeology/master_controller.dm
deleted file mode 100644
index f64f8c32362..00000000000
--- a/code/modules/research/xenoarchaeology/master_controller.dm
+++ /dev/null
@@ -1,145 +0,0 @@
-
-/datum/controller/game_controller
- var/list/all_animal_genesequences = list()
- var/list/all_plant_genesequences = list()
- var/list/genome_prefixes = null
- var/list/artifact_spawning_turfs = list()
- var/list/digsite_spawning_turfs = list()
-
- var/list/spawn_types_animal = list("/mob/living/carbon/slime",\
- "/mob/living/simple_animal/hostile/alien",\
- "/mob/living/simple_animal/hostile/alien/drone",\
- "/mob/living/simple_animal/hostile/alien/sentinel",\
- "/mob/living/simple_animal/hostile/poison/giant_spider",\
- "/mob/living/simple_animal/hostile/poison/giant_spider/hunter",\
- "/mob/living/simple_animal/hostile/poison/giant_spider/nurse",\
- "/mob/living/simple_animal/hostile/creature",\
- "/mob/living/simple_animal/hostile/samak",\
- "/mob/living/simple_animal/hostile/diyaab",\
- "/mob/living/simple_animal/hostile/shantak",\
- "/mob/living/simple_animal/tindalos",\
- "/mob/living/simple_animal/yithian")
-
- var/list/spawn_types_plant = list("/obj/item/seeds/walkingmushroommycelium",\
- "/obj/item/seeds/killertomatoseed",\
- "/obj/item/seeds/comfreyseed",
- "/obj/item/seeds/aloeseed",
- "/obj/item/seeds/thaadra",\
- "/obj/item/seeds/telriis",\
- "/obj/item/seeds/jurlmah",\
- "/obj/item/seeds/amauri",\
- "/obj/item/seeds/gelthi",\
- "/obj/item/seeds/vale",\
- "/obj/item/seeds/surik")
-
-#define XENOARCH_SPAWN_CHANCE 0.5
-#define DIGSITESIZE_LOWER 4
-#define DIGSITESIZE_UPPER 12
-#define ARTIFACTSPAWNNUM_LOWER 6
-#define ARTIFACTSPAWNNUM_UPPER 12
-
-datum/controller/game_controller/proc/SetupXenoarch()
- //create digsites
- for(var/turf/simulated/mineral/M in block(locate(1,1,1), locate(world.maxx, world.maxy, world.maxz)))
- if(isnull(M.geologic_data))
- M.geologic_data = new/datum/geosample(M)
-
- if(!prob(XENOARCH_SPAWN_CHANCE))
- continue
-
- digsite_spawning_turfs.Add(M)
- var/digsite = get_random_digsite_type()
- var/target_digsite_size = rand(DIGSITESIZE_LOWER, DIGSITESIZE_UPPER)
- var/list/processed_turfs = list()
- var/list/turfs_to_process = list(M)
- while(turfs_to_process.len)
- var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process)
-
- if(target_digsite_size > 1)
- var/list/viable_adjacent_turfs = orange(1, archeo_turf)
- for(var/turf/simulated/mineral/T in orange(1, archeo_turf))
- if(T.finds)
- continue
- if(T in processed_turfs)
- continue
- viable_adjacent_turfs.Add(T)
-
- for(var/turf/simulated/mineral/T in viable_adjacent_turfs)
- if(prob(target_digsite_size/viable_adjacent_turfs.len))
- turfs_to_process.Add(T)
- target_digsite_size -= 1
- if(target_digsite_size <= 0)
- break
-
- processed_turfs.Add(archeo_turf)
- if(isnull(archeo_turf.finds))
- archeo_turf.finds = list()
- if(prob(50))
- archeo_turf.finds.Add(new /datum/find(digsite, rand(5,95)))
- else if(prob(75))
- archeo_turf.finds.Add(new /datum/find(digsite, rand(5,45)))
- archeo_turf.finds.Add(new /datum/find(digsite, rand(55,95)))
- else
- archeo_turf.finds.Add(new /datum/find(digsite, rand(5,30)))
- archeo_turf.finds.Add(new /datum/find(digsite, rand(35,75)))
- archeo_turf.finds.Add(new /datum/find(digsite, rand(75,95)))
-
- //sometimes a find will be close enough to the surface to show
- var/datum/find/F = archeo_turf.finds[1]
- if(F.excavation_required <= F.view_range)
- archeo_turf.archaeo_overlay = "overlay_archaeo[rand(1,3)]"
- archeo_turf.overlays += archeo_turf.archaeo_overlay
-
- //have a chance for an artifact to spawn here, but not in animal or plant digsites
- if(isnull(M.artifact_find) && digsite != 1 && digsite != 2)
- artifact_spawning_turfs.Add(archeo_turf)
-
- //create artifact machinery
- var/num_artifacts_spawn = rand(ARTIFACTSPAWNNUM_LOWER, ARTIFACTSPAWNNUM_UPPER)
- while(artifact_spawning_turfs.len > num_artifacts_spawn)
- pick_n_take(artifact_spawning_turfs)
-
- var/list/artifacts_spawnturf_temp = artifact_spawning_turfs.Copy()
- while(artifacts_spawnturf_temp.len > 0)
- var/turf/simulated/mineral/artifact_turf = pop(artifacts_spawnturf_temp)
- artifact_turf.artifact_find = new()
-
- //make sure we have some prefixes for the gene sequences
- if(!genome_prefixes)
- genome_prefixes = alphabet_uppercase.Copy()
- if(!genome_prefixes.len)
- qdel(genome_prefixes)
- genome_prefixes = alphabet_uppercase.Copy()
-
- //create animal gene sequences
- while(spawn_types_animal.len && genome_prefixes.len)
- var/datum/genesequence/new_sequence = new/datum/genesequence()
- new_sequence.spawned_type_text = pick(spawn_types_animal)
- new_sequence.spawned_type = text2path(new_sequence.spawned_type_text)
- spawn_types_animal -= new_sequence.spawned_type_text
-
- var/prefixletter = pick(genome_prefixes)
- genome_prefixes -= prefixletter
- while(new_sequence.full_genome_sequence.len < 7)
- new_sequence.full_genome_sequence.Add("[prefixletter][pick(alphabet_uppercase)][pick(alphabet_uppercase)][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)]")
-
- all_animal_genesequences.Add(new_sequence)
-
- //create plant gene sequences
- while(spawn_types_plant.len && genome_prefixes.len)
- var/datum/genesequence/new_sequence = new/datum/genesequence()
- new_sequence.spawned_type = pick(spawn_types_plant)
- spawn_types_plant -= new_sequence.spawned_type_text
-
- var/prefixletter = pick(genome_prefixes)
- genome_prefixes -= prefixletter
- while(new_sequence.full_genome_sequence.len < 7)
- new_sequence.full_genome_sequence.Add("[prefixletter][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)][pick(alphabet_uppercase)][pick(alphabet_uppercase)]")
-
- all_plant_genesequences.Add(new_sequence)
-
-#undef XENOARCH_SPAWN_CHANCE
-#undef DIGSITESIZE_LOWER
-#undef DIGSITESIZE_UPPER
-#undef ARTIFACTSPAWNNUM_LOWER
-#undef ARTIFACTSPAWNNUM_UPPER
diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm
deleted file mode 100644
index 06f466ec72a..00000000000
--- a/code/modules/research/xenoarchaeology/misc.dm
+++ /dev/null
@@ -1,109 +0,0 @@
-//---- Noticeboard
-
-/obj/structure/noticeboard/anomaly
- notices = 5
- icon_state = "nboard05"
-
-/obj/structure/noticeboard/anomaly/New()
- var/obj/item/weapon/stamp/rd/stamp = new
- //add some memos
- var/obj/item/weapon/paper/P = new()
- P.name = "Memo RE: proper analysis procedure"
- P.info = "
We keep test dummies in pens here for a reason, so standard procedure should be to activate newfound alien artifacts and place the two in close proximity. Promising items I might even approve monkey testing on."
- P.stamp(stamp)
- src.contents += P
-
- P = new()
- P.name = "Memo RE: materials gathering"
- P.info = "Corasang,
the hands-on approach to gathering our samples may very well be slow at times, but it's safer than allowing the blundering miners to roll willy-nilly over our dig sites in their mechs, destroying everything in the process. And don't forget the escavation tools on your way out there!
- R.W"
- P.stamp(stamp)
- src.contents += P
-
- P = new()
- P.name = "Memo RE: ethical quandaries"
- P.info = "Darion-
I don't care what his rank is, our business is that of science and knowledge - questions of moral application do not come into this. Sure, so there are those who would employ the energy-wave particles my modified device has managed to abscond for their own personal gain, but I can hardly see the practical benefits of some of these artifacts our benefactors left behind. Ward--"
- P.stamp(stamp)
- src.contents += P
-
- P = new()
- P.name = "READ ME! Before you people destroy any more samples"
- P.info = "how many times do i have to tell you people, these xeno-arch samples are del-i-cate, and should be handled so! careful application of a focussed, concentrated heat or some corrosive liquids should clear away the extraneous carbon matter, while application of an energy beam will most decidedly destroy it entirely - like someone did to the chemical dispenser! W, the one who signs your paychecks"
- P.stamp(stamp)
- src.contents += P
-
- P = new()
- P.name = "Reminder regarding the anomalous material suits"
- P.info = "Do you people think the anomaly suits are cheap to come by? I'm about a hair trigger away from instituting a log book for the damn things. Only wear them if you're going out for a dig, and for god's sake don't go tramping around in them unless you're field testing something, R"
- P.stamp(stamp)
- src.contents += P
-
- qdel(stamp)
-
-//---- Bookcase
-
-/obj/structure/bookcase/manuals/xenoarchaeology
- name = "Xenoarchaeology Manuals bookcase"
-
- New()
- ..()
- new /obj/item/weapon/book/manual/excavation(src)
- new /obj/item/weapon/book/manual/mass_spectrometry(src)
- new /obj/item/weapon/book/manual/materials_chemistry_analysis(src)
- new /obj/item/weapon/book/manual/anomaly_testing(src)
- new /obj/item/weapon/book/manual/anomaly_spectroscopy(src)
- new /obj/item/weapon/book/manual/stasis(src)
- update_icon()
-
-//---- Lockers and closets
-
-/obj/structure/closet/secure_closet/xenoarchaeologist
- name = "xenoarchaeologist locker"
- req_access = list(access_tox_storage)
- icon_state = "secureres1"
- icon_closed = "secureres"
- icon_locked = "secureres1"
- icon_opened = "secureresopen"
- icon_broken = "secureresbroken"
- icon_off = "secureresoff"
-
- New()
- ..()
- sleep(2)
- new /obj/item/clothing/under/rank/scientist(src)
- new /obj/item/clothing/suit/storage/labcoat(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/glasses/science(src)
- new /obj/item/device/radio/headset/headset_sci(src)
- new /obj/item/weapon/storage/belt/archaeology(src)
- new /obj/item/weapon/storage/box/excavation(src)
- return
-
-/obj/structure/closet/excavation
- name = "excavation tools closet"
- icon_state = "toolcloset"
- icon_closed = "toolcloset"
- icon_opened = "toolclosetopen"
-
- New()
- ..()
- sleep(2)
- new /obj/item/weapon/storage/belt/archaeology(src)
- new /obj/item/weapon/storage/box/excavation(src)
- new /obj/item/device/flashlight/lantern(src)
- new /obj/item/device/depth_scanner(src)
- new /obj/item/device/core_sampler(src)
- new /obj/item/device/gps(src)
- new /obj/item/device/beacon_locator(src)
- new /obj/item/device/radio/beacon(src)
- new /obj/item/clothing/glasses/meson(src)
- new /obj/item/weapon/pickaxe(src)
- new /obj/item/device/measuring_tape(src)
- new /obj/item/weapon/pickaxe/hand(src)
- new /obj/item/weapon/storage/bag/fossils(src)
- return
-
-//---- Isolation room air alarms
-
-/obj/machinery/alarm/isolation
- name = "Isolation room air control"
- req_access = list(access_research)
diff --git a/code/modules/research/xenoarchaeology/readme.dm b/code/modules/research/xenoarchaeology/readme.dm
deleted file mode 100644
index 2eecadc690a..00000000000
--- a/code/modules/research/xenoarchaeology/readme.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-
-//coming soon
-//there'll probably be some stuff on the wiki at some point
-
-//original code from alfie275 / lunacode, artifacts are from isaidno
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
deleted file mode 100644
index 23ba3eb39a8..00000000000
--- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
+++ /dev/null
@@ -1,215 +0,0 @@
-
-/obj/item/weapon/anobattery
- name = "Anomaly power battery"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "anobattery0"
- var/datum/artifact_effect/battery_effect
- var/capacity = 300
- var/stored_charge = 0
- var/effect_id = ""
-
-/obj/item/weapon/anobattery/New()
- battery_effect = new()
-
-/obj/item/weapon/anobattery/proc/UpdateSprite()
- var/p = (stored_charge/capacity)*100
- p = min(p, 100)
- icon_state = "anobattery[round(p,25)]"
-
-/obj/item/weapon/anobattery/proc/use_power(var/amount)
- stored_charge = max(0, stored_charge - amount)
-
-/obj/item/weapon/anodevice
- name = "Anomaly power utilizer"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "anodev"
- var/activated = 0
- var/duration = 0
- var/interval = 0
- var/time_end = 0
- var/last_activation = 0
- var/last_process = 0
- var/obj/item/weapon/anobattery/inserted_battery
- var/turf/archived_loc
- var/energy_consumed_on_touch = 100
-
-/obj/item/weapon/anodevice/New()
- ..()
- processing_objects.Add(src)
-
-/obj/item/weapon/anodevice/attackby(var/obj/I as obj, var/mob/user as mob, params)
- if(istype(I, /obj/item/weapon/anobattery))
- if(!inserted_battery)
- to_chat(user, "You insert the battery.")
- user.drop_item()
- I.loc = src
- inserted_battery = I
- UpdateSprite()
- else
- return ..()
-
-/obj/item/weapon/anodevice/attack_self(var/mob/user as mob)
- return src.interact(user)
-
-/obj/item/weapon/anodevice/interact(var/mob/user)
- var/dat = "Anomalous Materials Energy Utiliser
"
- if(inserted_battery)
- if(activated)
- dat += "Device active.
"
-
- dat += "[inserted_battery] inserted, anomaly ID: [inserted_battery.battery_effect.artifact_id ? inserted_battery.battery_effect.artifact_id : "NA"]
"
- dat += "Charge: [inserted_battery.stored_charge] / [inserted_battery.capacity]
"
- dat += "Time left activated: [round(max((time_end - last_process) / 10, 0))]
"
- if(activated)
- dat += "Shutdown
"
- else
- dat += "Start
"
- dat += "
"
-
- dat += "Activate duration (sec): -- - [duration/10] + ++
"
- dat += "Activate interval (sec): -- - [interval/10] + ++
"
- dat += "
"
- dat += "Eject battery
"
- else
- dat += "Please insert battery
"
-
- dat += "
"
- dat += "Refresh Close"
-
- user << browse(dat, "window=anodevice;size=400x500")
- onclose(user, "anodevice")
-
-/obj/item/weapon/anodevice/process()
- if(activated)
- if(inserted_battery && inserted_battery.battery_effect && (inserted_battery.stored_charge > 0) )
- //make sure the effect is active
- if(!inserted_battery.battery_effect.activated)
- inserted_battery.battery_effect.ToggleActivate(1)
-
- //update the effect loc
- var/turf/T = get_turf(src)
- if(T != archived_loc)
- archived_loc = T
- inserted_battery.battery_effect.UpdateMove()
-
- //if someone is holding the device, do the effect on them
- var/mob/holder
- if(ismob(src.loc))
- holder = src.loc
-
- //handle charge
- if(world.time - last_activation > interval)
- if(inserted_battery.battery_effect.effect == EFFECT_TOUCH)
- if(interval > 0)
- //apply the touch effect to the holder
- if(holder)
- to_chat(holder, "the [bicon(src)] [src] held by [holder] shudders in your grasp.")
- else
- src.loc.visible_message("the [bicon(src)] [src] shudders.")
- inserted_battery.battery_effect.DoEffectTouch(holder)
-
- //consume power
- inserted_battery.use_power(energy_consumed_on_touch)
- else
- //consume power equal to time passed
- inserted_battery.use_power(world.time - last_process)
-
- else if(inserted_battery.battery_effect.effect == EFFECT_PULSE)
- inserted_battery.battery_effect.chargelevel = inserted_battery.battery_effect.chargelevelmax
-
- //consume power relative to the time the artifact takes to charge and the effect range
- inserted_battery.use_power(inserted_battery.battery_effect.effectrange * inserted_battery.battery_effect.effectrange * inserted_battery.battery_effect.chargelevelmax)
-
- else
- //consume power equal to time passed
- inserted_battery.use_power(world.time - last_process)
-
- last_activation = world.time
-
- //process the effect
- inserted_battery.battery_effect.process()
-
- //work out if we need to shutdown
- if(inserted_battery.stored_charge <= 0)
- src.loc.visible_message("[bicon(src)] [src] buzzes.", "[bicon(src)] You hear something buzz.")
- shutdown_emission()
- else if(world.time > time_end)
- src.loc.visible_message("[bicon(src)] [src] chimes.", "[bicon(src)] You hear something chime.")
- shutdown_emission()
- else
- src.visible_message("[bicon(src)] [src] buzzes.", "[bicon(src)] You hear something buzz.")
- shutdown_emission()
- last_process = world.time
-
-/obj/item/weapon/anodevice/proc/shutdown_emission()
- if(activated)
- activated = 0
- if(inserted_battery.battery_effect.activated)
- inserted_battery.battery_effect.ToggleActivate(1)
-
-/obj/item/weapon/anodevice/Topic(href, href_list)
-
- if(href_list["changetime"])
- var/timedif = text2num(href_list["changetime"])
- if(href_list["duration"])
- duration += timedif
- //max 30 sec duration
- duration = min(max(duration, 0), 300)
- if(activated)
- time_end += timedif
- else if(href_list["interval"])
- interval += timedif
- //max 10 sec interval
- interval = min(max(interval, 0), 100)
- if(href_list["startup"])
- if(inserted_battery && inserted_battery.battery_effect && (inserted_battery.stored_charge > 0) )
- activated = 1
- src.visible_message("[bicon(src)] [src] whirrs.", "[bicon(src)] You hear something whirr.")
- if(!inserted_battery.battery_effect.activated)
- inserted_battery.battery_effect.ToggleActivate(1)
- time_end = world.time + duration
- if(href_list["shutdown"])
- activated = 0
- if(href_list["ejectbattery"])
- shutdown_emission()
- inserted_battery.loc = get_turf(src)
- inserted_battery = null
- UpdateSprite()
- if(href_list["close"])
- usr << browse(null, "window=anodevice")
- else if(ismob(src.loc))
- var/mob/M = src.loc
- src.interact(M)
- ..()
-
-/obj/item/weapon/anodevice/proc/UpdateSprite()
- if(!inserted_battery)
- icon_state = "anodev"
- return
- var/p = (inserted_battery.stored_charge/inserted_battery.capacity)*100
- p = min(p, 100)
- icon_state = "anodev[round(p,25)]"
-
-/obj/item/weapon/anodevice/Destroy()
- processing_objects.Remove(src)
- return ..()
-
-/obj/item/weapon/anodevice/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
- if(!istype(M))
- return
-
- if(activated && inserted_battery.battery_effect.effect == EFFECT_TOUCH && !isnull(inserted_battery))
- inserted_battery.battery_effect.DoEffectTouch(M)
- inserted_battery.use_power(energy_consumed_on_touch)
- user.visible_message("[user] taps [M] with [src], and it shudders on contact.")
- else
- user.visible_message("[user] taps [M] with [src], but nothing happens.")
-
- //admin logging
- user.lastattacked = M
- M.lastattacker = user
-
- if(inserted_battery.battery_effect)
- user.create_attack_log(" Tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])")
- M.create_attack_log(" Tapped by [key_name(user)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])")
- msg_admin_attack("[key_name_admin(user)] tapped [key_name_admin(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" )
diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
deleted file mode 100644
index c3e29fe8638..00000000000
--- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
+++ /dev/null
@@ -1,38 +0,0 @@
-
-//changes: rad protection up to 100 from 20/50 respectively
-/obj/item/clothing/suit/bio_suit/anomaly
- name = "Anomaly suit"
- desc = "A sealed bio suit capable of insulating against exotic alien energies"
- icon_state = "engspace_suit"
- item_state = "engspace_suit"
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
- species_fit = null
- sprite_sheets = null
-
-/obj/item/clothing/head/bio_hood/anomaly
- name = "Anomaly hood"
- desc = "A sealed bio hood capable of insulating against exotic alien energies."
- icon_state = "engspace_helmet"
- item_state = "engspace_helmet"
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
-
-/obj/item/clothing/suit/space/eva/anomaly
- name = "Excavation suit"
- desc = "A pressure resistant excavation suit partially capable of insulating against exotic alien energies."
- icon_state = "cespace_suit"
- item_state = "cespace_suit"
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
- species_fit = null
- sprite_sheets = null
- sprite_sheets_obj = null
-
-/obj/item/clothing/head/helmet/space/eva/anomaly
- name = "Excavation hood"
- desc = "A pressure resistant excavation hood partially capable of insulating against exotic alien energies."
- icon_state = "cespace_helmet"
- item_state = "cespace_helmet"
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
- species_fit = null
- sprite_sheets = null
- sprite_sheets_obj = null
diff --git a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
deleted file mode 100644
index a75378b0a26..00000000000
--- a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-
-/obj/machinery/bunsen_burner
- name = "bunsen burner"
- desc = "A flat, self-heating device designed for bringing chemical mixtures to boil."
- icon = 'icons/obj/device.dmi'
- icon_state = "bunsen0"
- var/heating = 0 //whether the bunsen is turned on
- var/heated = 0 //whether the bunsen has been on long enough to let stuff react
- var/obj/item/weapon/reagent_containers/held_container
- var/heat_time = 50
-
-/obj/machinery/bunsen_burner/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/reagent_containers))
- if(held_container)
- to_chat(user, "You must remove the [held_container] first.")
- else
- user.drop_item(src)
- held_container = W
- held_container.loc = src
- to_chat(user, "You put the [held_container] onto the [src].")
- var/image/I = image("icon"=W, "layer"=FLOAT_LAYER)
- underlays += I
- if(heating)
- spawn(heat_time)
- try_heating()
- else
- to_chat(user, "You can't put the [W] onto the [src].")
-
-/obj/machinery/bunsen_burner/attack_hand(mob/user as mob)
- if(held_container)
- underlays = null
- to_chat(user, "You remove the [held_container] from the [src].")
- held_container.loc = src.loc
- held_container.attack_hand(user)
- held_container = null
- else
- to_chat(user, "There is nothing on the [src].")
-
-/obj/machinery/bunsen_burner/proc/try_heating()
- src.visible_message("[bicon(src)] [src] hisses.")
- if(held_container && heating)
- heated = 1
- held_container.reagents.handle_reactions()
- heated = 0
- spawn(heat_time)
- try_heating()
-
-/obj/machinery/bunsen_burner/verb/toggle()
- set src in view(1)
- set name = "Toggle bunsen burner"
- set category = "IC"
-
- heating = !heating
- icon_state = "bunsen[heating]"
- if(heating)
- spawn(heat_time)
- try_heating()
diff --git a/code/modules/research/xenoarchaeology/tools/gearbelt.dm b/code/modules/research/xenoarchaeology/tools/gearbelt.dm
deleted file mode 100644
index 8912e9248c8..00000000000
--- a/code/modules/research/xenoarchaeology/tools/gearbelt.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-
-/obj/item/weapon/storage/belt/archaeology
- name = "excavation gear-belt"
- desc = "Can hold various excavation gear."
- icon_state = "gearbelt"
- item_state = "utility"
- can_hold = list(
- /obj/item/weapon/storage/box/samplebags,
- /obj/item/device/core_sampler,
- /obj/item/device/beacon_locator,
- /obj/item/device/radio/beacon,
- /obj/item/device/gps,
- /obj/item/device/measuring_tape,
- /obj/item/device/flashlight,
- /obj/item/weapon/pickaxe,
- /obj/item/device/depth_scanner,
- /obj/item/device/camera,
- /obj/item/weapon/paper,
- /obj/item/weapon/photo,
- /obj/item/weapon/folder,
- /obj/item/weapon/pen,
- /obj/item/weapon/folder,
- /obj/item/weapon/clipboard,
- /obj/item/weapon/anodevice,
- /obj/item/clothing/glasses,
- /obj/item/weapon/wrench,
- /obj/item/weapon/storage/box/excavation,
- /obj/item/weapon/anobattery)
diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
deleted file mode 100644
index 775a4e25c98..00000000000
--- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
+++ /dev/null
@@ -1,350 +0,0 @@
-/obj/machinery/suspension_gen
- name = "suspension field generator"
- desc = "It has stubby legs bolted up against it's body for stabilising."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "suspension2"
- density = 1
- req_access = list(access_research)
- var/obj/item/weapon/stock_parts/cell/cell
- var/obj/item/weapon/card/id/auth_card
- var/locked = 1
- var/open = 0
- var/screwed = 1
- var/field_type = ""
- var/power_use = 25
- var/obj/effect/suspension_field/suspension_field
- var/list/secured_mobs = list()
-
-/obj/machinery/suspension_gen/New()
- src.cell = new/obj/item/weapon/stock_parts/cell/high(src)
- ..()
-
-/obj/machinery/suspension_gen/process()
- //set background = 1
-
- if(suspension_field)
- cell.charge -= power_use
-
- var/turf/T = get_turf(suspension_field)
- if(field_type == "carbon")
- for(var/mob/living/carbon/M in T)
- M.Weaken(3)
- cell.charge -= power_use
- if(prob(5))
- to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]")
-
- if(field_type == "iron")
- for(var/mob/living/silicon/M in T)
- M.Weaken(3)
- cell.charge -= power_use
- if(prob(5))
- to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]")
-
- for(var/obj/item/I in T)
- if(!suspension_field.contents.len)
- suspension_field.icon_state = "energynet"
- suspension_field.overlays += "shield2"
- I.loc = suspension_field
-
- for(var/mob/living/simple_animal/M in T)
- M.Weaken(3)
- cell.charge -= power_use
- if(prob(5))
- to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]")
-
- if(cell.charge <= 0)
- deactivate()
-
-/obj/machinery/suspension_gen/interact(mob/user as mob)
- var/dat = "Multi-phase mobile suspension field generator MK II \"Steadfast\"
"
- if(cell)
- var/colour = "red"
- if(cell.charge / cell.maxcharge > 0.66)
- colour = "green"
- else if(cell.charge / cell.maxcharge > 0.33)
- colour = "orange"
- dat += "Energy cell: [100 * cell.charge / cell.maxcharge]%
"
- else
- dat += "Energy cell: None
"
- if(auth_card)
- dat += "\[[auth_card]\]
"
- if(!locked)
- dat += "[suspension_field ? "Disable" : "Enable"] field
"
- else
- dat += "
"
- else
- dat += "\[------\]
"
- if(!locked)
- dat += "[suspension_field ? "Disable" : "Enable"] field
"
- else
- dat += "Enter your ID to begin.
"
-
- dat += "
"
- if(!locked)
- dat += "Select field mode
"
- dat += "[field_type=="carbon"?"":"" ]Diffracted carbon dioxide laser
"
- dat += "[field_type=="nitrogen"?"":"" ]Nitrogen tracer field
"
- dat += "[field_type=="potassium"?"":"" ]Potassium refrigerant cloud
"
- dat += "[field_type=="mercury"?"":"" ]Mercury dispersion wave
"
- dat += "[field_type=="iron"?"":"" ]Iron wafer conduction field
"
- dat += "[field_type=="calcium"?"":"" ]Calcium binary deoxidiser
"
- dat += "[field_type=="plasma"?"":"" ]Chlorine diffusion emissions
"
- dat += "[field_type=="plasma"?"":"" ]Plasma saturated field
"
- else
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "Always wear safety gear and consult a field manual before operation.
"
- if(!locked)
- dat += "Lock console
"
- else
- dat += "
"
- dat += "Refresh console
"
- dat += "Close console"
- user << browse(dat, "window=suspension;size=500x400")
- onclose(user, "suspension")
-
-/obj/machinery/suspension_gen/Topic(href, href_list)
- ..()
- usr.set_machine(src)
-
- if(href_list["toggle_field"])
- if(!suspension_field)
- if(cell.charge > 0)
- if(anchored)
- activate()
- else
- to_chat(usr, "You are unable to activate [src] until it is properly secured on the ground.")
- else
- deactivate()
- if(href_list["select_field"])
- field_type = href_list["select_field"]
- else if(href_list["insertcard"])
- if(istype(usr, /mob/living/silicon))
- locked = 0
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card))
- usr.drop_item()
- I.loc = src
- auth_card = I
- if(attempt_unlock(I))
- to_chat(usr, "You insert [I], the console flashes \'Access granted.\'")
- else
- to_chat(usr, "You insert [I], the console flashes \'Access denied.\'")
- else if(href_list["ejectcard"])
- if(auth_card)
- if(ishuman(usr))
- auth_card.loc = usr.loc
- if(!usr.get_active_hand())
- usr.put_in_hands(auth_card)
- auth_card = null
- else
- auth_card.loc = loc
- auth_card = null
- else if(href_list["lock"])
- locked = 1
- else if(href_list["close"])
- usr.unset_machine()
- usr << browse(null, "window=suspension")
-
- updateUsrDialog()
-
-/obj/machinery/suspension_gen/attack_hand(mob/user as mob)
- if(!open)
- interact(user)
- else if(cell)
- cell.loc = loc
- cell.add_fingerprint(user)
- cell.updateicon()
-
- icon_state = "suspension0"
- cell = null
- to_chat(user, "You remove the power cell")
-
-/obj/machinery/suspension_gen/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/screwdriver))
- if(!open)
- if(screwed)
- screwed = 0
- else
- screwed = 1
- to_chat(user, "You [screwed ? "screw" : "unscrew"] the battery panel.")
- else if(istype(W, /obj/item/weapon/crowbar))
- if(!locked)
- if(!screwed)
- if(!suspension_field)
- if(open)
- open = 0
- else
- open = 1
- to_chat(user, "You crowbar the battery panel [open ? "open" : "in place"].")
- icon_state = "suspension[open ? (cell ? "1" : "0") : "2"]"
- else
- to_chat(user, "[src]'s safety locks are engaged, shut it down first.")
- else
- to_chat(user, "Unscrew [src]'s battery panel first.")
- else
- to_chat(user, "[src]'s security locks are engaged.")
- else if(istype(W, /obj/item/weapon/wrench))
- if(!suspension_field)
- if(anchored)
- anchored = 0
- else
- anchored = 1
- to_chat(user, "You wrench the stabilising legs [anchored ? "into place" : "up against the body"].")
- if(anchored)
- desc = "It is resting securely on four stubby legs."
- else
- desc = "It has stubby legs bolted up against it's body for stabilising."
- else
- to_chat(user, "You are unable to secure [src] while it is active!")
- else if(istype(W, /obj/item/weapon/stock_parts/cell))
- if(open)
- if(cell)
- to_chat(user, "There is a power cell already installed.")
- else
- user.drop_item()
- W.loc = src
- cell = W
- to_chat(user, "You insert the power cell.")
- icon_state = "suspension1"
- else if(istype(W, /obj/item/weapon/card))
- var/obj/item/weapon/card/I = W
- if(!auth_card)
- if(attempt_unlock(I))
- to_chat(user, "You swipe [I], the console flashes \'Access granted.\'")
- else
- to_chat(user, "You swipe [I], console flashes \'Access denied.\'")
- else
- to_chat(user, "Remove [auth_card] first.")
-
-/obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C)
- if(!open)
- if(istype(C, /obj/item/weapon/card/emag) && cell.charge > 0)
- //put sparks here
- if(prob(95))
- locked = 0
- else if(istype(C, /obj/item/weapon/card/id) && check_access(C))
- locked = 0
-
- if(!locked)
- return 1
-
-//checks for whether the machine can be activated or not should already have occurred by this point
-/obj/machinery/suspension_gen/proc/activate()
- //depending on the field type, we might pickup certain items
- var/turf/T = get_turf(get_step(src,dir))
- var/success = 0
- var/collected = 0
- switch(field_type)
- if("carbon")
- success = 1
- for(var/mob/living/carbon/C in T)
- C.AdjustWeakened(5)
- C.visible_message("[bicon(C)] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
- if("nitrogen")
- success = 1
- //
- if("mercury")
- success = 1
- //
- if("chlorine")
- success = 1
- //
- if("potassium")
- success = 1
- //
- if("plasma")
- success = 1
- //
- if("calcium")
- success = 1
- //
- if("iron")
- success = 1
- for(var/mob/living/silicon/R in T)
- R.AdjustWeakened(5)
- R.visible_message("[bicon(R)] [R] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
- //
- //in case we have a bad field type
- if(!success)
- return
-
- for(var/mob/living/simple_animal/C in T)
- C.visible_message("[bicon(C)] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
- C.AdjustWeakened(5)
-
- suspension_field = new(T)
- suspension_field.field_type = field_type
- src.visible_message("[bicon(src)] [src] activates with a low hum.")
- icon_state = "suspension3"
-
- for(var/obj/item/I in T)
- I.loc = suspension_field
- collected++
-
- if(collected)
- suspension_field.icon_state = "energynet"
- suspension_field.overlays += "shield2"
- src.visible_message("[bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].")
- else
- if(istype(T,/turf/simulated/mineral) || istype(T,/turf/simulated/wall))
- suspension_field.icon_state = "shieldsparkles"
- else
- suspension_field.icon_state = "shield2"
-
-/obj/machinery/suspension_gen/proc/deactivate()
- //drop anything we picked up
- var/turf/T = get_turf(suspension_field)
-
- for(var/mob/M in T)
- to_chat(M, "You no longer feel like floating.")
- M.SetWeakened(min(M.weakened, 3))
-
- src.visible_message("[bicon(src)] [src] deactivates with a gentle shudder.")
- qdel(suspension_field)
- icon_state = "suspension2"
-
-/obj/machinery/suspension_gen/Destroy()
- //safety checks: clear the field and drop anything it's holding
- deactivate()
- return ..()
-
-/obj/machinery/suspension_gen/verb/rotate_ccw()
- set src in view(1)
- set name = "Rotate suspension gen (counter-clockwise)"
- set category = "Object"
-
- if(anchored)
- to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor.")
- else
- dir = turn(dir, 90)
-
-/obj/machinery/suspension_gen/verb/rotate_cw()
- set src in view(1)
- set name = "Rotate suspension gen (clockwise)"
- set category = "Object"
-
- if(anchored)
- to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor.")
- else
- dir = turn(dir, -90)
-
-/obj/effect/suspension_field
- name = "energy field"
- icon = 'icons/effects/effects.dmi'
- anchored = 1
- density = 1
- var/field_type = "chlorine"
-
-/obj/effect/suspension_field/Destroy()
- for(var/obj/I in src)
- I.loc = src.loc
- return ..()
diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm
deleted file mode 100644
index b17569da383..00000000000
--- a/code/modules/research/xenoarchaeology/tools/tools.dm
+++ /dev/null
@@ -1,24 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Miscellaneous xenoarchaeology tools
-
-/obj/item/device/measuring_tape
- name = "measuring tape"
- desc = "A coiled metallic tape used to check dimensions and lengths."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "measuring"
- w_class = WEIGHT_CLASS_SMALL
-
-//todo: dig site tape
-
-/obj/item/weapon/storage/bag/fossils
- name = "Fossil Satchel"
- desc = "Transports delicate fossils in suspension so they don't break during transit."
- icon = 'icons/obj/mining.dmi'
- icon_state = "satchel"
- slot_flags = SLOT_BELT | SLOT_POCKET
- w_class = WEIGHT_CLASS_NORMAL
- storage_slots = 50
- max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
- max_w_class = WEIGHT_CLASS_NORMAL
- can_hold = list(/obj/item/weapon/fossil)
diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
deleted file mode 100644
index 4edf8f69d9a..00000000000
--- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-/obj/item/device/ano_scanner
- name = "Alden-Saraspova counter"
- desc = "Aids in triangulation of exotic particles."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "flashgun"
- item_state = "lampgreen"
- w_class = WEIGHT_CLASS_TINY
- slot_flags = SLOT_BELT
- var/nearest_artifact_id = "unknown"
- var/nearest_artifact_distance = -1
- var/last_scan_time = 0
- var/scan_delay = 25
-
-/obj/item/device/ano_scanner/initialize()
- scan()
-
-/obj/item/device/ano_scanner/attack_self(var/mob/user as mob)
- return src.interact(user)
-
-/obj/item/device/ano_scanner/interact(var/mob/user as mob)
- var/message = "Background radiation levels detected."
- if(world.time - last_scan_time >= scan_delay)
- scan()
- if(nearest_artifact_distance >= 0)
- message = "Exotic energy detected on wavelength '[nearest_artifact_id]' in a radius of [nearest_artifact_distance]m"
- else
- message = "Scanning array is recharging."
-
- to_chat(user, "[message]")
-
-/obj/item/device/ano_scanner/proc/scan()
- last_scan_time = world.time
- nearest_artifact_distance = -1
-
- var/turf/cur_turf = get_turf(src)
-
- if(master_controller) //Sanity check due to runtimes ~Z
- for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs)
- if(T.artifact_find)
- if(T.z == cur_turf.z)
- var/cur_dist = get_dist(cur_turf, T) * 2
-
- if((nearest_artifact_distance < 0 || cur_dist < nearest_artifact_distance) && cur_dist <= T.artifact_find.artifact_detect_range)
- nearest_artifact_distance = cur_dist + rand() * 2 - 1
- nearest_artifact_id = T.artifact_find.artifact_id
- else
- master_controller.artifact_spawning_turfs.Remove(T)
-
- cur_turf.visible_message("[src] clicks.")
diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
deleted file mode 100644
index 8c4ec23004c..00000000000
--- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
+++ /dev/null
@@ -1,94 +0,0 @@
-//device to take core samples from mineral turfs - used for various types of analysis
-
-/obj/item/weapon/storage/box/samplebags
- name = "sample bag box"
- desc = "A box claiming to contain sample bags."
- New()
- for(var/i=0, i<7, i++)
- var/obj/item/weapon/evidencebag/S = new(src)
- S.name = "sample bag"
- S.desc = "a bag for holding research samples."
- ..()
- return
-
-//////////////////////////////////////////////////////////////////
-
-/obj/item/device/core_sampler
- name = "core sampler"
- desc = "Used to extract geological core samples."
- icon = 'icons/obj/device.dmi'
- icon_state = "sampler0"
- item_state = "screwdriver_brown"
- w_class = WEIGHT_CLASS_TINY
- //slot_flags = SLOT_BELT
- var/sampled_turf = ""
- var/num_stored_bags = 10
- var/obj/item/weapon/evidencebag/filled_bag
-
-/obj/item/device/core_sampler/examine(mob/user)
- if(..(user, 2))
- to_chat(user, "Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining.")
-
-/obj/item/device/core_sampler/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/evidencebag))
- if(num_stored_bags < 10)
- qdel(W)
- num_stored_bags += 1
- to_chat(user, "You insert the [W] into the core sampler.")
- else
- to_chat(user, "The core sampler can not fit any more bags!")
- else
- return ..()
-
-/obj/item/device/core_sampler/proc/sample_item(var/item_to_sample, var/mob/user as mob)
- var/datum/geosample/geo_data
- if(istype(item_to_sample, /turf/simulated/mineral))
- var/turf/simulated/mineral/T = item_to_sample
- T.geologic_data.UpdateNearbyArtifactInfo(T)
- geo_data = T.geologic_data
- else if(istype(item_to_sample, /obj/item/weapon/ore))
- var/obj/item/weapon/ore/O = item_to_sample
- geo_data = O.geologic_data
-
- if(geo_data)
- if(filled_bag)
- to_chat(user, "The core sampler is full!")
- else if(num_stored_bags < 1)
- to_chat(user, "The core sampler is out of sample bags!")
- else
- //create a new sample bag which we'll fill with rock samples
- filled_bag = new /obj/item/weapon/evidencebag(src)
- filled_bag.name = "sample bag"
- filled_bag.desc = "a bag for holding research samples."
-
- icon_state = "sampler1"
- num_stored_bags--
-
- //put in a rock sliver
- var/obj/item/weapon/rocksliver/R = new()
- R.geological_data = geo_data
- R.loc = filled_bag
-
- //update the sample bag
- filled_bag.icon_state = "evidence"
- var/image/I = image("icon"=R, "layer"=FLOAT_LAYER)
- filled_bag.underlays += I
- filled_bag.w_class = WEIGHT_CLASS_TINY
-
- to_chat(user, "You take a core sample of the [item_to_sample].")
- else
- to_chat(user, "You are unable to take a sample of [item_to_sample].")
-
-/obj/item/device/core_sampler/attack_self()
- if(filled_bag)
- to_chat(usr, "You eject the full sample bag.")
- var/success = 0
- if(istype(src.loc, /mob))
- var/mob/M = src.loc
- success = M.put_in_inactive_hand(filled_bag)
- if(!success)
- filled_bag.loc = get_turf(src)
- filled_bag = null
- icon_state = "sampler0"
- else
- to_chat(usr, "The core sampler is empty.")
diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
deleted file mode 100644
index ad195a0a141..00000000000
--- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
+++ /dev/null
@@ -1,130 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Depth scanner - scans rock turfs / boulders and tells players if there is anything interesting inside, logs all finds + coordinates + times
-
-//also known as the x-ray diffractor
-/obj/item/device/depth_scanner
- name = "depth analysis scanner"
- desc = "Used to check spatial depth and density of rock outcroppings."
- icon = 'icons/obj/pda.dmi'
- icon_state = "crap"
- item_state = "analyzer"
- w_class = WEIGHT_CLASS_TINY
- slot_flags = SLOT_BELT
- var/list/positive_locations = list()
- var/datum/depth_scan/current
-
-/datum/depth_scan
- var/time = ""
- var/coords = ""
- var/depth = 0
- var/clearance = 0
- var/record_index = 1
- var/dissonance_spread = 1
- var/material = "unknown"
-
-/obj/item/device/depth_scanner/proc/scan_atom(var/mob/user, var/atom/A)
- user.visible_message("[user] scans [A], the air around them humming gently.")
- if(istype(A,/turf/simulated/mineral))
- var/turf/simulated/mineral/M = A
- if((M.finds && M.finds.len) || M.artifact_find)
-
- //create a new scanlog entry
- var/datum/depth_scan/D = new()
- D.coords = "[M.x].[rand(0,9)]:[M.y].[rand(0,9)]:[10 * M.z].[rand(0,9)]"
- D.time = worldtime2text()
- D.record_index = positive_locations.len + 1
- D.material = M.mineralName ? M.mineralName : "Rock"
-
- //find the first artifact and store it
- if(M.finds.len)
- var/datum/find/F = M.finds[1]
- D.depth = F.excavation_required * 2 //0-100% and 0-200cm
- D.clearance = F.clearance_range * 2
- D.material = get_responsive_reagent(F.find_type)
-
- positive_locations.Add(D)
-
- for(var/mob/L in range(src, 1))
- to_chat(L, "[bicon(src)] [src] pings.")
-
- else if(istype(A,/obj/structure/boulder))
- var/obj/structure/boulder/B = A
- if(B.artifact_find)
- //create a new scanlog entry
- var/datum/depth_scan/D = new()
- D.coords = "[10 * B.x].[rand(0,9)]:[10 * B.y].[rand(0,9)]:[10 * B.z].[rand(0,9)]"
- D.time = worldtime2text()
- D.record_index = positive_locations.len + 1
-
- //these values are arbitrary
- D.depth = rand(75,100)
- D.clearance = rand(5,25)
- D.dissonance_spread = rand(750,2500) / 100
-
- positive_locations.Add(D)
-
- for(var/mob/L in range(src, 1))
- to_chat(L, "[bicon(src)] [src] pings [pick("madly","wildly","excitedly","crazily")]!.")
-
-/obj/item/device/depth_scanner/attack_self(var/mob/user as mob)
- return src.interact(user)
-
-/obj/item/device/depth_scanner/interact(var/mob/user as mob)
- var/dat = "Co-ordinates with positive matches
"
- dat += "== Clear all ==
"
- if(current)
- dat += "Time: [current.time]
"
- dat += "Coords: [current.coords]
"
- dat += "Anomaly depth: [current.depth] cm
"
- dat += "Clearance above anomaly depth: [current.clearance] cm
"
- dat += "Dissonance spread: [current.dissonance_spread]
"
- var/index = responsive_carriers.Find(current.material)
- if(index > 0 && index <= finds_as_strings.len)
- dat += "Anomaly material: [finds_as_strings[index]]
"
- else
- dat += "Anomaly material: Unknown
"
- dat += "clear entry
"
- else
- dat += "Select an entry from the list
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- dat += "
"
- if(positive_locations.len)
- for(var/index=1, index<=positive_locations.len, index++)
- var/datum/depth_scan/D = positive_locations[index]
- dat += "[D.time], coords: [D.coords]
"
- else
- dat += "No entries recorded."
- dat += "
"
- dat += "Refresh
"
- dat += "Close
"
- user << browse(dat,"window=depth_scanner;size=300x500")
- onclose(user, "depth_scanner")
-
-/obj/item/device/depth_scanner/Topic(href, href_list)
- ..()
- usr.set_machine(src)
-
- if(href_list["select"])
- var/index = text2num(href_list["select"])
- if(index && index <= positive_locations.len)
- current = positive_locations[index]
- else if(href_list["clear"])
- var/index = text2num(href_list["clear"])
- if(index)
- if(index <= positive_locations.len)
- var/datum/depth_scan/D = positive_locations[index]
- positive_locations.Remove(D)
- qdel(D)
- else
- //GC will hopefully pick them up before too long
- positive_locations = list()
- qdel(current)
- else if(href_list["close"])
- usr.unset_machine()
- usr << browse(null, "window=depth_scanner")
-
- updateSelfDialog()
diff --git a/code/modules/research/xenoarchaeology/tools/tools_locater.dm b/code/modules/research/xenoarchaeology/tools/tools_locater.dm
deleted file mode 100644
index ee985f232eb..00000000000
--- a/code/modules/research/xenoarchaeology/tools/tools_locater.dm
+++ /dev/null
@@ -1,97 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// GPS Locater - locks into a radio frequency and tracks it
-
-/obj/item/device/beacon_locator
- name = "locater device"
- desc = "Used to scan and locate signals on a particular frequency according ."
- icon = 'icons/obj/device.dmi'
- icon_state = "pinoff" //pinonfar, pinonmedium, pinonclose, pinondirect, pinonnull
- item_state = "electronic"
- var/frequency = 1459
- var/scan_ticks = 0
- var/obj/item/device/radio/target_radio
-
-/obj/item/device/beacon_locator/New()
- ..()
- processing_objects.Add(src)
-
-/obj/item/device/beacon_locator/Destroy()
- processing_objects.Remove(src)
- return ..()
-
-/obj/item/device/beacon_locator/process()
- if(target_radio)
- dir = get_dir(src,target_radio)
- switch(get_dist(src,target_radio))
- if(0 to 3)
- icon_state = "pinondirect"
- if(4 to 10)
- icon_state = "pinonclose"
- if(11 to 30)
- icon_state = "pinonmedium"
- if(31 to INFINITY)
- icon_state = "pinonfar"
- else
- if(scan_ticks)
- icon_state = "pinonnull"
- scan_ticks++
- if(prob(scan_ticks * 10))
- spawn(0)
- //set background = 1
- if(processing_objects.Find(src))
- //scan radios in the world to try and find one
- var/cur_dist = 999
- for(var/obj/item/device/radio/beacon/R in world)
- if(R.z == src.z && R.frequency == src.frequency)
- var/check_dist = get_dist(src,R)
- if(check_dist < cur_dist)
- cur_dist = check_dist
- target_radio = R
-
- scan_ticks = 0
- var/turf/T = get_turf(src)
- if(target_radio)
- T.visible_message("[bicon(src)] [src] [pick("chirps","chirrups","cheeps")] happily.")
- else
- T.visible_message("[bicon(src)] [src] [pick("chirps","chirrups","cheeps")] sadly.")
- else
- icon_state = "pinoff"
-
-/obj/item/device/beacon_locator/attack_self(var/mob/user as mob)
- return src.interact(user)
-
-/obj/item/device/beacon_locator/interact(var/mob/user as mob)
- var/dat = "Radio frequency tracker
"
- dat += {"
- Reset tracker
- Frequency:
- -
- -
- [format_frequency(frequency)]
- +
- +
- "}
-
- dat += "Close
"
- user << browse(dat,"window=locater;size=300x150")
- onclose(user, "locater")
-
-/obj/item/device/beacon_locator/Topic(href, href_list)
- ..()
- usr.set_machine(src)
-
- if(href_list["reset_tracking"])
- scan_ticks = 1
- target_radio = null
- else if(href_list["freq"])
- var/new_frequency = (frequency + text2num(href_list["freq"]))
- if(frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ)
- new_frequency = sanitize_frequency(new_frequency, 1499)
- frequency = new_frequency
-
- else if(href_list["close"])
- usr.unset_machine()
- usr << browse(null, "window=locater")
-
- updateSelfDialog()
diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
deleted file mode 100644
index ec00023ab29..00000000000
--- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
+++ /dev/null
@@ -1,148 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Excavation pickaxes - sorted in order of delicacy. Players will have to choose the right one for each part of excavation.
-
-/obj/item/weapon/pickaxe/brush
- name = "brush"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick_brush"
- item_state = "syringe_0"
- digspeed = 20
- desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)."
- excavation_amount = 0.5
- digsound = list('sound/weapons/thudswoosh.ogg')
- drill_verb = "brushing"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weapon/pickaxe/one_pick
- name = "1/6 pick"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick1"
- item_state = "syringe_0"
- digspeed = 20
- desc = "A miniature excavation tool for precise digging (2 centimetre excavation depth)."
- excavation_amount = 1
- digsound = list('sound/items/Screwdriver.ogg')
- drill_verb = "delicately picking"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weapon/pickaxe/two_pick
- name = "1/3 pick"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick2"
- item_state = "syringe_0"
- digspeed = 20
- desc = "A miniature excavation tool for precise digging (4 centimetre excavation depth)."
- excavation_amount = 2
- digsound = list('sound/items/Screwdriver.ogg')
- drill_verb = "delicately picking"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weapon/pickaxe/three_pick
- name = "1/2 pick"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick3"
- item_state = "syringe_0"
- digspeed = 20
- desc = "A miniature excavation tool for precise digging (6 centimetre excavation depth)."
- excavation_amount = 3
- digsound = list('sound/items/Screwdriver.ogg')
- drill_verb = "delicately picking"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weapon/pickaxe/four_pick
- name = "2/3 pick"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick4"
- item_state = "syringe_0"
- digspeed = 20
- desc = "A miniature excavation tool for precise digging (8 centimetre excavation depth)."
- excavation_amount = 4
- digsound = list('sound/items/Screwdriver.ogg')
- drill_verb = "delicately picking"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weapon/pickaxe/five_pick
- name = "5/6 pick"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick5"
- item_state = "syringe_0"
- digspeed = 20
- desc = "A miniature excavation tool for precise digging (10 centimetre excavation depth)."
- excavation_amount = 5
- digsound = list('sound/items/Screwdriver.ogg')
- drill_verb = "delicately picking"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weapon/pickaxe/six_pick
- name = "1/1 pick"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick6"
- item_state = "syringe_0"
- digspeed = 20
- desc = "A miniature excavation tool for precise digging (12 centimetre excavation depth)."
- excavation_amount = 6
- digsound = list('sound/items/Screwdriver.ogg')
- drill_verb = "delicately picking"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weapon/pickaxe/hand
- name = "hand pickaxe"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick_hand"
- item_state = "syringe_0"
- digspeed = 30
- desc = "A smaller, more precise version of the pickaxe (30 centimetre excavation depth)."
- excavation_amount = 15
- digsound = list('sound/items/Crowbar.ogg')
- drill_verb = "clearing"
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/weapon/pickaxe/robotic
- name = "robotic pickaxe"
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "pick_robotic"
- item_state = "syringe_0"
- digspeed = 30
- desc = "An adjustable pickaxe designed to be resized internally as a robotic module.."
- excavation_amount = 15
- var/possible_excavation_amounts = list(1, 2, 4, 6, 8, 10, 12, 30)
-
- attack_self(var/mob/user as mob)
- var/N = input("Excavation amount (in centimeters):", "[src]") as null|anything in possible_excavation_amounts
-
- if(N)
- excavation_amount = N / 2
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Pack for holding pickaxes
-
-/obj/item/weapon/storage/box/excavation
- name = "excavation pick set"
- icon = 'icons/obj/storage.dmi'
- icon_state = "excavation"
- desc = "A set of picks for excavation."
- item_state = "syringe_kit"
- foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
- storage_slots = 7
- w_class = WEIGHT_CLASS_SMALL
- can_hold = list(/obj/item/weapon/pickaxe/brush,\
- /obj/item/weapon/pickaxe/one_pick,\
- /obj/item/weapon/pickaxe/two_pick,\
- /obj/item/weapon/pickaxe/three_pick,\
- /obj/item/weapon/pickaxe/four_pick,\
- /obj/item/weapon/pickaxe/five_pick,\
- /obj/item/weapon/pickaxe/six_pick)
- max_combined_w_class = 17
- max_w_class = WEIGHT_CLASS_BULKY
- use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
-
-/obj/item/weapon/storage/box/excavation/New()
- ..()
- new /obj/item/weapon/pickaxe/brush(src)
- new /obj/item/weapon/pickaxe/one_pick(src)
- new /obj/item/weapon/pickaxe/two_pick(src)
- new /obj/item/weapon/pickaxe/three_pick(src)
- new /obj/item/weapon/pickaxe/four_pick(src)
- new /obj/item/weapon/pickaxe/five_pick(src)
- new /obj/item/weapon/pickaxe/six_pick(src)
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index f0325b5f175..e7c2663bb4b 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index cfcfec6e283..4445b3c3bb0 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/cryogenics.dmi b/icons/obj/cryogenics.dmi
index 28d58130749..74ecc17ffb0 100644
Binary files a/icons/obj/cryogenics.dmi and b/icons/obj/cryogenics.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 0a142ca7874..65ebfa597a1 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 81c5c39ddf8..ec038f3477b 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index d6cb7a676c4..1fabc78bdd0 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 7b90d5b058d..cb42505cef8 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 5dc147bc25e..219ead6f3b5 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/virology.dmi b/icons/obj/virology.dmi
deleted file mode 100644
index b3b05584d86..00000000000
Binary files a/icons/obj/virology.dmi and /dev/null differ
diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi
deleted file mode 100644
index 62d21044ace..00000000000
Binary files a/icons/obj/xenoarchaeology.dmi and /dev/null differ
diff --git a/paradise.dme b/paradise.dme
index b6cf55c2778..bf8e39a5220 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -2032,60 +2032,6 @@
#include "code\modules\research\designs\stock_parts_designs.dm"
#include "code\modules\research\designs\telecomms_designs.dm"
#include "code\modules\research\designs\weapon_designs.dm"
-#include "code\modules\research\xenoarchaeology\areas.dm"
-#include "code\modules\research\xenoarchaeology\chemistry.dm"
-#include "code\modules\research\xenoarchaeology\geosample.dm"
-#include "code\modules\research\xenoarchaeology\manuals.dm"
-#include "code\modules\research\xenoarchaeology\master_controller.dm"
-#include "code\modules\research\xenoarchaeology\misc.dm"
-#include "code\modules\research\xenoarchaeology\readme.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_autocloner.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_crystal.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_gigadrill.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_hoverpod.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_replicator.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_unknown.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effect.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_affect_cold.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_badfeeling.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_cellcharge.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_celldrain.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_dnaswitch.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_emp.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_goodfeeling.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heal.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heat.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_hurt.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_radiate.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_roboheal.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_robohurt.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_sleepy.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_stun.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_defines.dm"
-#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_special.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm"
-#include "code\modules\research\xenoarchaeology\genetics\prehistoric_animals.dm"
-#include "code\modules\research\xenoarchaeology\genetics\reconstitutor.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"
-#include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm"
#include "code\modules\research\xenobiology\xenobio_camera.dm"
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\ruins\ruin_areas.dm"