Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Hawk_v3
2019-04-14 19:44:13 +01:00
286 changed files with 7235 additions and 5506 deletions

View File

@@ -200,7 +200,7 @@
"moles" = round(air2.gas[output_gas], 0.01)) "moles" = round(air2.gas[output_gas], 0.01))
// update the ui if it exists, returns null if no ui is passed/found // 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) if (!ui)
ui = new(user, src, ui_key, "algae_farm_vr.tmpl", "Algae Farm Control Panel", 500, 600) ui = new(user, src, ui_key, "algae_farm_vr.tmpl", "Algae Farm Control Panel", 500, 600)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -197,7 +197,7 @@
) )
// update the ui if it exists, returns null if no ui is passed/found // 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) if (!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -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 // 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) if (!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -93,7 +93,7 @@
data = build_uidata() 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) if (!ui)
ui = new(user, src, ui_key, "omni_filter.tmpl", "Omni Filter Control", 330, 330) 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)) switch_filter(dir_flag(href_list["dir"]), mode_return_switch(new_filter))
update_icon() update_icon()
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
return return
/obj/machinery/atmospherics/omni/atmos_filter/proc/mode_return_switch(var/mode) /obj/machinery/atmospherics/omni/atmos_filter/proc/mode_return_switch(var/mode)

View File

@@ -131,7 +131,7 @@
data = build_uidata() 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) if (!ui)
ui = new(user, src, ui_key, "omni_mixer.tmpl", "Omni Mixer Control", 360, 330) 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"])) con_lock(dir_flag(href_list["dir"]))
update_icon() update_icon()
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
return return
/obj/machinery/atmospherics/omni/mixer/proc/switch_mode(var/port = NORTH, var/mode = ATM_NONE) /obj/machinery/atmospherics/omni/mixer/proc/switch_mode(var/port = NORTH, var/mode = ATM_NONE)

View File

@@ -83,7 +83,7 @@
data["gasTemperatureClass"] = temp_class data["gasTemperatureClass"] = temp_class
// update the ui if it exists, returns null if no ui is passed/found // 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) if(!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -103,7 +103,7 @@
data["gasTemperatureClass"] = temp_class data["gasTemperatureClass"] = temp_class
// update the ui if it exists, returns null if no ui is passed/found // 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) if(!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -5,5 +5,3 @@
#define PLANE_CH_VANTAG 29 //Vore Antag hud #define PLANE_CH_VANTAG 29 //Vore Antag hud
#define PLANE_AUGMENTED 40 //Augmented-reality plane #define PLANE_AUGMENTED 40 //Augmented-reality plane
#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable

View File

@@ -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_TO_RUN 70
#define TICK_LIMIT_MC 70 #define TICK_LIMIT_MC 70
#define TICK_LIMIT_MC_INIT_DEFAULT 98 #define TICK_LIMIT_MC_INIT_DEFAULT 98

View File

@@ -29,9 +29,9 @@
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" #define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
//Addon mode flags //Addon mode flags
#define DM_FLAG_NUMBING 0x1 #define DM_FLAG_NUMBING 0x1
#define DM_FLAG_STRIPPING 0x2 #define DM_FLAG_STRIPPING 0x2
//#define DM_FLAG_ITEMWEAK 0x4 #define DM_FLAG_LEAVEREMAINS 0x4
//Item related modes //Item related modes
#define IM_HOLD "Hold" #define IM_HOLD "Hold"

View File

@@ -6,6 +6,7 @@
#define MAP_LEVEL_SEALED 0x010 // Z-levels that don't allow random transit at edge #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_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_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. // Misc map defines.
#define SUBMAP_MAP_EDGE_PAD 15 // Automatically created submaps are forbidden from being this close to the main map's edge. #define SUBMAP_MAP_EDGE_PAD 15 // Automatically created submaps are forbidden from being this close to the main map's edge.

View File

@@ -145,7 +145,10 @@
#define DEFAULT_TABLE_MATERIAL "plastic" #define DEFAULT_TABLE_MATERIAL "plastic"
#define DEFAULT_WALL_MATERIAL "steel" #define DEFAULT_WALL_MATERIAL "steel"
#define MAT_IRON "iron"
#define MAT_MARBLE "marble"
#define MAT_STEEL "steel" #define MAT_STEEL "steel"
#define MAT_PLASTIC "plastic"
#define MAT_GLASS "glass" #define MAT_GLASS "glass"
#define MAT_SILVER "silver" #define MAT_SILVER "silver"
#define MAT_GOLD "gold" #define MAT_GOLD "gold"
@@ -164,6 +167,13 @@
#define MAT_DURASTEEL "durasteel" #define MAT_DURASTEEL "durasteel"
#define MAT_DURASTEELHULL "durasteel hull" #define MAT_DURASTEELHULL "durasteel hull"
#define MAT_TITANIUMHULL "titanium 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_SHARD "shard"
#define SHARD_SHRAPNEL "shrapnel" #define SHARD_SHRAPNEL "shrapnel"

View File

@@ -30,3 +30,8 @@
#define SPECIES_ZORREN_FLAT "Flatland Zorren" #define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren" #define SPECIES_ZORREN_HIGH "Highlander Zorren"
#define SPECIES_CUSTOM "Custom Species" #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"

View File

@@ -11,6 +11,7 @@
#define TECH_DATA "programming" #define TECH_DATA "programming"
#define TECH_ILLEGAL "syndicate" #define TECH_ILLEGAL "syndicate"
#define TECH_ARCANE "arcane" #define TECH_ARCANE "arcane"
#define TECH_PRECURSOR "precursor"
#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals. #define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals.
#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals #define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals

View File

@@ -73,6 +73,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
// Subsystem fire priority, from lowest to highest priority // 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) // 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_SHUTTLES 5
#define FIRE_PRIORITY_TIMERS 7 //VOREStation Emergency Edit
#define FIRE_PRIORITY_ORBIT 8 #define FIRE_PRIORITY_ORBIT 8
#define FIRE_PRIORITY_VOTE 9 #define FIRE_PRIORITY_VOTE 9
#define FIRE_PRIORITY_AI 10 #define FIRE_PRIORITY_AI 10

View File

@@ -34,7 +34,9 @@
#define ARCHAEO_REMAINS_XENO 34 #define ARCHAEO_REMAINS_XENO 34
#define ARCHAEO_GASMASK 35 #define ARCHAEO_GASMASK 35
#define ARCHAEO_ALIEN_ITEM 36 #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_GARDEN 1
#define DIGSITE_ANIMAL 2 #define DIGSITE_ANIMAL 2

View File

@@ -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/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/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/landmarks_list = list() //list of all landmarks created
var/global/list/surgery_steps = list() //list of all surgery steps |BS12 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 var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12

View File

@@ -137,6 +137,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
/obj/item/stack/material/cardboard, /obj/item/stack/material/cardboard,
/obj/item/toy, /obj/item/toy,
/obj/item/trash, /obj/item/trash,
/obj/item/weapon/digestion_remains,
/obj/item/weapon/bananapeel, /obj/item/weapon/bananapeel,
/obj/item/weapon/bone, /obj/item/weapon/bone,
/obj/item/weapon/broken_bottle, /obj/item/weapon/broken_bottle,
@@ -394,6 +395,27 @@ var/global/list/contamination_colors = list("green",
"beige", "beige",
"pink") "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() /hook/startup/proc/init_vore_datum_ref_lists()
var/paths var/paths

View File

@@ -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

View File

@@ -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

View File

@@ -78,6 +78,8 @@ var/datum/controller/supply/supply_controller = new()
return 1 return 1
if(istype(A,/obj/item/device/radio/beacon)) if(istype(A,/obj/item/device/radio/beacon))
return 1 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) for(var/atom/B in A.contents)
if(.(B)) if(.(B))
@@ -99,6 +101,7 @@ var/datum/controller/supply/supply_controller = new()
EC.name = "\proper[MA.name]" EC.name = "\proper[MA.name]"
EC.value = 0 EC.value = 0
EC.contents = list() EC.contents = list()
var/base_value = 0
// Must be in a crate! // Must be in a crate!
if(istype(MA,/obj/structure/closet/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)) callHook("sell_crate", list(CR, area_shuttle))
points += CR.points_per_crate points += CR.points_per_crate
if(CR.points_per_crate)
base_value = CR.points_per_crate
var/find_slip = 1 var/find_slip = 1
for(var/atom/A in CR) for(var/atom/A in CR)
@@ -149,6 +154,7 @@ var/datum/controller/supply/supply_controller = new()
exported_crates += EC exported_crates += EC
points += EC.value points += EC.value
EC.value += base_value
// Duplicate the receipt for the admin-side log // Duplicate the receipt for the admin-side log
var/datum/exported_crate/adm = new() var/datum/exported_crate/adm = new()

View File

@@ -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

View File

@@ -41,24 +41,30 @@ SUBSYSTEM_DEF(persist)
return return
continue 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 // Update client whatever
var/client/C = M.client var/client/C = M.client
var/wait_in_hours = (wait / (1 HOUR)) * J.timeoff_factor var/wait_in_hours = (wait / (1 HOUR)) * J.timeoff_factor
LAZYINITLIST(C.department_hours) LAZYINITLIST(C.department_hours)
var/dept_hours = C.department_hours var/dept_hours = C.department_hours
if(isnum(C.department_hours[J.department])) if(isnum(C.department_hours[department_earning]))
dept_hours[J.department] += wait_in_hours dept_hours[department_earning] += wait_in_hours
else else
dept_hours[J.department] = wait_in_hours dept_hours[department_earning] = wait_in_hours
//Cap it //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! // Okay we figured it out, lets update database!
var/sql_ckey = sql_sanitize_text(C.ckey) var/sql_ckey = sql_sanitize_text(C.ckey)
var/sql_dpt = sql_sanitize_text(J.department) var/sql_dpt = sql_sanitize_text(department_earning)
var/sql_bal = text2num("[C.department_hours[J.department]]") 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)") 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() query.Execute()
@@ -79,3 +85,10 @@ SUBSYSTEM_DEF(persist)
// Let's check the mind. // Let's check the mind.
if(M.mind && M.mind.assigned_role) if(M.mind && M.mind.assigned_role)
. = job_master.GetJob(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

View File

@@ -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

View File

@@ -6,6 +6,7 @@
SUBSYSTEM_DEF(timer) SUBSYSTEM_DEF(timer)
name = "Timer" name = "Timer"
wait = 1 //SS_TICKER subsystem, so wait is in ticks wait = 1 //SS_TICKER subsystem, so wait is in ticks
priority = FIRE_PRIORITY_TIMERS //VOREStation Emergency Edit
init_order = INIT_ORDER_TIMER init_order = INIT_ORDER_TIMER
flags = SS_TICKER|SS_NO_INIT flags = SS_TICKER|SS_NO_INIT

View File

@@ -56,7 +56,7 @@ SUBSYSTEM_DEF(transcore)
implants -= imp implants -= imp
continue continue
//In a human //In a human
BITSET(H.hud_updateflag, BACKUP_HUD) BITSET(H.hud_updateflag, BACKUP_HUD)
if(H == imp.imp_in && H.mind && H.stat < DEAD) if(H == imp.imp_in && H.mind && H.stat < DEAD)
@@ -93,6 +93,7 @@ SUBSYSTEM_DEF(transcore)
else else
if(curr_MR.dead_state != MR_DEAD) //First time switching to dead if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
notify(name) notify(name)
curr_MR.last_notification = world.time
curr_MR.dead_state = MR_DEAD curr_MR.dead_state = MR_DEAD
if(MC_TICK_CHECK) if(MC_TICK_CHECK)
@@ -159,9 +160,12 @@ SUBSYSTEM_DEF(transcore)
return 1 return 1
// Send a past-due notification to the medical radio channel. // 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) 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. // Called from mind_record to add itself to the transcore.
/datum/controller/subsystem/transcore/proc/add_backup(var/datum/transhuman/mind_record/MR) /datum/controller/subsystem/transcore/proc/add_backup(var/datum/transhuman/mind_record/MR)

View File

@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(xenoarch)
/datum/controller/subsystem/xenoarch/proc/SetupXenoarch() /datum/controller/subsystem/xenoarch/proc/SetupXenoarch()
for(var/turf/simulated/mineral/M in turfs) for(var/turf/simulated/mineral/M in turfs)
if(!M.density) if(!M.density || M.z in using_map.xenoarch_exempt_levels)
continue continue
if(isnull(M.geologic_data)) if(isnull(M.geologic_data))

View File

@@ -102,8 +102,6 @@
options["LEGACY: gas_data"] = gas_data options["LEGACY: gas_data"] = gas_data
options["LEGACY: plant_controller"] = plant_controller options["LEGACY: plant_controller"] = plant_controller
options["LEGACY: alarm_manager"] = alarm_manager 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 var/pick = input(mob, "Choose a controller to debug/view variables of.", "VV controller:") as null|anything in options
if(!pick) if(!pick)

View File

@@ -31,5 +31,5 @@
weakref = null // Clear this reference to ensure it's kept for as brief duration as possible. weakref = null // Clear this reference to ensure it's kept for as brief duration as possible.
tag = null tag = null
GLOB.nanomanager.close_uis(src) SSnanoui.close_uis(src)
return QDEL_HINT_QUEUE return QDEL_HINT_QUEUE

View File

@@ -188,9 +188,28 @@
return 0 return 0
*/ //VOREStation Removal End */ //VOREStation Removal End
//VOREStation Edit Start //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, "<span class='warning'>The portal refuses to carry you that far away!</span>")
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, "<span class='warning'>Something is blocking way on the other side!</span>")
if(obstructed)
return 0
else
return 1 return 1
if(istype(teleatom, /mob/living))
to_chat(teleatom, "<span class='warning'>The portal refuses to carry you that far away!</span>")
return 0
//VOREStation Edit End //VOREStation Edit End

View File

@@ -1,12 +1,8 @@
/datum/teleport/proc/try_televore() /datum/teleport/proc/try_televore()
//Destination is in a belly //Destination is in a belly
if(isbelly(destination.loc) && isliving(teleatom)) if(isbelly(destination.loc))
var/mob/living/L = teleatom
var/obj/belly/B = 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. teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything.
playSpecials(destination,effectout,soundout) playSpecials(destination,effectout,soundout)
teleatom.forceMove(B) teleatom.forceMove(B)
@@ -14,4 +10,3 @@
//No fun! //No fun!
return FALSE return FALSE

View File

@@ -85,7 +85,7 @@
current.verbs -= /datum/changeling/proc/EvolutionMenu current.verbs -= /datum/changeling/proc/EvolutionMenu
current.mind = null 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 if(new_character.mind) //remove any mind currently in our new body's mind variable
new_character.mind.current = null new_character.mind.current = null

View File

@@ -10,5 +10,6 @@
name = "Destroyed" name = "Destroyed"
/datum/Destroy() /datum/Destroy()
GLOB.destroyed_event.raise_event(src) if(GLOB.destroyed_event)
GLOB.destroyed_event.raise_event(src)
. = ..() . = ..()

View File

@@ -24,7 +24,7 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT) if(WIRE_TRANSMIT)
R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL) R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL)
GLOB.nanomanager.update_uis(holder) SSnanoui.update_uis(holder)
/datum/wires/radio/UpdateCut(var/index, var/mended) /datum/wires/radio/UpdateCut(var/index, var/mended)
var/obj/item/device/radio/R = holder var/obj/item/device/radio/R = holder
@@ -38,4 +38,4 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT) if(WIRE_TRANSMIT)
R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL) R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL)
GLOB.nanomanager.update_uis(holder) SSnanoui.update_uis(holder)

View File

@@ -10,10 +10,6 @@
/datum/wires/seedstorage/CanUse(var/mob/living/L) /datum/wires/seedstorage/CanUse(var/mob/living/L)
var/obj/machinery/seed_storage/V = holder 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) if(V.panel_open)
return 1 return 1
return 0 return 0

View File

@@ -12,10 +12,6 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
/datum/wires/smartfridge/CanUse(var/mob/living/L) /datum/wires/smartfridge/CanUse(var/mob/living/L)
var/obj/machinery/smartfridge/S = holder 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) if(S.panel_open)
return 1 return 1
return 0 return 0

View File

@@ -9,10 +9,6 @@ var/const/VENDING_WIRE_IDSCAN = 8
/datum/wires/vending/CanUse(var/mob/living/L) /datum/wires/vending/CanUse(var/mob/living/L)
var/obj/machinery/vending/V = holder 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) if(V.panel_open)
return 1 return 1
return 0 return 0
@@ -43,7 +39,7 @@ var/const/VENDING_WIRE_IDSCAN = 8
if(VENDING_WIRE_THROW) if(VENDING_WIRE_THROW)
V.shoot_inventory = !mended V.shoot_inventory = !mended
if(VENDING_WIRE_CONTRABAND) if(VENDING_WIRE_CONTRABAND)
V.categories &= ~CAT_HIDDEN V.categories &= ~CAT_HIDDEN
if(VENDING_WIRE_ELECTRIFY) if(VENDING_WIRE_ELECTRIFY)
if(mended) if(mended)
V.seconds_electrified = 0 V.seconds_electrified = 0

View File

@@ -555,6 +555,91 @@
rating = 3 rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 80) 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 // Subspace stock parts
/obj/item/weapon/stock_parts/subspace/ansible /obj/item/weapon/stock_parts/subspace/ansible

View File

@@ -979,6 +979,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "entry_D2" icon_state = "entry_D2"
base_turf = /turf/space 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 /area/hallway/secondary/entry/D3
name = "\improper Shuttle Dock Hallway - Dock Three" name = "\improper Shuttle Dock Hallway - Dock Three"
icon_state = "entry_D3" icon_state = "entry_D3"

View File

@@ -79,6 +79,9 @@
/area/security/nuke_storage /area/security/nuke_storage
flags = BLUE_SHIELDED flags = BLUE_SHIELDED
/area/supply
flags = BLUE_SHIELDED
// Add rad shielding to maintenance and construction sites // Add rad shielding to maintenance and construction sites
/area/vacant /area/vacant
flags = RAD_SHIELDED flags = RAD_SHIELDED

View File

@@ -270,7 +270,7 @@
I.loc = src I.loc = src
src.disk = I src.disk = I
user << "You insert [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 return
else else
..() ..()
@@ -428,7 +428,7 @@
data["beakerVolume"] += R.volume data["beakerVolume"] += R.volume
// update the ui if it exists, returns null if no ui is passed/found // 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) if (!ui)
// the ui does not exist, so we'll create a new() one // 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 // 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 irradiating = src.radiation_duration
var/lock_state = src.connected.locked var/lock_state = src.connected.locked
src.connected.locked = 1//lock it 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 sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
@@ -566,7 +566,7 @@
irradiating = src.radiation_duration irradiating = src.radiation_duration
var/lock_state = src.connected.locked var/lock_state = src.connected.locked
src.connected.locked = 1//lock it 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 sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
@@ -624,7 +624,7 @@
irradiating = src.radiation_duration irradiating = src.radiation_duration
var/lock_state = src.connected.locked var/lock_state = src.connected.locked
src.connected.locked = 1 //lock it 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 sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
@@ -751,7 +751,7 @@
irradiating = 2 irradiating = 2
var/lock_state = src.connected.locked var/lock_state = src.connected.locked
src.connected.locked = 1//lock it 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 sleep(10*2) // sleep for 2 seconds

View File

@@ -109,7 +109,7 @@
break break
data["stasis"] = stasis_level_name 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) if(!ui)
ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state) ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -170,6 +170,7 @@
..() ..()
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
component_parts = list() 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/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)
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src) component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
@@ -179,7 +180,49 @@
component_parts += new /obj/item/weapon/reagent_containers/syringe(src) component_parts += new /obj/item/weapon/reagent_containers/syringe(src)
component_parts += new /obj/item/stack/material/glass/reinforced(src, 2) component_parts += new /obj/item/stack/material/glass/reinforced(src, 2)
RefreshParts() RefreshParts(0)
/obj/machinery/sleeper/RefreshParts(var/limited = 1)
var/man_rating = 0
var/cap_rating = 0
available_chemicals = initial(available_chemicals)
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/new_chemicals = list()
if(man_rating >= 4) // Alien tech.
var/reag_ID = pickweight(
"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"
available_chemicals += new_chemicals
return
/obj/machinery/sleeper/Initialize() /obj/machinery/sleeper/Initialize()
. = ..() . = ..()
@@ -351,3 +394,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." 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" icon_state = "sleeper"
stasis_level = 100 //Just one setting stasis_level = 100 //Just one setting
/obj/machinery/sleeper/survival_pod/Initialize()
..()
RefreshParts()

View File

@@ -389,7 +389,7 @@
occupantData = attempt_vr(scanner,"get_occupant_data_vr",list(occupantData,H)) //VOREStation Insert occupantData = attempt_vr(scanner,"get_occupant_data_vr",list(occupantData,H)) //VOREStation Insert
data["occupant"] = occupantData 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) if(!ui)
ui = new(user, src, ui_key, "adv_med.tmpl", "Body Scanner", 690, 800) ui = new(user, src, ui_key, "adv_med.tmpl", "Body Scanner", 690, 800)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -497,7 +497,7 @@
if(!(locked && !remote_connection) || remote_access || issilicon(user)) if(!(locked && !remote_connection) || remote_access || issilicon(user))
populate_controls(data) 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) if(!ui)
ui = new(user, src, ui_key, "air_alarm.tmpl", name, 325, 625, master_ui = master_ui, state = state) ui = new(user, src, ui_key, "air_alarm.tmpl", name, 325, 625, master_ui = master_ui, state = state)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -117,7 +117,7 @@ obj/machinery/computer/general_air_control/Destroy()
data["sensors"] = sensors_ui 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) if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 525, 600) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 525, 600)
ui.set_initial_data(data) 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["input_flow_setting"] = round(input_flow_setting, 0.1)
data["pressure_setting"] = pressure_setting 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) if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 660, 500) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 660, 500)
ui.set_initial_data(data) 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["input_flow_setting"] = round(input_flow_setting, 0.1)
data["pressure_setting"] = pressure_setting 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) if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -416,7 +416,7 @@ obj/machinery/computer/general_air_control/Destroy()
else else
data["device_info"] = null 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) if(!ui)
ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -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) /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob)
return src.attack_hand(user) return src.attack_hand(user)
@@ -288,7 +288,7 @@ update_flag
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure())) 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 // 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) if (!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -138,7 +138,7 @@
if (holding) if (holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0)) 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) if (!ui)
ui = new(user, src, ui_key, "portpump.tmpl", "Portable Pump", 480, 410, state = physical_state) ui = new(user, src, ui_key, "portpump.tmpl", "Portable Pump", 480, 410, state = physical_state)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -114,7 +114,7 @@
if (holding) if (holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0)) 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) if (!ui)
ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state) ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -195,7 +195,7 @@
update_use_power(new_use_power) update_use_power(new_use_power)
if(!on) if(!on)
return return
var/power_draw = -1 var/power_draw = -1
var/datum/gas_mixture/environment = loc.return_air() var/datum/gas_mixture/environment = loc.return_air()

View File

@@ -304,7 +304,7 @@
storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000 storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000
storage_capacity["glass"] = mb_rating * 12500 storage_capacity["glass"] = mb_rating * 12500
build_time = 50 / man_rating 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() /obj/machinery/autolathe/dismantle()
for(var/mat in stored_material) for(var/mat in stored_material)

View File

@@ -19,6 +19,7 @@
var/base_print_delay = 100 // For Adminbus reasons var/base_print_delay = 100 // For Adminbus reasons
var/printing var/printing
var/loaded_dna //Blood sample for DNA hashing. 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 // These should be subtypes of /obj/item/organ
// Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity // 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() /obj/machinery/organ_printer/RefreshParts()
// Print Delay updating // Print Delay updating
print_delay = base_print_delay print_delay = base_print_delay
var/manip_rating = 0
for(var/obj/item/weapon/stock_parts/manipulator/manip in component_parts) for(var/obj/item/weapon/stock_parts/manipulator/manip in component_parts)
manip_rating += manip.rating
print_delay -= (manip.rating-1)*10 print_delay -= (manip.rating-1)*10
print_delay = max(0,print_delay) 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) /obj/machinery/organ_printer/attack_hand(mob/user)
@@ -182,7 +192,17 @@
O.set_dna(C.dna) O.set_dna(C.dna)
O.species = C.species 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 var/obj/item/organ/external/E = O
E.sync_colour_to_human(C) E.sync_colour_to_human(C)

View File

@@ -55,7 +55,7 @@
data["table"] = table data["table"] = table
data["victim"] = victim_ui 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) if (!ui)
ui = new(user, src, ui_key, "operating.tmpl", src.name, 380, 400) ui = new(user, src, ui_key, "operating.tmpl", src.name, 380, 400)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -69,4 +69,4 @@
usr.set_machine(src) usr.set_machine(src)
src.add_fingerprint(usr) src.add_fingerprint(usr)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)

View File

@@ -140,7 +140,7 @@
data["enemyHP"] = enemy_hp data["enemyHP"] = enemy_hp
data["gameOver"] = gameover 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) if (!ui)
ui = new(user, src, ui_key, "arcade_battle.tmpl", src.name, 400, 300) ui = new(user, src, ui_key, "arcade_battle.tmpl", src.name, 400, 300)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -202,7 +202,7 @@
emagged = 0 emagged = 0
src.add_fingerprint(usr) src.add_fingerprint(usr)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
return return
/obj/machinery/computer/arcade/battle/proc/arcade_action() /obj/machinery/computer/arcade/battle/proc/arcade_action()

View File

@@ -37,7 +37,7 @@ var/global/list/minor_air_alarms = list()
data["priority_alarms"] = major_alarms data["priority_alarms"] = major_alarms
data["minor_alarms"] = minor_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) if(!ui)
ui = new(user, src, ui_key, "atmos_alert.tmpl", src.name, 500, 500) ui = new(user, src, ui_key, "atmos_alert.tmpl", src.name, 500, 500)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -49,7 +49,7 @@
switch_to_camera(user, current_camera) switch_to_camera(user, current_camera)
data["map_levels"] = using_map.get_map_levels(src.z) 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) if (!ui)
ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800) ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800)
@@ -152,7 +152,7 @@
/obj/machinery/computer/security/process() /obj/machinery/computer/security/process()
if(cache_id != camera_repository.camera_cache_id) if(cache_id != camera_repository.camera_cache_id)
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) /obj/machinery/computer/security/proc/can_access_camera(var/obj/machinery/camera/C)
var/list/shared_networks = src.network & C.network var/list/shared_networks = src.network & C.network

View File

@@ -68,7 +68,7 @@
id_card.forceMove(src) id_card.forceMove(src)
modify = id_card modify = id_card
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
attack_hand(user) attack_hand(user)
/obj/machinery/computer/card/attack_ai(var/mob/user as mob) /obj/machinery/computer/card/attack_ai(var/mob/user as mob)
@@ -139,7 +139,7 @@
data["regions"] = regions 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) if (!ui)
ui = new(user, src, ui_key, "identification_computer.tmpl", src.name, 600, 700) ui = new(user, src, ui_key, "identification_computer.tmpl", src.name, 600, 700)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -235,7 +235,7 @@
modify.registered_name = temp_name modify.registered_name = temp_name
else else
src.visible_message("<span class='notice'>[src] buzzes rudely.</span>") src.visible_message("<span class='notice'>[src] buzzes rudely.</span>")
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
if ("account") if ("account")
if (is_authenticated()) if (is_authenticated())
@@ -243,7 +243,7 @@
if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
var/account_num = text2num(href_list["account"]) var/account_num = text2num(href_list["account"])
modify.associated_account_number = account_num modify.associated_account_number = account_num
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
if ("mode") if ("mode")
mode = text2num(href_list["mode_target"]) mode = text2num(href_list["mode_target"])
@@ -253,7 +253,7 @@
printing = 1 printing = 1
spawn(50) spawn(50)
printing = null printing = null
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
var/obj/item/weapon/paper/P = new(loc) var/obj/item/weapon/paper/P = new(loc)
if (mode) if (mode)

View File

@@ -146,7 +146,7 @@
data["diskette"] = diskette data["diskette"] = diskette
data["temp"] = temp 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) if (!ui)
ui = new(user, src, ui_key, "cloning.tmpl", src.name, 400, 450) ui = new(user, src, ui_key, "cloning.tmpl", src.name, 400, 450)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -284,7 +284,7 @@
temp = "" temp = ""
scantemp = "" scantemp = ""
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
add_fingerprint(usr) add_fingerprint(usr)
/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) /obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob)

View File

@@ -104,7 +104,7 @@
if(!giver && user.unEquip(I)) if(!giver && user.unEquip(I))
I.forceMove(src) I.forceMove(src)
giver = I giver = I
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
else if(giver) else if(giver)
user << "<span class='warning'>There is already ID card inside.</span>" user << "<span class='warning'>There is already ID card inside.</span>"
return return
@@ -150,7 +150,7 @@
data["log"] = internal_log data["log"] = internal_log
data["uid"] = uid 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) if (!ui)
ui = new(user, src, ui_key, "guest_pass.tmpl", src.name, 400, 520) ui = new(user, src, ui_key, "guest_pass.tmpl", src.name, 400, 520)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -242,4 +242,4 @@
usr << "<span class='warning'>Cannot issue pass without issuing ID.</span>" usr << "<span class='warning'>Cannot issue pass without issuing ID.</span>"
src.add_fingerprint(usr) src.add_fingerprint(usr)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)

View File

@@ -19,7 +19,7 @@
data["is_ai"] = issilicon(user) 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) if (!ui)
ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500) ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -171,7 +171,7 @@
data["contraband"] = can_order_contraband || (authorization & SUP_CONTRABAND) data["contraband"] = can_order_contraband || (authorization & SUP_CONTRABAND)
// update the ui if it exists, returns null if no ui is passed/found // 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) if(!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -48,7 +48,7 @@
if(!card && user.unEquip(I)) if(!card && user.unEquip(I))
I.forceMove(src) I.forceMove(src)
card = I card = I
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
update_icon() update_icon()
else if(card) else if(card)
to_chat(user, "<span class='warning'>There is already ID card inside.</span>") to_chat(user, "<span class='warning'>There is already ID card inside.</span>")
@@ -88,7 +88,7 @@
// if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open // 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) // 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) if (!ui)
ui = new(user, src, ui_key, "timeclock_vr.tmpl", capitalize(src.name), 500, 520) ui = new(user, src, ui_key, "timeclock_vr.tmpl", capitalize(src.name), 500, 520)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -34,11 +34,11 @@
if(vendmode == 1 && I) if(vendmode == 1 && I)
scan_id(I, W) scan_id(I, W)
vendmode = 0 vendmode = 0
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
if(vendmode == 2 && I) if(vendmode == 2 && I)
if(reimburse_id(I, W)) if(reimburse_id(I, W))
vendmode = 0 vendmode = 0
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
if(vendmode == 0) if(vendmode == 0)
if(istype(W, /obj/item/device/laptop)) if(istype(W, /obj/item/device/laptop))
var/obj/item/device/laptop/L = W var/obj/item/device/laptop/L = W
@@ -48,7 +48,7 @@
L.loc = src L.loc = src
vendmode = 2 vendmode = 2
to_chat(user, "<span class='notice'>You slot your [L.name] into \The [src.name]</span>") to_chat(user, "<span class='notice'>You slot your [L.name] into \The [src.name]</span>")
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
else else
..() ..()
@@ -77,7 +77,7 @@
data["power"] = power data["power"] = power
data["total"] = total() 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) if (!ui)
ui = new(user, src, ui_key, "laptop_vendor.tmpl", src.name, 480, 425) ui = new(user, src, ui_key, "laptop_vendor.tmpl", src.name, 480, 425)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -136,7 +136,7 @@
vendmode = 0 vendmode = 0
src.add_fingerprint(usr) src.add_fingerprint(usr)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
/obj/machinery/lapvend/proc/vend() /obj/machinery/lapvend/proc/vend()
if(cardreader > 0) if(cardreader > 0)

View File

@@ -141,7 +141,7 @@
data["beakerVolume"] += R.volume data["beakerVolume"] += R.volume
// update the ui if it exists, returns null if no ui is passed/found // 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) if(!ui)
// the ui does not exist, so we'll create a new() one // 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 // 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 var/mob/M = grab.affecting
qdel(grab) qdel(grab)
put_mob(M) put_mob(M)
return 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 /obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to put people into cryo without external assistance

View File

@@ -513,6 +513,12 @@
//visible_message("<span class='notice'>\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.</span>", 3) //visible_message("<span class='notice'>\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.</span>", 3)
visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].</span>", 3) visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].</span>", 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. //This should guarantee that ghosts don't spawn.
to_despawn.ckey = null to_despawn.ckey = null

View File

@@ -746,7 +746,7 @@ About the new airlock wires panel:
data["commands"] = commands 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) if (!ui)
ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls", 450, 350, state = state) ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls", 450, 350, state = state)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -27,7 +27,7 @@
var/destroy_hits = 10 //How many strong hits it takes to destroy the door 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/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/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/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 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) /obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob)
src.add_fingerprint(user) src.add_fingerprint(user)
if (attempt_vr(src,"attackby_vr",list(I, user))) return
if(istype(I)) 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(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name())
if(stat & BROKEN) if(stat & BROKEN)
user << "<span class='notice'>It looks like \the [src] is pretty busted. It's going to need more than just patching up now.</span>" to_chat(user, "<span class='notice'>It looks like \the [src] is pretty busted. It's going to need more than just patching up now.</span>")
return return
if(health >= maxhealth) if(health >= maxhealth)
user << "<span class='notice'>Nothing to fix!</span>" to_chat(user, "<span class='notice'>Nothing to fix!</span>")
return return
if(!density) if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>" to_chat(user, "<span class='warning'>\The [src] must be closed before you can repair it.</span>")
return return
//figure out how much metal we need //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? 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/obj/item/stack/stack = I
var/transfer var/amount_given = amount_needed - repairing
if (repairing) var/mats_given = stack.get_amount()
transfer = stack.transfer_to(repairing, amount_needed - repairing.amount) if(repairing && amount_given <= 0)
if (!transfer) to_chat(user, "<span class='warning'>You must weld or remove \the [get_material_name()] from \the [src] before you can add anything else.</span>")
user << "<span class='warning'>You must weld or remove \the [repairing] from \the [src] before you can add anything else.</span>"
else else
repairing = stack.split(amount_needed) if(mats_given >= amount_given)
if (repairing) if(stack.use(amount_given))
repairing.loc = src repairing += amount_given
transfer = repairing.amount else
if(stack.use(mats_given))
if (transfer) repairing += mats_given
user << "<span class='notice'>You fit [transfer] [stack.singular_name]\s to damaged and broken parts on \the [src].</span>" amount_given = mats_given
if(amount_given)
to_chat(user, "<span class='notice'>You fit [amount_given] [stack.singular_name]\s to damaged and broken parts on \the [src].</span>")
return return
if(repairing && istype(I, /obj/item/weapon/weldingtool)) if(repairing && istype(I, /obj/item/weapon/weldingtool))
if(!density) if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>" to_chat(user, "<span class='warning'>\The [src] must be closed before you can repair it.</span>")
return return
var/obj/item/weapon/weldingtool/welder = I var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user)) if(welder.remove_fuel(0,user))
user << "<span class='notice'>You start to fix dents and weld \the [repairing] into place.</span>" to_chat(user, "<span class='notice'>You start to fix dents and weld \the [get_material_name()] into place.</span>")
playsound(src, welder.usesound, 50, 1) playsound(src, welder.usesound, 50, 1)
if(do_after(user, (5 * repairing.amount) * welder.toolspeed) && welder && welder.isOn()) if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn())
user << "<span class='notice'>You finish repairing the damage to \the [src].</span>" to_chat(user, "<span class='notice'>You finish repairing the damage to \the [src].</span>")
health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth) health = between(health, health + repairing*DOOR_REPAIR_AMOUNT, maxhealth)
update_icon() update_icon()
qdel(repairing) repairing = 0
repairing = null
return return
if(repairing && I.is_crowbar()) if(repairing && I.is_crowbar())
user << "<span class='notice'>You remove \the [repairing].</span>" var/obj/item/stack/material/repairing_sheet = get_material().place_sheet(loc)
repairing_sheet.amount += repairing-1
repairing = 0
to_chat(user, "<span class='notice'>You remove \the [repairing_sheet].</span>")
playsound(src, I.usesound, 100, 1) playsound(src, I.usesound, 100, 1)
repairing.loc = user.loc
repairing = null
return return
//psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them. //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) /obj/machinery/door/examine(mob/user)
. = ..() . = ..()
if(src.health <= 0) if(src.health <= 0)
user << "\The [src] is broken!" to_chat(user, "\The [src] is broken!")
if(src.health < src.maxhealth / 4) 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) 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) 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() /obj/machinery/door/proc/set_broken()

View File

@@ -3,7 +3,7 @@
D.fire_act(adj_air, adj_temp, adj_volume) D.fire_act(adj_air, adj_temp, adj_volume)
/obj/machinery/door /obj/machinery/door
var/obj/item/stack/material/plasteel/reinforcing //vorestation addition var/reinforcing = 0 //vorestation addition
/obj/machinery/door/firedoor /obj/machinery/door/firedoor
heat_proof = 1 heat_proof = 1
@@ -33,113 +33,68 @@
return ..() 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) /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(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel")
if(!heat_proof) if(heat_proof)
var/obj/item/stack/stack = I to_chat(user, "<span class='warning'>\The [src] is already reinforced.</span>")
var/transfer return TRUE
var/amount_needed = 2 if((stat & BROKEN) || (health < maxhealth))
if(stat & BROKEN) to_chat(user, "<span class='notice'>It looks like \the [src] broken. Repair it before reinforcing it.</span>")
user << "<span class='notice'>It looks like \the [src] is pretty busted.</span>" return TRUE
if (reinforcing) if(!density)
transfer = stack.transfer_to(reinforcing, amount_needed - reinforcing.amount) to_chat(user, "<span class='warning'>\The [src] must be closed before you can reinforce it.</span>")
if (!transfer) return TRUE
user << "<span class='warning'>You must weld or remove \the [reinforcing] from \the [src] before you can add anything else.</span>"
return 1 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, "<span class='warning'>You must weld or remove \the plasteel from \the [src] before you can add anything else.</span>")
else
if(mats_given >= amount_given)
if(stack.use(amount_given))
reinforcing += amount_given
else else
reinforcing = stack.split(amount_needed) if(stack.use(mats_given))
if (reinforcing) reinforcing += mats_given
reinforcing.loc = src amount_given = mats_given
transfer = reinforcing.amount if(amount_given)
to_chat(user, "<span class='notice'>You fit [amount_given] [stack.singular_name]\s on \the [src].</span>")
if (transfer)
user << "<span class='notice'>You fit [transfer] [stack.singular_name]\s to \the [src].</span>"
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 << "<span class='notice'>The [src] is about as shored up as it's going to get.</span>"
return 1
if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>"
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 << "<span class='warning'>You must weld or remove \the [repairing] from \the [src] before you can add anything else.</span>"
else
repairing = stack.split(amount_needed)
if (repairing)
repairing.loc = src
transfer = repairing.amount
if (transfer)
user << "<span class='notice'>\The [src] is completely broken inside, but you manage to fit [transfer] [stack.singular_name]\s to shore it up.</span>"
return 1
return 0
return TRUE
if(reinforcing && istype(I, /obj/item/weapon/weldingtool)) if(reinforcing && istype(I, /obj/item/weapon/weldingtool))
var/amount_needed = 2
if(!density) if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>" to_chat(user, "<span class='warning'>\The [src] must be closed before you can reinforce it.</span>")
return 1 return TRUE
if (reinforcing.amount < amount_needed)
user << "<span class='notice'>You need [amount_needed] [reinforcing.singular_name]\s to reinforce \the [src].</span>" if(reinforcing < 2)
return 1 to_chat(user, "<span class='warning'>You will need more plasteel to reinforce \the [src].</span>")
return TRUE
var/obj/item/weapon/weldingtool/welder = I var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user)) if(welder.remove_fuel(0,user))
user << "<span class='notice'>You start to weld \the [reinforcing] into place.</span>" to_chat(user, "<span class='notice'>You start weld \the plasteel into place.</span>")
playsound(src, 'sound/items/Welder.ogg', 100, 1) playsound(src, welder.usesound, 50, 1)
if(do_after(user, 5 * reinforcing.amount) && welder && welder.isOn()) if(do_after(user, 10 * welder.toolspeed) && welder && welder.isOn())
user << "<span class='notice'>You finish reinforcing \the [src].</span>" to_chat(user, "<span class='notice'>You finish reinforcing \the [src].</span>")
heat_proof = 1 heat_proof = 1
update_icon() update_icon()
qdel(reinforcing) reinforcing = 0
reinforcing = null return TRUE
return 1
if(repairing && istype(I, /obj/item/weapon/weldingtool) && (stat & BROKEN))
if(!density)
user << "<span class='warning'>\The [src] must be closed before you can shore it up.</span>"
return 1
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
user << "<span class='notice'>You start to weld \the [repairing] into place.</span>"
playsound(src, 'sound/items/Welder.ogg', 100, 1)
if(do_after(user, 5 * repairing.amount) && welder && welder.isOn())
user << "<span class='notice'>You finish shoring up \the [src]. It'll hold for at least a little while.</span>"
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
if(reinforcing && I.is_crowbar()) if(reinforcing && I.is_crowbar())
user << "<span class='notice'>You remove \the [reinforcing].</span>" var/obj/item/stack/material/plasteel/reinforcing_sheet = new /obj/item/stack/material/plasteel(src.loc)
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) reinforcing_sheet.amount = reinforcing
reinforcing.loc = user.loc reinforcing = 0
reinforcing = null to_chat(user, "<span class='notice'>You remove \the [reinforcing_sheet].</span>")
return 1 playsound(src, I.usesound, 100, 1)
return 0 return TRUE
return FALSE
/obj/machinery/door/blast/regular/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) /obj/machinery/door/blast/regular/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return // blast doors are immune to fire completely. return // blast doors are immune to fire completely.

View File

@@ -33,7 +33,7 @@
"secure" = program.memory["secure"] "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) if (!ui)
ui = new(user, src, ui_key, "advanced_airlock_console.tmpl", name, 470, 290) ui = new(user, src, ui_key, "advanced_airlock_console.tmpl", name, 470, 290)
@@ -89,7 +89,7 @@
"processing" = program.memory["processing"], "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) if (!ui)
ui = new(user, src, ui_key, "simple_airlock_console.tmpl", name, 470, 290) ui = new(user, src, ui_key, "simple_airlock_console.tmpl", name, 470, 290)
@@ -153,7 +153,7 @@
"processing" = program.memory["processing"] "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) if (!ui)
ui = new(user, src, ui_key, "door_access_console.tmpl", name, 330, 220) ui = new(user, src, ui_key, "door_access_console.tmpl", name, 330, 220)

View File

@@ -24,7 +24,7 @@
"override_enabled" = docking_program.override_enabled, "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) if (!ui)
ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290) ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)

View File

@@ -35,7 +35,7 @@
"airlocks" = airlocks, "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) if (!ui)
ui = new(user, src, ui_key, "multi_docking_console.tmpl", name, 470, 290) ui = new(user, src, ui_key, "multi_docking_console.tmpl", name, 470, 290)
@@ -73,7 +73,7 @@
"override_enabled" = airlock_program.override_enabled, "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) if (!ui)
ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290) ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)

View File

@@ -19,7 +19,7 @@
"door_lock" = docking_program.memory["door_status"]["lock"], "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) if (!ui)
ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290) ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290)

View File

@@ -123,7 +123,7 @@
// update the ui if it exists, returns null if no ui is passed/found // 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) if(!ui)
// the ui does not exist, so we'll create a new() one // 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 // 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) log_game(msg)
update_icon() update_icon()
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
add_fingerprint(usr) add_fingerprint(usr)
// Proc: get_exonet_node() // Proc: get_exonet_node()

View File

@@ -265,7 +265,7 @@
data["tracks"] = nano_tracks data["tracks"] = nano_tracks
// update the ui if it exists, returns null if no ui is passed/found // 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) if (!ui)
ui = new(user, src, ui_key, "jukebox.tmpl", title, 450, 600) ui = new(user, src, ui_key, "jukebox.tmpl", title, 450, 600)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -202,7 +202,7 @@
// update the ui if it exists, returns null if no ui is passed/found // 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) if (!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -280,7 +280,7 @@
recipies_ui[++recipies_ui.len] = list("name" = R.name, "type" = "[T]") recipies_ui[++recipies_ui.len] = list("name" = R.name, "type" = "[T]")
data["recipies"] = recipies_ui 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) if (!ui)
ui = new(user, src, ui_key, "partslathe.tmpl", "Parts Lathe UI", 500, 450) ui = new(user, src, ui_key, "partslathe.tmpl", "Parts Lathe UI", 500, 450)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -327,7 +327,7 @@
settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all) settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all)
data["settings"] = settings 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) if(!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -44,7 +44,7 @@ obj/machinery/recharger
if(E.self_recharge) if(E.self_recharge)
to_chat(user, "<span class='notice'>Your gun has no recharge port.</span>") to_chat(user, "<span class='notice'>Your gun has no recharge port.</span>")
return 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.") to_chat(user, "This device does not have a battery installed.")
return return

View File

@@ -127,7 +127,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["msgVerified"] = msgVerified data["msgVerified"] = msgVerified
data["announceAuth"] = announceAuth 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) if(!ui)
ui = new(user, src, ui_key, "request_console.tmpl", "[department] Request Console", 520, 410) ui = new(user, src, ui_key, "request_console.tmpl", "[department] Request Console", 520, 410)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -215,24 +215,23 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(computer_deconstruction_screwdriver(user, O)) if(computer_deconstruction_screwdriver(user, O))
return return
if(istype(O, /obj/item/device/multitool)) 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))
var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department)) if(!input)
if(!input) to_chat(usr, "No input found. Please hang up and try your call again.")
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 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(istype(O, /obj/item/weapon/card/id))
if(inoperable(MAINT)) return if(inoperable(MAINT)) return

View File

@@ -14,7 +14,7 @@
id = "[rand(1000, 9999)]" id = "[rand(1000, 9999)]"
..() ..()
underlays.Cut() 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 return
/obj/machinery/computer/teleporter/Initialize() /obj/machinery/computer/teleporter/Initialize()

View File

@@ -137,7 +137,7 @@
data["settings"] = settings 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) if(!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -169,7 +169,7 @@
vend(currently_vending, usr) vend(currently_vending, usr)
return return
else if(handled) else if(handled)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
return // don't smack that machine with your 2 thalers return // don't smack that machine with your 2 thalers
if(I || istype(W, /obj/item/weapon/spacecash)) if(I || istype(W, /obj/item/weapon/spacecash))
@@ -183,7 +183,7 @@
if(panel_open) if(panel_open)
overlays += image(icon, "[initial(icon_state)]-panel") 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 return
else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter()) else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter())
if(panel_open) if(panel_open)
@@ -195,7 +195,7 @@
coin = W coin = W
categories |= CAT_COIN categories |= CAT_COIN
to_chat(user, "<span class='notice'>You insert \the [W] into \the [src].</span>") to_chat(user, "<span class='notice'>You insert \the [W] into \the [src].</span>")
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
return return
else if(W.is_wrench()) else if(W.is_wrench())
playsound(src, W.usesound, 100, 1) playsound(src, W.usesound, 100, 1)
@@ -399,7 +399,7 @@
else else
data["panel"] = 0 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) if(!ui)
ui = new(user, src, ui_key, "vending_machine.tmpl", name, 440, 600) ui = new(user, src, ui_key, "vending_machine.tmpl", name, 440, 600)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -459,7 +459,7 @@
shut_up = !shut_up shut_up = !shut_up
add_fingerprint(usr) 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) /obj/machinery/vending/proc/vend(datum/stored_item/vending_product/R, mob/user)
if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
@@ -470,7 +470,7 @@
vend_ready = 0 //One thing at a time!! vend_ready = 0 //One thing at a time!!
status_message = "Vending..." status_message = "Vending..."
status_error = 0 status_error = 0
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
if(R.category & CAT_COIN) if(R.category & CAT_COIN)
if(!coin) if(!coin)
@@ -512,7 +512,7 @@
status_error = 0 status_error = 0
vend_ready = 1 vend_ready = 1
currently_vending = null currently_vending = null
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
return 1 return 1
@@ -568,7 +568,7 @@
if(has_logs) if(has_logs)
do_logging(R, user) do_logging(R, user)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
/obj/machinery/vending/process() /obj/machinery/vending/process()
if(stat & (BROKEN|NOPOWER)) if(stat & (BROKEN|NOPOWER))

View File

@@ -4,6 +4,10 @@
#define EQUIP_WEAPON 2 #define EQUIP_WEAPON 2
#define EQUIP_UTILITY 3 #define EQUIP_UTILITY 3
#define EQUIP_SPECIAL 4 #define EQUIP_SPECIAL 4
//VOREStation Addition begin: MICROMECHS
#define EQUIP_MICRO_UTILITY 5
#define EQUIP_MICRO_WEAPON 6
//VOREStation Addition end: MICROMECHS
/obj/item/mecha_parts/mecha_equipment /obj/item/mecha_parts/mecha_equipment
name = "mecha equipment" name = "mecha equipment"
@@ -64,6 +68,14 @@
if(equip_type == EQUIP_SPECIAL) if(equip_type == EQUIP_SPECIAL)
chassis.special_equipment -= src chassis.special_equipment -= src
listclearnulls(chassis.special_equipment) listclearnulls(chassis.special_equipment)
//VOREStation Addition begin: MICROMECHS
if(equip_type == EQUIP_MICRO_UTILITY)
chassis.micro_utility_equipment -= src
listclearnulls(chassis.micro_utility_equipment)
if(equip_type == EQUIP_MICRO_WEAPON)
chassis.micro_weapon_equipment -= src
listclearnulls(chassis.micro_weapon_equipment)
//VOREStation Addition end: MICROMECHS
chassis.universal_equipment -= src chassis.universal_equipment -= src
chassis.equipment -= src chassis.equipment -= src
listclearnulls(chassis.equipment) listclearnulls(chassis.equipment)
@@ -140,6 +152,12 @@
return 1 return 1
if(equip_type == EQUIP_SPECIAL && M.special_equipment.len < M.max_special_equip) if(equip_type == EQUIP_SPECIAL && M.special_equipment.len < M.max_special_equip)
return 1 return 1
//VOREStation Addition begin: MICROMECHS
if(equip_type == EQUIP_MICRO_UTILITY && M.micro_utility_equipment.len < M.max_micro_utility_equip)
return 1
if(equip_type == EQUIP_MICRO_WEAPON && M.micro_weapon_equipment.len < M.max_micro_weapon_equip)
return 1
//VOREStation Addition end: MICROMECHS
if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip) //The exosuit needs to be military grade to actually have a universal slot capable of accepting a true weapon. if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip) //The exosuit needs to be military grade to actually have a universal slot capable of accepting a true weapon.
if(equip_type == EQUIP_WEAPON && !istype(M, /obj/mecha/combat)) if(equip_type == EQUIP_WEAPON && !istype(M, /obj/mecha/combat))
return 0 return 0
@@ -168,6 +186,14 @@
if(equip_type == EQUIP_SPECIAL && M.special_equipment.len < M.max_special_equip && !has_equipped) if(equip_type == EQUIP_SPECIAL && M.special_equipment.len < M.max_special_equip && !has_equipped)
M.special_equipment += src M.special_equipment += src
has_equipped = 1 has_equipped = 1
//VOREStation Addition begin: MICROMECHS
if(equip_type == EQUIP_MICRO_UTILITY && M.micro_utility_equipment.len < M.max_micro_utility_equip && !has_equipped)
M.micro_utility_equipment += src
has_equipped = 1
if(equip_type == EQUIP_MICRO_WEAPON && M.micro_weapon_equipment.len < M.max_micro_weapon_equip && !has_equipped)
M.micro_weapon_equipment += src
has_equipped = 1
//VOREStation Addition end: MICROMECHS
if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip && !has_equipped) if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip && !has_equipped)
M.universal_equipment += src M.universal_equipment += src
M.equipment += src M.equipment += src
@@ -194,6 +220,12 @@
chassis.utility_equipment -= src chassis.utility_equipment -= src
if(EQUIP_SPECIAL) if(EQUIP_SPECIAL)
chassis.special_equipment -= src chassis.special_equipment -= src
//VOREStation Addition begin: MICROMECHS
if(EQUIP_UTILITY)
chassis.micro_utility_equipment -= src
if(EQUIP_SPECIAL)
chassis.micro_weapon_equipment -= src
//VOREStation Addition end: MICROMECHS
if(chassis.selected == src) if(chassis.selected == src)
chassis.selected = null chassis.selected = null
update_chassis_page() update_chassis_page()

View File

@@ -13,7 +13,8 @@
var/speed = 1 var/speed = 1
var/mat_efficiency = 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/res_max_amount = 200000
var/datum/research/files var/datum/research/files
@@ -75,7 +76,7 @@
var/T = 0 var/T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating 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 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 T += M.rating
speed = T / 2 // 1 -> 3 speed = T / 2 // 1 -> 3
@@ -103,7 +104,7 @@
if(current) if(current)
data["builtperc"] = round((progress / current.time) * 100) 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) if(!ui)
ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600) ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -273,7 +274,13 @@
/obj/machinery/mecha_part_fabricator/proc/get_materials() /obj/machinery/mecha_part_fabricator/proc/get_materials()
. = list() . = list()
for(var/T in materials) 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 /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 var/recursive = amount == -1 ? 1 : 0

View File

@@ -13,7 +13,8 @@
var/speed = 1 var/speed = 1
var/mat_efficiency = 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/res_max_amount = 200000
var/datum/research/files var/datum/research/files
@@ -77,7 +78,7 @@
var/T = 0 var/T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating 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 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 T += M.rating
speed = T / 2 // 1 -> 3 speed = T / 2 // 1 -> 3
@@ -113,7 +114,7 @@
if(current) if(current)
data["builtperc"] = round((progress / current.time) * 100) 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) if(!ui)
ui = new(user, src, ui_key, "mechfab.tmpl", "Prosthetics Fab UI", 800, 600) ui = new(user, src, ui_key, "mechfab.tmpl", "Prosthetics Fab UI", 800, 600)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -299,7 +300,13 @@
/obj/machinery/pros_fabricator/proc/get_materials() /obj/machinery/pros_fabricator/proc/get_materials()
. = list() . = list()
for(var/T in materials) 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 /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 var/recursive = amount == -1 ? 1 : 0

View File

@@ -1,3 +1,11 @@
/obj/mecha
var/max_micro_utility_equip = 0
var/max_micro_weapon_equip = 0
var/list/micro_utility_equipment = new
var/list/micro_weapon_equipment = new
/obj/mecha/micro /obj/mecha/micro
icon = 'icons/mecha/micro.dmi' icon = 'icons/mecha/micro.dmi'
force = 10 //still a robot force = 10 //still a robot
@@ -9,6 +17,13 @@
var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall) var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall)
internal_damage_threshold = 50 internal_damage_threshold = 50
maint_access = 0 maint_access = 0
max_hull_equip = 1
max_weapon_equip = 0
max_utility_equip = 0
max_universal_equip = 0
max_special_equip = 1
max_micro_utility_equip = 1
max_micro_weapon_equip = 1
//add_req_access = 0 //add_req_access = 0
//operation_req_access = list(access_hos) //operation_req_access = list(access_hos)
damage_absorption = list("brute"=1,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1) damage_absorption = list("brute"=1,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)

View File

@@ -14,6 +14,7 @@
energy_drain = 50 energy_drain = 50
projectile = /obj/item/projectile/beam projectile = /obj/item/projectile/beam
fire_sound = 'sound/weapons/Laser.ogg' fire_sound = 'sound/weapons/Laser.ogg'
equip_type = EQUIP_MICRO_WEAPON
required_type = list(/obj/mecha/micro/sec) required_type = list(/obj/mecha/micro/sec)
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy
@@ -26,6 +27,7 @@
energy_drain = 120 energy_drain = 120
projectile = /obj/item/projectile/beam/heavylaser projectile = /obj/item/projectile/beam/heavylaser
fire_sound = 'sound/weapons/lasercannonfire.ogg' fire_sound = 'sound/weapons/lasercannonfire.ogg'
equip_type = EQUIP_MICRO_WEAPON
required_type = list(/obj/mecha/micro/sec) required_type = list(/obj/mecha/micro/sec)
/obj/item/mecha_parts/mecha_equipment/weapon/energy/microtaser /obj/item/mecha_parts/mecha_equipment/weapon/energy/microtaser
@@ -38,6 +40,7 @@
equip_cooldown = 10 equip_cooldown = 10
projectile = /obj/item/projectile/beam/stun projectile = /obj/item/projectile/beam/stun
fire_sound = 'sound/weapons/Taser.ogg' fire_sound = 'sound/weapons/Taser.ogg'
equip_type = EQUIP_MICRO_WEAPON
required_type = list(/obj/mecha/micro/sec) required_type = list(/obj/mecha/micro/sec)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun
@@ -55,6 +58,7 @@
projectiles_per_shot = 1 projectiles_per_shot = 1
deviation = 0.7 deviation = 0.7
projectile_energy_cost = 100 projectile_energy_cost = 100
equip_type = EQUIP_MICRO_WEAPON
required_type = list(/obj/mecha/micro/sec) required_type = list(/obj/mecha/micro/sec)
Topic(href,href_list) Topic(href,href_list)
@@ -89,6 +93,7 @@
projectile_energy_cost = 800 projectile_energy_cost = 800
equip_cooldown = 30 equip_cooldown = 30
det_time = 15 det_time = 15
equip_type = EQUIP_MICRO_WEAPON
required_type = list(/obj/mecha/micro/sec) required_type = list(/obj/mecha/micro/sec)
@@ -105,6 +110,7 @@
equip_cooldown = 30 equip_cooldown = 30
energy_drain = 10 energy_drain = 10
force = 15 force = 15
equip_type = EQUIP_MICRO_UTILITY
required_type = list(/obj/mecha/micro/utility) required_type = list(/obj/mecha/micro/utility)
action(atom/target) action(atom/target)
@@ -155,6 +161,7 @@
icon_state = "microscoop" icon_state = "microscoop"
equip_cooldown = 5 equip_cooldown = 5
energy_drain = 0 energy_drain = 0
equip_type = EQUIP_MICRO_UTILITY
required_type = list(/obj/mecha/micro/utility) required_type = list(/obj/mecha/micro/utility)
var/orecapacity = 500 var/orecapacity = 500

View File

@@ -30,6 +30,8 @@
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/polecat wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/polecat
internal_damage_threshold = 35 internal_damage_threshold = 35
max_equip = 3 max_equip = 3
max_micro_utility_equip = 0
max_micro_weapon_equip = 3
/obj/effect/decal/mecha_wreckage/micro/sec/polecat /obj/effect/decal/mecha_wreckage/micro/sec/polecat
name = "Polecat wreckage" name = "Polecat wreckage"
@@ -52,6 +54,8 @@
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/weasel wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/weasel
internal_damage_threshold = 20 internal_damage_threshold = 20
max_equip = 2 max_equip = 2
max_micro_utility_equip = 0
max_micro_weapon_equip = 2
/obj/effect/decal/mecha_wreckage/micro/sec/weasel /obj/effect/decal/mecha_wreckage/micro/sec/weasel
name = "Weasel wreckage" name = "Weasel wreckage"

View File

@@ -16,6 +16,8 @@
var/overload_coeff = 2 var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/micro/utility/gopher wreckage = /obj/effect/decal/mecha_wreckage/micro/utility/gopher
internal_damage_threshold = 35 internal_damage_threshold = 35
max_micro_utility_equip = 2
max_micro_weapon_equip = 0
max_equip = 2 max_equip = 2
/obj/effect/decal/mecha_wreckage/micro/utility/gopher /obj/effect/decal/mecha_wreckage/micro/utility/gopher

View File

@@ -13,18 +13,24 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
anchored = 1.0 anchored = 1.0
/obj/effect/portal/Bumped(mob/M as mob|obj) /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) spawn(0)
src.teleport(M) src.teleport(M)
return return
return return
/obj/effect/portal/Crossed(AM as mob|obj) /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) spawn(0)
src.teleport(AM) src.teleport(AM)
return return
return return
/obj/effect/portal/attack_hand(mob/user as mob) /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) spawn(0)
src.teleport(user) src.teleport(user)
return return

View File

@@ -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) /obj/item/device/pda/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui_tick++ 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 var/auto_update = 1
if(mode in no_auto_update) if(mode in no_auto_update)
auto_update = 0 auto_update = 0
@@ -647,7 +647,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
nanoUI = data nanoUI = data
// update the ui if it exists, returns null if no ui is passed/found // 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) if (!ui)
// the ui does not exist, so we'll create a new() one // 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/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 var/mob/living/U = usr
//Looking for master was kind of pointless since PDAs don't appear to have one. //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) ) ) //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("<i>Intercepted message from <b>[who]</b>: [t]</i>") ai.show_message("<i>Intercepted message from <b>[who]</b>: [t]</i>")
P.new_message_from_pda(src, 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 else
to_chat(U, "<span class='notice'>ERROR: Messaging server is not responding.</span>") to_chat(U, "<span class='notice'>ERROR: Messaging server is not responding.</span>")
@@ -1150,7 +1150,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(L) if(L)
if(reception_message) if(reception_message)
L << 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) /obj/item/device/pda/proc/new_news(var/message)
new_info(news_silent, newstone, news_silent ? "" : "\icon[src] <b>[message]</b>") new_info(news_silent, newstone, news_silent ? "" : "\icon[src] <b>[message]</b>")
@@ -1196,7 +1196,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(can_use(usr)) if(can_use(usr))
mode = 0 mode = 0
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
to_chat(usr, "<span class='notice'>You press the reset button on \the [src].</span>") to_chat(usr, "<span class='notice'>You press the reset button on \the [src].</span>")
else else
to_chat(usr, "<span class='notice'>You cannot do this while restrained.</span>") to_chat(usr, "<span class='notice'>You cannot do this while restrained.</span>")
@@ -1297,7 +1297,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
user.drop_item() user.drop_item()
cartridge.loc = src cartridge.loc = src
to_chat(usr, "<span class='notice'>You insert [cartridge] into [src].</span>") to_chat(usr, "<span class='notice'>You insert [cartridge] into [src].</span>")
GLOB.nanomanager.update_uis(src) // update all UIs attached to src SSnanoui.update_uis(src) // update all UIs attached to src
if(cartridge.radio) if(cartridge.radio)
cartridge.radio.hostpda = src cartridge.radio.hostpda = src
@@ -1325,7 +1325,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
C.loc = src C.loc = src
pai = C pai = C
to_chat(user, "<span class='notice'>You slot \the [C] into \the [src].</span>") to_chat(user, "<span class='notice'>You slot \the [C] into \the [src].</span>")
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)) else if(istype(C, /obj/item/weapon/pen))
var/obj/item/weapon/pen/O = locate() in src var/obj/item/weapon/pen/O = locate() in src
if(O) if(O)

View File

@@ -43,7 +43,7 @@
data["laws"] = laws data["laws"] = laws
data["has_laws"] = laws.len 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) if (!ui)
ui = new(user, src, ui_key, "aicard.tmpl", "[name]", 600, 400, state = state) ui = new(user, src, ui_key, "aicard.tmpl", "[name]", 600, 400, state = state)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -125,7 +125,7 @@
// The value element is the actual data, and can take any form necessary for the template // 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 // 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) if(!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
@@ -261,7 +261,7 @@
notehtml = note notehtml = note
if(href_list["switch_template"]) 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) if(ui)
ui.add_template("Body", href_list["switch_template"]) 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 if(href_list["cartridge_topic"] && cartridge) // Has to have a cartridge to perform these functions
cartridge.Topic(href, href_list) cartridge.Topic(href, href_list)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
add_fingerprint(usr) add_fingerprint(usr)

View File

@@ -234,7 +234,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
cartridge.forceMove(src) cartridge.forceMove(src)
to_chat(usr, "<span class='notice'>You slot \the [cartridge] into \the [src].</span>") to_chat(usr, "<span class='notice'>You slot \the [cartridge] into \the [src].</span>")
modules[++modules.len] = list("module" = "External Device", "icon" = "external64", "number" = EXTRTAB) 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 return
// Proc: attack_self() // Proc: attack_self()

View File

@@ -121,7 +121,7 @@ var/global/list/default_medbay_channels = list(
if(syndie) if(syndie)
data["useSyndMode"] = 1 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) if(!ui)
ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430) ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -232,7 +232,7 @@ var/global/list/default_medbay_channels = list(
return 1 return 1
if(.) if(.)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT /obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT
var/datum/radio_frequency/connection = null var/datum/radio_frequency/connection = null
@@ -724,7 +724,7 @@ var/global/list/default_medbay_channels = list(
. = 1 . = 1
if(.) if(.)
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
/obj/item/device/radio/borg/interact(mob/user as mob) /obj/item/device/radio/borg/interact(mob/user as mob)
if(!on) if(!on)
@@ -753,7 +753,7 @@ var/global/list/default_medbay_channels = list(
data["has_subspace"] = 1 data["has_subspace"] = 1
data["subspace"] = subspace_transmission 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) if(!ui)
ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430) ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430)
ui.set_initial_data(data) ui.set_initial_data(data)

View File

@@ -22,8 +22,9 @@
name = "subspace radio" 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." 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 = 'icons/vore/custom_items_vr.dmi'
icon_override = 'icons/mob/back_vr.dmi'
icon_state = "radiopack" icon_state = "radiopack"
item_state = "parachute" item_state = "radiopack"
slot_flags = SLOT_BACK slot_flags = SLOT_BACK
force = 5 force = 5
throwforce = 6 throwforce = 6

View File

@@ -37,7 +37,7 @@
log_game("[key_name_admin(user)] attached both tanks to a transfer valve.") log_game("[key_name_admin(user)] attached both tanks to a transfer valve.")
update_icon() 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 //TODO: Have this take an assemblyholder
else if(isassembly(item)) else if(isassembly(item))
var/obj/item/device/assembly/A = 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. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)") message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
attacher = user attacher = user
GLOB.nanomanager.update_uis(src) // update all UIs attached to src SSnanoui.update_uis(src) // update all UIs attached to src
return return
@@ -81,7 +81,7 @@
data["valveOpen"] = valve_open ? 1 : 0 data["valveOpen"] = valve_open ? 1 : 0
// update the ui if it exists, returns null if no ui is passed/found // 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) if (!ui)
// the ui does not exist, so we'll create a new() one // 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 // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm

View File

@@ -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) 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 next_offer_time = world.time + offer_time
update_nano_data() 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. // 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() /obj/item/device/uplink/hidden/proc/toggle()
@@ -110,7 +110,7 @@
data += nanoui_data data += nanoui_data
// update the ui if it exists, returns null if no ui is passed/found // 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 if (!ui) // No auto-refresh
ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600, state = inventory_state) ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600, state = inventory_state)
data["menu"] = 0 data["menu"] = 0
@@ -138,7 +138,7 @@
UI.buy(src, usr) UI.buy(src, usr)
else if(href_list["lock"]) else if(href_list["lock"])
toggle() 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() ui.close()
else if(href_list["return"]) else if(href_list["return"])
nanoui_menu = round(nanoui_menu/10) nanoui_menu = round(nanoui_menu/10)

View File

@@ -9,3 +9,21 @@
return 1 return 1
else else
return 0 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

View File

@@ -197,6 +197,7 @@
board_type = new /datum/frame/frame_types/medical_pod board_type = new /datum/frame/frame_types/medical_pod
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
req_components = list( req_components = list(
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/scanning_module = 1, /obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/reagent_containers/glass/beaker = 3, /obj/item/weapon/reagent_containers/glass/beaker = 3,
/obj/item/weapon/reagent_containers/syringe = 3, /obj/item/weapon/reagent_containers/syringe = 3,

View File

@@ -79,5 +79,28 @@
name = T_BOARD_MECHA("Odysseus central control") name = T_BOARD_MECHA("Odysseus central control")
icon_state = "mainboard" 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 <span class='alien'>strange glyph</span>."
/obj/item/weapon/circuitboard/mecha/imperion/peripherals
desc = "It is marked with a <span class='alien'>pulsing glyph</span>."
/obj/item/weapon/circuitboard/mecha/imperion/targeting
desc = "It is marked with an <span class='alien'>ominous glyph</span>."
/obj/item/weapon/circuitboard/mecha/imperion/phasing
desc = "It is marked with a <span class='alien'>disturbing glyph</span>."
/obj/item/weapon/circuitboard/mecha/imperion/damaged
name = "Damaged Alien Circuit"
desc = "It is marked with a <span class='alien'>constantly shifting glyph</span>."
origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 1, TECH_PRECURSOR = 2)
//Undef the macro, shouldn't be needed anywhere else //Undef the macro, shouldn't be needed anywhere else
#undef T_BOARD_MECHA #undef T_BOARD_MECHA

View File

@@ -58,7 +58,7 @@
data["electronic_warfare"] = electronic_warfare data["electronic_warfare"] = electronic_warfare
data["entries"] = entries 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) if (!ui)
ui = new(user, src, ui_key, "agent_id_card.tmpl", "Fake ID", 600, 400) ui = new(user, src, ui_key, "agent_id_card.tmpl", "Fake ID", 600, 400)
ui.set_initial_data(data) ui.set_initial_data(data)
@@ -185,7 +185,7 @@
. = 1 . = 1
// Always update the UI, or buttons will spin indefinitely // Always update the UI, or buttons will spin indefinitely
GLOB.nanomanager.update_uis(src) SSnanoui.update_uis(src)
/var/global/list/id_card_states /var/global/list/id_card_states
/proc/id_card_states() /proc/id_card_states()

Some files were not shown because too many files have changed in this diff Show More