diff --git a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
index 454d04ff44..391f10bc6e 100644
--- a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
@@ -200,7 +200,7 @@
"moles" = round(air2.gas[output_gas], 0.01))
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "algae_farm_vr.tmpl", "Algae Farm Control Panel", 500, 600)
ui.set_initial_data(data)
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index accedb543d..5abaa00c60 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -197,7 +197,7 @@
)
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index cacdf5240b..1f1c4ff1ae 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -140,7 +140,7 @@ Thus, the two variables affect pump operation are set in New():
)
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm
index 428f37fcfa..6fbd91f861 100644
--- a/code/ATMOSPHERICS/components/omni_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm
@@ -93,7 +93,7 @@
data = build_uidata()
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "omni_filter.tmpl", "Omni Filter Control", 330, 330)
@@ -181,7 +181,7 @@
switch_filter(dir_flag(href_list["dir"]), mode_return_switch(new_filter))
update_icon()
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return
/obj/machinery/atmospherics/omni/atmos_filter/proc/mode_return_switch(var/mode)
diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
index fc00be6ba4..47c78427f0 100644
--- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
@@ -131,7 +131,7 @@
data = build_uidata()
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "omni_mixer.tmpl", "Omni Mixer Control", 360, 330)
@@ -200,7 +200,7 @@
con_lock(dir_flag(href_list["dir"]))
update_icon()
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return
/obj/machinery/atmospherics/omni/mixer/proc/switch_mode(var/port = NORTH, var/mode = ATM_NONE)
diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index 8ff0aa7479..d4bfb73311 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -83,7 +83,7 @@
data["gasTemperatureClass"] = temp_class
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index 69e638bc22..9729e1d387 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -103,7 +103,7 @@
data["gasTemperatureClass"] = temp_class
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/__defines/_planes+layers_vr.dm b/code/__defines/_planes+layers_vr.dm
index 0ec8664fd9..125f492cd7 100644
--- a/code/__defines/_planes+layers_vr.dm
+++ b/code/__defines/_planes+layers_vr.dm
@@ -5,5 +5,3 @@
#define PLANE_CH_VANTAG 29 //Vore Antag hud
#define PLANE_AUGMENTED 40 //Augmented-reality plane
-
-#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable
diff --git a/code/__defines/_tick.dm b/code/__defines/_tick.dm
index 54ac7d398d..1f112f711b 100644
--- a/code/__defines/_tick.dm
+++ b/code/__defines/_tick.dm
@@ -1,5 +1,5 @@
-#define TICK_LIMIT_RUNNING 80
+#define TICK_LIMIT_RUNNING 85 //VOREStation Emergency Edit
#define TICK_LIMIT_TO_RUN 70
#define TICK_LIMIT_MC 70
#define TICK_LIMIT_MC_INIT_DEFAULT 98
diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index cd444abc18..c65a87d6c8 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -29,9 +29,9 @@
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
//Addon mode flags
-#define DM_FLAG_NUMBING 0x1
-#define DM_FLAG_STRIPPING 0x2
-//#define DM_FLAG_ITEMWEAK 0x4
+#define DM_FLAG_NUMBING 0x1
+#define DM_FLAG_STRIPPING 0x2
+#define DM_FLAG_LEAVEREMAINS 0x4
//Item related modes
#define IM_HOLD "Hold"
diff --git a/code/__defines/map.dm b/code/__defines/map.dm
index 13b1bfd795..7d0f3706af 100644
--- a/code/__defines/map.dm
+++ b/code/__defines/map.dm
@@ -6,6 +6,7 @@
#define MAP_LEVEL_SEALED 0x010 // Z-levels that don't allow random transit at edge
#define MAP_LEVEL_EMPTY 0x020 // Empty Z-levels that may be used for various things (currently used by bluespace jump)
#define MAP_LEVEL_CONSOLES 0x040 // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset.
+#define MAP_LEVEL_XENOARCH_EXEMPT 0x080 // Z-levels exempt from xenoarch digsite generation.
// Misc map defines.
#define SUBMAP_MAP_EDGE_PAD 15 // Automatically created submaps are forbidden from being this close to the main map's edge.
\ No newline at end of file
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 0e3234ed83..c17e6d1594 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -145,7 +145,10 @@
#define DEFAULT_TABLE_MATERIAL "plastic"
#define DEFAULT_WALL_MATERIAL "steel"
+#define MAT_IRON "iron"
+#define MAT_MARBLE "marble"
#define MAT_STEEL "steel"
+#define MAT_PLASTIC "plastic"
#define MAT_GLASS "glass"
#define MAT_SILVER "silver"
#define MAT_GOLD "gold"
@@ -164,6 +167,13 @@
#define MAT_DURASTEEL "durasteel"
#define MAT_DURASTEELHULL "durasteel hull"
#define MAT_TITANIUMHULL "titanium hull"
+#define MAT_VERDANTIUM "verdantium"
+#define MAT_MORPHIUM "morphium"
+#define MAT_MORPHIUMHULL "morphium hull"
+#define MAT_VALHOLLIDE "valhollide"
+#define MAT_LEAD "lead"
+#define MAT_SUPERMATTER "supermatter"
+#define MAT_METALHYDROGEN "mhydrogen"
#define SHARD_SHARD "shard"
#define SHARD_SHRAPNEL "shrapnel"
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 0a2e49d907..fadd802c84 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -30,3 +30,8 @@
#define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
#define SPECIES_CUSTOM "Custom Species"
+
+#define SPECIES_MONKEY_AKULA "Sobaka"
+#define SPECIES_MONKEY_NEVREAN "Sparra"
+#define SPECIES_MONKEY_SERGAL "Saru"
+#define SPECIES_MONKEY_VULPKANIN "Wolpin"
diff --git a/code/__defines/research.dm b/code/__defines/research.dm
index 9c3bec3066..b55f6601f8 100644
--- a/code/__defines/research.dm
+++ b/code/__defines/research.dm
@@ -11,6 +11,7 @@
#define TECH_DATA "programming"
#define TECH_ILLEGAL "syndicate"
#define TECH_ARCANE "arcane"
+#define TECH_PRECURSOR "precursor"
#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals.
#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals
diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm
index ac480237b5..767941d58f 100644
--- a/code/__defines/subsystems.dm
+++ b/code/__defines/subsystems.dm
@@ -73,6 +73,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
// Subsystem fire priority, from lowest to highest priority
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
#define FIRE_PRIORITY_SHUTTLES 5
+#define FIRE_PRIORITY_TIMERS 7 //VOREStation Emergency Edit
#define FIRE_PRIORITY_ORBIT 8
#define FIRE_PRIORITY_VOTE 9
#define FIRE_PRIORITY_AI 10
diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm
index b8b781795f..45e40cfbde 100644
--- a/code/__defines/xenoarcheaology.dm
+++ b/code/__defines/xenoarcheaology.dm
@@ -34,7 +34,9 @@
#define ARCHAEO_REMAINS_XENO 34
#define ARCHAEO_GASMASK 35
#define ARCHAEO_ALIEN_ITEM 36
-#define MAX_ARCHAEO 36
+#define ARCHAEO_ALIEN_BOAT 37
+#define ARCHAEO_IMPERION_CIRCUIT 38
+#define MAX_ARCHAEO 38
#define DIGSITE_GARDEN 1
#define DIGSITE_ANIMAL 2
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index 057e468bb4..a3687b9b99 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -13,8 +13,6 @@ var/global/list/dead_mob_list = list() //List of all dead mobs, including cli
var/global/list/listening_objects = list() //List of all objects which care about receiving messages (communicators, radios, etc)
var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time
-var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
-var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
var/global/list/landmarks_list = list() //list of all landmarks created
var/global/list/surgery_steps = list() //list of all surgery steps |BS12
var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index f5b8f8afd8..4618bb536d 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -137,6 +137,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
/obj/item/stack/material/cardboard,
/obj/item/toy,
/obj/item/trash,
+ /obj/item/weapon/digestion_remains,
/obj/item/weapon/bananapeel,
/obj/item/weapon/bone,
/obj/item/weapon/broken_bottle,
@@ -394,6 +395,27 @@ var/global/list/contamination_colors = list("green",
"beige",
"pink")
+//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones.
+var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
+ SPECIES_DIONA,
+ SPECIES_ALRAUNE,
+ SPECIES_PROTEAN,
+ SPECIES_MONKEY, //Exclude all monkey subtypes, to prevent abuse of it. They aren't,
+ SPECIES_MONKEY_TAJ, //set to have remains anyway, but making double sure,
+ SPECIES_MONKEY_SKRELL,
+ SPECIES_MONKEY_UNATHI,
+ SPECIES_MONKEY_AKULA,
+ SPECIES_MONKEY_NEVREAN,
+ SPECIES_MONKEY_SERGAL,
+ SPECIES_MONKEY_VULPKANIN,
+ SPECIES_XENO, //Same for xenos,
+ SPECIES_XENO_DRONE,
+ SPECIES_XENO_HUNTER,
+ SPECIES_XENO_SENTINEL,
+ SPECIES_XENO_QUEEN,
+ SPECIES_SHADOW,
+ SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
+
/hook/startup/proc/init_vore_datum_ref_lists()
var/paths
diff --git a/code/controllers/Processes/chemistry.dm b/code/controllers/Processes/chemistry.dm
deleted file mode 100644
index 89d3cc01be..0000000000
--- a/code/controllers/Processes/chemistry.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-var/datum/controller/process/chemistry/chemistryProcess
-
-/datum/controller/process/chemistry
- var/list/active_holders
- var/list/chemical_reactions
- var/list/chemical_reagents
-
-/datum/controller/process/chemistry/setup()
- name = "chemistry"
- schedule_interval = 20 // every 2 seconds
- chemistryProcess = src
- active_holders = list()
- chemical_reactions = chemical_reactions_list
- chemical_reagents = chemical_reagents_list
-
-/datum/controller/process/chemistry/statProcess()
- ..()
- stat(null, "[active_holders.len] reagent holder\s")
-
-/datum/controller/process/chemistry/doWork()
- for(last_object in active_holders)
- var/datum/reagents/holder = last_object
- if(!holder.process_reactions())
- active_holders -= holder
- SCHECK
-
-/datum/controller/process/chemistry/proc/mark_for_update(var/datum/reagents/holder)
- if(holder in active_holders)
- return
-
- //Process once, right away. If we still need to continue then add to the active_holders list and continue later
- if(holder.process_reactions())
- active_holders += holder
\ No newline at end of file
diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm
deleted file mode 100644
index 0f720600bc..0000000000
--- a/code/controllers/Processes/nanoui.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/datum/controller/process/nanoui/setup()
- name = "nanoui"
- schedule_interval = 20 // every 2 seconds
-
-/datum/controller/process/nanoui/statProcess()
- ..()
- stat(null, "[GLOB.nanomanager.processing_uis.len] UIs")
-
-/datum/controller/process/nanoui/doWork()
- for(last_object in GLOB.nanomanager.processing_uis)
- var/datum/nanoui/NUI = last_object
- if(istype(NUI) && !QDELETED(NUI))
- try
- NUI.process()
- catch(var/exception/e)
- catchException(e, NUI)
- else
- catchBadType(NUI)
- GLOB.nanomanager.processing_uis -= NUI
\ No newline at end of file
diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm
index 781e285371..f71cd8fd1d 100644
--- a/code/controllers/Processes/supply.dm
+++ b/code/controllers/Processes/supply.dm
@@ -78,6 +78,8 @@ var/datum/controller/supply/supply_controller = new()
return 1
if(istype(A,/obj/item/device/radio/beacon))
return 1
+ if(istype(A,/obj/item/device/perfect_tele_beacon)) //VOREStation Addition: Translocator beacons
+ return 1 //VOREStation Addition: Translocator beacons
for(var/atom/B in A.contents)
if(.(B))
@@ -99,6 +101,7 @@ var/datum/controller/supply/supply_controller = new()
EC.name = "\proper[MA.name]"
EC.value = 0
EC.contents = list()
+ var/base_value = 0
// Must be in a crate!
if(istype(MA,/obj/structure/closet/crate))
@@ -106,6 +109,8 @@ var/datum/controller/supply/supply_controller = new()
callHook("sell_crate", list(CR, area_shuttle))
points += CR.points_per_crate
+ if(CR.points_per_crate)
+ base_value = CR.points_per_crate
var/find_slip = 1
for(var/atom/A in CR)
@@ -149,6 +154,7 @@ var/datum/controller/supply/supply_controller = new()
exported_crates += EC
points += EC.value
+ EC.value += base_value
// Duplicate the receipt for the admin-side log
var/datum/exported_crate/adm = new()
diff --git a/code/controllers/subsystems/nanoui.dm b/code/controllers/subsystems/nanoui.dm
new file mode 100644
index 0000000000..b4ceee4d63
--- /dev/null
+++ b/code/controllers/subsystems/nanoui.dm
@@ -0,0 +1,51 @@
+SUBSYSTEM_DEF(nanoui)
+ name = "NanoUI"
+ wait = 5
+ // a list of current open /nanoui UIs, grouped by src_object and ui_key
+ var/list/open_uis = list()
+ // a list of current open /nanoui UIs, not grouped, for use in processing
+ var/list/processing_uis = list()
+ // a list of asset filenames which are to be sent to the client on user logon
+ var/list/asset_files = list()
+
+/datum/controller/subsystem/nanoui/Initialize()
+ var/list/nano_asset_dirs = list(\
+ "nano/css/",\
+ "nano/images/",\
+ "nano/js/",\
+ "nano/templates/"\
+ )
+
+ var/list/filenames = null
+ for (var/path in nano_asset_dirs)
+ filenames = flist(path)
+ for(var/filename in filenames)
+ if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
+ if(fexists(path + filename))
+ asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect
+ .=..() //VOREStation Edit start: fixing some kevinzing
+ for(var/i in GLOB.clients)
+ send_resources(i) //VOREStation Edit end: fixing some kevinzing
+
+/datum/controller/subsystem/nanoui/Recover()
+ if(SSnanoui.open_uis)
+ open_uis |= SSnanoui.open_uis
+ if(SSnanoui.processing_uis)
+ processing_uis |= SSnanoui.processing_uis
+ if(SSnanoui.asset_files)
+ asset_files |= SSnanoui.asset_files
+
+/datum/controller/subsystem/nanoui/stat_entry()
+ return ..("[processing_uis.len] UIs")
+
+/datum/controller/subsystem/nanoui/fire(resumed)
+ for(var/thing in processing_uis)
+ var/datum/nanoui/UI = thing
+ UI.process()
+
+//Sends asset files to a client, called on client/New()
+/datum/controller/subsystem/nanoui/proc/send_resources(client)
+ if(!subsystem_initialized)
+ return
+ for(var/file in asset_files)
+ client << browse_rsc(file) // send the file to the client
\ No newline at end of file
diff --git a/code/controllers/subsystems/persist_vr.dm b/code/controllers/subsystems/persist_vr.dm
index b2bcc4b2c0..88bbabe72d 100644
--- a/code/controllers/subsystems/persist_vr.dm
+++ b/code/controllers/subsystems/persist_vr.dm
@@ -41,24 +41,30 @@ SUBSYSTEM_DEF(persist)
return
continue
+ // Do not collect useless PTO
+ var/department_earning = J.department
+ if(J.department == "Command")
+ department_earning = "Civilian"
+ clear_unused_pto(M)
+
// Update client whatever
var/client/C = M.client
var/wait_in_hours = (wait / (1 HOUR)) * J.timeoff_factor
LAZYINITLIST(C.department_hours)
var/dept_hours = C.department_hours
- if(isnum(C.department_hours[J.department]))
- dept_hours[J.department] += wait_in_hours
+ if(isnum(C.department_hours[department_earning]))
+ dept_hours[department_earning] += wait_in_hours
else
- dept_hours[J.department] = wait_in_hours
+ dept_hours[department_earning] = wait_in_hours
//Cap it
- dept_hours[J.department] = min(config.pto_cap, dept_hours[J.department])
+ dept_hours[department_earning] = min(config.pto_cap, dept_hours[department_earning])
// Okay we figured it out, lets update database!
var/sql_ckey = sql_sanitize_text(C.ckey)
- var/sql_dpt = sql_sanitize_text(J.department)
- var/sql_bal = text2num("[C.department_hours[J.department]]")
+ var/sql_dpt = sql_sanitize_text(department_earning)
+ var/sql_bal = text2num("[C.department_hours[department_earning]]")
var/DBQuery/query = dbcon.NewQuery("INSERT INTO vr_player_hours (ckey, department, hours) VALUES ('[sql_ckey]', '[sql_dpt]', [sql_bal]) ON DUPLICATE KEY UPDATE hours = VALUES(hours)")
query.Execute()
@@ -79,3 +85,11 @@ SUBSYSTEM_DEF(persist)
// Let's check the mind.
if(M.mind && M.mind.assigned_role)
. = job_master.GetJob(M.mind.assigned_role)
+
+// This proc tries makes sure old Command PTO doesn't linger
+/datum/controller/subsystem/persist/proc/clear_unused_pto(var/mob/M)
+ var/client/C = M.client
+ LAZYINITLIST(C.department_hours)
+ if(C.department_hours["Command"])
+ C.department_hours["Command"] = null
+ C.department_hours.Remove("Command")
\ No newline at end of file
diff --git a/code/controllers/subsystems/processing/chemistry.dm b/code/controllers/subsystems/processing/chemistry.dm
new file mode 100644
index 0000000000..34094f9fe3
--- /dev/null
+++ b/code/controllers/subsystems/processing/chemistry.dm
@@ -0,0 +1,45 @@
+PROCESSING_SUBSYSTEM_DEF(chemistry)
+ name = "Chemistry"
+ wait = 20
+ flags = SS_BACKGROUND|SS_POST_FIRE_TIMING
+ init_order = INIT_ORDER_CHEMISTRY
+ var/list/chemical_reactions = list()
+ var/list/chemical_reactions_by_reagent = list()
+ var/list/chemical_reagents = list()
+
+/datum/controller/subsystem/processing/chemistry/Recover()
+ chemical_reactions = SSchemistry.chemical_reactions
+ chemical_reagents = SSchemistry.chemical_reagents
+
+/datum/controller/subsystem/processing/chemistry/Initialize()
+ initialize_chemical_reactions()
+ initialize_chemical_reagents()
+
+//Chemical Reactions - Initialises all /datum/chemical_reaction into a list
+// It is filtered into multiple lists within a list.
+// For example:
+// chemical_reaction_list["phoron"] is a list of all reactions relating to phoron
+// Note that entries in the list are NOT duplicated. So if a reaction pertains to
+// more than one chemical it will still only appear in only one of the sublists.
+/datum/controller/subsystem/processing/chemistry/proc/initialize_chemical_reactions()
+ var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction
+ chemical_reactions = list()
+ chemical_reactions_by_reagent = list()
+
+ for(var/path in paths)
+ var/datum/chemical_reaction/D = new path
+ chemical_reactions += D
+ if(D.required_reagents && D.required_reagents.len)
+ var/reagent_id = D.required_reagents[1]
+ LAZYINITLIST(chemical_reactions_by_reagent[reagent_id])
+ chemical_reactions_by_reagent[reagent_id] += D
+
+//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
+/datum/controller/subsystem/processing/chemistry/proc/initialize_chemical_reagents()
+ var/paths = typesof(/datum/reagent) - /datum/reagent
+ chemical_reagents = list()
+ for(var/path in paths)
+ var/datum/reagent/D = new path()
+ if(!D.name)
+ continue
+ chemical_reagents[D.id] = D
diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm
index 3cd4ffe6ba..b743e8ff9e 100644
--- a/code/controllers/subsystems/timer.dm
+++ b/code/controllers/subsystems/timer.dm
@@ -6,6 +6,7 @@
SUBSYSTEM_DEF(timer)
name = "Timer"
wait = 1 //SS_TICKER subsystem, so wait is in ticks
+ priority = FIRE_PRIORITY_TIMERS //VOREStation Emergency Edit
init_order = INIT_ORDER_TIMER
flags = SS_TICKER|SS_NO_INIT
diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm
index ddac25ee83..ddfb679932 100644
--- a/code/controllers/subsystems/transcore_vr.dm
+++ b/code/controllers/subsystems/transcore_vr.dm
@@ -56,7 +56,7 @@ SUBSYSTEM_DEF(transcore)
implants -= imp
continue
- //In a human
+ //In a human
BITSET(H.hud_updateflag, BACKUP_HUD)
if(H == imp.imp_in && H.mind && H.stat < DEAD)
@@ -93,6 +93,7 @@ SUBSYSTEM_DEF(transcore)
else
if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
notify(name)
+ curr_MR.last_notification = world.time
curr_MR.dead_state = MR_DEAD
if(MC_TICK_CHECK)
@@ -158,9 +159,12 @@ SUBSYSTEM_DEF(transcore)
return 1
// Send a past-due notification to the medical radio channel.
-/datum/controller/subsystem/transcore/proc/notify(var/name)
+/datum/controller/subsystem/transcore/proc/notify(var/name, var/repeated = FALSE)
ASSERT(name)
- global_announcer.autosay("[name] is past-due for a mind backup. This will be the only notification.", "TransCore Oversight", "Medical")
+ if(repeated)
+ global_announcer.autosay("This is a repeat notification that [name] is past-due for a mind backup.", "TransCore Oversight", "Medical")
+ else
+ global_announcer.autosay("[name] is past-due for a mind backup.", "TransCore Oversight", "Medical")
// Called from mind_record to add itself to the transcore.
/datum/controller/subsystem/transcore/proc/add_backup(var/datum/transhuman/mind_record/MR)
diff --git a/code/controllers/subsystems/xenoarch.dm b/code/controllers/subsystems/xenoarch.dm
index 7f3e292c1a..d863ad8269 100644
--- a/code/controllers/subsystems/xenoarch.dm
+++ b/code/controllers/subsystems/xenoarch.dm
@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(xenoarch)
/datum/controller/subsystem/xenoarch/proc/SetupXenoarch()
for(var/turf/simulated/mineral/M in turfs)
- if(!M.density)
+ if(!M.density || M.z in using_map.xenoarch_exempt_levels)
continue
if(isnull(M.geologic_data))
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 4153900657..7e2e1a42e3 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -102,8 +102,6 @@
options["LEGACY: gas_data"] = gas_data
options["LEGACY: plant_controller"] = plant_controller
options["LEGACY: alarm_manager"] = alarm_manager
- options["LEGACY: nanomanager"] = GLOB.nanomanager
- options["LEGACY: chemistryProcess"] = chemistryProcess
var/pick = input(mob, "Choose a controller to debug/view variables of.", "VV controller:") as null|anything in options
if(!pick)
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index 2ec99d81d4..61eb4c6953 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -31,5 +31,5 @@
weakref = null // Clear this reference to ensure it's kept for as brief duration as possible.
tag = null
- GLOB.nanomanager.close_uis(src)
+ SSnanoui.close_uis(src)
return QDEL_HINT_QUEUE
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index d2f99a347b..541ba77194 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -188,9 +188,28 @@
return 0
*/ //VOREStation Removal End
//VOREStation Edit Start
- if(!local || (destination.z in using_map.player_levels)) //VOREStation Edit
+ var/obstructed = 0
+ var/turf/dest_turf = get_turf(destination)
+ if(local && !(dest_turf.z in using_map.player_levels))
+ if(istype(teleatom, /mob/living))
+ to_chat(teleatom, "The portal refuses to carry you that far away!")
+ return 0
+ else if(istype(destination.loc, /obj/belly))
+ var/obj/belly/destination_belly = destination.loc
+ var/mob/living/telenommer = destination_belly.owner
+ if(istype(telenommer))
+ if(!isliving(teleatom))
+ return 1
+ else
+ var/mob/living/telemob = teleatom
+ if(telemob.can_be_drop_prey && telenommer.can_be_drop_pred)
+ return 1
+ obstructed = 1
+ else if(!isturf(destination.loc) || !destination.x || !destination.y || !destination.z) //If we're inside something or outside universe
+ obstructed = 1
+ to_chat(teleatom, "Something is blocking way on the other side!")
+ if(obstructed)
+ return 0
+ else
return 1
- if(istype(teleatom, /mob/living))
- to_chat(teleatom, "The portal refuses to carry you that far away!")
- return 0
//VOREStation Edit End
\ No newline at end of file
diff --git a/code/datums/helper_datums/teleport_vr.dm b/code/datums/helper_datums/teleport_vr.dm
index eba2570c18..4075bc70f0 100644
--- a/code/datums/helper_datums/teleport_vr.dm
+++ b/code/datums/helper_datums/teleport_vr.dm
@@ -1,12 +1,8 @@
/datum/teleport/proc/try_televore()
//Destination is in a belly
- if(isbelly(destination.loc) && isliving(teleatom))
- var/mob/living/L = teleatom
+ if(isbelly(destination.loc))
var/obj/belly/B = destination.loc
-
- if(!L.can_be_drop_prey) //Overloading this as a pref for 'want to be unexpectedly eaten'
- return FALSE
-
+
teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything.
playSpecials(destination,effectout,soundout)
teleatom.forceMove(B)
@@ -14,4 +10,3 @@
//No fun!
return FALSE
-
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index fdca613460..67cf23a3cb 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -85,7 +85,7 @@
current.verbs -= /datum/changeling/proc/EvolutionMenu
current.mind = null
- GLOB.nanomanager.user_transferred(current, new_character) // transfer active NanoUI instances to new user
+ SSnanoui.user_transferred(current, new_character) // transfer active NanoUI instances to new user
if(new_character.mind) //remove any mind currently in our new body's mind variable
new_character.mind.current = null
diff --git a/code/datums/observation/destroyed.dm b/code/datums/observation/destroyed.dm
index ff8778645c..650909f86d 100644
--- a/code/datums/observation/destroyed.dm
+++ b/code/datums/observation/destroyed.dm
@@ -10,5 +10,6 @@
name = "Destroyed"
/datum/Destroy()
- GLOB.destroyed_event.raise_event(src)
+ if(GLOB.destroyed_event)
+ GLOB.destroyed_event.raise_event(src)
. = ..()
diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm
index dcd708c5f6..d059a0b091 100644
--- a/code/datums/wires/radio.dm
+++ b/code/datums/wires/radio.dm
@@ -24,7 +24,7 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT)
R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL)
- GLOB.nanomanager.update_uis(holder)
+ SSnanoui.update_uis(holder)
/datum/wires/radio/UpdateCut(var/index, var/mended)
var/obj/item/device/radio/R = holder
@@ -38,4 +38,4 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT)
R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL)
- GLOB.nanomanager.update_uis(holder)
+ SSnanoui.update_uis(holder)
diff --git a/code/datums/wires/seedstorage.dm b/code/datums/wires/seedstorage.dm
index e21bbb9faf..8268d936b0 100644
--- a/code/datums/wires/seedstorage.dm
+++ b/code/datums/wires/seedstorage.dm
@@ -10,10 +10,6 @@
/datum/wires/seedstorage/CanUse(var/mob/living/L)
var/obj/machinery/seed_storage/V = holder
- if(!istype(L, /mob/living/silicon))
- if(V.seconds_electrified)
- if(V.shock(L, 100))
- return 0
if(V.panel_open)
return 1
return 0
diff --git a/code/datums/wires/smartfridge.dm b/code/datums/wires/smartfridge.dm
index b611497e79..15f10cd800 100644
--- a/code/datums/wires/smartfridge.dm
+++ b/code/datums/wires/smartfridge.dm
@@ -12,10 +12,6 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
/datum/wires/smartfridge/CanUse(var/mob/living/L)
var/obj/machinery/smartfridge/S = holder
- if(!istype(L, /mob/living/silicon))
- if(S.seconds_electrified)
- if(S.shock(L, 100))
- return 0
if(S.panel_open)
return 1
return 0
diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm
index 6715669fc1..bad3a0078b 100644
--- a/code/datums/wires/vending.dm
+++ b/code/datums/wires/vending.dm
@@ -9,10 +9,6 @@ var/const/VENDING_WIRE_IDSCAN = 8
/datum/wires/vending/CanUse(var/mob/living/L)
var/obj/machinery/vending/V = holder
- if(!istype(L, /mob/living/silicon))
- if(V.seconds_electrified)
- if(V.shock(L, 100))
- return 0
if(V.panel_open)
return 1
return 0
@@ -43,7 +39,7 @@ var/const/VENDING_WIRE_IDSCAN = 8
if(VENDING_WIRE_THROW)
V.shoot_inventory = !mended
if(VENDING_WIRE_CONTRABAND)
- V.categories &= ~CAT_HIDDEN
+ V.categories &= ~CAT_HIDDEN
if(VENDING_WIRE_ELECTRIFY)
if(mended)
V.seconds_electrified = 0
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 493d5ccd38..8d31ecb9f4 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -555,6 +555,91 @@
rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 80)
+// Rating 4 - Anomaly
+
+/obj/item/weapon/stock_parts/capacitor/hyper
+ name = "hyper capacitor"
+ desc = "A hyper-capacity capacitor used in the construction of a variety of devices."
+ icon_state = "capacitor_hyper"
+ origin_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 80, MAT_GLASS = 40)
+
+/obj/item/weapon/stock_parts/scanning_module/hyper
+ name = "quantum scanning module"
+ desc = "A compact, near-perfect resolution quantum scanning module used in the construction of certain devices."
+ icon_state = "scan_module_hyper"
+ origin_tech = list(TECH_MAGNET = 6, TECH_BLUESPACE = 1, TECH_ARCANE = 1)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 100,"glass" = 40)
+
+/obj/item/weapon/stock_parts/manipulator/hyper
+ name = "planck-manipulator"
+ desc = "A miniscule manipulator used in the construction of certain devices."
+ icon_state = "hyper_mani"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 1)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 30)
+
+/obj/item/weapon/stock_parts/micro_laser/hyper
+ name = "hyper-power micro-laser"
+ icon_state = "hyper_micro_laser"
+ desc = "A tiny laser used in certain devices."
+ origin_tech = list(TECH_MAGNET = 6, TECH_ARCANE = 1)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 30, MAT_GLASS = 40)
+
+/obj/item/weapon/stock_parts/matter_bin/hyper
+ name = "hyper matter bin"
+ desc = "A container for holding compressed matter awaiting re-construction."
+ icon_state = "hyper_matter_bin"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_ARCANE = 1)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 100)
+
+// Rating 5 - Precursor
+
+/obj/item/weapon/stock_parts/capacitor/omni
+ name = "omni-capacitor"
+ desc = "A capacitor of immense capacity used in the construction of a variety of devices."
+ icon_state = "capacitor_omni"
+ origin_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1)
+ rating = 5
+ matter = list(DEFAULT_WALL_MATERIAL = 80, MAT_GLASS = 40)
+
+/obj/item/weapon/stock_parts/scanning_module/omni
+ name = "omni-scanning module"
+ desc = "A compact, perfect resolution temporospatial scanning module used in the construction of certain devices."
+ icon_state = "scan_module_omni"
+ origin_tech = list(TECH_MAGNET = 7, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1)
+ rating = 5
+ matter = list(DEFAULT_WALL_MATERIAL = 100,"glass" = 40)
+
+/obj/item/weapon/stock_parts/manipulator/omni
+ name = "omni-manipulator"
+ desc = "A strange, infinitesimal manipulator used in the construction of certain devices."
+ icon_state = "omni_mani"
+ origin_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 1)
+ rating = 5
+ matter = list(DEFAULT_WALL_MATERIAL = 30)
+
+/obj/item/weapon/stock_parts/micro_laser/omni
+ name = "omni-power micro-laser"
+ icon_state = "omni_micro_laser"
+ desc = "A strange laser used in certain devices."
+ origin_tech = list(TECH_MAGNET = 7, TECH_PRECURSOR = 1)
+ rating = 5
+ matter = list(DEFAULT_WALL_MATERIAL = 30, MAT_GLASS = 40)
+
+/obj/item/weapon/stock_parts/matter_bin/omni
+ name = "omni-matter bin"
+ desc = "A strange container for holding compressed matter awaiting re-construction."
+ icon_state = "omni_matter_bin"
+ origin_tech = list(TECH_MATERIAL = 7, TECH_PRECURSOR = 1)
+ rating = 5
+ matter = list(DEFAULT_WALL_MATERIAL = 100)
+
+
// Subspace stock parts
/obj/item/weapon/stock_parts/subspace/ansible
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 66dbaa6e2e..787cc55f7b 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -978,6 +978,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "entry_D2"
base_turf = /turf/space
+/area/hallway/secondary/entry/D2/arrivals
+ name = "\improper Shuttle Dock Hallway - Dock Two"
+ icon_state = "entry_D2"
+ base_turf = /turf/space
+ requires_power = 0
+
/area/hallway/secondary/entry/D3
name = "\improper Shuttle Dock Hallway - Dock Three"
icon_state = "entry_D3"
diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm
index c7d8b08398..ecca320658 100644
--- a/code/game/area/Space Station 13 areas_vr.dm
+++ b/code/game/area/Space Station 13 areas_vr.dm
@@ -79,6 +79,9 @@
/area/security/nuke_storage
flags = BLUE_SHIELDED
+/area/supply
+ flags = BLUE_SHIELDED
+
// Add rad shielding to maintenance and construction sites
/area/vacant
flags = RAD_SHIELDED
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 623ccc11a3..998b712828 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -270,7 +270,7 @@
I.loc = src
src.disk = I
user << "You insert [I]."
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
return
else
..()
@@ -428,7 +428,7 @@
data["beakerVolume"] += R.volume
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
@@ -465,7 +465,7 @@
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
src.connected.locked = 1//lock it
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
@@ -566,7 +566,7 @@
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
src.connected.locked = 1//lock it
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
@@ -624,7 +624,7 @@
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
src.connected.locked = 1 //lock it
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
@@ -751,7 +751,7 @@
irradiating = 2
var/lock_state = src.connected.locked
src.connected.locked = 1//lock it
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
sleep(10*2) // sleep for 2 seconds
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 49a4b342ef..b259fe1ded 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -15,6 +15,11 @@
..()
findsleeper()
+/obj/machinery/sleep_console/Destroy()
+ if(sleeper)
+ sleeper.console = null
+ return ..()
+
/obj/machinery/sleep_console/proc/findsleeper()
spawn(5)
var/obj/machinery/sleeper/sleepernew = null
@@ -34,16 +39,18 @@
if(..())
return 1
+ if(!sleeper)
+ findsleeper()
+ if(!sleeper)
+ to_chat(user, "Sleeper not found!")
+ return
+
if(sleeper.panel_open)
to_chat(user, "Close the maintenance panel first.")
return
- if(!sleeper)
- findsleeper()
if(sleeper)
return ui_interact(user)
- else
- to_chat(user, "Sleeper not found!")
/obj/machinery/sleep_console/attackby(var/obj/item/I, var/mob/user)
if(computer_deconstruction_screwdriver(user, I))
@@ -109,7 +116,7 @@
break
data["stasis"] = stasis_level_name
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state)
ui.set_initial_data(data)
@@ -155,7 +162,8 @@
anchored = 1
circuit = /obj/item/weapon/circuitboard/sleeper
var/mob/living/carbon/human/occupant = null
- var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
+ var/list/available_chemicals = list()
+ var/list/base_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/filtering = 0
var/obj/machinery/sleep_console/console
@@ -170,6 +178,7 @@
..()
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
@@ -181,6 +190,55 @@
RefreshParts()
+/obj/machinery/sleeper/Destroy()
+ if(console)
+ console.sleeper = null
+ return ..()
+
+/obj/machinery/sleeper/RefreshParts(var/limited = 0)
+ var/man_rating = 0
+ var/cap_rating = 0
+
+ available_chemicals.Cut()
+ available_chemicals = base_chemicals.Copy()
+ idle_power_usage = initial(idle_power_usage)
+ active_power_usage = initial(active_power_usage)
+
+ for(var/obj/item/weapon/stock_parts/P in component_parts)
+ if(istype(P, /obj/item/weapon/stock_parts/capacitor))
+ cap_rating += P.rating
+
+ cap_rating = max(1, round(cap_rating / 2))
+
+ idle_power_usage /= cap_rating
+ active_power_usage /= cap_rating
+
+ if(!limited)
+ for(var/obj/item/weapon/stock_parts/P in component_parts)
+ if(istype(P, /obj/item/weapon/stock_parts/manipulator))
+ man_rating += P.rating - 1
+
+ var/list/new_chemicals = list()
+
+ if(man_rating >= 4) // Alien tech.
+ var/reag_ID = pickweight(list(
+ "healing_nanites" = 10,
+ "shredding_nanites" = 5,
+ "irradiated_nanites" = 5,
+ "neurophage_nanites" = 2)
+ )
+ new_chemicals[reag_ID] = "Nanite"
+ if(man_rating >= 3) // Anomalous tech.
+ new_chemicals["immunosuprizine"] = "Immunosuprizine"
+ if(man_rating >= 2) // Tier 3.
+ new_chemicals["spaceacillin"] = "Spaceacillin"
+ if(man_rating >= 1) // Tier 2.
+ new_chemicals["leporazine"] = "Leporazine"
+
+ if(new_chemicals.len)
+ available_chemicals += new_chemicals
+ return
+
/obj/machinery/sleeper/Initialize()
. = ..()
update_icon()
@@ -215,11 +273,8 @@
var/obj/item/weapon/grab/G = I
if(G.affecting)
go_in(G.affecting, user)
- else if(default_deconstruction_screwdriver(user, I))
return
- else if(default_deconstruction_crowbar(user, I))
- return
- else if(istype(I, /obj/item/weapon/reagent_containers/glass))
+ if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(!beaker)
beaker = I
user.drop_item()
@@ -228,6 +283,13 @@
else
to_chat(user, "\The [src] has a beaker already.")
return
+ if(!occupant)
+ if(default_deconstruction_screwdriver(user, I))
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return
+ if(default_part_replacement(user, I))
+ return
/obj/machinery/sleeper/verb/move_eject()
set name = "Eject occupant"
@@ -351,3 +413,7 @@
desc = "A limited functionality sleeper, all it can do is put patients into stasis. It lacks the medication and configuration of the larger units."
icon_state = "sleeper"
stasis_level = 100 //Just one setting
+
+/obj/machinery/sleeper/survival_pod/Initialize()
+ ..()
+ RefreshParts(1)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 2062f92db4..1e3afe8150 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -24,6 +24,11 @@
component_parts += new /obj/item/stack/material/glass/reinforced(src, 2)
RefreshParts()
+/obj/machinery/bodyscanner/Destroy()
+ if(console)
+ console.scanner = null
+ return ..()
+
/obj/machinery/bodyscanner/power_change()
..()
if(!(stat & (BROKEN|NOPOWER)))
@@ -32,11 +37,7 @@
set_light(0)
/obj/machinery/bodyscanner/attackby(var/obj/item/G, user as mob)
- if(default_deconstruction_screwdriver(user, G))
- return
- else if(default_deconstruction_crowbar(user, G))
- return
- else if(istype(G, /obj/item/weapon/grab))
+ if(istype(G, /obj/item/weapon/grab))
var/obj/item/weapon/grab/H = G
if(panel_open)
to_chat(user, "Close the maintenance panel first.")
@@ -61,6 +62,11 @@
update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such.
add_fingerprint(user)
qdel(G)
+ if(!occupant)
+ if(default_deconstruction_screwdriver(user, G))
+ return
+ if(default_deconstruction_crowbar(user, G))
+ return
/obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/O, mob/user as mob)
if(!istype(O))
@@ -176,6 +182,11 @@
..()
findscanner()
+/obj/machinery/body_scanconsole/Destroy()
+ if(scanner)
+ scanner.console = null
+ return ..()
+
/obj/machinery/body_scanconsole/attackby(var/obj/item/I, var/mob/user)
if(computer_deconstruction_screwdriver(user, I))
return
@@ -245,18 +256,18 @@
if(stat & (NOPOWER|BROKEN))
return
+ if(!scanner)
+ findscanner()
+ if(!scanner)
+ to_chat(user, "Scanner not found!")
+ return
+
if (scanner.panel_open)
to_chat(user, "Close the maintenance panel first.")
return
- if(!scanner)
- findscanner()
- if(scanner)
- return ui_interact(user)
- else if(scanner)
+ if(scanner)
return ui_interact(user)
- else
- to_chat(user, "Scanner not found!")
/obj/machinery/body_scanconsole/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
@@ -389,7 +400,7 @@
occupantData = attempt_vr(scanner,"get_occupant_data_vr",list(occupantData,H)) //VOREStation Insert
data["occupant"] = occupantData
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "adv_med.tmpl", "Body Scanner", 690, 800)
ui.set_initial_data(data)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 1ce64f4aed..e74174d921 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -497,7 +497,7 @@
if(!(locked && !remote_connection) || remote_access || issilicon(user))
populate_controls(data)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "air_alarm.tmpl", name, 325, 625, master_ui = master_ui, state = state)
ui.set_initial_data(data)
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 839470f356..c18d2b9e93 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -117,7 +117,7 @@ obj/machinery/computer/general_air_control/Destroy()
data["sensors"] = sensors_ui
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 525, 600)
ui.set_initial_data(data)
@@ -174,7 +174,7 @@ obj/machinery/computer/general_air_control/Destroy()
data["input_flow_setting"] = round(input_flow_setting, 0.1)
data["pressure_setting"] = pressure_setting
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 660, 500)
ui.set_initial_data(data)
@@ -284,7 +284,7 @@ obj/machinery/computer/general_air_control/Destroy()
data["input_flow_setting"] = round(input_flow_setting, 0.1)
data["pressure_setting"] = pressure_setting
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500)
ui.set_initial_data(data)
@@ -416,7 +416,7 @@ obj/machinery/computer/general_air_control/Destroy()
else
data["device_info"] = null
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500)
ui.set_initial_data(data)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 21d3e81591..ed23884103 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -260,7 +260,7 @@ update_flag
..()
- GLOB.nanomanager.update_uis(src) // Update all NanoUIs attached to src
+ SSnanoui.update_uis(src) // Update all NanoUIs attached to src
/obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
@@ -288,7 +288,7 @@ update_flag
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure()))
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 7e2c786734..758c2a57cb 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -138,7 +138,7 @@
if (holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0))
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "portpump.tmpl", "Portable Pump", 480, 410, state = physical_state)
ui.set_initial_data(data)
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 0a47342086..55afd7f35f 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -114,7 +114,7 @@
if (holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0))
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state)
ui.set_initial_data(data)
@@ -195,7 +195,7 @@
update_use_power(new_use_power)
if(!on)
return
-
+
var/power_draw = -1
var/datum/gas_mixture/environment = loc.return_air()
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 0ce85959ef..c04760b4ef 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -304,7 +304,7 @@
storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000
storage_capacity["glass"] = mb_rating * 12500
build_time = 50 / man_rating
- mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.8. Maximum rating of parts is 3
+ mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.6. Maximum rating of parts is 5
/obj/machinery/autolathe/dismantle()
for(var/mat in stored_material)
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index cc982ce207..f60fcabbfa 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -19,6 +19,7 @@
var/base_print_delay = 100 // For Adminbus reasons
var/printing
var/loaded_dna //Blood sample for DNA hashing.
+ var/malfunctioning = FALSE // May cause rejection, or the printing of some alien limb instead!
// These should be subtypes of /obj/item/organ
// Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity
@@ -76,10 +77,19 @@
/obj/machinery/organ_printer/RefreshParts()
// Print Delay updating
print_delay = base_print_delay
+ var/manip_rating = 0
for(var/obj/item/weapon/stock_parts/manipulator/manip in component_parts)
+ manip_rating += manip.rating
print_delay -= (manip.rating-1)*10
print_delay = max(0,print_delay)
+ manip_rating = round(manip_rating / 2)
+
+ if(manip_rating >= 5)
+ malfunctioning = TRUE
+ else
+ malfunctioning = initial(malfunctioning)
+
. = ..()
/obj/machinery/organ_printer/attack_hand(mob/user)
@@ -182,7 +192,17 @@
O.set_dna(C.dna)
O.species = C.species
- if(istype(O, /obj/item/organ/external))
+ var/malfunctioned = FALSE
+
+ if(malfunctioning && prob(30)) // Alien Tech is a hell of a drug.
+ malfunctioned = TRUE
+ var/possible_species = list(SPECIES_HUMAN, SPECIES_VOX, SPECIES_SKRELL, SPECIES_ZADDAT, SPECIES_UNATHI, SPECIES_GOLEM, SPECIES_SHADOW)
+ var/new_species = pick(possible_species)
+ if(!all_species[new_species])
+ new_species = SPECIES_HUMAN
+ O.species = all_species[new_species]
+
+ if(istype(O, /obj/item/organ/external) && !malfunctioned)
var/obj/item/organ/external/E = O
E.sync_colour_to_human(C)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index ef1beeaac0..d81070e1f2 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -55,7 +55,7 @@
data["table"] = table
data["victim"] = victim_ui
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "operating.tmpl", src.name, 380, 400)
ui.set_initial_data(data)
@@ -69,4 +69,4 @@
usr.set_machine(src)
src.add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
\ No newline at end of file
+ SSnanoui.update_uis(src)
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index a1f9f227fc..00d1623e5b 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -140,7 +140,7 @@
data["enemyHP"] = enemy_hp
data["gameOver"] = gameover
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "arcade_battle.tmpl", src.name, 400, 300)
ui.set_initial_data(data)
@@ -202,7 +202,7 @@
emagged = 0
src.add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return
/obj/machinery/computer/arcade/battle/proc/arcade_action()
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index d757ae777d..e2b3fc4638 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -37,7 +37,7 @@ var/global/list/minor_air_alarms = list()
data["priority_alarms"] = major_alarms
data["minor_alarms"] = minor_alarms
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "atmos_alert.tmpl", src.name, 500, 500)
ui.set_initial_data(data)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index c05a886046..4ac34cf157 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -49,7 +49,7 @@
switch_to_camera(user, current_camera)
data["map_levels"] = using_map.get_map_levels(src.z)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800)
@@ -152,7 +152,7 @@
/obj/machinery/computer/security/process()
if(cache_id != camera_repository.camera_cache_id)
cache_id = camera_repository.camera_cache_id
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/computer/security/proc/can_access_camera(var/obj/machinery/camera/C)
var/list/shared_networks = src.network & C.network
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 9f43bd077e..42a418c7ad 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -68,7 +68,7 @@
id_card.forceMove(src)
modify = id_card
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
attack_hand(user)
/obj/machinery/computer/card/attack_ai(var/mob/user as mob)
@@ -139,7 +139,7 @@
data["regions"] = regions
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "identification_computer.tmpl", src.name, 600, 700)
ui.set_initial_data(data)
@@ -235,7 +235,7 @@
modify.registered_name = temp_name
else
src.visible_message("[src] buzzes rudely.")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if ("account")
if (is_authenticated())
@@ -243,7 +243,7 @@
if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
var/account_num = text2num(href_list["account"])
modify.associated_account_number = account_num
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if ("mode")
mode = text2num(href_list["mode_target"])
@@ -253,7 +253,7 @@
printing = 1
spawn(50)
printing = null
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
var/obj/item/weapon/paper/P = new(loc)
if (mode)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 44a1f69945..96e6f6b5f9 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -146,7 +146,7 @@
data["diskette"] = diskette
data["temp"] = temp
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "cloning.tmpl", src.name, 400, 450)
ui.set_initial_data(data)
@@ -284,7 +284,7 @@
temp = ""
scantemp = ""
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
add_fingerprint(usr)
/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob)
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index eaea426c07..a1fd7199b2 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -104,7 +104,7 @@
if(!giver && user.unEquip(I))
I.forceMove(src)
giver = I
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
else if(giver)
user << "There is already ID card inside."
return
@@ -150,7 +150,7 @@
data["log"] = internal_log
data["uid"] = uid
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "guest_pass.tmpl", src.name, 400, 520)
ui.set_initial_data(data)
@@ -242,4 +242,4 @@
usr << "Cannot issue pass without issuing ID."
src.add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
\ No newline at end of file
+ SSnanoui.update_uis(src)
\ No newline at end of file
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index c6c2c94a9e..3e06e19e52 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -19,7 +19,7 @@
data["is_ai"] = issilicon(user)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500)
ui.set_initial_data(data)
diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm
index f4a68b12d5..6170b302a2 100644
--- a/code/game/machinery/computer/supply.dm
+++ b/code/game/machinery/computer/supply.dm
@@ -171,7 +171,7 @@
data["contraband"] = can_order_contraband || (authorization & SUP_CONTRABAND)
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm
index 8e49a138e3..caeecb2e27 100644
--- a/code/game/machinery/computer/timeclock_vr.dm
+++ b/code/game/machinery/computer/timeclock_vr.dm
@@ -48,7 +48,7 @@
if(!card && user.unEquip(I))
I.forceMove(src)
card = I
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
update_icon()
else if(card)
to_chat(user, "There is already ID card inside.")
@@ -88,7 +88,7 @@
// if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open
// data["job_choices"] = getOpenOnDutyJobs(user, job.department)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "timeclock_vr.tmpl", capitalize(src.name), 500, 520)
ui.set_initial_data(data)
diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm
index 79f297157c..7c4e458832 100644
--- a/code/game/machinery/computer3/lapvend.dm
+++ b/code/game/machinery/computer3/lapvend.dm
@@ -34,11 +34,11 @@
if(vendmode == 1 && I)
scan_id(I, W)
vendmode = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(vendmode == 2 && I)
if(reimburse_id(I, W))
vendmode = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(vendmode == 0)
if(istype(W, /obj/item/device/laptop))
var/obj/item/device/laptop/L = W
@@ -48,7 +48,7 @@
L.loc = src
vendmode = 2
to_chat(user, "You slot your [L.name] into \The [src.name]")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
else
..()
@@ -77,7 +77,7 @@
data["power"] = power
data["total"] = total()
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "laptop_vendor.tmpl", src.name, 480, 425)
ui.set_initial_data(data)
@@ -136,7 +136,7 @@
vendmode = 0
src.add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/lapvend/proc/vend()
if(cardreader > 0)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 31942366a9..b4927f441c 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -141,7 +141,7 @@
data["beakerVolume"] += R.volume
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
@@ -205,7 +205,7 @@
var/mob/M = grab.affecting
qdel(grab)
put_mob(M)
-
+
return
/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to put people into cryo without external assistance
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index ec127a4599..cda908f800 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -513,6 +513,12 @@
//visible_message("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3)
visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].", 3)
+ //VOREStation Edit begin: Dont delete mobs-in-mobs
+ if(to_despawn.client && to_despawn.stat<2)
+ var/mob/observer/dead/newghost = to_despawn.ghostize()
+ newghost.timeofdeath = world.time
+ //VOREStation Edit end: Dont delete mobs-in-mobs
+
//This should guarantee that ghosts don't spawn.
to_despawn.ckey = null
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 0dff930291..c31c8f650b 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -746,7 +746,7 @@ About the new airlock wires panel:
data["commands"] = commands
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls", 450, 350, state = state)
ui.set_initial_data(data)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index c25bde5ed6..d276efef35 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -27,7 +27,7 @@
var/destroy_hits = 10 //How many strong hits it takes to destroy the door
var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon
var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon
- var/obj/item/stack/material/steel/repairing
+ var/repairing = 0
var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened.
var/close_door_at = 0 //When to automatically close the door, if possible
@@ -209,18 +209,18 @@
/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob)
src.add_fingerprint(user)
- if (attempt_vr(src,"attackby_vr",list(I, user))) return
-
if(istype(I))
+ if(attackby_vr(I, user)) //VOREStation begin: Fireproofing
+ return //VOREStation begin: Fireproofing
if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name())
if(stat & BROKEN)
- user << "It looks like \the [src] is pretty busted. It's going to need more than just patching up now."
+ to_chat(user, "It looks like \the [src] is pretty busted. It's going to need more than just patching up now.")
return
if(health >= maxhealth)
- user << "Nothing to fix!"
+ to_chat(user, "Nothing to fix!")
return
if(!density)
- user << "\The [src] must be closed before you can repair it."
+ to_chat(user, "\The [src] must be closed before you can repair it.")
return
//figure out how much metal we need
@@ -228,44 +228,45 @@
amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc?
var/obj/item/stack/stack = I
- var/transfer
- if (repairing)
- transfer = stack.transfer_to(repairing, amount_needed - repairing.amount)
- if (!transfer)
- user << "You must weld or remove \the [repairing] from \the [src] before you can add anything else."
+ var/amount_given = amount_needed - repairing
+ var/mats_given = stack.get_amount()
+ if(repairing && amount_given <= 0)
+ to_chat(user, "You must weld or remove \the [get_material_name()] from \the [src] before you can add anything else.")
else
- repairing = stack.split(amount_needed)
- if (repairing)
- repairing.loc = src
- transfer = repairing.amount
-
- if (transfer)
- user << "You fit [transfer] [stack.singular_name]\s to damaged and broken parts on \the [src]."
+ if(mats_given >= amount_given)
+ if(stack.use(amount_given))
+ repairing += amount_given
+ else
+ if(stack.use(mats_given))
+ repairing += mats_given
+ amount_given = mats_given
+ if(amount_given)
+ to_chat(user, "You fit [amount_given] [stack.singular_name]\s to damaged and broken parts on \the [src].")
return
if(repairing && istype(I, /obj/item/weapon/weldingtool))
if(!density)
- user << "\The [src] must be closed before you can repair it."
+ to_chat(user, "\The [src] must be closed before you can repair it.")
return
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
- user << "You start to fix dents and weld \the [repairing] into place."
+ to_chat(user, "You start to fix dents and weld \the [get_material_name()] into place.")
playsound(src, welder.usesound, 50, 1)
- if(do_after(user, (5 * repairing.amount) * welder.toolspeed) && welder && welder.isOn())
- user << "You finish repairing the damage to \the [src]."
- health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth)
+ if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn())
+ to_chat(user, "You finish repairing the damage to \the [src].")
+ health = between(health, health + repairing*DOOR_REPAIR_AMOUNT, maxhealth)
update_icon()
- qdel(repairing)
- repairing = null
+ repairing = 0
return
if(repairing && I.is_crowbar())
- user << "You remove \the [repairing]."
+ var/obj/item/stack/material/repairing_sheet = get_material().place_sheet(loc)
+ repairing_sheet.amount += repairing-1
+ repairing = 0
+ to_chat(user, "You remove \the [repairing_sheet].")
playsound(src, I.usesound, 100, 1)
- repairing.loc = user.loc
- repairing = null
return
//psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them.
@@ -325,13 +326,13 @@
/obj/machinery/door/examine(mob/user)
. = ..()
if(src.health <= 0)
- user << "\The [src] is broken!"
+ to_chat(user, "\The [src] is broken!")
if(src.health < src.maxhealth / 4)
- user << "\The [src] looks like it's about to break!"
+ to_chat(user, "\The [src] looks like it's about to break!")
else if(src.health < src.maxhealth / 2)
- user << "\The [src] looks seriously damaged!"
+ to_chat(user, "\The [src] looks seriously damaged!")
else if(src.health < src.maxhealth * 3/4)
- user << "\The [src] shows signs of damage!"
+ to_chat(user, "\The [src] shows signs of damage!")
/obj/machinery/door/proc/set_broken()
diff --git a/code/game/machinery/doors/door_vr.dm b/code/game/machinery/doors/door_vr.dm
index 58d84e2d7c..024162bc35 100644
--- a/code/game/machinery/doors/door_vr.dm
+++ b/code/game/machinery/doors/door_vr.dm
@@ -3,7 +3,7 @@
D.fire_act(adj_air, adj_temp, adj_volume)
/obj/machinery/door
- var/obj/item/stack/material/plasteel/reinforcing //vorestation addition
+ var/reinforcing = 0 //vorestation addition
/obj/machinery/door/firedoor
heat_proof = 1
@@ -33,113 +33,68 @@
return ..()
+// Returns true only if one of the actions unique to reinforcing is done, otherwise false and continuing normal attackby
/obj/machinery/door/proc/attackby_vr(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel") // Add heat shielding if it isn't already.
- if(!heat_proof)
- var/obj/item/stack/stack = I
- var/transfer
- var/amount_needed = 2
- if(stat & BROKEN)
- user << "It looks like \the [src] is pretty busted."
- if (reinforcing)
- transfer = stack.transfer_to(reinforcing, amount_needed - reinforcing.amount)
- if (!transfer)
- user << "You must weld or remove \the [reinforcing] from \the [src] before you can add anything else."
- return 1
+ if(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel")
+ if(heat_proof)
+ to_chat(user, "\The [src] is already reinforced.")
+ return TRUE
+ if((stat & BROKEN) || (health < maxhealth))
+ to_chat(user, "It looks like \the [src] broken. Repair it before reinforcing it.")
+ return TRUE
+ if(!density)
+ to_chat(user, "\The [src] must be closed before you can reinforce it.")
+ return TRUE
+
+ var/amount_needed = 2
+
+ var/obj/item/stack/stack = I
+ var/amount_given = amount_needed - reinforcing
+ var/mats_given = stack.get_amount()
+ if(reinforcing && amount_given <= 0)
+ to_chat(user, "You must weld or remove \the plasteel from \the [src] before you can add anything else.")
+ else
+ if(mats_given >= amount_given)
+ if(stack.use(amount_given))
+ reinforcing += amount_given
else
- reinforcing = stack.split(amount_needed)
- if (reinforcing)
- reinforcing.loc = src
- transfer = reinforcing.amount
-
- if (transfer)
- user << "You fit [transfer] [stack.singular_name]\s to \the [src]."
- return 1
-
- if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name())
- if(stat & BROKEN)
- if(health >= maxhealth && destroy_hits >= 10)
- user << "The [src] is about as shored up as it's going to get."
- return 1
- if(!density)
- user << "\The [src] must be closed before you can repair it."
- return 1
-
- //figure out how much metal we need
- var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT
- if (destroy_hits < 10)
- amount_needed += (20*(10 - destroy_hits) / DOOR_REPAIR_AMOUNT)
- amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc?
-
- var/obj/item/stack/stack = I
- var/transfer
- if (repairing)
- transfer = stack.transfer_to(repairing, amount_needed - repairing.amount)
- if (!transfer)
- user << "You must weld or remove \the [repairing] from \the [src] before you can add anything else."
- else
- repairing = stack.split(amount_needed)
- if (repairing)
- repairing.loc = src
- transfer = repairing.amount
-
- if (transfer)
- user << "\The [src] is completely broken inside, but you manage to fit [transfer] [stack.singular_name]\s to shore it up."
-
- return 1
-
- return 0
+ if(stack.use(mats_given))
+ reinforcing += mats_given
+ amount_given = mats_given
+ if(amount_given)
+ to_chat(user, "You fit [amount_given] [stack.singular_name]\s on \the [src].")
+ return TRUE
if(reinforcing && istype(I, /obj/item/weapon/weldingtool))
- var/amount_needed = 2
if(!density)
- user << "\The [src] must be closed before you can repair it."
- return 1
- if (reinforcing.amount < amount_needed)
- user << "You need [amount_needed] [reinforcing.singular_name]\s to reinforce \the [src]."
- return 1
+ to_chat(user, "\The [src] must be closed before you can reinforce it.")
+ return TRUE
+
+ if(reinforcing < 2)
+ to_chat(user, "You will need more plasteel to reinforce \the [src].")
+ return TRUE
+
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
- user << "You start to weld \the [reinforcing] into place."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, 5 * reinforcing.amount) && welder && welder.isOn())
- user << "You finish reinforcing \the [src]."
+ to_chat(user, "You start weld \the plasteel into place.")
+ playsound(src, welder.usesound, 50, 1)
+ if(do_after(user, 10 * welder.toolspeed) && welder && welder.isOn())
+ to_chat(user, "You finish reinforcing \the [src].")
heat_proof = 1
update_icon()
- qdel(reinforcing)
- reinforcing = null
- return 1
-
- if(repairing && istype(I, /obj/item/weapon/weldingtool) && (stat & BROKEN))
- if(!density)
- user << "\The [src] must be closed before you can shore it up."
- return 1
-
- var/obj/item/weapon/weldingtool/welder = I
- if(welder.remove_fuel(0,user))
- user << "You start to weld \the [repairing] into place."
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, 5 * repairing.amount) && welder && welder.isOn())
- user << "You finish shoring up \the [src]. It'll hold for at least a little while."
- var/damagerepaired = repairing.amount*DOOR_REPAIR_AMOUNT
- if (destroy_hits < 10)
- var/severedamage = 10 - destroy_hits
- destroy_hits = between(destroy_hits, destroy_hits + (damagerepaired)/20, 10)
- damagerepaired -= 20 * severedamage
- health = between(health, health + damagerepaired, maxhealth)
- update_icon()
- qdel(repairing)
- repairing = null
- return 1
+ reinforcing = 0
+ return TRUE
if(reinforcing && I.is_crowbar())
- user << "You remove \the [reinforcing]."
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
- reinforcing.loc = user.loc
- reinforcing = null
- return 1
- return 0
+ var/obj/item/stack/material/plasteel/reinforcing_sheet = new /obj/item/stack/material/plasteel(src.loc)
+ reinforcing_sheet.amount = reinforcing
+ reinforcing = 0
+ to_chat(user, "You remove \the [reinforcing_sheet].")
+ playsound(src, I.usesound, 100, 1)
+ return TRUE
+
+ return FALSE
/obj/machinery/door/blast/regular/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return // blast doors are immune to fire completely.
diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm
index 11893fa5ca..0f8b797289 100644
--- a/code/game/machinery/embedded_controller/airlock_controllers.dm
+++ b/code/game/machinery/embedded_controller/airlock_controllers.dm
@@ -33,7 +33,7 @@
"secure" = program.memory["secure"]
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "advanced_airlock_console.tmpl", name, 470, 290)
@@ -89,7 +89,7 @@
"processing" = program.memory["processing"],
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "simple_airlock_console.tmpl", name, 470, 290)
@@ -153,7 +153,7 @@
"processing" = program.memory["processing"]
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "door_access_console.tmpl", name, 330, 220)
diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm
index fa7d5dfa04..e88b046c10 100644
--- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm
+++ b/code/game/machinery/embedded_controller/airlock_docking_controller.dm
@@ -24,7 +24,7 @@
"override_enabled" = docking_program.override_enabled,
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)
diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
index bdce39de14..5614d0be63 100644
--- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
+++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
@@ -35,7 +35,7 @@
"airlocks" = airlocks,
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "multi_docking_console.tmpl", name, 470, 290)
@@ -73,7 +73,7 @@
"override_enabled" = airlock_program.override_enabled,
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)
diff --git a/code/game/machinery/embedded_controller/simple_docking_controller.dm b/code/game/machinery/embedded_controller/simple_docking_controller.dm
index 8e5c941bbf..14b27b2512 100644
--- a/code/game/machinery/embedded_controller/simple_docking_controller.dm
+++ b/code/game/machinery/embedded_controller/simple_docking_controller.dm
@@ -19,7 +19,7 @@
"door_lock" = docking_program.memory["door_status"]["lock"],
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290)
diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm
index fee3fbd0ec..fbfbc04abf 100644
--- a/code/game/machinery/exonet_node.dm
+++ b/code/game/machinery/exonet_node.dm
@@ -123,7 +123,7 @@
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
@@ -167,7 +167,7 @@
log_game(msg)
update_icon()
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
add_fingerprint(usr)
// Proc: get_exonet_node()
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index b952f678bb..475f22a7d7 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -265,7 +265,7 @@
data["tracks"] = nano_tracks
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "jukebox.tmpl", title, 450, 600)
ui.set_initial_data(data)
diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm
index 0720b03b26..74cc399beb 100644
--- a/code/game/machinery/oxygen_pump.dm
+++ b/code/game/machinery/oxygen_pump.dm
@@ -202,7 +202,7 @@
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm
index 736474f453..d2d9079ab1 100644
--- a/code/game/machinery/partslathe_vr.dm
+++ b/code/game/machinery/partslathe_vr.dm
@@ -280,7 +280,7 @@
recipies_ui[++recipies_ui.len] = list("name" = R.name, "type" = "[T]")
data["recipies"] = recipies_ui
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "partslathe.tmpl", "Parts Lathe UI", 500, 450)
ui.set_initial_data(data)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index b044cc4c90..948ef595c8 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -327,7 +327,7 @@
settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all)
data["settings"] = settings
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
ui.set_initial_data(data)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index c201264c3c..0b985d3047 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -44,7 +44,7 @@ obj/machinery/recharger
if(E.self_recharge)
to_chat(user, "Your gun has no recharge port.")
return
- if(!G.get_cell())
+ if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/nsfw_batt)) //VOREStation Edit: NSFW charging
to_chat(user, "This device does not have a battery installed.")
return
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 5c81cfe31f..a150aaf566 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -127,7 +127,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["msgVerified"] = msgVerified
data["announceAuth"] = announceAuth
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "request_console.tmpl", "[department] Request Console", 520, 410)
ui.set_initial_data(data)
@@ -215,24 +215,23 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(computer_deconstruction_screwdriver(user, O))
return
if(istype(O, /obj/item/device/multitool))
- if(panel_open)
- var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
- if(!input)
- to_chat(usr, "No input found. Please hang up and try your call again.")
- return
- department = input
- announcement.title = "[department] announcement"
- announcement.newscast = 1
-
- name = "[department] Requests Console"
- allConsoles += src
- if(departmentType & RC_ASSIST)
- req_console_assistance |= department
- if(departmentType & RC_SUPPLY)
- req_console_supplies |= department
- if(departmentType & RC_INFO)
- req_console_information |= department
+ var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
+ if(!input)
+ to_chat(usr, "No input found. Please hang up and try your call again.")
return
+ department = input
+ announcement.title = "[department] announcement"
+ announcement.newscast = 1
+
+ name = "[department] Requests Console"
+ allConsoles += src
+ if(departmentType & RC_ASSIST)
+ req_console_assistance |= department
+ if(departmentType & RC_SUPPLY)
+ req_console_supplies |= department
+ if(departmentType & RC_INFO)
+ req_console_information |= department
+ return
if(istype(O, /obj/item/weapon/card/id))
if(inoperable(MAINT)) return
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 1d3556b45e..302823c82d 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -14,7 +14,7 @@
id = "[rand(1000, 9999)]"
..()
underlays.Cut()
- underlays += image('icons/obj/stationobjs.dmi', icon_state = "telecomp-wires")
+ underlays += image('icons/obj/stationobjs_vr.dmi', icon_state = "telecomp-wires") //VOREStation Edit: different direction for wires to account for dirs
return
/obj/machinery/computer/teleporter/Initialize()
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index c1911d6a05..4319e11127 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -137,7 +137,7 @@
data["settings"] = settings
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
ui.set_initial_data(data)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 383e2844d7..d397c03cb1 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -169,7 +169,7 @@
vend(currently_vending, usr)
return
else if(handled)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return // don't smack that machine with your 2 thalers
if(I || istype(W, /obj/item/weapon/spacecash))
@@ -183,7 +183,7 @@
if(panel_open)
overlays += image(icon, "[initial(icon_state)]-panel")
- GLOB.nanomanager.update_uis(src) // Speaker switch is on the main UI, not wires UI
+ SSnanoui.update_uis(src) // Speaker switch is on the main UI, not wires UI
return
else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter())
if(panel_open)
@@ -195,7 +195,7 @@
coin = W
categories |= CAT_COIN
to_chat(user, "You insert \the [W] into \the [src].")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return
else if(W.is_wrench())
playsound(src, W.usesound, 100, 1)
@@ -399,7 +399,7 @@
else
data["panel"] = 0
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "vending_machine.tmpl", name, 440, 600)
ui.set_initial_data(data)
@@ -459,7 +459,7 @@
shut_up = !shut_up
add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/vending/proc/vend(datum/stored_item/vending_product/R, mob/user)
if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
@@ -470,7 +470,7 @@
vend_ready = 0 //One thing at a time!!
status_message = "Vending..."
status_error = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(R.category & CAT_COIN)
if(!coin)
@@ -512,7 +512,7 @@
status_error = 0
vend_ready = 1
currently_vending = null
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return 1
@@ -568,7 +568,7 @@
if(has_logs)
do_logging(R, user)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/vending/process()
if(stat & (BROKEN|NOPOWER))
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 5a80ed7cc3..c326574eeb 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -13,7 +13,8 @@
var/speed = 1
var/mat_efficiency = 1
- var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0)
+ var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0)
+ var/list/hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
var/res_max_amount = 200000
var/datum/research/files
@@ -75,7 +76,7 @@
var/T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating
- mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5
+ mat_efficiency = max(1 - (T - 1) / 4, 0.2) // 1 -> 0.2
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both
T += M.rating
speed = T / 2 // 1 -> 3
@@ -103,7 +104,7 @@
if(current)
data["builtperc"] = round((progress / current.time) * 100)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600)
ui.set_initial_data(data)
@@ -273,7 +274,13 @@
/obj/machinery/mecha_part_fabricator/proc/get_materials()
. = list()
for(var/T in materials)
- . += list(list("mat" = capitalize(T), "amt" = materials[T]))
+ var/hidden_mat = FALSE
+ for(var/HM in hidden_materials) // Direct list contents comparison was failing.
+ if(T == HM && materials[T] == 0)
+ hidden_mat = TRUE
+ continue
+ if(!hidden_mat)
+ . += list(list("mat" = capitalize(T), "amt" = materials[T]))
/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
var/recursive = amount == -1 ? 1 : 0
diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm
index c77bf27a92..d2d0b8b55f 100644
--- a/code/game/mecha/mech_prosthetics.dm
+++ b/code/game/mecha/mech_prosthetics.dm
@@ -13,7 +13,8 @@
var/speed = 1
var/mat_efficiency = 1
- var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0)
+ var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0)
+ var/list/hidden_materials = list(MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM)
var/res_max_amount = 200000
var/datum/research/files
@@ -77,7 +78,7 @@
var/T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating
- mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5
+ mat_efficiency = max(0.2, 1 - (T - 1) / 4) // 1 -> 0.2
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both
T += M.rating
speed = T / 2 // 1 -> 3
@@ -113,7 +114,7 @@
if(current)
data["builtperc"] = round((progress / current.time) * 100)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "mechfab.tmpl", "Prosthetics Fab UI", 800, 600)
ui.set_initial_data(data)
@@ -299,7 +300,13 @@
/obj/machinery/pros_fabricator/proc/get_materials()
. = list()
for(var/T in materials)
- . += list(list("mat" = capitalize(T), "amt" = materials[T]))
+ var/hidden_mat = FALSE
+ for(var/HM in hidden_materials) // Direct list contents comparison was failing.
+ if(T == HM && materials[T] == 0)
+ hidden_mat = TRUE
+ continue
+ if(!hidden_mat)
+ . += list(list("mat" = capitalize(T), "amt" = materials[T]))
/obj/machinery/pros_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
var/recursive = amount == -1 ? 1 : 0
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 2ce02adb67..a679f5e1b6 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -51,20 +51,10 @@
/atom/movable/proc/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
- if(!buckled_mobs)
- buckled_mobs = list()
-
- if(!istype(M))
- return FALSE
-
if(check_loc && M.loc != loc)
return FALSE
- if((!can_buckle && !forced) || M.buckled || M.pinned.len || (buckled_mobs.len >= max_buckled_mobs) || (buckle_require_restraints && !M.restrained()))
- return FALSE
-
- if(has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs) //Handles trying to buckle yourself to the chair when someone is on it
- to_chat(M, "\The [src] can't buckle anymore people.")
+ if(!can_buckle_check(M, forced))
return FALSE
M.buckled = src
@@ -130,6 +120,8 @@
if(M in buckled_mobs)
to_chat(user, "\The [M] is already buckled to \the [src].")
return FALSE
+ if(!can_buckle_check(M, forced))
+ return FALSE
add_fingerprint(user)
// unbuckle_mob()
@@ -195,3 +187,19 @@
else
L.set_dir(dir)
return TRUE
+
+/atom/movable/proc/can_buckle_check(mob/living/M, forced = FALSE)
+ if(!buckled_mobs)
+ buckled_mobs = list()
+
+ if(!istype(M))
+ return FALSE
+
+ if((!can_buckle && !forced) || M.buckled || M.pinned.len || (buckled_mobs.len >= max_buckled_mobs) || (buckle_require_restraints && !M.restrained()))
+ return FALSE
+
+ if(has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs) //Handles trying to buckle yourself to the chair when someone is on it
+ to_chat(M, "\The [src] can't buckle anymore people.")
+ return FALSE
+
+ return TRUE
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index dc4bf5146a..7dc82a0ffb 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -13,18 +13,24 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
anchored = 1.0
/obj/effect/portal/Bumped(mob/M as mob|obj)
+ if(istype(M,/mob) && !(istype(M,/mob/living)))
+ return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(M)
return
return
/obj/effect/portal/Crossed(AM as mob|obj)
+ if(istype(AM,/mob) && !(istype(AM,/mob/living)))
+ return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(AM)
return
return
/obj/effect/portal/attack_hand(mob/user as mob)
+ if(istype(user) && !(istype(user,/mob/living)))
+ return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(user)
return
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index f14b19b117..8af1c01a2a 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -5,12 +5,7 @@
desc = "Used for repairing or building APCs"
icon = 'icons/obj/apc_repair.dmi'
icon_state = "apc_frame"
-
-/obj/item/frame/apc/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if (W.is_wrench())
- new /obj/item/stack/material/steel( get_turf(src.loc), 2 )
- qdel(src)
+ refund_amt = 2
/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob)
if (get_dist(on_wall, user)>1)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 14c341ce34..c2a77936c4 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -467,7 +467,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui_tick++
- var/datum/nanoui/old_ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/old_ui = SSnanoui.get_open_ui(user, src, "main")
var/auto_update = 1
if(mode in no_auto_update)
auto_update = 0
@@ -647,7 +647,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
nanoUI = data
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
@@ -685,7 +685,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
..()
var/mob/user = usr
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
var/mob/living/U = usr
//Looking for master was kind of pointless since PDAs don't appear to have one.
//if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
@@ -1130,7 +1130,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
ai.show_message("Intercepted message from [who]: [t]")
P.new_message_from_pda(src, t)
- GLOB.nanomanager.update_user_uis(U, src) // Update the sending user's PDA UI so that they can see the new message
+ SSnanoui.update_user_uis(U, src) // Update the sending user's PDA UI so that they can see the new message
else
to_chat(U, "ERROR: Messaging server is not responding.")
@@ -1150,7 +1150,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(L)
if(reception_message)
L << reception_message
- GLOB.nanomanager.update_user_uis(L, src) // Update the receiving user's PDA UI so that they can see the new message
+ SSnanoui.update_user_uis(L, src) // Update the receiving user's PDA UI so that they can see the new message
/obj/item/device/pda/proc/new_news(var/message)
new_info(news_silent, newstone, news_silent ? "" : "\icon[src] [message]")
@@ -1196,7 +1196,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(can_use(usr))
mode = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
to_chat(usr, "You press the reset button on \the [src].")
else
to_chat(usr, "You cannot do this while restrained.")
@@ -1297,7 +1297,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
user.drop_item()
cartridge.loc = src
to_chat(usr, "You insert [cartridge] into [src].")
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
if(cartridge.radio)
cartridge.radio.hostpda = src
@@ -1325,7 +1325,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
C.loc = src
pai = C
to_chat(user, "You slot \the [C] into \the [src].")
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
else if(istype(C, /obj/item/weapon/pen))
var/obj/item/weapon/pen/O = locate() in src
if(O)
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 0ced4be973..cc7ac0e4a4 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -43,7 +43,7 @@
data["laws"] = laws
data["has_laws"] = laws.len
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "aicard.tmpl", "[name]", 600, 400, state = state)
ui.set_initial_data(data)
diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm
index d414232a80..69f5bd0d4b 100644
--- a/code/game/objects/items/devices/communicator/UI.dm
+++ b/code/game/objects/items/devices/communicator/UI.dm
@@ -125,7 +125,7 @@
// The value element is the actual data, and can take any form necessary for the template
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
@@ -261,7 +261,7 @@
notehtml = note
if(href_list["switch_template"])
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(usr, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(usr, src, "main")
if(ui)
ui.add_template("Body", href_list["switch_template"])
@@ -276,5 +276,5 @@
if(href_list["cartridge_topic"] && cartridge) // Has to have a cartridge to perform these functions
cartridge.Topic(href, href_list)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
add_fingerprint(usr)
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 6324af7fb5..b9a8eff8a4 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -234,7 +234,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
cartridge.forceMove(src)
to_chat(usr, "You slot \the [cartridge] into \the [src].")
modules[++modules.len] = list("module" = "External Device", "icon" = "external64", "number" = EXTRTAB)
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
return
// Proc: attack_self()
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 579e65787b..971eb26a46 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -121,7 +121,7 @@ var/global/list/default_medbay_channels = list(
if(syndie)
data["useSyndMode"] = 1
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430)
ui.set_initial_data(data)
@@ -232,7 +232,7 @@ var/global/list/default_medbay_channels = list(
return 1
if(.)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT
var/datum/radio_frequency/connection = null
@@ -724,7 +724,7 @@ var/global/list/default_medbay_channels = list(
. = 1
if(.)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/item/device/radio/borg/interact(mob/user as mob)
if(!on)
@@ -753,7 +753,7 @@ var/global/list/default_medbay_channels = list(
data["has_subspace"] = 1
data["subspace"] = subspace_transmission
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430)
ui.set_initial_data(data)
diff --git a/code/game/objects/items/devices/radio/radio_vr.dm b/code/game/objects/items/devices/radio/radio_vr.dm
index d3681423f3..7e00c83c97 100644
--- a/code/game/objects/items/devices/radio/radio_vr.dm
+++ b/code/game/objects/items/devices/radio/radio_vr.dm
@@ -22,8 +22,9 @@
name = "subspace radio"
desc = "A powerful new radio recently gifted to Nanotrasen from KHI, this communications device has the ability to send and recieve transmissions from anywhere."
icon = 'icons/vore/custom_items_vr.dmi'
+ icon_override = 'icons/mob/back_vr.dmi'
icon_state = "radiopack"
- item_state = "parachute"
+ item_state = "radiopack"
slot_flags = SLOT_BACK
force = 5
throwforce = 6
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 8abc2eabc2..ccd339e180 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -37,7 +37,7 @@
log_game("[key_name_admin(user)] attached both tanks to a transfer valve.")
update_icon()
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
//TODO: Have this take an assemblyholder
else if(isassembly(item))
var/obj/item/device/assembly/A = item
@@ -58,7 +58,7 @@
message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)")
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
attacher = user
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
return
@@ -81,7 +81,7 @@
data["valveOpen"] = valve_open ? 1 : 0
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm
index 0bdb5a6b72..ea7006a73b 100644
--- a/code/game/objects/items/devices/uplink.dm
+++ b/code/game/objects/items/devices/uplink.dm
@@ -72,7 +72,7 @@
discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1)
next_offer_time = world.time + offer_time
update_nano_data()
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
// Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated.
/obj/item/device/uplink/hidden/proc/toggle()
@@ -110,7 +110,7 @@
data += nanoui_data
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui) // No auto-refresh
ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600, state = inventory_state)
data["menu"] = 0
@@ -138,7 +138,7 @@
UI.buy(src, usr)
else if(href_list["lock"])
toggle()
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
ui.close()
else if(href_list["return"])
nanoui_menu = round(nanoui_menu/10)
diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm
index 6f92178f09..a3c7709944 100644
--- a/code/game/objects/items/robot/robot_upgrades_vr.dm
+++ b/code/game/objects/items/robot/robot_upgrades_vr.dm
@@ -9,3 +9,21 @@
return 1
else
return 0
+
+//Robot resizing module
+
+/obj/item/borg/upgrade/sizeshift
+ name = "robot size alteration module"
+ desc = "Using technology similar to one used in sizeguns, allows cyborgs to adjust their own size as neccesary."
+ icon_state = "cyborg_upgrade2"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/sizeshift/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ if(/mob/living/proc/set_size in R.verbs)
+ return 0
+
+ R.verbs += /mob/living/proc/set_size
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index b22c4ca649..913506c9e6 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -197,6 +197,7 @@
board_type = new /datum/frame/frame_types/medical_pod
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/reagent_containers/glass/beaker = 3,
/obj/item/weapon/reagent_containers/syringe = 3,
diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm
index 1415edea84..ed158a347b 100644
--- a/code/game/objects/items/weapons/circuitboards/mecha.dm
+++ b/code/game/objects/items/weapons/circuitboards/mecha.dm
@@ -79,5 +79,28 @@
name = T_BOARD_MECHA("Odysseus central control")
icon_state = "mainboard"
+/obj/item/weapon/circuitboard/mecha/imperion
+ name = "Alien Circuit"
+ origin_tech = list(TECH_DATA = 5, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1)
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "circuit"
+
+/obj/item/weapon/circuitboard/mecha/imperion/main
+ desc = "It is marked with a strange glyph."
+
+/obj/item/weapon/circuitboard/mecha/imperion/peripherals
+ desc = "It is marked with a pulsing glyph."
+
+/obj/item/weapon/circuitboard/mecha/imperion/targeting
+ desc = "It is marked with an ominous glyph."
+
+/obj/item/weapon/circuitboard/mecha/imperion/phasing
+ desc = "It is marked with a disturbing glyph."
+
+/obj/item/weapon/circuitboard/mecha/imperion/damaged
+ name = "Damaged Alien Circuit"
+ desc = "It is marked with a constantly shifting glyph."
+ origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 1, TECH_PRECURSOR = 2)
+
//Undef the macro, shouldn't be needed anywhere else
#undef T_BOARD_MECHA
diff --git a/code/game/objects/items/weapons/id cards/syndicate_ids.dm b/code/game/objects/items/weapons/id cards/syndicate_ids.dm
index e1ceb489dd..bbf05718fc 100644
--- a/code/game/objects/items/weapons/id cards/syndicate_ids.dm
+++ b/code/game/objects/items/weapons/id cards/syndicate_ids.dm
@@ -58,7 +58,7 @@
data["electronic_warfare"] = electronic_warfare
data["entries"] = entries
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "agent_id_card.tmpl", "Fake ID", 600, 400)
ui.set_initial_data(data)
@@ -185,7 +185,7 @@
. = 1
// Always update the UI, or buttons will spin indefinitely
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/var/global/list/id_card_states
/proc/id_card_states()
diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm
index bf67f83953..bec23b4c2b 100644
--- a/code/game/objects/items/weapons/implants/implant_vr.dm
+++ b/code/game/objects/items/weapons/implants/implant_vr.dm
@@ -104,10 +104,7 @@
var/static/regex/size_mult = new/regex("\\d+")
if(size_mult.Find(msg))
var/resizing_value = text2num(size_mult.match)
- if(findtext(msg, "centimeter")) //Because metric system rules
- H.resize(CLAMP(resizing_value/170 , 0.25, 2)) //170 cm is average crewmember, I think
- else
- H.resize(CLAMP(resizing_value , 0.25, 2))
+ H.resize(CLAMP(resizing_value/100 , 0.25, 2))
@@ -128,7 +125,7 @@
description_info = {"Only accessable by those who implanted the victim. Self-implanting allows everyone to change host size. The following special commands are available:
'Shrink' - host size decreases.
'Grow' - host size increases.
-'Resize (NUMBER)' or 'Resize (NUMBER) centimeter(s)' - for accurate size control.
+'Resize (NUMBER)' - for accurate size control.
'Ignore' - keywords in the speech won't have any effect.
'Implant-toggle' - toggles implant."}
diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm
index d8fba58175..d981cafc07 100644
--- a/code/game/objects/items/weapons/material/material_armor.dm
+++ b/code/game/objects/items/weapons/material/material_armor.dm
@@ -105,6 +105,31 @@ Protectiveness | Armor %
if(!material) // No point checking for reflection.
return ..()
+ if(material.negation && prob(material.negation)) // Strange and Alien materials, or just really strong materials.
+ user.visible_message("\The [src] completely absorbs [attack_text]!")
+ return TRUE
+
+ if(material.spatial_instability && prob(material.spatial_instability))
+ user.visible_message("\The [src] flashes [user] clear of [attack_text]!")
+ var/list/turfs = new/list()
+ for(var/turf/T in orange(round(material.spatial_instability / 10) + 1, user))
+ if(istype(T,/turf/space)) continue
+ if(T.density) continue
+ if(T.x>world.maxx-6 || T.x<6) continue
+ if(T.y>world.maxy-6 || T.y<6) continue
+ turfs += T
+ if(!turfs.len) turfs += pick(/turf in orange(6))
+ var/turf/picked = pick(turfs)
+ if(!isturf(picked)) return
+
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, user.loc)
+ spark_system.start()
+ playsound(user.loc, 'sound/effects/teleport.ogg', 50, 1)
+
+ user.loc = picked
+ return PROJECTILE_FORCE_MISS
+
if(material.reflectivity)
if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam))
var/obj/item/projectile/P = damage_source
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index dae4a19d15..72fe26da36 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -134,7 +134,7 @@
/obj/item/weapon/melee/energy/sword/New()
if(random_color)
- blade_color = pick("red","blue","green","purple")
+ blade_color = pick("red","blue","green","purple","white")
lcolor = blade_color
/obj/item/weapon/melee/energy/sword/green/New()
@@ -153,6 +153,10 @@
blade_color = "purple"
lcolor = "#800080"
+/obj/item/weapon/melee/energy/sword/white/New()
+ blade_color = "white"
+ lcolor = "#FFFFFF"
+
/obj/item/weapon/melee/energy/sword/activate(mob/living/user)
if(!active)
to_chat(user, "\The [src] is now energised.")
@@ -161,7 +165,6 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
icon_state = "[active_state][blade_color]"
-
/obj/item/weapon/melee/energy/sword/deactivate(mob/living/user)
if(active)
to_chat(user, "\The [src] deactivates!")
@@ -237,6 +240,80 @@
target.taunt(user)
target.adjustFireLoss(force * 6) // 30 Burn, for 50 total.
+/*
+ * Charge blade. Uses a cell, and costs energy per strike.
+ */
+
+/obj/item/weapon/melee/energy/sword/charge
+ name = "charge sword"
+ desc = "A small, handheld device which emits a high-energy 'blade'."
+ origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
+ active_force = 25
+ armor_penetration = 25
+
+ var/hitcost = 75
+ var/obj/item/weapon/cell/bcell = null
+ var/cell_type = /obj/item/weapon/cell/device
+
+/obj/item/weapon/melee/energy/sword/charge/proc/use_charge(var/cost)
+ if(active)
+ if(bcell)
+ if(bcell.checked_use(cost))
+ return 1
+ else
+ return 0
+ return null
+
+/obj/item/weapon/melee/energy/sword/charge/examine(mob/user)
+ if(!..(user, 1))
+ return
+
+ if(bcell)
+ to_chat(user, "The blade is [round(bcell.percent())]% charged.")
+ if(!bcell)
+ to_chat(user, "The blade does not have a power source installed.")
+
+/obj/item/weapon/melee/energy/sword/charge/attack_self(mob/user as mob)
+ if((!bcell || bcell.charge < hitcost) && !active)
+ to_chat(user, "\The [src] does not seem to have power.")
+ return
+ ..()
+
+/obj/item/weapon/melee/energy/sword/charge/attack(mob/M, mob/user)
+ if(active)
+ if(!use_charge(hitcost))
+ deactivate(user)
+ visible_message("\The [src]'s blade flickers, before retracting.")
+ return ..()
+
+/obj/item/weapon/melee/energy/sword/charge/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, cell_type))
+ if(!bcell)
+ user.drop_item()
+ W.loc = src
+ bcell = W
+ to_chat(user, "You install a cell in [src].")
+ update_icon()
+ else
+ to_chat(user, "[src] already has a cell.")
+ else if(W.is_screwdriver() && bcell)
+ bcell.update_icon()
+ bcell.forceMove(get_turf(loc))
+ bcell = null
+ to_chat(user, "You remove the cell from \the [src].")
+ deactivate()
+ update_icon()
+ return
+ else
+ ..()
+
+/obj/item/weapon/melee/energy/sword/charge/get_cell()
+ return bcell
+
+/obj/item/weapon/melee/energy/sword/charge/loaded/New()
+ ..()
+ bcell = new/obj/item/weapon/cell/device/weapon(src)
+
/*
*Energy Blade
*/
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 0962eef6f3..fb7a9accd4 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -263,7 +263,7 @@ var/list/global/tank_gauge_cache = list()
data["maskConnected"] = 1
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm
index 477815e62f..73b62f0741 100644
--- a/code/game/objects/items/weapons/tools/crowbar.dm
+++ b/code/game/objects/items/weapons/tools/crowbar.dm
@@ -51,6 +51,24 @@
toolspeed = 0.1
origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 4)
+/obj/item/weapon/tool/crowbar/hybrid
+ name = "strange crowbar"
+ desc = "A crowbar whose head seems to phase in and out of view."
+ catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar)
+ icon_state = "hybcrowbar"
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ toolspeed = 0.4
+ origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 3)
+ reach = 2
+
+/obj/item/weapon/tool/crowbar/hybrid/is_crowbar()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
+
/obj/item/weapon/tool/crowbar/cyborg
name = "hydraulic crowbar"
desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbars in industrial synthetics."
diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm
index cb6a7f7c90..a9bdd6cee8 100644
--- a/code/game/objects/items/weapons/tools/screwdriver.dm
+++ b/code/game/objects/items/weapons/tools/screwdriver.dm
@@ -92,6 +92,27 @@
toolspeed = 0.1
random_color = FALSE
+/obj/item/weapon/tool/screwdriver/hybrid
+ name = "strange screwdriver"
+ desc = "A strange conglomerate of a screwdriver."
+ icon_state = "hybscrewdriver"
+ item_state = "screwdriver_black"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
+ slowdown = 0.1
+ w_class = ITEMSIZE_NORMAL
+ usesound = 'sound/effects/uncloak.ogg'
+ toolspeed = 0.4
+ random_color = FALSE
+ reach = 2
+
+/obj/item/weapon/tool/screwdriver/hybrid/is_screwdriver()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
+
/obj/item/weapon/tool/screwdriver/cyborg
name = "powered screwdriver"
desc = "An electrical screwdriver, designed to be both precise and quick."
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
index 34535b05b8..3a969562f8 100644
--- a/code/game/objects/items/weapons/tools/weldingtool.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -121,15 +121,14 @@
remove_fuel(1)
if(get_fuel() < 1)
setWelding(0)
- //I'm not sure what this does. I assume it has to do with starting fires...
- //...but it doesnt check to see if the welder is on or not.
- var/turf/location = src.loc
- if(istype(location, /mob/living))
- var/mob/living/M = location
- if(M.item_is_in_hands(src))
- location = get_turf(M)
- if (istype(location, /turf))
- location.hotspot_expose(700, 5)
+ else //Only start fires when its on and has enough fuel to actually keep working
+ var/turf/location = src.loc
+ if(istype(location, /mob/living))
+ var/mob/living/M = location
+ if(M.item_is_in_hands(src))
+ location = get_turf(M)
+ if (istype(location, /turf))
+ location.hotspot_expose(700, 5)
/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
if(!proximity) return
@@ -437,6 +436,19 @@
nextrefueltick = world.time + 10
reagents.add_reagent("fuel", 1)
+/obj/item/weapon/weldingtool/experimental/hybrid
+ name = "strange welding tool"
+ desc = "An experimental welder capable of synthesizing its own fuel from spatial waveforms. It's like welding with a star!"
+ icon_state = "hybwelder"
+ max_fuel = 20
+ eye_safety_modifier = -2 // Brighter than the sun. Literally, you can look at the sun with a welding mask of proper grade, this will burn through that.
+ slowdown = 0.1
+ toolspeed = 0.25
+ w_class = ITEMSIZE_LARGE
+ flame_intensity = 5
+ origin_tech = list(TECH_ENGINEERING = 5, TECH_PHORON = 4, TECH_PRECURSOR = 1)
+ reach = 2
+
/*
* Backpack Welder.
*/
diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm
index f53225ab41..181c786c4c 100644
--- a/code/game/objects/items/weapons/tools/wirecutters.dm
+++ b/code/game/objects/items/weapons/tools/wirecutters.dm
@@ -73,6 +73,26 @@
usesound = 'sound/items/jaws_cut.ogg'
toolspeed = 0.5
+/obj/item/weapon/tool/wirecutters/hybrid
+ name = "strange wirecutters"
+ desc = "This cuts wires. With Science!"
+ icon_state = "hybcutters"
+ w_class = ITEMSIZE_NORMAL
+ slowdown = 0.1
+ origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_PHORON = 2)
+ attack_verb = list("pinched", "nipped", "warped", "blasted")
+ usesound = 'sound/effects/stealthoff.ogg'
+ toolspeed = 0.4
+ reach = 2
+
+/obj/item/weapon/tool/wirecutters/hybrid/is_wirecutter()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
+
/obj/item/weapon/tool/wirecutters/power
name = "jaws of life"
desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head."
diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm
index 7b1ab6a07c..652e32cf75 100644
--- a/code/game/objects/items/weapons/tools/wrench.dm
+++ b/code/game/objects/items/weapons/tools/wrench.dm
@@ -25,6 +25,29 @@
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
+/obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach.
+ name = "strange wrench"
+ desc = "A wrench with many common uses. Can be usually found in your hand."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "hybwrench"
+ slot_flags = SLOT_BELT
+ force = 8
+ throwforce = 10
+ w_class = ITEMSIZE_NORMAL
+ slowdown = 0.1
+ origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_PHORON = 2)
+ attack_verb = list("bashed", "battered", "bludgeoned", "whacked", "warped", "blasted")
+ usesound = 'sound/effects/stealthoff.ogg'
+ toolspeed = 0.5
+ reach = 2
+
+/obj/item/weapon/tool/wrench/hybrid/is_wrench()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
/datum/category_item/catalogue/anomalous/precursor_a/alien_wrench
name = "Precursor Alpha Object - Fastener Torque Tool"
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 5f051a4e78..8ff7ee844f 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -102,7 +102,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
data["replacer"] = myreplacer ? capitalize(myreplacer.name) : null
data["signs"] = signs ? "[signs] sign\s" : null
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "janitorcart.tmpl", "Janitorial cart", 240, 160)
ui.set_initial_data(data)
diff --git a/code/game/objects/structures/props/alien_props.dm b/code/game/objects/structures/props/alien_props.dm
index 1eb811838e..38f0b1b893 100644
--- a/code/game/objects/structures/props/alien_props.dm
+++ b/code/game/objects/structures/props/alien_props.dm
@@ -114,4 +114,12 @@
for(var/i = 1 to rand(1, 4))
var/new_tech = pick(techs)
techs -= new_tech
- origin_tech[new_tech] = rand(5, 9)
\ No newline at end of file
+ origin_tech[new_tech] = rand(5, 9)
+
+ origin_tech[TECH_PRECURSOR] = rand(0,2)
+
+/obj/item/prop/alien/phasecoil
+ name = "reverberating device"
+ desc = "A device pulsing with an ominous energy."
+ icon_state = "circuit_phase"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 6, TECH_PHORON = 3, TECH_POWER = 5, TECH_MAGNET = 5, TECH_DATA = 5, TECH_PRECURSOR = 2, TECH_ARCANE = 1)
diff --git a/code/game/verbs/character_directory.dm b/code/game/verbs/character_directory.dm
index 967715901d..1b45091cf7 100644
--- a/code/game/verbs/character_directory.dm
+++ b/code/game/verbs/character_directory.dm
@@ -29,6 +29,29 @@
html += "OOC notes"
html += "
[H.ooc_notes]
"
html += ""
+ if(isAI(C.mob))
+ var/mob/living/silicon/ai/A = C.mob
+ curID++
+ html += ""
+ html += "
[A.name] (Artificial Intelligence)
"
+ if(A.ooc_notes)
+ html += "
OOC notes"
+ html += "
[A.ooc_notes]
"
+ html += "
"
+ if(isrobot(C.mob))
+ var/mob/living/silicon/robot/R = C.mob
+ if(R.scrambledcodes || (R.module && R.module.hide_on_manifest))
+ continue
+ curID++
+ html += ""
+ html += "
[R.name] ([R.modtype] [R.braintype])
"
+ if(R.flavor_text)
+ html += "
Flavor text"
+ html += "
[R.flavor_text]
"
+ if(R.ooc_notes)
+ html += "
OOC notes"
+ html += "
[R.ooc_notes]
"
+ html += "
"
if(!curID)
html += "404: Station not found
"
diff --git a/code/global_init.dm b/code/global_init.dm
index 6e3f13d506..c562209183 100644
--- a/code/global_init.dm
+++ b/code/global_init.dm
@@ -18,8 +18,6 @@ var/global/datum/global_init/init = new ()
makeDatumRefLists()
load_configuration()
- initialize_chemical_reagents()
- initialize_chemical_reactions()
initialize_integrated_circuits_list()
qdel(src) //we're done
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index 35cff902d8..ce2c684c09 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -448,7 +448,7 @@
usr << "This can only be done on mobs with clients"
return
- GLOB.nanomanager.send_resources(H.client)
+ SSnanoui.send_resources(H.client)
usr << "Resource files sent"
H << "Your NanoUI Resource files have been refreshed"
diff --git a/code/modules/ai/aI_holder_subtypes/simple_mob_ai_vr.dm b/code/modules/ai/aI_holder_subtypes/simple_mob_ai_vr.dm
new file mode 100644
index 0000000000..9af6e67f1f
--- /dev/null
+++ b/code/modules/ai/aI_holder_subtypes/simple_mob_ai_vr.dm
@@ -0,0 +1,5 @@
+/datum/ai_holder/simple_mob/melee/evasive/returnhome
+ returns_home = 1
+
+/datum/ai_holder/simple_mob/ranged/kiting/threatening/returnhome
+ returns_home = 1
\ No newline at end of file
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 354de6949b..a8859e7c1c 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -1,194 +1,194 @@
-/obj/item/device/assembly/signaler
- name = "remote signaling device"
- desc = "Used to remotely activate devices. Tap against another secured signaler to transfer configuration."
- icon_state = "signaller"
- item_state = "signaler"
- origin_tech = list(TECH_MAGNET = 1)
- matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100)
- wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
-
- secured = TRUE
-
- var/code = 30
- var/frequency = 1457
- var/delay = 0
- var/airlock_wire = null
- var/datum/wires/connected = null
- var/datum/radio_frequency/radio_connection
- var/deadman = FALSE
-
-/obj/item/device/assembly/signaler/New()
- ..()
- spawn(40)
- set_frequency(frequency)
- return
-
-
-/obj/item/device/assembly/signaler/activate()
- if(cooldown > 0) return FALSE
- cooldown = 2
- spawn(10)
- process_cooldown()
-
- signal()
- return TRUE
-
-/obj/item/device/assembly/signaler/update_icon()
- if(holder)
- holder.update_icon()
- return
-
-/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1)
- var/t1 = "-------"
-// if ((src.b_stat && !( flag1 )))
-// t1 = text("-------
\nGreen Wire: []
\nRed Wire: []
\nBlue Wire: []
\n", (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src)))
-// else
-// t1 = "-------" Speaker: [src.listening ? "Engaged" : "Disengaged"]
- var/dat = {"
-
-
-Send Signal
-Frequency/Code for signaler:
-Frequency:
--
--
-[format_frequency(src.frequency)]
-+
-+
-
-Code:
--
--
-[src.code]
-+
-+
-[t1]
-"}
- user << browse(dat, "window=radio")
- onclose(user, "radio")
- return
-
-
-/obj/item/device/assembly/signaler/Topic(href, href_list, state = deep_inventory_state)
- if(..())
- return TRUE
-
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- usr << browse(null, "window=radio")
- onclose(usr, "radio")
- return
-
- if (href_list["freq"])
- var/new_frequency = (frequency + text2num(href_list["freq"]))
- if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ)
- new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
- set_frequency(new_frequency)
-
- if(href_list["code"])
- src.code += text2num(href_list["code"])
- src.code = round(src.code)
- src.code = min(100, src.code)
- src.code = max(1, src.code)
-
- if(href_list["send"])
- spawn( 0 )
- signal()
-
- if(usr)
- attack_self(usr)
-
- return
-
-/obj/item/device/assembly/signaler/attackby(obj/item/weapon/W, mob/user, params)
- if(issignaler(W))
- var/obj/item/device/assembly/signaler/signaler2 = W
- if(secured && signaler2.secured)
- code = signaler2.code
- frequency = signaler2.frequency
- to_chat(user, "You transfer the frequency and code of [signaler2] to [src].")
- else
- ..()
-
-/obj/item/device/assembly/signaler/proc/signal()
- if(!radio_connection)
- return
- if(is_jammed(src))
- return
-
- var/datum/signal/signal = new
- signal.source = src
- signal.encryption = code
- signal.data["message"] = "ACTIVATE"
- radio_connection.post_signal(src, signal)
- return
-
-
-/obj/item/device/assembly/signaler/pulse(var/radio = 0)
- if(is_jammed(src))
- return FALSE
- if(src.connected && src.wires)
- connected.Pulse(src)
- else if(holder)
- holder.process_activation(src, 1, 0)
- else
- ..(radio)
- return TRUE
-
-
-/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal)
- if(!signal)
- return FALSE
- if(signal.encryption != code)
- return FALSE
- if(!(src.wires & WIRE_RADIO_RECEIVE))
- return FALSE
- if(is_jammed(src))
- return FALSE
- pulse(1)
-
- if(!holder)
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- return
-
-
-/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency)
- if(!frequency)
- return
- if(!radio_controller)
- sleep(20)
- if(!radio_controller)
- return
-
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
- return
-
-/obj/item/device/assembly/signaler/process()
- if(!deadman)
- STOP_PROCESSING(SSobj, src)
- var/mob/M = src.loc
- if(!M || !ismob(M))
- if(prob(5))
- signal()
- deadman = FALSE
- STOP_PROCESSING(SSobj, src)
- else if(prob(5))
- M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!")
- return
-
-/obj/item/device/assembly/signaler/verb/deadman_it()
- set src in usr
- set name = "Threaten to push the button!"
- set desc = "BOOOOM!"
- deadman = TRUE
- START_PROCESSING(SSobj, src)
- log_and_message_admins("is threatening to trigger a signaler deadman's switch")
- usr.visible_message("[usr] moves their finger over [src]'s signal button...")
-
-/obj/item/device/assembly/signaler/Destroy()
- if(radio_controller)
- radio_controller.remove_object(src,frequency)
- frequency = 0
- . = ..()
+/obj/item/device/assembly/signaler
+ name = "remote signaling device"
+ desc = "Used to remotely activate devices. Tap against another secured signaler to transfer configuration."
+ icon_state = "signaller"
+ item_state = "signaler"
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100)
+ wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
+
+ secured = TRUE
+
+ var/code = 30
+ var/frequency = 1457
+ var/delay = 0
+ var/airlock_wire = null
+ var/datum/wires/connected = null
+ var/datum/radio_frequency/radio_connection
+ var/deadman = FALSE
+
+/obj/item/device/assembly/signaler/New()
+ ..()
+ spawn(40)
+ set_frequency(frequency)
+ return
+
+
+/obj/item/device/assembly/signaler/activate()
+ if(cooldown > 0) return FALSE
+ cooldown = 2
+ spawn(10)
+ process_cooldown()
+
+ signal()
+ return TRUE
+
+/obj/item/device/assembly/signaler/update_icon()
+ if(holder)
+ holder.update_icon()
+ return
+
+/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1)
+ var/t1 = "-------"
+// if ((src.b_stat && !( flag1 )))
+// t1 = text("-------
\nGreen Wire: []
\nRed Wire: []
\nBlue Wire: []
\n", (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src)))
+// else
+// t1 = "-------" Speaker: [src.listening ? "Engaged" : "Disengaged"]
+ var/dat = {"
+
+
+Send Signal
+Frequency/Code for signaler:
+Frequency:
+-
+-
+[format_frequency(src.frequency)]
++
++
+
+Code:
+-
+-
+[src.code]
++
++
+[t1]
+"}
+ user << browse(dat, "window=radio")
+ onclose(user, "radio")
+ return
+
+
+/obj/item/device/assembly/signaler/Topic(href, href_list, state = deep_inventory_state)
+ if(..())
+ return TRUE
+
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ usr << browse(null, "window=radio")
+ onclose(usr, "radio")
+ return
+
+ if (href_list["freq"])
+ var/new_frequency = (frequency + text2num(href_list["freq"]))
+ if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ)
+ new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
+ set_frequency(new_frequency)
+
+ if(href_list["code"])
+ src.code += text2num(href_list["code"])
+ src.code = round(src.code)
+ src.code = min(100, src.code)
+ src.code = max(1, src.code)
+
+ if(href_list["send"])
+ spawn( 0 )
+ signal()
+
+ if(usr)
+ attack_self(usr)
+
+ return
+
+/obj/item/device/assembly/signaler/attackby(obj/item/weapon/W, mob/user, params)
+ if(issignaler(W))
+ var/obj/item/device/assembly/signaler/signaler2 = W
+ if(secured && signaler2.secured)
+ code = signaler2.code
+ set_frequency(signaler2.frequency)
+ to_chat(user, "You transfer the frequency and code of [signaler2] to [src].")
+ else
+ ..()
+
+/obj/item/device/assembly/signaler/proc/signal()
+ if(!radio_connection)
+ return
+ if(is_jammed(src))
+ return
+
+ var/datum/signal/signal = new
+ signal.source = src
+ signal.encryption = code
+ signal.data["message"] = "ACTIVATE"
+ radio_connection.post_signal(src, signal)
+ return
+
+
+/obj/item/device/assembly/signaler/pulse(var/radio = 0)
+ if(is_jammed(src))
+ return FALSE
+ if(src.connected && src.wires)
+ connected.Pulse(src)
+ else if(holder)
+ holder.process_activation(src, 1, 0)
+ else
+ ..(radio)
+ return TRUE
+
+
+/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal)
+ if(!signal)
+ return FALSE
+ if(signal.encryption != code)
+ return FALSE
+ if(!(src.wires & WIRE_RADIO_RECEIVE))
+ return FALSE
+ if(is_jammed(src))
+ return FALSE
+ pulse(1)
+
+ if(!holder)
+ for(var/mob/O in hearers(1, src.loc))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ return
+
+
+/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency)
+ if(!frequency)
+ return
+ if(!radio_controller)
+ sleep(20)
+ if(!radio_controller)
+ return
+
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
+ return
+
+/obj/item/device/assembly/signaler/process()
+ if(!deadman)
+ STOP_PROCESSING(SSobj, src)
+ var/mob/M = src.loc
+ if(!M || !ismob(M))
+ if(prob(5))
+ signal()
+ deadman = FALSE
+ STOP_PROCESSING(SSobj, src)
+ else if(prob(5))
+ M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!")
+ return
+
+/obj/item/device/assembly/signaler/verb/deadman_it()
+ set src in usr
+ set name = "Threaten to push the button!"
+ set desc = "BOOOOM!"
+ deadman = TRUE
+ START_PROCESSING(SSobj, src)
+ log_and_message_admins("is threatening to trigger a signaler deadman's switch")
+ usr.visible_message("[usr] moves their finger over [src]'s signal button...")
+
+/obj/item/device/assembly/signaler/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,frequency)
+ frequency = 0
+ . = ..()
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 1ccf0d5c53..e13573e305 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -152,7 +152,7 @@
log_client_to_db()
send_resources()
- GLOB.nanomanager.send_resources(src)
+ SSnanoui.send_resources(src)
if(!void)
void = new()
@@ -166,7 +166,7 @@
src.changes()
hook_vr("client_new",list(src)) //VOREStation Code
-
+
if(config.paranoia_logging)
if(isnum(player_age) && player_age == 0)
log_and_message_admins("PARANOIA: [key_name(src)] has connected here for the first time.")
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index 2dbdcde1d3..e2a661f5f3 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -273,6 +273,14 @@ datum/gear/suit/duster
display_name = "cloak, medical"
path = /obj/item/clothing/accessory/poncho/roles/cloak/medical
+/datum/gear/suit/roles/poncho/cloak/custom //A colorable cloak
+ display_name = "cloak (colorable)"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/custom
+
+/datum/gear/suit/roles/poncho/cloak/custom/New()
+ ..()
+ gear_tweaks = list(gear_tweak_free_color_choice)
+
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
diff --git a/code/modules/clothing/glasses/hud_vr.dm b/code/modules/clothing/glasses/hud_vr.dm
index 1863ec3c14..dfdd02c461 100644
--- a/code/modules/clothing/glasses/hud_vr.dm
+++ b/code/modules/clothing/glasses/hud_vr.dm
@@ -23,7 +23,7 @@
/obj/item/clothing/glasses/omnihud/dropped()
if(arscreen)
- GLOB.nanomanager.close_uis(src)
+ SSnanoui.close_uis(src)
..()
/obj/item/clothing/glasses/omnihud/emp_act(var/severity)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 1130e1e19d..a7c3287133 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -616,7 +616,7 @@
if(module_list.len)
data["modules"] = module_list
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, ((src.loc != user) ? ai_interface_path : interface_path), interface_title, 480, 550, state = nano_state)
ui.set_initial_data(data)
diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm
index 29057e8469..66636aac6f 100644
--- a/code/modules/clothing/under/accessories/clothing.dm
+++ b/code/modules/clothing/under/accessories/clothing.dm
@@ -216,6 +216,13 @@
icon_state = "medcloak"
item_state = "medcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/custom //A colorable cloak
+ name = "cloak"
+ desc = "A simple, bland cloak."
+ icon_state = "colorcloak"
+ item_state = "colorcloak"
+
/obj/item/clothing/accessory/hawaii
name = "flower-pattern shirt"
desc = "You probably need some welder googles to look at this."
diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm
index d45555f40d..413fe14d01 100644
--- a/code/modules/detectivework/microscope/dnascanner.dm
+++ b/code/modules/detectivework/microscope/dnascanner.dm
@@ -61,7 +61,7 @@
data["bloodsamp_desc"] = (bloodsamp ? (bloodsamp.desc ? bloodsamp.desc : "No information on record.") : "")
data["lidstate"] = closed
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
ui = new(user, src, ui_key, "dnaforensics.tmpl", "QuikScan DNA Analyzer", 540, 326)
ui.set_initial_data(data)
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index 2d6676adec..a293226d48 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -53,7 +53,7 @@
O.loc = src
held_card = O
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
attack_hand(user)
@@ -107,7 +107,7 @@
if (accounts.len > 0)
data["accounts"] = accounts
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640)
ui.set_initial_data(data)
@@ -117,7 +117,7 @@
if(..())
return 1
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(usr, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(usr, src, "main")
if(href_list["choice"])
switch(href_list["choice"])
diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm
index 8c67e5394c..c5a11275e8 100644
--- a/code/modules/economy/cash.dm
+++ b/code/modules/economy/cash.dm
@@ -78,6 +78,8 @@
/obj/item/weapon/spacecash/attack_self()
var/amount = input(usr, "How many Thalers do you want to take? (0 to [src.worth])", "Take Money", 20) as num
+ if(!src || QDELETED(src))
+ return
amount = round(CLAMP(amount, 0, src.worth))
if(!amount)
diff --git a/code/modules/events/supply_demand.dm b/code/modules/events/supply_demand.dm
index becec3b192..2d38c1f491 100644
--- a/code/modules/events/supply_demand.dm
+++ b/code/modules/events/supply_demand.dm
@@ -284,7 +284,7 @@
var/list/medicineReagents = list()
for(var/path in typesof(/datum/chemical_reaction) - /datum/chemical_reaction)
var/datum/chemical_reaction/CR = path // Stupid casting required for reading
- var/datum/reagent/R = chemical_reagents_list[initial(CR.result)]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[initial(CR.result)]
if(R && R.scannable)
medicineReagents += R
for(var/i in 1 to differentTypes)
@@ -298,7 +298,7 @@
var/list/drinkReagents = list()
for(var/path in typesof(/datum/chemical_reaction) - /datum/chemical_reaction)
var/datum/chemical_reaction/CR = path // Stupid casting required for reading
- var/datum/reagent/R = chemical_reagents_list[initial(CR.result)]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[initial(CR.result)]
if(istype(R, /datum/reagent/drink) || istype(R, /datum/reagent/ethanol))
drinkReagents += R
for(var/i in 1 to differentTypes)
diff --git a/code/modules/food/drinkingglass/drinkingglass.dm b/code/modules/food/drinkingglass/drinkingglass.dm
index d4c8389a51..604b85665f 100644
--- a/code/modules/food/drinkingglass/drinkingglass.dm
+++ b/code/modules/food/drinkingglass/drinkingglass.dm
@@ -65,7 +65,7 @@
return 1
return 0
-/obj/item/weapon/reagent_containers/food/drinks/glass2/New()
+/obj/item/weapon/reagent_containers/food/drinks/glass2/Initialize()
..()
icon_state = base_icon
diff --git a/code/modules/food/drinkingglass/shaker.dm b/code/modules/food/drinkingglass/shaker.dm
index b653f14c60..3b81c6bdec 100644
--- a/code/modules/food/drinkingglass/shaker.dm
+++ b/code/modules/food/drinkingglass/shaker.dm
@@ -11,7 +11,7 @@
rim_pos = null // no fruit slices
var/lid_color = "black"
-/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/New()
+/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/Initialize()
..()
lid_color = pick("black", "red", "blue")
update_icon()
@@ -23,7 +23,7 @@
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake
name = "protein shake"
-/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake/New()
+/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake/Initialize()
..()
reagents.add_reagent("nutriment", 30)
reagents.add_reagent("iron", 10)
diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm
index d1b9381216..0213ef089b 100644
--- a/code/modules/food/kitchen/smartfridge.dm
+++ b/code/modules/food/kitchen/smartfridge.dm
@@ -216,7 +216,7 @@
overlays.Cut()
if(panel_open)
overlays += image(icon, icon_panel)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return
if(wrenchable && default_unfasten_wrench(user, O, 20))
@@ -282,11 +282,11 @@
var/datum/stored_item/item = new/datum/stored_item(src, O.type, O.name)
item.add_product(O)
item_records.Add(item)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/smartfridge/proc/vend(datum/stored_item/I)
I.get_product(get_turf(src))
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/smartfridge/attack_ai(mob/user as mob)
attack_hand(user)
@@ -321,7 +321,7 @@
if(items.len > 0)
data["contents"] = items
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500)
ui.set_initial_data(data)
@@ -331,7 +331,7 @@
if(..()) return 0
var/mob/user = usr
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
src.add_fingerprint(user)
diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm
index 19f7988826..a458a568cf 100644
--- a/code/modules/food/recipe_dump.dm
+++ b/code/modules/food/recipe_dump.dm
@@ -68,14 +68,14 @@
//Reagents can be resolved to nicer names as well
for(var/Rp in food_recipes)
for(var/rid in food_recipes[Rp]["Reagents"])
- var/datum/reagent/Rd = chemical_reagents_list[rid]
+ var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
var/R_name = Rd.name
var/amt = food_recipes[Rp]["Reagents"][rid]
food_recipes[Rp]["Reagents"] -= rid
food_recipes[Rp]["Reagents"][R_name] = amt
for(var/Rp in drink_recipes)
for(var/rid in drink_recipes[Rp]["Reagents"])
- var/datum/reagent/Rd = chemical_reagents_list[rid]
+ var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
var/R_name = Rd.name
var/amt = drink_recipes[Rp]["Reagents"][rid]
drink_recipes[Rp]["Reagents"] -= rid
diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm
index ee33b66cba..4cce81a2a6 100644
--- a/code/modules/holodeck/HolodeckControl.dm
+++ b/code/modules/holodeck/HolodeckControl.dm
@@ -112,7 +112,7 @@
else
data["gravity"] = null
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "holodeck.tmpl", src.name, 400, 550)
ui.set_initial_data(data)
@@ -152,7 +152,7 @@
src.add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 0118088b27..9ed2d836a6 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -437,7 +437,7 @@
for(var/x=1;x<=additional_chems;x++)
- var/new_chem = pick(chemical_reagents_list)
+ var/new_chem = pick(SSchemistry.chemical_reagents)
if(new_chem in banned_chems)
continue
banned_chems += new_chem
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index 8d7ebdf314..4601f23484 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -162,7 +162,7 @@
data["hasGenetics"] = 0
data["sourceName"] = 0
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "botany_isolator.tmpl", "Lysis-isolation Centrifuge UI", 470, 450)
ui.set_initial_data(data)
@@ -292,7 +292,7 @@
else
data["loaded"] = 0
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "botany_editor.tmpl", "Bioballistic Delivery UI", 470, 450)
ui.set_initial_data(data)
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 9c54a6e377..f12db3f76b 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -413,8 +413,9 @@
activate_pin(3)
- for(var/mob/O in hearers(1, get_turf(src)))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ if(loc)
+ for(var/mob/O in hearers(1, get_turf(src)))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
/obj/item/integrated_circuit/input/EPv2
name = "\improper EPv2 circuit"
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 232ef46e3e..f62356d83c 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -190,3 +190,7 @@
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20)
recipes -= new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes -= new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
+
+/material/supermatter/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1)
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index 0b1daf10fa..1035c70eba 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -214,7 +214,101 @@
no_variants = FALSE
/obj/item/stack/material/durasteel/hull
- name = "MAT_DURASTEELHULL"
+ name = MAT_DURASTEELHULL
+
+/obj/item/stack/material/titanium
+ name = MAT_TITANIUM
+ icon_state = "sheet-silver"
+ item_state = "sheet-silver"
+ default_type = MAT_TITANIUM
+ no_variants = FALSE
+
+/obj/item/stack/material/titanium/hull
+ name = MAT_TITANIUMHULL
+ default_type = MAT_TITANIUMHULL
+
+// Particle Smasher and Exotic material.
+/obj/item/stack/material/verdantium
+ name = MAT_VERDANTIUM
+ icon_state = "sheet-wavy"
+ item_state = "mhydrogen"
+ default_type = MAT_VERDANTIUM
+ no_variants = FALSE
+ apply_colour = TRUE
+
+/obj/item/stack/material/morphium
+ name = MAT_MORPHIUM
+ icon_state = "sheet-wavy"
+ item_state = "mhydrogen"
+ default_type = MAT_MORPHIUM
+ no_variants = FALSE
+ apply_colour = TRUE
+
+/obj/item/stack/material/morphium/hull
+ name = MAT_MORPHIUMHULL
+ default_type = MAT_MORPHIUMHULL
+
+/obj/item/stack/material/valhollide
+ name = MAT_VALHOLLIDE
+ icon_state = "sheet-gem"
+ item_state = "diamond"
+ default_type = MAT_VALHOLLIDE
+ no_variants = FALSE
+ apply_colour = TRUE
+
+// Forged in the equivalent of Hell, one piece at a time.
+/obj/item/stack/material/supermatter
+ name = MAT_SUPERMATTER
+ icon_state = "sheet-super"
+ item_state = "diamond"
+ default_type = MAT_SUPERMATTER
+ apply_colour = TRUE
+
+/obj/item/stack/material/supermatter/proc/update_mass() // Due to how dangerous they can be, the item will get heavier and larger the more are in the stack.
+ slowdown = amount / 10
+ w_class = min(5, round(amount / 10) + 1)
+ throw_range = round(amount / 7) + 1
+
+/obj/item/stack/material/supermatter/use(var/used)
+ . = ..()
+ update_mass()
+ return
+
+/obj/item/stack/material/supermatter/attack_hand(mob/user)
+ update_mass()
+ radiation_repository.radiate(src, 5 + amount)
+ var/mob/living/M = user
+ if(!istype(M))
+ return
+
+ var/burn_user = TRUE
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(istype(G) && ((G.flags & THICKMATERIAL && prob(70)) || istype(G, /obj/item/clothing/gloves/gauntlets)))
+ burn_user = FALSE
+
+ if(burn_user)
+ H.visible_message("\The [src] flashes as it scorches [H]'s hands!")
+ H.apply_damage(amount / 2 + 5, BURN, "r_hand", used_weapon="Supermatter Chunk")
+ H.apply_damage(amount / 2 + 5, BURN, "l_hand", used_weapon="Supermatter Chunk")
+ H.drop_from_inventory(src, get_turf(H))
+ return
+
+ if(istype(user, /mob/living/silicon/robot))
+ burn_user = FALSE
+
+ if(burn_user)
+ M.apply_damage(amount, BURN, null, used_weapon="Supermatter Chunk")
+
+/obj/item/stack/material/supermatter/ex_act(severity) // An incredibly hard to manufacture material, SM chunks are unstable by their 'stabilized' nature.
+ if(prob((4 / severity) * 20))
+ radiation_repository.radiate(get_turf(src), amount * 4)
+ explosion(get_turf(src),round(amount / 12) , round(amount / 6), round(amount / 3), round(amount / 25))
+ qdel(src)
+ return
+ radiation_repository.radiate(get_turf(src), amount * 2)
+ ..()
/obj/item/stack/material/wood
name = "wooden plank"
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 6f55572ef9..5428e110db 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -105,6 +105,8 @@ var/list/name_to_material
var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors.
var/reflectivity = 0 // How reflective to light is the material? Currently used for laser reflection and defense.
var/explosion_resistance = 5 // Only used by walls currently.
+ var/negation = 0 // Objects that respect this will randomly absorb impacts with this var as the percent chance.
+ var/spatial_instability = 0 // Objects that have trouble staying in the same physical space by sheer laws of nature have this. Percent for respecting items to cause teleportation.
var/conductive = 1 // Objects with this var add CONDUCTS to flags on spawn.
var/conductivity = null // How conductive the material is. Iron acts as the baseline, at 10.
var/list/composite_material // If set, object matter var will be a list containing these values.
@@ -293,6 +295,8 @@ var/list/name_to_material
/material/supermatter
name = "supermatter"
icon_colour = "#FFFF00"
+ stack_type = /obj/item/stack/material/supermatter
+ shard_type = SHARD_SHARD
radioactivity = 20
stack_type = null
luminescence = 3
@@ -304,6 +308,7 @@ var/list/name_to_material
sheet_singular_name = "crystal"
sheet_plural_name = "crystals"
is_fusion_fuel = 1
+ stack_origin_tech = list(TECH_MATERIAL = 8, TECH_PHORON = 5, TECH_BLUESPACE = 4)
/material/phoron
name = "phoron"
@@ -358,7 +363,6 @@ var/list/name_to_material
integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system
stack_type = /obj/item/stack/material/marble
-
/material/steel
name = DEFAULT_WALL_MATERIAL
stack_type = /obj/item/stack/material/steel
@@ -455,8 +459,8 @@ var/list/name_to_material
reflectivity = 0.9
/material/plasteel/titanium
- name = "titanium"
- stack_type = null
+ name = MAT_TITANIUM
+ stack_type = /obj/item/stack/material/titanium
conductivity = 2.38
icon_base = "metal"
door_icon_base = "metal"
@@ -465,7 +469,7 @@ var/list/name_to_material
/material/plasteel/titanium/hull
name = MAT_TITANIUMHULL
- stack_type = null
+ stack_type = /obj/item/stack/material/titanium/hull
icon_base = "hull"
icon_reinf = "reinf_mesh"
@@ -686,7 +690,7 @@ var/list/name_to_material
sheet_plural_name = "ingots"
/material/lead
- name = "lead"
+ name = MAT_LEAD
stack_type = /obj/item/stack/material/lead
icon_colour = "#273956"
weight = 23 // Lead is a bit more dense than silver IRL, and silver has 22 ingame.
@@ -695,6 +699,74 @@ var/list/name_to_material
sheet_plural_name = "ingots"
radiation_resistance = 25 // Lead is Special and so gets to block more radiation than it normally would with just weight, totalling in 48 protection.
+// Particle Smasher and other exotic materials.
+
+/material/verdantium
+ name = MAT_VERDANTIUM
+ stack_type = /obj/item/stack/material/verdantium
+ icon_base = "metal"
+ door_icon_base = "metal"
+ icon_reinf = "reinf_metal"
+ icon_colour = "#4FE95A"
+ integrity = 80
+ protectiveness = 15
+ weight = 15
+ hardness = 30
+ shard_type = SHARD_SHARD
+ negation = 15
+ conductivity = 60
+ reflectivity = 0.3
+ radiation_resistance = 5
+ stack_origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 5, TECH_BIO = 4)
+ sheet_singular_name = "sheet"
+ sheet_plural_name = "sheets"
+
+/material/morphium
+ name = MAT_MORPHIUM
+ stack_type = /obj/item/stack/material/morphium
+ icon_base = "metal"
+ door_icon_base = "metal"
+ icon_colour = "#37115A"
+ icon_reinf = "reinf_metal"
+ protectiveness = 60
+ integrity = 300
+ conductivity = 1.5
+ hardness = 90
+ shard_type = SHARD_SHARD
+ weight = 30
+ negation = 25
+ explosion_resistance = 85
+ reflectivity = 0.2
+ radiation_resistance = 10
+ stack_origin_tech = list(TECH_MATERIAL = 8, TECH_ILLEGAL = 1, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_ARCANE = 1)
+
+/material/morphium/hull
+ name = MAT_MORPHIUMHULL
+ stack_type = /obj/item/stack/material/morphium/hull
+ icon_base = "hull"
+ icon_reinf = "reinf_mesh"
+
+/material/valhollide
+ name = MAT_VALHOLLIDE
+ stack_type = /obj/item/stack/material/valhollide
+ icon_base = "stone"
+ door_icon_base = "stone"
+ icon_reinf = "reinf_mesh"
+ icon_colour = "##FFF3B2"
+ protectiveness = 30
+ integrity = 240
+ weight = 30
+ hardness = 45
+ negation = 2
+ conductivity = 5
+ reflectivity = 0.5
+ radiation_resistance = 20
+ spatial_instability = 30
+ stack_origin_tech = list(TECH_MATERIAL = 7, TECH_PHORON = 5, TECH_BLUESPACE = 5)
+ sheet_singular_name = "gem"
+ sheet_plural_name = "gems"
+
+
// Adminspawn only, do not let anyone get this.
/material/alienalloy
name = "alienalloy"
@@ -994,4 +1066,4 @@ var/list/name_to_material
icon_colour = "#ff9900"
hardness = 1
weight = 1
- protectiveness = 0 // 0%
\ No newline at end of file
+ protectiveness = 0 // 0%
diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm
index 5e28944ae0..08580c7f97 100644
--- a/code/modules/mining/drilling/drill.dm
+++ b/code/modules/mining/drilling/drill.dm
@@ -17,7 +17,7 @@
var/list/resource_field = list()
var/obj/item/device/radio/intercom/faultreporter = new /obj/item/device/radio/intercom{channels=list("Supply")}(null)
- var/ore_types = list(
+ var/list/ore_types = list(
"hematite" = /obj/item/weapon/ore/iron,
"uranium" = /obj/item/weapon/ore/uranium,
"gold" = /obj/item/weapon/ore/gold,
@@ -34,8 +34,20 @@
var/harvest_speed
var/capacity
var/charge_use
+ var/exotic_drilling
var/obj/item/weapon/cell/cell = null
+ // Found with an advanced laser. exotic_drilling >= 1
+ var/list/ore_types_uncommon = list(
+ MAT_MARBLE = /obj/item/weapon/ore/marble,
+ MAT_LEAD = /obj/item/weapon/ore/lead
+ )
+
+ // Found with an ultra laser. exotic_drilling >= 2
+ var/list/ore_types_rare = list(
+ MAT_VERDANTIUM = /obj/item/weapon/ore/verdantium
+ )
+
//Flags
var/need_update_field = 0
var/need_player_check = 0
@@ -127,7 +139,7 @@
var/oretype = ore_types[metal]
new oretype(src)
- if(!found_resource)
+ if(!found_resource) // If a drill can't see an advanced material, it will destroy it while going through.
harvesting.has_resources = 0
harvesting.resources = null
resource_field -= harvesting
@@ -219,6 +231,14 @@
for(var/obj/item/weapon/stock_parts/P in component_parts)
if(istype(P, /obj/item/weapon/stock_parts/micro_laser))
harvest_speed = P.rating
+ exotic_drilling = P.rating - 1
+ if(exotic_drilling >= 1)
+ ore_types |= ore_types_uncommon
+ if(exotic_drilling >= 2)
+ ore_types |= ore_types_rare
+ else
+ ore_types -= ore_types_uncommon
+ ore_types -= ore_types_rare
if(istype(P, /obj/item/weapon/stock_parts/matter_bin))
capacity = 200 * P.rating
if(istype(P, /obj/item/weapon/stock_parts/capacitor))
diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm
index 0df256c131..56f371fe91 100644
--- a/code/modules/mining/drilling/scanner.dm
+++ b/code/modules/mining/drilling/scanner.dm
@@ -18,7 +18,8 @@
"surface minerals" = 0,
"precious metals" = 0,
"nuclear fuel" = 0,
- "exotic matter" = 0
+ "exotic matter" = 0,
+ "anomalous matter" = 0
)
for(var/turf/simulated/T in range(2, get_turf(user)))
@@ -30,10 +31,11 @@
var/ore_type
switch(metal)
- if("silicates", "carbon", "hematite") ore_type = "surface minerals"
- if("gold", "silver", "diamond") ore_type = "precious metals"
+ if("silicates", "carbon", "hematite", "marble") ore_type = "surface minerals"
+ if("gold", "silver", "diamond", "lead") ore_type = "precious metals"
if("uranium") ore_type = "nuclear fuel"
if("phoron", "osmium", "hydrogen") ore_type = "exotic matter"
+ if("verdantium") ore_type = "anomalous matter"
if(ore_type) metals[ore_type] += T.resources[metal]
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 3f76672610..d515f42925 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -171,10 +171,13 @@
"phoron" = 15,
"silver" = 16,
"gold" = 18,
+ "marble" = 20,
"uranium" = 30,
"diamond" = 50,
"platinum" = 40,
- "mhydrogen" = 40)
+ "lead" = 40,
+ "mhydrogen" = 40,
+ "verdantium" = 60)
/obj/machinery/mineral/processing_unit/New()
..()
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index ae388a717d..87b613a8e3 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -46,7 +46,10 @@ var/list/mining_overlay_cache = list()
"osmium" = /obj/item/weapon/ore/osmium,
"hydrogen" = /obj/item/weapon/ore/hydrogen,
"silicates" = /obj/item/weapon/ore/glass,
- "carbon" = /obj/item/weapon/ore/coal
+ "carbon" = /obj/item/weapon/ore/coal,
+ "verdantium" = /obj/item/weapon/ore/verdantium,
+ "marble" = /obj/item/weapon/ore/marble,
+ "lead" = /obj/item/weapon/ore/lead
)
has_resources = 1
@@ -608,10 +611,10 @@ var/list/mining_overlay_cache = list()
var/mineral_name
if(rare_ore)
- mineral_name = pickweight(list("uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20))
+ mineral_name = pickweight(list("marble" = 5, "uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 5, "verdantium" = 1))
else
- mineral_name = pickweight(list("uranium" = 5, "platinum" = 5, "hematite" = 35, "carbon" = 35, "diamond" = 1, "gold" = 5, "silver" = 5, "phoron" = 10))
+ mineral_name = pickweight(list("marble" = 3, "uranium" = 10, "platinum" = 10, "hematite" = 70, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 2, "verdantium" = 1))
if(mineral_name && (mineral_name in ore_data))
mineral = ore_data[mineral_name]
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index e531e5208f..099ce46ba5 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -24,6 +24,12 @@
origin_tech = list(TECH_MATERIAL = 1)
material = "carbon"
+/obj/item/weapon/ore/marble
+ name = "recrystallized carbonate"
+ icon_state = "ore_marble"
+ origin_tech = list(TECH_MATERIAL = 1)
+ material = "carbon"
+
/obj/item/weapon/ore/glass
name = "sand"
icon_state = "ore_glass"
@@ -77,6 +83,29 @@
icon_state = "ore_hydrogen"
material = "mhydrogen"
+/obj/item/weapon/ore/verdantium
+ name = "verdantite dust"
+ icon_state = "ore_verdantium"
+ material = MAT_VERDANTIUM
+ origin_tech = list(TECH_MATERIAL = 7)
+
+// POCKET ... Crystal dust.
+/obj/item/weapon/ore/verdantium/throw_impact(atom/hit_atom)
+ ..()
+ var/mob/living/carbon/human/H = hit_atom
+ if(istype(H) && H.has_eyes() && prob(85))
+ H << "Some of \the [src] gets in your eyes!"
+ H.Blind(10)
+ H.eye_blurry += 15
+ spawn(1)
+ if(istype(loc, /turf/)) qdel(src)
+
+/obj/item/weapon/ore/lead
+ name = "lead glance"
+ icon_state = "ore_lead"
+ material = MAT_LEAD
+ origin_tech = list(TECH_MATERIAL = 3)
+
/obj/item/weapon/ore/slag
name = "Slag"
desc = "Someone screwed up..."
diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm
index a3528eb55b..b54ac6c5f0 100644
--- a/code/modules/mining/ore_datum.dm
+++ b/code/modules/mining/ore_datum.dm
@@ -132,4 +132,34 @@ var/global/list/ore_data = list()
display_name = "metallic hydrogen"
smelts_to = "tritium"
compresses_to = "mhydrogen"
- scan_icon = "mineral_rare"
\ No newline at end of file
+ scan_icon = "mineral_rare"
+
+/ore/verdantium
+ name = MAT_VERDANTIUM
+ display_name = "crystalline verdantite"
+ compresses_to = MAT_VERDANTIUM
+ result_amount = 2
+ spread_chance = 5
+ scan_icon = "mineral_rare"
+ xarch_ages = list(
+ "billion" = 13,
+ "billion_lower" = 10
+ )
+
+/ore/marble
+ name = MAT_MARBLE
+ display_name = "recrystallized carbonate"
+ compresses_to = "marble"
+ result_amount = 1
+ spread_chance = 10
+ ore = /obj/item/weapon/ore/marble
+ scan_icon = "mineral_common"
+
+/ore/lead
+ name = MAT_LEAD
+ display_name = "lead glance"
+ smelts_to = "lead"
+ result_amount = 3
+ spread_chance = 20
+ ore = /obj/item/weapon/ore/lead
+ scan_icon = "mineral_rare"
diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm
index 97280c78b9..611bbb39a7 100644
--- a/code/modules/mob/dead/observer/observer_vr.dm
+++ b/code/modules/mob/dead/observer/observer_vr.dm
@@ -56,3 +56,21 @@
mind.active = TRUE
SC.catch_mob(src) //This will result in us being deleted so...
+
+/mob/observer/dead/verb/backup_ping()
+ set category = "Ghost"
+ set name = "Notify Transcore"
+ set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one."
+
+ if(src.mind.name in SStranscore.backed_up)
+ var/datum/transhuman/mind_record/record = SStranscore.backed_up[src.mind.name]
+ if(!(record.dead_state == MR_DEAD))
+ to_chat(src, "Your backup is not past-due yet.")
+ else if((world.time - record.last_notification) < 10 MINUTES)
+ to_chat(src, "Too little time has passed since your last notification.")
+ else
+ SStranscore.notify(record.mindname, TRUE)
+ record.last_notification = world.time
+ to_chat(src, "New notification has been sent.")
+ else
+ to_chat(src, "No mind record found!")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 9af501a92e..389b24f19f 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1102,7 +1102,7 @@
else
usr << "You failed to check the pulse. Try again."
-/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/regen_icons = TRUE)
+/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/regen_icons = TRUE, var/mob/living/carbon/human/example = null) //VOREStation Edit - send an example
if(!dna)
if(!new_species)
@@ -1139,7 +1139,15 @@
if(species.default_language)
add_language(species.default_language)
- if(species.base_color) //VOREStation Edit - Always give them a basse color
+ //if(species.icon_scale != 1) //VOREStation Removal
+ // update_transform() //VOREStation Removal
+
+ if(example) //VOREStation Edit begin
+ if(!(example == src))
+ r_skin = example.r_skin
+ g_skin = example.g_skin
+ b_skin = example.b_skin
+ else if(species.base_color) //VOREStation Edit end
//Apply colour.
r_skin = hex2num(copytext(species.base_color,2,4))
g_skin = hex2num(copytext(species.base_color,4,6))
@@ -1157,10 +1165,13 @@
//icon_state = lowertext(species.name) //Necessary?
- species.create_organs(src)
-
+ //VOREStation Edit start: swap places of those two procs
species.handle_post_spawn(src)
+ species.create_organs(src)
+ //VOREStation Edit end: swap places of those two procs
+
+
maxHealth = species.total_health
if(LAZYLEN(descriptors))
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 9859fe3898..6b15fc069e 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1398,7 +1398,7 @@
/mob/living/carbon/human/proc/process_glasses(var/obj/item/clothing/glasses/G)
if(G && G.active)
see_in_dark += G.darkness_view
- if(G.overlay)
+ if(G.overlay && client)
client.screen |= G.overlay
if(G.vision_flags)
sight |= G.vision_flags
diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
index 45c5f4b8f3..d73e784ac4 100644
--- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
@@ -25,6 +25,7 @@
max_age = 200
health_hud_intensity = 2
num_alternate_languages = 3
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
index f56faa515a..f8a783b162 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
@@ -1,5 +1,5 @@
/datum/species/monkey/shark
- name = "Sobaka"
+ name = SPECIES_MONKEY_AKULA
name_plural = "Sobaka"
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
@@ -8,7 +8,7 @@
default_language = "Skrellian" //Closest we have.
/datum/species/monkey/sergal
- name = "Saru"
+ name = SPECIES_MONKEY_SERGAL
greater_form = "Sergal"
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
@@ -16,7 +16,7 @@
default_language = LANGUAGE_SAGARU
/datum/species/monkey/sparra
- name = "Sparra"
+ name = SPECIES_MONKEY_NEVREAN
name_plural = "Sparra"
greater_form = "Nevrean"
tail = null
@@ -41,7 +41,7 @@
*/
/datum/species/monkey/vulpkanin
- name = "Wolpin"
+ name = SPECIES_MONKEY_VULPKANIN
name_plural = "Wolpin"
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
index 5a09e5f04a..6204f4d5ba 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
@@ -9,14 +9,8 @@
"Rapala", "Neaera", "Stok", "Farwa", "Sobaka",
"Wolpin", "Saru", "Sparra")
- heal_rate = 0.2 //As of writing, original was 0.5 - Slows regen speed (bad)
- hunger_factor = 0.1 //As of writing, original was 0.2 - Slows hunger rate (good)
- siemens_coefficient = 1 //As of writing, original was 0.4 (bad)
- active_regen_mult = 0.66 //As of writing, original was 1 (good)
-
color_mult = 1
- mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping (good)
- num_alternate_languages = 1 //Might be outdated: They currently have 3 in the other file
+ mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping
trashcan = 1 //They have goopy bodies. They can just dissolve things within them.
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f300f8a350..4020f13d14 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -149,6 +149,12 @@ default behaviour is:
tmob.forceMove(oldloc)
now_pushing = 0
return
+ //VOREStation Edit - Begin
+ else if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && canmove && can_swap && handle_micro_bump_helping(tmob))
+ forceMove(tmob.loc)
+ now_pushing = 0
+ return
+ //VOREStation Edit - End
if(!can_move_mob(tmob, 0, 0))
now_pushing = 0
@@ -944,7 +950,11 @@ default behaviour is:
/mob/living/proc/escape_buckle()
if(buckled)
- buckled.user_unbuckle_mob(src, src)
+ if(istype(buckled, /obj/vehicle))
+ var/obj/vehicle/vehicle = buckled
+ vehicle.unload()
+ else
+ buckled.user_unbuckle_mob(src, src)
/mob/living/proc/resist_grab()
var/resisting = 0
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 94acfd82dc..f5c9e2580e 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -305,7 +305,10 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
powered_ai = ai
powered_ai.psupply = src
- forceMove(powered_ai.loc)
+ if(istype(powered_ai,/mob/living/silicon/ai/announcer)) //Don't try to get a loc for a nullspace announcer mob, just put it into it
+ forceMove(powered_ai)
+ else
+ forceMove(powered_ai.loc)
..()
use_power(1) // Just incase we need to wake up the power system.
@@ -443,7 +446,7 @@ var/list/ai_verbs_default = list(
return
if(usr != src)
return
- /*if(..()) // <------ MOVED FROM HERE
+ /*if(..()) // <------ MOVED FROM HERE
return*/
if (href_list["mach_close"])
if (href_list["mach_close"] == "aialerts")
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 1b3720dc33..ac2417a077 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -201,7 +201,7 @@
medicalActive1 = null
medicalActive2 = null
medical_cannotfind = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
usr << "You reset your record-viewing software."
/mob/living/silicon/pai/cancel_camera()
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index bef2c93403..85d98c1663 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -90,7 +90,7 @@ var/global/list/default_pai_software = list()
data["emotions"] = emotions
data["current_emotion"] = card.current_emotion
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600)
ui.set_initial_data(data)
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 480c3b63bb..dad52893cf 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -36,7 +36,7 @@
data["prime"] = user.pai_law0
data["supplemental"] = user.pai_laws
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_directives.tmpl", "pAI Directives", 450, 600)
@@ -102,7 +102,7 @@
data["channels"] = channels
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
ui = new(user, user, id, "pai_radio.tmpl", "Radio Configuration", 300, 150)
ui.set_initial_data(data)
@@ -128,7 +128,7 @@
// This is dumb, but NanoUI breaks if it has no data to send
data["manifest"] = PDA_Manifest
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "crew_manifest.tmpl", "Crew Manifest", 450, 600)
@@ -178,7 +178,7 @@
data["messages"] = messages
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_messenger.tmpl", "Digital Messenger", 450, 600)
@@ -236,7 +236,7 @@
data["medical"] = M ? M.fields : null
data["could_not_find"] = user.medical_cannotfind
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600)
@@ -290,7 +290,7 @@
data["security"] = S ? S.fields : null
data["could_not_find"] = user.security_cannotfind
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600)
@@ -340,7 +340,7 @@
data["progress_b"] = user.hackprogress % 10
data["aborted"] = user.hack_aborted
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150)
@@ -431,7 +431,7 @@
gases[++gases.len] = gas
data["gas"] = gases
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300)
@@ -505,7 +505,7 @@
data["frequency"] = format_frequency(user.sradio.frequency)
data["code"] = user.sradio.code
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150)
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 10276b7c7b..4c29ae004f 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -184,12 +184,12 @@
dat += "Injector
"
if(patient)// && patient.health > min_health) //Not necessary, leave the buttons on, but the feedback during injection will give more information.
for(var/re in injection_chems)
- var/datum/reagent/C = chemical_reagents_list[re]
+ var/datum/reagent/C = SSchemistry.chemical_reagents[re]
if(C)
dat += "Inject [C.name]
"
else
for(var/re in injection_chems)
- var/datum/reagent/C = chemical_reagents_list[re]
+ var/datum/reagent/C = SSchemistry.chemical_reagents[re]
if(C)
dat += "Inject [C.name]
"
@@ -393,7 +393,7 @@
patient.reagents.add_reagent(chem, inject_amount)
drain(750) //-750 charge per injection
var/units = round(patient.reagents.get_reagent_amount(chem))
- to_chat(hound, "Injecting [units] unit\s of [chemical_reagents_list[chem]] into occupant.") //If they were immersed, the reagents wouldn't leave with them.
+ to_chat(hound, "Injecting [units] unit\s of [SSchemistry.chemical_reagents[chem]] into occupant.") //If they were immersed, the reagents wouldn't leave with them.
//For if the dogborg's existing patient uh, doesn't make it.
/obj/item/device/dogborg/sleeper/proc/update_patient()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 33c159ebf0..ea851806c3 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -628,7 +628,7 @@
else
to_chat(user, "Unable to locate a radio.")
- else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)||istype(W, /obj/item/weapon/card/robot)) // trying to unlock the interface with an ID card
+ else if (W.GetID()) // trying to unlock the interface with an ID card
if(emagged)//still allow them to open the cover
to_chat(user, "The interface seems slightly damaged")
if(opened)
@@ -729,7 +729,7 @@
var/list/L = req_access
if(!L.len) //no requirements
return 1
- if(!I || !(istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda))) //not ID or PDA
+ if(!I) //nothing to check with..?
return 0
var/access_found = I.GetAccess()
for(var/req in req_access)
@@ -1003,7 +1003,7 @@
if(icontype == "Custom")
icon = CUSTOM_ITEM_SYNTH
else // This is to fix an issue where someone with a custom borg sprite chooses a non-custom sprite and turns invisible.
- icon = 'icons/mob/robots.dmi'
+ vr_sprite_check() //VOREStation Edit
icon_state = module_sprites[icontype]
updateicon()
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm
index 6664cb9e03..ae85b8d75c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm
@@ -21,7 +21,7 @@
attacktext = list("bitten")
say_list_type = /datum/say_list/snake
- ai_holder_type = /datum/ai_holder/simple_mob/melee
+ ai_holder_type = /datum/ai_holder/simple_mob/passive
/datum/say_list/snake
emote_hear = list("hisses")
@@ -31,7 +31,6 @@
name = "Noodle"
desc = "This snake is particularly chubby and demands nothing but the finest of treats."
- ai_holder_type = /datum/ai_holder/simple_mob/passive
makes_dirt = FALSE
var/turns_since_scan = 0
diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm
new file mode 100644
index 0000000000..026c803e4b
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm
@@ -0,0 +1,3 @@
+/datum/say_list/merc/unknown_ind
+ speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")
+ say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!")
\ No newline at end of file
diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm
index 317bc2c076..aa42ab461d 100644
--- a/code/modules/mob/logout.dm
+++ b/code/modules/mob/logout.dm
@@ -1,5 +1,5 @@
/mob/Logout()
- GLOB.nanomanager.user_logout(src) // this is used to clean up (remove) this user's Nano UIs
+ SSnanoui.user_logout(src) // this is used to clean up (remove) this user's Nano UIs
player_list -= src
disconnect_time = world.realtime //VOREStation Addition: logging when we disappear.
update_client_z(null)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index a6965a7f16..d13533a758 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -373,8 +373,8 @@
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.")
- if ((deathtime < (5 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME))
- to_chat(usr, "You must wait 5 minutes to respawn!")
+ if ((deathtime < (1 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME)) //VOREStation Edit: lower respawn timer
+ to_chat(usr, "You must wait 1 minute to respawn!")
return
else
to_chat(usr, "You can respawn now, enjoy your new life!")
@@ -716,7 +716,7 @@
if(statpanel("Tickets"))
GLOB.ahelp_tickets.stat_entry()
-
+
if(length(GLOB.sdql2_queries))
if(statpanel("SDQL2"))
diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm
index 3335e15db5..4ee7d5e01c 100644
--- a/code/modules/mob/new_player/sprite_accessories_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_vr.dm
@@ -1049,19 +1049,10 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
- /*
rosette
name = "Rosettes"
icon_state = "rosette"
- color_blend_mode = ICON_MULTIPLY
- body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
-
- rosette_color
- name = "Rosettes (Colorable)"
- icon_state = "rosette_color"
- color_blend_mode = ICON_MULTIPLY
- body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
- */
+ body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
heterochromia
name = "Heterochromia"
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 945ffd53be..c1d0f9de64 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -182,6 +182,8 @@
var/datum/preferences/B = O.client.prefs
for(var/language in B.alternate_languages)
O.add_language(language)
+ O.resize(B.size_multiplier, animate = FALSE) //VOREStation Addition: add size prefs to borgs
+ O.fuzzy = B.fuzzy //VOREStation Addition: add size prefs to borgs
callHook("borgify", list(O))
O.Namepick()
diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm
index 4ed62e2582..7bdb8c74e3 100644
--- a/code/modules/multiz/movement_vr.dm
+++ b/code/modules/multiz/movement_vr.dm
@@ -7,6 +7,10 @@
if(!A.CanPass(src, src.loc, 1, 0))
return FALSE
Move(landing)
+ if(isliving(src))
+ var/mob/living/L = src
+ if(L.pulling)
+ L.pulling.forceMove(landing)
return 1
for(var/obj/O in loc)
diff --git a/code/modules/nano/interaction/remote.dm b/code/modules/nano/interaction/remote.dm
index 2e18386bde..8e6ded6c84 100644
--- a/code/modules/nano/interaction/remote.dm
+++ b/code/modules/nano/interaction/remote.dm
@@ -18,7 +18,7 @@
src.remoter_state = null
// Force an UI update before we go, ensuring that any windows we may have opened for the remote target closes.
- GLOB.nanomanager.update_uis(remote_target.nano_container())
+ SSnanoui.update_uis(remote_target.nano_container())
remote_target = null
return ..()
diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm
index c5a851bacc..ec43035ed8 100644
--- a/code/modules/nano/modules/alarm_monitor.dm
+++ b/code/modules/nano/modules/alarm_monitor.dm
@@ -80,7 +80,7 @@
"lost_sources" = lost_sources.len ? sanitize(english_list(lost_sources, nothing_text = "", and_text = ", ")) : ""))
data["categories"] = categories
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "alarm_monitor.tmpl", "Alarm Monitoring Console", 800, 800, state = state)
ui.set_initial_data(data)
diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm
index c8c5e8b613..3924f65af7 100644
--- a/code/modules/nano/modules/atmos_control.dm
+++ b/code/modules/nano/modules/atmos_control.dm
@@ -48,7 +48,7 @@
data["alarms"] = alarms
data["map_levels"] = using_map.get_map_levels(T.z)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "atmos_control.tmpl", src.name, 625, 625, state = state)
// adding a template with the key "mapContent" enables the map ui functionality
diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm
index 4a721ab709..319da90715 100644
--- a/code/modules/nano/modules/crew_monitor.dm
+++ b/code/modules/nano/modules/crew_monitor.dm
@@ -25,7 +25,7 @@
for(var/z in (data["map_levels"] | T.z)) // Always show crew from the current Z even if we can't show a map
data["crewmembers"] += crew_repository.health_data(z)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 800, state = state)
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 33203944a1..3d790b1194 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -145,7 +145,7 @@
data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR)
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state)
ui.set_initial_data(data)
diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm
index ae8473c8ce..da971a0f87 100644
--- a/code/modules/nano/modules/law_manager.dm
+++ b/code/modules/nano/modules/law_manager.dm
@@ -176,7 +176,7 @@
data["channels"] = channels
data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_malf(user) ? 600 : 400, state = state)
ui.set_initial_data(data)
diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm
index af1e155530..ae5dc44f29 100644
--- a/code/modules/nano/modules/power_monitor.dm
+++ b/code/modules/nano/modules/power_monitor.dm
@@ -28,7 +28,7 @@
data["focus"] = focus.return_reading_data()
data["map_levels"] = using_map.get_map_levels(T.z)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 500, state = state)
// adding a template with the key "mapContent" enables the map ui functionality
diff --git a/code/modules/nano/modules/rcon.dm b/code/modules/nano/modules/rcon.dm
index 98a73964a4..65c1acfe36 100644
--- a/code/modules/nano/modules/rcon.dm
+++ b/code/modules/nano/modules/rcon.dm
@@ -38,7 +38,7 @@
data["hide_smes_details"] = hide_SMES_details
data["hide_breakers"] = hide_breakers
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "rcon.tmpl", "RCON Console", 600, 400, state = state)
ui.set_initial_data(data)
diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm
index b1639f9194..69b0e7b77e 100644
--- a/code/modules/nano/nanomanager.dm
+++ b/code/modules/nano/nanomanager.dm
@@ -1,38 +1,3 @@
-GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the manager for Nano UIs.
-
-// This is the window/UI manager for Nano UI
-// There should only ever be one (global) instance of nanomanger
-/datum/nanomanager
- // a list of current open /nanoui UIs, grouped by src_object and ui_key
- var/open_uis[0]
- // a list of current open /nanoui UIs, not grouped, for use in processing
- var/list/processing_uis = list()
- // a list of asset filenames which are to be sent to the client on user logon
- var/list/asset_files = list()
-
- /**
- * Create a new nanomanager instance.
- * This proc generates a list of assets which are to be sent to each client on connect
- *
- * @return /nanomanager new nanomanager object
- */
-/datum/nanomanager/New()
- var/list/nano_asset_dirs = list(\
- "nano/css/",\
- "nano/images/",\
- "nano/js/",\
- "nano/templates/"\
- )
-
- var/list/filenames = null
- for (var/path in nano_asset_dirs)
- filenames = flist(path)
- for(var/filename in filenames)
- if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
- if(fexists(path + filename))
- asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect
-
- return
/**
* Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data
@@ -46,7 +11,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return /nanoui Returns the found ui, for null if none exists
*/
-/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data, var/force_open = 0)
+/datum/controller/subsystem/nanoui/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data, var/force_open = 0)
if (isnull(ui)) // no ui has been passed, so we'll search for one
{
ui = get_open_ui(user, src_object, ui_key)
@@ -71,7 +36,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return /nanoui Returns the found ui, or null if none exists
*/
-/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key)
+/datum/controller/subsystem/nanoui/proc/get_open_ui(var/mob/user, src_object, ui_key)
var/src_object_key = "\ref[src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
//testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open")
@@ -94,7 +59,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return int The number of uis updated
*/
-/datum/nanomanager/proc/update_uis(src_object)
+/datum/controller/subsystem/nanoui/proc/update_uis(src_object)
var/src_object_key = "\ref[src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0
@@ -114,7 +79,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return int The number of uis close
*/
-/datum/nanomanager/proc/close_uis(src_object)
+/datum/controller/subsystem/nanoui/proc/close_uis(src_object)
var/src_object_key = "\ref[src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0
@@ -136,7 +101,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return int The number of uis updated
*/
-/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null)
+/datum/controller/subsystem/nanoui/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null)
if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
return 0 // has no open uis
@@ -157,7 +122,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return int The number of uis closed
*/
-/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null)
+/datum/controller/subsystem/nanoui/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null)
if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
//testing("nanomanager/close_user_uis mob [user.name] has no open uis")
return 0 // has no open uis
@@ -180,7 +145,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return nothing
*/
-/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui)
+/datum/controller/subsystem/nanoui/proc/ui_opened(var/datum/nanoui/ui)
var/src_object_key = "\ref[ui.src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
open_uis[src_object_key] = list(ui.ui_key = list())
@@ -201,7 +166,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return int 0 if no ui was removed, 1 if removed successfully
*/
-/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui)
+/datum/controller/subsystem/nanoui/proc/ui_closed(var/datum/nanoui/ui)
var/src_object_key = "\ref[ui.src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0 // wasn't open
@@ -228,7 +193,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*/
//
-/datum/nanomanager/proc/user_logout(var/mob/user)
+/datum/controller/subsystem/nanoui/proc/user_logout(var/mob/user)
//testing("nanomanager/user_logout user [user.name]")
return close_user_uis(user)
@@ -241,7 +206,7 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
*
* @return nothing
*/
-/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
+/datum/controller/subsystem/nanoui/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
//testing("nanomanager/user_transferred from mob [oldMob.name] to mob [newMob.name]")
if (!oldMob || isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
//testing("nanomanager/user_transferred mob [oldMob.name] has no open uis")
@@ -256,18 +221,4 @@ GLOBAL_DATUM_INIT(nanomanager, /datum/nanomanager, new) // NanoManager, the mana
oldMob.open_uis.Cut()
- return 1 // success
-
- /**
- * Sends all nano assets to the client
- * This is called on user login
- *
- * @param client /client The user's client
- *
- * @return nothing
- */
-
-/datum/nanomanager/proc/send_resources(client)
- for(var/file in asset_files)
- client << browse_rsc(file) // send the file to the client
-
+ return 1 // success
\ No newline at end of file
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 4e4dd6af5b..43f98e3361 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -412,7 +412,7 @@ nanoui is used to open and update nano browser uis
winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map
on_close_winset()
//onclose(user, window_id)
- GLOB.nanomanager.ui_opened(src)
+ SSnanoui.ui_opened(src)
/**
* Reinitialise this UI, potentially with a different template and/or initial data
@@ -433,7 +433,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/close()
is_auto_updating = 0
- GLOB.nanomanager.ui_closed(src)
+ SSnanoui.ui_closed(src)
user << browse(null, "window=[window_id]")
for(var/datum/nanoui/child in children)
child.close()
@@ -492,7 +492,7 @@ nanoui is used to open and update nano browser uis
map_update = 1
if ((src_object && src_object.Topic(href, href_list, state)) || map_update)
- GLOB.nanomanager.update_uis(src_object) // update all UIs attached to src_object
+ SSnanoui.update_uis(src_object) // update all UIs attached to src_object
/**
* Process this UI, updating the entire UI or just the status (aka visibility)
diff --git a/code/modules/nifsoft/nif_softshop.dm b/code/modules/nifsoft/nif_softshop.dm
index 7c2990395d..818a53d38c 100644
--- a/code/modules/nifsoft/nif_softshop.dm
+++ b/code/modules/nifsoft/nif_softshop.dm
@@ -167,7 +167,7 @@
shut_up = !shut_up
add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
// Also special treatment!
/obj/machinery/vending/nifsoft_shop/vend(datum/stored_item/vending_product/R, mob/user)
@@ -179,7 +179,7 @@
vend_ready = 0 //One thing at a time!!
status_message = "Installing..."
status_error = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(R.category & CAT_COIN)
if(!coin)
@@ -215,5 +215,5 @@
status_error = 0
vend_ready = 1
currently_vending = null
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
return 1
diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm
index 2003abe04f..529114fc74 100644
--- a/code/modules/organs/internal/brain.dm
+++ b/code/modules/organs/internal/brain.dm
@@ -152,6 +152,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain)
name = "slime core"
desc = "A complex, organic knot of jelly and crystalline particles."
icon_state = "core"
+ decays = FALSE
parent_organ = BP_TORSO
clone_source = TRUE
flags = OPENCONTAINER
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index bee4f385f9..c14fac25ba 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -6,30 +6,31 @@ var/list/organ_cache = list()
germ_level = 0
// Strings.
- var/organ_tag = "organ" // Unique identifier.
- var/parent_organ = BP_TORSO // Organ holding this object.
+ var/organ_tag = "organ" // Unique identifier.
+ var/parent_organ = BP_TORSO // Organ holding this object.
// Status tracking.
- var/status = 0 // Various status flags
- var/vital // Lose a vital limb, die immediately.
- var/damage = 0 // Current damage to the organ
+ var/status = 0 // Various status flags
+ var/vital // Lose a vital limb, die immediately.
+ var/damage = 0 // Current damage to the organ
var/robotic = 0
// Reference data.
- var/mob/living/carbon/human/owner // Current mob owning the organ.
- var/list/transplant_data // Transplant match data.
- var/list/autopsy_data = list() // Trauma data for forensics.
- var/list/trace_chemicals = list() // Traces of chemicals in the organ.
- var/datum/dna/dna // Original DNA.
- var/datum/species/species // Original species.
+ var/mob/living/carbon/human/owner // Current mob owning the organ.
+ var/list/transplant_data // Transplant match data.
+ var/list/autopsy_data = list() // Trauma data for forensics.
+ var/list/trace_chemicals = list() // Traces of chemicals in the organ.
+ var/datum/dna/dna // Original DNA.
+ var/datum/species/species // Original species.
// Damage vars.
- var/min_bruised_damage = 10 // Damage before considered bruised
- var/min_broken_damage = 30 // Damage before becoming broken
- var/max_damage // Damage cap
- var/can_reject = 1 // Can this organ reject?
- var/rejecting // Is this organ already being rejected?
- var/preserved = 0 // If this is 1, prevents organ decay.
+ var/min_bruised_damage = 10 // Damage before considered bruised
+ var/min_broken_damage = 30 // Damage before becoming broken
+ var/max_damage // Damage cap
+ var/can_reject = 1 // Can this organ reject?
+ var/rejecting // Is this organ already being rejected?
+ var/decays = TRUE // Can this organ decay at all?
+ var/preserved = 0 // If this is 1, prevents organ decay.
// Language vars. Putting them here in case we decide to do something crazy with sign-or-other-nonverbal languages.
var/list/will_assist_languages = list()
@@ -135,7 +136,7 @@ var/list/organ_cache = list()
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
blood_splatter(src,B,1)
- if(config.organs_decay) damage += rand(1,3)
+ if(config.organs_decay && decays) damage += rand(1,3)
if(damage >= max_damage)
damage = max_damage
adjust_germ_level(rand(2,6))
diff --git a/code/modules/organs/subtypes/slime_vr.dm b/code/modules/organs/subtypes/slime_vr.dm
deleted file mode 100644
index 270b194f5d..0000000000
--- a/code/modules/organs/subtypes/slime_vr.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/obj/item/organ/external/chest/unbreakable/slime
- max_damage = 50
-/obj/item/organ/external/groin/unbreakable/slime
- max_damage = 30
-/obj/item/organ/external/arm/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/arm/right/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/leg/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/leg/right/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/foot/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/foot/right/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/hand/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/hand/right/unbreakable/slime
- max_damage = 8
-/obj/item/organ/external/head/unbreakable/slime
- max_damage = 8
diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm
index 4316762671..01920ee2e0 100644
--- a/code/modules/overmap/ships/computers/engine_control.dm
+++ b/code/modules/overmap/ships/computers/engine_control.dm
@@ -52,7 +52,7 @@
data["engines_info"] = enginfo
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "engines_control.tmpl", "[linked.name] Engines Control", 380, 530)
ui.set_initial_data(data)
diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm
index e31560f9e3..0249fae482 100644
--- a/code/modules/overmap/ships/computers/helm.dm
+++ b/code/modules/overmap/ships/computers/helm.dm
@@ -104,7 +104,7 @@
data["locations"] = locations
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "helm.tmpl", "[linked.name] Helm Control", 380, 530)
ui.set_initial_data(data)
diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm
index 8d6ecefcc7..09bf47512d 100644
--- a/code/modules/overmap/ships/computers/shuttle.dm
+++ b/code/modules/overmap/ships/computers/shuttle.dm
@@ -103,7 +103,7 @@
"can_force" = can_go && shuttle.can_force(),
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "shuttle_control_console_exploration.tmpl", "[shuttle_tag] Shuttle Control", 470, 310)
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 8a2940b90d..add0d03d22 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -57,7 +57,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
data["cooldown"] = sendcooldown
data["destination"] = destination
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "fax.tmpl", src.name, 500, 500)
ui.set_initial_data(data)
@@ -116,7 +116,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
if(href_list["logout"])
authenticated = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination)
if(stat & (BROKEN|NOPOWER))
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index c5c087f7d8..24ad752845 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -50,7 +50,7 @@
else
data["isSilicon"] = null
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "photocopier.tmpl", src.name, 300, 250)
ui.set_initial_data(data)
@@ -118,7 +118,7 @@
toner -= 5
sleep(15)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/photocopier/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) || istype(O, /obj/item/weapon/paper_bundle))
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 7aa085c198..7b464f6f50 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -822,7 +822,7 @@
)
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index bb808a49e2..2eadfc520a 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -211,7 +211,7 @@
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 6563cb7fdb..5e4c2e6207 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -327,7 +327,7 @@
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "pacman.tmpl", src.name, 500, 560)
ui.set_initial_data(data)
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
index 888d75ea6f..c49c605598 100644
--- a/code/modules/power/singularity/generator.dm
+++ b/code/modules/power/singularity/generator.dm
@@ -29,4 +29,25 @@
"You unsecure the [src.name] from the floor.", \
"You hear a ratchet.")
return
+ if(W.is_screwdriver())
+ panel_open = !panel_open
+ playsound(loc, W.usesound, 50, 1)
+ visible_message("\The [user] adjusts \the [src]'s mechanisms.")
+ if(panel_open && do_after(user, 30))
+ to_chat(user, "\The [src] looks like it could be modified.")
+ if(panel_open && do_after(user, 80 * W.toolspeed)) // We don't have skills, so a delayed hint for engineers will have to do for now. (Panel open check for sanity)
+ playsound(loc, W.usesound, 50, 1)
+ to_chat(user, "\The [src] looks like it could be adapted to forge advanced materials via particle acceleration, somehow..")
+ else
+ to_chat(user, "\The [src]'s mechanisms look secure.")
+ if(istype(W, /obj/item/weapon/smes_coil/super_io) && panel_open)
+ visible_message("\The [user] begins to modify \the [src] with \the [W].")
+ if(do_after(user, 300))
+ user.drop_from_inventory(W)
+ visible_message("\The [user] installs \the [W] onto \the [src].")
+ qdel(W)
+ var/turf/T = get_turf(src)
+ var/new_machine = /obj/machinery/particle_smasher
+ new new_machine(T)
+ qdel(src)
return ..()
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index 3b5992e4e4..2c3e99318d 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -44,7 +44,7 @@
if (A)
if(ismob(A))
toxmob(A)
- if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/)))
+ if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/))||(istype(A, /obj/machinery/particle_smasher)))
A:energy += energy
//R-UST port
else if(istype(A,/obj/machinery/power/fusion_core))
diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm
new file mode 100644
index 0000000000..a9fca3e160
--- /dev/null
+++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm
@@ -0,0 +1,365 @@
+/*
+ * Contains the particle smasher and its recipes.
+ */
+
+/obj/machinery/particle_smasher
+ name = "Particle Focus"
+ desc = "A strange device used to create exotic matter."
+ icon = 'icons/obj/machines/particle_smasher.dmi'
+ icon_state = "smasher"
+ anchored = 0
+ density = 1
+ use_power = 0
+
+ var/successful_craft = FALSE // Are we waiting to be emptied?
+ var/image/material_layer // Holds the image used for the filled overlay.
+ var/image/material_glow // Holds the image used for the glow overlay.
+ var/image/reagent_layer // Holds the image used for showing a contained beaker.
+ var/energy = 0 // How many 'energy' units does this have? Acquired by a Particle Accelerator like a Singularity.
+ var/max_energy = 600
+ var/obj/item/stack/material/target // The material being bombarded.
+ var/obj/item/weapon/reagent_containers/reagent_container // Holds the beaker. The process will consume ALL reagents inside it.
+ var/beaker_type = /obj/item/weapon/reagent_containers/glass/beaker
+ var/list/storage // Holds references to items allowed to be used in the fabrication phase.
+ var/max_storage = 3 // How many items can be jammed into it?
+ var/list/recipes // The list containing the Particle Smasher's recipes.
+
+/obj/machinery/particle_smasher/Initialize()
+ ..()
+ storage = list()
+ update_icon()
+ prepare_recipes()
+
+/obj/machinery/particle_smasher/Destroy()
+ for(var/datum/recipe/particle_smasher/D in recipes)
+ qdel(D)
+ recipes.Cut()
+ ..()
+
+/obj/machinery/particle_smasher/examine(mob/user)
+ ..()
+ if(user in view(1))
+ to_chat(user, "\The [src] contains:")
+ for(var/obj/item/I in contents)
+ to_chat(user, "\the [I]")
+
+/obj/machinery/particle_smasher/attackby(obj/item/W as obj, mob/user as mob)
+ if(W.type == /obj/item/device/analyzer)
+ to_chat(user, "\The [src] reads an energy level of [energy].")
+ else if(istype(W, /obj/item/stack/material))
+ var/obj/item/stack/material/M = W
+ if(M.uses_charge)
+ to_chat(user, "You cannot fill \the [src] with a synthesizer!")
+ return
+ target = M.split(1)
+ target.forceMove(src)
+ update_icon()
+ else if(istype(W, beaker_type))
+ if(reagent_container)
+ to_chat(user, "\The [src] already has a container attached.")
+ return
+ if(isrobot(user) && istype(W.loc, /obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/G = W.loc
+ G.drop_item()
+ else
+ user.drop_from_inventory(W)
+ reagent_container = W
+ reagent_container.forceMove(src)
+ to_chat(user, "You add \the [reagent_container] to \the [src].")
+ update_icon()
+ return
+ else if(W.is_wrench())
+ anchored = !anchored
+ playsound(src, W.usesound, 75, 1)
+ if(anchored)
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
+ "You secure the [src.name] to the floor.", \
+ "You hear a ratchet.")
+ else
+ user.visible_message("[user.name] unsecures [src.name] from the floor.", \
+ "You unsecure the [src.name] from the floor.", \
+ "You hear a ratchet.")
+ update_icon()
+ return
+ else if(istype(W, /obj/item/weapon/card/id))
+ to_chat(user, "Swiping \the [W] on \the [src] doesn't seem to do anything...")
+ return ..()
+ else if(((isrobot(user) && istype(W.loc, /obj/item/weapon/gripper)) || (!isrobot(user) && W.canremove)) && storage.len < max_storage)
+ if(isrobot(user) && istype(W.loc, /obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/G = W.loc
+ G.drop_item()
+ else
+ user.drop_from_inventory(W)
+ W.forceMove(src)
+ storage += W
+ else
+ return ..()
+
+/obj/machinery/particle_smasher/update_icon()
+ cut_overlays()
+ if(!material_layer)
+ material_layer = image(icon, "[initial(icon_state)]-material")
+ if(!material_glow)
+ material_glow = image(icon, "[initial(icon_state)]-material-glow")
+ material_glow.plane = PLANE_LIGHTING_ABOVE
+ if(!reagent_layer)
+ reagent_layer = image(icon, "[initial(icon_state)]-reagent")
+ if(anchored)
+ icon_state = "[initial(icon_state)]-o"
+ if(target)
+ material_layer.color = target.material.icon_colour
+ add_overlay(material_layer)
+ if(successful_craft)
+ material_glow.color = target.material.icon_colour
+ add_overlay(material_glow)
+ if(reagent_container)
+ add_overlay(reagent_layer)
+ else
+ icon_state = initial(icon_state)
+
+ if(target && energy)
+ var/power_percent = round((energy / max_energy) * 100)
+ light_color = target.material.icon_colour
+ switch(power_percent)
+ if(0 to 25)
+ light_range = 1
+ if(26 to 50)
+ light_range = 2
+ if(51 to 75)
+ light_range = 3
+ if(76 to INFINITY)
+ light_range = 4
+ set_light(light_range, 2, light_color)
+ else
+ set_light(0, 0, "#FFFFFF")
+
+/obj/machinery/particle_smasher/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj, /obj/item/projectile/beam))
+ if(Proj.damage >= 50)
+ TryCraft()
+ return 0
+
+/obj/machinery/particle_smasher/process()
+ if(!src.anchored) // Rapidly loses focus.
+ if(energy)
+ radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1))
+ energy = max(0, energy - 30)
+ update_icon()
+ return
+
+ if(energy)
+ radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1))
+ energy = CLAMP(energy - 5, 0, max_energy)
+
+ return
+
+/obj/machinery/particle_smasher/proc/prepare_recipes()
+ if(!recipes)
+ recipes = list()
+ for(var/D in subtypesof(/datum/recipe/particle_smasher))
+ recipes += new D
+ else
+ for(var/datum/recipe/particle_smasher/D in recipes)
+ qdel(D)
+ recipes.Cut()
+ for(var/D in subtypesof(/datum/recipe/particle_smasher))
+ recipes += new D
+
+/obj/machinery/particle_smasher/proc/TryCraft()
+
+ if(!recipes || !recipes.len)
+ recipes = typesof(/datum/recipe/particle_smasher)
+
+ if(!target) // You are just blasting an empty machine.
+ visible_message("\The [src] shudders.")
+ update_icon()
+ return
+
+ if(successful_craft)
+ visible_message("\The [src] fizzles.")
+ if(prob(33)) // Why are you blasting it after it's already done!
+ radiation_repository.radiate(src, 10 + round(src.energy / 60, 1))
+ energy = max(0, energy - 30)
+ update_icon()
+ return
+
+ var/list/possible_recipes = list()
+ var/max_prob = 0
+ for(var/datum/recipe/particle_smasher/R in recipes) // Only things for the smasher. Don't get things like the chef's cake recipes.
+ if(R.probability) // It's actually a recipe you're supposed to be able to make.
+ if(istype(target, R.required_material))
+ if(energy >= R.required_energy_min && energy <= R.required_energy_max) // The machine has enough Vaguely Defined 'Energy'.
+ var/turf/T = get_turf(src)
+ var/datum/gas_mixture/environment = T.return_air()
+ if(environment.temperature >= R.required_atmos_temp_min && environment.temperature <= R.required_atmos_temp_max) // Too hot, or too cold.
+ if(R.reagents && R.reagents.len)
+ if(!reagent_container || R.check_reagents(reagent_container.reagents) == -1) // It doesn't have a reagent storage when it needs it, or it's lacking what is needed.
+ continue
+ if(R.items && R.items.len)
+ if(!(storage && storage.len) || R.check_items(src) == -1) // It's empty, or it doesn't contain what is needed.
+ continue
+ possible_recipes += R
+ max_prob += R.probability
+
+ if(possible_recipes.len)
+ var/local_prob = rand(0, max_prob - 1)%max_prob
+ var/cumulative = 0
+ for(var/datum/recipe/particle_smasher/R in possible_recipes)
+ cumulative += R.probability
+ if(local_prob < cumulative)
+ successful_craft = TRUE
+ DoCraft(R)
+ break
+ update_icon()
+
+/obj/machinery/particle_smasher/proc/DoCraft(var/datum/recipe/particle_smasher/recipe)
+ if(!successful_craft || !recipe)
+ return
+
+ qdel(target)
+ target = null
+
+ if(reagent_container)
+ reagent_container.reagents.clear_reagents()
+
+ if(recipe.items && recipe.items.len)
+ for(var/obj/item/I in storage)
+ for(var/item_type in recipe.items)
+ if(istype(I, item_type))
+ storage -= I
+ qdel(I)
+ break
+
+ var/result = recipe.result
+ var/obj/item/stack/material/M = new result(src)
+ target = M
+ update_icon()
+
+/obj/machinery/particle_smasher/verb/eject_contents()
+ set src in view(1)
+ set category = "Object"
+ set name = "Eject Particle Focus Contents"
+
+ if(usr.incapacitated())
+ return
+
+ DumpContents()
+
+/obj/machinery/particle_smasher/proc/DumpContents()
+ target = null
+ reagent_container = null
+ successful_craft = FALSE
+ var/turf/T = get_turf(src)
+ for(var/obj/item/I in contents)
+ if(I in storage)
+ storage -= I
+ I.forceMove(T)
+ update_icon()
+
+/*
+ * The special recipe datums used for the particle smasher.
+ */
+
+/datum/recipe/particle_smasher
+ //reagents //Commented out due to inheritance. Still a list, used as ex: // example: = list("pacid" = 5)
+ //items //Commented out due to inheritance. Still a list, used as ex: // example: = list(/obj/item/weapon/tool/crowbar, /obj/item/weapon/welder) Place /foo/bar before /foo. Do not include fruit. Maximum of 3 items.
+
+ result = /obj/item/stack/material/iron // The sheet this will produce.
+ var/required_material = /obj/item/stack/material/iron // The required material sheet.
+ var/required_energy_min = 0 // The minimum energy this recipe can process at.
+ var/required_energy_max = 600 // The maximum energy this recipe can process at.
+ var/required_atmos_temp_min = 0 // The minimum ambient atmospheric temperature required, in kelvin.
+ var/required_atmos_temp_max = 600 // The maximum ambient atmospheric temperature required, in kelvin.
+ var/probability = 0 // The probability for the recipe to be produced. 0 will make it impossible.
+
+/datum/recipe/particle_smasher/check_items(var/obj/container as obj)
+ . = 1
+ if (items && items.len)
+ var/list/checklist = list()
+ checklist = items.Copy() // You should really trust Copy
+ if(istype(container, /obj/machinery/particle_smasher))
+ var/obj/machinery/particle_smasher/machine = container
+ for(var/obj/O in machine.storage)
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
+ continue // Fruit is handled in check_fruit().
+ var/found = 0
+ for(var/i = 1; i < checklist.len+1; i++)
+ var/item_type = checklist[i]
+ if (istype(O,item_type))
+ checklist.Cut(i, i+1)
+ found = 1
+ break
+ if (!found)
+ . = 0
+ if (checklist.len)
+ . = -1
+ return .
+
+/datum/recipe/particle_smasher/deuterium_tritium
+ reagents = list("hydrogen" = 15)
+
+ result = /obj/item/stack/material/tritium
+ required_material = /obj/item/stack/material/deuterium
+
+ required_energy_min = 200
+ required_energy_max = 400
+
+ required_atmos_temp_max = 200
+ probability = 30
+
+/datum/recipe/particle_smasher/verdantium_morphium
+ result = /obj/item/stack/material/morphium
+ required_material = /obj/item/stack/material/verdantium
+
+ required_energy_min = 400
+ required_energy_max = 500
+ probability = 20
+
+/datum/recipe/particle_smasher/plasteel_morphium
+ items = list(/obj/item/prop/alien/junk)
+
+ result = /obj/item/stack/material/morphium
+ required_material = /obj/item/stack/material/plasteel
+
+ required_energy_min = 100
+ required_energy_max = 300
+ probability = 10
+
+/datum/recipe/particle_smasher/osmium_lead
+ reagents = list("tungsten" = 10)
+
+ result = /obj/item/stack/material/lead
+ required_material = /obj/item/stack/material/osmium
+
+ required_energy_min = 200
+ required_energy_max = 400
+
+ required_atmos_temp_min = 1000
+ required_atmos_temp_max = 8000
+ probability = 50
+
+/datum/recipe/particle_smasher/phoron_valhollide
+ reagents = list("phoron" = 10, "pacid" = 10)
+
+ result = /obj/item/stack/material/valhollide
+ required_material = /obj/item/stack/material/phoron
+
+ required_energy_min = 300
+ required_energy_max = 500
+
+ required_atmos_temp_min = 1
+ required_atmos_temp_max = 100
+ probability = 10
+
+/datum/recipe/particle_smasher/valhollide_supermatter
+ reagents = list("phoron" = 300)
+
+ result = /obj/item/stack/material/supermatter
+ required_material = /obj/item/stack/material/valhollide
+
+ required_energy_min = 575
+ required_energy_max = 600
+
+ required_atmos_temp_min = 3000
+ required_atmos_temp_max = 10000
+ probability = 1
\ No newline at end of file
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 2e97d735ba..8628315601 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -144,11 +144,6 @@
charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive)
add_avail(output_used) // add output to powernet (smes side)
-
- if(output_used < 0.0001) // either from no charge or set to 0
- outputting(0)
- investigate_log("lost power and turned off","singulo")
- log_game("SMES([x],[y],[z]) Power depleted.")
else if(output_attempt && output_level > 0)
outputting = 1
else
@@ -328,7 +323,7 @@
data["outputting"] = 0 // smes is not outputting
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index ebf59a2d40..e436497fc5 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -333,7 +333,7 @@
data["ambient_pressure"] = round(env.return_pressure())
data["detonating"] = grav_pulling
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "supermatter_crystal.tmpl", "Supermatter Crystal", 500, 300)
ui.set_initial_data(data)
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 8c404e05c0..739699ae31 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -247,7 +247,7 @@
closest_atom = A
closest_dist = dist
- else if(closest_mob)
+ else if(closest_machine)
continue
else if(istype(A, /obj/structure/blob))
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 3b3de0b436..29a1db0e16 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -363,7 +363,7 @@
data["temp"] = compressor.gas_contained.temperature
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm
index 697a0b416d..99dc761ee6 100644
--- a/code/modules/random_map/noise/ore.dm
+++ b/code/modules/random_map/noise/ore.dm
@@ -57,25 +57,34 @@
T.resources["gold"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["silver"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
+ T.resources["marble"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX)
T.resources["diamond"] = 0
T.resources["phoron"] = 0
T.resources["osmium"] = 0
T.resources["hydrogen"] = 0
+ T.resources["verdantium"] = 0
+ T.resources["lead"] = 0
else if(current_cell < deep_val) // Rare metals.
T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["uranium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["phoron"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["osmium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
+ T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
+ T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX)
T.resources["hydrogen"] = 0
T.resources["diamond"] = 0
T.resources["hematite"] = 0
+ T.resources["marble"] = 0
else // Deep metals.
T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
+ T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX)
T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
+ T.resources["marble"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX)
+ T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_HIGH_MAX)
T.resources["hematite"] = 0
T.resources["gold"] = 0
T.resources["silver"] = 0
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 317bc9a3b5..4d12abddfe 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -12,27 +12,24 @@
my_atom = A
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
- if(!chemical_reagents_list)
+ if(!SSchemistry.chemical_reagents)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
var/paths = typesof(/datum/reagent) - /datum/reagent
- chemical_reagents_list = list()
+ SSchemistry.chemical_reagents = list()
for(var/path in paths)
var/datum/reagent/D = new path()
if(!D.name)
continue
- chemical_reagents_list[D.id] = D
+ SSchemistry.chemical_reagents[D.id] = D
/datum/reagents/Destroy()
- . = ..()
- if(chemistryProcess)
- chemistryProcess.active_holders -= src
-
+ STOP_PROCESSING(SSchemistry, src)
for(var/datum/reagent/R in reagent_list)
qdel(R)
- reagent_list.Cut()
reagent_list = null
if(my_atom && my_atom.reagents == src)
my_atom.reagents = null
+ return ..()
/* Internal procs */
@@ -80,41 +77,31 @@
return
/datum/reagents/proc/handle_reactions()
- if(chemistryProcess)
- chemistryProcess.mark_for_update(src)
-
-//returns 1 if the holder should continue reactiong, 0 otherwise.
-/datum/reagents/proc/process_reactions()
- if(QDELETED(my_atom)) //No container, no reaction.
- return 0
- if(my_atom.flags & NOREACT) // No reactions here
- return 0
-
- var/reaction_occured
- var/list/effect_reactions = list()
+ if(QDELETED(my_atom))
+ return FALSE
+ if(my_atom.flags & NOREACT)
+ return FALSE
+ var/reaction_occurred
var/list/eligible_reactions = list()
- for(var/i in 1 to PROCESS_REACTION_ITER)
- reaction_occured = 0
+ var/list/effect_reactions = list()
+ do
+ reaction_occurred = FALSE
+ for(var/i in reagent_list)
+ var/datum/reagent/R = i
+ if(SSchemistry.chemical_reactions_by_reagent[R.id]) //VOREStation Edit: unruntiming chems
+ eligible_reactions |= SSchemistry.chemical_reactions_by_reagent[R.id] //VOREStation Edit: unruntiming chems
- //need to rebuild this to account for chain reactions
- for(var/datum/reagent/R in reagent_list)
- eligible_reactions |= chemical_reactions_list[R.id]
-
- for(var/datum/chemical_reaction/C in eligible_reactions)
+ for(var/i in eligible_reactions)
+ var/datum/chemical_reaction/C = i
if(C.can_happen(src) && C.process(src))
effect_reactions |= C
- reaction_occured = 1
-
- eligible_reactions.Cut()
-
- if(!reaction_occured)
- break
-
- for(var/datum/chemical_reaction/C in effect_reactions)
+ reaction_occurred = TRUE
+ eligible_reactions.len = 0
+ while(reaction_occurred)
+ for(var/i in effect_reactions)
+ var/datum/chemical_reaction/C = i
C.post_reaction(src)
-
update_total()
- return reaction_occured
/* Holder-to-chemical */
@@ -136,7 +123,7 @@
if(my_atom)
my_atom.on_reagent_change()
return 1
- var/datum/reagent/D = chemical_reagents_list[id]
+ var/datum/reagent/D = SSchemistry.chemical_reagents[id]
if(D)
var/datum/reagent/R = new D.type()
reagent_list += R
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 825fd95fd4..ee77c5e79e 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -134,7 +134,7 @@
data["bottleSpritesAmount"] = list(1, 2, 3, 4) //how many bottle sprites there are. Sprites are taken from chemical.dmi and can be found in nano/images/pill.png
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "chem_master.tmpl", src.name, 575, 400)
ui.set_initial_data(data)
@@ -282,7 +282,7 @@
else if(href_list["bottle_sprite"])
bottlesprite = href_list["bottle_sprite"]
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/chem_master/attack_ai(mob/user as mob)
return src.attack_hand(user)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 0def6cd614..21775ea17e 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1,12 +1,3 @@
-//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
-/proc/initialize_chemical_reagents()
- var/paths = typesof(/datum/reagent) - /datum/reagent
- chemical_reagents_list = list()
- for(var/path in paths)
- var/datum/reagent/D = new path()
- if(!D.name)
- continue
- chemical_reagents_list[D.id] = D
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index 1ec5e6e334..6595343169 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
@@ -879,3 +879,47 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re
randmuti(M)
M << "You feel odd!"
M.apply_effect(6 * removed, IRRADIATE, 0)
+
+/*
+ * Hostile nanomachines.
+ * Unscannable, and commonly all look the same.
+ */
+
+/datum/reagent/shredding_nanites
+ name = "Restorative Nanites"
+ id = "shredding_nanites"
+ description = "Miniature medical robots that swiftly restore bodily damage. These ones seem to be malfunctioning."
+ taste_description = "metal"
+ reagent_state = SOLID
+ color = "#555555"
+ metabolism = REM * 4 // Nanomachines. Fast.
+
+/datum/reagent/shredding_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.adjustBruteLoss(4 * removed)
+ M.adjustOxyLoss(4 * removed)
+
+/datum/reagent/irradiated_nanites
+ name = "Restorative Nanites"
+ id = "irradiated_nanites"
+ description = "Miniature medical robots that swiftly restore bodily damage. These ones seem to be malfunctioning."
+ taste_description = "metal"
+ reagent_state = SOLID
+ color = "#555555"
+ metabolism = REM * 4
+
+/datum/reagent/irradiated_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ radiation_repository.radiate(get_turf(M), 20) // Irradiate people around you.
+ M.radiation = max(M.radiation + 5 * removed, 0) // Irradiate you. Because it's inside you.
+
+/datum/reagent/neurophage_nanites
+ name = "Restorative Nanites"
+ id = "neurophage_nanites"
+ description = "Miniature medical robots that swiftly restore bodily damage. These ones seem to be completely hostile."
+ taste_description = "metal"
+ reagent_state = SOLID
+ color = "#555555"
+ metabolism = REM * 4
+
+/datum/reagent/neurophage_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.adjustBrainLoss(2 * removed) // Their job is to give you a bad time.
+ M.adjustBruteLoss(2 * removed)
diff --git a/code/modules/reagents/Chemistry-Reagents_vr.dm b/code/modules/reagents/Chemistry-Reagents_vr.dm
index b841375b84..611f286ab1 100644
--- a/code/modules/reagents/Chemistry-Reagents_vr.dm
+++ b/code/modules/reagents/Chemistry-Reagents_vr.dm
@@ -9,16 +9,25 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.name != "Promethean")
- M << "Your flesh rapidly mutates!"
+ to_chat(M, "Your flesh rapidly mutates!")
+
+ var/list/backup_implants = list()
+ for(var/obj/item/organ/I in H.organs)
+ for(var/obj/item/weapon/implant/backup/BI in I.contents)
+ backup_implants += BI
+ if(backup_implants.len)
+ for(var/obj/item/weapon/implant/backup/BI in backup_implants)
+ BI.forceMove(src)
+
H.set_species("Promethean")
- H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_shape
- H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_colour
- H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_hair
- H.verbs += /mob/living/carbon/human/proc/shapeshifter_select_gender
- H.verbs += /mob/living/carbon/human/proc/regenerate
- H.verbs += /mob/living/proc/set_size
H.shapeshifter_set_colour("#05FF9B") //They can still change their color.
+ if(backup_implants.len)
+ var/obj/item/organ/external/torso = H.get_organ(BP_TORSO)
+ for(var/obj/item/weapon/implant/backup/BI in backup_implants)
+ BI.forceMove(torso)
+ torso.implants += BI
+
/datum/chemical_reaction/slime/sapphire_mutation
name = "Slime Mutation Toxins"
id = "slime_mutation_tox"
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 3c3bf869d7..c3a973402a 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1,22 +1,3 @@
-
-//Chemical Reactions - Initialises all /datum/chemical_reaction into a list
-// It is filtered into multiple lists within a list.
-// For example:
-// chemical_reaction_list["phoron"] is a list of all reactions relating to phoron
-// Note that entries in the list are NOT duplicated. So if a reaction pertains to
-// more than one chemical it will still only appear in only one of the sublists.
-/proc/initialize_chemical_reactions()
- var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction
- chemical_reactions_list = list()
-
- for(var/path in paths)
- var/datum/chemical_reaction/D = new path()
- if(D.required_reagents && D.required_reagents.len)
- var/reagent_id = D.required_reagents[1]
- if(!chemical_reactions_list[reagent_id])
- chemical_reactions_list[reagent_id] = list()
- chemical_reactions_list[reagent_id] += D
-
//helper that ensures the reaction rate holds after iterating
//Ex. REACTION_RATE(0.3) means that 30% of the reagents will react each chemistry tick (~2 seconds by default).
#define REACTION_RATE(rate) (1.0 - (1.0-rate)**(1.0/PROCESS_REACTION_ITER))
diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm
index f73f6e4a71..70142fabd8 100644
--- a/code/modules/reagents/dispenser/cartridge.dm
+++ b/code/modules/reagents/dispenser/cartridge.dm
@@ -18,7 +18,7 @@
. = ..()
if(spawn_reagent)
reagents.add_reagent(spawn_reagent, volume)
- var/datum/reagent/R = chemical_reagents_list[spawn_reagent]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[spawn_reagent]
setLabel(R.name)
/obj/item/weapon/reagent_containers/chem_disp_cartridge/examine(mob/user)
diff --git a/code/modules/reagents/dispenser/cartridge_spawn.dm b/code/modules/reagents/dispenser/cartridge_spawn.dm
index 730e191891..ba9b727047 100644
--- a/code/modules/reagents/dispenser/cartridge_spawn.dm
+++ b/code/modules/reagents/dispenser/cartridge_spawn.dm
@@ -1,4 +1,4 @@
-/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in chemical_reagents_list)
+/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in SSchemistry.chemical_reagents)
set name = "Spawn Chemical Dispenser Cartridge"
set category = "Admin"
@@ -8,6 +8,6 @@
if("medium") C = new /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium(usr.loc)
if("large") C = new /obj/item/weapon/reagent_containers/chem_disp_cartridge(usr.loc)
C.reagents.add_reagent(reagent, C.volume)
- var/datum/reagent/R = chemical_reagents_list[reagent]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[reagent]
C.setLabel(R.name)
log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])")
diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm
index a04db7d53b..38c6cf39da 100644
--- a/code/modules/reagents/dispenser/dispenser2.dm
+++ b/code/modules/reagents/dispenser/dispenser2.dm
@@ -55,12 +55,12 @@
C.loc = src
cartridges[C.label] = C
cartridges = sortAssoc(cartridges)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/chemical_dispenser/proc/remove_cartridge(label)
. = cartridges[label]
cartridges -= label
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/chemical_dispenser/attackby(obj/item/weapon/W, mob/user)
if(W.is_wrench())
@@ -106,7 +106,7 @@
user.drop_from_inventory(RC)
RC.loc = src
to_chat(user, "You set \the [RC] on \the [src].")
- GLOB.nanomanager.update_uis(src) // update all UIs attached to src
+ SSnanoui.update_uis(src) // update all UIs attached to src
else
return ..()
@@ -140,7 +140,7 @@
data["chemicals"] = chemicals
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "chem_disp.tmpl", ui_title, 390, 680)
ui.set_initial_data(data)
diff --git a/code/modules/reagents/dispenser/dispenser2_energy.dm b/code/modules/reagents/dispenser/dispenser2_energy.dm
index f540811c11..c889b2fe9d 100644
--- a/code/modules/reagents/dispenser/dispenser2_energy.dm
+++ b/code/modules/reagents/dispenser/dispenser2_energy.dm
@@ -13,7 +13,7 @@
process_tick = 15
. = 0
for(var/id in dispense_reagents)
- var/datum/reagent/R = chemical_reagents_list[id]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[id]
if(!R)
crash_with("[src] at [x],[y],[z] failed to find reagent '[id]'!")
dispense_reagents -= id
@@ -25,7 +25,7 @@
C.reagents.add_reagent(id, to_restore)
. = 1
if(.)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/chemical_dispenser
dispense_reagents = list(
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index a050478c4b..df99bca9e1 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -39,7 +39,7 @@
for(var/T in reagent_ids)
reagent_volumes[T] = volume
- var/datum/reagent/R = chemical_reagents_list[T]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[T]
reagent_names += R.name
START_PROCESSING(SSobj, src)
@@ -112,14 +112,14 @@
if(t)
playsound(loc, 'sound/effects/pop.ogg', 50, 0)
mode = t
- var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[reagent_ids[mode]]
usr << "Synthesizer is now producing '[R.name]'."
/obj/item/weapon/reagent_containers/borghypo/examine(mob/user)
if(!..(user, 2))
return
- var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[reagent_ids[mode]]
user << "It is currently producing [R.name] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left."
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 4121b8a558..4cc755d158 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -32,12 +32,7 @@
if(newdir)
set_dir(newdir)
- if(dir & (dir-1)) // Diagonal. Forwards is *away* from dir, curving to the right.
- forwards = turn(dir, 135)
- backwards = turn(dir, 45)
- else
- forwards = dir
- backwards = turn(dir, 180)
+ update_dir()
if(on)
operating = FORWARDS
@@ -60,6 +55,18 @@
operating = OFF
update()
+/obj/machinery/conveyor/set_dir()
+ .=..()
+ update_dir()
+
+/obj/machinery/conveyor/proc/update_dir()
+ if(!(dir in cardinal)) // Diagonal. Forwards is *away* from dir, curving to the right.
+ forwards = turn(dir, 135)
+ backwards = turn(dir, 45)
+ else
+ forwards = dir
+ backwards = turn(dir, 180)
+
/obj/machinery/conveyor/proc/update()
if(stat & BROKEN)
icon_state = "conveyor-broken"
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 70ca9692f3..9d3eab7c43 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -16,7 +16,9 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
var/mat_efficiency = 1
var/speed = 1
- materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
+ materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, MAT_LEAD = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0)
+
+ hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
use_power = 1
idle_power_usage = 30
@@ -68,7 +70,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating
- mat_efficiency = 1 - (T - 1) / 4
+ mat_efficiency = max(1 - (T - 1) / 4, 0.2)
speed = T
/obj/machinery/r_n_d/circuit_imprinter/update_icon()
diff --git a/code/modules/research/designs/illegal.dm b/code/modules/research/designs/illegal.dm
index 1542e929b6..c195b5764b 100644
--- a/code/modules/research/designs/illegal.dm
+++ b/code/modules/research/designs/illegal.dm
@@ -16,4 +16,11 @@
req_tech = list(TECH_ILLEGAL = 2)
materials = list(DEFAULT_WALL_MATERIAL = 500)
build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon
- sort_string = "VASBA"
\ No newline at end of file
+ sort_string = "VASBA"
+
+/datum/design/item/weapon/esword
+ id = "chargesword"
+ req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_ILLEGAL = 4, TECH_ANOMALY = 1)
+ materials = list(MAT_PLASTEEL = 3500, "glass" = 1000, MAT_LEAD = 2250, MAT_METALHYDROGEN = 500)
+ build_path = /obj/item/weapon/melee/energy/sword/charge
+ sort_string = "VASCA"
diff --git a/code/modules/research/designs/precursor.dm b/code/modules/research/designs/precursor.dm
new file mode 100644
index 0000000000..88575e5667
--- /dev/null
+++ b/code/modules/research/designs/precursor.dm
@@ -0,0 +1,70 @@
+/*
+ * Contains Precursor and Anomalous designs for the Protolathe.
+ */
+
+/datum/design/item/precursor/AssembleDesignName()
+ ..()
+ name = "Alien prototype ([item_name])"
+
+/datum/design/item/precursor/AssembleDesignDesc()
+ if(!desc)
+ if(build_path)
+ var/obj/item/I = build_path
+ desc = initial(I.desc)
+ ..()
+
+/datum/design/item/precursor/crowbar
+ name = "Hybrid Crowbar"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridcrowbar"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_GOLD = 250, MAT_URANIUM = 2500)
+ build_path = /obj/item/weapon/tool/crowbar/hybrid
+ sort_string = "PATAC"
+
+/datum/design/item/precursor/wrench
+ name = "Hybrid Wrench"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridwrench"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_SILVER = 300, MAT_URANIUM = 2000)
+ build_path = /obj/item/weapon/tool/wrench/hybrid
+ sort_string = "PATAW"
+
+/datum/design/item/precursor/screwdriver
+ name = "Hybrid Screwdriver"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridscrewdriver"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/weapon/tool/screwdriver/hybrid
+ sort_string = "PATAS"
+
+/datum/design/item/precursor/wirecutters
+ name = "Hybrid Wirecutters"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridwirecutters"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_PHORON = 2, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_PHORON = 2750, MAT_DIAMOND = 2000)
+ build_path = /obj/item/weapon/tool/wirecutters/hybrid
+ sort_string = "PATBW"
+
+/datum/design/item/precursor/welder
+ name = "Hybrid Welding Tool"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridwelder"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PHORON = 3, TECH_MAGNET = 5, TECH_PRECURSOR = 1)
+ materials = list(MAT_DURASTEEL = 2000, MAT_MORPHIUM = 3000, MAT_METALHYDROGEN = 4750, MAT_URANIUM = 6000)
+ build_path = /obj/item/weapon/weldingtool/experimental/hybrid
+ sort_string = "PATCW"
+
+/datum/design/item/anomaly/AssembleDesignName()
+ ..()
+ name = "Anomalous prototype ([item_name])"
+
+/datum/design/item/anomaly/AssembleDesignDesc()
+ if(!desc)
+ if(build_path)
+ var/obj/item/I = build_path
+ desc = initial(I.desc)
+ ..()
\ No newline at end of file
diff --git a/code/modules/research/designs/stock_parts.dm b/code/modules/research/designs/stock_parts.dm
index fb629e7ad7..60a0abb63e 100644
--- a/code/modules/research/designs/stock_parts.dm
+++ b/code/modules/research/designs/stock_parts.dm
@@ -34,6 +34,20 @@
build_path = /obj/item/weapon/stock_parts/capacitor/super
sort_string = "CAAAC"
+/datum/design/item/stock_part/hyper_capacitor
+ id = "hyper_capacitor"
+ req_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_DURASTEEL = 25)
+ build_path = /obj/item/weapon/stock_parts/capacitor/hyper
+ sort_string = "CAAAD"
+
+/datum/design/item/stock_part/omni_capacitor
+ id = "omni_capacitor"
+ req_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_DIAMOND = 1000, MAT_GLASS = 1000, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100)
+ build_path = /obj/item/weapon/stock_parts/capacitor/omni
+ sort_string = "CAAAE"
+
/datum/design/item/stock_part/micro_mani
id = "micro_mani"
req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1)
@@ -55,6 +69,20 @@
build_path = /obj/item/weapon/stock_parts/manipulator/pico
sort_string = "CAABC"
+/datum/design/item/stock_part/hyper_mani
+ id = "hyper_mani"
+ req_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 50)
+ build_path = /obj/item/weapon/stock_parts/manipulator/hyper
+ sort_string = "CAABD"
+
+/datum/design/item/stock_part/omni_mani
+ id = "omni_mani"
+ req_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100)
+ build_path = /obj/item/weapon/stock_parts/manipulator/omni
+ sort_string = "CAABE"
+
/datum/design/item/stock_part/basic_matter_bin
id = "basic_matter_bin"
req_tech = list(TECH_MATERIAL = 1)
@@ -76,6 +104,20 @@
build_path = /obj/item/weapon/stock_parts/matter_bin/super
sort_string = "CAACC"
+/datum/design/item/stock_part/hyper_matter_bin
+ id = "hyper_matter_bin"
+ req_tech = list(TECH_MATERIAL = 6, TECH_ARCANE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 60, MAT_DURASTEEL = 75)
+ build_path = /obj/item/weapon/stock_parts/matter_bin/hyper
+ sort_string = "CAACD"
+
+/datum/design/item/stock_part/omni_matter_bin
+ id = "omni_matter_bin"
+ req_tech = list(TECH_MATERIAL = 7, TECH_PRECURSOR = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 100, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100)
+ build_path = /obj/item/weapon/stock_parts/matter_bin/omni
+ sort_string = "CAACE"
+
/datum/design/item/stock_part/basic_micro_laser
id = "basic_micro_laser"
req_tech = list(TECH_MAGNET = 1)
@@ -97,6 +139,20 @@
build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
sort_string = "CAADC"
+/datum/design/item/stock_part/hyper_micro_laser
+ id = "hyper_micro_laser"
+ req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 6, TECH_ARCANE = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 100)
+ build_path = /obj/item/weapon/stock_parts/micro_laser/hyper
+ sort_string = "CAADD"
+
+/datum/design/item/stock_part/omni_micro_laser
+ id = "omni_micro_laser"
+ req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 7, TECH_PRECURSOR = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100)
+ build_path = /obj/item/weapon/stock_parts/micro_laser/omni
+ sort_string = "CAADE"
+
/datum/design/item/stock_part/basic_sensor
id = "basic_sensor"
req_tech = list(TECH_MAGNET = 1)
@@ -118,6 +174,20 @@
build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
sort_string = "CAAEC"
+/datum/design/item/stock_part/hyper_sensor
+ id = "hyper_sensor"
+ req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 4, TECH_ARCANE = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, MAT_GLASS = 20, MAT_SILVER = 50, MAT_VERDANTIUM = 40, MAT_DURASTEEL = 50)
+ build_path = /obj/item/weapon/stock_parts/scanning_module/hyper
+ sort_string = "CAAED"
+
+/datum/design/item/stock_part/omni_sensor
+ id = "omni_sensor"
+ req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 1000, MAT_PLASTEEL = 500, MAT_GLASS = 750, MAT_SILVER = 500, MAT_MORPHIUM = 60, MAT_DURASTEEL = 100)
+ build_path = /obj/item/weapon/stock_parts/scanning_module/omni
+ sort_string = "CAAEE"
+
/datum/design/item/stock_part/subspace_ansible
id = "s-ansible"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm
index 94fbb9ce09..518c77a504 100644
--- a/code/modules/research/designs_vr.dm
+++ b/code/modules/research/designs_vr.dm
@@ -316,3 +316,13 @@
id = "rigmod_orescanner"
build_path = /obj/item/rig_module/device/orescanner
sort_string = "HCAAI"
+
+//Prosfab stuff for borgs and such
+
+/datum/design/item/robot_upgrade/sizeshift
+ name = "Size Alteration Module"
+ desc = "Used to allow robot to freely alter their size."
+ id = "borg_sizeshift_module"
+ req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000)
+ build_path = /obj/item/borg/upgrade/sizeshift
\ No newline at end of file
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index bea555b70c..b8b4130dfe 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -15,7 +15,9 @@
var/mat_efficiency = 1
var/speed = 1
- materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
+ materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, MAT_LEAD = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0)
+
+ hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
/obj/machinery/r_n_d/protolathe/Initialize()
. = ..()
@@ -71,7 +73,7 @@
T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating
- mat_efficiency = 1 - (T - 2) / 8
+ mat_efficiency = max(1 - (T - 2) / 8, 0.2)
speed = T / 2
/obj/machinery/r_n_d/protolathe/dismantle()
@@ -207,28 +209,17 @@
/obj/machinery/r_n_d/protolathe/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
var/recursive = amount == -1 ? 1 : 0
material = lowertext(material)
- var/mattype
- switch(material)
- if(DEFAULT_WALL_MATERIAL)
- mattype = /obj/item/stack/material/steel
- if("glass")
- mattype = /obj/item/stack/material/glass
- if("plastic")
- mattype = /obj/item/stack/material/plastic
- if("gold")
- mattype = /obj/item/stack/material/gold
- if("silver")
- mattype = /obj/item/stack/material/silver
- if("osmium")
- mattype = /obj/item/stack/material/osmium
- if("diamond")
- mattype = /obj/item/stack/material/diamond
- if("phoron")
- mattype = /obj/item/stack/material/phoron
- if("uranium")
- mattype = /obj/item/stack/material/uranium
- else
- return
+ var/obj/item/stack/material/mattype
+ var/material/MAT = get_material_by_name(material)
+
+ if(!MAT)
+ return
+
+ mattype = MAT.stack_type
+
+ if(!mattype)
+ return
+
var/obj/item/stack/material/S = new mattype(loc)
if(amount <= 0)
amount = S.max_amount
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 38cba96c84..5346f50e6e 100755
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -660,6 +660,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += ""
for(var/M in linked_lathe.materials)
var/amount = linked_lathe.materials[M]
+ var/hidden_mat = FALSE
+ for(var/HM in linked_lathe.hidden_materials)
+ if(M == HM && amount == 0)
+ hidden_mat = TRUE
+ break
+ if(hidden_mat)
+ continue
dat += "- [capitalize(M)]: [amount] cm3"
if(amount >= SHEET_MATERIAL_AMOUNT)
dat += " || Eject "
@@ -745,6 +752,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "
"
for(var/M in linked_imprinter.materials)
var/amount = linked_imprinter.materials[M]
+ var/hidden_mat = FALSE
+ for(var/HM in linked_imprinter.hidden_materials)
+ if(M == HM && amount == 0)
+ hidden_mat = TRUE
+ break
+ if(hidden_mat)
+ continue
dat += "- [capitalize(M)]: [amount] cm3"
if(amount >= SHEET_MATERIAL_AMOUNT)
dat += " || Eject: "
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index f7f5bed638..b7e9b78c56 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -11,53 +11,23 @@
var/busy = 0
var/obj/machinery/computer/rdconsole/linked_console
- var/list/materials = list()
+ var/list/materials = list() // Materials this machine can accept.
+ var/list/hidden_materials = list() // Materials this machine will not display, unless it contains them. Must be in the materials list as well.
/obj/machinery/r_n_d/attack_hand(mob/user as mob)
return
/obj/machinery/r_n_d/proc/getMaterialType(var/name)
- switch(name)
- if(DEFAULT_WALL_MATERIAL)
- return /obj/item/stack/material/steel
- if("glass")
- return /obj/item/stack/material/glass
- if("plastic")
- return /obj/item/stack/material/plastic
- if("gold")
- return /obj/item/stack/material/gold
- if("silver")
- return /obj/item/stack/material/silver
- if("osmium")
- return /obj/item/stack/material/osmium
- if("phoron")
- return /obj/item/stack/material/phoron
- if("uranium")
- return /obj/item/stack/material/uranium
- if("diamond")
- return /obj/item/stack/material/diamond
+ var/material/M = get_material_by_name(name)
+ if(M && M.stack_type)
+ return M.stack_type
return null
/obj/machinery/r_n_d/proc/getMaterialName(var/type)
- switch(type)
- if(/obj/item/stack/material/steel)
- return DEFAULT_WALL_MATERIAL
- if(/obj/item/stack/material/glass)
- return "glass"
- if(/obj/item/stack/material/plastic)
- return "plastic"
- if(/obj/item/stack/material/gold)
- return "gold"
- if(/obj/item/stack/material/silver)
- return "silver"
- if(/obj/item/stack/material/osmium)
- return "osmium"
- if(/obj/item/stack/material/phoron)
- return "phoron"
- if(/obj/item/stack/material/uranium)
- return "uranium"
- if(/obj/item/stack/material/diamond)
- return "diamond"
+ if(istype(type, /obj/item/stack/material))
+ var/obj/item/stack/material/M = type
+ return M.material.name
+ return null
/obj/machinery/r_n_d/proc/eject(var/material, var/amount)
if(!(material in materials))
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 22a8bc1a3f..5304f8c738 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -208,11 +208,17 @@ research holder datum.
level = 0
/datum/tech/arcane
- name = "Arcane Research"
- desc = "Research into the occult and arcane field for use in practical science"
+ name = "Anomalous Research"
+ desc = "Study of phenomena that disobey the fundamental laws of this universe."
id = TECH_ARCANE
level = 0
+/datum/tech/precursor
+ name = "Precursor Research"
+ desc = "The applied study of Precursor Technology, for modern applications."
+ id = TECH_PRECURSOR
+ level = 0
+
/obj/item/weapon/disk/tech_disk
name = "technology disk"
desc = "A disk for storing technology data for further research."
diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm
index f4445682dc..854b9dd097 100644
--- a/code/modules/resleeving/computers.dm
+++ b/code/modules/resleeving/computers.dm
@@ -198,7 +198,7 @@
data["coredumped"] = SStranscore.core_dumped
data["emergency"] = disk ? 1 : 0
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "sleever.tmpl", "Resleeving Control Console", 400, 450)
ui.set_initial_data(data)
@@ -375,7 +375,7 @@
menu = href_list["menu"]
temp = ""
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
add_fingerprint(usr)
// In here because only relevant to computer
diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm
index 7e545b35fa..d4dadb2945 100644
--- a/code/modules/resleeving/designer.dm
+++ b/code/modules/resleeving/designer.dm
@@ -141,7 +141,7 @@
data["disk"] = disk ? 1 : 0
data["diskStored"] = disk && disk.stored ? 1 : 0
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "body_designer.tmpl", "Body Design Console", 400, 600)
ui.set_initial_data(data)
diff --git a/code/modules/resleeving/infocore_records.dm b/code/modules/resleeving/infocore_records.dm
index 834b067e9d..134d2be87d 100644
--- a/code/modules/resleeving/infocore_records.dm
+++ b/code/modules/resleeving/infocore_records.dm
@@ -14,6 +14,7 @@
//0: Normal, 1: Might be dead, 2: Definitely dead, show on console
var/dead_state = 0
var/last_update = 0
+ var/last_notification
//Backend
var/ckey = ""
diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm
index 906873408d..6166bb6456 100644
--- a/code/modules/resleeving/infomorph.dm
+++ b/code/modules/resleeving/infomorph.dm
@@ -187,7 +187,7 @@ var/list/infomorph_emotions = list(
medicalActive1 = null
medicalActive2 = null
medical_cannotfind = 0
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
usr << "You reset your record-viewing software."
/*
@@ -509,7 +509,7 @@ var/global/list/default_infomorph_software = list()
data["emotions"] = emotions
data["current_emotion"] = card.current_emotion
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open, key_state)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open, key_state)
if (!ui)
ui = new(user, src, ui_key, "pai_interface.tmpl", "Card Software Interface", 450, 600, state = key_state)
ui.set_initial_data(data)
diff --git a/code/modules/resleeving/infomorph_software.dm b/code/modules/resleeving/infomorph_software.dm
index 21a51d91e3..bb5b7fc870 100644
--- a/code/modules/resleeving/infomorph_software.dm
+++ b/code/modules/resleeving/infomorph_software.dm
@@ -34,7 +34,7 @@
// This is dumb, but NanoUI breaks if it has no data to send
data["manifest"] = PDA_Manifest
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600)
@@ -66,7 +66,7 @@
data["medical"] = M ? M.fields : null
data["could_not_find"] = user.medical_cannotfind
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600)
@@ -120,7 +120,7 @@
data["security"] = S ? S.fields : null
data["could_not_find"] = user.security_cannotfind
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600)
@@ -170,7 +170,7 @@
data["progress_b"] = user.hackprogress % 10
data["aborted"] = user.hack_aborted
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150)
@@ -270,7 +270,7 @@
gases[++gases.len] = gas
data["gas"] = gases
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300)
@@ -314,7 +314,7 @@
data["frequency"] = format_frequency(user.sradio.frequency)
data["code"] = user.sradio.code
- ui = GLOB.nanomanager.try_update_ui(user, user, id, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150)
diff --git a/code/modules/rogueminer_vr/zone_console.dm b/code/modules/rogueminer_vr/zone_console.dm
index 75c5d6625c..17ea54c564 100644
--- a/code/modules/rogueminer_vr/zone_console.dm
+++ b/code/modules/rogueminer_vr/zone_console.dm
@@ -79,7 +79,7 @@
// Permit emergency recall of the shuttle if its stranded in a zone with just dead people.
data["can_recall_shuttle"] = (shuttle_control && shuttle_control.z == BELT_Z && !curZoneOccupied)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "zone_console.tmpl", src.name, 600, 400)
ui.set_initial_data(data)
@@ -100,7 +100,7 @@
failsafe_shuttle_recall()
src.add_fingerprint(usr)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/computer/roguezones/proc/scan_for_new_zone()
if(scanning) return
diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm
index e79f5d9b20..60c1e4bd0d 100644
--- a/code/modules/shuttles/escape_pods.dm
+++ b/code/modules/shuttles/escape_pods.dm
@@ -55,7 +55,7 @@
"is_armed" = pod.arming_controller.armed,
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "escape_pod_console.tmpl", name, 470, 290)
@@ -102,7 +102,7 @@
"armed" = armed,
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "escape_pod_berth_console.tmpl", name, 470, 290)
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index 01924be412..3d5422f4f1 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -57,7 +57,7 @@
"can_force" = shuttle.can_force(),
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "shuttle_control_console.tmpl", "[shuttle_tag] Shuttle Control", 470, 310)
diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm
index 7db9ae2b62..86b8e29809 100644
--- a/code/modules/shuttles/shuttle_emergency.dm
+++ b/code/modules/shuttles/shuttle_emergency.dm
@@ -233,7 +233,7 @@
"user" = debug? user : null,
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "escape_shuttle_control_console.tmpl", "Shuttle Control", 470, 420)
diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm
index c717e51adc..3726ce23cd 100644
--- a/code/modules/shuttles/shuttles_web.dm
+++ b/code/modules/shuttles/shuttles_web.dm
@@ -350,7 +350,7 @@
"sensors" = sensors
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "flight.tmpl", "[shuttle.visible_name] Flight Computer", 500, 500)
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index 277463bddc..b2cc345b8c 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -116,7 +116,7 @@
data["lastTeleData"]["distance"] = last_tele_data.distance
data["lastTeleData"]["time"] = last_tele_data.time
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "telescience_console.tmpl", src.name, 400, 450)
ui.set_initial_data(data)
diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm
index 73e43be704..433a26977b 100644
--- a/code/modules/virus2/centrifuge.dm
+++ b/code/modules/virus2/centrifuge.dm
@@ -26,7 +26,7 @@
O.loc = src
user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
src.attack_hand(user)
@@ -74,7 +74,7 @@
data["antibodies"] = antigens2string(A.data["antibodies"], none=null)
data["is_antibody_sample"] = 1
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "isolation_centrifuge.tmpl", src.name, 400, 500)
ui.set_initial_data(data)
@@ -98,7 +98,7 @@
if (..()) return 1
var/mob/user = usr
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
src.add_fingerprint(user)
@@ -160,7 +160,7 @@
sample.reagents.remove_reagent("blood", amt)
sample.reagents.add_reagent("antibodies", amt, data)
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
update_icon()
ping("\The [src] pings, \"Antibody isolated.\"")
@@ -170,7 +170,7 @@
dish.virus2 = virus2
virus2 = null
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
update_icon()
ping("\The [src] pings, \"Pathogen isolated.\"")
diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm
index b5db3fa96a..95657498a0 100644
--- a/code/modules/virus2/diseasesplicer.dm
+++ b/code/modules/virus2/diseasesplicer.dm
@@ -81,7 +81,7 @@
else
data["info"] = "No dish loaded."
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "disease_splicer.tmpl", src.name, 400, 600)
ui.set_initial_data(data)
@@ -95,12 +95,12 @@
scanning -= 1
if(!scanning)
ping("\The [src] pings, \"Analysis complete.\"")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(splicing)
splicing -= 1
if(!splicing)
ping("\The [src] pings, \"Splicing operation complete.\"")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(burning)
burning -= 1
if(!burning)
@@ -122,13 +122,13 @@
d.species = species_buffer
ping("\The [src] pings, \"Backup disk saved.\"")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/computer/diseasesplicer/Topic(href, href_list)
if(..()) return 1
var/mob/user = usr
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
src.add_fingerprint(user)
diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm
index 3ecad1d691..379d7ef533 100644
--- a/code/modules/virus2/dishincubator.dm
+++ b/code/modules/virus2/dishincubator.dm
@@ -29,7 +29,7 @@
O.loc = src
user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
src.attack_hand(user)
return
@@ -45,7 +45,7 @@
O.loc = src
user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
src.attack_hand(user)
@@ -85,7 +85,7 @@
for (var/ID in virus)
data["blood_already_infected"] = virus[ID]
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "dish_incubator.tmpl", src.name, 400, 600)
ui.set_initial_data(data)
@@ -104,7 +104,7 @@
foodsupply -= 1
dish.growth += 3
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(radiation)
if(radiation > 50 & prob(5))
@@ -117,24 +117,24 @@
else if(prob(5))
dish.virus2.minormutate()
radiation -= 1
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(toxins && prob(5))
dish.virus2.infectionchance -= 1
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(toxins > 50)
dish.growth = 0
dish.virus2 = null
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
else if(!dish)
on = 0
icon_state = "incubator"
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if(beaker)
if(foodsupply < 100 && beaker.reagents.remove_reagent("virusfood",5))
if(foodsupply + 10 <= 100)
foodsupply += 10
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
if (locate(/datum/reagent/toxin) in beaker.reagents.reagent_list && toxins < 100)
for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list)
@@ -143,13 +143,13 @@
if(toxins > 100)
toxins = 100
break
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
/obj/machinery/disease2/incubator/Topic(href, href_list)
if (..()) return 1
var/mob/user = usr
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
src.add_fingerprint(user)
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
index d7db2633ad..c4ea02b873 100644
--- a/code/modules/virus2/effect.dm
+++ b/code/modules/virus2/effect.dm
@@ -354,7 +354,7 @@
data = pick("bicaridine", "kelotane", "anti_toxin", "inaprovaline", "space_drugs", "sugar",
"tramadol", "dexalin", "cryptobiolin", "impedrezene", "hyperzine", "ethylredoxrazine",
"mindbreaker", "glucose")
- var/datum/reagent/R = chemical_reagents_list[data]
+ var/datum/reagent/R = SSchemistry.chemical_reagents[data]
name = "[initial(name)] ([initial(R.name)])"
/datum/disease2/effect/chem_synthesis/activate(var/mob/living/carbon/mob,var/multiplier)
diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm
index 8fa61e173b..da2c543fc8 100644
--- a/code/modules/virus2/isolator.dm
+++ b/code/modules/virus2/isolator.dm
@@ -43,7 +43,7 @@
S.loc = src
user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
update_icon()
src.attack_hand(user)
@@ -103,7 +103,7 @@
"name" = entry.fields["name"], \
"description" = replacetext(desc, "\n", ""))
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "pathogenic_isolator.tmpl", src.name, 400, 500)
ui.set_initial_data(data)
@@ -119,14 +119,14 @@
virus2 = null
ping("\The [src] pings, \"Viral strain isolated.\"")
- GLOB.nanomanager.update_uis(src)
+ SSnanoui.update_uis(src)
update_icon()
/obj/machinery/disease2/isolator/Topic(href, href_list)
if (..()) return 1
var/mob/user = usr
- var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(user, src, "main")
+ var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
src.add_fingerprint(user)
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
index 7b37c1acdf..700a22b3a7 100644
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -612,6 +612,8 @@
name = "moth antenna and wings, colorable"
desc = ""
icon_state = "moth_full_gray"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/wing/kerena
name = "wingwolf wings (Kerena)"
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index dba128e7e0..6547aacd23 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -38,7 +38,7 @@
//Actual full digest modes
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL)
//Digest mode addon flags
- var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING)
+ var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS)
//Transformation modes
var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG)
//Item related modes
diff --git a/code/modules/vore/eating/bellymodes_tf_vr.dm b/code/modules/vore/eating/bellymodes_tf_vr.dm
index 1f638f4f98..d2a379a336 100644
--- a/code/modules/vore/eating/bellymodes_tf_vr.dm
+++ b/code/modules/vore/eating/bellymodes_tf_vr.dm
@@ -97,7 +97,7 @@
change_ears(P)
change_tail_nocolor(P)
change_wing_nocolor(P)
- change_species(P,1)
+ change_species(P,1,1)
///////////////////////////// DM_TRANSFORM_REPLICA /////////////////////////////
else if(mode == DM_TRANSFORM_REPLICA)
@@ -122,7 +122,7 @@
change_ears(P)
change_tail(P)
change_wing(P)
- change_species(P,1)
+ change_species(P,1,2)
///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG /////////////////////////////
else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
@@ -134,7 +134,7 @@
change_ears(P)
change_tail_nocolor(P)
change_wing_nocolor(P)
- change_species(P,1)
+ change_species(P,1,1)
continue
if(!P.absorbed)
@@ -177,7 +177,7 @@
change_ears(P)
change_tail(P)
change_wing(P)
- change_species(P,1)
+ change_species(P,1,2)
continue
if(!P.absorbed)
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 61b2914828..886ca5830c 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -138,6 +138,8 @@
to_chat(M,"" + digest_alert_prey + "")
play_sound = pick(death_sounds)
+ if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
+ handle_remains_leaving(M)
digestion_death(M)
owner.update_icons()
if(compensation > 0)
diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm
new file mode 100644
index 0000000000..be515f51c3
--- /dev/null
+++ b/code/modules/vore/eating/leave_remains_vr.dm
@@ -0,0 +1,163 @@
+/obj/belly/proc/handle_remains_leaving(var/mob/living/M)
+
+ if(istype(M,/mob/living/carbon/human)) //Are we even humanoid?
+ var/mob/living/carbon/human/H = M
+
+ if((H.species.name in remainless_species) || H.isSynthetic()) //Don't leave anything if there is nothing to leave
+ return
+
+ else
+ var/bones_amount = rand(2,3) //some random variety in amount of bones left
+
+ if(prob(20)) //ribcage surviving whole is some luck
+ new /obj/item/weapon/digestion_remains/ribcage(src,owner)
+ bones_amount--
+
+ while(bones_amount) //throw in the rest
+ new /obj/item/weapon/digestion_remains(src,owner)
+ bones_amount--
+
+ var/skull_amount = 1
+ switch(H.species.name) //oh boy here we go, finding us a right skull
+ if(SPECIES_HUMAN)
+ new /obj/item/weapon/digestion_remains/skull(src,owner)
+ skull_amount--
+ if(SPECIES_TAJ)
+ new /obj/item/weapon/digestion_remains/skull/tajaran(src,owner)
+ skull_amount--
+ if(SPECIES_UNATHI)
+ new /obj/item/weapon/digestion_remains/skull/unathi(src,owner)
+ skull_amount--
+ if(SPECIES_SKRELL)
+ new /obj/item/weapon/digestion_remains/skull/skrell(src,owner)
+ skull_amount--
+ if(SPECIES_VASILISSAN)
+ new /obj/item/weapon/digestion_remains/skull/vasilissan(src,owner)
+ skull_amount--
+ if(SPECIES_AKULA)
+ new /obj/item/weapon/digestion_remains/skull/akula(src,owner)
+ skull_amount--
+ if(SPECIES_RAPALA)
+ new /obj/item/weapon/digestion_remains/skull/rapala(src,owner)
+ skull_amount--
+ if(SPECIES_VULPKANIN)
+ new /obj/item/weapon/digestion_remains/skull/vulpkanin(src,owner)
+ skull_amount--
+ if(SPECIES_SERGAL)
+ new /obj/item/weapon/digestion_remains/skull/sergal(src,owner)
+ skull_amount--
+ if(SPECIES_ZORREN_FLAT || SPECIES_ZORREN_HIGH)
+ new /obj/item/weapon/digestion_remains/skull/zorren(src,owner)
+ skull_amount--
+ if(SPECIES_NEVREAN)
+ new /obj/item/weapon/digestion_remains/skull/nevrean(src,owner)
+ skull_amount--
+ if(SPECIES_TESHARI)
+ new /obj/item/weapon/digestion_remains/skull/teshari(src,owner)
+ skull_amount--
+ if(SPECIES_VOX)
+ new /obj/item/weapon/digestion_remains/skull/vox(src,owner)
+ skull_amount--
+ if(SPECIES_XENOHYBRID)
+ new /obj/item/weapon/digestion_remains/skull/xenohybrid(src,owner)
+ skull_amount--
+ if(skull_amount && H.species.selects_bodytype) //We still haven't found correct skull...
+ if(H.species.base_species == SPECIES_HUMAN)
+ new /obj/item/weapon/digestion_remains/skull/unknown(src,owner)
+ else
+ new /obj/item/weapon/digestion_remains/skull/unknown/anthro(src,owner)
+ else if(skull_amount) //Something entirely different...
+ new /obj/item/weapon/digestion_remains/skull/unknown(src,owner)
+ else
+ return
+
+/obj/item/weapon/digestion_remains
+ name = "bone"
+ desc = "A bleached bone. It's very non-descript and its hard to tell what species or part of the body it came from."
+ icon = 'icons/obj/bones_vr.dmi'
+ icon_state = "generic"
+ force = 0
+ throwforce = 0
+ item_state = "bone"
+ w_class = ITEMSIZE_SMALL
+ var/pred_ckey
+ var/pred_name
+
+/obj/item/weapon/digestion_remains/New(var/newloc,var/mob/living/pred)
+ ..(newloc)
+ pred_ckey = pred.ckey
+ pred_name = pred.name
+
+/obj/item/weapon/digestion_remains/attack_self(mob/user)
+ if(user.a_intent == I_HURT)
+ to_chat(user,"As you squeeze the [name], it crumbles into dust and falls apart into nothing!")
+ qdel(src)
+
+/obj/item/weapon/digestion_remains/ribcage
+ name = "ribcage"
+ desc = "A bleached ribcage. It's very white and definitely has seen better times. Hard to tell what it belonged to."
+ icon_state = "ribcage"
+
+/obj/item/weapon/digestion_remains/skull
+ name = "skull"
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a human."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/tajaran
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a tajara."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/unathi
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to an unathi."
+ icon_state = "skull_unathi"
+
+/obj/item/weapon/digestion_remains/skull/skrell
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a skrell."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/vasilissan
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vasilissan."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/akula
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to an akula."
+ icon_state = "skull_unathi"
+
+/obj/item/weapon/digestion_remains/skull/rapala
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a rapala."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/vulpkanin
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vulpkanin."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/sergal
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a sergal."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/zorren
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a zorren."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/nevrean
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a nevrean."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/teshari
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a teshari."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/vox
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vox."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/unknown
+ desc = "A bleached skull. It looks very weakened. You can't quite tell what species it belonged to."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/unknown/anthro
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/xenohybrid
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to something with an elongated head."
+ icon_state = "skull_xenohybrid"
\ No newline at end of file
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 8d3cb48d24..53b7a4d9ed 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -1,6 +1,7 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = 1 // Can the mob be digested inside a belly?
+ var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise?
var/allowmobvore = 1 // Will simplemobs attempt to eat the mob?
var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/obj/belly/vore_selected // Default to no vore capability.
@@ -195,6 +196,7 @@
var/datum/vore_preferences/P = client.prefs_vr
P.digestable = src.digestable
+ P.digest_leave_remains = src.digest_leave_remains
P.allowmobvore = src.allowmobvore
P.vore_taste = src.vore_taste
P.can_be_drop_prey = src.can_be_drop_prey
@@ -220,6 +222,7 @@
var/datum/vore_preferences/P = client.prefs_vr
digestable = P.digestable
+ digest_leave_remains = P.digest_leave_remains
allowmobvore = P.allowmobvore
vore_taste = P.vore_taste
can_be_drop_prey = P.can_be_drop_prey
@@ -330,6 +333,7 @@
if(!confirm == "Okay" || loc != B)
return
//Actual escaping
+ absorbed = 0 //Make sure we're not absorbed
forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave.
for(var/mob/living/simple_mob/SA in range(10))
SA.prey_excludes[src] = world.time
@@ -664,6 +668,7 @@
CRASH("display_voreprefs() was called without an associated user.")
var/dispvoreprefs = "[src]'s vore preferences
"
dispvoreprefs += "Digestable: [digestable ? "Enabled" : "Disabled"]
"
+ dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Drop-nom prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Drop-nom pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
"
diff --git a/code/modules/vore/eating/transforming_vr.dm b/code/modules/vore/eating/transforming_vr.dm
index a3ad00ab7a..2f261980ec 100644
--- a/code/modules/vore/eating/transforming_vr.dm
+++ b/code/modules/vore/eating/transforming_vr.dm
@@ -210,42 +210,41 @@
return 1
return 0
-/obj/belly/proc/change_species(var/mob/living/carbon/human/M, message=0)
+/obj/belly/proc/change_species(var/mob/living/carbon/human/M, message=0, color_action = 0) //color_action: 0 for default species, 1 to preserve, 2 to transfer from pred
var/mob/living/carbon/human/O = owner
if(!istype(M) || !istype(O))
return
- if (M.species == "Promethean" && O.species != "Promethean") //If the person was a promethean before TF, remove all their verbs!
- M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_shape
- M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_colour
- M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_hair
- M.verbs -= /mob/living/carbon/human/proc/shapeshifter_select_gender
- M.verbs -= /mob/living/carbon/human/proc/regenerate
- M.verbs -= /mob/living/proc/set_size
+ M.verbs -= M.species.inherent_verbs //Take away their unique stuff
- M.species = O.species
+ var/list/backup_implants = list()
+ for(var/obj/item/organ/I in M.organs)
+ for(var/obj/item/weapon/implant/backup/BI in I.contents)
+ backup_implants += BI
+ if(backup_implants.len)
+ for(var/obj/item/weapon/implant/backup/BI in backup_implants)
+ BI.forceMove(src)
+ if(color_action == 1)
+ M.set_species(O.species.name,0,1,M)
+ else if(color_action == 2)
+ M.set_species(O.species.name,0,1,O)
+ else
+ M.set_species(O.species.name)
M.custom_species = O.custom_species
- M.species.create_organs(M) //This is the only way to make it so Unathi TF doesn't result in people dying from organ rejection.
- for(var/obj/item/organ/I in M.organs) //This prevents organ rejection
- I.species = O.species
- for(var/obj/item/organ/I in M.internal_organs) //This prevents organ rejection
- I.species = O.species
- for(var/obj/item/organ/external/Z in M.organs)//Just in case.
- Z.sync_colour_to_human(M)
- M.fixblood()
+
M.update_icons_body()
M.update_tail_showing()
+
+ if(backup_implants.len)
+ var/obj/item/organ/external/torso = M.get_organ(BP_TORSO)
+ for(var/obj/item/weapon/implant/backup/BI in backup_implants)
+ BI.forceMove(torso)
+ torso.implants += BI
+
+
if(message)
to_chat(M, "You lose sensation of your body, feeling only the warmth of everything around you... ")
to_chat(O, "Your body shifts as you make dramatic changes to your captive's body.")
- if (M.species == "Promethean") //Did they get TF'd into a promethean?
- M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_shape
- M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_colour
- M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_hair
- M.verbs += /mob/living/carbon/human/proc/shapeshifter_select_gender
- M.verbs += /mob/living/carbon/human/proc/regenerate
- M.verbs += /mob/living/proc/set_size
- M.shapeshifter_select_shape()
/obj/belly/proc/put_in_egg(var/atom/movable/M, message=0)
var/mob/living/carbon/human/O = owner
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index a3b5fec4a5..f89462f23c 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -42,6 +42,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
/datum/vore_preferences
//Actual preferences
var/digestable = TRUE
+ var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
@@ -92,9 +93,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
return 0 //Need to know what character to load!
slot = client.prefs.default_slot
-
+
load_path(client_ckey,slot)
-
+
if(!path) return 0 //Path couldn't be set?
if(!fexists(path)) //Never saved before
save_vore() //Make the file first
@@ -108,6 +109,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
json_from_file = patch_version(json_from_file,version)
digestable = json_from_file["digestable"]
+ digest_leave_remains = json_from_file["digest_leave_remains"]
allowmobvore = json_from_file["allowmobvore"]
vore_taste = json_from_file["vore_taste"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
@@ -117,6 +119,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//Quick sanitize
if(isnull(digestable))
digestable = TRUE
+ if(isnull(digest_leave_remains))
+ digest_leave_remains = FALSE
if(isnull(allowmobvore))
allowmobvore = TRUE
if(isnull(can_be_drop_prey))
@@ -130,11 +134,12 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
/datum/vore_preferences/proc/save_vore()
if(!path) return 0
-
+
var/version = 1 //For "good times" use in the future
var/list/settings_list = list(
"version" = version,
"digestable" = digestable,
+ "digest_leave_remains" = digest_leave_remains,
"allowmobvore" = allowmobvore,
"vore_taste" = vore_taste,
"can_be_drop_prey" = can_be_drop_prey,
@@ -147,7 +152,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
if(!json_to_file)
log_debug("Saving: [path] failed jsonencode")
return 0
-
+
//Write it out
#ifdef RUST_G
call(RUST_G, "file_write")(json_to_file, path)
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 3e376b883f..c5e4391ef7 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -298,6 +298,12 @@
if(0)
dat += "Toggle Digestable"
+ switch(user.digest_leave_remains)
+ if(1)
+ dat += "Toggle Leaving Remains"
+ if(0)
+ dat += "Toggle Leaving Remains"
+
switch(user.allowmobvore)
if(1)
dat += "Toggle Mob Vore"
@@ -837,6 +843,19 @@
if(user.client.prefs_vr)
user.client.prefs_vr.digestable = user.digestable
+ if(href_list["toggledlm"])
+ var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Allow Post-digestion Remains")
+ user.digest_leave_remains = TRUE
+ if("Disallow Post-digestion Remains")
+ user.digest_leave_remains = FALSE
+
+ if(user.client.prefs_vr)
+ user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains
+
if(href_list["togglemv"])
var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation")
switch(choice)
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index ac50c4d7d1..b2c001ed3f 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -1707,10 +1707,11 @@
return
var/obj/item/weapon/implant/reagent_generator/evian/rimplant
- for(var/I in contents)
- if(istype(I, /obj/item/weapon/implant/reagent_generator))
- rimplant = I
- break
+ for(var/obj/item/organ/external/E in organs)
+ for(var/obj/item/weapon/implant/I in E.implants)
+ if(istype(I, /obj/item/weapon/implant/reagent_generator))
+ rimplant = I
+ break
if (rimplant)
if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
to_chat(src, "[pick(rimplant.empty_message)]")
diff --git a/code/modules/vore/fluffstuff/guns/bsharpoon.dm b/code/modules/vore/fluffstuff/guns/bsharpoon.dm
index 259ef32b52..f573cf017a 100644
--- a/code/modules/vore/fluffstuff/guns/bsharpoon.dm
+++ b/code/modules/vore/fluffstuff/guns/bsharpoon.dm
@@ -33,13 +33,16 @@
playsound(user, 'sound/weapons/wave.ogg', 60, 1)
return
var/turf/T = get_turf(A)
- if(!T || T.check_density())
+ if(!T || (T.check_density() && mode == 1))
to_chat(user,"That's a little too solid to harpoon into!")
return
var/turf/ownturf = get_turf(src)
if(ownturf.z != T.z || get_dist(T,ownturf) > world.view)
to_chat(user, "The target is out of range!")
return
+ if(get_area(A).flags & BLUE_SHIELDED)
+ to_chat(user, "The target area protected by bluespace shielding!")
+ return
last_fire = current_fire
playsound(user, 'sound/weapons/wave.ogg', 60, 1)
diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index 1a1fe508c8..c92121da91 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -155,21 +155,6 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
* @return false if normal code should continue, true to prevent normal code.
*/
/mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob)
- //Make sure we would be able to step there in the first place:
- var/can_move_into = 1
- if(tmob.loc.density)
- can_move_into = 0
- if(can_move_into)
- for(var/atom/movable/A in tmob.loc)
- if(A == src)
- continue
- if(!A.CanPass(src, tmob.loc))
- can_move_into = 0
- if(!can_move_into) break
-
- if(!can_move_into)
- return FALSE
-
//Both small! Go ahead and go.
if(src.get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY)
return TRUE
@@ -212,21 +197,6 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
/mob/living/proc/handle_micro_bump_other(var/mob/living/tmob)
ASSERT(istype(tmob))
- //Can we even step on their tile normally?
- var/can_move_into = 1
- if(tmob.loc.density)
- can_move_into = 0
- if(can_move_into)
- for(var/atom/movable/A in tmob.loc)
- if(A == src)
- continue
- if(!A.CanPass(src, tmob.loc))
- can_move_into = 0
- if(!can_move_into) break
-
- if(!can_move_into)
- return FALSE
-
//If they're flying, don't do any special interactions.
if(ishuman(src))
var/mob/living/carbon/human/P = src
diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm
index 2db3107c01..35179aca14 100644
--- a/code/modules/xenoarcheaology/artifacts/artifact.dm
+++ b/code/modules/xenoarcheaology/artifacts/artifact.dm
@@ -21,7 +21,7 @@
if(prob(75))
secondary_effect.ToggleActivate(0)
- icon_num = rand(0, 11)
+ icon_num = rand(0, 14)
icon_state = "ano[icon_num]0"
if(icon_num == 7 || icon_num == 8)
@@ -47,6 +47,11 @@
desc = "A strange alien device."
if(prob(25))
my_effect.trigger = pick(TRIGGER_WATER, TRIGGER_ACID, TRIGGER_VOLATILE, TRIGGER_TOXIN)
+ else if(icon_num == 12 || icon_num == 14)
+ name = "intricately carved statue"
+ desc = "A strange statue."
+ if(prob(60))
+ my_effect.trigger = pick(TRIGGER_TOUCH, TRIGGER_HEAT, TRIGGER_COLD, TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO)
/obj/machinery/artifact/proc/choose_effect()
var/effect_type = input(usr, "What type do you want?", "Effect Type") as null|anything in typesof(/datum/artifact_effect) - /datum/artifact_effect
diff --git a/code/modules/xenoarcheaology/finds/eguns.dm b/code/modules/xenoarcheaology/finds/eguns.dm
index dc07d9a88d..80aa45ec17 100644
--- a/code/modules/xenoarcheaology/finds/eguns.dm
+++ b/code/modules/xenoarcheaology/finds/eguns.dm
@@ -1,25 +1,30 @@
//snowflake guns for xenoarch because you can't override the update_icon() proc inside the giant mess that is find creation
/obj/item/weapon/gun/energy/laser/xenoarch
icon = 'icons/obj/xenoarchaeology.dmi'
- update_icon()
+
+/obj/item/weapon/gun/energy/laser/xenoarch/update_icon()
return
/obj/item/weapon/gun/energy/laser/practice/xenoarch
icon = 'icons/obj/xenoarchaeology.dmi'
- update_icon()
+
+/obj/item/weapon/gun/energy/laser/practice/xenoarch/update_icon()
return
/obj/item/weapon/gun/energy/laser/practice/xenoarch
icon = 'icons/obj/xenoarchaeology.dmi'
- update_icon()
+
+/obj/item/weapon/gun/energy/laser/practice/xenoarch/update_icon()
return
/obj/item/weapon/gun/energy/xray/xenoarch
icon = 'icons/obj/xenoarchaeology.dmi'
- update_icon()
+
+/obj/item/weapon/gun/energy/xray/xenoarch/update_icon()
return
/obj/item/weapon/gun/energy/captain/xenoarch
icon = 'icons/obj/xenoarchaeology.dmi'
- update_icon()
+
+/obj/item/weapon/gun/energy/captain/xenoarch/update_icon()
return
diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm
index 39cf1776e6..37655b098f 100644
--- a/code/modules/xenoarcheaology/finds/find_spawning.dm
+++ b/code/modules/xenoarcheaology/finds/find_spawning.dm
@@ -36,21 +36,25 @@
item_type = "bowl"
if(prob(33))
new_item = new /obj/item/weapon/reagent_containers/glass/replenishing(src.loc)
+ new_item.origin_tech[TECH_ARCANE] = 1
else
new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = "bowl"
apply_image_decorations = 1
+ if(prob(40))
+ new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
if(prob(20))
additional_desc = "There appear to be [pick("dark","faintly glowing","pungent","bright")] [pick("red","purple","green","blue")] stains inside."
if(2)
item_type = "urn"
if(prob(33))
new_item = new /obj/item/weapon/reagent_containers/glass/replenishing(src.loc)
+ new_item.origin_tech[TECH_ARCANE] = 1
else
new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
- new_item.icon_state = "urn"
+ new_item.icon_state = "urn[rand(1,2)]"
apply_image_decorations = 1
if(prob(20))
additional_desc = "It [pick("whispers faintly","makes a quiet roaring sound","whistles softly","thrums quietly","throbs")] if you put it to your ear."
@@ -62,6 +66,8 @@
new_item = new /obj/item/weapon/material/knife(src.loc)
else
new_item = new /obj/item/weapon/material/kitchen/utensil/spoon(src.loc)
+ if(prob(60))
+ new_item.origin_tech[TECH_ARCANE] = 1
additional_desc = "[pick("It's like no [item_type] you've ever seen before",\
"It's a mystery how anyone is supposed to eat with this",\
"You wonder what the creator's mouth was shaped like")]."
@@ -69,12 +75,13 @@
name = "statuette"
icon = 'icons/obj/xenoarchaeology.dmi'
item_type = "statuette"
- icon_state = "statuette"
+ icon_state = "statuette[rand(1,3)]"
additional_desc = "It depicts a [pick("small","ferocious","wild","pleasing","hulking")] \
[pick("alien figure","rodent-like creature","reptilian alien","primate","unidentifiable object")] \
[pick("performing unspeakable acts","posing heroically","in a fetal position","cheering","sobbing","making a plaintive gesture","making a rude gesture")]."
if(prob(25))
new_item = new /obj/item/weapon/vampiric(src.loc)
+ new_item.origin_tech[TECH_ARCANE] = 1
if(5)
name = "instrument"
icon = 'icons/obj/xenoarchaeology.dmi'
@@ -93,8 +100,8 @@
"It looks wickedly jagged",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges")]."
if(7)
- //assuming there are 10 types of coins
- var/chance = 10
+ //assuming there are 12 types of coins
+ var/chance = 8
for(var/type in typesof(/obj/item/weapon/coin))
if(prob(chance))
new_item = new type(src.loc)
@@ -113,6 +120,8 @@
item_type = "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]"
apply_prefix = 0
new_item = new /obj/item/weapon/beartrap(src.loc)
+ if(prob(40))
+ new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
additional_desc = "[pick("It looks like it could take a limb off",\
"Could be some kind of animal trap",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along part of it")]."
@@ -132,6 +141,7 @@
var/storage_amount = 2**(new_box.max_w_class-1)
new_box.max_storage_space = rand(storage_amount, storage_amount * 10)
if(prob(30))
+ new_item.origin_tech[TECH_ARCANE] = 1
apply_image_decorations = 1
if(12)
item_type = "[pick("cylinder","tank","chamber")]"
@@ -151,6 +161,9 @@
new_item = new /obj/item/weapon/tool/crowbar(src.loc)
else
new_item = new /obj/item/weapon/tool/screwdriver(src.loc)
+ if(prob(40))
+ new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
+ apply_image_decorations = 1
additional_desc = "[pick("It doesn't look safe.",\
"You wonder what it was used for",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains on it")]."
@@ -177,6 +190,9 @@
else
new_item = new /obj/item/weapon/pen/reagent/sleepy(src.loc)
if(prob(30))
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ icon_state = "pen1"
+ new_item.origin_tech[TECH_ARCANE] = 1
apply_image_decorations = 1
if(16)
apply_prefix = 0
@@ -201,6 +217,7 @@
new_item = new /obj/item/device/soulstone(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = icon_state
+ new_item.origin_tech[TECH_ARCANE] = 2
if(17)
//cultblade
apply_prefix = 0
@@ -218,6 +235,9 @@
new_item = new /obj/item/weapon/material/sword(src.loc)
new_item.force = 10
item_type = new_item.name
+ if(prob(30))
+ new_item.icon = 'icons/obj/xenoarchaeology.dmi'
+ new_item.icon_state = "blade1"
if(20)
//arcane clothing
apply_prefix = 0
@@ -228,12 +248,14 @@
var/new_type = pick(possible_spawns)
new_item = new new_type(src.loc)
+ new_item.origin_tech[TECH_ARCANE] = 1
if(21)
//soulstone
apply_prefix = 0
new_item = new /obj/item/device/soulstone(src.loc)
item_type = new_item.name
apply_material_decorations = 0
+ new_item.origin_tech[TECH_ARCANE] = 2
if(22)
if(prob(50))
new_item = new /obj/item/weapon/material/shard(src.loc)
@@ -281,8 +303,10 @@
new_gun.power_supply.rigged = 1
if(prob(10))
new_gun.power_supply.maxcharge = 0
+ new_gun.origin_tech[TECH_ARCANE] = rand(0, 1)
if(prob(15))
new_gun.power_supply.charge = rand(0, new_gun.power_supply.maxcharge)
+ new_gun.origin_tech[TECH_ARCANE] = 1
else
new_gun.power_supply.charge = 0
@@ -407,8 +431,11 @@
//gas mask
if(prob(25))
new_item = new /obj/item/clothing/mask/gas/poltergeist(src.loc)
+ new_item.origin_tech[TECH_ARCANE] = 1
else
new_item = new /obj/item/clothing/mask/gas(src.loc)
+ if(prob(40))
+ new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
if(36)
// Alien stuff.
apply_prefix = FALSE
@@ -438,11 +465,87 @@
var/new_type = pick(alien_stuff)
new_item = new new_type(src.loc)
+ new_item.origin_tech[TECH_ARCANE] = 2
+ new_item.origin_tech[TECH_PRECURSOR] = 1
item_type = new_item.name
+ if(37)
+ // Alien boats.
+ apply_prefix = FALSE
+ var/new_boat_mat = pickweight(
+ MAT_WOOD = 100,
+ MAT_SIFWOOD = 200,
+ DEFAULT_WALL_MATERIAL = 60,
+ MAT_URANIUM = 14,
+ MAT_MARBLE = 16,
+ MAT_GOLD = 20,
+ MAT_SILVER = 24,
+ MAT_PLASTEEL = 10,
+ MAT_TITANIUM = 6,
+ MAT_IRON = 30,
+ MAT_PHORON = 4,
+ MAT_VERDANTIUM = 2,
+ MAT_DIAMOND = 4,
+ MAT_DURASTEEL = 2,
+ MAT_MORPHIUM = 2,
+ MAT_SUPERMATTER = 1
+ )
+ var/list/alien_stuff = list(
+ /obj/vehicle/boat,
+ /obj/vehicle/boat/dragon
+ )
+ if(prob(30))
+ new /obj/item/weapon/oar(src.loc, new_boat_mat)
+ var/new_type = pick(alien_stuff)
+ new_item = new new_type(src.loc, new_boat_mat)
+ item_type = new_item.name
+
+ if(38)
+ // Imperion circuit.
+ apply_prefix = FALSE
+ apply_image_decorations = FALSE
+ var/possible_circuits = subtypesof(/obj/item/weapon/circuitboard/mecha/imperion)
+ var/new_type = pick(possible_circuits)
+ new_item = new new_type(src.loc)
+ name = new_item.name
+ desc = new_item.desc
+ item_type = new_item.name
+
+ if(istype(new_item, /obj/item/weapon/material))
+ var/new_item_mat = pickweight(
+ DEFAULT_WALL_MATERIAL = 80,
+ MAT_WOOD = 20,
+ MAT_SIFWOOD = 40,
+ MAT_URANIUM = 14,
+ MAT_MARBLE = 16,
+ MAT_GOLD = 20,
+ MAT_SILVER = 24,
+ MAT_PLASTEEL = 10,
+ MAT_TITANIUM = 6,
+ MAT_IRON = 30,
+ MAT_PHORON = 4,
+ MAT_VERDANTIUM = 2,
+ MAT_DIAMOND = 4,
+ MAT_DURASTEEL = 2,
+ MAT_MORPHIUM = 2,
+ MAT_SUPERMATTER = 1
+ )
+ var/obj/item/weapon/material/MW = new_item
+ MW.applies_material_colour = TRUE
+ MW.set_material(new_item_mat)
+ if(istype(MW, /obj/item/weapon/material/twohanded))
+ var/obj/item/weapon/material/twohanded/TH = MW
+ TH.force_unwielded *= 0.7
+ TH.force_wielded *= 0.5
+ else
+ MW.force *= 0.3
+
var/decorations = ""
if(apply_material_decorations)
source_material = pick("cordite","quadrinium",DEFAULT_WALL_MATERIAL,"titanium","aluminium","ferritic-alloy","plasteel","duranium")
+ if(istype(new_item, /obj/item/weapon/material))
+ var/obj/item/weapon/material/MW = new_item
+ source_material = MW.material.display_name
desc = "A [material_descriptor ? "[material_descriptor] " : ""][item_type] made of [source_material], all craftsmanship is of [pick("the lowest","low","average","high","the highest")] quality."
var/list/descriptors = list()
@@ -499,8 +602,12 @@
if(talkative)
new_item.talking_atom = new(new_item)
+ new_item.origin_tech[TECH_ARCANE] = 1
+ new_item.origin_tech[TECH_PRECURSOR] = 1
qdel(src)
else if(talkative)
src.talking_atom = new(src)
+ new_item.origin_tech[TECH_ARCANE] = 1
+ new_item.origin_tech[TECH_PRECURSOR] = 1
diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm
index 003a5639da..b97a34e48f 100644
--- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm
+++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm
@@ -150,7 +150,7 @@
data["rad_shield_on"] = rad_shield
// update the ui if it exists, returns null if no ui is passed/found
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/unit_tests/research_tests.dm b/code/unit_tests/research_tests.dm
index 93bf79a0da..24d307c5e6 100644
--- a/code/unit_tests/research_tests.dm
+++ b/code/unit_tests/research_tests.dm
@@ -60,7 +60,7 @@
number_of_issues++
for(var/reagent_name in design.chemicals)
- if(!(reagent_name in chemical_reagents_list))
+ if(!(reagent_name in SSchemistry.chemical_reagents))
log_unit_test("The entry [design_type] has invalid chemical type [reagent_name]")
number_of_issues++
diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt
index 3db20fb9c1..4c69df3c3a 100644
--- a/config/alienwhitelist.txt
+++ b/config/alienwhitelist.txt
@@ -21,6 +21,8 @@ natje - Xenochimera
oreganovulgaris - Xenochimera
paradoxspace - Xenochimera
rapidvalj - Vox
+rapidvalj - Common Skrellian
+rapidvalj - High Skrellian
rikaru19xjenkins - Xenomorph Hybrid
rikaru19xjenkins - Xenochimera
rixunie - Diona
diff --git a/html/changelogs/Woodrat - mapfixes.yml b/html/changelogs/Woodrat - mapfixes.yml
new file mode 100644
index 0000000000..5371940049
--- /dev/null
+++ b/html/changelogs/Woodrat - mapfixes.yml
@@ -0,0 +1,5 @@
+author: Woodrat
+delete-after: True
+changes:
+ - tweak: "Arrivals dock should not stay locked shut"
+ - bugfix: "Two windoors in xenobio stationside lacking access requirements"
\ No newline at end of file
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index ca5c8b87a5..c681373734 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/icons/mob/back_vr.dmi b/icons/mob/back_vr.dmi
index 84aec25ab3..7c20e2aa16 100644
Binary files a/icons/mob/back_vr.dmi and b/icons/mob/back_vr.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index 6f23560d10..87cf6172c1 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi
index e52265d69b..d776a68b67 100644
Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ
diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi
index 790d93eca6..dbef5acf99 100644
Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ
diff --git a/icons/mob/items/righthand_melee.dmi b/icons/mob/items/righthand_melee.dmi
index 8c1068a033..5cfed3c119 100644
Binary files a/icons/mob/items/righthand_melee.dmi and b/icons/mob/items/righthand_melee.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index 25935ccfbc..ed5fd93145 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 3b1cc47da6..20c744e0a0 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ
diff --git a/icons/obj/bones_vr.dmi b/icons/obj/bones_vr.dmi
new file mode 100644
index 0000000000..ad384a6907
Binary files /dev/null and b/icons/obj/bones_vr.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index c198543b05..4c3546ef78 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index d33437164e..c9cea71b82 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/machines/particle_smasher.dmi b/icons/obj/machines/particle_smasher.dmi
new file mode 100644
index 0000000000..13b3ceaad0
Binary files /dev/null and b/icons/obj/machines/particle_smasher.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 96c3014c42..43683f769f 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi
index f4b3b875a4..2d51ed3634 100644
Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ
diff --git a/icons/obj/stationobjs_vr.dmi b/icons/obj/stationobjs_vr.dmi
index 758a46b706..799f106661 100644
Binary files a/icons/obj/stationobjs_vr.dmi and b/icons/obj/stationobjs_vr.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 2325f50fff..afabe6ebfc 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index a7d05818bf..f1a46abc1d 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 8adc02e3b5..3abf08997f 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi
index e0baa63cff..e484762679 100644
Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index f4311ba8e7..b2c92d1d8b 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -317357,7 +317357,7 @@ aaa
"aSe" = (/turf/simulated/floor/airless,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard)
"aSf" = (/turf/space,/area/skipjack_station/firstdeck)
"aSg" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/station)
-"aSh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window/brigdoor/southleft{name = "Containment Pen"; req_access = newlist()},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/techmaint,/area/rnd/xenobiology)
+"aSh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/tiled/techmaint,/area/rnd/xenobiology)
"aSi" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/closet/walllocker/emerglocker{pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station)
"aSj" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 0; pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station)
"aSk" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_hatch"; locked = 1; name = "Escape Pod Hatch 3"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station)
@@ -324383,10 +324383,10 @@ aaa
"dxk" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_starboard_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dxl" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_starboard_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dxm" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dxn" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dxn" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
"dxo" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station)
-"dxp" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dxq" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dxp" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
+"dxq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
"dxr" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_north_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dxs" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_north_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dxt" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "dock3_north_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "dock3_north_pump"; tag_chamber_sensor = "dock3_north_sensor"; tag_exterior_door = "dock3_north_outer"; tag_interior_door = "dock3_north_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
@@ -324404,10 +324404,10 @@ aaa
"dxF" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dxG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2)
"dxH" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dxI" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dxJ" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dxK" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dxL" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dxI" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
+"dxJ" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
+"dxK" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
+"dxL" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
"dxM" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock3_north_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_north_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dxN" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_north_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock3_north_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dxO" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_north_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
@@ -324445,9 +324445,9 @@ aaa
"dyu" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Dock One Internal Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dyv" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "response_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dyw" = (/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dyx" = (/obj/structure/closet/emcloset,/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dyx" = (/obj/structure/closet/emcloset,/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dyy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2)
-"dyz" = (/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dyz" = (/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/obj/structure/closet/emcloset,/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dyA" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dyB" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle2_dock_airlocksc"; name = "interior access button"; pixel_x = 28; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dyC" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "s2s_dock_inner"; locked = 1; name = "Dock Three Internal Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
@@ -324484,10 +324484,10 @@ aaa
"dzh" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dzi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2)
"dzj" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzk" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
-"dzl" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_north_airlock"; master_tag = "arrivals_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_north_mech"; tag_airpump = "arrivals_dock_north_pump"; tag_chamber_sensor = "arrivals_dock_north_sensor"; tag_exterior_door = "arrivals_dock_north_outer"; tag_interior_door = "arrivals_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzm" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzn" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dzk" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_north_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_north_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
+"dzl" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
+"dzm" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
+"dzn" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "arrivals_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
"dzo" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_south_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock3_south_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dzp" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock3_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dzq" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
@@ -324503,10 +324503,10 @@ aaa
"dzA" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_starboard_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dzB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"},/turf/simulated/floor/tiled/monotile,/area/hallway/secondary/entry/D2)
"dzC" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzD" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzE" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_south_airlock"; master_tag = "arrivals_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_south_mech"; tag_airpump = "arrivals_dock_south_pump"; tag_chamber_sensor = "arrivals_dock_south_sensor"; tag_exterior_door = "arrivals_dock_south_outer"; tag_interior_door = "arrivals_dock_south_inner"; tag_shuttle_mech_sensor = "arrivals_dock_south_mech"},/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dzG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dzD" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "arrivals_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
+"dzE" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
+"dzF" = (/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "arrivals_dock_south_airlock"; master_tag = "arrivals_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "arrivals_dock_south_mech"; tag_airpump = "arrivals_dock_south_pump"; tag_chamber_sensor = "arrivals_dock_south_sensor"; tag_exterior_door = "arrivals_dock_south_outer"; tag_interior_door = "arrivals_dock_south_inner"; tag_shuttle_mech_sensor = "arrivals_dock_south_mech"},/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
+"dzG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "arrivals_dock_south_pump"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2/arrivals)
"dzH" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock3_south_outer"; locked = 1; name = "External Airlock Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
"dzI" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dzJ" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "dock3_south_airlock"; pixel_x = 0; pixel_y = -30; req_one_access = list(13); tag_airpump = "dock3_south_pump"; tag_chamber_sensor = "dock3_south_sensor"; tag_exterior_door = "dock3_south_outer"; tag_interior_door = "dock3_south_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "dock3_south_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
@@ -324535,7 +324535,7 @@ aaa
"dAg" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dAh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
"dAi" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
-"dAj" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
+"dAj" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/item/weapon/tool/crowbar/red,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"dAk" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dAl" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "nuke_shuttle_dock_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dAm" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3)
@@ -324671,7 +324671,7 @@ aaa
"dCM" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCN" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/greengrid,/area/ai)
-"dCP" = (/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_inner"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2)
+"dCP" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "arrivals_dock_south_outer"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
"dCQ" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCR" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled/techfloor,/area/ai)
"dCS" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard)
@@ -326012,7 +326012,7 @@ aaa
"ecC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/meter,/obj/random/mob/mouse,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
"ecD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/meter,/obj/random/mob/mouse,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard)
"ecE" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/bridge/meeting_room)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -326474,15 +326474,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTdsTaaaaaaaaadsTdsTdsTaaaaaaaaaaaadvjdwsdwwdvjaaaaaaaafaaadvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaafaaaaaadvkdwxdvwdvxdvkaaaaaaaafaaadwldwldwldwldwldwldwlaaaaaaaaaaafaaaaaadvodwydwvdvoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTaaaaaaaaaaaaaaadsTdsTaaaaaaaaaaaaduUdwzdwAduUaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaaduYdwBdwCdwDduYaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvedwEdwFdveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaadwGduUduUduUduUdwHdwIdwhdwJdwKdwLdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdwMdwNdwOdwPdwQdwRdwSdvkdVjdVjdVkdwldwldwldwldwldwldwldwldwlaaaaaadVndVldVmdwXdwYdwZdvedvedvedvedxaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdxbdxcdxddxedxfdxgdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxhdxidxjdxkdxldvwdxmdxndzldxpdxqdwldwldwldwldwldwldwldwldwlaaaaaadxrdxsdxtdxudxvdxwdveaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdxydxddxzdxAdxBdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxCdxDdxEdxkdxFdxGdxHdxIdxJdxKdxLdwldwldwldwldwldwldwldwldwlaaaaaadxMdxNdxOdxudxPdwvdvoaaaaaaaaaaaadxxdxxdxxaaaaaaaaadxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdxbdxcdxddxedxfdxgdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxhdxidxjdxkdxldvwdxmdxndxpdxqdxIdwldwldwldwldwldwldwldwldwlaaaaaadxrdxsdxtdxudxvdxwdveaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaadxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadufdufdufdufdufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdxydxddxzdxAdxBdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxCdxDdxEdxkdxFdxGdxHdxJdxKdxLdzkdwldwldwldwldwldwldwldwldwlaaaaaadxMdxNdxOdxudxPdwvdvoaaaaaaaaaaaadxxdxxdxxaaaaaaaaadxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQaaaaaaaaaaaadvjdvjdxRdxSdwhdxTdxUdvDdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxVdxWdxXdwPdxYdxZdyadvkdvkdVjdVjdwldwldwldwldwldwldwldwldwlaaaaaadvNdVodycdyddyedyfdvodvoaaaaaaaaadxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdygdyhdVpdwhdyjdwjdwkdykduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyldvxdvwdvxdymduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyndwmdwndyodwpdVqdyqdvNdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdyrdysdytdyudyvdvUdwtdywduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyxdvxdyydvxdyzduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyAdwudvZdyBdyCdyDdyEdyFdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdvDdvDdvDdvjdyGdyHdyIdyJduUaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaduYdyKdvxdyLdyMdyNduYaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaadvedyOdyPdyQdyRdvodvNdvNdvOdxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxQdxQdxQdxQdxQdxQdxQdxQdxQdxQdxQaaaaaaaaaaaadvjdvjdySdyTdwhdwJdwKdvDdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdxVdwNdwOdwPdyUdyVdyWdvkdvkdVjdVjdwldwldwldwldwldwldwldwldwlaaaaaadvNdVldVmdwXdyXdyYdvodvoaaaaaaaaadxxdxxdxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdyZdzadzbdzcdzddvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzedzfdzgdzhdxFdzidzjdzkdzDdzmdzndwldwldwldwldwldwldwldwldwlaaaaaadzodzpdzqdzrdzsdwvdvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdwsdztdzadzudzvdzwdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzxdzydzzdzhdzAdzBdzCdCPdzEdzFdzGdwldwldwldwldwldwldwldwldwlaaaaaadzHdzIdzJdzrdzKdwvdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdwsdyZdzadzbdzcdzddvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzedzfdzgdzhdxFdzidzjdzldzmdzndzDdwldwldwldwldwldwldwldwldwlaaaaaadzodzpdzqdzrdzsdwvdvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdwsdztdzadzudzvdzwdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdzxdzydzzdzhdzAdzBdzCdzEdzFdzGdCPdwldwldwldwldwldwldwldwldwlaaaaaadzHdzIdzJdzrdzKdwvdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaadwGduUduUduUduUdzLdzMdwhdxTdxUdwLdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdwMdxWdxXdwPdzNdyVdzOdvkdVjdVjdVkdwldwldwldwldwldwldwldwldwlaaaaaadVndVodVrdwXdzPdzQdvedvedvedvedxaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduUdzRdzSduUaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaaduYdzTdzUdzVduYaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvedzWdzXdveaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvjdzYdzZdvjaaaaaaaaadvHdvHdvHdvHdvHdvHdvHdvHdvHdvHdvHaaaaaaaaadvudAadAbdvxdvuaaaaaaaaadwldwldwldwldwldwldwldwldwlaaaaaaaaaaaaaaadvodAcdAddvoaaaaaaaaaaaaaaadxxdxxdxxdxxdxxdxxdxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -326786,5 +326786,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
dUOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+<<<<<<< HEAD
>>>>>>> 6a2cd30... Replaces AI-controlled Maint Drones with AI-controlled Borg Shells (#6025)
+=======
+>>>>>>> ee9ecc1... Merge pull request #6064 from Woodratt/20190904_arrivalspower
diff --git a/maps/submaps/surface_submaps/plains/Oldhouse.dmm b/maps/submaps/surface_submaps/plains/Oldhouse.dmm
index 2c5d7537a7..3047b95ab3 100644
--- a/maps/submaps/surface_submaps/plains/Oldhouse.dmm
+++ b/maps/submaps/surface_submaps/plains/Oldhouse.dmm
@@ -37,7 +37,7 @@
"K" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/submap/Oldhouse)
"L" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/wood,/area/submap/Oldhouse)
"M" = (/obj/structure/frame,/turf/simulated/floor/wood,/area/submap/Oldhouse)
-"N" = (/mob/living/simple_mob/animal/giant_spider{attack_armor_pen = 100; attacktext = list("lightly bonked"); desc = "Furry and brown, this spider is so goddamn fat you're surprised it even moves around."; faction = "neutral"; health = 400; melee_damage_lower = 1; melee_damage_upper = 3; melee_miss_chance = 30; move_speed = 5; name = "Mr. Tuddly"},/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
+"N" = (/mob/living/simple_mob/animal/giant_spider{attack_armor_pen = 100; attacktext = list("lightly bonked"); desc = "Furry and brown, this spider is so goddamn fat you're surprised it even moves around."; faction = "neutral"; health = 400; melee_damage_lower = 1; melee_damage_upper = 3; melee_miss_chance = 30; movement_cooldown = 8; name = "Mr. Tuddly"},/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
"O" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
"P" = (/obj/item/weapon/circuitboard/papershredder,/turf/simulated/floor/wood,/area/submap/Oldhouse)
"Q" = (/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers,/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers,/turf/simulated/floor/carpet/turcarpet,/area/submap/Oldhouse)
diff --git a/maps/submaps/surface_submaps/plains/Oldhouse_vr.dmm b/maps/submaps/surface_submaps/plains/Oldhouse_vr.dmm
index 4b748edaf6..07b8686996 100644
--- a/maps/submaps/surface_submaps/plains/Oldhouse_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/Oldhouse_vr.dmm
@@ -179,7 +179,7 @@
/turf/simulated/floor/wood,
/area/submap/Oldhouse)
"aN" = (
-/mob/living/simple_animal/hostile/giant_spider{
+/mob/living/simple_mob/animal/giant_spider{
attack_armor_pen = 100;
attacktext = list("lightly bonked");
desc = "Furry and brown, this spider is so goddamn fat you're surprised it even moves around.";
@@ -188,7 +188,7 @@
melee_damage_lower = 1;
melee_damage_upper = 3;
melee_miss_chance = 30;
- move_speed = 5;
+ movement_cooldown = 8;
name = "Mr. Tuddly"
},
/turf/simulated/floor/carpet/turcarpet,
diff --git a/maps/submaps/surface_submaps/plains/RationCache_vr.dmm b/maps/submaps/surface_submaps/plains/RationCache_vr.dmm
index 1437cbdcc1..c11cc2d79f 100644
--- a/maps/submaps/surface_submaps/plains/RationCache_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/RationCache_vr.dmm
@@ -6,7 +6,7 @@
/turf/simulated/floor/outdoors/snow,
/area/submap/RationCache)
"c" = (
-/mob/living/simple_animal/otie/feral,
+/mob/living/simple_mob/vore/aggressive/dino,
/turf/simulated/floor/outdoors/snow,
/area/submap/RationCache)
"d" = (
diff --git a/maps/submaps/surface_submaps/plains/Shakden_vr.dmm b/maps/submaps/surface_submaps/plains/Shakden_vr.dmm
index 61eefb2bff..866f73517d 100644
--- a/maps/submaps/surface_submaps/plains/Shakden_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/Shakden_vr.dmm
@@ -38,7 +38,7 @@
},
/area/submap/Shakden)
"h" = (
-/mob/living/simple_animal/hostile/dragon,
+/mob/living/simple_mob/vore/aggressive/dragon/virgo3b,
/turf/simulated/floor/outdoors/dirt{
outdoors = 0
},
diff --git a/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm b/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm
index 57796f125e..6c08c071f9 100644
--- a/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm
@@ -118,7 +118,7 @@
},
/area/submap/Thiefc)
"q" = (
-/mob/living/simple_animal/hostile/bear,
+/mob/living/simple_mob/animal/space/bear,
/turf/simulated/floor/outdoors/dirt{
outdoors = 0
},
diff --git a/maps/tether/submaps/aerostat/submaps/Blackshuttledown.dmm b/maps/tether/submaps/aerostat/submaps/Blackshuttledown.dmm
index 66a5ae2d54..c1e1da0f46 100644
--- a/maps/tether/submaps/aerostat/submaps/Blackshuttledown.dmm
+++ b/maps/tether/submaps/aerostat/submaps/Blackshuttledown.dmm
@@ -148,9 +148,9 @@
},
/area/submap/virgo2/Blackshuttledown)
"aB" = (
-/mob/living/simple_mob/hostile/viscerator,
-/mob/living/simple_mob/hostile/viscerator,
-/mob/living/simple_mob/hostile/viscerator,
+/mob/living/simple_mob/mechanical/viscerator,
+/mob/living/simple_mob/mechanical/viscerator,
+/mob/living/simple_mob/mechanical/viscerator,
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"aC" = (
@@ -163,7 +163,7 @@
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"aD" = (
-/mob/living/simple_mob/hostile/syndicate/ranged/space,
+/mob/living/simple_mob/humanoid/merc/ranged/space,
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"aE" = (
@@ -242,11 +242,10 @@
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"aT" = (
-/mob/living/simple_mob/hostile/syndicate/ranged{
- desc = "Dosen't look friendly in the slightest.";
+/mob/living/simple_mob/humanoid/merc/ranged{
name = "Unknown Individual";
- say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!");
- speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")
+ desc = "Dosen't look friendly in the slightest.";
+ say_list_type = /datum/say_list/merc/unknown_ind
},
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
@@ -374,7 +373,7 @@
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"bn" = (
-/mob/living/simple_mob/hostile/viscerator,
+/mob/living/simple_mob/mechanical/viscerator,
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"bo" = (
@@ -393,8 +392,8 @@
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"bq" = (
-/mob/living/simple_mob/hostile/viscerator,
-/mob/living/simple_mob/hostile/viscerator,
+/mob/living/simple_mob/mechanical/viscerator,
+/mob/living/simple_mob/mechanical/viscerator,
/turf/simulated/floor/tiled/steel,
/area/submap/virgo2/Blackshuttledown)
"br" = (
@@ -439,7 +438,7 @@
/turf/simulated/mineral/floor/ignore_mapgen/virgo2,
/area/submap/virgo2/Blackshuttledown)
"bz" = (
-/mob/living/simple_mob/hostile/syndicate/ranged/space,
+/mob/living/simple_mob/humanoid/merc/ranged/space,
/turf/simulated/mineral/floor/ignore_mapgen/virgo2,
/area/submap/virgo2/Blackshuttledown)
diff --git a/maps/tether/submaps/aerostat/submaps/Boombase.dmm b/maps/tether/submaps/aerostat/submaps/Boombase.dmm
index dd8247263f..d67dd5da09 100644
--- a/maps/tether/submaps/aerostat/submaps/Boombase.dmm
+++ b/maps/tether/submaps/aerostat/submaps/Boombase.dmm
@@ -57,7 +57,7 @@
/turf/simulated/floor/tiled/techfloor/virgo2,
/area/submap/virgo2/BoomBase)
"ao" = (
-/mob/living/simple_mob/hostile/jelly,
+/mob/living/simple_mob/animal/space/jelly,
/turf/simulated/floor/tiled/techfloor/virgo2,
/area/submap/virgo2/BoomBase)
"ap" = (
@@ -96,7 +96,7 @@
/area/submap/virgo2/BoomBase)
"ax" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_mob/hostile/jelly,
+/mob/living/simple_mob/animal/space/jelly,
/turf/simulated/floor/tiled/techfloor/virgo2,
/area/submap/virgo2/BoomBase)
"ay" = (
diff --git a/maps/tether/submaps/aerostat/submaps/Rockybase.dmm b/maps/tether/submaps/aerostat/submaps/Rockybase.dmm
index f3ad41c0de..87e38e6b61 100644
--- a/maps/tether/submaps/aerostat/submaps/Rockybase.dmm
+++ b/maps/tether/submaps/aerostat/submaps/Rockybase.dmm
@@ -2,7 +2,7 @@
"aa" = (
/mob/living/simple_mob/mechanical/viscerator{
maxbodytemp = 900;
- returns_home = 1
+ ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/returnhome
},
/turf/simulated/mineral/floor/ignore_mapgen/virgo2,
/area/template_noop)
@@ -25,7 +25,7 @@
desc = "An automated combat drone with an aged apperance.";
faction = "syndicate";
maxbodytemp = 900;
- returns_home = 1
+ ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening/returnhome
},
/turf/simulated/mineral/floor/ignore_mapgen/virgo2,
/area/submap/virgo2/Rockybase)
@@ -361,7 +361,7 @@
desc = "An automated combat drone with an aged apperance.";
faction = "syndicate";
maxbodytemp = 900;
- returns_home = 1
+ ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening/returnhome
},
/turf/simulated/floor/tiled/techfloor/virgo2,
/area/submap/virgo2/Rockybase)
diff --git a/maps/tether/submaps/alienship/_alienship.dm b/maps/tether/submaps/alienship/_alienship.dm
index 7336a0db19..e204da0e90 100644
--- a/maps/tether/submaps/alienship/_alienship.dm
+++ b/maps/tether/submaps/alienship/_alienship.dm
@@ -139,36 +139,45 @@
for(var/mob in player_list) //This is extreme, but it's very hard to find people hiding in things, and this is pretty cheap.
try
if(isliving(mob) && get_area(mob) == src)
- var/mob/living/L = mob
-
- //Situations to get the mob out of
- if(L.buckled)
- L.buckled.unbuckle_mob()
- if(istype(L.loc,/obj/mecha))
- var/obj/mecha/M = L.loc
- M.go_out()
- else if(istype(L.loc,/obj/machinery/sleeper))
- var/obj/machinery/sleeper/SL = L.loc
- SL.go_out()
- else if(istype(L.loc,/obj/machinery/recharge_station))
- var/obj/machinery/recharge_station/RS = L.loc
- RS.go_out()
-
- L.forceMove(pick(get_area_turfs(dump_area)))
- if(!issilicon(L)) //Don't drop borg modules...
- for(var/obj/item/I in L)
- if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif))
- continue
- L.drop_from_inventory(I, loc)
- L.Paralyse(10)
- L.forceMove(get_turf(pick(teleport_to)))
- L << 'sound/effects/bamf.ogg'
- to_chat(L,"You're starting to come to. You feel like you've been out for a few minutes, at least...")
+ abduct(mob)
catch
log_debug("Problem doing [mob] for Alienship arrival teleport!")
did_entry = TRUE
+/area/shuttle/excursion/away_alienship/proc/abduct(var/mob/living/mob)
+ if(isliving(mob))
+ var/mob/living/L = mob
+
+ //Situations to get the mob out of
+ if(L.buckled)
+ L.buckled.unbuckle_mob()
+ if(istype(L.loc,/obj/mecha))
+ var/obj/mecha/M = L.loc
+ M.go_out()
+ else if(istype(L.loc,/obj/machinery/sleeper))
+ var/obj/machinery/sleeper/SL = L.loc
+ SL.go_out()
+ else if(istype(L.loc,/obj/machinery/recharge_station))
+ var/obj/machinery/recharge_station/RS = L.loc
+ RS.go_out()
+
+ L.forceMove(pick(get_area_turfs(dump_area)))
+ if(!issilicon(L)) //Don't drop borg modules...
+ for(var/obj/item/I in L)
+ if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif))
+ continue
+ if(istype(I,/obj/item/weapon/holder))
+ var/obj/item/weapon/holder/H = I
+ var/mob/living/M = H.held_mob
+ M.forceMove(get_turf(H))
+ abduct(M)
+ L.drop_from_inventory(I, loc)
+ L.Paralyse(10)
+ L.forceMove(get_turf(pick(teleport_to)))
+ L << 'sound/effects/bamf.ogg'
+ to_chat(L,"You're starting to come to. You feel like you've been out for a few minutes, at least...")
+
/area/tether_away/alienship
name = "\improper Away Mission - Unknown Vessel"
icon_state = "away"
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index e9eeaf98ee..a6b1c8307d 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -5463,6 +5463,27 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/mining_main/eva)
+"ajj" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/binary/pump/high_power/on{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/atmos)
+"ajk" = (
+/obj/machinery/atmospherics/pipe/simple/visible/black{
+ dir = 4
+ },
+/obj/machinery/atmospherics/binary/pump/high_power/on{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/atmos)
"ajl" = (
/obj/structure/catwalk,
/turf/simulated/floor/plating,
@@ -5484,6 +5505,15 @@
/obj/structure/cable/green,
/turf/simulated/floor/plating,
/area/maintenance/lower/trash_pit)
+"ajn" = (
+/obj/machinery/atmospherics/pipe/simple/visible/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/binary/pump{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/atmos/processing)
"ajo" = (
/obj/machinery/door/airlock/maintenance/common,
/obj/machinery/atmospherics/pipe/simple/hidden,
@@ -5521,6 +5551,18 @@
},
/turf/simulated/floor/tiled,
/area/hallway/lower/first_west)
+"ajr" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/binary/pump/high_power/on{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/engineering/atmos)
"ajs" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -5593,6 +5635,24 @@
},
/turf/simulated/floor/tiled,
/area/hallway/lower/first_west)
+"ajw" = (
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/atmospherics/binary/pump/high_power/on,
+/turf/simulated/floor/tiled,
+/area/engineering/atmos)
+"ajx" = (
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/orange/border,
+/obj/machinery/atmospherics/binary/pump/high_power/on,
+/turf/simulated/floor/tiled,
+/area/engineering/atmos)
+"ajy" = (
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/white/border,
+/obj/machinery/atmospherics/binary/pump/high_power/on,
+/turf/simulated/floor/tiled,
+/area/engineering/atmos)
"ajN" = (
/obj/structure/catwalk,
/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,
@@ -14947,25 +15007,6 @@
},
/turf/simulated/floor/tiled,
/area/engineering/atmos)
-"aKv" = (
-/obj/machinery/atmospherics/pipe/simple/visible/black{
- dir = 4
- },
-/obj/machinery/atmospherics/binary/passive_gate/on{
- dir = 1;
- target_pressure = 15000
- },
-/turf/simulated/floor/tiled,
-/area/engineering/atmos)
-"aKw" = (
-/obj/machinery/atmospherics/pipe/simple/visible/green{
- dir = 4
- },
-/obj/machinery/atmospherics/binary/passive_gate{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/engineering/atmos/processing)
"aKy" = (
/obj/machinery/atmospherics/pipe/simple/visible/black{
dir = 4
@@ -15007,14 +15048,6 @@
},
/turf/simulated/floor/tiled,
/area/engineering/atmos)
-"aKM" = (
-/obj/machinery/atmospherics/binary/passive_gate/on{
- target_pressure = 15000
- },
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/orange/border,
-/turf/simulated/floor/tiled,
-/area/engineering/atmos)
"aKP" = (
/obj/structure/cable/green{
d1 = 1;
@@ -23365,14 +23398,6 @@
/obj/effect/floor_decal/corner/black/border,
/turf/simulated/floor/tiled,
/area/engineering/atmos)
-"cbE" = (
-/obj/machinery/atmospherics/binary/passive_gate/on{
- target_pressure = 15000
- },
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/black/border,
-/turf/simulated/floor/tiled,
-/area/engineering/atmos)
"cbH" = (
/obj/effect/floor_decal/borderfloor,
/obj/effect/floor_decal/corner/orange/border,
@@ -23389,14 +23414,6 @@
/obj/effect/floor_decal/corner/red/border,
/turf/simulated/floor/tiled,
/area/engineering/atmos)
-"cbO" = (
-/obj/machinery/atmospherics/binary/passive_gate/on{
- target_pressure = 15000
- },
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/white/border,
-/turf/simulated/floor/tiled,
-/area/engineering/atmos)
"cbP" = (
/obj/effect/floor_decal/borderfloor,
/obj/effect/floor_decal/corner/white/border,
@@ -25942,19 +25959,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating,
/area/maintenance/lower/research)
-"dCs" = (
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/blue/border{
- dir = 4
- },
-/obj/machinery/atmospherics/binary/passive_gate/on{
- dir = 1;
- target_pressure = 15000
- },
-/turf/simulated/floor/tiled,
-/area/engineering/atmos)
"dCw" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
@@ -27320,19 +27324,6 @@
},
/turf/simulated/floor/tiled/freezer,
/area/crew_quarters/showers)
-"iwn" = (
-/obj/machinery/atmospherics/binary/passive_gate/on{
- dir = 4;
- target_pressure = 15000
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/red/border{
- dir = 4
- },
-/turf/simulated/floor/tiled,
-/area/engineering/atmos)
"iwJ" = (
/obj/effect/floor_decal/corner/lightgrey{
dir = 10
@@ -40888,7 +40879,7 @@ aJs
aJT
nuR
oRG
-aKw
+ajn
vXn
eyS
aIv
@@ -42309,7 +42300,7 @@ kaj
bZe
cLz
caH
-cbE
+ajw
vtZ
uiB
cet
@@ -42877,7 +42868,7 @@ mks
rNz
kwi
toY
-aKM
+ajx
vtZ
uiB
cet
@@ -43445,7 +43436,7 @@ bpQ
rNz
kwi
mgz
-cbO
+ajy
vtZ
uiB
cet
@@ -44437,7 +44428,7 @@ aJI
aJQ
aJQ
aJQ
-aKv
+ajk
aKC
sfF
ccS
@@ -44572,7 +44563,7 @@ rfn
lZz
ylA
wUq
-dCs
+ajj
rtj
qpo
nij
@@ -44580,7 +44571,7 @@ qpo
tfC
grU
tiP
-iwn
+ajr
rpg
lZz
bEX
diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm
index d62592f183..0c2ad7a327 100644
--- a/maps/tether/tether-03-surface3.dmm
+++ b/maps/tether/tether-03-surface3.dmm
@@ -16919,6 +16919,7 @@
/turf/simulated/floor/tiled,
/area/hallway/lower/third_south)
"DW" = (
+/obj/machinery/computer/timeclock/premade/east,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm
index 98879a511b..2ae90f8ab0 100644
--- a/maps/tether/tether-05-station1.dmm
+++ b/maps/tether/tether-05-station1.dmm
@@ -12398,7 +12398,9 @@
/turf/simulated/floor/tiled/dark,
/area/engineering/engineering_airlock)
"aHU" = (
-/obj/machinery/teleport/station,
+/obj/machinery/teleport/station{
+ dir = 2
+ },
/turf/simulated/floor/tiled/dark,
/area/teleporter)
"aHW" = (
@@ -12477,7 +12479,9 @@
/turf/simulated/floor/tiled,
/area/engineering/hallway)
"aIj" = (
-/obj/machinery/teleport/hub,
+/obj/machinery/teleport/hub{
+ dir = 2
+ },
/turf/simulated/floor/tiled/dark,
/area/teleporter)
"aIl" = (
diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm
index 35d6e0918e..276b6a8815 100644
--- a/maps/tether/tether-06-station2.dmm
+++ b/maps/tether/tether-06-station2.dmm
@@ -6049,6 +6049,7 @@
icon_state = "tube1";
dir = 4
},
+/obj/effect/landmark/free_ai_shell,
/turf/simulated/floor/tiled/techfloor,
/area/ai_cyborg_station)
"ls" = (
diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm
index e4d438e4d3..eef9dc98cf 100644
--- a/maps/tether/tether-07-station3.dmm
+++ b/maps/tether/tether-07-station3.dmm
@@ -16541,15 +16541,17 @@
/area/quartermaster/qm)
"zK" = (
/obj/structure/grille,
-/obj/structure/window/reinforced/full,
/obj/machinery/door/firedoor/glass,
+/obj/structure/window/reinforced/polarized/full{
+ id = "qm_office"
+ },
/turf/simulated/floor/plating,
/area/quartermaster/qm)
"zL" = (
/turf/simulated/wall,
/area/quartermaster/qm)
"zM" = (
-/obj/machinery/door/airlock/glass_mining{
+/obj/machinery/door/airlock/mining{
name = "Quartermaster";
req_access = list(41);
req_one_access = list()
@@ -17875,6 +17877,11 @@
/obj/effect/landmark/start{
name = "Quartermaster"
},
+/obj/machinery/button/windowtint{
+ id = "qm_office";
+ pixel_x = 26;
+ pixel_y = 8
+ },
/turf/simulated/floor/tiled,
/area/quartermaster/qm)
"BN" = (
@@ -18391,7 +18398,7 @@
/turf/simulated/floor/tiled,
/area/quartermaster/qm)
"CH" = (
-/obj/machinery/door/airlock/glass_mining{
+/obj/machinery/door/airlock/mining{
name = "Quartermaster";
req_access = list(41);
req_one_access = list()
diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm
index 8dd5d7cf4a..8121025647 100644
--- a/maps/tether/tether_defines.dm
+++ b/maps/tether/tether_defines.dm
@@ -175,14 +175,14 @@
// We have a bunch of stuff common to the station z levels
/datum/map_z_level/tether/station
- flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES
+ flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_XENOARCH_EXEMPT
holomap_legend_x = 220
holomap_legend_y = 160
/datum/map_z_level/tether/station/surface_low
z = Z_LEVEL_SURFACE_LOW
name = "Surface 1"
- flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED
+ flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED|MAP_LEVEL_XENOARCH_EXEMPT
base_turf = /turf/simulated/floor/outdoors/rocks/virgo3b
holomap_offset_x = TETHER_HOLOMAP_MARGIN_X
holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*0
@@ -190,7 +190,7 @@
/datum/map_z_level/tether/station/surface_mid
z = Z_LEVEL_SURFACE_MID
name = "Surface 2"
- flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED
+ flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED|MAP_LEVEL_XENOARCH_EXEMPT
base_turf = /turf/simulated/open
holomap_offset_x = TETHER_HOLOMAP_MARGIN_X
holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*1
@@ -198,7 +198,7 @@
/datum/map_z_level/tether/station/surface_high
z = Z_LEVEL_SURFACE_HIGH
name = "Surface 3"
- flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED
+ flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES|MAP_LEVEL_SEALED|MAP_LEVEL_XENOARCH_EXEMPT
base_turf = /turf/simulated/open
holomap_offset_x = TETHER_HOLOMAP_MARGIN_X
holomap_offset_y = TETHER_HOLOMAP_MARGIN_Y + TETHER_MAP_SIZE*2
@@ -206,7 +206,7 @@
/datum/map_z_level/tether/transit
z = Z_LEVEL_TRANSIT
name = "Transit"
- flags = MAP_LEVEL_SEALED|MAP_LEVEL_PLAYER|MAP_LEVEL_CONTACT
+ flags = MAP_LEVEL_SEALED|MAP_LEVEL_PLAYER|MAP_LEVEL_CONTACT|MAP_LEVEL_XENOARCH_EXEMPT
/datum/map_z_level/tether/station/space_low
z = Z_LEVEL_SPACE_LOW
@@ -247,12 +247,12 @@
/datum/map_z_level/tether/colony
z = Z_LEVEL_CENTCOM
name = "Colony"
- flags = MAP_LEVEL_ADMIN|MAP_LEVEL_CONTACT
+ flags = MAP_LEVEL_ADMIN|MAP_LEVEL_CONTACT|MAP_LEVEL_XENOARCH_EXEMPT
/datum/map_z_level/tether/misc
z = Z_LEVEL_MISC
name = "Misc"
- flags = MAP_LEVEL_ADMIN
+ flags = MAP_LEVEL_ADMIN|MAP_LEVEL_XENOARCH_EXEMPT
/*
/datum/map_z_level/tether/wilderness
diff --git a/maps/tether/tether_phoronlock.dm b/maps/tether/tether_phoronlock.dm
index ead834fb70..44f5fd04cb 100644
--- a/maps/tether/tether_phoronlock.dm
+++ b/maps/tether/tether_phoronlock.dm
@@ -116,7 +116,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior
"processing" = program.memory["processing"]
)
- ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "phoron_airlock_console.tmpl", name, 470, 290)
ui.set_initial_data(data)
diff --git a/maps/tether/tether_shuttle_defs.dm b/maps/tether/tether_shuttle_defs.dm
index f1db714808..b1d5280242 100644
--- a/maps/tether/tether_shuttle_defs.dm
+++ b/maps/tether/tether_shuttle_defs.dm
@@ -86,7 +86,6 @@
//These seem backwards because they are written from the perspective of the merc and vox ships
departure_message = "Attention. The away mission vessel is approaching the colony."
arrival_message = "Attention. The away mission vessel is now leaving from the colony."
-*/
/datum/shuttle/multi_shuttle/awaymission/New()
..()
@@ -94,9 +93,11 @@
if(awaym_dest && awaym_dest.contents.len) // Otherwise this is an empty imaginary area
destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest
+*/
+
//////////////////////////////////////////////////////////////
// Tether Shuttle
-/datum/shuttle/ferry/tether_backup/goodluckmcgee
+/datum/shuttle/ferry/tether_backup
name = "Tether Backup"
location = 1 // At offsite
warmup_time = 5
@@ -173,6 +174,19 @@
departure_message = "Attention. A unregistered vessel is now leaving Virgo-3B."
..()
+/datum/shuttle/ferry/multidock/specops/ert
+ name = "Special Operations"
+ location = 0
+ warmup_time = 10
+ area_offsite = /area/shuttle/specops/station //centcom is the home station, the Exodus is offsite
+ area_station = /area/shuttle/specops/centcom
+ docking_controller_tag = "specops_shuttle_port"
+ docking_controller_tag_station = "specops_shuttle_port"
+ docking_controller_tag_offsite = "specops_shuttle_fore"
+ dock_target_station = "specops_centcom_dock"
+ dock_target_offsite = "specops_dock_airlock"
+
+
//////////////////////////////////////////////////////////////
// RogueMiner "Belter: Shuttle
// TODO - Not implemented yet on new map
diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm
index 05cf0d4629..8ba74c2a64 100644
--- a/maps/tether/tether_things.dm
+++ b/maps/tether/tether_things.dm
@@ -216,7 +216,7 @@
// Tram departure cryo doors that turn into ordinary airlock doors at round end
/obj/machinery/cryopod/robot/door/tram
name = "\improper Tram Station"
- icon = 'icons/obj/doors/Doorext.dmi'
+ icon = 'icons/obj/doors/Doorextglass.dmi'
icon_state = "door_closed"
base_icon_state = "door_closed"
occupied_icon_state = "door_locked"
@@ -235,7 +235,7 @@
time_till_despawn = 0
..()
var/turf/T = get_turf(src)
- var/obj/machinery/door/airlock/external/door = new(T)
+ var/obj/machinery/door/airlock/glass_external/door = new(T)
door.req_access = null
door.req_one_access = null
qdel(src)
@@ -250,7 +250,8 @@
var/choice = alert("Do you want to depart via the tram? Your character will leave the round.","Departure","Yes","No")
if(user && Adjacent(user) && choice == "Yes")
- user.ghostize()
+ var/mob/observer/dead/newghost = user.ghostize()
+ newghost.timeofdeath = world.time
despawn_occupant(user)
// Tram arrival point landmarks and datum
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index 4ba9d3d03b..556f88edbc 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -30,6 +30,7 @@ var/list/all_maps = list()
var/list/contact_levels = list() // Z-levels that can be contacted from the station, for eg announcements
var/list/player_levels = list() // Z-levels a character can typically reach
var/list/sealed_levels = list() // Z-levels that don't allow random transit at edge
+ var/list/xenoarch_exempt_levels = list() //Z-levels exempt from xenoarch finds and digsites spawning.
var/list/empty_levels = null // Empty Z-levels that may be used for various things (currently used by bluespace jump)
var/list/map_levels // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset.
@@ -185,6 +186,7 @@ var/list/all_maps = list()
if(flags & MAP_LEVEL_CONTACT) map.contact_levels += z
if(flags & MAP_LEVEL_PLAYER) map.player_levels += z
if(flags & MAP_LEVEL_SEALED) map.sealed_levels += z
+ if(flags & MAP_LEVEL_XENOARCH_EXEMPT) map.xenoarch_exempt_levels += z
if(flags & MAP_LEVEL_EMPTY)
if(!map.empty_levels) map.empty_levels = list()
map.empty_levels += z
diff --git a/vorestation.dme b/vorestation.dme
index 01d77b3198..402b01c1ac 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -206,10 +206,8 @@
#include "code\controllers\verbs.dm"
#include "code\controllers\observer_listener\atom\observer.dm"
#include "code\controllers\Processes\alarm.dm"
-#include "code\controllers\Processes\chemistry.dm"
#include "code\controllers\Processes\emergencyShuttle.dm"
#include "code\controllers\Processes\game_master.dm"
-#include "code\controllers\Processes\nanoui.dm"
#include "code\controllers\Processes\radiation.dm"
#include "code\controllers\Processes\supply.dm"
#include "code\controllers\Processes\ticker.dm"
@@ -229,6 +227,7 @@
#include "code\controllers\subsystems\machines.dm"
#include "code\controllers\subsystems\mapping_vr.dm"
#include "code\controllers\subsystems\mobs.dm"
+#include "code\controllers\subsystems\nanoui.dm"
#include "code\controllers\subsystems\orbits.dm"
#include "code\controllers\subsystems\overlays.dm"
#include "code\controllers\subsystems\persist_vr.dm"
@@ -240,6 +239,7 @@
#include "code\controllers\subsystems\transcore_vr.dm"
#include "code\controllers\subsystems\vote.dm"
#include "code\controllers\subsystems\xenoarch.dm"
+#include "code\controllers\subsystems\processing\chemistry.dm"
#include "code\controllers\subsystems\processing\fastprocess.dm"
#include "code\controllers\subsystems\processing\obj.dm"
#include "code\controllers\subsystems\processing\processing.dm"
@@ -1480,6 +1480,7 @@
#include "code\modules\ai\interfaces.dm"
#include "code\modules\ai\say_list.dm"
#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai.dm"
+#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai_vr.dm"
#include "code\modules\ai\aI_holder_subtypes\slime_xenobio_ai.dm"
#include "code\modules\alarm\alarm.dm"
#include "code\modules\alarm\alarm_handler.dm"
@@ -2365,6 +2366,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm"
#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\combat_drone.dm"
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm"
@@ -2518,7 +2520,6 @@
#include "code\modules\organs\subtypes\replicant.dm"
#include "code\modules\organs\subtypes\seromi.dm"
#include "code\modules\organs\subtypes\slime.dm"
-#include "code\modules\organs\subtypes\slime_vr.dm"
#include "code\modules\organs\subtypes\standard.dm"
#include "code\modules\organs\subtypes\standard_vr.dm"
#include "code\modules\organs\subtypes\unathi.dm"
@@ -2617,6 +2618,7 @@
#include "code\modules\power\singularity\particle_accelerator\particle_control.dm"
#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm"
#include "code\modules\power\singularity\particle_accelerator\particle_power.dm"
+#include "code\modules\power\singularity\particle_accelerator\particle_smasher.dm"
#include "code\modules\power\supermatter\setup_supermatter.dm"
#include "code\modules\power\supermatter\supermatter.dm"
#include "code\modules\power\tesla\coil.dm"
@@ -2784,6 +2786,7 @@
#include "code\modules\research\designs\misc.dm"
#include "code\modules\research\designs\pdas.dm"
#include "code\modules\research\designs\powercells.dm"
+#include "code\modules\research\designs\precursor.dm"
#include "code\modules\research\designs\stock_parts.dm"
#include "code\modules\research\designs\weapons.dm"
#include "code\modules\resleeving\circuitboards.dm"
@@ -2958,6 +2961,7 @@
#include "code\modules\vore\eating\bellymodes_vr.dm"
#include "code\modules\vore\eating\contaminate_vr.dm"
#include "code\modules\vore\eating\digest_act_vr.dm"
+#include "code\modules\vore\eating\leave_remains_vr.dm"
#include "code\modules\vore\eating\living_vr.dm"
#include "code\modules\vore\eating\silicon_vr.dm"
#include "code\modules\vore\eating\simple_animal_vr.dm"