Rewrites xenoarch

See changelog
This commit is contained in:
Kelenius
2016-08-07 08:26:26 +03:00
parent eff90ea309
commit 93d07036ef
72 changed files with 2362 additions and 2834 deletions

View File

@@ -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

View File

@@ -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
)

View File

@@ -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()

View File

@@ -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"

View File

@@ -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("<span class='notice'>\The [user] extends \a [P] towards \the [src].</span>","<span class='notice'>You extend \the [P] towards \the [src].</span>")
if(do_after(user,25))
user << "<span class='notice'>\icon[P] [src] has been excavated to a depth of [2*excavation_level]cm.</span>"
if(do_after(user, 15))
user << "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>"
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 = ". <b>[pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]</b>"
user << "<span class='notice'>You start [P.drill_verb][fail_message ? fail_message : ""].</span>"
user << "<span class='notice'>You start [P.drill_verb][fail_message].</span>"
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 << "<span class='notice'>You finish [P.drill_verb] \the [src].</span>"
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 << "<span class='notice'>You finish [P.drill_verb] \the [src].</span>"
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("<span class='danger'>\The [pick("[display_name] crumbles away into dust","[display_name] breaks apart")].</span>")
qdel(X)

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/ore
name = "rock"
name = "small rock"
icon = 'icons/obj/mining.dmi'
icon_state = "ore2"
w_class = 2

View File

@@ -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("<font color='red'><b>[src] suddenly crumbles away.</b></font>",\
"\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("<font color='red'><b>[src] suddenly crumbles away.</b></font>")
else
user.visible_message("<font color='red'><b>[src] suddenly crumbles away.</b></font>",\
"\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)

View File

@@ -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()

View File

@@ -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

View File

@@ -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
*/

View File

@@ -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 = "<B>Anomalous material analyser</B><BR>"
dat += "<HR>"
if(!owned_scanner)
owned_scanner = locate() in orange(1, src)
if(!owned_scanner)
dat += "<b><font color=red>Unable to locate analysis pad.</font></b><br>"
else if(scan_in_progress)
dat += "Please wait. Analysis in progress.<br>"
dat += "<a href='?src=\ref[src];halt_scan=1'>Halt scanning.</a><br>"
else
dat += "Scanner is ready.<br>"
dat += "<a href='?src=\ref[src];begin_scan=1'>Begin scanning.</a><br>"
dat += "<br>"
dat += "<hr>"
dat += "<a href='?src=\ref[src]'>Refresh</a> <a href='?src=\ref[src];close=1'>Close</a>"
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("<b>[name]</b> states, \"Scanning complete.\"")
var/obj/item/weapon/paper/P = new(src.loc)
P.name = "[src] report #[++report_num]"
P.info = "<b>[src] analysis report #[report_num]</b><br>"
P.info += "<br>"
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("<b>[name]</b> states, \"Cannot harvest. Too much interference.\"")
else
scanned_object = O
scan_in_progress = 1
scan_completion_time = world.time + scan_duration
src.visible_message("<b>[name]</b> states, \"Scanning begun.\"")
break
if(!scanned_object)
src.visible_message("<b>[name]</b> states, \"Unable to isolate scan target.\"")
if(href_list["halt_scan"])
scan_in_progress = 0
src.visible_message("<b>[name]</b> 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.<br><br>\
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 += "<br><br>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."

View File

@@ -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

View File

@@ -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 <i>[T.x].[rand(0,9)]:[T.y].[rand(0,9)]:[T.z].[rand(0,9)]</i>."
/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)

View File

@@ -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("<span class='info'>[src] clicks.</span>")

View File

@@ -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."

View File

@@ -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 = "<b>Co-ordinates with positive matches</b><br>"
dat += "<A href='?src=\ref[src];clear=0'>== Clear all ==</a><br>"
if(current)
dat += "Time: [current.time]<br>"
dat += "Coords: [current.coords]<br>"
dat += "Anomaly depth: [current.depth] cm<br>"
dat += "Clearance above anomaly depth: [current.clearance] cm<br>"
dat += "Dissonance spread: [current.dissonance_spread]<br>"
var/index = responsive_carriers.Find(current.material)
if(index > 0 && index <= finds_as_strings.len)
dat += "Anomaly material: [finds_as_strings[index]]<br>"
else
dat += "Anomaly material: Unknown<br>"
dat += "<A href='?src=\ref[src];clear=[current.record_index]'>clear entry</a><br>"
else
dat += "Select an entry from the list<br>"
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<hr>"
if(positive_locations.len)
for(var/index=1, index<=positive_locations.len, index++)
var/datum/depth_scan/D = positive_locations[index]
dat += "<A href='?src=\ref[src];select=[index]'>[D.time], coords: [D.coords]</a><br>"
else
dat += "No entries recorded."
dat += "<hr>"
dat += "<A href='?src=\ref[src];refresh=1'>Refresh</a><br>"
dat += "<A href='?src=\ref[src];close=1'>Close</a><br>"
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()

View File

@@ -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 = "<b>Radio frequency tracker</b><br>"
dat += {"
<A href='byond://?src=\ref[src];reset_tracking=1'>Reset tracker</A><BR>
Frequency:
<A href='byond://?src=\ref[src];freq=-10'>-</A>
<A href='byond://?src=\ref[src];freq=-2'>-</A>
[format_frequency(frequency)]
<A href='byond://?src=\ref[src];freq=2'>+</A>
<A href='byond://?src=\ref[src];freq=10'>+</A><BR>
"}
dat += "<A href='?src=\ref[src];close=1'>Close</a><br>"
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()

View File

@@ -1,62 +1,3 @@
#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."
@@ -71,11 +12,9 @@ var/list/valid_secondary_effect_types = list(\
/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)
@@ -83,13 +22,14 @@ var/list/valid_secondary_effect_types = list(\
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.",\
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
@@ -101,22 +41,16 @@ var/list/valid_secondary_effect_types = list(\
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)
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 = rand(1,4)
#define TRIGGER_PHORON 9
#define TRIGGER_OXY 10
#define TRIGGER_CO2 11
#define TRIGGER_NITRO 12
my_effect.trigger = pick(TRIGGER_WATER, TRIGGER_ACID, TRIGGER_VOLATILE, TRIGGER_TOXIN)
/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
if(!istype(L)) // We're inside a container or on null turf, either way stop processing effects
return
if(my_effect)
@@ -267,7 +201,7 @@ var/list/valid_secondary_effect_types = list(\
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))
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))

View File

@@ -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)

View File

@@ -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("<span class='notice'>\icon[src] [src] suddenly comes to life!</span>")
//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("<span class='notice'>\icon[src] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].</span>")
//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("<span class='notice'>\icon[src] [src] pings!</span>")
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("<span class='notice'>\icon[src] [src] suddenly shuts down.</span>")
//cloned mob slowly breaks down
time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0)

View File

@@ -1,4 +1,3 @@
/obj/structure/crystal
name = "large crystal"
icon = 'icons/obj/xenoarchaeology.dmi'
@@ -10,11 +9,11 @@
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.",\
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()

View File

@@ -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 << "<span class='notice'>You press a button and \the [src] slowly spins down.</span>"
else
active = 1
icon_state = "gigadrill_mov"
user << "\blue You press a button and [src] shudders to life."
user << "<span class='notice'>You press a button and \the [src] shudders to life.</span>"
/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 <b>[src] begins to drill into [M]!</b>")
src.visible_message("<span class='notice'>\The [src] begins to drill into \the [M].</span>")
anchored = 1
spawn(drill_time)
if(get_turf(src) == drilling_turf && active)

View File

@@ -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,49 +22,48 @@
/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)
for(var/i=0, i<quantity, i++)
@@ -88,7 +86,7 @@
if(spawning_types.len && powered())
spawn_progress_time += world.time - last_process_time
if(spawn_progress_time > max_spawn_time)
src.visible_message("\blue \icon[src] [src] pings!")
src.visible_message("<span class='notice'>\icon[src] [src] pings!</span>")
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("<span class='notice'>\icon[src] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].</span>")
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("<span class='notice'>\The [user] inserts \the [W] into \the [src].</span>")
/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("<span class='notice'>\icon[src] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].</span>")
else
src.visible_message("\blue \icon[src] [src]'s front compartment slides shut.")
src.visible_message("<span class='notice'>\icon[src] [src]'s front compartment slides shut.</span>")
spawning_types.Add(construction[construction[index]])
spawn_progress_time = 0

View File

@@ -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("<span class='notice'>\The [user] extends \the [P] towards \the [src].</span>", "<span class='notice'>You extend \the [P] towards \the [src].</span>")
if(do_after(user, 15))
user << "<span class='notice'>\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.</span>"
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 << "<span class='warning'>You start [P.drill_verb] [src].</span>"
if(!do_after(user, P.digspeed))
return
user << "<span class='notice'>You finish [P.drill_verb] [src].</span>"
excavation_level += P.excavation_amount
if(excavation_level > 100)
//failure
user.visible_message("<span class='warning'>\The [src] suddenly crumbles away.</span>", "<span class='warning'>\The [src] has disintegrated under your onslaught, any secrets it was holding are long gone.</span>")
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("<span class='warning'>\The [src] suddenly crumbles away.</span>")
else
user.visible_message("<span class='warning'>\The [src] suddenly crumbles away.</span>", "<span class='notice'>\The [src] has been whittled away under your careful excavation, but there was nothing of interest inside.</span>")
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)

View File

@@ -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,15 +10,6 @@
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
@@ -82,9 +71,53 @@
chargelevel = 0
DoEffectPulse()
/datum/artifact_effect/proc/getDescription()
. = "<b>"
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"
. += "</b> have been detected <b>"
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."
. += "</b>"
switch(trigger)
if(TRIGGER_TOUCH, TRIGGER_WATER, TRIGGER_ACID, TRIGGER_VOLATILE, TRIGGER_TOXIN)
. += " Activation index involves <b>physical interaction</b> with artifact surface."
if(TRIGGER_FORCE, TRIGGER_ENERGY, TRIGGER_HEAT, TRIGGER_COLD)
. += " Activation index involves <b>energetic interaction</b> with artifact surface."
if(TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO)
. += " Activation index involves <b>precise local atmospheric conditions</b>."
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

View File

@@ -1,29 +1,28 @@
/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.",\
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!",\
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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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))

View File

@@ -1,7 +1,6 @@
/datum/artifact_effect/emp
effecttype = "emp"
effect_type = 3
name = "emp"
effect_type = EFFECT_ELECTRO
/datum/artifact_effect/emp/New()
..()

View File

@@ -1,8 +1,7 @@
/datum/artifact_effect/forcefield
effecttype = "forcefield"
name = "force field"
var/list/created_field = list()
effect_type = 4
effect_type = EFFECT_PARTICLE
/datum/artifact_effect/forcefield/New()
..()

View File

@@ -1,17 +1,10 @@
/datum/artifact_effect/gasco2
effecttype = "gasco2"
var/max_pressure
var/target_percentage
/datum/artifact_effect/heat/New()
..()
effect_type = pick(6,7)
name = "CO2 creation"
/datum/artifact_effect/gasco2/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
max_pressure = rand(115,1000)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasco2/DoEffectTouch(var/mob/user)
if(holder)

View File

@@ -1,14 +1,10 @@
/datum/artifact_effect/gasnitro
effecttype = "gasnitro"
var/max_pressure
var/target_percentage
name = "N2 creation"
/datum/artifact_effect/gasnitro/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
effect_type = pick(6,7)
max_pressure = rand(115,1000)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasnitro/DoEffectTouch(var/mob/user)
if(holder)

View File

@@ -1,14 +1,10 @@
/datum/artifact_effect/gasoxy
effecttype = "gasoxy"
var/max_pressure
name = "O2 creation"
/datum/artifact_effect/gasoxy/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/gasoxy/DoEffectTouch(var/mob/user)
if(holder)

View File

@@ -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)

View File

@@ -1,14 +1,10 @@
/datum/artifact_effect/gassleeping
effecttype = "gassleeping"
var/max_pressure
var/target_percentage
name = "N2O creation"
/datum/artifact_effect/gassleeping/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/gassleeping/DoEffectTouch(var/mob/user)
if(holder)

View File

@@ -1,27 +1,26 @@
/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.",\
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.",\
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)

View File

@@ -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

View File

@@ -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)

View File

@@ -1,7 +1,6 @@
/datum/artifact_effect/hurt
effecttype = I_HURT
effect_type = 5
name = "hurt"
effect_type = EFFECT_ORGANIC
/datum/artifact_effect/hurt/DoEffectTouch(var/mob/toucher)
if(toucher)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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))

View File

@@ -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)

View File

@@ -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("<span class='info'>[src] burns away revealing [inside].</span>",1)
else
for(var/mob/M in viewers(world.view, user))
M.show_message("<span class='info'>[src] burns away into nothing.</span>",1)
qdel(src)
w.remove_fuel(4)
else
for(var/mob/M in viewers(world.view, user))
M.show_message("<span class='info'>A few sparks fly off [src], but nothing else happens.</span>",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("<span class='warning'>[src] crumbles away, leaving some dust and gravel behind.</span>")
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")

View File

@@ -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("<span class='info'>\The [src] is brushed away, revealing \the [inside].</span>")
else
visible_message("<span class='info'>\The [src] is brushed away into nothing.</span>")
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("<span class='info'>\The [src] burns away revealing \the [inside].</span>")
else
visible_message("<span class='info'>\The [src] burns away into nothing.</span>")
qdel(src)
W.remove_fuel(2)
else
visible_message("<span class='info'>A few sparks fly off \the [src], but nothing else happens.</span>")
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("<span class='warning'>[src] crumbles away, leaving some dust and gravel behind.</span>")
qdel(src)

View File

@@ -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)

View File

@@ -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

View File

@@ -1,4 +1,3 @@
/datum/controller/game_controller
var/list/artifact_spawning_turfs = list()
var/list/digsite_spawning_turfs = list()
@@ -10,9 +9,8 @@
#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))
for(var/turf/simulated/mineral/M in world)
if(!M.density)
continue
if(isnull(M.geologic_data))
@@ -21,51 +19,63 @@
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)
while(turfs_to_process.len)
var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process)
var/list/viable_adjacent_turfs = list()
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))
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)
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
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(5,95)))
archeo_turf.finds.Add(new /datum/find(digsite, rand(10, 190)))
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)))
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(5,30)))
archeo_turf.finds.Add(new /datum/find(digsite, rand(35,75)))
archeo_turf.finds.Add(new /datum/find(digsite, rand(75,95)))
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.overlays += archeo_turf.archaeo_overlay
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 != 1 && digsite != 2)
if(isnull(M.artifact_find) && digsite != DIGSITE_GARDEN && digsite != DIGSITE_ANIMAL)
artifact_spawning_turfs.Add(archeo_turf)
//create artifact machinery

View File

@@ -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 = "<br>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,12 +38,10 @@
P.overlays = list("paper_stamped_rd")
src.contents += P
//---- Bookcase
/obj/structure/bookcase/manuals/xenoarchaeology
name = "Xenoarchaeology Manuals bookcase"
New()
/obj/structure/bookcase/manuals/xenoarchaeology/New()
..()
new /obj/item/weapon/book/manual/excavation(src)
new /obj/item/weapon/book/manual/mass_spectrometry(src)
@@ -57,8 +51,6 @@
new /obj/item/weapon/book/manual/stasis(src)
update_icon()
//---- Lockers and closets
/obj/structure/closet/secure_closet/xenoarchaeologist
name = "Xenoarchaeologist Locker"
req_access = list(access_tox_storage)
@@ -69,17 +61,15 @@
icon_broken = "secureresbroken"
icon_off = "secureresoff"
New()
/obj/structure/closet/secure_closet/xenoarchaeologist/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
new /obj/item/weapon/storage/excavation(src)
/obj/structure/closet/excavation
name = "Excavation tools"
@@ -87,11 +77,10 @@
icon_closed = "toolcloset"
icon_opened = "toolclosetopen"
New()
/obj/structure/closet/excavation/New()
..()
sleep(2)
new /obj/item/weapon/storage/belt/archaeology(src)
new /obj/item/weapon/storage/box/excavation(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)
@@ -105,9 +94,6 @@
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/machinery/alarm/isolation
req_one_access = list(access_research, access_atmospherics, access_engine_equip)

View File

@@ -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 << "<span class='notice'>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.</span>"
/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 << "<span class='warning'>\The [I] is full.</span>"
return
if(num_stored_bags < 10)
qdel(I)
num_stored_bags += 1
user << "<span class='notice'>You insert \the [I] into \the [src].</span>"
else
user << "<span class='warning'>\The [src] can not fit any more bags.</span>"
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 << "<span class='warning'>The core sampler is full.</span>"
else if(num_stored_bags < 1)
user << "<span class='warning'>The core sampler is out of sample bags.</span>"
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 << "<span class='notice'>You take a core sample of the [item_to_sample].</span>"
else
user << "<span class='warning'>You are unable to take a sample of [item_to_sample].</span>"
/obj/item/device/core_sampler/attack_self(var/mob/living/user)
if(filled_bag)
user << "<span class='notice'>You eject the full sample bag.</span>"
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 << "<span class='warning'>The core sampler is empty.</span>"

View File

@@ -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()]\]<font color='red'> Tapped [M.name] ([M.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])</font>"
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Tapped by [user.name] ([user.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])</font>"
msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" )
user.attack_log += "\[[time_stamp()]\]<font color='red'> Tapped [M.name] ([M.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.name])</font>"
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Tapped by [user.name] ([user.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.name])</font>"
msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.name])" )

View File

@@ -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 = "<B>Anomalous material analyser</B><BR>"
dat += "<HR>"
if(!owned_scanner)
reconnect_scanner()
if(!owned_scanner)
dat += "<b><font color=red>Unable to locate analysis pad.</font></b><br>"
else if(scan_in_progress)
dat += "Please wait. Analysis in progress.<br>"
dat += "<a href='?src=\ref[src];halt_scan=1'>Halt scanning.</a><br>"
else
dat += "Scanner is ready.<br>"
dat += "<a href='?src=\ref[src];begin_scan=1'>Begin scanning.</a><br>"
dat += "<br>"
dat += "<hr>"
dat += "<a href='?src=\ref[src]'>Refresh</a> <a href='?src=\ref[src];close=1'>Close</a>"
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("<b>[name]</b> states, \"Scanning complete.\"")
var/obj/item/weapon/paper/P = new(src.loc)
P.name = "[src] report #[++report_num]"
P.info = "<b>[src] analysis report #[report_num]</b><br>"
P.info += "<br>"
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("<b>[name]</b> states, \"Cannot scan. Too much interference.\"")
else
scanned_object = O
scan_in_progress = 1
scan_completion_time = world.time + scan_duration
src.visible_message("<b>[name]</b> states, \"Scanning begun.\"")
break
if(!scanned_object)
src.visible_message("<b>[name]</b> states, \"Unable to isolate scan target.\"")
if(href_list["halt_scan"])
scan_in_progress = 0
src.visible_message("<b>[name]</b> 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.<br>The liquid resembles protoplasmic residue supportive of unicellular organism developmental conditions.<br>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.<br><br>"
if(A.my_effect)
out += A.my_effect.getDescription()
if(A.secondary_effect && A.secondary_effect.activated)
out += "<br><br>Internal scans indicate ongoing secondary activity operating independently from primary systems.<br><br>"
out += A.secondary_effect.getDescription()
return out
else
return "[scanned_obj.name] - mundane application."

View File

@@ -1,4 +1,3 @@
/obj/machinery/artifact_harvester
name = "Exotic Particle Harvester"
icon = 'icons/obj/virology.dmi'

View File

@@ -1,4 +1,3 @@
/obj/machinery/artifact_scanpad
name = "Anomaly Scanner Pad"
desc = "Place things here for scanning."

View File

@@ -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()
/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)

View File

@@ -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"
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"
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)

View File

@@ -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."

View File

@@ -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)
cell.charge -= power_use
var/turf/T = get_turf(suspension_field)
if(field_type == "carbon")
for(var/mob/living/carbon/M in T)
for(var/mob/living/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.")]"
M << "<span class='warning'>[pick("You feel tingly","You feel like floating","It is hard to speak","You can barely move")].</span>"
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 = "<b>Multi-phase mobile suspension field generator MK II \"Steadfast\"</b><br>"
if(cell)
var/colour = "red"
@@ -80,25 +60,6 @@
dat += "Enter your ID to begin.<br>"
dat += "<hr>"
if(!locked)
dat += "<b>Select field mode</b><br>"
dat += "[field_type=="carbon"?"<b>":"" ]<A href='?src=\ref[src];select_field=carbon'>Diffracted carbon dioxide laser</A></b><br>"
dat += "[field_type=="nitrogen"?"<b>":"" ]<A href='?src=\ref[src];select_field=nitrogen'>Nitrogen tracer field</A></b><br>"
dat += "[field_type=="potassium"?"<b>":"" ]<A href='?src=\ref[src];select_field=potassium'>Potassium refrigerant cloud</A></b><br>"
dat += "[field_type=="mercury"?"<b>":"" ]<A href='?src=\ref[src];select_field=mercury'>Mercury dispersion wave</A></b><br>"
dat += "[field_type=="iron"?"<b>":"" ]<A href='?src=\ref[src];select_field=iron'>Iron wafer conduction field</A></b><br>"
dat += "[field_type=="calcium"?"<b>":"" ]<A href='?src=\ref[src];select_field=calcium'>Calcium binary deoxidiser</A></b><br>"
dat += "[field_type=="phoron"?"<b>":"" ]<A href='?src=\ref[src];select_field=chlorine'>Chlorine diffusion emissions</A></b><br>"
dat += "[field_type=="phoron"?"<b>":"" ]<A href='?src=\ref[src];select_field=phoron'>Phoron saturated field</A></b><br>"
else
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<br>"
dat += "<hr>"
dat += "<font color='blue'><b>Always wear safety gear and consult a field manual before operation.</b></font><br>"
if(!locked)
@@ -123,8 +84,6 @@
usr << "<span class='warning'>You are unable to activate [src] until it is properly secured on the ground.</span>"
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 << "<span class='info'>You remove the power cell</span>"
/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 << "<span class='info'>You [screwed ? "screw" : "unscrew"] the battery panel.</span>"
else if (istype(W, /obj/item/weapon/crowbar))
if(!locked)
if(!screwed)
if(!suspension_field)
if(open)
open = 0
else
open = 1
user << "<span class='info'>You crowbar the battery panel [open ? "open" : "in place"].</span>"
icon_state = "suspension[open ? (cell ? "1" : "0") : "2"]"
else
user << "<span class='warning'>[src]'s safety locks are engaged, shut it down first.</span>"
else
user << "<span class='warning'>Unscrew [src]'s battery panel first.</span>"
else
user << "<span class='warning'>[src]'s security locks are engaged.</span>"
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 << "<span class='warning'>You are unable to secure [src] while it is active!</span>"
else if (istype(W, /obj/item/weapon/cell))
if(open)
if(panel_open)
if(cell)
user << "<span class='warning'>There is a power cell already installed.</span>"
else
@@ -223,7 +161,7 @@
user << "<span class='warning'>Remove [auth_card] first.</span>"
/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 << "<span class='info'>You no longer feel like floating.</span>"
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
..()

View File

@@ -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 << "<span class='notice'>\icon[src] \The [src] flashes <i>[T.x]:[T.y]:[T.z]</i>.</span>"
/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("<span class='notice'>\The [user] scans \the [A], the air around them humming gently.</span>")
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 << "<span class='notice'>\icon[src] [src] pings.</span>"
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 << "<span class='notice'>\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!</span>"
/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 = "<b>Coordinates with positive matches</b><br>"
dat += "<A href='?src=\ref[src];clear=0'>== Clear all ==</a><br>"
if(current)
dat += "Time: [current.time]<br>"
dat += "Coords: [current.coords]<br>"
dat += "Anomaly depth: [current.depth] cm<br>"
dat += "Anomaly size: [current.clearance] cm<br>"
dat += "Dissonance spread: [current.dissonance_spread]<br>"
var/index = responsive_carriers.Find(current.material)
if(index > 0 && index <= finds_as_strings.len)
dat += "Anomaly material: [finds_as_strings[index]]<br>"
else
dat += "Anomaly material: Unknown<br>"
dat += "<A href='?src=\ref[src];clear=[current.record_index]'>clear entry</a><br>"
else
dat += "Select an entry from the list<br>"
dat += "<br><br><br><br>"
dat += "<hr>"
if(positive_locations.len)
for(var/index = 1 to positive_locations.len)
var/datum/depth_scan/D = positive_locations[index]
dat += "<A href='?src=\ref[src];select=[index]'>[D.time], coords: [D.coords]</a><br>"
else
dat += "No entries recorded."
dat += "<hr>"
dat += "<A href='?src=\ref[src];refresh=1'>Refresh</a><br>"
dat += "<A href='?src=\ref[src];close=1'>Close</a><br>"
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 = "<b>Radio frequency tracker</b><br>"
dat += {"
<A href='byond://?src=\ref[src];reset_tracking=1'>Reset tracker</A><BR>
Frequency:
<A href='byond://?src=\ref[src];freq=-10'>-</A>
<A href='byond://?src=\ref[src];freq=-2'>-</A>
[format_frequency(frequency)]
<A href='byond://?src=\ref[src];freq=2'>+</A>
<A href='byond://?src=\ref[src];freq=10'>+</A><BR>
"}
dat += "<A href='?src=\ref[src];close=1'>Close</a><br>"
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()

View File

@@ -1,87 +1,84 @@
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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"
slot_flags = SLOT_EARS
digspeed = 20
desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)."
excavation_amount = 0.5
excavation_amount = 1
drill_sound = 'sound/weapons/thudswoosh.ogg'
drill_verb = "brushing"
w_class = 2
/obj/item/weapon/pickaxe/one_pick
name = "1/6 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 = 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"
/obj/item/weapon/pickaxe/two_pick
name = "4cm pick"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick3"
icon_state = "pick2"
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)."
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 = "5/6 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 = 5
excavation_amount = 10
drill_sound = 'sound/items/Screwdriver.ogg'
drill_verb = "delicately picking"
w_class = 2
/obj/item/weapon/pickaxe/six_pick
name = "1/1 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 = 6
excavation_amount = 12
drill_sound = 'sound/items/Screwdriver.ogg'
drill_verb = "delicately picking"
w_class = 2
@@ -93,35 +90,35 @@
item_state = "syringe_0"
digspeed = 30
desc = "A smaller, more precise version of the pickaxe (30 centimetre excavation depth)."
excavation_amount = 15
excavation_amount = 30
drill_sound = 'sound/items/Crowbar.ogg'
drill_verb = "clearing"
w_class = 3
w_class = 2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Pack for holding pickaxes
/obj/item/weapon/storage/box/excavation
/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"
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)
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 = 3
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
max_w_class = 2
use_to_pickup = 1
/obj/item/weapon/storage/box/excavation/New()
/obj/item/weapon/storage/excavation/New()
..()
new /obj/item/weapon/pickaxe/brush(src)
new /obj/item/weapon/pickaxe/one_pick(src)
@@ -130,3 +127,25 @@
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()

View File

@@ -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."

View File

@@ -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)

View File

@@ -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"