Xenoarch overhaul/rework thing. (#26005)

* Xenoarch overhaul/rework thing.

Cuts out a bunch of stupid crap from xenoarch in the interest of making it less painful and less confusing.

Fixed stupidity in the find excavation code so it's actually possible to 100% reliably dig stuff up cleanly.

Suspension field generators are no longer necessary and have been removed from all maps. They can still be bought from cargo because you can use them on people and jkn would kill me if I removed that.

You no longer need to heat density separated sample when processing samples. As soon as you mix the lithium sodium tungstate with the ground rock you can throw it into the analysis machines. This makes it *significantly* more streamlined to process samples and also means you aren't basically forced to use a laser scalpel to get anything done.

Distances have all been fixed to be 100cm instead of 200cm per tile.

RP spectrometry machines have been removed and the space on the maps has been replaced with some free space so do whatever with it. As an extension of this I re-mapped the outpost-y sections of roid a bit so that the anomaly/sample lab have the HI/FTS because they were previously in the spectrometry lab.

Fixed artifact destructions not correctly being logged in all cases.

Moved the digsite locator to its own file.

Also fixes #25854

* Forgot to commit roid

* Update excdrill not correctly being divided by 2.

* 1cm brush.

* Typo
This commit is contained in:
Pieter-Jan Briers
2020-03-20 17:24:46 +01:00
committed by GitHub
parent 45f86bad83
commit a3a8c9d97c
32 changed files with 95643 additions and 96121 deletions

View File

@@ -98,27 +98,7 @@
category = "Machine Boards"
build_path = /obj/item/weapon/circuitboard/anom
/datum/design/anom/accelerator
name = "Circuit Design (Accelerator Spectrometer)"
id = "accelerator"
build_path = /obj/item/weapon/circuitboard/anom/accelerator
/datum/design/anom/gas
name = "Circuit Design (Gas Chromatography Spectrometer)"
id = "gaschromatography"
build_path = /obj/item/weapon/circuitboard/anom/gas
/datum/design/anom/hyper
name = "Circuit Design (Hyperspectral Imager)"
id = "hyperspectral"
build_path = /obj/item/weapon/circuitboard/anom/hyper
/datum/design/anom/ion
name = "Circuit Design (Ion Mobility Spectrometer)"
id = "ionmobility"
build_path = /obj/item/weapon/circuitboard/anom/ion
/datum/design/anom/iso
name = "Circuit Design (Isotope Ratio Spectrometer)"
id = "isotoperatio"
build_path = /obj/item/weapon/circuitboard/anom/iso

View File

@@ -54,6 +54,7 @@
/area/research_outpost/spectro
name = "Mass Spectrometry Lab"
icon_state = "anospectro"
lightswitch = FALSE
/area/research_outpost/anomaly
name = "Anomalous Materials Lab"
@@ -107,4 +108,4 @@
/area/research_outpost/xenobot
name = "Research Outpost Xenobotany"
icon_state = "outpost_xenobot"
icon_state = "outpost_xenobot"

View File

@@ -24,15 +24,6 @@ datum/reagent/ground_rock
reagent_state = REAGENT_STATE_SOLID
color = "#A0522D" //rgb: 160, 82, 45, brown
datum/reagent/density_separated_sample
name = "Density separated sample"
id = DENSITY_SEPARATED_SAMPLE
description = "A watery paste used in chemical analysis, there are some chunks floating in it."
reagent_state = REAGENT_STATE_LIQUID
color = "#DEB887" //rgb: 222, 184, 135, light brown
density = 3.79
specheatcap = 3.99
datum/reagent/analysis_sample
name = "Analysis liquid"
id = ANALYSIS_SAMPLE
@@ -49,8 +40,6 @@ datum/reagent/chemical_waste
reagent_state = REAGENT_STATE_LIQUID
color = "#ADFF2F" //rgb: 173, 255, 47, toxic green
/datum/chemical_reaction/lithiumsodiumtungstate //LiNa2WO4, not the easiest chem to mix
name = "Lithium Sodium Tungstate"
id = LITHIUMSODIUMTUNGSTATE
@@ -58,22 +47,13 @@ datum/reagent/chemical_waste
required_reagents = list(LITHIUM = 1, SODIUM = 2, TUNGSTEN = 1, OXYGEN = 4)
result_amount = 8
/datum/chemical_reaction/density_separated_liquid
name = "Density separated sample"
id = DENSITY_SEPARATED_SAMPLE
result = DENSITY_SEPARATED_SAMPLE
secondary_results = list(CHEMICAL_WASTE = 1)
required_reagents = list(GROUND_ROCK = 1, LITHIUMSODIUMTUNGSTATE = 2)
result_amount = 2
/datum/chemical_reaction/analysis_liquid
name = "Analysis sample"
id = ANALYSIS_SAMPLE
result = ANALYSIS_SAMPLE
secondary_results = list(CHEMICAL_WASTE = 1)
required_reagents = list(DENSITY_SEPARATED_SAMPLE = 5)
result_amount = 4
required_temp = 971.15 //Melting point of Sodium tungstate
required_reagents = list(GROUND_ROCK = 1, LITHIUMSODIUMTUNGSTATE = 2)
result_amount = 2
/obj/item/weapon/reagent_containers/glass/solution_tray
name = "solution tray"

View File

@@ -9,8 +9,6 @@
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
var/responsive_reagent = PLASMA
var/apply_material_decorations = FALSE
var/apply_image_decorations = FALSE
@@ -24,7 +22,6 @@
/datum/find/New(var/exc_req)
excavation_required = exc_req
clearance_range = rand(2,6)
dissonance_spread = rand(1500,2500) / 100
/datum/find/proc/create_find(var/atom/loc) //Makes the item. Applies strangeness to it. Returns item
if(prob(5))
@@ -598,12 +595,10 @@
additional_desc = TRUE
/datum/find/gun/spawn_item()
var/obj/item/weapon/gun/projectile/new_gun = new /obj/item/weapon/gun/projectile
new_gun.icon_state = "gun[rand(1,4)]"
new_gun.icon = 'icons/obj/xenoarchaeology.dmi'
new_gun.item_state = new_gun.icon_state
new_gun.inhand_states = list("left_hand" = 'icons/mob/in-hand/left/xenoarch.dmi', "right_hand" = 'icons/mob/in-hand/right/xenoarch.dmi')
new_gun.desc = ""
// use subtypes to change icon_state.
// because gun code relies on initial(icon_state)
var/gun_type = pick(subtypesof(/obj/item/weapon/gun/projectile/xenoarch))
var/obj/item/weapon/gun/projectile/new_gun = new gun_type
//let's get some ammunition in this gun : weighted to pick available ammo
new_gun.caliber = pick(50;list(POINT357 = 1),
@@ -636,6 +631,27 @@
return new_gun
/obj/item/weapon/gun/projectile/xenoarch
icon = 'icons/obj/xenoarchaeology.dmi'
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/xenoarch.dmi', "right_hand" = 'icons/mob/in-hand/right/xenoarch.dmi')
desc = ""
/obj/item/weapon/gun/projectile/xenoarch/gun1
icon_state = "gun1"
item_state = "gun1"
/obj/item/weapon/gun/projectile/xenoarch/gun2
icon_state = "gun2"
item_state = "gun2"
/obj/item/weapon/gun/projectile/xenoarch/gun3
icon_state = "gun3"
item_state = "gun3"
/obj/item/weapon/gun/projectile/xenoarch/gun4
icon_state = "gun4"
item_state = "gun4"
/datum/find/gun/additional_description(var/obj/item/I)
I.desc += "Looks like an antique projectile weapon, you're not sure if it will fire or not."
if(prob(10)) // 10% chance to be a smart gun
@@ -1025,4 +1041,4 @@
qdel(src)
if(istype(T, /turf/unsimulated/mineral))
T:last_find = new_item
T:last_find = new_item

View File

@@ -21,7 +21,6 @@
icon_state = "sliver1" //0-4
w_class = W_CLASS_TINY
//item_state = "electronic"
var/source_rock = "/turf/unsimulated/mineral/"
var/datum/geosample/geological_data
/obj/item/weapon/rocksliver/New()
@@ -34,89 +33,8 @@
// Geosample datum
/datum/geosample
var/age = 0 //age can correspond to different archaeological finds
var/age_thousand = 0
var/age_million = 0
var/age_billion = 0
var/artifact_id = "" //id of a nearby artifact, if there is one
var/artifact_distance = -1 //proportional to distance
var/source_mineral = "chlorine" //machines will pop up a warning telling players that the sample may be confused
var/total_spread = 0
//
//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/unsimulated/mineral/container)
UpdateTurf(container)
//this should only need to be called once
/datum/geosample/proc/UpdateTurf(var/turf/unsimulated/mineral/container)
if(!container || !istype(container))
return
age = rand(1,999)
if(container.mineral)
switch(container.mineral.name)
if("Uranium")
age_million = rand(1, 704)
age_thousand = rand(1,999)
find_presence["potassium"] = rand(1,1000) / 100
source_mineral = "potassium"
if("Iron")
age_thousand = rand(1, 999)
age_million = rand(1, 999)
find_presence["iron"] = rand(1,1000) / 100
source_mineral = "iron"
if("Diamond")
age_thousand = rand(1,999)
age_million = rand(1,999)
find_presence["nitrogen"] = rand(1,1000) / 100
source_mineral = "nitrogen"
if("Gold")
age_thousand = rand(1,999)
age_million = rand(1,999)
age_billion = rand(3,4)
find_presence["iron"] = rand(1,1000) / 100
source_mineral = "iron"
if("Silver")
age_thousand = rand(1,999)
age_million = rand(1,999)
find_presence["iron"] = rand(1,1000) / 100
source_mineral = "iron"
if("Plasma")
age_thousand = rand(1,999)
age_million = rand(1,999)
age_billion = rand(10, 13)
find_presence["plasma"] = rand(1,1000) / 100
source_mineral = "plasma"
if("Clown")
age = rand(-1,-999) //thats the joke
age_thousand = rand(-1,-999)
find_presence["plasma"] = rand(1,1000) / 100
source_mineral = "plasma"
if(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 = F.responsive_reagent
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/unsimulated/mineral/container)
@@ -124,18 +42,21 @@
return
if(container.artifact_find)
artifact_distance = rand()
artifact_distance = rand() // 0-1
artifact_id = container.artifact_find.artifact_id
else
if(SSxenoarch) //Sanity check due to runtimes ~Z
for(var/turf/unsimulated/mineral/T in SSxenoarch.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
SSxenoarch.artifact_spawning_turfs.Remove(T)
return
if(!SSxenoarch) //Sanity check due to runtimes ~Z
return
for(var/turf/unsimulated/mineral/T in SSxenoarch.artifact_spawning_turfs)
if(T.artifact_find)
var/cur_dist = get_dist(container, T)
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
SSxenoarch.artifact_spawning_turfs.Remove(T)
/*
#undef FIND_PLANT

View File

@@ -1,56 +0,0 @@
// This machine shows the age for extremely old finds
/obj/machinery/anomaly/accelerator
name = "Accelerator spectrometer"
/obj/machinery/anomaly/accelerator/New()
. = ..()
component_parts = newlist(
/obj/item/weapon/circuitboard/anom/accelerator,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module
)
RefreshParts()
/obj/machinery/anomaly/accelerator/ScanResults()
var/results = "The scan was inconclusive. Check sample integrity and carrier consistency."
var/datum/geosample/scanned_sample
var/carrier_name
var/num_reagents = 0
for(var/datum/reagent/A in held_container.reagents.reagent_list)
var/datum/reagent/R = A
if(istype(R, /datum/reagent/analysis_sample))
scanned_sample = R.data
else
carrier_name = R.id
num_reagents++
if(num_reagents == 2 && scanned_sample && carrier_name)
var/specifity = GetResultSpecifity(scanned_sample, carrier_name)
results = "Kinetic acceleration of carrier ([carrier_name]) indicates age ([100 * specifity]% accuracy): <br><br>"
if(scanned_sample.age_billion)
var/displayed_age_millions = scanned_sample.age_million + max(scanned_sample.age_million * ((1 - specifity) * (2 * rand() - 1)), 0)
var/displayed_age_billions = scanned_sample.age_billion + max(scanned_sample.age_billion * ((1 - specifity) * (2 * rand() - 1)), 0)
results += "[displayed_age_billions + displayed_age_millions / 1000] billion years.<br>"
else if(scanned_sample.age_million)
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age_thousand * ((1 - specifity) * (4 * rand() - 2)), 0)
var/displayed_age_millions = scanned_sample.age_million + max(scanned_sample.age_million * ((1 - specifity) * (2 * rand() - 1)), 0)
results += "[displayed_age_millions + displayed_age_thousands / 1000] million years.<br>"
else if(scanned_sample.age_thousand)
var/displayed_age = scanned_sample.age + max(scanned_sample.age * ((1 - specifity) * (8 * rand() - 4)), 0)
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age * ((1 - specifity) * (4 * rand() - 2)), 0)
results += "[displayed_age_thousands + displayed_age / 1000] thousand years.<br>"
else
var/displayed_age = scanned_sample.age + max(scanned_sample.age * ((1 - specifity) * (8 * rand() - 4)), 0)
results += "[displayed_age] years.<br>"
results += "<br>Warning, results only valid for ages on the scale of billions of years."
return results

View File

@@ -212,18 +212,6 @@ obj/machinery/anomaly/Topic(href, href_list)
start(user)
//whether the carrier sample matches the possible finds
//results greater than a threshold of 0.6 means a positive result
/obj/machinery/anomaly/proc/GetResultSpecifity(var/datum/geosample/scanned_sample, var/carrier_name)
var/specifity = 0
if(scanned_sample && carrier_name)
if(scanned_sample.find_presence.Find(carrier_name))
specifity = 0.75 * (scanned_sample.find_presence[carrier_name] / scanned_sample.total_spread) + 0.25
else
specifity = rand(0, 0.5)
return specifity
/obj/machinery/anomaly/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = NANOUI_FOCUS)
if (stat & NOPOWER)

View File

@@ -2,7 +2,7 @@
// This machine tells the distance to a nearby artifact, if there is one
/obj/machinery/anomaly/fourier_transform
name = "Fourier Transform spectroscope"
name = "\improper Fourier transform spectroscope"
/obj/machinery/anomaly/fourier_transform/New()
. = ..()
@@ -17,7 +17,7 @@
RefreshParts()
/obj/machinery/anomaly/fourier_transform/ScanResults()
var/results = "The scan was inconclusive. Check sample integrity and carrier consistency."
var/results = "The scan was inconclusive. Check sample integrity."
var/datum/geosample/scanned_sample
@@ -31,7 +31,7 @@
var/distance = scanned_sample.artifact_distance
if(distance > 0)
distance += (2 * rand() - 1) * distance * 0.05
results = "Fourier transform analysis on anomalous energy absorption indicates source located inside emission radius (95% accuracy): [distance]."
results = "Fourier transform analysis on anomalous energy absorption indicates source located inside emission radius (95% accuracy): <b>[distance]</b>."
else
results = "Energy dispersion detected throughout sample consistent with background readings.<br>"

View File

@@ -1,51 +0,0 @@
// This machine shows the materials that are present
/obj/machinery/anomaly/gas_chromatography
name = "Gas Chromatography spectrometer"
/obj/machinery/anomaly/gas_chromatography/New()
. = ..()
component_parts = newlist(
/obj/item/weapon/circuitboard/anom/gas,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module
)
RefreshParts()
/obj/machinery/anomaly/gas_chromatography/ScanResults()
var/results = "The scan was inconclusive. Check sample integrity and carrier consistency."
var/datum/geosample/scanned_sample
var/carrier
var/num_reagents = 0
for(var/datum/reagent/A in held_container.reagents.reagent_list)
var/datum/reagent/R = A
if(istype(R, /datum/reagent/analysis_sample))
scanned_sample = R.data
else
carrier = R.id
num_reagents++
if(num_reagents == 2 && scanned_sample)
var/specifity = GetResultSpecifity(scanned_sample, carrier)
results = "Chromatography partitioning analysis over carrier ([carrier]) indicates the following elements present ([100 * specifity]% accuracy):<br><br>"
var/num_found = 0
for(var/index=1,index <= scanned_sample.find_presence.len, index++)
var/find = scanned_sample.find_presence[index]
if(find && prob(100 * specifity))
results += " - " + finds_as_strings[index] + "<br>"
num_found++
if(!num_found)
results = "Chromatography partitioning results over carrier ([carrier]) to determine elemental makeup were inconclusive.<br>"
if(!carrier)
results += "<br>No carrier detected, scan accuracy affected.<br>"
return results

View File

@@ -1,5 +1,5 @@
/obj/machinery/anomaly/hyperspectral
name = "Hyperspectral Imager"
name = "hyperspectral imager"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "hyperspectral"
light_power = 0.75

View File

@@ -1,59 +0,0 @@
// This machine shows the amount of a certain material that is present
/obj/machinery/anomaly/ion_mobility
name = "Ion Mobility Spectrometer"
desc = "A specialised, complex analysis machine."
icon = 'icons/obj/virology.dmi'
icon_state = "analyser_old"
/obj/machinery/anomaly/ion_mobility/New()
. = ..()
component_parts = newlist(
/obj/item/weapon/circuitboard/anom/ion,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module
)
RefreshParts()
/obj/machinery/anomaly/ion_mobility/ScanResults()
var/results = "The scan was inconclusive. Check sample integrity and carrier consistency."
var/datum/geosample/scanned_sample
var/carrier
var/num_reagents = 0
for(var/datum/reagent/A in held_container.reagents.reagent_list)
var/datum/reagent/R = A
if(istype(R, /datum/reagent/analysis_sample))
scanned_sample = R.data
else
carrier = R.id
num_reagents++
if(num_reagents == 2 && scanned_sample && carrier)
//all necessary components are present
results = "Kinetic analysis on sample's ionic residue in carrier ([carrier]) indicates the dissonance spread:<br><br>"
var/found = 0
if(scanned_sample.find_presence.Find(carrier))
var/dis_ratio = scanned_sample.find_presence[carrier]
var/desc_index = responsive_carriers.Find(carrier)
results += " - [finds_as_strings[desc_index]]: [dis_ratio]<br>"
found++
/*
for(var/index=1,index <= scanned_sample.find_presence.len, index++)
var/find = scanned_sample.find_presence[index]
// to_chat(world, "index: [index], find: [find], response: [responsive_carriers[index]], carrier: [carrier]")
if(find && responsive_carriers[index] == carrier)
results += " - [finds_as_strings[index]] [find * 100]%<br>"
found++
*/
if(!found)
results = "Kinetic analysis on sample's ionic residue in carrier ([carrier]) to determine composition were inconclusive.<br>"
if(carrier == scanned_sample.source_mineral)
results += "Warning, analysis may be contaminated by high quantities of molecular carrier present throughout sample."
return results

View File

@@ -1,63 +0,0 @@
// This machine shows the age for newer finds
/obj/machinery/anomaly/isotope_ratio
name = "Isotope ratio spectrometer"
desc = "A specialised, complex analysis machine."
icon = 'icons/obj/virology.dmi'
icon_state = "analyser_old"
/obj/machinery/anomaly/isotope_ratio/New()
. = ..()
component_parts = newlist(
/obj/item/weapon/circuitboard/anom/iso,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module
)
RefreshParts()
/obj/machinery/anomaly/isotope_ratio/ScanResults()
var/results = "The scan was inconclusive. Check sample integrity and carrier consistency."
var/datum/geosample/scanned_sample
var/carrier_name
var/num_reagents = 0
for(var/datum/reagent/A in held_container.reagents.reagent_list)
var/datum/reagent/R = A
if(istype(R, /datum/reagent/analysis_sample))
scanned_sample = R.data
else
carrier_name = R.id
num_reagents++
if(num_reagents == 2 && scanned_sample && carrier_name)
var/accuracy = GetResultSpecifity(scanned_sample, carrier_name)
accuracy += 0.5 * (1 - accuracy) / scanned_sample.total_spread
if(!accuracy)
accuracy = rand(1, 50)/100
results = "Isotope decay analysis in carrier ([carrier_name]) indicates age ([100 * accuracy]% accuracy): <br><br>"
if(scanned_sample.age_billion)
//scramble the results
var/displayed_age_thousands = rand(0, 999)
var/displayed_age_millions = rand(0, 999)
results += "[displayed_age_millions + displayed_age_thousands / 1000] million years.<br>"
else if(scanned_sample.age_million)
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age_thousand * ((1 - accuracy) * (2 * rand() - 1)), 0)
var/displayed_age_millions = scanned_sample.age_million + max(scanned_sample.age_million * ((1 - accuracy) * (4 * rand() - 2)), 0)
results += "[displayed_age_millions + displayed_age_thousands / 1000] million years.<br>"
else if(scanned_sample.age_thousand)
var/displayed_age = scanned_sample.age + scanned_sample.age * ((1 - accuracy) * (2 * rand() - 1))
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age_thousand * ((1 - accuracy) * (2 * rand() - 1)), 0)
results += "[displayed_age_thousands + displayed_age / 1000] thousand years.<br>"
else
var/displayed_age = scanned_sample.age + max(scanned_sample.age * ((1 - accuracy) * (2 * rand() - 1)), 0)
results += "[displayed_age] years.<br>"
results += "<br>Warning, results only valid up to ages of one billion years."
return results

View File

@@ -14,4 +14,4 @@
update_icon()
/obj/machinery/artifact_scanpad/update_icon()
icon_state = "[initial(icon_state)][owner_console ? owner_console.scan_in_progress : 0]"
icon_state = "[initial(icon_state)][owner_console ? owner_console.scan_in_progress : 0]"

View File

@@ -1,3 +1,6 @@
// No longer necessary for doing xenoarch, but kept in because you can use it on people.
// Still available from cargo.
/obj/machinery/suspension_gen
name = "suspension field generator"
desc = "It has stubby legs bolted up against it's body for stabilising."

View File

@@ -37,7 +37,7 @@
for(var/turf/unsimulated/mineral/T in SSxenoarch.artifact_spawning_turfs)
if(T.artifact_find)
if(T.z == cur_turf.z)
var/cur_dist = get_dist(cur_turf, T) * 2
var/cur_dist = get_dist(cur_turf, T)
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

View File

@@ -21,7 +21,6 @@
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)
@@ -40,16 +39,10 @@
//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.depth = F.excavation_required //0-100% and 0-100cm
D.clearance = F.clearance_range
D.material = F.responsive_reagent
/*
if(M.excavation_minerals.len)
if(M.excavation_minerals[1] < D.depth)
D.depth = M.excavation_minerals[1]
D.clearance = rand(2,6)
D.dissonance_spread = rand(1,1000) / 100
*/
positive_locations.Add(D)
@@ -68,7 +61,6 @@
//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)
@@ -86,7 +78,6 @@
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>"
@@ -138,55 +129,3 @@
usr << browse(null, "window=depth_scanner")
updateSelfDialog()
/obj/item/device/xenoarch_scanner
name = "Xenoarchaeological digsite locator"
desc = "A scanner that checks the surrounding area for potential xenoarch digsites. If it finds any, It will briefly make them visible. Requires mesons for optimal use."
icon_state = "forensic0-old" //placeholder
item_state = "analyzer"
w_class = W_CLASS_SMALL
flags = 0
slot_flags = SLOT_BELT
origin_tech = Tc_ANOMALY+"=1"
var/cooldown = 0
var/adv = FALSE
/obj/item/device/xenoarch_scanner/adv
name = "Advanced Xenoarchaeological digsite locator"
icon_state = "unknown"
desc = "A scanner that scans the surrounding area for potential xenoarch digsites, highlighting them temporarily in a colour associated with their responsive reagent. Requires mesons for optimal use."
adv = TRUE
/obj/item/device/xenoarch_scanner/adv/examine(mob/user)
..()
to_chat(user, "<span class = 'notice'>It has a list of colour codes:</span>")
for(var/i in color_from_find_reagent)
to_chat(user, "[i] = <span style = 'color:[color_from_find_reagent[i]];'>this colour</span>")
/obj/item/device/xenoarch_scanner/attack_self(mob/user)
if(world.time > cooldown + 4 SECONDS)
var/client/C = user.client
if(!C)
return
cooldown = world.time
for(var/turf/unsimulated/mineral/M in range(7, user))
if(M.finds.len)
var/datum/find/F = M.finds[1]
var/new_icon_state
var/new_color
if(adv)
new_icon_state = "find_overlay"
new_color = color_from_find_reagent[F.responsive_reagent]
else
new_icon_state = pick("archaeo1","archaeo2","archaeo3")
var/image/I = image('icons/turf/mine_overlays.dmi', loc = M, icon_state = new_icon_state, layer = UNDER_HUD_LAYER)
if(new_color)
I.color = new_color
I.plane = HUD_PLANE
C.images += I
spawn(1 SECONDS)
animate(I, alpha = 0, time = 2 SECONDS)
spawn(3 SECONDS)
if(C)
C.images -= I

View File

@@ -0,0 +1,50 @@
/obj/item/device/xenoarch_scanner
name = "xenoarchaeological digsite locator"
desc = "A scanner that checks the surrounding area for potential xenoarch digsites. If it finds any, It will briefly make them visible. Requires mesons for optimal use."
icon_state = "forensic0-old" //placeholder
item_state = "analyzer"
w_class = W_CLASS_SMALL
flags = 0
slot_flags = SLOT_BELT
origin_tech = Tc_ANOMALY+"=1"
var/cooldown = 0
var/adv = FALSE
/obj/item/device/xenoarch_scanner/adv
name = "advanced xenoarchaeological digsite locator"
icon_state = "unknown"
desc = "A scanner that scans the surrounding area for potential xenoarch digsites, highlighting them temporarily in a colour associated with their responsive reagent. Requires mesons for optimal use."
adv = TRUE
/obj/item/device/xenoarch_scanner/adv/examine(mob/user)
..()
to_chat(user, "<span class = 'notice'>It has a list of colour codes:</span>")
for(var/i in color_from_find_reagent)
to_chat(user, "[i] = <span style = 'color:[color_from_find_reagent[i]];'>this colour</span>")
/obj/item/device/xenoarch_scanner/attack_self(mob/user)
if(world.time > cooldown + 4 SECONDS)
var/client/C = user.client
if(!C)
return
cooldown = world.time
for(var/turf/unsimulated/mineral/M in range(7, user))
if(M.finds.len)
var/datum/find/F = M.finds[1]
var/new_icon_state
var/new_color
if(adv)
new_icon_state = "find_overlay"
new_color = color_from_find_reagent[F.responsive_reagent]
else
new_icon_state = pick("archaeo1","archaeo2","archaeo3")
var/image/I = image('icons/turf/mine_overlays.dmi', loc = M, icon_state = new_icon_state, layer = UNDER_HUD_LAYER)
if(new_color)
I.color = new_color
I.plane = HUD_PLANE
C.images += I
spawn(1 SECONDS)
animate(I, alpha = 0, time = 2 SECONDS)
spawn(3 SECONDS)
if(C)
C.images -= I

View File

@@ -4,7 +4,7 @@
icon_state = "excavationdrill0"
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/xenoarch.dmi', "right_hand" = 'icons/mob/in-hand/right/xenoarch.dmi')
item_state = "excavationdrill"
excavation_amount = 0.5
excavation_amount = 1
toolspeed = 0.3
desc = "Basic archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The tip is adjustable from 1 to 30 cms."
toolsounds = list('sound/weapons/thudswoosh.ogg')
@@ -16,33 +16,32 @@
hitsound = 'sound/weapons/circsawhit.ogg'
/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob)
var/depth = input("Put the desired depth (1-30 centimeters).", "Set Depth", excavation_amount*2) as num
if(depth>30 || depth<1)
var/depth = round(input("Put the desired depth (1-15 centimeters).", "Set Depth", excavation_amount) as num)
if(depth>15 || depth<1)
to_chat(user, "<span class='notice'>Invalid depth.</span>")
return
excavation_amount = depth/2
excavation_amount = depth
to_chat(user, "<span class='notice'>You set the depth to [depth]cm.</span>")
if (depth<4)
if (depth<2)
icon_state = "excavationdrill0"
else if (depth >=4 && depth <8)
else if (depth >=2 && depth <4)
icon_state = "excavationdrill1"
else if (depth >=8 && depth <12)
else if (depth >=4 && depth <6)
icon_state = "excavationdrill2"
else if (depth >=12 && depth <16)
else if (depth >=6 && depth <8)
icon_state = "excavationdrill3"
else if (depth >=16 && depth <20)
else if (depth >=8 && depth <10)
icon_state = "excavationdrill4"
else if (depth >=20 && depth <24)
else if (depth >=10 && depth <12)
icon_state = "excavationdrill5"
else if (depth >=24 && depth <28)
else if (depth >=12 && depth <14)
icon_state = "excavationdrill6"
else
icon_state = "excavationdrill7"
/obj/item/weapon/pickaxe/excavationdrill/examine(mob/user)
..()
var/depth = excavation_amount*2
to_chat(user, "<span class='info'>It is currently set at [depth]cm.</span>")
to_chat(user, "<span class='info'>It is currently set at [excavation_amount]cm.</span>")
/obj/item/weapon/pickaxe/excavationdrill/adv
name = "diamond excavation drill"
@@ -54,25 +53,25 @@
desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The diamond tip is adjustable from 1 to 100 cms."
/obj/item/weapon/pickaxe/excavationdrill/adv/attack_self(mob/user as mob)
var/depth = input("Put the desired depth (1-100 centimeters).", "Set Depth", excavation_amount*2) as num
if(depth>100 || depth<1)
var/depth = round(input("Put the desired depth (1-50 centimeters).", "Set Depth", excavation_amount) as num)
if(depth>50 || depth<1)
to_chat(user, "<span class='notice'>Invalid depth.</span>")
return
excavation_amount = depth/2
excavation_amount = depth
to_chat(user, "<span class='notice'>You set the depth to [depth]cm.</span>")
if (depth<12)
if (depth<6)
icon_state = "Dexcavationdrill0"
else if (depth >=12 && depth <24)
else if (depth >=6 && depth <12)
icon_state = "Dexcavationdrill1"
else if (depth >=24 && depth <36)
else if (depth >=12 && depth <18)
icon_state = "Dexcavationdrill2"
else if (depth >=36 && depth <48)
else if (depth >=18 && depth <24)
icon_state = "Dexcavationdrill3"
else if (depth >=48 && depth <60)
else if (depth >=24 && depth <30)
icon_state = "Dexcavationdrill4"
else if (depth >=60 && depth <72)
else if (depth >=30 && depth <36)
icon_state = "Dexcavationdrill5"
else if (depth >=72 && depth <84)
else if (depth >=36 && depth <42)
icon_state = "Dexcavationdrill6"
else
icon_state = "Dexcavationdrill7"
icon_state = "Dexcavationdrill7"

View File

@@ -9,78 +9,66 @@
item_state = "syringe_0"
toolspeed = 0.2
desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)."
excavation_amount = 0.5
excavation_amount = 1
toolsounds = list('sound/weapons/thudswoosh.ogg')
drill_verb = "brushing"
w_class = W_CLASS_SMALL
/obj/item/weapon/pickaxe/one_pick
name = "2 cm pick"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick1"
item_state = "syringe_0"
toolspeed = 0.2
desc = "A miniature excavation tool for precise digging (2 centimetre excavation depth)."
excavation_amount = 1
toolsounds = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
w_class = W_CLASS_SMALL
/obj/item/weapon/pickaxe/two_pick
name = "4 cm pick"
name = "2 cm pick"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick2"
item_state = "syringe_0"
toolspeed = 0.2
desc = "A miniature excavation tool for precise digging (4 centimetre excavation depth)."
desc = "A miniature excavation tool for precise digging (2 centimetre excavation depth)."
excavation_amount = 2
toolsounds = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
w_class = W_CLASS_SMALL
/obj/item/weapon/pickaxe/three_pick
name = "6 cm pick"
name = "3 cm pick"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick3"
item_state = "syringe_0"
toolspeed = 0.2
desc = "A miniature excavation tool for precise digging (6 centimetre excavation depth)."
desc = "A miniature excavation tool for precise digging (3 centimetre excavation depth)."
excavation_amount = 3
toolsounds = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
w_class = W_CLASS_SMALL
/obj/item/weapon/pickaxe/four_pick
name = "8 cm pick"
name = "4 cm pick"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick4"
item_state = "syringe_0"
toolspeed = 0.2
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
toolsounds = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
w_class = W_CLASS_SMALL
/obj/item/weapon/pickaxe/five_pick
name = "10 cm pick"
name = "5 cm pick"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick5"
item_state = "syringe_0"
toolspeed = 0.2
desc = "A miniature excavation tool for precise digging (10 centimetre excavation depth)."
desc = "A miniature excavation tool for precise digging (5 centimetre excavation depth)."
excavation_amount = 5
toolsounds = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
w_class = W_CLASS_SMALL
/obj/item/weapon/pickaxe/six_pick
name = "12 cm pick"
name = "6 cm pick"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pick6"
item_state = "syringe_0"
toolspeed = 0.2
desc = "A miniature excavation tool for precise digging (12 centimetre excavation depth)."
desc = "A miniature excavation tool for precise digging (6 centimetre excavation depth)."
excavation_amount = 6
toolsounds = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
@@ -92,7 +80,7 @@
icon_state = "pick_hand"
item_state = "syringe_0"
toolspeed = 0.3
desc = "A smaller, more precise version of the pickaxe (30 centimetre excavation depth)."
desc = "A smaller, more precise version of the pickaxe (15 centimetre excavation depth)."
excavation_amount = 15
toolsounds = list('sound/items/Crowbar.ogg')
drill_verb = "clearing"
@@ -108,10 +96,9 @@
desc = "A set of picks for excavation."
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots = 7
storage_slots = 6
w_class = W_CLASS_SMALL
can_only_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",\
@@ -124,7 +111,6 @@
/obj/item/weapon/storage/box/excavation/New()
..()
new /obj/item/weapon/pickaxe/brush(src)
new /obj/item/weapon/pickaxe/one_pick(src)
new /obj/item/weapon/pickaxe/two_pick(src)
new /obj/item/weapon/pickaxe/three_pick(src)
new /obj/item/weapon/pickaxe/four_pick(src)