mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
new analysis machines, fleshed out some existing ones to be functional, new chemical reagents,
Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
235
baystation12.dme
235
baystation12.dme
@@ -7,229 +7,11 @@
|
||||
// BEGIN_FILE_DIR
|
||||
#define FILE_DIR .
|
||||
#define FILE_DIR "code"
|
||||
#define FILE_DIR "code/ATMOSPHERICS"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components/unary"
|
||||
#define FILE_DIR "code/controllers"
|
||||
#define FILE_DIR "code/datums"
|
||||
#define FILE_DIR "code/datums/diseases"
|
||||
#define FILE_DIR "code/datums/helper_datums"
|
||||
#define FILE_DIR "code/datums/organs"
|
||||
#define FILE_DIR "code/datums/spells"
|
||||
#define FILE_DIR "code/defines"
|
||||
#define FILE_DIR "code/defines/obj"
|
||||
#define FILE_DIR "code/defines/obj/clothing"
|
||||
#define FILE_DIR "code/defines/procs"
|
||||
#define FILE_DIR "code/defines/sd_procs"
|
||||
#define FILE_DIR "code/FEA"
|
||||
#define FILE_DIR "code/game"
|
||||
#define FILE_DIR "code/game/area"
|
||||
#define FILE_DIR "code/game/events"
|
||||
#define FILE_DIR "code/game/events/EventProcs"
|
||||
#define FILE_DIR "code/game/events/Events"
|
||||
#define FILE_DIR "code/game/gamemodes"
|
||||
#define FILE_DIR "code/game/gamemodes/autotraitor"
|
||||
#define FILE_DIR "code/game/gamemodes/blob"
|
||||
#define FILE_DIR "code/game/gamemodes/blob/blobs"
|
||||
#define FILE_DIR "code/game/gamemodes/changeling"
|
||||
#define FILE_DIR "code/game/gamemodes/cult"
|
||||
#define FILE_DIR "code/game/gamemodes/epidemic"
|
||||
#define FILE_DIR "code/game/gamemodes/events"
|
||||
#define FILE_DIR "code/game/gamemodes/events/holidays"
|
||||
#define FILE_DIR "code/game/gamemodes/extended"
|
||||
#define FILE_DIR "code/game/gamemodes/malfunction"
|
||||
#define FILE_DIR "code/game/gamemodes/meme"
|
||||
#define FILE_DIR "code/game/gamemodes/meteor"
|
||||
#define FILE_DIR "code/game/gamemodes/nuclear"
|
||||
#define FILE_DIR "code/game/gamemodes/revolution"
|
||||
#define FILE_DIR "code/game/gamemodes/sandbox"
|
||||
#define FILE_DIR "code/game/gamemodes/traitor"
|
||||
#define FILE_DIR "code/game/gamemodes/wizard"
|
||||
#define FILE_DIR "code/game/jobs"
|
||||
#define FILE_DIR "code/game/jobs/job"
|
||||
#define FILE_DIR "code/game/machinery"
|
||||
#define FILE_DIR "code/game/machinery/atmoalter"
|
||||
#define FILE_DIR "code/game/machinery/bots"
|
||||
#define FILE_DIR "code/game/machinery/camera"
|
||||
#define FILE_DIR "code/game/machinery/computer"
|
||||
#define FILE_DIR "code/game/machinery/doors"
|
||||
#define FILE_DIR "code/game/machinery/embedded_controller"
|
||||
#define FILE_DIR "code/game/machinery/kitchen"
|
||||
#define FILE_DIR "code/game/machinery/pipe"
|
||||
#define FILE_DIR "code/game/machinery/telecomms"
|
||||
#define FILE_DIR "code/game/magic"
|
||||
#define FILE_DIR "code/game/mecha"
|
||||
#define FILE_DIR "code/game/mecha/combat"
|
||||
#define FILE_DIR "code/game/mecha/equipment"
|
||||
#define FILE_DIR "code/game/mecha/equipment/tools"
|
||||
#define FILE_DIR "code/game/mecha/equipment/weapons"
|
||||
#define FILE_DIR "code/game/mecha/medical"
|
||||
#define FILE_DIR "code/game/mecha/working"
|
||||
#define FILE_DIR "code/game/objects"
|
||||
#define FILE_DIR "code/game/objects/closets"
|
||||
#define FILE_DIR "code/game/objects/closets/secure"
|
||||
#define FILE_DIR "code/game/objects/effects"
|
||||
#define FILE_DIR "code/game/objects/effects/decals"
|
||||
#define FILE_DIR "code/game/objects/effects/decals/Cleanable"
|
||||
#define FILE_DIR "code/game/objects/effects/spawners"
|
||||
#define FILE_DIR "code/game/objects/items"
|
||||
#define FILE_DIR "code/game/objects/items/devices"
|
||||
#define FILE_DIR "code/game/objects/items/devices/PDA"
|
||||
#define FILE_DIR "code/game/objects/items/devices/radio"
|
||||
#define FILE_DIR "code/game/objects/items/robot"
|
||||
#define FILE_DIR "code/game/objects/items/stacks"
|
||||
#define FILE_DIR "code/game/objects/items/stacks/sheets"
|
||||
#define FILE_DIR "code/game/objects/items/stacks/tiles"
|
||||
#define FILE_DIR "code/game/objects/items/weapons"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/grenades"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/implants"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/secstorage"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/storage"
|
||||
#define FILE_DIR "code/game/objects/items/weapons/tanks"
|
||||
#define FILE_DIR "code/game/objects/storage"
|
||||
#define FILE_DIR "code/game/objects/structures"
|
||||
#define FILE_DIR "code/game/objects/structures/crates_lockers"
|
||||
#define FILE_DIR "code/game/objects/structures/crates_lockers/closets"
|
||||
#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure"
|
||||
#define FILE_DIR "code/game/objects/structures/stool_bed_chair_nest"
|
||||
#define FILE_DIR "code/game/player"
|
||||
#define FILE_DIR "code/game/structure"
|
||||
#define FILE_DIR "code/game/turfs"
|
||||
#define FILE_DIR "code/game/turfs/simulated"
|
||||
#define FILE_DIR "code/game/turfs/space"
|
||||
#define FILE_DIR "code/game/turfs/unsimulated"
|
||||
#define FILE_DIR "code/game/vehicles"
|
||||
#define FILE_DIR "code/game/vehicles/airtight"
|
||||
#define FILE_DIR "code/game/verbs"
|
||||
#define FILE_DIR "code/js"
|
||||
#define FILE_DIR "code/modules"
|
||||
#define FILE_DIR "code/modules/admin"
|
||||
#define FILE_DIR "code/modules/admin/DB ban"
|
||||
#define FILE_DIR "code/modules/admin/permissionverbs"
|
||||
#define FILE_DIR "code/modules/admin/verbs"
|
||||
#define FILE_DIR "code/modules/assembly"
|
||||
#define FILE_DIR "code/modules/awaymissions"
|
||||
#define FILE_DIR "code/modules/awaymissions/maploader"
|
||||
#define FILE_DIR "code/modules/chemical"
|
||||
#define FILE_DIR "code/modules/client"
|
||||
#define FILE_DIR "code/modules/clothing"
|
||||
#define FILE_DIR "code/modules/clothing/glasses"
|
||||
#define FILE_DIR "code/modules/clothing/gloves"
|
||||
#define FILE_DIR "code/modules/clothing/head"
|
||||
#define FILE_DIR "code/modules/clothing/masks"
|
||||
#define FILE_DIR "code/modules/clothing/shoes"
|
||||
#define FILE_DIR "code/modules/clothing/spacesuits"
|
||||
#define FILE_DIR "code/modules/clothing/suits"
|
||||
#define FILE_DIR "code/modules/clothing/under"
|
||||
#define FILE_DIR "code/modules/clothing/under/jobs"
|
||||
#define FILE_DIR "code/modules/clothing/uniforms"
|
||||
#define FILE_DIR "code/modules/critters"
|
||||
#define FILE_DIR "code/modules/critters/hivebots"
|
||||
#define FILE_DIR "code/modules/customitems"
|
||||
#define FILE_DIR "code/modules/DetectiveWork"
|
||||
#define FILE_DIR "code/modules/flufftext"
|
||||
#define FILE_DIR "code/modules/food"
|
||||
#define FILE_DIR "code/modules/genetics"
|
||||
#define FILE_DIR "code/modules/icon generation"
|
||||
#define FILE_DIR "code/modules/library"
|
||||
#define FILE_DIR "code/modules/liquid"
|
||||
#define FILE_DIR "code/modules/maps"
|
||||
#define FILE_DIR "code/modules/mining"
|
||||
#define FILE_DIR "code/modules/mob"
|
||||
#define FILE_DIR "code/modules/mob/dead"
|
||||
#define FILE_DIR "code/modules/mob/dead/observer"
|
||||
#define FILE_DIR "code/modules/mob/living"
|
||||
#define FILE_DIR "code/modules/mob/living/blob"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/larva"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/alien/special"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/amorph"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/brain"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/human"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/metroid"
|
||||
#define FILE_DIR "code/modules/mob/living/carbon/monkey"
|
||||
#define FILE_DIR "code/modules/mob/living/parasite"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/ai"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/ai/freelook"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/decoy"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/pai"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/robot"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
|
||||
#define FILE_DIR "code/modules/mob/new_player"
|
||||
#define FILE_DIR "code/modules/mob/simple_animal"
|
||||
#define FILE_DIR "code/modules/paperwork"
|
||||
#define FILE_DIR "code/modules/power"
|
||||
#define FILE_DIR "code/modules/power/antimatter"
|
||||
#define FILE_DIR "code/modules/power/singularity"
|
||||
#define FILE_DIR "code/modules/power/singularity/particle_accelerator"
|
||||
#define FILE_DIR "code/modules/projectiles"
|
||||
#define FILE_DIR "code/modules/projectiles/ammunition"
|
||||
#define FILE_DIR "code/modules/projectiles/guns"
|
||||
#define FILE_DIR "code/modules/projectiles/guns/energy"
|
||||
#define FILE_DIR "code/modules/projectiles/guns/projectile"
|
||||
#define FILE_DIR "code/modules/projectiles/projectile"
|
||||
#define FILE_DIR "code/modules/reagents"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks/bottle"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/food/snacks"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/glass"
|
||||
#define FILE_DIR "code/modules/reagents/reagent_containers/glass/bottle"
|
||||
#define FILE_DIR "code/modules/recycling"
|
||||
#define FILE_DIR "code/modules/research"
|
||||
#define FILE_DIR "code/modules/research/xenoarchaeology"
|
||||
#define FILE_DIR "code/modules/scripting"
|
||||
#define FILE_DIR "code/modules/scripting/AST"
|
||||
#define FILE_DIR "code/modules/scripting/AST/Operators"
|
||||
#define FILE_DIR "code/modules/scripting/Implementations"
|
||||
#define FILE_DIR "code/modules/scripting/Interpreter"
|
||||
#define FILE_DIR "code/modules/scripting/Parser"
|
||||
#define FILE_DIR "code/modules/scripting/Scanner"
|
||||
#define FILE_DIR "code/modules/security levels"
|
||||
#define FILE_DIR "code/TriDimension"
|
||||
#define FILE_DIR "code/unused"
|
||||
#define FILE_DIR "code/unused/beast"
|
||||
#define FILE_DIR "code/unused/computer2"
|
||||
#define FILE_DIR "code/unused/disease2"
|
||||
#define FILE_DIR "code/unused/gamemodes"
|
||||
#define FILE_DIR "code/unused/hivebot"
|
||||
#define FILE_DIR "code/unused/mining"
|
||||
#define FILE_DIR "code/unused/optics"
|
||||
#define FILE_DIR "code/unused/pda2"
|
||||
#define FILE_DIR "code/unused/powerarmor"
|
||||
#define FILE_DIR "code/unused/spacecraft"
|
||||
#define FILE_DIR "code/WorkInProgress"
|
||||
#define FILE_DIR "code/WorkInProgress/AI_Visibility"
|
||||
#define FILE_DIR "code/WorkInProgress/animusstation"
|
||||
#define FILE_DIR "code/WorkInProgress/Apples"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
|
||||
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
|
||||
#define FILE_DIR "code/WorkInProgress/carn"
|
||||
#define FILE_DIR "code/WorkInProgress/Chinsky"
|
||||
#define FILE_DIR "code/WorkInProgress/mapload"
|
||||
#define FILE_DIR "code/WorkInProgress/Mini"
|
||||
#define FILE_DIR "code/WorkInProgress/Mloc"
|
||||
#define FILE_DIR "code/WorkInProgress/organs"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported/Abi79"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported/Bureaucracy"
|
||||
#define FILE_DIR "code/WorkInProgress/Ported/Spawners"
|
||||
#define FILE_DIR "code/WorkInProgress/SkyMarshal"
|
||||
#define FILE_DIR "code/WorkInProgress/Tastyfish"
|
||||
#define FILE_DIR "code/WorkInProgress/virus2"
|
||||
#define FILE_DIR "code/WorkInProgress/virus2/Disease2"
|
||||
#define FILE_DIR "code/WorkInProgress/Wrongnumber"
|
||||
#define FILE_DIR "code/ZAS"
|
||||
#define FILE_DIR "html"
|
||||
#define FILE_DIR "icons"
|
||||
#define FILE_DIR "icons/48x48"
|
||||
@@ -238,6 +20,7 @@
|
||||
#define FILE_DIR "icons/misc"
|
||||
#define FILE_DIR "icons/mob"
|
||||
#define FILE_DIR "icons/mob/human_races"
|
||||
#define FILE_DIR "icons/mob/skin"
|
||||
#define FILE_DIR "icons/obj"
|
||||
#define FILE_DIR "icons/obj/assemblies"
|
||||
#define FILE_DIR "icons/obj/atmospherics"
|
||||
@@ -251,9 +34,7 @@
|
||||
#define FILE_DIR "icons/turf"
|
||||
#define FILE_DIR "icons/vehicles"
|
||||
#define FILE_DIR "icons/vending_icons"
|
||||
#define FILE_DIR "interface"
|
||||
#define FILE_DIR "maps"
|
||||
#define FILE_DIR "maps/RandomZLevels"
|
||||
#define FILE_DIR "sound"
|
||||
#define FILE_DIR "sound/AI"
|
||||
#define FILE_DIR "sound/ambience"
|
||||
@@ -268,8 +49,6 @@
|
||||
#define FILE_DIR "sound/violin"
|
||||
#define FILE_DIR "sound/voice"
|
||||
#define FILE_DIR "sound/weapons"
|
||||
#define FILE_DIR "tools"
|
||||
#define FILE_DIR "tools/Redirector"
|
||||
// END_FILE_DIR
|
||||
|
||||
// BEGIN_PREFERENCES
|
||||
@@ -1293,9 +1072,16 @@
|
||||
#include "code\modules\research\research.dm"
|
||||
#include "code\modules\research\research_shuttle.dm"
|
||||
#include "code\modules\research\server.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis_accelerator.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis_fourier_transform.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis_gas_chromatography.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis_hyperspectral.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis_ion_mobility.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis_radiometric.dm"
|
||||
#include "code\modules\research\xenoarchaeology\analysis_scanner.dm"
|
||||
#include "code\modules\research\xenoarchaeology\archaeo_chem.dm"
|
||||
#include "code\modules\research\xenoarchaeology\archaeo_excavate.dm"
|
||||
#include "code\modules\research\xenoarchaeology\archaeo_machinery.dm"
|
||||
#include "code\modules\research\xenoarchaeology\archaeo_tools.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact.dm"
|
||||
#include "code\modules\research\xenoarchaeology\artifact_analysis.dm"
|
||||
@@ -1306,8 +1092,11 @@
|
||||
#include "code\modules\research\xenoarchaeology\artifact_synthetic.dm"
|
||||
#include "code\modules\research\xenoarchaeology\bunsen_burner.dm"
|
||||
#include "code\modules\research\xenoarchaeology\core_sampler.dm"
|
||||
#include "code\modules\research\xenoarchaeology\crystal.dm"
|
||||
#include "code\modules\research\xenoarchaeology\finds.dm"
|
||||
#include "code\modules\research\xenoarchaeology\fossils.dm"
|
||||
#include "code\modules\research\xenoarchaeology\geosample.dm"
|
||||
#include "code\modules\research\xenoarchaeology\global_placeholder.dm"
|
||||
#include "code\modules\research\xenoarchaeology\readme.dm"
|
||||
#include "code\modules\research\xenoarchaeology\tools.dm"
|
||||
#include "code\modules\scripting\Errors.dm"
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
|
||||
/turf/simulated/mineral/New()
|
||||
|
||||
src.geological_data = new /datum/geosample(src)
|
||||
|
||||
spawn(1)
|
||||
var/turf/T
|
||||
if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space)) || (istype(get_step(src, NORTH), /turf/simulated/shuttle/floor)))
|
||||
@@ -55,9 +57,6 @@
|
||||
if (T)
|
||||
T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=6)
|
||||
|
||||
src.geological_data = new /datum/geosample
|
||||
src.geological_data.UpdateTurf(src)
|
||||
|
||||
if (mineralName && mineralAmt && spread && spreadChance)
|
||||
if(prob(spreadChance))
|
||||
if(istype(get_step(src, SOUTH), /turf/simulated/mineral/random))
|
||||
@@ -286,8 +285,7 @@
|
||||
O = new /obj/item/weapon/ore/clown(src)
|
||||
if(O)
|
||||
if(!src.geological_data)
|
||||
src.geological_data = new /datum/geosample
|
||||
src.geological_data.UpdateTurf(src)
|
||||
src.geological_data = new /datum/geosample(src)
|
||||
O.geological_data = src.geological_data
|
||||
|
||||
if (prob(src.artifactChance))
|
||||
|
||||
140
code/modules/research/xenoarchaeology/analysis.dm
Normal file
140
code/modules/research/xenoarchaeology/analysis.dm
Normal file
@@ -0,0 +1,140 @@
|
||||
|
||||
/obj/machinery/anomaly
|
||||
anchored = 1
|
||||
density = 1
|
||||
//
|
||||
var/obj/item/weapon/reagent_containers/glass/held_container
|
||||
var/obj/item/weapon/tank/fuel_container
|
||||
var/scan_time = 30 //change to 300 later
|
||||
var/report_num = 0
|
||||
var/scanning = 0
|
||||
var/safety_enabled = 1
|
||||
var/warning_given = 0
|
||||
var/heat_accumulation_rate = 0
|
||||
var/temperature = 273 //measured in kelvin, if this exceeds 1200, the machine is damaged and requires repairs
|
||||
//if this exceeds 600 and safety is enabled it will shutdown
|
||||
//temp greater than 600 also requires a safety prompt to initiate scanning
|
||||
var/scanner_dir = 0
|
||||
var/obj/machinery/anomaly/scanner/owned_scanner = null
|
||||
|
||||
/obj/machinery/anomaly/New()
|
||||
//connect to a nearby scanner pad
|
||||
if(scanner_dir)
|
||||
scanner = locate(/obj/machinery/anomaly/scanner) in get_step(src, scanner_dir)
|
||||
if(!scanner)
|
||||
scanner = locate(/obj/machinery/anomaly/scanner) in orange(1)
|
||||
|
||||
//this proc should be overriden by each individual machine
|
||||
/obj/machinery/anomaly/attack_hand(var/mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
user.machine = src
|
||||
var/dat = "<B>[src.name]</B><BR>"
|
||||
dat += "[scanner ? "Scanner connected." : "Scanner disconnected."]"
|
||||
dat += "Module heat level:[temperature] kelvin<br>"
|
||||
dat += "Safeties set at 600k, shielding failure at 1200k. Failure to maintain safe heat levels may result in equipment damage.<br>"
|
||||
dat += "<hr>"
|
||||
dat += "[held_container ? "<A href='?src=\ref[src];eject_beaker=1'>Eject beaker</a>" : "No beaker inserted."]<br>"
|
||||
dat += "[held_container ? "<A href='?src=\ref[src];eject_fuel=1'>Eject fuel tank</a>" : "No fuel tank inserted."]<br>"
|
||||
dat += "<A href='?src=\ref[src];begin=1'>Begin scanning</a>"
|
||||
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=anomaly;size=450x500")
|
||||
onclose(user, "anomaly")
|
||||
|
||||
obj/machinery/anomaly/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
|
||||
if(istype(W, /obj/item/weapon/reagent_containers/glass))
|
||||
//var/obj/item/weapon/reagent_containers/glass/G = W
|
||||
if(held_container)
|
||||
user << "\red You must remove the [held_container] first."
|
||||
else
|
||||
user << "\blue You put the [held_container] into the [src]."
|
||||
user.drop_item(W)
|
||||
held_container.loc = src
|
||||
held_container = W
|
||||
updateDialog()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/tank))
|
||||
//var/obj/item/weapon/reagent_containers/glass/G = W
|
||||
if(fuel_container)
|
||||
user << "\red You must remove the [fuel_container] first."
|
||||
else
|
||||
user << "\blue You put the [fuel_container] into the [src]."
|
||||
user.drop_item(W)
|
||||
fuel_container.loc = src
|
||||
fuel_container = W
|
||||
updateDialog()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/anomaly/process()
|
||||
//not sure if everything needs to heat up, or just the GLPC
|
||||
var/environmental_temp = loc.return_air().temperature
|
||||
if(scanning)
|
||||
//heat up as we go, but if the air is freezing then heat up much slower
|
||||
var/new_heat = heat_accumulation_rate + heat_accumulation_rate * rand(-0.5,0.5)
|
||||
if(environmental_temp < 273)
|
||||
new_heat /= 2
|
||||
temperature += new_heat
|
||||
if(temperature >= 600)
|
||||
if(!warning_given || temperature >= 1200)
|
||||
src.visible_message("The [src] bleets.", 2)
|
||||
warning_given = 1
|
||||
if(safety_enabled)
|
||||
scanning = 0
|
||||
else if(temperature > environmental_temp)
|
||||
//cool down to match the air
|
||||
temperature -= 10 + rand(-5,5)
|
||||
if(temperature < environmental_temp
|
||||
temperature = environmental_temp
|
||||
else if(temperature < environmental_temp)
|
||||
//heat up to match the air
|
||||
temperature += 10 + rand(-5,5)
|
||||
if(temperature > environmental_temp
|
||||
temperature = environmental_temp
|
||||
|
||||
obj/machinery/anomaly/proc/ScanResults()
|
||||
//instantiate in children to produce unique scan behaviour
|
||||
return "Error initialising scanning components."
|
||||
|
||||
obj/machinery/anomaly/proc/BeginScan()
|
||||
var/total_scan_time = scan_time + scan_time * rand(-0.5, 0.5)
|
||||
|
||||
scanning = 1
|
||||
spawn(total_scan_time)
|
||||
if(scanning)
|
||||
scanning = 0
|
||||
|
||||
//determine the results and print a report
|
||||
if(held_container)
|
||||
src.visible_message("The [src] chimes.", 2)
|
||||
var/obj/item/weapon/paper/P = new(src.loc)
|
||||
P.name = "[src] analysis report #[++report_num]"
|
||||
P.info = "<b>[src] analysis report #[report_num]</b><br><br>" + ScanResults()
|
||||
P.stamped = list(/obj/item/weapon/stamp)
|
||||
P.overlays = list("paper_stamped")
|
||||
else
|
||||
src.visible_message("The [src] buzzes.", 2)
|
||||
|
||||
obj/machinery/anomaly/Topic(href, href_list)
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=anomaly")
|
||||
usr.machine = null
|
||||
if(href_list["eject_beaker"])
|
||||
held_container.loc = src.loc
|
||||
held_container = null
|
||||
if(href_list["eject_fuel"])
|
||||
fuel_container.loc = src.loc
|
||||
fuel_container = null
|
||||
if(href_list["begin"])
|
||||
if(temperature >= 600)
|
||||
var/proceed = input("Unsafe internal temperature detected, do you wish to continue?","Warning")
|
||||
if(proceed)
|
||||
safety_enabled = 0
|
||||
BeginScan()
|
||||
else
|
||||
BeginScan()
|
||||
|
||||
..()
|
||||
updateDialog()
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
obj/machinery/anomaly/accelerator
|
||||
name = "Accelerator Spectrometer"
|
||||
desc = "A specialised, complex analysis machine."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
obj/machinery/anomaly/fourier_transform
|
||||
name = "Fourier Transform spectroscope"
|
||||
desc = "A specialised, complex analysis machine."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
|
||||
obj/machinery/anomaly/fourier_transform/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/reagent/A in held_container.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(istype(R,datum/reagent/density_separated_liquid))
|
||||
scanned_sample = R.data
|
||||
else if(istype(R,datum/reagent/analysis_sample))
|
||||
scanned_sample = R.data
|
||||
else
|
||||
carrier = R.type
|
||||
num_reagents++
|
||||
|
||||
if(num_reagents == 2 && scanned_sample && carrier)
|
||||
//all necessary components are present
|
||||
var/specifity = GetResultSpecifity(scanned_sample, carrier)
|
||||
var/distance = scanned_sample.artifact_distance
|
||||
if(specifity > 0.6)
|
||||
artifact_distance += rand(-0.1, 0.1) * artifact_distance
|
||||
else
|
||||
var/offset = 1 - specifity
|
||||
artifact_distance += rand(-offset, offset) * artifact_distance
|
||||
results = "Anomalous energy absorption through carrier ([carrier.id]) indicates emission radius: [artifact_distance]"
|
||||
|
||||
return results
|
||||
@@ -0,0 +1,80 @@
|
||||
|
||||
obj/machinery/anomaly/gas_chromatography
|
||||
name = "Gas Chromatography Spectrometer"
|
||||
desc = "A specialised, complex analysis machine."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
|
||||
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/reagent/A in held_container.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(istype(R,datum/reagent/density_separated_liquid))
|
||||
scanned_sample = R.data
|
||||
else if(istype(R,datum/reagent/analysis_sample))
|
||||
scanned_sample = R.data
|
||||
else
|
||||
carrier = R.type
|
||||
num_reagents++
|
||||
|
||||
if(num_reagents == 2 && scanned_sample && carrier)
|
||||
//all necessary components are present
|
||||
results = "Carrier ([carrier.id]) specifity: [GetResultSpecifity(scanned_sample, carrier)]"
|
||||
|
||||
return results
|
||||
|
||||
obj/machinery/anomaly/proc/GetResultSpecifity(var/datum/geosample/scanned_sample, var/datum/reagent/carrier)
|
||||
var/specifity = 0
|
||||
if(scanned_sample && carrier)
|
||||
var/threshold = 0.6
|
||||
|
||||
if(scanned_sample.main_find == carrier.id)
|
||||
specifity += threshold + rand(0, 1 - threshold)
|
||||
if(scanned_sample.secondary_find == carrier.id)
|
||||
specifity += threshold + rand(0, 1 - threshold)
|
||||
|
||||
/*
|
||||
//check the main turf
|
||||
if(scanned_sample.main_find == FIND_NOTHING)
|
||||
//nothing?
|
||||
else if(scanned_sample.main_find == FIND_PLANT || scanned_sample.main_find == FIND_BIO || scanned_sample.main_find == FIND_SKULL)
|
||||
//preserved plant or animal
|
||||
if(carrier.id == "carbon")
|
||||
specifity += threshold + rand(0,1 - threshold)
|
||||
else if(scanned_sample.main_find == FIND_METEORIC)
|
||||
//deep space
|
||||
if(carrier.id == "neon")
|
||||
specifity += threshold + rand(0,1 - threshold)
|
||||
else if(scanned_sample.main_find == FIND_ICE)
|
||||
//solid h20
|
||||
if(carrier.id == "beryllium")
|
||||
specifity += threshold + rand(0,1 - threshold)
|
||||
else if(scanned_sample.main_find == FIND_IGNEOUS || scanned_sample.main_find == FIND_METAMORPHIC || scanned_sample.main_find == FIND_CARBONATE)
|
||||
//rock
|
||||
if(carrier.id == "calcium" || carrier.id == "chlorine")
|
||||
specifity += threshold + rand(0,1 - threshold)
|
||||
else if(scanned_sample.main_find == FIND_CRYSTALLINE)
|
||||
//some kind of refractive, crystalline matter
|
||||
if(carrier.id == "helium")
|
||||
specifity += threshold + rand(0,1 - threshold)
|
||||
else if(scanned_sample.main_find == FIND_METALLIC)
|
||||
//something metal (could be just ores, not necessarily a synthetic artifact)
|
||||
if(carrier.id == "silicon")
|
||||
specifity += threshold + rand(0,1 - threshold)
|
||||
else if(scanned_sample.main_find == FIND_SEDIMENTARY)
|
||||
//sandy rock
|
||||
if(carrier.id == "aluminium")
|
||||
specifity += threshold + rand(0,1 - threshold)
|
||||
*/
|
||||
|
||||
if(specifity > 1)
|
||||
specifity = 0.9 + rand(0,0.1)
|
||||
else if(specifity <= 0)
|
||||
specifity += rand(0, threshold)
|
||||
|
||||
return specifity
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
obj/machinery/anomaly/hyperspectral
|
||||
name = "Hypospectral Imager"
|
||||
desc = "A specialised, complex analysis machine."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
obj/machinery/anomaly/ion_mobility
|
||||
name = "Ion Mobility Spectrometer"
|
||||
desc = "A specialised, complex analysis machine."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
obj/machinery/anomaly/radiometric
|
||||
name = "Isotope ratio spectrometre"
|
||||
desc = "A specialised, complex analysis machine."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
/obj/machinery/anomaly/scanner
|
||||
name = "scanner pad"
|
||||
desc = "Place larger objects here for scanning."
|
||||
icon = 'stationobjs.dmi'
|
||||
icon_state = "tele0"
|
||||
anchored = 1
|
||||
density = 0
|
||||
@@ -2,19 +2,45 @@
|
||||
//chemistry stuff here so that it can be easily viewed/modified
|
||||
datum
|
||||
reagent
|
||||
tungsten //used purely to make lith-sodi-tungs
|
||||
tungsten //purely used to make lith-sodi-tungs
|
||||
name = "Tungsten"
|
||||
id = "tungsten"
|
||||
description = "A chemical element, and a strong oxidising agent."
|
||||
reagent_state = SOLID
|
||||
color = "#808080" // rgb: 128, 128, 128, meant to be a silvery grey but idrc
|
||||
color = "#808080" // rgb: 128, 128, 128
|
||||
//todo: make this silvery grey
|
||||
|
||||
neon //purely used as a carrier
|
||||
name = "Neon"
|
||||
id = "neon"
|
||||
description = "A chemical element, commonly used in lighting."
|
||||
reagent_state = LIQUID
|
||||
color = "#808080" // rgb: 128, 128, 128,
|
||||
//todo: make this fluro/bright purple
|
||||
|
||||
beryllium //purely used as a carrier
|
||||
name = "Beryllium"
|
||||
id = "beryllium"
|
||||
description = "A chemical element, prized for it's rigidity, thermal stability and low density when used in alloys."
|
||||
reagent_state = LIQUID
|
||||
color = "#808080" // rgb: 128, 128, 128,
|
||||
//todo: make this dark grey
|
||||
|
||||
calcium //purely used as a carrier
|
||||
name = "Calcium"
|
||||
id = "calcium"
|
||||
description = "An extremely common chemical element found throughout living organisms."
|
||||
reagent_state = LIQUID
|
||||
color = "#808080" // rgb: 128, 128, 128,
|
||||
//todo: make this bone-white colour
|
||||
|
||||
lithiumsodiumtungstate
|
||||
name = "Lithium Sodium Tungstate"
|
||||
id = "lithiumsodiumtungstate"
|
||||
description = "A reducing agent for geological compounds."
|
||||
reagent_state = LIQUID
|
||||
color = "#808080" // rgb: 128, 128, 128, again, silvery grey
|
||||
color = "#808080" // rgb: 128, 128, 128
|
||||
//todo: make this silvery grey
|
||||
|
||||
ground_rock
|
||||
name = "Ground Rock"
|
||||
@@ -25,7 +51,7 @@ datum
|
||||
//todo: make this brown
|
||||
|
||||
density_separated_sample
|
||||
name = "Analysis sample"
|
||||
name = "Analysis liquid"
|
||||
id = "density_separated_sample"
|
||||
description = "A watery paste used in chemical analysis."
|
||||
reagent_state = LIQUID
|
||||
@@ -33,7 +59,7 @@ datum
|
||||
//todo: make this browny-white
|
||||
|
||||
analysis_sample
|
||||
name = "Analysis sample"
|
||||
name = "Analysis liquid"
|
||||
id = "analysis_sample"
|
||||
description = "A watery paste used in chemical analysis."
|
||||
reagent_state = LIQUID
|
||||
@@ -73,3 +99,15 @@ datum
|
||||
required_reagents = list("density_separated_sample" = 5)
|
||||
result_amount = 4
|
||||
requires_heating = 1
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/solution_tray
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "solution_tray"
|
||||
desc = "A small, open-topped glass container for delicate research samples."
|
||||
m_amt = 0
|
||||
g_amt = 5
|
||||
w_class = 1.0
|
||||
amount_per_transfer_from_this = 1
|
||||
possible_transfer_amounts = list(1)
|
||||
volume = 2
|
||||
flags = FPRINT | OPENCONTAINER
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
obj/machinery/gas_chromatography
|
||||
name = "Gas Chromatography Spectrometer"
|
||||
desc = "A specialised mass spectrometer."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
|
||||
obj/machinery/gas_chromatography/Topic(href, href_list)
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=artanalyser")
|
||||
usr.machine = null
|
||||
|
||||
updateDialog()
|
||||
|
||||
obj/machinery/gas_chromatography/attack_hand(var/mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
user.machine = src
|
||||
var/dat = "<B>Gas Chromatography Spectrometer</B><BR>"
|
||||
dat += "<hr>"
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>Refresh<BR>"
|
||||
dat += "<A href='?src=\ref[src];close=1'>Close<BR>"
|
||||
user << browse(dat, "window=artanalyser;size=450x500")
|
||||
onclose(user, "artanalyser")
|
||||
|
||||
obj/machinery/accelerator
|
||||
name = "Accelerator Spectrometer"
|
||||
desc = "A specialised mass spectrometer."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
|
||||
obj/machinery/accelerator/Topic(href, href_list)
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=artanalyser")
|
||||
usr.machine = null
|
||||
|
||||
updateDialog()
|
||||
|
||||
obj/machinery/accelerator/attack_hand(var/mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
user.machine = src
|
||||
var/dat = "<B>Accelerator Spectrometer</B><BR>"
|
||||
dat += "<hr>"
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>Refresh<BR>"
|
||||
dat += "<A href='?src=\ref[src];close=1'>Close<BR>"
|
||||
user << browse(dat, "window=artanalyser;size=450x500")
|
||||
onclose(user, "artanalyser")
|
||||
|
||||
obj/machinery/fourier_transform
|
||||
name = "Fourier Transform Spectroscope"
|
||||
desc = "A specialised geochemical analysis device."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
|
||||
obj/machinery/fourier_transform/Topic(href, href_list)
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=artanalyser")
|
||||
usr.machine = null
|
||||
|
||||
updateDialog()
|
||||
|
||||
obj/machinery/fourier_transform/attack_hand(var/mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
user.machine = src
|
||||
var/dat = "<B>Fourier Transform Spectroscope</B><BR>"
|
||||
dat += "<hr>"
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>Refresh<BR>"
|
||||
dat += "<A href='?src=\ref[src];close=1'>Close<BR>"
|
||||
user << browse(dat, "window=artanalyser;size=450x500")
|
||||
onclose(user, "artanalyser")
|
||||
|
||||
obj/machinery/radiometric
|
||||
name = "Radiometric Exposure Spectrometer"
|
||||
desc = "A specialised mass spectrometer, able to radiometrically date inserted materials."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
|
||||
obj/machinery/radiometric/Topic(href, href_list)
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=artanalyser")
|
||||
usr.machine = null
|
||||
|
||||
updateDialog()
|
||||
|
||||
obj/machinery/radiometric/attack_hand(var/mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
user.machine = src
|
||||
var/dat = "<B>Radiometric Exposure Spectrometer</B><BR>"
|
||||
dat += "<hr>"
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>Refresh<BR>"
|
||||
dat += "<A href='?src=\ref[src];close=1'>Close<BR>"
|
||||
user << browse(dat, "window=artanalyser;size=450x500")
|
||||
onclose(user, "artanalyser")
|
||||
|
||||
obj/machinery/ion_mobility
|
||||
name = "Ion Mobility Spectrometer"
|
||||
desc = "A specialised mass spectrometer."
|
||||
icon = 'virology.dmi'
|
||||
icon_state = "analyser"
|
||||
|
||||
obj/machinery/ion_mobility/Topic(href, href_list)
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=artanalyser")
|
||||
usr.machine = null
|
||||
|
||||
updateDialog()
|
||||
|
||||
obj/machinery/ion_mobility/attack_hand(var/mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
user.machine = src
|
||||
var/dat = "<B>Ion Mobility Spectrometer</B><BR>"
|
||||
dat += "<hr>"
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>Refresh<BR>"
|
||||
dat += "<A href='?src=\ref[src];close=1'>Close<BR>"
|
||||
user << browse(dat, "window=artanalyser;size=450x500")
|
||||
onclose(user, "artanalyser")
|
||||
213
code/modules/research/xenoarchaeology/crystal.dm
Normal file
213
code/modules/research/xenoarchaeology/crystal.dm
Normal file
@@ -0,0 +1,213 @@
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// crystals
|
||||
|
||||
/obj/item/weapon/crystal
|
||||
name = "Crystal"
|
||||
icon = 'mining.dmi'
|
||||
icon_state = "crystal"
|
||||
|
||||
//needs to be solid to have collision, but shouldn't block movement
|
||||
/*/obj/item/weapon/crystal/bullet_act(var/obj/item/projectile/P)
|
||||
if(istype(P,/obj/item/projectile/beam/emitter))
|
||||
switch(rand(0,3))
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 1
|
||||
A.yo = 20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 2
|
||||
A.yo = -20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 4
|
||||
A.yo = 0
|
||||
A.xo = 20
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 8
|
||||
A.yo = 0
|
||||
A.xo = -20
|
||||
else
|
||||
..()*/
|
||||
|
||||
/obj/item/weapon/talkingcrystal
|
||||
name = "Crystal"
|
||||
icon = 'mining.dmi'
|
||||
icon_state = "crystal2"
|
||||
var/list/list/words = list()
|
||||
var/lastsaid
|
||||
|
||||
/obj/item/weapon/talkingcrystal/New()
|
||||
spawn(100)
|
||||
process()
|
||||
|
||||
//needs to be solid to have collision, but shouldn't block movement
|
||||
/*/obj/item/weapon/talkingcrystal/bullet_act(var/obj/item/projectile/P)
|
||||
if(istype(P,/obj/item/projectile/beam))
|
||||
switch(rand(0,3))
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = 20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = -20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = 0
|
||||
A.xo = 20
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = 0
|
||||
A.xo = -20
|
||||
var/word = pick("pain","hurt","masochism","sadist","rage","repressed","ouch","evil","void","kill","destroy")
|
||||
SaySomething(word)
|
||||
else
|
||||
..()*/
|
||||
|
||||
/obj/item/weapon/talkingcrystal/proc/catchMessage(var/msg, var/mob/source)
|
||||
var/list/seperate = list()
|
||||
if(findtext(msg,"(("))
|
||||
return
|
||||
else if(findtext(msg,"))"))
|
||||
return
|
||||
else if(findtext(msg," ")==0)
|
||||
return
|
||||
else
|
||||
/*var/l = lentext(msg)
|
||||
if(findtext(msg," ",l,l+1)==0)
|
||||
msg+=" "*/
|
||||
seperate = stringsplit(msg, " ")
|
||||
|
||||
var/addressing_crystal = 0
|
||||
if("crystal" in seperate || "gem" in seperate)
|
||||
addressing_crystal = 1
|
||||
|
||||
for(var/Xa = 1,Xa<seperate.len,Xa++)
|
||||
var/next = Xa + 1
|
||||
if(words.len > 20 + rand(10,20))
|
||||
words.Remove(words[1])
|
||||
if(!words["[lowertext(seperate[Xa])]"])
|
||||
words["[lowertext(seperate[Xa])]"] = list()
|
||||
var/list/w = words["[lowertext(seperate[Xa])]"]
|
||||
if(w)
|
||||
w.Add("[lowertext(seperate[next])]")
|
||||
//world << "Adding [lowertext(seperate[next])] to [lowertext(seperate[Xa])]"
|
||||
|
||||
for(var/mob/O in viewers(src))
|
||||
O.show_message("\blue The crystal hums for bit then stops...", 1)
|
||||
if(!rand(0, 5 - addressing_crystal * 3))
|
||||
spawn(2) SaySomething(pick(seperate))
|
||||
|
||||
/obj/item/weapon/talkingcrystal/proc/debug()
|
||||
//set src in view()
|
||||
for(var/v in words)
|
||||
world << "[uppertext(v)]"
|
||||
var/list/d = words["[v]"]
|
||||
for(var/X in d)
|
||||
world << "[X]"
|
||||
|
||||
/obj/item/weapon/talkingcrystal/proc/SaySomething(var/word = null)
|
||||
|
||||
var/msg
|
||||
var/limit = rand(max(5,words.len/2))+3
|
||||
var/text
|
||||
if(!word)
|
||||
text = "[pick(words)]"
|
||||
else
|
||||
text = pick(stringsplit(word, " "))
|
||||
if(lentext(text)==1)
|
||||
text=uppertext(text)
|
||||
else
|
||||
var/cap = copytext(text,1,2)
|
||||
cap = uppertext(cap)
|
||||
cap += copytext(text,2,lentext(text)+1)
|
||||
text=cap
|
||||
var/q = 0
|
||||
msg+=text
|
||||
if(msg=="What" | msg == "Who" | msg == "How" | msg == "Why" | msg == "Are")
|
||||
q=1
|
||||
|
||||
text=lowertext(text)
|
||||
for(var/ya,ya <= limit,ya++)
|
||||
|
||||
if(words.Find("[text]"))
|
||||
var/list/w = words["[text]"]
|
||||
text=pick(w)
|
||||
else
|
||||
text = "[pick(words)]"
|
||||
msg+=" [text]"
|
||||
if(q)
|
||||
msg+="?"
|
||||
else
|
||||
if(rand(0,10))
|
||||
msg+="."
|
||||
else
|
||||
msg+="!"
|
||||
|
||||
var/list/listening = viewers(src)
|
||||
for(var/mob/M in world)
|
||||
if (!M.client)
|
||||
continue //skip monkeys and leavers
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
if(M.stat == 2 && M.client.ghost_ears)
|
||||
listening|=M
|
||||
|
||||
for(var/mob/M in listening)
|
||||
M << "<b>The crystal</b> reverberates, \blue\"[msg]\""
|
||||
lastsaid = world.timeofday + rand(300,800)
|
||||
|
||||
/obj/item/weapon/talkingcrystal/process()
|
||||
if(prob(25) && world.timeofday >= lastsaid && words.len >= 1)
|
||||
SaySomething()
|
||||
spawn(100)
|
||||
process()
|
||||
|
||||
|
||||
|
||||
|
||||
//sentient crystals
|
||||
/mob/sentient_crystal
|
||||
name = "Crystal"
|
||||
icon = 'mining.dmi'
|
||||
icon_state = "crystal2"
|
||||
var/list/list/words = list()
|
||||
var/lastsaid
|
||||
|
||||
/mob/sentient_crystal/proc/catchMessage(var/msg, var/mob/source)
|
||||
var/list/seperate = list()
|
||||
if(findtext(msg,"(("))
|
||||
return
|
||||
else if(findtext(msg,"))"))
|
||||
return
|
||||
else
|
||||
/*var/l = lentext(msg)
|
||||
if(findtext(msg," ",l,l+1)==0)
|
||||
msg+=" "*/
|
||||
seperate = stringsplit(msg, " ")
|
||||
|
||||
for(var/Xa = 1,Xa<seperate.len,Xa++)
|
||||
var/next = Xa + 1
|
||||
if(words.len > 20 + rand(10,20))
|
||||
words.Remove(words[1])
|
||||
if(!words["[lowertext(seperate[Xa])]"])
|
||||
words["[lowertext(seperate[Xa])]"] = list()
|
||||
var/list/w = words["[lowertext(seperate[Xa])]"]
|
||||
if(w)
|
||||
w.Add("[lowertext(seperate[next])]")
|
||||
//world << "Adding [lowertext(seperate[next])] to [lowertext(seperate[Xa])]"
|
||||
|
||||
for(var/mob/O in viewers(src))
|
||||
O.show_message("\blue The crystal hums for bit then stops...", 1)
|
||||
|
||||
/mob/sentient_crystal/Life()
|
||||
@@ -83,265 +83,3 @@
|
||||
M.show_message("\blue The acid splashes harmlessly off the rock, nothing else interesting happens.",1)
|
||||
return 1
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// crystals
|
||||
|
||||
/obj/item/weapon/crystal
|
||||
name = "Crystal"
|
||||
icon = 'mining.dmi'
|
||||
icon_state = "crystal"
|
||||
|
||||
/obj/item/weapon/crystal/bullet_act(var/obj/item/projectile/P)
|
||||
if(istype(P,/obj/item/projectile/beam/emitter))
|
||||
switch(rand(0,3))
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 1
|
||||
A.yo = 20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 2
|
||||
A.yo = -20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 4
|
||||
A.yo = 0
|
||||
A.xo = 20
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.dir = 8
|
||||
A.yo = 0
|
||||
A.xo = -20
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/talkingcrystal
|
||||
name = "Crystal"
|
||||
icon = 'mining.dmi'
|
||||
icon_state = "crystal2"
|
||||
var/list/list/words = list()
|
||||
var/lastsaid
|
||||
|
||||
/obj/item/weapon/talkingcrystal/New()
|
||||
spawn(100)
|
||||
process()
|
||||
|
||||
/obj/item/weapon/talkingcrystal/bullet_act(var/obj/item/projectile/P)
|
||||
if(istype(P,/obj/item/projectile/beam))
|
||||
switch(rand(0,3))
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = 20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = -20
|
||||
A.xo = 0
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = 0
|
||||
A.xo = 20
|
||||
if(0)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc )
|
||||
A.dir = pick(alldirs)
|
||||
A.yo = 0
|
||||
A.xo = -20
|
||||
var/word = pick("pain","hurt","masochism","sadist","rage","repressed","ouch","evil","void","kill","destroy")
|
||||
SaySomething(word)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/talkingcrystal/proc/catchMessage(var/msg, var/mob/source)
|
||||
var/list/seperate = list()
|
||||
if(findtext(msg,"(("))
|
||||
return
|
||||
else if(findtext(msg,"))"))
|
||||
return
|
||||
else if(findtext(msg," ")==0)
|
||||
return
|
||||
else
|
||||
/*var/l = lentext(msg)
|
||||
if(findtext(msg," ",l,l+1)==0)
|
||||
msg+=" "*/
|
||||
seperate = stringsplit(msg, " ")
|
||||
|
||||
var/addressing_crystal = 0
|
||||
if("crystal" in seperate || "gem" in seperate)
|
||||
addressing_crystal = 1
|
||||
|
||||
for(var/Xa = 1,Xa<seperate.len,Xa++)
|
||||
var/next = Xa + 1
|
||||
if(words.len > 20 + rand(10,20))
|
||||
words.Remove(words[1])
|
||||
if(!words["[lowertext(seperate[Xa])]"])
|
||||
words["[lowertext(seperate[Xa])]"] = list()
|
||||
var/list/w = words["[lowertext(seperate[Xa])]"]
|
||||
if(w)
|
||||
w.Add("[lowertext(seperate[next])]")
|
||||
//world << "Adding [lowertext(seperate[next])] to [lowertext(seperate[Xa])]"
|
||||
|
||||
for(var/mob/O in viewers(src))
|
||||
O.show_message("\blue The crystal hums for bit then stops...", 1)
|
||||
if(!rand(0, 5 - addressing_crystal * 3))
|
||||
spawn(2) SaySomething(pick(seperate))
|
||||
|
||||
/obj/item/weapon/talkingcrystal/proc/debug()
|
||||
//set src in view()
|
||||
for(var/v in words)
|
||||
world << "[uppertext(v)]"
|
||||
var/list/d = words["[v]"]
|
||||
for(var/X in d)
|
||||
world << "[X]"
|
||||
|
||||
/obj/item/weapon/talkingcrystal/proc/SaySomething(var/word = null)
|
||||
|
||||
var/msg
|
||||
var/limit = rand(max(5,words.len/2))+3
|
||||
var/text
|
||||
if(!word)
|
||||
text = "[pick(words)]"
|
||||
else
|
||||
text = pick(stringsplit(word, " "))
|
||||
if(lentext(text)==1)
|
||||
text=uppertext(text)
|
||||
else
|
||||
var/cap = copytext(text,1,2)
|
||||
cap = uppertext(cap)
|
||||
cap += copytext(text,2,lentext(text)+1)
|
||||
text=cap
|
||||
var/q = 0
|
||||
msg+=text
|
||||
if(msg=="What" | msg == "Who" | msg == "How" | msg == "Why" | msg == "Are")
|
||||
q=1
|
||||
|
||||
text=lowertext(text)
|
||||
for(var/ya,ya <= limit,ya++)
|
||||
|
||||
if(words.Find("[text]"))
|
||||
var/list/w = words["[text]"]
|
||||
text=pick(w)
|
||||
else
|
||||
text = "[pick(words)]"
|
||||
msg+=" [text]"
|
||||
if(q)
|
||||
msg+="?"
|
||||
else
|
||||
if(rand(0,10))
|
||||
msg+="."
|
||||
else
|
||||
msg+="!"
|
||||
|
||||
var/list/listening = viewers(src)
|
||||
for(var/mob/M in world)
|
||||
if (!M.client)
|
||||
continue //skip monkeys and leavers
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
if(M.stat == 2 && M.client.ghost_ears)
|
||||
listening|=M
|
||||
|
||||
for(var/mob/M in listening)
|
||||
M << "<b>The crystal</b> reverberates, \blue\"[msg]\""
|
||||
lastsaid = world.timeofday + rand(300,800)
|
||||
|
||||
/obj/item/weapon/talkingcrystal/process()
|
||||
if(prob(25) && world.timeofday >= lastsaid && words.len >= 1)
|
||||
SaySomething()
|
||||
spawn(100)
|
||||
process()
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// fossils
|
||||
|
||||
/obj/item/weapon/fossil
|
||||
name = "Fossil"
|
||||
icon = 'fossil.dmi'
|
||||
icon_state = "bone"
|
||||
desc = "It's a fossil."
|
||||
|
||||
/obj/item/weapon/fossil/base/New()
|
||||
spawn(0)
|
||||
var/list/l = list("/obj/item/weapon/fossil/bone"=8,"/obj/item/weapon/fossil/skull"=2,
|
||||
"/obj/item/weapon/fossil/skull/horned"=2,"/obj/item/weapon/fossil/shell"=1)
|
||||
var/t = pickweight(l)
|
||||
new t(src.loc)
|
||||
del src
|
||||
|
||||
/obj/item/weapon/fossil/bone
|
||||
name = "Fossilised bone"
|
||||
icon_state = "bone"
|
||||
desc = "It's a fossilised bone."
|
||||
|
||||
/obj/item/weapon/fossil/shell
|
||||
name = "Fossilised shell"
|
||||
icon_state = "shell"
|
||||
desc = "It's a fossilised shell."
|
||||
|
||||
/obj/item/weapon/fossil/skull/horned
|
||||
icon_state = "hskull"
|
||||
desc = "It's a fossilised, horned skull."
|
||||
|
||||
/obj/item/weapon/fossil/skull
|
||||
name = "Fossilised skull"
|
||||
icon_state = "skull"
|
||||
desc = "It's a fossilised skull."
|
||||
|
||||
/obj/item/weapon/fossil/skull/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/weapon/fossil/bone))
|
||||
var/obj/o = new /obj/skeleton(get_turf(src))
|
||||
var/a = new /obj/item/weapon/fossil/bone
|
||||
var/b = new src.type
|
||||
o.contents.Add(a)
|
||||
o.contents.Add(b)
|
||||
del W
|
||||
del src
|
||||
|
||||
/obj/skeleton
|
||||
name = "Incomplete skeleton"
|
||||
icon = 'fossil.dmi'
|
||||
icon_state = "uskel"
|
||||
desc = "Incomplete skeleton."
|
||||
var/bnum = 1
|
||||
var/breq
|
||||
var/bstate = 0
|
||||
|
||||
/obj/skeleton/New()
|
||||
src.breq = rand(6)+3
|
||||
src.desc = "An incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones."
|
||||
|
||||
/obj/skeleton/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/weapon/fossil/bone))
|
||||
if(!bstate)
|
||||
bnum++
|
||||
src.contents.Add(new/obj/item/weapon/fossil/bone)
|
||||
del W
|
||||
if(bnum==breq)
|
||||
usr = user
|
||||
icon_state = "skel"
|
||||
var/creaturename = input("Input a name for your discovery:","Name your discovery","Spaceosaurus")
|
||||
src.bstate = 1
|
||||
src.density = 1
|
||||
src.name = "[creaturename] skeleton"
|
||||
if(src.contents.Find(/obj/item/weapon/fossil/skull/horned))
|
||||
src.desc = "A creature made of [src.contents.len-1] assorted bones and a horned skull, the plaque reads [creaturename]."
|
||||
else
|
||||
src.desc = "A creature made of [src.contents.len-1] assorted bones and a skull, the plaque reads [creaturename]."
|
||||
else
|
||||
src.desc = "Incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones."
|
||||
user << "Looks like it could use [src.breq-src.bnum] more bones."
|
||||
else
|
||||
..()
|
||||
else
|
||||
..()
|
||||
|
||||
84
code/modules/research/xenoarchaeology/fossils.dm
Normal file
84
code/modules/research/xenoarchaeology/fossils.dm
Normal file
@@ -0,0 +1,84 @@
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// fossils
|
||||
|
||||
/obj/item/weapon/fossil
|
||||
name = "Fossil"
|
||||
icon = 'fossil.dmi'
|
||||
icon_state = "bone"
|
||||
desc = "It's a fossil."
|
||||
|
||||
/obj/item/weapon/fossil/base/New()
|
||||
spawn(0)
|
||||
var/list/l = list("/obj/item/weapon/fossil/bone"=8,"/obj/item/weapon/fossil/skull"=2,
|
||||
"/obj/item/weapon/fossil/skull/horned"=2,"/obj/item/weapon/fossil/shell"=1)
|
||||
var/t = pickweight(l)
|
||||
new t(src.loc)
|
||||
del src
|
||||
|
||||
/obj/item/weapon/fossil/bone
|
||||
name = "Fossilised bone"
|
||||
icon_state = "bone"
|
||||
desc = "It's a fossilised bone."
|
||||
|
||||
/obj/item/weapon/fossil/shell
|
||||
name = "Fossilised shell"
|
||||
icon_state = "shell"
|
||||
desc = "It's a fossilised shell."
|
||||
|
||||
/obj/item/weapon/fossil/skull/horned
|
||||
icon_state = "hskull"
|
||||
desc = "It's a fossilised, horned skull."
|
||||
|
||||
/obj/item/weapon/fossil/skull
|
||||
name = "Fossilised skull"
|
||||
icon_state = "skull"
|
||||
desc = "It's a fossilised skull."
|
||||
|
||||
/obj/item/weapon/fossil/skull/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/weapon/fossil/bone))
|
||||
var/obj/o = new /obj/skeleton(get_turf(src))
|
||||
var/a = new /obj/item/weapon/fossil/bone
|
||||
var/b = new src.type
|
||||
o.contents.Add(a)
|
||||
o.contents.Add(b)
|
||||
del W
|
||||
del src
|
||||
|
||||
/obj/skeleton
|
||||
name = "Incomplete skeleton"
|
||||
icon = 'fossil.dmi'
|
||||
icon_state = "uskel"
|
||||
desc = "Incomplete skeleton."
|
||||
var/bnum = 1
|
||||
var/breq
|
||||
var/bstate = 0
|
||||
|
||||
/obj/skeleton/New()
|
||||
src.breq = rand(6)+3
|
||||
src.desc = "An incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones."
|
||||
|
||||
/obj/skeleton/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/weapon/fossil/bone))
|
||||
if(!bstate)
|
||||
bnum++
|
||||
src.contents.Add(new/obj/item/weapon/fossil/bone)
|
||||
del W
|
||||
if(bnum==breq)
|
||||
usr = user
|
||||
icon_state = "skel"
|
||||
var/creaturename = input("Input a name for your discovery:","Name your discovery","Spaceosaurus")
|
||||
src.bstate = 1
|
||||
src.density = 1
|
||||
src.name = "[creaturename] skeleton"
|
||||
if(src.contents.Find(/obj/item/weapon/fossil/skull/horned))
|
||||
src.desc = "A creature made of [src.contents.len-1] assorted bones and a horned skull, the plaque reads [creaturename]."
|
||||
else
|
||||
src.desc = "A creature made of [src.contents.len-1] assorted bones and a skull, the plaque reads [creaturename]."
|
||||
else
|
||||
src.desc = "Incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones."
|
||||
user << "Looks like it could use [src.breq-src.bnum] more bones."
|
||||
else
|
||||
..()
|
||||
else
|
||||
..()
|
||||
@@ -1,22 +1,25 @@
|
||||
|
||||
|
||||
datum/geosample
|
||||
var/scrambled = 0 //if this sample has been mixed with other samples
|
||||
//
|
||||
var/age = 0
|
||||
var/age_thousand = 0 //age can correspond to different artifacts
|
||||
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_strength = 0 //proportional to distance
|
||||
var/responsive_reagent = "" ///each reagent corresponds to a different type of find
|
||||
var/reagent_response = "" //likelihood of there being finds there
|
||||
var/artifact_distance = 0 //proportional to distance
|
||||
var/main_find = "" //carrier reagent that the main body of the tile responds to
|
||||
var/secondary_find = "" //carrier reagent that the floor of the turf responds to
|
||||
//
|
||||
var/source_mineral
|
||||
var/list/specifity_offsets = list()
|
||||
|
||||
datum/geosample/New(var/turf/simulated/mineral/container)
|
||||
UpdateTurf(container)
|
||||
artifact_distance = rand(500,999999)
|
||||
|
||||
//this function should only be called once. it's here just in case
|
||||
//this should only need to be called once
|
||||
datum/geosample/proc/UpdateTurf(var/turf/simulated/mineral/container)
|
||||
source_mineral = container.mineralName
|
||||
age = rand(1,999)
|
||||
@@ -42,7 +45,7 @@ datum/geosample/proc/UpdateTurf(var/turf/simulated/mineral/container)
|
||||
age_million = rand(1,999)
|
||||
age_billion = rand(10, 13)
|
||||
if("Clown")
|
||||
age = rand(-1,-999)
|
||||
age = rand(-1,-999) //thats_the_joke.mp4
|
||||
age_thousand = rand(-1,-999)
|
||||
/*if("Archaeo")
|
||||
//snowflake
|
||||
|
||||
13
code/modules/research/xenoarchaeology/global_placeholder.dm
Normal file
13
code/modules/research/xenoarchaeology/global_placeholder.dm
Normal file
@@ -0,0 +1,13 @@
|
||||
//todo: move these into global.dm
|
||||
|
||||
var/FIND_NOTHING = 0
|
||||
var/FIND_PLANT = 1
|
||||
var/FIND_BIO = 2
|
||||
var/FIND_METEORIC = 3
|
||||
var/FIND_ICE = 4
|
||||
var/FIND_CRYSTALLINE = 6
|
||||
var/FIND_METALLIC = 7
|
||||
var/FIND_IGNEOUS = 8
|
||||
var/FIND_METAMORPHIC = 9
|
||||
var/FIND_CARBONATE = 10
|
||||
var/FIND_SEDIMENTARY = 11
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Reference in New Issue
Block a user