diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm
new file mode 100644
index 0000000000..b6af0d0681
--- /dev/null
+++ b/code/__defines/xenoarcheaology.dm
@@ -0,0 +1,72 @@
+#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
+
+#define DIGSITE_GARDEN 1
+#define DIGSITE_ANIMAL 2
+#define DIGSITE_HOUSE 3
+#define DIGSITE_TECHNICAL 4
+#define DIGSITE_TEMPLE 5
+#define DIGSITE_WAR 6
+
+#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_PHORON 9
+#define TRIGGER_OXY 10
+#define TRIGGER_CO2 11
+#define TRIGGER_NITRO 12
+#define MAX_TRIGGER 12
+
+#define EFFECT_UNKNOWN 0
+#define EFFECT_ENERGY 1
+#define EFFECT_PSIONIC 2
+#define EFFECT_ELECTRO 3
+#define EFFECT_PARTICLE 4
+#define EFFECT_ORGANIC 5
+#define EFFECT_BLUESPACE 6
+#define EFFECT_SYNTH 7
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 08c7c56f4f..f7de0b46f6 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -271,7 +271,8 @@
/obj/item/weapon/anodevice,
/obj/item/clothing/glasses,
/obj/item/weapon/wrench,
- /obj/item/weapon/storage/box/excavation,
+ /obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
- /obj/item/device/ano_scanner
+ /obj/item/device/ano_scanner,
+ /obj/item/weapon/pickaxe/hand
)
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index 270d21cfeb..10994ea57b 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -168,7 +168,7 @@
helm_type = /obj/item/clothing/head/helmet/space/rig/ert
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/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/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/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)
req_access = list()
req_one_access = list()
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index ce3ec04a25..ea69670885 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -57,7 +57,7 @@
var/drill_verb = "drilling"
sharp = 1
- var/excavation_amount = 100
+ var/excavation_amount = 200
/obj/item/weapon/pickaxe/hammer
name = "sledgehammer"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 6d460dd850..1c6208061d 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -121,6 +121,12 @@ var/list/mining_overlay_cache = list()
if(!mining_overlay_cache["rock_side_[place_dir]"])
mining_overlay_cache["rock_side_[place_dir]"] = image('icons/turf/walls.dmi', "rock_side", dir = place_dir)
T.overlays += mining_overlay_cache["rock_side_[place_dir]"]
+
+ if(archaeo_overlay)
+ overlays += archaeo_overlay
+
+ if(excav_overlay)
+ overlays += excav_overlay
else
name = "sand"
@@ -320,13 +326,12 @@ var/list/mining_overlay_cache = list()
if (istype(W, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = W
user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].")
- if(do_after(user,25))
- user << "\icon[P] [src] has been excavated to a depth of [2*excavation_level]cm."
+ if(do_after(user, 15))
+ user << "\The [src] has been excavated to a depth of [excavation_level]cm."
return
if (istype(W, /obj/item/weapon/pickaxe))
- var/turf/T = user.loc
- if (!( istype(T, /turf) ))
+ if(!istype(user.loc, /turf))
return
var/obj/item/weapon/pickaxe/P = W
@@ -335,44 +340,37 @@ var/list/mining_overlay_cache = list()
last_act = world.time
playsound(user, P.drill_sound, 20, 1)
+ var/newDepth = excavation_level + P.excavation_amount // Used commonly below
//handle any archaeological finds we might uncover
- var/fail_message
+ var/fail_message = ""
if(finds && finds.len)
var/datum/find/F = finds[1]
- if(excavation_level + P.excavation_amount > F.excavation_required)
- //Chance to destroy / extract any finds here
+ if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]"
- user << "You start [P.drill_verb][fail_message ? fail_message : ""]."
+ user << "You start [P.drill_verb][fail_message]."
if(fail_message && prob(90))
if(prob(25))
- excavate_find(5, finds[1])
+ excavate_find(prob(5), finds[1])
else if(prob(50))
finds.Remove(finds[1])
if(prob(50))
artifact_debris()
if(do_after(user,P.digspeed))
- user << "You finish [P.drill_verb] \the [src]."
if(finds && finds.len)
var/datum/find/F = finds[1]
- if(round(excavation_level + P.excavation_amount) == F.excavation_required)
- //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them
- if(excavation_level + P.excavation_amount > F.excavation_required)
- //if you can get slightly over, perfect extraction
- excavate_find(100, F)
- else
- excavate_find(80, F)
+ if(newDepth == F.excavation_required) // When the pick hits that edge just right, you extract your find perfectly, it's never confined in a rock
+ excavate_find(1, F)
+ else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80%
+ excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F)
- else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range)
- //just pull the surrounding rock out
- excavate_find(0, F)
+ user << "You finish [P.drill_verb] \the [src]."
- if( excavation_level + P.excavation_amount >= 100 )
- //if players have been excavating this turf, leave some rocky debris behind
+ if(newDepth >= 200) // This means the rock is mined out fully
var/obj/structure/boulder/B
if(artifact_find)
if( excavation_level > 0 || prob(15) )
@@ -382,7 +380,7 @@ var/list/mining_overlay_cache = list()
B.artifact_find = artifact_find
else
artifact_debris(1)
- else if(prob(15))
+ else if(prob(5))
//empty boulder
B = new(src)
@@ -393,36 +391,44 @@ var/list/mining_overlay_cache = list()
return
excavation_level += P.excavation_amount
+ var/updateIcon = 0
//archaeo overlays
if(!archaeo_overlay && finds && finds.len)
var/datum/find/F = finds[1]
if(F.excavation_required <= excavation_level + F.view_range)
archaeo_overlay = "overlay_archaeo[rand(1,3)]"
- overlays += archaeo_overlay
+ updateIcon = 1
+
+ else if(archaeo_overlay && (!finds || !finds.len))
+ archaeo_overlay = null
+ updateIcon = 1
//there's got to be a better way to do this
var/update_excav_overlay = 0
- if(excavation_level >= 75)
- if(excavation_level - P.excavation_amount < 75)
+ if(excavation_level >= 150)
+ if(excavation_level - P.excavation_amount < 150)
+ update_excav_overlay = 1
+ else if(excavation_level >= 100)
+ if(excavation_level - P.excavation_amount < 100)
update_excav_overlay = 1
else if(excavation_level >= 50)
if(excavation_level - P.excavation_amount < 50)
update_excav_overlay = 1
- else if(excavation_level >= 25)
- if(excavation_level - P.excavation_amount < 25)
- update_excav_overlay = 1
//update overlays displaying excavation level
if( !(excav_overlay && excavation_level > 0) || update_excav_overlay )
var/excav_quadrant = round(excavation_level / 25) + 1
excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]"
- overlays += excav_overlay
+ updateIcon = 1
+
+ if(updateIcon)
+ update_icon()
//drop some rocks
- next_rock += P.excavation_amount * 10
- while(next_rock > 100)
- next_rock -= 100
+ next_rock += P.excavation_amount
+ while(next_rock > 50)
+ next_rock -= 50
var/obj/item/weapon/ore/O = new(src)
geologic_data.UpdateNearbyArtifactInfo(src)
O.geologic_data = geologic_data
@@ -481,11 +487,11 @@ var/list/mining_overlay_cache = list()
make_floor()
update_icon(1)
-/turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F)
+/turf/simulated/mineral/proc/excavate_find(var/is_clean = 0, var/datum/find/F)
//with skill and luck, players can cleanly extract finds
//otherwise, they come out inside a chunk of rock
var/obj/item/weapon/X
- if(prob_clean)
+ if(is_clean)
X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type)
else
X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type)
@@ -503,7 +509,7 @@ var/list/mining_overlay_cache = list()
//many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted
if(prob(F.prob_delicate))
var/obj/effect/suspension_field/S = locate() in src
- if(!S || S.field_type != get_responsive_reagent(F.find_type))
+ if(!S)
if(X)
visible_message("\The [pick("[display_name] crumbles away into dust","[display_name] breaks apart")].")
qdel(X)
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 19cdf2a18b..1f78c7ce77 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -1,5 +1,5 @@
/obj/item/weapon/ore
- name = "rock"
+ name = "small rock"
icon = 'icons/obj/mining.dmi'
icon_state = "ore2"
w_class = 2
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm
deleted file mode 100644
index 71819efc65..0000000000
--- a/code/modules/research/xenoarchaeology/artifact/artifact.dm
+++ /dev/null
@@ -1,123 +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/machinery/power/supermatter,\
- 5;/obj/structure/constructshell,\
- 5;/obj/machinery/syndicate_beacon,\
- 25;/obj/machinery/power/supermatter/shard,\
- 50;/obj/structure/cult/pylon,\
- 100;/obj/machinery/auto_cloner,\
- 100;/obj/machinery/giga_drill,\
- 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
- var/last_act = 0
-
-/obj/structure/boulder/New()
- icon_state = "boulder[rand(1,4)]"
- excavation_level = rand(5,50)
-
-/obj/structure/boulder/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/device/core_sampler))
- 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("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].")
- if(do_after(user,40))
- user << "\blue \icon[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
-
- if(last_act + P.digspeed > world.time)//prevents message spam
- return
- last_act = world.time
-
- user << "\red You start [P.drill_verb] [src]."
-
-
-
- if(!do_after(user,P.digspeed))
- return
-
- user << "\blue You finish [P.drill_verb] [src]."
- excavation_level += P.excavation_amount
-
- if(excavation_level > 100)
- //failure
- user.visible_message("[src] suddenly crumbles away.",\
- "\red [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.",\
- "\blue [src] has been whittled away under your careful excavation, but there was nothing of interest inside.")
- qdel(src)
-
-/obj/structure/boulder/Bumped(AM)
- . = ..()
- if(istype(AM,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = AM
- var/obj/item/weapon/pickaxe/P = H.get_inactive_hand()
- if(istype(P))
- src.attackby(P, 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/tool/drill))
- M.selected.action(src)
diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm
deleted file mode 100644
index 7556369b11..0000000000
--- a/code/modules/research/xenoarchaeology/chemistry.dm
+++ /dev/null
@@ -1,90 +0,0 @@
-
-//chemistry stuff here so that it can be easily viewed/modified
-
-/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"
- matter = list("glass" = 5)
- w_class = 2.0
- 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)
- if(istype(W, /obj/item/weapon/pen))
- var/new_label = sanitizeSafe(input("What should the new label be?","Label solution tray"), MAX_NAME_LEN)
- if(new_label)
- name = "solution tray ([new_label])"
- user << "\blue 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/tungsten
- name = "beaker 'tungsten'"
- New()
- ..()
- reagents.add_reagent("tungsten",50)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/oxygen
- name = "beaker 'oxygen'"
- New()
- ..()
- reagents.add_reagent("oxygen",50)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/sodium
- name = "beaker 'sodium'"
- New()
- ..()
- reagents.add_reagent("sodium",50)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/lithium
- name = "beaker 'lithium'"
-
- New()
- ..()
- reagents.add_reagent("lithium",50)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/water
- name = "beaker 'water'"
-
- New()
- ..()
- reagents.add_reagent("water",50)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/water
- name = "beaker 'water'"
-
- New()
- ..()
- reagents.add_reagent("water",50)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/fuel
- name = "beaker 'fuel'"
-
- New()
- ..()
- reagents.add_reagent("fuel",50)
- update_icon()
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 4026cc0a03..0000000000
--- 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 "phoron"
-
-//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", \
- "phoron")
-
-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/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm
deleted file mode 100644
index 535a0b4f07..0000000000
--- a/code/modules/research/xenoarchaeology/geosample.dm
+++ /dev/null
@@ -1,129 +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 = 1
- 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
- create_reagents(50)
- reagents.add_reagent("ground_rock",50)
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.mineral)
- if(islist(container.mineral.xarch_ages))
- var/list/ages = container.mineral.xarch_ages
- if(ages["thousand"])
- age_thousand = rand(1,ages["thousand"])
- if(ages["million"])
- age_million = rand(1,ages["million"])
- if(ages["billion"])
- if(ages["billion_lower"])
- age_billion = rand(ages["billion_lower"],ages["billion"])
- else
- age_billion = rand(1,ages["billion"])
- if(container.mineral.xarch_source_mineral)
- source_mineral = container.mineral.xarch_source_mineral
-
- 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
- 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)
- 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 ebab6fac76..0000000000
--- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
+++ /dev/null
@@ -1,249 +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.\"")
- 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 += "\icon[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
- scanned_object = null
-
-/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
- 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)
- return "Super dense phoron clump - Appears to have been shaped or hewn, structure is composed of matter 2000% denser than ordinary carbon matter residue.\
- Potential application as unrefined phoron source."
- if(/obj/machinery/power/supermatter)
- return "Super dense phoron clump - Appears to have been shaped or hewn, structure is composed of matter 2000% denser than ordinary carbon matter residue.\
- Potential application as unrefined phoron 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 phoron."
- 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/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)
- 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)
- 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/readme.dm b/code/modules/research/xenoarchaeology/readme.dm
deleted file mode 100644
index 2eecadc690..0000000000
--- 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/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm
deleted file mode 100644
index bf320f0cd3..0000000000
--- a/code/modules/research/xenoarchaeology/tools/tools.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Miscellaneous xenoarchaeology tools
-
-/obj/item/device/gps
- name = "relay positioning device"
- desc = "Triangulates the approximate co-ordinates using a nearby satellite network."
- icon = 'icons/obj/device.dmi'
- icon_state = "locator"
- item_state = "analyzer"
- w_class = 2
-
-/obj/item/device/gps/attack_self(var/mob/user as mob)
- var/turf/T = get_turf(src)
- user << "\blue \icon[src] [src] flashes [T.x].[rand(0,9)]:[T.y].[rand(0,9)]:[T.z].[rand(0,9)]."
-
-/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 = 2
-
-//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 = 3
- max_storage_space = 100
- max_w_class = 3
- 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 6f79f8d8ba..0000000000
--- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
+++ /dev/null
@@ -1,51 +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 = 2.0
- 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)
- if(world.time - last_scan_time >= scan_delay)
- spawn(0)
- scan()
-
- if(!user) return
-
- if(nearest_artifact_distance >= 0)
- user << "Exotic energy detected on wavelength '[nearest_artifact_id]' in a radius of [nearest_artifact_distance]m"
- else
- user << "Background radiation levels detected."
- else
- user << "Scanning array is recharging."
-
-/obj/item/device/ano_scanner/proc/scan()
- set background = 1
-
- 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 0ed24ad248..0000000000
--- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
+++ /dev/null
@@ -1,95 +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 = 1.0
- //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))
- user << "\blue 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)
- if(istype(W,/obj/item/weapon/evidencebag))
- if(num_stored_bags < 10)
- qdel(W)
- num_stored_bags += 1
- user << "\blue You insert the [W] into the core sampler."
- else
- user << "\red 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)
- user << "\red The core sampler is full!"
- else if(num_stored_bags < 1)
- user << "\red 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.overlays += I
- filled_bag.overlays += "evidence"
- filled_bag.w_class = 1
-
- user << "\blue You take a core sample of the [item_to_sample]."
- else
- user << "\red You are unable to take a sample of [item_to_sample]."
-
-/obj/item/device/core_sampler/attack_self()
- if(filled_bag)
- usr << "\blue 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
- usr << "\red 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 e242838a1e..0000000000
--- 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 = 2.0
- 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("\blue [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.mineral ? M.mineral.display_name : "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))
- L << "\blue \icon[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))
- L << "\blue \icon[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 fb6adf795a..0000000000
--- 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 = PUB_FREQ
- 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)
- ..()
-
-/obj/item/device/beacon_locator/process()
- if(target_radio)
- set_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("\icon[src] [src] [pick("chirps","chirrups","cheeps")] happily.")
- else
- T.visible_message("\icon[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 < 1200 || frequency > 1600)
- 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/artifact/artifact_unknown.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm
similarity index 80%
rename from code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
rename to code/modules/xenoarcheaology/artifacts/artifact.dm
index 2f6cc45e75..a8472245a2 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
+++ b/code/modules/xenoarcheaology/artifacts/artifact.dm
@@ -1,366 +1,300 @@
-
-#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_PHORON 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/gasphoron,\
-// /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(typesof(/datum/artifact_effect) - /datum/artifact_effect)
- my_effect = new effecttype(src)
-
- //75% chance to have a secondary stealthy (and mostly bad) effect
- if(prob(75))
- effecttype = pick(typesof(/datum/artifact_effect) - /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_PHORON 9
-#define TRIGGER_OXY 10
-#define TRIGGER_CO2 11
-#define TRIGGER_NITRO 12
-
-/obj/machinery/artifact/process()
-
- var/turf/L = loc
- if(isnull(L) || !istype(L)) // We're inside a container or on null turf, either way stop processing effects
- return
-
- 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_phoron = 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.gas["phoron"] >= 10)
- trigger_phoron = 1
- if(env.gas["oxygen"] >= 10)
- trigger_oxy = 1
- if(env.gas["carbon_dioxide"] >= 10)
- trigger_co2 = 1
- if(env.gas["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)
-
- //PHORON GAS ACTIVATION
- if(trigger_phoron)
- if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !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)
- user << "\red You can't reach [src] from here."
- return
- if(ishuman(user) && user:gloves)
- 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)
- user << "You touch [src]."
- my_effect.ToggleActivate()
- else
- 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)
-
- 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("sacid", 1) || W.reagents.has_reagent("pacid", 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("phoron", 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/flame) && W:lit ||\
- istype(W,/obj/item/weapon/weldingtool) && W:welding)
- 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)
- 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()
+/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()
+ ..()
+
+ var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect)
+ my_effect = new effecttype(src)
+
+ if(prob(75))
+ effecttype = pick(typesof(/datum/artifact_effect) - /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 = pick(TRIGGER_ENERGY, TRIGGER_HEAT, TRIGGER_COLD, TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO)
+ else if(icon_num == 11)
+ name = "sealed alien pod"
+ desc = "A strange alien device."
+ if(prob(25))
+ my_effect.trigger = pick(TRIGGER_WATER, TRIGGER_ACID, TRIGGER_VOLATILE, TRIGGER_TOXIN)
+
+/obj/machinery/artifact/process()
+ var/turf/L = loc
+ if(!istype(L)) // We're inside a container or on null turf, either way stop processing effects
+ return
+
+ 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_phoron = 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.gas["phoron"] >= 10)
+ trigger_phoron = 1
+ if(env.gas["oxygen"] >= 10)
+ trigger_oxy = 1
+ if(env.gas["carbon_dioxide"] >= 10)
+ trigger_co2 = 1
+ if(env.gas["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)
+
+ //PHORON GAS ACTIVATION
+ if(trigger_phoron)
+ if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated)
+ my_effect.ToggleActivate()
+ if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated)
+ secondary_effect.ToggleActivate(0)
+ else
+ if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated)
+ my_effect.ToggleActivate()
+ if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !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)
+ user << "\red You can't reach [src] from here."
+ return
+ if(ishuman(user) && user:gloves)
+ 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)
+ user << "You touch [src]."
+ my_effect.ToggleActivate()
+ else
+ 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)
+
+ 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("sacid", 1) || W.reagents.has_reagent("pacid", 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("phoron", 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("amatoxin", 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/flame) && W:lit ||\
+ istype(W,/obj/item/weapon/weldingtool) && W:welding)
+ 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)
+ 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/xenoarcheaology/artifacts/artifact_find.dm b/code/modules/xenoarcheaology/artifacts/artifact_find.dm
new file mode 100644
index 0000000000..7cead98237
--- /dev/null
+++ b/code/modules/xenoarcheaology/artifacts/artifact_find.dm
@@ -0,0 +1,19 @@
+/datum/artifact_find
+ var/artifact_id
+ var/artifact_find_type
+
+/datum/artifact_find/New()
+
+ artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
+
+ artifact_find_type = pick(
+ 5;/obj/machinery/power/supermatter,
+ 5;/obj/structure/constructshell,
+ 5;/obj/machinery/syndicate_beacon,
+ 25;/obj/machinery/power/supermatter/shard,
+ 50;/obj/structure/cult/pylon,
+ 100;/obj/machinery/auto_cloner,
+ 100;/obj/machinery/giga_drill,
+ 100;/obj/machinery/replicator,
+ 150;/obj/structure/crystal,
+1000;/obj/machinery/artifact)
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/xenoarcheaology/artifacts/autocloner.dm
similarity index 64%
rename from code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
rename to code/modules/xenoarcheaology/artifacts/autocloner.dm
index 4daf56e056..89c653516f 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
+++ b/code/modules/xenoarcheaology/artifacts/autocloner.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/auto_cloner
name = "mysterious pod"
desc = "It's full of a viscous liquid, but appears dark and silent."
@@ -22,25 +21,23 @@
//33% chance to spawn nasties
if(prob(33))
- spawn_type = pick(\
- /mob/living/simple_animal/hostile/giant_spider/nurse,\
- /mob/living/simple_animal/hostile/alien,\
- /mob/living/simple_animal/hostile/bear,\
- /mob/living/simple_animal/hostile/creature\
- )
+ spawn_type = pick(
+ /mob/living/simple_animal/hostile/giant_spider/nurse,
+ /mob/living/simple_animal/hostile/alien,
+ /mob/living/simple_animal/hostile/bear,
+ /mob/living/simple_animal/hostile/creature)
else
spawn_type = pick(\
- /mob/living/simple_animal/cat,\
- /mob/living/simple_animal/corgi,\
- /mob/living/simple_animal/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\
- )
+ /mob/living/simple_animal/cat,
+ /mob/living/simple_animal/corgi,
+ /mob/living/simple_animal/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()
@@ -48,17 +45,17 @@
if(!previous_power_state)
previous_power_state = 1
icon_state = "cellold1"
- src.visible_message("\blue \icon[src] [src] suddenly comes to life!")
+ src.visible_message("\icon[src] [src] suddenly comes to life!")
//slowly grow a mob
if(prob(5))
- src.visible_message("\blue \icon[src] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].")
+ src.visible_message("\icon[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("\blue \icon[src] [src] pings!")
+ src.visible_message("\icon[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)
@@ -79,7 +76,7 @@
if(previous_power_state)
previous_power_state = 0
icon_state = "cellold0"
- src.visible_message("\blue \icon[src] [src] suddenly shuts down.")
+ src.visible_message("\icon[src] [src] suddenly shuts down.")
//cloned mob slowly breaks down
time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm b/code/modules/xenoarcheaology/artifacts/crystal.dm
similarity index 74%
rename from code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
rename to code/modules/xenoarcheaology/artifacts/crystal.dm
index 081683b044..1f922c64ba 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
+++ b/code/modules/xenoarcheaology/artifacts/crystal.dm
@@ -1,36 +1,35 @@
-
-/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("\red[src] shatters!")
- if(prob(75))
- new /obj/item/weapon/material/shard/phoron(src.loc)
- if(prob(50))
- new /obj/item/weapon/material/shard/phoron(src.loc)
- if(prob(25))
- new /obj/item/weapon/material/shard/phoron(src.loc)
- if(prob(75))
- new /obj/item/weapon/material/shard(src.loc)
- if(prob(50))
- new /obj/item/weapon/material/shard(src.loc)
- if(prob(25))
- new /obj/item/weapon/material/shard(src.loc)
- ..()
-
-//todo: laser_act
+/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("\red[src] shatters!")
+ if(prob(75))
+ new /obj/item/weapon/material/shard/phoron(src.loc)
+ if(prob(50))
+ new /obj/item/weapon/material/shard/phoron(src.loc)
+ if(prob(25))
+ new /obj/item/weapon/material/shard/phoron(src.loc)
+ if(prob(75))
+ new /obj/item/weapon/material/shard(src.loc)
+ if(prob(50))
+ new /obj/item/weapon/material/shard(src.loc)
+ if(prob(25))
+ new /obj/item/weapon/material/shard(src.loc)
+ ..()
+
+//todo: laser_act
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm
similarity index 73%
rename from code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm
rename to code/modules/xenoarcheaology/artifacts/gigadrill.dm
index c9d14ce237..42c7288d2d 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm
+++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/giga_drill
name = "alien drill"
desc = "A giant, alien drill mounted on long treads."
@@ -14,18 +13,18 @@
if(active)
active = 0
icon_state = "gigadrill"
- user << "\blue You press a button and [src] slowly spins down."
+ user << "You press a button and \the [src] slowly spins down."
else
active = 1
icon_state = "gigadrill_mov"
- user << "\blue You press a button and [src] shudders to life."
+ user << "You press a button and \the [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("\red [src] begins to drill into [M]!")
+ src.visible_message("\The [src] begins to drill into \the [M].")
anchored = 1
spawn(drill_time)
if(get_turf(src) == drilling_turf && active)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm
similarity index 63%
rename from code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
rename to code/modules/xenoarcheaology/artifacts/replicator.dm
index 66b5f7dc7d..a3030b4bf6 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
+++ b/code/modules/xenoarcheaology/artifacts/replicator.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/replicator
name = "alien machine"
desc = "It's some kind of pod with strange wires and gadgets all over it."
@@ -23,51 +22,50 @@
/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/material/knife/butch,\
- /obj/item/weapon/caution,\
- /obj/item/weapon/caution/cone,\
- /obj/item/weapon/crowbar,\
- /obj/item/weapon/clipboard,\
- /obj/item/weapon/cell,\
- /obj/item/weapon/circular_saw,\
- /obj/item/weapon/material/hatchet,\
- /obj/item/weapon/handcuffs,\
- /obj/item/weapon/hemostat,\
- /obj/item/weapon/material/knife,\
- /obj/item/weapon/flame/lighter,\
- /obj/item/weapon/light/bulb,\
- /obj/item/weapon/light/tube,\
- /obj/item/weapon/pickaxe,\
- /obj/item/weapon/shovel,\
- /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/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/material/knife/butch,
+ /obj/item/weapon/caution,
+ /obj/item/weapon/caution/cone,
+ /obj/item/weapon/crowbar,
+ /obj/item/weapon/clipboard,
+ /obj/item/weapon/cell,
+ /obj/item/weapon/circular_saw,
+ /obj/item/weapon/material/hatchet,
+ /obj/item/weapon/handcuffs,
+ /obj/item/weapon/hemostat,
+ /obj/item/weapon/material/knife,
+ /obj/item/weapon/flame/lighter,
+ /obj/item/weapon/light/bulb,
+ /obj/item/weapon/light/tube,
+ /obj/item/weapon/pickaxe,
+ /obj/item/weapon/shovel,
+ /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)
+ var/quantity = rand(5, 15)
for(var/i=0, i max_spawn_time)
- src.visible_message("\blue \icon[src] [src] pings!")
+ src.visible_message("\icon[src] [src] pings!")
var/obj/source_material = pop(stored_materials)
var/spawn_type = pop(spawning_types)
@@ -111,7 +109,7 @@
icon_state = "borgcharger0(old)"
else if(prob(5))
- src.visible_message("\blue \icon[src] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
+ src.visible_message("\icon[src] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
last_process_time = world.time
@@ -130,7 +128,7 @@
user.drop_item()
W.loc = src
stored_materials.Add(W)
- src.visible_message("\blue [user] inserts [W] into [src].")
+ src.visible_message("\The [user] inserts \the [W] into \the [src].")
/obj/machinery/replicator/Topic(href, href_list)
@@ -139,9 +137,9 @@
if(index > 0 && index <= construction.len)
if(stored_materials.len > spawning_types.len)
if(spawning_types.len)
- src.visible_message("\blue \icon[src] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
+ src.visible_message("\icon[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("\blue \icon[src] [src]'s front compartment slides shut.")
+ src.visible_message("\icon[src] [src]'s front compartment slides shut.")
spawning_types.Add(construction[construction[index]])
spawn_progress_time = 0
diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm
new file mode 100644
index 0000000000..4c0bafd707
--- /dev/null
+++ b/code/modules/xenoarcheaology/boulder.dm
@@ -0,0 +1,90 @@
+/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
+ var/last_act = 0
+
+/obj/structure/boulder/New()
+ icon_state = "boulder[rand(1,4)]"
+ excavation_level = rand(5, 50)
+
+/obj/structure/boulder/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I, /obj/item/device/core_sampler))
+ 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 = I
+ C.sample_item(src, user)
+ return
+
+ if(istype(I, /obj/item/device/depth_scanner))
+ var/obj/item/device/depth_scanner/C = I
+ C.scan_atom(user, src)
+ return
+
+ if(istype(I, /obj/item/device/measuring_tape))
+ var/obj/item/device/measuring_tape/P = I
+ user.visible_message("\The [user] extends \the [P] towards \the [src].", "You extend \the [P] towards \the [src].")
+ if(do_after(user, 15))
+ user << "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm."
+ return
+
+ if(istype(I, /obj/item/weapon/pickaxe))
+ var/obj/item/weapon/pickaxe/P = I
+
+ if(last_act + P.digspeed > world.time)//prevents message spam
+ return
+ last_act = world.time
+
+ user << "You start [P.drill_verb] [src]."
+
+ if(!do_after(user, P.digspeed))
+ return
+
+ user << "You finish [P.drill_verb] [src]."
+ excavation_level += P.excavation_amount
+
+ if(excavation_level > 100)
+ //failure
+ user.visible_message("\The [src] suddenly crumbles away.", "\The [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("\The [src] suddenly crumbles away.")
+ else
+ user.visible_message("\The [src] suddenly crumbles away.", "\The [src] has been whittled away under your careful excavation, but there was nothing of interest inside.")
+ qdel(src)
+
+/obj/structure/boulder/Bumped(AM)
+ . = ..()
+ if(istype(AM,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = AM
+ var/obj/item/weapon/pickaxe/P = H.get_inactive_hand()
+ if(istype(P))
+ src.attackby(P, 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/tool/drill))
+ M.selected.action(src)
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/artifact/effect.dm b/code/modules/xenoarcheaology/effect.dm
similarity index 66%
rename from code/modules/research/xenoarchaeology/artifact/effect.dm
rename to code/modules/xenoarcheaology/effect.dm
index 23bb649ac7..eaf51f102b 100644
--- a/code/modules/research/xenoarchaeology/artifact/effect.dm
+++ b/code/modules/xenoarcheaology/effect.dm
@@ -1,7 +1,5 @@
-
-//override procs in children as necessary
/datum/artifact_effect
- var/effecttype = "unknown" //purely used for admin checks ingame, not needed any more
+ var/name = "unknown"
var/effect = EFFECT_TOUCH
var/effectrange = 4
var/trigger = TRIGGER_TOUCH
@@ -12,20 +10,11 @@
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)
+ 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)]"
@@ -82,9 +71,53 @@
chargelevel = 0
DoEffectPulse()
+/datum/artifact_effect/proc/getDescription()
+ . = ""
+ switch(effect_type)
+ if(EFFECT_ENERGY)
+ . += "Concentrated energy emissions"
+ if(EFFECT_PSIONIC)
+ . += "Intermittent psionic wavefront"
+ if(EFFECT_ELECTRO)
+ . += "Electromagnetic energy"
+ if(EFFECT_PARTICLE)
+ . += "High frequency particles"
+ if(EFFECT_ORGANIC)
+ . += "Organically reactive exotic particles"
+ if(EFFECT_BLUESPACE)
+ . += "Interdimensional/bluespace? phasing"
+ if(EFFECT_SYNTH)
+ . += "Atomic synthesis"
+ else
+ . += "Low level energy emissions"
+
+ . += " have been detected "
+
+ switch(effect)
+ if(EFFECT_TOUCH)
+ . += "interspersed throughout substructure and shell."
+ if(EFFECT_AURA)
+ . += "emitting in an ambient energy field."
+ if(EFFECT_PULSE)
+ . += "emitting in periodic bursts."
+ else
+ . += "emitting in an unknown way."
+
+ . += ""
+
+ switch(trigger)
+ if(TRIGGER_TOUCH, TRIGGER_WATER, TRIGGER_ACID, TRIGGER_VOLATILE, TRIGGER_TOXIN)
+ . += " Activation index involves physical interaction with artifact surface."
+ if(TRIGGER_FORCE, TRIGGER_ENERGY, TRIGGER_HEAT, TRIGGER_COLD)
+ . += " Activation index involves energetic interaction with artifact surface."
+ if(TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO)
+ . += " Activation index involves precise local atmospheric conditions."
+ else
+ . += " Unable to determine any data about activation trigger."
+
//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))
+/proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H)
+ if(!istype(H))
return 1
var/protected = 0
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/xenoarcheaology/effects/badfeeling.dm
similarity index 62%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
rename to code/modules/xenoarcheaology/effects/badfeeling.dm
index 0d6bd0eb63..60386531d9 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
+++ b/code/modules/xenoarcheaology/effects/badfeeling.dm
@@ -1,70 +1,69 @@
-
-/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))
- H << "[pick(drastic_messages)]"
- else
- H << "[pick(messages)]"
-
- if(prob(50))
- H.dizziness += 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))
- H << "[pick(messages)]"
- else
- H << "[pick(drastic_messages)]"
-
- if(prob(10))
- H.dizziness += 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))
- H << "[pick(drastic_messages)]"
- else
- H << "[pick(messages)]"
-
- if(prob(50))
- H.dizziness += rand(3,5)
- else if(prob(25))
- H.dizziness += rand(5,15)
- return 1
+/datum/artifact_effect/badfeeling
+ name = "badfeeling"
+ effect_type = EFFECT_PSIONIC
+ 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))
+ H << "[pick(drastic_messages)]"
+ else
+ H << "[pick(messages)]"
+
+ if(prob(50))
+ H.dizziness += 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))
+ H << "[pick(messages)]"
+ else
+ H << "[pick(drastic_messages)]"
+
+ if(prob(10))
+ H.dizziness += 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))
+ H << "[pick(drastic_messages)]"
+ else
+ H << "[pick(messages)]"
+
+ if(prob(50))
+ H.dizziness += rand(3,5)
+ else if(prob(25))
+ H.dizziness += rand(5,15)
+ return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm b/code/modules/xenoarcheaology/effects/cellcharge.dm
similarity index 96%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
rename to code/modules/xenoarcheaology/effects/cellcharge.dm
index b6f165ec24..3a30c0646f 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
+++ b/code/modules/xenoarcheaology/effects/cellcharge.dm
@@ -1,8 +1,7 @@
-
//todo
/datum/artifact_effect/cellcharge
- effecttype = "cellcharge"
- effect_type = 3
+ name = "cell charge"
+ effect_type = EFFECT_ELECTRO
var/last_message
/datum/artifact_effect/cellcharge/DoEffectTouch(var/mob/user)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm b/code/modules/xenoarcheaology/effects/celldrain.dm
similarity index 96%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
rename to code/modules/xenoarcheaology/effects/celldrain.dm
index fe94dbe155..f988fdf20e 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
+++ b/code/modules/xenoarcheaology/effects/celldrain.dm
@@ -1,8 +1,7 @@
-
//todo
/datum/artifact_effect/celldrain
- effecttype = "celldrain"
- effect_type = 3
+ name = "cell drain"
+ effect_type = EFFECT_ELECTRO
var/last_message
/datum/artifact_effect/celldrain/DoEffectTouch(var/mob/user)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm b/code/modules/xenoarcheaology/effects/cold.dm
similarity index 88%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm
rename to code/modules/xenoarcheaology/effects/cold.dm
index f8dad2c4d3..b4f7025afb 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm
+++ b/code/modules/xenoarcheaology/effects/cold.dm
@@ -1,14 +1,13 @@
-
//inverse of /datum/artifact_effect/heat, the two effects split up for neatness' sake
/datum/artifact_effect/cold
- effecttype = "cold"
+ name = "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)
+ effect_type = pick(EFFECT_ORGANIC, EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/cold/DoEffectTouch(var/mob/user)
if(holder)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm b/code/modules/xenoarcheaology/effects/dnaswitch.dm
similarity index 59%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm
rename to code/modules/xenoarcheaology/effects/dnaswitch.dm
index b74ab88a9a..82165f6ad8 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm
+++ b/code/modules/xenoarcheaology/effects/dnaswitch.dm
@@ -1,8 +1,7 @@
-
//todo
/datum/artifact_effect/dnaswitch
- effecttype = "dnaswitch"
- effect_type = 5
+ name = "dnaswitch"
+ effect_type = EFFECT_ORGANIC
var/severity
/datum/artifact_effect/dnaswitch/New()
@@ -15,12 +14,12 @@
/datum/artifact_effect/dnaswitch/DoEffectTouch(var/mob/toucher)
var/weakness = GetAnomalySusceptibility(toucher)
if(ishuman(toucher) && prob(weakness * 100))
- toucher << pick("\green You feel a little different.",\
- "\green You feel very strange.",\
- "\green Your stomach churns.",\
- "\green Your skin feels loose.",\
- "\green You feel a stabbing pain in your head.",\
- "\green You feel a tingling sensation in your chest.",\
+ toucher << pick("\green You feel a little different.",
+ "\green You feel very strange.",
+ "\green Your stomach churns.",
+ "\green Your skin feels loose.",
+ "\green You feel a stabbing pain in your head.",
+ "\green You feel a tingling sensation in your chest.",
"\green Your entire body vibrates.")
if(prob(75))
scramble(1, toucher, weakness * severity)
@@ -35,12 +34,12 @@
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
if(prob(30))
- H << pick("\green You feel a little different.",\
- "\green You feel very strange.",\
- "\green Your stomach churns.",\
- "\green Your skin feels loose.",\
- "\green You feel a stabbing pain in your head.",\
- "\green You feel a tingling sensation in your chest.",\
+ H << pick("\green You feel a little different.",
+ "\green You feel very strange.",
+ "\green Your stomach churns.",
+ "\green Your skin feels loose.",
+ "\green You feel a stabbing pain in your head.",
+ "\green You feel a tingling sensation in your chest.",
"\green Your entire body vibrates.")
if(prob(50))
scramble(1, H, weakness * severity)
@@ -54,12 +53,12 @@
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
if(prob(75))
- H << pick("\green You feel a little different.",\
- "\green You feel very strange.",\
- "\green Your stomach churns.",\
- "\green Your skin feels loose.",\
- "\green You feel a stabbing pain in your head.",\
- "\green You feel a tingling sensation in your chest.",\
+ H << pick("\green You feel a little different.",
+ "\green You feel very strange.",
+ "\green Your stomach churns.",
+ "\green Your skin feels loose.",
+ "\green You feel a stabbing pain in your head.",
+ "\green You feel a tingling sensation in your chest.",
"\green Your entire body vibrates.")
if(prob(25))
if(prob(75))
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm b/code/modules/xenoarcheaology/effects/emp.dm
similarity index 83%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm
rename to code/modules/xenoarcheaology/effects/emp.dm
index 18165cf0d4..d6d402efe4 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm
+++ b/code/modules/xenoarcheaology/effects/emp.dm
@@ -1,7 +1,6 @@
-
/datum/artifact_effect/emp
- effecttype = "emp"
- effect_type = 3
+ name = "emp"
+ effect_type = EFFECT_ELECTRO
/datum/artifact_effect/emp/New()
..()
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm b/code/modules/xenoarcheaology/effects/forcefield.dm
similarity index 94%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm
rename to code/modules/xenoarcheaology/effects/forcefield.dm
index 0139ea935f..6a48620b40 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm
+++ b/code/modules/xenoarcheaology/effects/forcefield.dm
@@ -1,80 +1,79 @@
-
-/datum/artifact_effect/forcefield
- effecttype = "forcefield"
- var/list/created_field = list()
- effect_type = 4
-
-/datum/artifact_effect/forcefield/New()
- ..()
- trigger = TRIGGER_TOUCH
-
-/datum/artifact_effect/forcefield/ToggleActivate()
- ..()
- if(created_field.len)
- for(var/obj/effect/energy_field/F in created_field)
- created_field.Remove(F)
- qdel(F)
- else if(holder)
- var/turf/T = get_turf(holder)
- while(created_field.len < 16)
- var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z))
- created_field.Add(E)
- E.strength = 1
- E.density = 1
- E.anchored = 1
- E.invisibility = 0
- spawn(10)
- UpdateMove()
- return 1
-
-/datum/artifact_effect/forcefield/process()
- ..()
- for(var/obj/effect/energy_field/E in created_field)
- if(E.strength < 1)
- E.Strengthen(0.15)
- else if(E.strength < 5)
- E.Strengthen(0.25)
-
-/datum/artifact_effect/forcefield/UpdateMove()
- if(created_field.len && holder)
- var/turf/T = get_turf(holder)
- while(created_field.len < 16)
- //for now, just instantly respawn the fields when they get destroyed
- var/obj/effect/energy_field/E = new (locate(T.x,T.y,T))
- created_field.Add(E)
- E.anchored = 1
- E.density = 1
- E.invisibility = 0
-
- var/obj/effect/energy_field/E = created_field[1]
- E.loc = locate(T.x + 2,T.y + 2,T.z)
- E = created_field[2]
- E.loc = locate(T.x + 2,T.y + 1,T.z)
- E = created_field[3]
- E.loc = locate(T.x + 2,T.y,T.z)
- E = created_field[4]
- E.loc = locate(T.x + 2,T.y - 1,T.z)
- E = created_field[5]
- E.loc = locate(T.x + 2,T.y - 2,T.z)
- E = created_field[6]
- E.loc = locate(T.x + 1,T.y + 2,T.z)
- E = created_field[7]
- E.loc = locate(T.x + 1,T.y - 2,T.z)
- E = created_field[8]
- E.loc = locate(T.x,T.y + 2,T.z)
- E = created_field[9]
- E.loc = locate(T.x,T.y - 2,T.z)
- E = created_field[10]
- E.loc = locate(T.x - 1,T.y + 2,T.z)
- E = created_field[11]
- E.loc = locate(T.x - 1,T.y - 2,T.z)
- E = created_field[12]
- E.loc = locate(T.x - 2,T.y + 2,T.z)
- E = created_field[13]
- E.loc = locate(T.x - 2,T.y + 1,T.z)
- E = created_field[14]
- E.loc = locate(T.x - 2,T.y,T.z)
- E = created_field[15]
- E.loc = locate(T.x - 2,T.y - 1,T.z)
- E = created_field[16]
- E.loc = locate(T.x - 2,T.y - 2,T.z)
+/datum/artifact_effect/forcefield
+ name = "force field"
+ var/list/created_field = list()
+ effect_type = EFFECT_PARTICLE
+
+/datum/artifact_effect/forcefield/New()
+ ..()
+ trigger = TRIGGER_TOUCH
+
+/datum/artifact_effect/forcefield/ToggleActivate()
+ ..()
+ if(created_field.len)
+ for(var/obj/effect/energy_field/F in created_field)
+ created_field.Remove(F)
+ qdel(F)
+ else if(holder)
+ var/turf/T = get_turf(holder)
+ while(created_field.len < 16)
+ var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z))
+ created_field.Add(E)
+ E.strength = 1
+ E.density = 1
+ E.anchored = 1
+ E.invisibility = 0
+ spawn(10)
+ UpdateMove()
+ return 1
+
+/datum/artifact_effect/forcefield/process()
+ ..()
+ for(var/obj/effect/energy_field/E in created_field)
+ if(E.strength < 1)
+ E.Strengthen(0.15)
+ else if(E.strength < 5)
+ E.Strengthen(0.25)
+
+/datum/artifact_effect/forcefield/UpdateMove()
+ if(created_field.len && holder)
+ var/turf/T = get_turf(holder)
+ while(created_field.len < 16)
+ //for now, just instantly respawn the fields when they get destroyed
+ var/obj/effect/energy_field/E = new (locate(T.x,T.y,T))
+ created_field.Add(E)
+ E.anchored = 1
+ E.density = 1
+ E.invisibility = 0
+
+ var/obj/effect/energy_field/E = created_field[1]
+ E.loc = locate(T.x + 2,T.y + 2,T.z)
+ E = created_field[2]
+ E.loc = locate(T.x + 2,T.y + 1,T.z)
+ E = created_field[3]
+ E.loc = locate(T.x + 2,T.y,T.z)
+ E = created_field[4]
+ E.loc = locate(T.x + 2,T.y - 1,T.z)
+ E = created_field[5]
+ E.loc = locate(T.x + 2,T.y - 2,T.z)
+ E = created_field[6]
+ E.loc = locate(T.x + 1,T.y + 2,T.z)
+ E = created_field[7]
+ E.loc = locate(T.x + 1,T.y - 2,T.z)
+ E = created_field[8]
+ E.loc = locate(T.x,T.y + 2,T.z)
+ E = created_field[9]
+ E.loc = locate(T.x,T.y - 2,T.z)
+ E = created_field[10]
+ E.loc = locate(T.x - 1,T.y + 2,T.z)
+ E = created_field[11]
+ E.loc = locate(T.x - 1,T.y - 2,T.z)
+ E = created_field[12]
+ E.loc = locate(T.x - 2,T.y + 2,T.z)
+ E = created_field[13]
+ E.loc = locate(T.x - 2,T.y + 1,T.z)
+ E = created_field[14]
+ E.loc = locate(T.x - 2,T.y,T.z)
+ E = created_field[15]
+ E.loc = locate(T.x - 2,T.y - 1,T.z)
+ E = created_field[16]
+ E.loc = locate(T.x - 2,T.y - 2,T.z)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm b/code/modules/xenoarcheaology/effects/gasco2.dm
similarity index 72%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm
rename to code/modules/xenoarcheaology/effects/gasco2.dm
index c486959afd..264dca7352 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm
+++ b/code/modules/xenoarcheaology/effects/gasco2.dm
@@ -1,26 +1,19 @@
-
-/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/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("carbon_dioxide", rand(2, 15))
-
-/datum/artifact_effect/gasco2/DoEffectAura()
- if(holder)
- var/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("carbon_dioxide", pick(0, 0, 0.1, rand()))
+/datum/artifact_effect/gasco2
+ name = "CO2 creation"
+
+/datum/artifact_effect/gasco2/New()
+ ..()
+ effect = pick(EFFECT_TOUCH, EFFECT_AURA)
+ effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
+
+/datum/artifact_effect/gasco2/DoEffectTouch(var/mob/user)
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("carbon_dioxide", rand(2, 15))
+
+/datum/artifact_effect/gasco2/DoEffectAura()
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("carbon_dioxide", pick(0, 0, 0.1, rand()))
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm b/code/modules/xenoarcheaology/effects/gasnitro.dm
similarity index 76%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm
rename to code/modules/xenoarcheaology/effects/gasnitro.dm
index 6954ab3c77..42b440fc1c 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm
+++ b/code/modules/xenoarcheaology/effects/gasnitro.dm
@@ -1,23 +1,19 @@
-
-/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/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("nitrogen", rand(2, 15))
-
-/datum/artifact_effect/gasnitro/DoEffectAura()
- if(holder)
- var/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("nitrogen", pick(0, 0, 0.1, rand()))
+/datum/artifact_effect/gasnitro
+ name = "N2 creation"
+
+/datum/artifact_effect/gasnitro/New()
+ ..()
+ effect = pick(EFFECT_TOUCH, EFFECT_AURA)
+ effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
+
+/datum/artifact_effect/gasnitro/DoEffectTouch(var/mob/user)
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("nitrogen", rand(2, 15))
+
+/datum/artifact_effect/gasnitro/DoEffectAura()
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("nitrogen", pick(0, 0, 0.1, rand()))
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm b/code/modules/xenoarcheaology/effects/gasoxy.dm
similarity index 79%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm
rename to code/modules/xenoarcheaology/effects/gasoxy.dm
index ae8d253652..bb159509dc 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm
+++ b/code/modules/xenoarcheaology/effects/gasoxy.dm
@@ -1,23 +1,19 @@
-
-/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/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("oxygen", rand(2, 15))
-
-/datum/artifact_effect/gasoxy/DoEffectAura()
- if(holder)
- var/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("oxygen", pick(0, 0, 0.1, rand()))
+/datum/artifact_effect/gasoxy
+ name = "O2 creation"
+
+/datum/artifact_effect/gasoxy/New()
+ ..()
+ effect = pick(EFFECT_TOUCH, EFFECT_AURA)
+ effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
+
+/datum/artifact_effect/gasoxy/DoEffectTouch(var/mob/user)
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("oxygen", rand(2, 15))
+
+/datum/artifact_effect/gasoxy/DoEffectAura()
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("oxygen", pick(0, 0, 0.1, rand()))
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm b/code/modules/xenoarcheaology/effects/gasphoron.dm
similarity index 71%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm
rename to code/modules/xenoarcheaology/effects/gasphoron.dm
index d470a462b1..b84296fbb8 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm
+++ b/code/modules/xenoarcheaology/effects/gasphoron.dm
@@ -1,20 +1,16 @@
-
/datum/artifact_effect/gasphoron
- effecttype = "gasphoron"
- var/max_pressure
- var/target_percentage
+ name = "phoron creation"
/datum/artifact_effect/gasphoron/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
- max_pressure = rand(115,1000)
- effect_type = pick(6,7)
+ effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasphoron/DoEffectTouch(var/mob/user)
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
- holder_loc.assume_gas("oxygen", rand(2, 15))
+ holder_loc.assume_gas("phoron", rand(2, 15))
/datum/artifact_effect/gasphoron/DoEffectAura()
if(holder)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm b/code/modules/xenoarcheaology/effects/gassleeping.dm
similarity index 77%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm
rename to code/modules/xenoarcheaology/effects/gassleeping.dm
index afa1d0704c..8537880438 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm
+++ b/code/modules/xenoarcheaology/effects/gassleeping.dm
@@ -1,23 +1,19 @@
-
-/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/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("sleeping_agent", rand(2, 15))
-
-/datum/artifact_effect/gassleeping/DoEffectAura()
- if(holder)
- var/turf/holder_loc = holder.loc
- if(istype(holder_loc))
- holder_loc.assume_gas("sleeping_agent", pick(0, 0, 0.1, rand()))
+/datum/artifact_effect/gassleeping
+ name = "N2O creation"
+
+/datum/artifact_effect/gassleeping/New()
+ ..()
+ effect = pick(EFFECT_TOUCH, EFFECT_AURA)
+ effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
+
+/datum/artifact_effect/gassleeping/DoEffectTouch(var/mob/user)
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("sleeping_agent", rand(2, 15))
+
+/datum/artifact_effect/gassleeping/DoEffectAura()
+ if(holder)
+ var/turf/holder_loc = holder.loc
+ if(istype(holder_loc))
+ holder_loc.assume_gas("sleeping_agent", pick(0, 0, 0.1, rand()))
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/xenoarcheaology/effects/goodfeeling.dm
similarity index 70%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
rename to code/modules/xenoarcheaology/effects/goodfeeling.dm
index 61719bc916..8086d0e673 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
+++ b/code/modules/xenoarcheaology/effects/goodfeeling.dm
@@ -1,68 +1,67 @@
-
-/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))
- H << "[pick(drastic_messages)]"
- else
- H << "[pick(messages)]"
-
- if(prob(50))
- H.dizziness += 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))
- H << "[pick(messages)]"
- else
- H << "[pick(drastic_messages)]"
-
- if(prob(5))
- H.dizziness += 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))
- H << "[pick(drastic_messages)]"
- else
- H << "[pick(messages)]"
-
- if(prob(50))
- H.dizziness += rand(3,5)
- else if(prob(25))
- H.dizziness += rand(5,15)
- return 1
+/datum/artifact_effect/goodfeeling
+ name = "good feeling"
+ effect_type = EFFECT_PSIONIC
+ 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))
+ H << "[pick(drastic_messages)]"
+ else
+ H << "[pick(messages)]"
+
+ if(prob(50))
+ H.dizziness += 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))
+ H << "[pick(messages)]"
+ else
+ H << "[pick(drastic_messages)]"
+
+ if(prob(5))
+ H.dizziness += 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))
+ H << "[pick(drastic_messages)]"
+ else
+ H << "[pick(messages)]"
+
+ if(prob(50))
+ H.dizziness += rand(3,5)
+ else if(prob(25))
+ H.dizziness += rand(5,15)
+ return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/xenoarcheaology/effects/heal.dm
similarity index 97%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
rename to code/modules/xenoarcheaology/effects/heal.dm
index 5a6e8a46db..275f25e3d3 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
+++ b/code/modules/xenoarcheaology/effects/heal.dm
@@ -1,7 +1,6 @@
-
/datum/artifact_effect/heal
- effecttype = "heal"
- effect_type = 5
+ name = "heal"
+ effect_type = EFFECT_ORGANIC
/datum/artifact_effect/heal/DoEffectTouch(var/mob/toucher)
//todo: check over this properly
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm b/code/modules/xenoarcheaology/effects/heat.dm
similarity index 84%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm
rename to code/modules/xenoarcheaology/effects/heat.dm
index 21304df408..00d57ff40a 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm
+++ b/code/modules/xenoarcheaology/effects/heat.dm
@@ -1,17 +1,13 @@
-
//inverse of /datum/artifact_effect/cold, the two effects split up for neatness' sake
/datum/artifact_effect/heat
- effecttype = "heat"
+ name = "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)
+ effect_type = pick(EFFECT_ORGANIC, EFFECT_BLUESPACE, EFFECT_SYNTH)
+ target_temp = rand(300, 600)
/datum/artifact_effect/heat/DoEffectTouch(var/mob/user)
if(holder)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/xenoarcheaology/effects/hurt.dm
similarity index 95%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
rename to code/modules/xenoarcheaology/effects/hurt.dm
index 5bdb39a87c..db8732294d 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
+++ b/code/modules/xenoarcheaology/effects/hurt.dm
@@ -1,49 +1,48 @@
-
-/datum/artifact_effect/hurt
- effecttype = I_HURT
- 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
- 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(1,5) * weakness)
- C.apply_effect(25 * weakness, IRRADIATE)
- C.nutrition -= min(50 * weakness, C.nutrition)
- C.make_dizzy(6 * weakness)
- C.weakened += 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))
- 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(0.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))
- 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(0.1 * weakness)
- C.updatehealth()
+/datum/artifact_effect/hurt
+ name = "hurt"
+ effect_type = EFFECT_ORGANIC
+
+/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
+ 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(1,5) * weakness)
+ C.apply_effect(25 * weakness, IRRADIATE)
+ C.nutrition -= min(50 * weakness, C.nutrition)
+ C.make_dizzy(6 * weakness)
+ C.weakened += 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))
+ 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(0.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))
+ 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(0.1 * weakness)
+ C.updatehealth()
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm
similarity index 91%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm
rename to code/modules/xenoarcheaology/effects/radiate.dm
index 4310ffb2e7..7816409757 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm
+++ b/code/modules/xenoarcheaology/effects/radiate.dm
@@ -1,12 +1,11 @@
-
/datum/artifact_effect/radiate
- effecttype = "radiate"
+ name = "radiation"
var/radiation_amount
/datum/artifact_effect/radiate/New()
..()
radiation_amount = rand(1, 10)
- effect_type = pick(4,5)
+ effect_type = pick(EFFECT_PARTICLE, EFFECT_ORGANIC)
/datum/artifact_effect/radiate/DoEffectTouch(var/mob/living/user)
if(user)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm b/code/modules/xenoarcheaology/effects/roboheal.dm
similarity index 93%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
rename to code/modules/xenoarcheaology/effects/roboheal.dm
index 96e20fd3d1..4f852869a4 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
+++ b/code/modules/xenoarcheaology/effects/roboheal.dm
@@ -1,11 +1,10 @@
-
/datum/artifact_effect/roboheal
- effecttype = "roboheal"
+ name = "robotic healing"
var/last_message
/datum/artifact_effect/roboheal/New()
..()
- effect_type = pick(3,4)
+ effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE)
/datum/artifact_effect/roboheal/DoEffectTouch(var/mob/user)
if(user)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm b/code/modules/xenoarcheaology/effects/robohurt.dm
similarity index 93%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
rename to code/modules/xenoarcheaology/effects/robohurt.dm
index aab220cff7..3487bf7a4e 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
+++ b/code/modules/xenoarcheaology/effects/robohurt.dm
@@ -1,11 +1,10 @@
-
/datum/artifact_effect/robohurt
- effecttype = "robohurt"
+ name = "robotic harm"
var/last_message
/datum/artifact_effect/robohurt/New()
..()
- effect_type = pick(3,4)
+ effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE)
/datum/artifact_effect/robohurt/DoEffectTouch(var/mob/user)
if(user)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/xenoarcheaology/effects/sleepy.dm
similarity index 96%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
rename to code/modules/xenoarcheaology/effects/sleepy.dm
index 61979c5f69..bcdd736ebc 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
+++ b/code/modules/xenoarcheaology/effects/sleepy.dm
@@ -1,11 +1,10 @@
-
//todo
/datum/artifact_effect/sleepy
- effecttype = "sleepy"
+ name = "sleepy"
/datum/artifact_effect/sleepy/New()
..()
- effect_type = pick(5,2)
+ effect_type = pick(EFFECT_PSIONIC, EFFECT_ORGANIC)
/datum/artifact_effect/sleepy/DoEffectTouch(var/mob/toucher)
if(toucher)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm b/code/modules/xenoarcheaology/effects/stun.dm
similarity index 95%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
rename to code/modules/xenoarcheaology/effects/stun.dm
index b7b2864de4..adecc65086 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
+++ b/code/modules/xenoarcheaology/effects/stun.dm
@@ -1,10 +1,9 @@
-
/datum/artifact_effect/stun
- effecttype = "stun"
+ name = "stun"
/datum/artifact_effect/stun/New()
..()
- effect_type = pick(2,5)
+ effect_type = pick(EFFECT_PSIONIC, EFFECT_ORGANIC)
/datum/artifact_effect/stun/DoEffectTouch(var/mob/toucher)
if(toucher && iscarbon(toucher))
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/xenoarcheaology/effects/teleport.dm
similarity index 97%
rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
rename to code/modules/xenoarcheaology/effects/teleport.dm
index 5df1a33f66..a050d6c249 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
+++ b/code/modules/xenoarcheaology/effects/teleport.dm
@@ -1,7 +1,6 @@
-
/datum/artifact_effect/teleport
- effecttype = "teleport"
- effect_type = 6
+ name = "teleport"
+ effect_type = EFFECT_BLUESPACE
/datum/artifact_effect/teleport/DoEffectTouch(var/mob/user)
var/weakness = GetAnomalySusceptibility(user)
diff --git a/code/modules/research/xenoarchaeology/finds/finds_eguns.dm b/code/modules/xenoarcheaology/finds/eguns.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/finds/finds_eguns.dm
rename to code/modules/xenoarcheaology/finds/eguns.dm
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm
similarity index 84%
rename from code/modules/research/xenoarchaeology/finds/finds.dm
rename to code/modules/xenoarcheaology/finds/find_spawning.dm
index 33cb2d52ff..3be0dfbca2 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/xenoarcheaology/finds/find_spawning.dm
@@ -1,83 +1,3 @@
-//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 = list(TECH_MATERIAL = 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)
- 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'
@@ -88,7 +8,7 @@
if(new_item_type)
find_type = new_item_type
else
- find_type = rand(1,34) //update this when you add new find types
+ find_type = rand(1, MAX_ARCHAEO)
var/item_type = "object"
icon_state = "unknown[rand(1,4)]"
@@ -99,6 +19,7 @@
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",DEFAULT_WALL_MATERIAL,"titanium","aluminium","ferritic-alloy","plasteel","duranium")
diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm
new file mode 100644
index 0000000000..ab5d00e786
--- /dev/null
+++ b/code/modules/xenoarcheaology/finds/finds.dm
@@ -0,0 +1,67 @@
+/datum/find
+ var/find_type = 0 //random according to the digsite type
+ var/excavation_required = 0 //random 10 - 190
+ var/view_range = 40 //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(4, 12)
+ dissonance_spread = rand(1500, 2500) / 100
+
+/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"
+ origin_tech = list(TECH_MATERIAL = 5)
+
+/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0)
+ ..(loc)
+
+ if(inside_item_type)
+ new /obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type)
+
+/obj/item/weapon/ore/strangerock/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I, /obj/item/weapon/pickaxe/brush))
+ var/obj/item/inside = locate() in src
+ if(inside)
+ inside.loc = get_turf(src)
+ visible_message("\The [src] is brushed away, revealing \the [inside].")
+ else
+ visible_message("\The [src] is brushed away into nothing.")
+ qdel(src)
+ return
+
+ if(istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/W = I
+ if(W.isOn())
+ if(W.get_fuel() >= 2)
+ var/obj/item/inside = locate() in src
+ if(inside)
+ inside.loc = get_turf(src)
+ visible_message("\The [src] burns away revealing \the [inside].")
+ else
+ visible_message("\The [src] burns away into nothing.")
+ qdel(src)
+ W.remove_fuel(2)
+ else
+ visible_message("A few sparks fly off \the [src], but nothing else happens.")
+ W.remove_fuel(1)
+ return
+
+ else if(istype(I, /obj/item/device/core_sampler))
+ var/obj/item/device/core_sampler/S = I
+ S.sample_item(src, user)
+ return
+
+ ..()
+
+ if(prob(33))
+ src.visible_message("[src] crumbles away, leaving some dust and gravel behind.")
+ qdel(src)
diff --git a/code/modules/xenoarcheaology/finds/finds_defines.dm b/code/modules/xenoarcheaology/finds/finds_defines.dm
new file mode 100644
index 0000000000..060119c7ce
--- /dev/null
+++ b/code/modules/xenoarcheaology/finds/finds_defines.dm
@@ -0,0 +1,116 @@
+var/global/list/responsive_carriers = list(
+ "carbon",
+ "potassium",
+ "hydrogen",
+ "nitrogen",
+ "mercury",
+ "iron",
+ "chlorine",
+ "phosphorus",
+ "phoron")
+
+var/global/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")
+
+/proc/get_responsive_reagent(var/find_type)
+ switch(find_type)
+ if(ARCHAEO_BOWL, ARCHAEO_URN, ARCHAEO_CUTLERY, ARCHAEO_STATUETTE, ARCHAEO_INSTRUMENT, ARCHAEO_HANDCUFFS, ARCHAEO_BEARTRAP, ARCHAEO_LIGHTER, ARCHAEO_BOX, ARCHAEO_GASTANK, ARCHAEO_PEN, ARCHAEO_UNKNOWN)
+ return "mercury"
+ if(ARCHAEO_COIN, ARCHAEO_KNIFE, ARCHAEO_TOOL, ARCHAEO_METAL, ARCHAEO_CLAYMORE, ARCHAEO_RODS, ARCHAEO_KATANA, ARCHAEO_LASER, ARCHAEO_GUN)
+ return "iron"
+ if(ARCHAEO_CRYSTAL, ARCHAEO_SHARD, ARCHAEO_SOULSTONE)
+ return "nitrogen"
+ if(ARCHAEO_CULTBLADE, ARCHAEO_TELEBEACON, ARCHAEO_CULTROBES, ARCHAEO_STOCKPARTS)
+ return "potassium"
+ if(ARCHAEO_FOSSIL, ARCHAEO_SHELL, ARCHAEO_PLANT, ARCHAEO_REMAINS_HUMANOID, ARCHAEO_REMAINS_ROBOT, ARCHAEO_REMAINS_XENO, ARCHAEO_GASMASK)
+ return "carbon"
+ return "phoron"
+
+/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)
+ . = 0
+ switch(digsite)
+ if(DIGSITE_GARDEN)
+ . = pick(
+ 100;ARCHAEO_PLANT,
+ 25;ARCHAEO_SHELL,
+ 25;ARCHAEO_FOSSIL,
+ 5;ARCHAEO_BEARTRAP)
+ if(DIGSITE_ANIMAL)
+ . = pick(
+ 100;ARCHAEO_FOSSIL,
+ 50;ARCHAEO_SHELL,
+ 50;ARCHAEO_PLANT,
+ 25;ARCHAEO_BEARTRAP)
+ if(DIGSITE_HOUSE)
+ . = 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)
+ . = 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)
+ . = 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)
+ . = 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)
diff --git a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm b/code/modules/xenoarcheaology/finds/fossils.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/finds/finds_fossils.dm
rename to code/modules/xenoarcheaology/finds/fossils.dm
diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/xenoarcheaology/finds/misc.dm
similarity index 97%
rename from code/modules/research/xenoarchaeology/finds/finds_misc.dm
rename to code/modules/xenoarcheaology/finds/misc.dm
index 90afe5a737..4037de5176 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm
+++ b/code/modules/xenoarcheaology/finds/misc.dm
@@ -1,33 +1,33 @@
-
-// Phoron shards have been moved to code/game/objects/items/weapons/shards.dm
-
-//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?
+
+// Phoron shards have been moved to code/game/objects/items/weapons/shards.dm
+
+//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/xenoarcheaology/finds/special.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/finds/finds_special.dm
rename to code/modules/xenoarcheaology/finds/special.dm
diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/xenoarcheaology/finds/talking.dm
similarity index 86%
rename from code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
rename to code/modules/xenoarcheaology/finds/talking.dm
index 69aaac47c0..0baa9586dd 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
+++ b/code/modules/xenoarcheaology/finds/talking.dm
@@ -1,10 +1,3 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// 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
diff --git a/code/modules/research/xenoarchaeology/manuals.dm b/code/modules/xenoarcheaology/manuals.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/manuals.dm
rename to code/modules/xenoarcheaology/manuals.dm
diff --git a/code/modules/research/xenoarchaeology/master_controller.dm b/code/modules/xenoarcheaology/master_controller.dm
similarity index 58%
rename from code/modules/research/xenoarchaeology/master_controller.dm
rename to code/modules/xenoarcheaology/master_controller.dm
index 65f4b9f1fc..a6689e36b6 100644
--- a/code/modules/research/xenoarchaeology/master_controller.dm
+++ b/code/modules/xenoarcheaology/master_controller.dm
@@ -1,85 +1,95 @@
-
-/datum/controller/game_controller
- var/list/artifact_spawning_turfs = list()
- var/list/digsite_spawning_turfs = list()
-
-#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(!(M.density))
- continue
-
- 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()
-
-#undef XENOARCH_SPAWN_CHANCE
-#undef DIGSITESIZE_LOWER
-#undef DIGSITESIZE_UPPER
-#undef ARTIFACTSPAWNNUM_LOWER
-#undef ARTIFACTSPAWNNUM_UPPER
+/datum/controller/game_controller
+ var/list/artifact_spawning_turfs = list()
+ var/list/digsite_spawning_turfs = list()
+
+#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()
+ for(var/turf/simulated/mineral/M in world)
+ if(!M.density)
+ continue
+
+ if(isnull(M.geologic_data))
+ M.geologic_data = new /datum/geosample(M)
+
+ if(!prob(XENOARCH_SPAWN_CHANCE))
+ continue
+
+ var/farEnough = 1
+ for(var/A in digsite_spawning_turfs)
+ var/turf/T = A
+ if(T in range(5, M))
+ farEnough = 0
+ break
+ if(!farEnough)
+ 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)
+
+ var/list/viable_adjacent_turfs = list()
+ if(target_digsite_size > 1)
+ for(var/turf/simulated/mineral/T in orange(2, M))
+ if(!T.density)
+ continue
+ if(T.finds)
+ continue
+ if(T in processed_turfs)
+ continue
+ viable_adjacent_turfs.Add(T)
+
+ target_digsite_size = min(target_digsite_size, viable_adjacent_turfs.len)
+
+ for(var/i = 1 to target_digsite_size)
+ turfs_to_process += pick_n_take(viable_adjacent_turfs)
+
+ while(turfs_to_process.len)
+ var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process)
+
+ 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(10, 190)))
+ else if(prob(75))
+ archeo_turf.finds.Add(new /datum/find(digsite, rand(10, 90)))
+ archeo_turf.finds.Add(new /datum/find(digsite, rand(110, 190)))
+ else
+ archeo_turf.finds.Add(new /datum/find(digsite, rand(10, 50)))
+ archeo_turf.finds.Add(new /datum/find(digsite, rand(60, 140)))
+ archeo_turf.finds.Add(new /datum/find(digsite, rand(150, 190)))
+
+ //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.update_icon()
+
+ //have a chance for an artifact to spawn here, but not in animal or plant digsites
+ if(isnull(M.artifact_find) && digsite != DIGSITE_GARDEN && digsite != DIGSITE_ANIMAL)
+ 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()
+
+#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/xenoarcheaology/misc.dm
similarity index 68%
rename from code/modules/research/xenoarchaeology/misc.dm
rename to code/modules/xenoarcheaology/misc.dm
index b2d8cef42c..c85c89ee49 100644
--- a/code/modules/research/xenoarchaeology/misc.dm
+++ b/code/modules/xenoarcheaology/misc.dm
@@ -1,12 +1,8 @@
-
-//---- Noticeboard
-
/obj/structure/noticeboard/anomaly
notices = 5
icon_state = "nboard05"
/obj/structure/noticeboard/anomaly/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."
@@ -42,22 +38,18 @@
P.overlays = list("paper_stamped_rd")
src.contents += P
-//---- 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/bookcase/manuals/xenoarchaeology/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()
/obj/structure/closet/secure_closet/xenoarchaeologist
name = "Xenoarchaeologist Locker"
@@ -69,17 +61,15 @@
icon_broken = "secureresbroken"
icon_off = "secureresoff"
- New()
- ..()
- sleep(2)
- new /obj/item/clothing/under/rank/scientist(src)
- new /obj/item/clothing/suit/storage/toggle/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/secure_closet/xenoarchaeologist/New()
+ ..()
+ new /obj/item/clothing/under/rank/scientist(src)
+ new /obj/item/clothing/suit/storage/toggle/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/excavation(src)
/obj/structure/closet/excavation
name = "Excavation tools"
@@ -87,27 +77,23 @@
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/ano_scanner(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)
- new /obj/item/weapon/hand_labeler(src)
- return
-
-//---- Isolation room air alarms
+/obj/structure/closet/excavation/New()
+ ..()
+ new /obj/item/weapon/storage/belt/archaeology(src)
+ new /obj/item/weapon/storage/excavation(src)
+ new /obj/item/device/flashlight/lantern(src)
+ new /obj/item/device/ano_scanner(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)
+ new /obj/item/weapon/hand_labeler(src)
/obj/machinery/alarm/isolation
req_one_access = list(access_research, access_atmospherics, access_engine_equip)
diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm
new file mode 100644
index 0000000000..fa0d54a9a7
--- /dev/null
+++ b/code/modules/xenoarcheaology/sampling.dm
@@ -0,0 +1,165 @@
+/obj/item/weapon/rocksliver
+ name = "rock sliver"
+ desc = "It looks extremely delicate."
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ icon_state = "sliver1"
+ w_class = 1
+ sharp = 1
+ var/datum/geosample/geological_data
+
+/obj/item/weapon/rocksliver/New()
+ icon_state = "sliver[rand(1, 3)]"
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8 ,0)
+
+/datum/geosample
+ var/age = 0
+ var/age_thousand = 0
+ var/age_million = 0
+ var/age_billion = 0
+ var/artifact_id = ""
+ var/artifact_distance = -1
+ var/source_mineral = "chlorine"
+ var/list/find_presence = list()
+
+/datum/geosample/New(var/turf/simulated/mineral/container)
+ UpdateTurf(container)
+
+/datum/geosample/proc/UpdateTurf(var/turf/simulated/mineral/container)
+ if(!istype(container))
+ return
+
+ age = rand(1, 999)
+
+ if(container.mineral)
+ if(islist(container.mineral.xarch_ages))
+ var/list/ages = container.mineral.xarch_ages
+ if(ages["thousand"])
+ age_thousand = rand(1, ages["thousand"])
+ if(ages["million"])
+ age_million = rand(1, ages["million"])
+ if(ages["billion"])
+ if(ages["billion_lower"])
+ age_billion = rand(ages["billion_lower"], ages["billion"])
+ else
+ age_billion = rand(1, ages["billion"])
+ if(container.mineral.xarch_source_mineral)
+ source_mineral = container.mineral.xarch_source_mineral
+
+ 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
+
+ for(var/datum/find/F in container.finds)
+ var/responsive_reagent = get_responsive_reagent(F.find_type)
+ find_presence[responsive_reagent] = F.dissonance_spread
+
+ 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
+
+/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
+ 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)
+ var/cur_dist = get_dist(container, T) * 2
+ if( (artifact_distance < 0 || cur_dist < artifact_distance))
+ artifact_distance = cur_dist + rand() * 2 - 1
+ artifact_id = T.artifact_find.artifact_id
+ else
+ master_controller.artifact_spawning_turfs.Remove(T)
+
+/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 = 1
+
+ var/sampled_turf = ""
+ var/num_stored_bags = 10
+ var/obj/item/weapon/evidencebag/filled_bag
+
+/obj/item/device/core_sampler/examine(var/mob/user)
+ if(..(user, 2))
+ 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(var/obj/item/I, var/mob/living/user)
+ if(istype(I, /obj/item/weapon/evidencebag))
+ if(I.contents.len)
+ user << "\The [I] is full."
+ return
+ if(num_stored_bags < 10)
+ qdel(I)
+ num_stored_bags += 1
+ user << "You insert \the [I] into \the [src]."
+ else
+ user << "\The [src] can not fit any more bags."
+ else
+ return ..()
+
+/obj/item/device/core_sampler/proc/sample_item(var/item_to_sample, var/mob/user)
+ 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)
+ user << "The core sampler is full."
+ else if(num_stored_bags < 1)
+ 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(filled_bag)
+ R.geological_data = geo_data
+
+ //update the sample bag
+ filled_bag.icon_state = "evidence"
+ var/image/I = image("icon"=R, "layer"=FLOAT_LAYER)
+ filled_bag.overlays += I
+ filled_bag.overlays += "evidence"
+ filled_bag.w_class = 1
+
+ user << "You take a core sample of the [item_to_sample]."
+ else
+ user << "You are unable to take a sample of [item_to_sample]."
+
+/obj/item/device/core_sampler/attack_self(var/mob/living/user)
+ if(filled_bag)
+ user << "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
+ user << "The core sampler is empty."
diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm
similarity index 98%
rename from code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
rename to code/modules/xenoarcheaology/tools/ano_device_battery.dm
index fc50c956e7..85376724ea 100644
--- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
+++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm
@@ -1,4 +1,3 @@
-
/obj/item/weapon/anobattery
name = "Anomaly power battery"
icon = 'icons/obj/xenoarchaeology.dmi'
@@ -210,6 +209,6 @@
M.lastattacker = user
if(inserted_battery.battery_effect)
- user.attack_log += "\[[time_stamp()]\] Tapped [M.name] ([M.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])"
- M.attack_log += "\[[time_stamp()]\] Tapped by [user.name] ([user.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])"
- msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" )
+ user.attack_log += "\[[time_stamp()]\] Tapped [M.name] ([M.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.name])"
+ M.attack_log += "\[[time_stamp()]\] Tapped by [user.name] ([user.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.name])"
+ msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.name])" )
diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
new file mode 100644
index 0000000000..553b6674df
--- /dev/null
+++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
@@ -0,0 +1,157 @@
+/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 = 50
+ var/obj/scanned_object
+ var/report_num = 0
+
+/obj/machinery/artifact_analyser/initialize()
+ ..()
+ 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)
+ reconnect_scanner()
+
+ 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)
+ scan_in_progress = 0
+ updateDialog()
+
+ 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.\"")
+ 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 += "\icon[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
+ scanned_object = null
+
+/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
+ 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 scan. 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 an artificial ecosystem formed by semi-organic nanomachines and the contained liquid.
The liquid resembles protoplasmic residue supportive of unicellular organism developmental conditions.
The structure is composed of a titanium alloy."
+ if(/obj/machinery/power/supermatter)
+ return "Superdense phoron clump - appears to have been shaped or hewn, structure is composed of matter aproximately 20 times denser than ordinary refined phoron."
+ if(/obj/structure/constructshell)
+ return "Tribal idol - subject 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 phoron."
+ if(/obj/structure/cult/pylon)
+ return "Tribal pylon - subject resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations."
+ if(/obj/machinery/replicator)
+ return "Automated construction unit - subject appears to be able to synthesize various objects given a material, some with simple internal circuitry. Method unknown."
+ 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)
+ var/obj/machinery/artifact/A = scanned_obj
+ var/out = "Anomalous alien device - composed of an unknown alloy.
"
+
+ if(A.my_effect)
+ out += A.my_effect.getDescription()
+
+ if(A.secondary_effect && A.secondary_effect.activated)
+ out += "
Internal scans indicate ongoing secondary activity operating independently from primary systems.
"
+ out += A.secondary_effect.getDescription()
+
+ return out
+ else
+ return "[scanned_obj.name] - mundane application."
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
similarity index 99%
rename from code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
rename to code/modules/xenoarcheaology/tools/artifact_harvester.dm
index 912d0a062e..23ff59799e 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/artifact_harvester
name = "Exotic Particle Harvester"
icon = 'icons/obj/virology.dmi'
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm b/code/modules/xenoarcheaology/tools/artifact_scanner.dm
similarity index 99%
rename from code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm
rename to code/modules/xenoarcheaology/tools/artifact_scanner.dm
index 3d440bf85a..c5bdfe015a 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_scanner.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/artifact_scanpad
name = "Anomaly Scanner Pad"
desc = "Place things here for scanning."
diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/xenoarcheaology/tools/coolant_tank.dm
similarity index 81%
rename from code/modules/research/xenoarchaeology/machinery/coolant.dm
rename to code/modules/xenoarcheaology/tools/coolant_tank.dm
index ad44c7d2ce..1ee02211cf 100644
--- a/code/modules/research/xenoarchaeology/machinery/coolant.dm
+++ b/code/modules/xenoarcheaology/tools/coolant_tank.dm
@@ -1,16 +1,17 @@
/obj/structure/reagent_dispensers/coolanttank
name = "coolant tank"
- desc = "A tank of industrial coolant."
+ desc = "A tank of industrial coolant"
icon = 'icons/obj/objects.dmi'
icon_state = "coolanttank"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("coolant",1000)
+
+/obj/structure/reagent_dispensers/coolanttank/New()
+ ..()
+ reagents.add_reagent("coolant", 1000)
/obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
- if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
+ if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) // TODO: make this not terrible
explode()
/obj/structure/reagent_dispensers/coolanttank/ex_act()
@@ -18,7 +19,6 @@
/obj/structure/reagent_dispensers/coolanttank/proc/explode()
var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread
- //S.attach(src)
S.set_up(5, 0, src.loc)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/xenoarcheaology/tools/equipment.dm
similarity index 77%
rename from code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
rename to code/modules/xenoarcheaology/tools/equipment.dm
index f6bbeed769..2913c1bbac 100644
--- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
+++ b/code/modules/xenoarcheaology/tools/equipment.dm
@@ -1,21 +1,22 @@
-
-//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"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ item_state = "engspace_suit"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
/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"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ 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/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,/obj/item/device/suit_cooling_unit)
@@ -23,4 +24,5 @@
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)
diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm
similarity index 99%
rename from code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
rename to code/modules/xenoarcheaology/tools/geosample_scanner.dm
index ed23b965df..dde5a3058e 100644
--- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
+++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/radiocarbon_spectrometer
name = "radiocarbon spectrometer"
desc = "A specialised, complex scanner for gleaning information on all manner of small things."
diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm
similarity index 62%
rename from code/modules/research/xenoarchaeology/tools/suspension_generator.dm
rename to code/modules/xenoarcheaology/tools/suspension_generator.dm
index 6b77e800eb..c68d06a1ba 100644
--- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
+++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm
@@ -8,54 +8,34 @@
var/obj/item/weapon/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/power_use = 5
var/obj/effect/suspension_field/suspension_field
- var/list/secured_mobs = list()
/obj/machinery/suspension_gen/New()
- src.cell = new/obj/item/weapon/cell/high(src)
..()
+ src.cell = new /obj/item/weapon/cell/high(src)
/obj/machinery/suspension_gen/process()
- set background = 1
-
- if (suspension_field)
+ 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.weakened = max(M.weakened, 3)
- cell.charge -= power_use
- if(prob(5))
- M << "\blue [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.weakened = max(M.weakened, 3)
- cell.charge -= power_use
- if(prob(5))
- M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]"
+ for(var/mob/living/M in T)
+ M.weakened = max(M.weakened, 3)
+ cell.charge -= power_use
+ if(prob(5))
+ 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.weakened = max(M.weakened, 3)
- cell.charge -= power_use
- if(prob(5))
- M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]"
+ I.forceMove(suspension_field)
if(cell.charge <= 0)
deactivate()
-/obj/machinery/suspension_gen/interact(mob/user as mob)
+/obj/machinery/suspension_gen/interact(var/mob/user)
var/dat = "Multi-phase mobile suspension field generator MK II \"Steadfast\"
"
if(cell)
var/colour = "red"
@@ -80,25 +60,6 @@
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=="phoron"?"":"" ]Chlorine diffusion emissions
"
- dat += "[field_type=="phoron"?"":"" ]Phoron 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)
@@ -123,8 +84,6 @@
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"])
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card))
@@ -153,8 +112,8 @@
updateUsrDialog()
-/obj/machinery/suspension_gen/attack_hand(mob/user as mob)
- if(!open)
+/obj/machinery/suspension_gen/attack_hand(var/mob/user)
+ if(!panel_open)
interact(user)
else if(cell)
cell.loc = loc
@@ -166,29 +125,8 @@
user << "You remove the power cell"
/obj/machinery/suspension_gen/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/screwdriver))
- if(!open)
- if(screwed)
- screwed = 0
- else
- screwed = 1
- 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
- user << "You crowbar the battery panel [open ? "open" : "in place"]."
- icon_state = "suspension[open ? (cell ? "1" : "0") : "2"]"
- else
- user << "[src]'s safety locks are engaged, shut it down first."
- else
- user << "Unscrew [src]'s battery panel first."
- else
- user << "[src]'s security locks are engaged."
+ if(!locked && !suspension_field && default_deconstruction_screwdriver(user, W))
+ return
else if (istype(W, /obj/item/weapon/wrench))
if(!suspension_field)
if(anchored)
@@ -203,7 +141,7 @@
else
user << "You are unable to secure [src] while it is active!"
else if (istype(W, /obj/item/weapon/cell))
- if(open)
+ if(panel_open)
if(cell)
user << "There is a power cell already installed."
else
@@ -223,7 +161,7 @@
user << "Remove [auth_card] first."
/obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C, var/mob/user)
- if(!open)
+ if(!panel_open)
if(istype(C, /obj/item/weapon/card/emag))
C.resolve_attackby(src, user)
else if(istype(C, /obj/item/weapon/card/id) && check_access(C))
@@ -238,50 +176,14 @@
//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.weakened += 5
- C.visible_message("\blue \icon[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("phoron")
- success = 1
- //
- if("calcium")
- success = 1
- //
- if("iron")
- success = 1
- for(var/mob/living/silicon/R in T)
- R.weakened += 5
- R.visible_message("\blue \icon[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("\blue \icon[C] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
- C.weakened += 5
+ for(var/mob/living/M in T)
+ M.weakened += 5
+ M.visible_message("\blue \icon[M] [M] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
suspension_field = new(T)
- suspension_field.field_type = field_type
src.visible_message("\blue \icon[src] [src] activates with a low hum.")
icon_state = "suspension3"
@@ -303,16 +205,16 @@
//drop anything we picked up
var/turf/T = get_turf(suspension_field)
- for(var/mob/M in T)
+ for(var/mob/living/M in T)
M << "You no longer feel like floating."
M.weakened = min(M.weakened, 3)
src.visible_message("\blue \icon[src] [src] deactivates with a gentle shudder.")
qdel(suspension_field)
+ suspension_field = null
icon_state = "suspension2"
/obj/machinery/suspension_gen/Destroy()
- //safety checks: clear the field and drop anything it's holding
deactivate()
..()
@@ -341,9 +243,8 @@
icon = 'icons/effects/effects.dmi'
anchored = 1
density = 1
- var/field_type = "chlorine"
/obj/effect/suspension_field/Destroy()
- for(var/obj/I in src)
+ for(var/atom/movable/I in src)
I.loc = src.loc
..()
diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm
new file mode 100644
index 0000000000..e7746f69d4
--- /dev/null
+++ b/code/modules/xenoarcheaology/tools/tools.dm
@@ -0,0 +1,316 @@
+/obj/item/device/gps
+ name = "relay positioning device"
+ desc = "Triangulates the approximate co-ordinates using a nearby satellite network."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "locator"
+ item_state = "locator"
+ w_class = 2
+
+/obj/item/device/gps/attack_self(var/mob/user as mob)
+ var/turf/T = get_turf(src)
+ user << "\icon[src] \The [src] flashes [T.x]:[T.y]:[T.z]."
+
+/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 = 2
+
+/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 = 3
+ storage_slots = 50
+ max_storage_space = 200
+ max_w_class = 3
+ can_hold = list(/obj/item/weapon/fossil)
+
+/obj/item/weapon/storage/box/samplebags
+ name = "sample bag box"
+ desc = "A box claiming to contain sample bags."
+
+/obj/item/weapon/storage/box/samplebags/New()
+ ..()
+ for(var/i = 1 to 7)
+ var/obj/item/weapon/evidencebag/S = new(src)
+ S.name = "sample bag"
+ S.desc = "a bag for holding research samples."
+
+/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 = 2.0
+ slot_flags = SLOT_BELT
+
+ var/last_scan_time = 0
+ var/scan_delay = 25
+
+/obj/item/device/ano_scanner/attack_self(var/mob/living/user)
+ interact(user)
+
+/obj/item/device/ano_scanner/interact(var/mob/living/user)
+ if(world.time - last_scan_time >= scan_delay)
+ last_scan_time = world.time
+
+ var/nearestTargetDist = -1
+ var/nearestTargetId
+
+ var/nearestSimpleTargetDist = -1
+ var/turf/cur_turf = get_turf(src)
+
+ if(master_controller) //Sanity check due to runtimes ~Z
+ for(var/A in master_controller.artifact_spawning_turfs)
+ var/turf/simulated/mineral/T = A
+ if(T.density && T.artifact_find)
+ if(T.z == cur_turf.z)
+ var/cur_dist = get_dist(cur_turf, T) * 2
+ if(nearestTargetDist < 0 || cur_dist < nearestTargetDist)
+ nearestTargetDist = cur_dist + rand() * 2 - 1
+ nearestTargetId = T.artifact_find.artifact_id
+ else
+ master_controller.artifact_spawning_turfs.Remove(T)
+
+ for(var/A in master_controller.digsite_spawning_turfs)
+ var/turf/simulated/mineral/T = A
+ if(T.density && T.finds && T.finds.len)
+ if(T.z == cur_turf.z)
+ var/cur_dist = get_dist(cur_turf, T) * 2
+ if(nearestSimpleTargetDist < 0 || cur_dist < nearestSimpleTargetDist)
+ nearestSimpleTargetDist = cur_dist + rand() * 2 - 1
+ else
+ master_controller.digsite_spawning_turfs.Remove(T)
+
+ if(nearestTargetDist >= 0)
+ user << "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]"
+ else if(nearestSimpleTargetDist >= 0)
+ user << "Small anomaly detected in a radius of [nearestSimpleTargetDist]m."
+ else
+ user << "Background radiation levels detected."
+ else
+ user << "Scanning array is recharging."
+
+/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 = 2
+ slot_flags = SLOT_BELT
+ var/list/positive_locations = list()
+ var/datum/depth_scan/current
+
+/datum/depth_scan
+ var/time = ""
+ var/coords = ""
+ var/depth = ""
+ 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("\The [user] scans \the [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]:[M.y]:[M.z]"
+ D.time = worldtime2text()
+ D.record_index = positive_locations.len + 1
+ D.material = M.mineral ? M.mineral.display_name : "Rock"
+
+ //find the first artifact and store it
+ if(M.finds.len)
+ var/datum/find/F = M.finds[1]
+ D.depth = "[F.excavation_required - F.clearance_range] - [F.excavation_required]"
+ D.clearance = F.clearance_range
+ D.material = get_responsive_reagent(F.find_type)
+
+ positive_locations.Add(D)
+
+ user << "\icon[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 = "[B.x]:[B.y]:[B.z]"
+ D.time = worldtime2text()
+ D.record_index = positive_locations.len + 1
+
+ //these values are arbitrary
+ D.depth = rand(150, 200)
+ D.clearance = rand(10, 50)
+ D.dissonance_spread = rand(750, 2500) / 100
+
+ positive_locations.Add(D)
+
+ user << "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!"
+
+/obj/item/device/depth_scanner/attack_self(var/mob/living/user)
+ interact(user)
+
+/obj/item/device/depth_scanner/interact(var/mob/user as mob)
+ var/dat = "Coordinates with positive matches
"
+
+ dat += "== Clear all ==
"
+
+ if(current)
+ dat += "Time: [current.time]
"
+ dat += "Coords: [current.coords]
"
+ dat += "Anomaly depth: [current.depth] cm
"
+ dat += "Anomaly size: [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 += "
"
+ if(positive_locations.len)
+ for(var/index = 1 to positive_locations.len)
+ 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()
+
+/obj/item/device/beacon_locator
+ name = "locater device"
+ desc = "Used to scan and locate signals on a particular frequency."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "pinoff" //pinonfar, pinonmedium, pinonclose, pinondirect, pinonnull
+ item_state = "electronic"
+ var/frequency = PUB_FREQ
+ 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)
+ ..()
+
+/obj/item/device/beacon_locator/process()
+ if(target_radio)
+ set_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("\icon[src] [src] [pick("chirps","chirrups","cheeps")] happily.")
+ else
+ T.visible_message("\icon[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 < 1200 || frequency > 1600)
+ 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/xenoarcheaology/tools/tools_pickaxe.dm
similarity index 71%
rename from code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
rename to code/modules/xenoarcheaology/tools/tools_pickaxe.dm
index e8bedc0987..a8bf853e82 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
+++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm
@@ -1,132 +1,151 @@
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// 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
- drill_sound = 'sound/weapons/thudswoosh.ogg'
- drill_verb = "brushing"
- w_class = 2
-
-/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
- drill_sound = 'sound/items/Screwdriver.ogg'
- drill_verb = "delicately picking"
- w_class = 2
-
-/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
- drill_sound = 'sound/items/Screwdriver.ogg'
- drill_verb = "delicately picking"
- w_class = 2
-
-/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
- drill_sound = 'sound/items/Screwdriver.ogg'
- drill_verb = "delicately picking"
- w_class = 2
-
-/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
- drill_sound = 'sound/items/Screwdriver.ogg'
- drill_verb = "delicately picking"
- w_class = 2
-
-/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
- drill_sound = 'sound/items/Screwdriver.ogg'
- drill_verb = "delicately picking"
- w_class = 2
-
-/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
- drill_sound = 'sound/items/Screwdriver.ogg'
- drill_verb = "delicately picking"
- w_class = 2
-
-/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
- drill_sound = 'sound/items/Crowbar.ogg'
- drill_verb = "clearing"
- w_class = 3
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// 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/material/cardboard //BubbleWrap
- storage_slots = 7
- w_class = 2
- 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_storage_space = 18
- max_w_class = 3
- 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)
+/obj/item/weapon/pickaxe/brush
+ name = "brush"
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ icon_state = "pick_brush"
+ item_state = "syringe_0"
+ slot_flags = SLOT_EARS
+ digspeed = 20
+ desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)."
+ excavation_amount = 1
+ drill_sound = 'sound/weapons/thudswoosh.ogg'
+ drill_verb = "brushing"
+ w_class = 2
+
+/obj/item/weapon/pickaxe/one_pick
+ name = "2cm 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 = 2
+ drill_sound = 'sound/items/Screwdriver.ogg'
+ drill_verb = "delicately picking"
+ w_class = 2
+
+/obj/item/weapon/pickaxe/two_pick
+ name = "4cm 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 = 4
+ drill_sound = 'sound/items/Screwdriver.ogg'
+ drill_verb = "delicately picking"
+ w_class = 2
+
+/obj/item/weapon/pickaxe/three_pick
+ name = "6cm 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 = 6
+ drill_sound = 'sound/items/Screwdriver.ogg'
+ drill_verb = "delicately picking"
+ w_class = 2
+
+/obj/item/weapon/pickaxe/four_pick
+ name = "8cm 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 = 8
+ drill_sound = 'sound/items/Screwdriver.ogg'
+ drill_verb = "delicately picking"
+ w_class = 2
+
+/obj/item/weapon/pickaxe/five_pick
+ name = "10cm 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 = 10
+ drill_sound = 'sound/items/Screwdriver.ogg'
+ drill_verb = "delicately picking"
+ w_class = 2
+
+/obj/item/weapon/pickaxe/six_pick
+ name = "12cm 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 = 12
+ drill_sound = 'sound/items/Screwdriver.ogg'
+ drill_verb = "delicately picking"
+ w_class = 2
+
+/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 = 30
+ drill_sound = 'sound/items/Crowbar.ogg'
+ drill_verb = "clearing"
+ w_class = 2
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Pack for holding pickaxes
+
+/obj/item/weapon/storage/excavation
+ name = "excavation pick set"
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "excavation"
+ desc = "A set of picks for excavation."
+ item_state = "syringe_kit"
+ storage_slots = 7
+ w_class = 2
+ 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,
+ /obj/item/weapon/pickaxe/hand)
+ max_storage_space = 18
+ max_w_class = 2
+ use_to_pickup = 1
+
+/obj/item/weapon/storage/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)
+
+/obj/item/weapon/storage/excavation/handle_item_insertion()
+ ..()
+ sort_picks()
+
+/obj/item/weapon/storage/excavation/proc/sort_picks()
+ var/list/obj/item/weapon/pickaxe/picksToSort = list()
+ for(var/obj/item/weapon/pickaxe/P in src)
+ picksToSort += P
+ P.loc = null
+ while(picksToSort.len)
+ var/min = 200 // No pick is bigger than 200
+ var/selected = 0
+ for(var/i = 1 to picksToSort.len)
+ var/obj/item/weapon/pickaxe/current = picksToSort[i]
+ if(current.excavation_amount <= min)
+ selected = i
+ min = current.excavation_amount
+ var/obj/item/weapon/pickaxe/smallest = picksToSort[selected]
+ smallest.loc = src
+ picksToSort -= smallest
+ orient2hud()
diff --git a/html/changelogs/Kelenius-fuckCael.yml b/html/changelogs/Kelenius-fuckCael.yml
new file mode 100644
index 0000000000..5cc48043a7
--- /dev/null
+++ b/html/changelogs/Kelenius-fuckCael.yml
@@ -0,0 +1,61 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Kelenius
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Xenoarcheology code has been partially redone."
+ - tweak: "Pick set will now sort the picks inside it."
+ - tweak: "Removed useless random numbers from GPS coordinates in various places. I'm sure we have not lost the arcane knowledge of rounding 500 years into the future."
+ - tweak: "Picks renamed to show their excavation depths."
+ - tweak: "Suspension generator's power use lowered."
+ - tweak: "Suspension generator's different field types removed. By the way, remember that they can suspend any item and even mobs."
+ - tweak: "Archeology belts and pick sets can now hold small pickaxes. Pick sets still only have 7 slots. Brushes fit on your ears."
+ - tweak: "Empty rock drop rate reduced."
+ - tweak: "Empty rock renamed from "rock" to "small rock" so you can tell if you are clicking on a turf or an item when hovering over it."
+ - tweak: "Empty boulder spawn rate reduced."
+ - tweak: "Tape measuring is a bit faster."
+ - tweak: "Scanner now shows the lowest and the highest depth of the find (highest is depth + clearance) for easier calculations. Ideally, you need to hit exactly the lowest spot. Less ideally, hit anywhere between higest and lowest. Hit below lowest and you have a chance to break the find."
+ - tweak: "You can now use a brush to clear strange rocks. Welder uses less fuel for that than before."
+ - tweak: "Anomaly analyser's report made a bit easier to read."
+ - tweak: "Anomaly locater will now also locate normal finds."
+ - bugfix: "Gas masks will now correctly spawn as archeological finds."
+ - bugfix: "Digsites will now properly contain several (4-12) turfs in a 5x5 radius. Be careful when digging near your finds."
+ - bugfix: "Suspension generator will now correctly turn off (qdel issue)."
+ - bugfix: "Archeology overlays won't disappear when the icon is updated (e.g. when mining next to it)."
+ - bugfix: "Archeology overlays won't overlap each other and will properly disappear when you mine out a find."
+ - bugfix: "Some spawning oddities were fixed."
+ - bugfix: "Checks for whether you get a strange rock or a clean item were fixed (previously it always gave you clean item where it should have been rolling a random number)."
+ - bugfix: "Can no longer get rid of any item by putting it into evidence bag and bag into core sampler."
+ - bugfix: "Can no longer irreversibly fold pick set into cardboard."
+ - bugfix: "CO2 generator effect now has a type."
+ - bugfix: "Phoron generator effect will now always generate phoron, not sometimes phoron and sometimes oxygen."
diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm
index c4ad365ec2..5871c0d1c7 100644
--- a/maps/polaris-5.dmm
+++ b/maps/polaris-5.dmm
@@ -877,7 +877,7 @@
"qS" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"qT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"qU" = (/obj/effect/floor_decal/corner/beige{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
-"qV" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/solution_trays,/obj/effect/floor_decal/corner/beige/full{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
+"qV" = (/obj/structure/table/glass,/obj/effect/floor_decal/corner/beige/full{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"qW" = (/obj/effect/floor_decal/corner/purple/full,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
"qX" = (/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"qY" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
@@ -895,7 +895,7 @@
"rk" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/archaeology,/obj/item/clothing/suit/space/anomaly,/obj/item/clothing/head/helmet/space/anomaly,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/westleft,/turf/simulated/floor/tiled/dark,/area/outpost/research/eva)
"rl" = (/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/effect/floor_decal/corner/beige/full,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rm" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
-"rn" = (/obj/item/weapon/reagent_containers/glass/beaker/water,/obj/item/weapon/reagent_containers/glass/beaker/fuel,/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
+"rn" = (/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"ro" = (/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rp" = (/obj/machinery/door/window/southright{name = "Spectrometry Lab"; req_access = list(65)},/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rq" = (/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Hallway Starboard 2"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard)
@@ -915,8 +915,8 @@
"rE" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/eva)
"rF" = (/obj/effect/floor_decal/corner/purple/full{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/outpost/research/eva)
"rG" = (/obj/effect/floor_decal/corner/purple{dir = 1},/obj/machinery/light{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/eva)
-"rH" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/eva)
-"rI" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/research/eva)
+"rH" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/eva)
+"rI" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/research/eva)
"rJ" = (/obj/structure/dispenser/oxygen,/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/outpost/research/eva)
"rK" = (/obj/machinery/light/small,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"rL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/analysis)
diff --git a/polaris.dme b/polaris.dme
index 52cb45c0a4..787ae088a4 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -38,6 +38,7 @@
#include "code\__defines\targeting.dm"
#include "code\__defines\turfs.dm"
#include "code\__defines\unit_tests.dm"
+#include "code\__defines\xenoarcheaology.dm"
#include "code\_compatibility\509\_JSON.dm"
#include "code\_compatibility\509\JSON Reader.dm"
#include "code\_compatibility\509\JSON Writer.dm"
@@ -1882,61 +1883,6 @@
#include "code\modules\research\rdmachines.dm"
#include "code\modules\research\research.dm"
#include "code\modules\research\server.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\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_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_forcefield.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasco2.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasnitro.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasoxy.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasplasma.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gassleeping.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\artifact\effects\unknown_effect_teleport.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_eguns.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\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\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\scripting\Errors.dm"
#include "code\modules\scripting\IDE.dm"
#include "code\modules\scripting\Options.dm"
@@ -2043,6 +1989,58 @@
#include "code\modules\virus2\helpers.dm"
#include "code\modules\virus2\isolator.dm"
#include "code\modules\virus2\items_devices.dm"
+#include "code\modules\xenoarcheaology\boulder.dm"
+#include "code\modules\xenoarcheaology\effect.dm"
+#include "code\modules\xenoarcheaology\manuals.dm"
+#include "code\modules\xenoarcheaology\master_controller.dm"
+#include "code\modules\xenoarcheaology\misc.dm"
+#include "code\modules\xenoarcheaology\sampling.dm"
+#include "code\modules\xenoarcheaology\artifacts\artifact.dm"
+#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm"
+#include "code\modules\xenoarcheaology\artifacts\autocloner.dm"
+#include "code\modules\xenoarcheaology\artifacts\crystal.dm"
+#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm"
+#include "code\modules\xenoarcheaology\artifacts\replicator.dm"
+#include "code\modules\xenoarcheaology\effects\badfeeling.dm"
+#include "code\modules\xenoarcheaology\effects\cellcharge.dm"
+#include "code\modules\xenoarcheaology\effects\celldrain.dm"
+#include "code\modules\xenoarcheaology\effects\cold.dm"
+#include "code\modules\xenoarcheaology\effects\dnaswitch.dm"
+#include "code\modules\xenoarcheaology\effects\emp.dm"
+#include "code\modules\xenoarcheaology\effects\forcefield.dm"
+#include "code\modules\xenoarcheaology\effects\gasco2.dm"
+#include "code\modules\xenoarcheaology\effects\gasnitro.dm"
+#include "code\modules\xenoarcheaology\effects\gasoxy.dm"
+#include "code\modules\xenoarcheaology\effects\gasphoron.dm"
+#include "code\modules\xenoarcheaology\effects\gassleeping.dm"
+#include "code\modules\xenoarcheaology\effects\goodfeeling.dm"
+#include "code\modules\xenoarcheaology\effects\heal.dm"
+#include "code\modules\xenoarcheaology\effects\heat.dm"
+#include "code\modules\xenoarcheaology\effects\hurt.dm"
+#include "code\modules\xenoarcheaology\effects\radiate.dm"
+#include "code\modules\xenoarcheaology\effects\roboheal.dm"
+#include "code\modules\xenoarcheaology\effects\robohurt.dm"
+#include "code\modules\xenoarcheaology\effects\sleepy.dm"
+#include "code\modules\xenoarcheaology\effects\stun.dm"
+#include "code\modules\xenoarcheaology\effects\teleport.dm"
+#include "code\modules\xenoarcheaology\finds\eguns.dm"
+#include "code\modules\xenoarcheaology\finds\find_spawning.dm"
+#include "code\modules\xenoarcheaology\finds\finds.dm"
+#include "code\modules\xenoarcheaology\finds\finds_defines.dm"
+#include "code\modules\xenoarcheaology\finds\fossils.dm"
+#include "code\modules\xenoarcheaology\finds\misc.dm"
+#include "code\modules\xenoarcheaology\finds\special.dm"
+#include "code\modules\xenoarcheaology\finds\talking.dm"
+#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm"
+#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm"
+#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm"
+#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm"
+#include "code\modules\xenoarcheaology\tools\coolant_tank.dm"
+#include "code\modules\xenoarcheaology\tools\equipment.dm"
+#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm"
+#include "code\modules\xenoarcheaology\tools\suspension_generator.dm"
+#include "code\modules\xenoarcheaology\tools\tools.dm"
+#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm"
#include "code\modules\xenobio2\_xeno_setup.dm"
#include "code\modules\xenobio2\controller.dm"
#include "code\modules\xenobio2\machinery\core_extractor.dm"