diff --git a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
index 454d04ff446..391f10bc6e5 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 accedb543d8..5abaa00c606 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 cacdf5240b9..1f1c4ff1ae5 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 428f37fcfa3..6fbd91f861a 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 fc00be6ba4f..47c78427f0c 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 8ff0aa74799..d4bfb73311d 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 69e638bc229..9729e1d3876 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 0ec8664fd9c..125f492cd7a 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 54ac7d398d9..1f112f711ba 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 cd444abc183..c65a87d6c82 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 13b1bfd7955..7d0f3706aff 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 0e3234ed833..c17e6d15944 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 0a2e49d907c..fadd802c84e 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 9c3bec3066d..b55f6601f8f 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 ac480237b5e..767941d58f5 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 b8b781795f2..45e40cfbdeb 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 057e468bb44..a3687b9b99c 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 f5b8f8afd88..4618bb536df 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 89d3cc01bef..00000000000
--- 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 0f720600bc8..00000000000
--- 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 781e2853719..f71cd8fd1d3 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 00000000000..b4ceee4d631
--- /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 b2bcc4b2c0a..88bbabe72d3 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 00000000000..34094f9fe39
--- /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 3cd4ffe6bab..b743e8ff9e3 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 ddac25ee834..ddfb679932a 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 7f3e292c1a7..d863ad8269b 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 41539006575..7e2e1a42e3d 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 2ec99d81d43..61eb4c69538 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 d2f99a347ba..541ba771942 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 eba2570c18e..4075bc70f08 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 fdca613460b..67cf23a3cb9 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 ff8778645c6..650909f86d8 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 dcd708c5f6c..d059a0b0919 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 e21bbb9fafd..8268d936b04 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 b611497e796..15f10cd8005 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 6715669fc1d..bad3a0078b4 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 493d5ccd389..8d31ecb9f4d 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 66dbaa6e2ed..787cc55f7b6 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 c7d8b08398a..ecca3206585 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 623ccc11a32..998b712828f 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 49a4b342ef6..b259fe1dedc 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 2062f92db49..1e3afe81500 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 1ce64f4aed9..e74174d9219 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 839470f3567..c18d2b9e932 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 21d3e815915..ed238841038 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 7e2c786734f..758c2a57cb0 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 0a473420861..55afd7f35fe 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 0ce85959efe..c04760b4ef8 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 cc982ce207a..f60fcabbfab 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 ef1beeaac00..d81070e1f2c 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 a1f9f227fcb..00d1623e5be 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 d757ae777d4..e2b3fc46382 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 c05a8860467..4ac34cf1571 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 9f43bd077e9..42a418c7ad5 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 44a1f69945c..96e6f6b5f9e 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 eaea426c072..a1fd7199b2b 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 c6c2c94a9ed..3e06e19e52b 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 f4a68b12d5c..6170b302a2d 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 8e49a138e35..caeecb2e27b 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 79f297157c4..7c4e4588325 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 31942366a92..b4927f441c9 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 ec127a45999..cda908f800d 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 0dff9302919..c31c8f650b9 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 c25bde5ed6f..d276efef354 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 58d84e2d7c0..024162bc359 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 11893fa5ca6..0f8b797289d 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 fa7d5dfa041..e88b046c106 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 bdce39de145..5614d0be638 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 8e5c941bbff..14b27b2512e 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 fee3fbd0ec6..fbfbc04abf5 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 b952f678bb2..475f22a7d7d 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 0720b03b26c..74cc399beb1 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 736474f453f..d2d9079ab1d 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 b044cc4c907..948ef595c8d 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 c201264c3c8..0b985d3047a 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 5c81cfe31f9..a150aaf5662 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 1d3556b45e0..302823c82df 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 c1911d6a05f..4319e111278 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 383e2844d7e..d397c03cb1d 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 5a80ed7cc39..c326574eebb 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 c77bf27a92e..d2d0b8b55f8 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 2ce02adb67a..a679f5e1b69 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 dc4bf5146ab..7dc82a0ffb0 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 f14b19b1174..8af1c01a2a0 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 14c341ce345..c2a77936c4e 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 0ced4be9735..cc7ac0e4a45 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 d414232a80f..69f5bd0d4b7 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 6324af7fb5f..b9a8eff8a4d 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 579e65787bc..971eb26a46f 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 d3681423f3b..7e00c83c975 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 8abc2eabc21..ccd339e180a 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 0bdb5a6b72d..ea7006a73b1 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 6f92178f09a..a3c77099440 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 b22c4ca6491..913506c9e65 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 1415edea849..ed158a347bd 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 e1ceb489dd8..bbf05718fc5 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 bf67f83953d..bec23b4c2b8 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 d8fba581756..d981cafc07b 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 dae4a19d15d..72fe26da36b 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 0962eef6f3e..fb7a9accd4a 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 477815e62f2..73b62f07418 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 cb6a7f7c905..a9bdd6cee86 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 34535b05b82..3a969562f88 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 f53225ab410..181c786c4c4 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 7b1ab6a07c8..652e32cf75c 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 5f051a4e78a..8ff7ee844f0 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 1eb811838eb..38f0b1b8932 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 967715901d4..1b45091cf71 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 6e3f13d506e..c5622091831 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 35cff902d80..ce2c684c09f 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 00000000000..9af6e67f1f5
--- /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 354de6949bf..a8859e7c1c8 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 1ccf0d5c534..e13573e3058 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 2dbdcde1d3f..e2a661f5f35 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 1863ec3c143..dfdd02c4612 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 1130e1e19db..a7c32871338 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 29057e84697..66636aac6f7 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 d45555f40d8..413fe14d01d 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 2d6676adec1..a293226d48d 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 8c67e5394c4..c5a11275e82 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 becec3b192c..2d38c1f4914 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 d4c8389a510..604b85665fd 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 b653f14c603..3b81c6bdece 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 d1b93812160..0213ef089bb 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 19f7988826f..a458a568cfa 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 ee33b66cbae..4cce81a2a69 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 0118088b27d..9ed2d836a6d 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 8d7ebdf3142..4601f23484a 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 9c54a6e377e..f12db3f76b8 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 232ef46e3e3..f62356d83c4 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 0b1daf10fa7..1035c70eba1 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 6f55572ef91..5428e110dbe 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 5e28944ae0f..08580c7f977 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 0df256c131f..56f371fe91c 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 3f766726109..d515f429257 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 ae388a717d9..87b613a8e35 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 e531e5208f3..099ce46ba5d 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 a3528eb55b3..b54ac6c5f07 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 97280c78b9d..611bbb39a7b 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 9af501a92eb..389b24f19f8 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 9859fe3898b..6b15fc069ee 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 45c5f4b8f3e..d73e784ac45 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 f56faa515a0..f8a783b162a 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 5a09e5f04aa..6204f4d5ba6 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 f300f8a350d..4020f13d140 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 94acfd82dca..f5c9e2580ee 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 1b3720dc335..ac2417a0772 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 bef2c934030..85d98c1663b 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 480c3b63bb1..dad52893cfe 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 10276b7c7b4..4c29ae004fe 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 33c159ebf0e..ea851806c39 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 6664cb9e031..ae85b8d75c8 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 00000000000..026c803e4b9
--- /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 317bc2c0765..aa42ab461de 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 a6965a7f166..d13533a758d 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 3335e15db53..4ee7d5e01c5 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 945ffd53be2..c1d0f9de647 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 4ed62e25823..7bdb8c74e35 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 2e18386bde3..8e6ded6c846 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 c5a851bacc7..ec43035ed85 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 c8c5e8b613f..3924f65af7f 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 4a721ab709d..319da907159 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 33203944a13..3d790b1194b 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 ae8473c8ce4..da971a0f870 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 af1e1555303..ae5dc44f295 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 98a73964a4a..65c1acfe364 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 b1639f91946..69b0e7b77ea 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 4e4dd6af5be..43f98e3361e 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 7c2990395d9..818a53d38c6 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 2003abe04f2..529114fc745 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 bee4f385f9d..c14fac25ba7 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 270b194f5d2..00000000000
--- 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 4316762671a..01920ee2e01 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 e31560f9e36..0249fae4829 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 8d6ecefcc7c..09bf47512dc 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 8a2940b90db..add0d03d22f 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 c5c087f7d85..24ad752845e 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 7aa085c1989..7b464f6f503 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 bb808a49e26..2eadfc520ad 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 6563cb7fdb3..5e4c2e6207c 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 888d75ea6f3..c49c6055985 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 3b5992e4e44..2c3e99318da 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 00000000000..a9fca3e1604
--- /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 2e97d735bab..86283156016 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 ebf59a2d40d..e436497fc55 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 8c404e05c0d..739699ae31e 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 3b3de0b4363..29a1db0e165 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 697a0b416d8..99dc761ee66 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 317bc9a3b58..4d12abddfe0 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 825fd95fd44..ee77c5e79e5 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 0def6cd614f..21775ea17ef 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 1ec5e6e334b..6595343169e 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 b841375b845..611f286ab10 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 3c3bf869d76..c3a973402a4 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 f73f6e4a719..70142fabd8a 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 730e191891c..ba9b7270477 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 a04db7d53b4..38c6cf39da7 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 f540811c114..c889b2fe9d3 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 a050478c4b7..df99bca9e1b 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 4121b8a5582..4cc755d1580 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 70ca9692f3f..9d3eab7c43e 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 1542e929b67..c195b5764b0 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 00000000000..88575e5667a
--- /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 fb629e7ad70..60a0abb63ea 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 94fbb9ce097..518c77a504b 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 bea555b70c0..b8b4130dfea 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 38cba96c84f..5346f50e6eb 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 f7f5bed6387..b7e9b78c56b 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 22a8bc1a3f8..5304f8c7388 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 f4445682dcc..854b9dd097e 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 7e545b35fa2..d4dadb2945a 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 834b067e9d1..134d2be87d6 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 906873408d1..6166bb6456e 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 21a51d91e38..bb5b7fc8702 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 75c5d6625ce..17ea54c5649 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 e79f5d9b20a..60c1e4bd0d0 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 01924be4126..3d5422f4f18 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 7db9ae2b629..86b8e298099 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 c717e51adce..3726ce23cd5 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 277463bddcf..b2cc345b8c6 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 73e43be7048..433a26977bd 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 b5db3fa96ab..95657498a03 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 3ecad1d691f..379d7ef5331 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 d7db2633ad5..c4ea02b873a 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 8fa61e173b4..da2c543fc89 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 7b37c1acdfe..700a22b3a76 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 dba128e7e07..6547aacd23f 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 1f638f4f988..d2a379a336f 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 61b29148289..886ca5830c0 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 00000000000..be515f51c39
--- /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 8d3cb48d244..53b7a4d9eda 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 a3ad00ab7a8..2f261980ec8 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 a3b5fec4a5c..f89462f23c6 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 3e376b883f5..c5e4391ef70 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 ac50c4d7d14..b2c001ed3f7 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 259ef32b52e..f573cf017a5 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 1a1fe508c8b..c92121da918 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 2db3107c011..35179aca149 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 dc07d9a88d9..80aa45ec176 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 39cf1776e60..37655b098fa 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 003a5639da6..b97a34e48fa 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 93bf79a0da6..24d307c5e6b 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 3db20fb9c1c..4c69df3c3a1 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 00000000000..53719400490
--- /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 ca5c8b87a56..c6813737345 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 84aec25ab3c..7c20e2aa166 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 6f23560d104..87cf6172c16 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 e52265d69bd..d776a68b67c 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 790d93eca66..dbef5acf99a 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 8c1068a0331..5cfed3c1198 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 25935ccfbc1..ed5fd931450 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 3b1cc47da64..20c744e0a0b 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 00000000000..ad384a69073
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 c198543b058..4c3546ef782 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 d33437164e9..c9cea71b82d 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 00000000000..13b3ceaad02
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 96c3014c42a..43683f769f5 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 f4b3b875a44..2d51ed3634f 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 758a46b706c..799f1066613 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 2325f50ffff..afabe6ebfc2 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 a7d05818bf7..f1a46abc1d3 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 8adc02e3b5d..3abf08997f3 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 e0baa63cffd..e4847626797 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 f4311ba8e78..b2c92d1d8bc 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 2c5d7537a77..3047b95ab38 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 4b748edaf65..07b86869967 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 1437cbdcc1b..c11cc2d79fb 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 61eefb2bff2..866f73517d8 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 57796f125ee..6c08c071f93 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 66a5ae2d549..c1e1da0f468 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 dd8247263fe..d67dd5da09e 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 f3ad41c0de1..87e38e6b619 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 7336a0db19b..e204da0e90d 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 e9eeaf98ee3..a6b1c8307d0 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 d62592f1833..0c2ad7a3279 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 98879a511b5..2ae90f8ab0a 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 35d6e0918e9..276b6a88153 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 e4d438e4d38..eef9dc98cfc 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 8dd5d7cf4ad..81210256470 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 ead834fb70c..44f5fd04cb6 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 f1db7148087..b1d5280242a 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 05cf0d46290..8ba74c2a641 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 4ba9d3d03b4..556f88edbc8 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 01d77b3198c..402b01c1ace 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"