mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
Rewrites xenoarch
See changelog
This commit is contained in:
72
code/__defines/xenoarcheaology.dm
Normal file
72
code/__defines/xenoarcheaology.dm
Normal 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
|
||||
@@ -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
|
||||
)
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/weapon/ore
|
||||
name = "rock"
|
||||
name = "small rock"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "ore2"
|
||||
w_class = 2
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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."
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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>")
|
||||
@@ -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."
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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,25 +12,24 @@ 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)
|
||||
if(prob(75))
|
||||
secondary_effect.ToggleActivate(0)
|
||||
|
||||
icon_num = rand(0,11)
|
||||
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))
|
||||
19
code/modules/xenoarcheaology/artifacts/artifact_find.dm
Normal file
19
code/modules/xenoarcheaology/artifacts/artifact_find.dm
Normal 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)
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/obj/machinery/replicator
|
||||
name = "alien machine"
|
||||
desc = "It's some kind of pod with strange wires and gadgets all over it."
|
||||
@@ -23,51 +22,50 @@
|
||||
/obj/machinery/replicator/New()
|
||||
..()
|
||||
|
||||
var/list/viables = list(\
|
||||
/obj/item/roller,\
|
||||
/obj/structure/closet/crate,\
|
||||
/obj/structure/closet/acloset,\
|
||||
/mob/living/simple_animal/hostile/mimic,\
|
||||
/mob/living/simple_animal/hostile/viscerator,\
|
||||
/mob/living/simple_animal/hostile/hivebot,\
|
||||
/obj/item/device/analyzer,\
|
||||
/obj/item/device/camera,\
|
||||
/obj/item/device/flash,\
|
||||
/obj/item/device/flashlight,\
|
||||
/obj/item/device/healthanalyzer,\
|
||||
/obj/item/device/multitool,\
|
||||
/obj/item/device/paicard,\
|
||||
/obj/item/device/radio,\
|
||||
/obj/item/device/radio/headset,\
|
||||
/obj/item/device/radio/beacon,\
|
||||
/obj/item/weapon/autopsy_scanner,\
|
||||
/obj/item/weapon/bikehorn,\
|
||||
/obj/item/weapon/bonesetter,\
|
||||
/obj/item/weapon/material/knife/butch,\
|
||||
/obj/item/weapon/caution,\
|
||||
/obj/item/weapon/caution/cone,\
|
||||
/obj/item/weapon/crowbar,\
|
||||
/obj/item/weapon/clipboard,\
|
||||
/obj/item/weapon/cell,\
|
||||
/obj/item/weapon/circular_saw,\
|
||||
/obj/item/weapon/material/hatchet,\
|
||||
/obj/item/weapon/handcuffs,\
|
||||
/obj/item/weapon/hemostat,\
|
||||
/obj/item/weapon/material/knife,\
|
||||
/obj/item/weapon/flame/lighter,\
|
||||
/obj/item/weapon/light/bulb,\
|
||||
/obj/item/weapon/light/tube,\
|
||||
/obj/item/weapon/pickaxe,\
|
||||
/obj/item/weapon/shovel,\
|
||||
/obj/item/weapon/weldingtool,\
|
||||
/obj/item/weapon/wirecutters,\
|
||||
/obj/item/weapon/wrench,\
|
||||
/obj/item/weapon/screwdriver,\
|
||||
/obj/item/weapon/grenade/chem_grenade/cleaner,\
|
||||
/obj/item/weapon/grenade/chem_grenade/metalfoam\
|
||||
)
|
||||
var/list/viables = list(
|
||||
/obj/item/roller,
|
||||
/obj/structure/closet/crate,
|
||||
/obj/structure/closet/acloset,
|
||||
/mob/living/simple_animal/hostile/mimic,
|
||||
/mob/living/simple_animal/hostile/viscerator,
|
||||
/mob/living/simple_animal/hostile/hivebot,
|
||||
/obj/item/device/analyzer,
|
||||
/obj/item/device/camera,
|
||||
/obj/item/device/flash,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/device/healthanalyzer,
|
||||
/obj/item/device/multitool,
|
||||
/obj/item/device/paicard,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/device/radio/headset,
|
||||
/obj/item/device/radio/beacon,
|
||||
/obj/item/weapon/autopsy_scanner,
|
||||
/obj/item/weapon/bikehorn,
|
||||
/obj/item/weapon/bonesetter,
|
||||
/obj/item/weapon/material/knife/butch,
|
||||
/obj/item/weapon/caution,
|
||||
/obj/item/weapon/caution/cone,
|
||||
/obj/item/weapon/crowbar,
|
||||
/obj/item/weapon/clipboard,
|
||||
/obj/item/weapon/cell,
|
||||
/obj/item/weapon/circular_saw,
|
||||
/obj/item/weapon/material/hatchet,
|
||||
/obj/item/weapon/handcuffs,
|
||||
/obj/item/weapon/hemostat,
|
||||
/obj/item/weapon/material/knife,
|
||||
/obj/item/weapon/flame/lighter,
|
||||
/obj/item/weapon/light/bulb,
|
||||
/obj/item/weapon/light/tube,
|
||||
/obj/item/weapon/pickaxe,
|
||||
/obj/item/weapon/shovel,
|
||||
/obj/item/weapon/weldingtool,
|
||||
/obj/item/weapon/wirecutters,
|
||||
/obj/item/weapon/wrench,
|
||||
/obj/item/weapon/screwdriver,
|
||||
/obj/item/weapon/grenade/chem_grenade/cleaner,
|
||||
/obj/item/weapon/grenade/chem_grenade/metalfoam)
|
||||
|
||||
var/quantity = rand(5,15)
|
||||
var/quantity = rand(5, 15)
|
||||
for(var/i=0, i<quantity, i++)
|
||||
var/button_desc = "a [pick("yellow","purple","green","blue","red","orange","white")], "
|
||||
button_desc += "[pick("round","square","diamond","heart","dog","human")] shaped "
|
||||
@@ -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
|
||||
90
code/modules/xenoarcheaology/boulder.dm
Normal file
90
code/modules/xenoarcheaology/boulder.dm
Normal 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)
|
||||
@@ -1,7 +1,5 @@
|
||||
|
||||
//override procs in children as necessary
|
||||
/datum/artifact_effect
|
||||
var/effecttype = "unknown" //purely used for admin checks ingame, not needed any more
|
||||
var/name = "unknown"
|
||||
var/effect = EFFECT_TOUCH
|
||||
var/effectrange = 4
|
||||
var/trigger = TRIGGER_TOUCH
|
||||
@@ -12,20 +10,11 @@
|
||||
var/artifact_id = ""
|
||||
var/effect_type = 0
|
||||
|
||||
//0 = Unknown / none detectable
|
||||
//1 = Concentrated energy
|
||||
//2 = Intermittent psionic wavefront
|
||||
//3 = Electromagnetic energy
|
||||
//4 = Particle field
|
||||
//5 = Organically reactive exotic particles
|
||||
//6 = Interdimensional/bluespace? phasing
|
||||
//7 = Atomic synthesis
|
||||
|
||||
/datum/artifact_effect/New(var/atom/location)
|
||||
..()
|
||||
holder = location
|
||||
effect = rand(0,MAX_EFFECT)
|
||||
trigger = rand(0,MAX_TRIGGER)
|
||||
effect = rand(0, MAX_EFFECT)
|
||||
trigger = rand(0, MAX_TRIGGER)
|
||||
|
||||
//this will be replaced by the excavation code later, but it's here just in case
|
||||
artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
|
||||
@@ -82,9 +71,53 @@
|
||||
chargelevel = 0
|
||||
DoEffectPulse()
|
||||
|
||||
/datum/artifact_effect/proc/getDescription()
|
||||
. = "<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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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))
|
||||
@@ -1,7 +1,6 @@
|
||||
|
||||
/datum/artifact_effect/emp
|
||||
effecttype = "emp"
|
||||
effect_type = 3
|
||||
name = "emp"
|
||||
effect_type = EFFECT_ELECTRO
|
||||
|
||||
/datum/artifact_effect/emp/New()
|
||||
..()
|
||||
@@ -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()
|
||||
..()
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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))
|
||||
@@ -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)
|
||||
@@ -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")
|
||||
67
code/modules/xenoarcheaology/finds/finds.dm
Normal file
67
code/modules/xenoarcheaology/finds/finds.dm
Normal 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)
|
||||
116
code/modules/xenoarcheaology/finds/finds_defines.dm
Normal file
116
code/modules/xenoarcheaology/finds/finds_defines.dm
Normal 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)
|
||||
@@ -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
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/datum/controller/game_controller
|
||||
var/list/artifact_spawning_turfs = list()
|
||||
var/list/digsite_spawning_turfs = list()
|
||||
@@ -10,62 +9,73 @@
|
||||
#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))
|
||||
M.geologic_data = new/datum/geosample(M)
|
||||
M.geologic_data = new /datum/geosample(M)
|
||||
|
||||
if(!prob(XENOARCH_SPAWN_CHANCE))
|
||||
continue
|
||||
|
||||
var/farEnough = 1
|
||||
for(var/A in digsite_spawning_turfs)
|
||||
var/turf/T = A
|
||||
if(T in range(5, M))
|
||||
farEnough = 0
|
||||
break
|
||||
if(!farEnough)
|
||||
continue
|
||||
|
||||
digsite_spawning_turfs.Add(M)
|
||||
|
||||
var/digsite = get_random_digsite_type()
|
||||
var/target_digsite_size = rand(DIGSITESIZE_LOWER, DIGSITESIZE_UPPER)
|
||||
|
||||
var/list/processed_turfs = list()
|
||||
var/list/turfs_to_process = list(M)
|
||||
|
||||
var/list/viable_adjacent_turfs = list()
|
||||
if(target_digsite_size > 1)
|
||||
for(var/turf/simulated/mineral/T in orange(2, M))
|
||||
if(!T.density)
|
||||
continue
|
||||
if(T.finds)
|
||||
continue
|
||||
if(T in processed_turfs)
|
||||
continue
|
||||
viable_adjacent_turfs.Add(T)
|
||||
|
||||
target_digsite_size = min(target_digsite_size, viable_adjacent_turfs.len)
|
||||
|
||||
for(var/i = 1 to target_digsite_size)
|
||||
turfs_to_process += pick_n_take(viable_adjacent_turfs)
|
||||
|
||||
while(turfs_to_process.len)
|
||||
var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process)
|
||||
|
||||
if(target_digsite_size > 1)
|
||||
var/list/viable_adjacent_turfs = orange(1, archeo_turf)
|
||||
for(var/turf/simulated/mineral/T in orange(1, archeo_turf))
|
||||
if(T.finds)
|
||||
continue
|
||||
if(T in processed_turfs)
|
||||
continue
|
||||
viable_adjacent_turfs.Add(T)
|
||||
|
||||
for(var/turf/simulated/mineral/T in viable_adjacent_turfs)
|
||||
if(prob(target_digsite_size/viable_adjacent_turfs.len))
|
||||
turfs_to_process.Add(T)
|
||||
target_digsite_size -= 1
|
||||
if(target_digsite_size <= 0)
|
||||
break
|
||||
|
||||
processed_turfs.Add(archeo_turf)
|
||||
if(isnull(archeo_turf.finds))
|
||||
archeo_turf.finds = list()
|
||||
if(prob(50))
|
||||
archeo_turf.finds.Add(new /datum/find(digsite, rand(5,95)))
|
||||
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
|
||||
@@ -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,22 +38,18 @@
|
||||
P.overlays = list("paper_stamped_rd")
|
||||
src.contents += P
|
||||
|
||||
//---- Bookcase
|
||||
|
||||
/obj/structure/bookcase/manuals/xenoarchaeology
|
||||
name = "Xenoarchaeology Manuals bookcase"
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/book/manual/excavation(src)
|
||||
new /obj/item/weapon/book/manual/mass_spectrometry(src)
|
||||
new /obj/item/weapon/book/manual/materials_chemistry_analysis(src)
|
||||
new /obj/item/weapon/book/manual/anomaly_testing(src)
|
||||
new /obj/item/weapon/book/manual/anomaly_spectroscopy(src)
|
||||
new /obj/item/weapon/book/manual/stasis(src)
|
||||
update_icon()
|
||||
|
||||
//---- Lockers and closets
|
||||
/obj/structure/bookcase/manuals/xenoarchaeology/New()
|
||||
..()
|
||||
new /obj/item/weapon/book/manual/excavation(src)
|
||||
new /obj/item/weapon/book/manual/mass_spectrometry(src)
|
||||
new /obj/item/weapon/book/manual/materials_chemistry_analysis(src)
|
||||
new /obj/item/weapon/book/manual/anomaly_testing(src)
|
||||
new /obj/item/weapon/book/manual/anomaly_spectroscopy(src)
|
||||
new /obj/item/weapon/book/manual/stasis(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/closet/secure_closet/xenoarchaeologist
|
||||
name = "Xenoarchaeologist Locker"
|
||||
@@ -69,17 +61,15 @@
|
||||
icon_broken = "secureresbroken"
|
||||
icon_off = "secureresoff"
|
||||
|
||||
New()
|
||||
..()
|
||||
sleep(2)
|
||||
new /obj/item/clothing/under/rank/scientist(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/clothing/glasses/science(src)
|
||||
new /obj/item/device/radio/headset/headset_sci(src)
|
||||
new /obj/item/weapon/storage/belt/archaeology(src)
|
||||
new /obj/item/weapon/storage/box/excavation(src)
|
||||
return
|
||||
/obj/structure/closet/secure_closet/xenoarchaeologist/New()
|
||||
..()
|
||||
new /obj/item/clothing/under/rank/scientist(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/clothing/glasses/science(src)
|
||||
new /obj/item/device/radio/headset/headset_sci(src)
|
||||
new /obj/item/weapon/storage/belt/archaeology(src)
|
||||
new /obj/item/weapon/storage/excavation(src)
|
||||
|
||||
/obj/structure/closet/excavation
|
||||
name = "Excavation tools"
|
||||
@@ -87,27 +77,23 @@
|
||||
icon_closed = "toolcloset"
|
||||
icon_opened = "toolclosetopen"
|
||||
|
||||
New()
|
||||
..()
|
||||
sleep(2)
|
||||
new /obj/item/weapon/storage/belt/archaeology(src)
|
||||
new /obj/item/weapon/storage/box/excavation(src)
|
||||
new /obj/item/device/flashlight/lantern(src)
|
||||
new /obj/item/device/ano_scanner(src)
|
||||
new /obj/item/device/depth_scanner(src)
|
||||
new /obj/item/device/core_sampler(src)
|
||||
new /obj/item/device/gps(src)
|
||||
new /obj/item/device/beacon_locator(src)
|
||||
new /obj/item/device/radio/beacon(src)
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/weapon/pickaxe(src)
|
||||
new /obj/item/device/measuring_tape(src)
|
||||
new /obj/item/weapon/pickaxe/hand(src)
|
||||
new /obj/item/weapon/storage/bag/fossils(src)
|
||||
new /obj/item/weapon/hand_labeler(src)
|
||||
return
|
||||
|
||||
//---- Isolation room air alarms
|
||||
/obj/structure/closet/excavation/New()
|
||||
..()
|
||||
new /obj/item/weapon/storage/belt/archaeology(src)
|
||||
new /obj/item/weapon/storage/excavation(src)
|
||||
new /obj/item/device/flashlight/lantern(src)
|
||||
new /obj/item/device/ano_scanner(src)
|
||||
new /obj/item/device/depth_scanner(src)
|
||||
new /obj/item/device/core_sampler(src)
|
||||
new /obj/item/device/gps(src)
|
||||
new /obj/item/device/beacon_locator(src)
|
||||
new /obj/item/device/radio/beacon(src)
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/weapon/pickaxe(src)
|
||||
new /obj/item/device/measuring_tape(src)
|
||||
new /obj/item/weapon/pickaxe/hand(src)
|
||||
new /obj/item/weapon/storage/bag/fossils(src)
|
||||
new /obj/item/weapon/hand_labeler(src)
|
||||
|
||||
/obj/machinery/alarm/isolation
|
||||
req_one_access = list(access_research, access_atmospherics, access_engine_equip)
|
||||
165
code/modules/xenoarcheaology/sampling.dm
Normal file
165
code/modules/xenoarcheaology/sampling.dm
Normal 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>"
|
||||
@@ -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])" )
|
||||
157
code/modules/xenoarcheaology/tools/artifact_analyser.dm
Normal file
157
code/modules/xenoarcheaology/tools/artifact_analyser.dm
Normal 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."
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/obj/machinery/artifact_harvester
|
||||
name = "Exotic Particle Harvester"
|
||||
icon = 'icons/obj/virology.dmi'
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/obj/machinery/artifact_scanpad
|
||||
name = "Anomaly Scanner Pad"
|
||||
desc = "Place things here for scanning."
|
||||
@@ -1,16 +1,17 @@
|
||||
/obj/structure/reagent_dispensers/coolanttank
|
||||
name = "coolant tank"
|
||||
desc = "A tank of industrial coolant."
|
||||
desc = "A tank of industrial coolant"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "coolanttank"
|
||||
amount_per_transfer_from_this = 10
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("coolant",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/coolanttank/New()
|
||||
..()
|
||||
reagents.add_reagent("coolant", 1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(Proj.get_structure_damage())
|
||||
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
|
||||
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) // TODO: make this not terrible
|
||||
explode()
|
||||
|
||||
/obj/structure/reagent_dispensers/coolanttank/ex_act()
|
||||
@@ -18,7 +19,6 @@
|
||||
|
||||
/obj/structure/reagent_dispensers/coolanttank/proc/explode()
|
||||
var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread
|
||||
//S.attach(src)
|
||||
S.set_up(5, 0, src.loc)
|
||||
|
||||
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
@@ -1,21 +1,22 @@
|
||||
|
||||
//changes: rad protection up to 100 from 20/50 respectively
|
||||
/obj/item/clothing/suit/bio_suit/anomaly
|
||||
name = "Anomaly suit"
|
||||
desc = "A sealed bio suit capable of insulating against exotic alien energies."
|
||||
icon_state = "engspace_suit"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
|
||||
item_state = "engspace_suit"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
|
||||
|
||||
/obj/item/clothing/head/bio_hood/anomaly
|
||||
name = "Anomaly hood"
|
||||
desc = "A sealed bio hood capable of insulating against exotic alien energies."
|
||||
icon_state = "engspace_helmet"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
|
||||
item_state = "engspace_helmet"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
|
||||
|
||||
/obj/item/clothing/suit/space/anomaly
|
||||
name = "Excavation suit"
|
||||
desc = "A pressure resistant excavation suit partially capable of insulating against exotic alien energies."
|
||||
icon_state = "cespace_suit"
|
||||
item_state = "cespace_suit"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
|
||||
|
||||
@@ -23,4 +24,5 @@
|
||||
name = "Excavation hood"
|
||||
desc = "A pressure resistant excavation hood partially capable of insulating against exotic alien energies."
|
||||
icon_state = "cespace_helmet"
|
||||
item_state = "cespace_helmet"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
|
||||
@@ -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."
|
||||
@@ -8,54 +8,34 @@
|
||||
var/obj/item/weapon/cell/cell
|
||||
var/obj/item/weapon/card/id/auth_card
|
||||
var/locked = 1
|
||||
var/open = 0
|
||||
var/screwed = 1
|
||||
var/field_type = ""
|
||||
var/power_use = 25
|
||||
var/power_use = 5
|
||||
var/obj/effect/suspension_field/suspension_field
|
||||
var/list/secured_mobs = list()
|
||||
|
||||
/obj/machinery/suspension_gen/New()
|
||||
src.cell = new/obj/item/weapon/cell/high(src)
|
||||
..()
|
||||
src.cell = new /obj/item/weapon/cell/high(src)
|
||||
|
||||
/obj/machinery/suspension_gen/process()
|
||||
set background = 1
|
||||
|
||||
if (suspension_field)
|
||||
if(suspension_field)
|
||||
cell.charge -= power_use
|
||||
|
||||
var/turf/T = get_turf(suspension_field)
|
||||
if(field_type == "carbon")
|
||||
for(var/mob/living/carbon/M in T)
|
||||
M.weakened = max(M.weakened, 3)
|
||||
cell.charge -= power_use
|
||||
if(prob(5))
|
||||
M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]"
|
||||
|
||||
if(field_type == "iron")
|
||||
for(var/mob/living/silicon/M in T)
|
||||
M.weakened = max(M.weakened, 3)
|
||||
cell.charge -= power_use
|
||||
if(prob(5))
|
||||
M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]"
|
||||
for(var/mob/living/M in T)
|
||||
M.weakened = max(M.weakened, 3)
|
||||
cell.charge -= power_use
|
||||
if(prob(5))
|
||||
M << "<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
|
||||
..()
|
||||
316
code/modules/xenoarcheaology/tools/tools.dm
Normal file
316
code/modules/xenoarcheaology/tools/tools.dm
Normal 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()
|
||||
@@ -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()
|
||||
61
html/changelogs/Kelenius-fuckCael.yml
Normal file
61
html/changelogs/Kelenius-fuckCael.yml
Normal 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."
|
||||
@@ -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)
|
||||
|
||||
108
polaris.dme
108
polaris.dme
@@ -38,6 +38,7 @@
|
||||
#include "code\__defines\targeting.dm"
|
||||
#include "code\__defines\turfs.dm"
|
||||
#include "code\__defines\unit_tests.dm"
|
||||
#include "code\__defines\xenoarcheaology.dm"
|
||||
#include "code\_compatibility\509\_JSON.dm"
|
||||
#include "code\_compatibility\509\JSON Reader.dm"
|
||||
#include "code\_compatibility\509\JSON Writer.dm"
|
||||
@@ -1882,61 +1883,6 @@
|
||||
#include "code\modules\research\rdmachines.dm"
|
||||
#include "code\modules\research\research.dm"
|
||||
#include "code\modules\research\server.dm"
|
||||
#include "code\modules\research\xenoarchaeology\chemistry.dm"
|
||||
#include "code\modules\research\xenoarchaeology\geosample.dm"
|
||||
#include "code\modules\research\xenoarchaeology\manuals.dm"
|
||||
#include "code\modules\research\xenoarchaeology\master_controller.dm"
|
||||
#include "code\modules\research\xenoarchaeology\misc.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\artifact.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\artifact_autocloner.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\artifact_crystal.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\artifact_gigadrill.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\artifact_replicator.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\artifact_unknown.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effect.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_affect_cold.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_badfeeling.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_cellcharge.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_celldrain.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_dnaswitch.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_emp.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_forcefield.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasco2.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasnitro.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasoxy.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasplasma.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gassleeping.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_goodfeeling.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heal.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heat.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_hurt.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_radiate.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_roboheal.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_robohurt.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_sleepy.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_stun.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_teleport.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds_defines.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds_eguns.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds_fossils.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds_misc.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds_special.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm"
|
||||
#include "code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm"
|
||||
#include "code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm"
|
||||
#include "code\modules\research\xenoarchaeology\machinery\artifact_scanner.dm"
|
||||
#include "code\modules\research\xenoarchaeology\machinery\coolant.dm"
|
||||
#include "code\modules\research\xenoarchaeology\machinery\geosample_scanner.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\ano_device_battery.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\anomaly_suit.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\suspension_generator.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\tools.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\tools_anoscanner.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\tools_coresampler.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\tools_locater.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm"
|
||||
#include "code\modules\scripting\Errors.dm"
|
||||
#include "code\modules\scripting\IDE.dm"
|
||||
#include "code\modules\scripting\Options.dm"
|
||||
@@ -2043,6 +1989,58 @@
|
||||
#include "code\modules\virus2\helpers.dm"
|
||||
#include "code\modules\virus2\isolator.dm"
|
||||
#include "code\modules\virus2\items_devices.dm"
|
||||
#include "code\modules\xenoarcheaology\boulder.dm"
|
||||
#include "code\modules\xenoarcheaology\effect.dm"
|
||||
#include "code\modules\xenoarcheaology\manuals.dm"
|
||||
#include "code\modules\xenoarcheaology\master_controller.dm"
|
||||
#include "code\modules\xenoarcheaology\misc.dm"
|
||||
#include "code\modules\xenoarcheaology\sampling.dm"
|
||||
#include "code\modules\xenoarcheaology\artifacts\artifact.dm"
|
||||
#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm"
|
||||
#include "code\modules\xenoarcheaology\artifacts\autocloner.dm"
|
||||
#include "code\modules\xenoarcheaology\artifacts\crystal.dm"
|
||||
#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm"
|
||||
#include "code\modules\xenoarcheaology\artifacts\replicator.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\badfeeling.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\cellcharge.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\celldrain.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\cold.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\dnaswitch.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\emp.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\forcefield.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\gasco2.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\gasnitro.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\gasoxy.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\gasphoron.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\gassleeping.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\goodfeeling.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\heal.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\heat.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\hurt.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\radiate.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\roboheal.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\robohurt.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\sleepy.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\stun.dm"
|
||||
#include "code\modules\xenoarcheaology\effects\teleport.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\eguns.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\find_spawning.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\finds.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\finds_defines.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\fossils.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\misc.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\special.dm"
|
||||
#include "code\modules\xenoarcheaology\finds\talking.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\coolant_tank.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\equipment.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\suspension_generator.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\tools.dm"
|
||||
#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm"
|
||||
#include "code\modules\xenobio2\_xeno_setup.dm"
|
||||
#include "code\modules\xenobio2\controller.dm"
|
||||
#include "code\modules\xenobio2\machinery\core_extractor.dm"
|
||||
|
||||
Reference in New Issue
Block a user