mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-27 23:29:10 +01:00
Merge branch 'kbraid.edit/additions' of https://github.com/KBraid/YWPolarisVore into kbraid.edit/additions
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
# This list auto requests reviews from the specified org members
|
||||
# when a PR that modifies the file in question is opened
|
||||
# This list is alphabetized by User -> Filename KEEP IT THAT WAY
|
||||
# In the event that multiple org members are to be informed of changes
|
||||
# to the same file or dir, add them to the end under Multiple Owners
|
||||
|
||||
# ShadowLarkens
|
||||
/code/__DEFINES/tgui.dm @ShadowLarkens
|
||||
/code/controllers/subsystem/tgui.dm @ShadowLarkens
|
||||
/code/modules/tgui @ShadowLarkens
|
||||
/tgui @ShadowLarkens
|
||||
@@ -103,7 +103,7 @@
|
||||
if(ATM_P)
|
||||
return "phoron"
|
||||
if(ATM_N2O)
|
||||
return "sleeping_agent"
|
||||
return "nitrous_oxide"
|
||||
else
|
||||
return null
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
1: Oxygen: Oxygen ONLY
|
||||
2: Nitrogen: Nitrogen ONLY
|
||||
3: Carbon Dioxide: Carbon Dioxide ONLY
|
||||
4: Sleeping Agent (N2O)
|
||||
4: Nitrous Oxide (Formerly called Sleeping Agent) (N2O)
|
||||
*/
|
||||
var/filter_type = -1
|
||||
var/list/filtered_out = list()
|
||||
@@ -51,7 +51,7 @@
|
||||
if(3) //removing CO2
|
||||
filtered_out = list("carbon_dioxide")
|
||||
if(4)//removing N2O
|
||||
filtered_out = list("sleeping_agent")
|
||||
filtered_out = list("nitrous_oxide")
|
||||
|
||||
air1.volume = ATMOS_DEFAULT_VOLUME_FILTER
|
||||
air2.volume = ATMOS_DEFAULT_VOLUME_FILTER
|
||||
@@ -216,7 +216,7 @@
|
||||
if(3) //removing CO2
|
||||
filtered_out += "carbon_dioxide"
|
||||
if(4)//removing N2O
|
||||
filtered_out += "sleeping_agent"
|
||||
filtered_out += "nitrous_oxide"
|
||||
|
||||
add_fingerprint(usr)
|
||||
update_icon()
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
"filter_n2" = ("nitrogen" in scrubbing_gas),
|
||||
"filter_co2" = ("carbon_dioxide" in scrubbing_gas),
|
||||
"filter_phoron" = ("phoron" in scrubbing_gas),
|
||||
"filter_n2o" = ("sleeping_agent" in scrubbing_gas),
|
||||
"filter_n2o" = ("nitrous_oxide" in scrubbing_gas),
|
||||
"filter_fuel" = ("volatile_fuel" in scrubbing_gas),
|
||||
"sigtype" = "status"
|
||||
)
|
||||
@@ -230,10 +230,10 @@
|
||||
else if(signal.data["toggle_tox_scrub"])
|
||||
toggle += "phoron"
|
||||
|
||||
if(!isnull(signal.data["n2o_scrub"]) && text2num(signal.data["n2o_scrub"]) != ("sleeping_agent" in scrubbing_gas))
|
||||
toggle += "sleeping_agent"
|
||||
if(!isnull(signal.data["n2o_scrub"]) && text2num(signal.data["n2o_scrub"]) != ("nitrous_oxide" in scrubbing_gas))
|
||||
toggle += "nitrous_oxide"
|
||||
else if(signal.data["toggle_n2o_scrub"])
|
||||
toggle += "sleeping_agent"
|
||||
toggle += "nitrous_oxide"
|
||||
|
||||
if(!isnull(signal.data["fuel_scrub"]) && text2num(signal.data["fuel_scrub"]) != ("volatile_fuel" in scrubbing_gas))
|
||||
toggle += "volatile_fuel"
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
air_temporary.volume = volume
|
||||
air_temporary.temperature = T0C
|
||||
|
||||
air_temporary.adjust_gas("sleeping_agent", (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
|
||||
air_temporary.adjust_gas("nitrous_oxide", (start_pressure)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature))
|
||||
|
||||
..()
|
||||
icon_state = "n2o"
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/// Module is compatible with Security Cyborg models
|
||||
#define BORG_MODULE_SECURITY (1<<0)
|
||||
/// Module is compatible with Miner Cyborg models
|
||||
#define BORG_MODULE_MINER (1<<1)
|
||||
/// Module is compatible with Janitor Cyborg models
|
||||
#define BORG_MODULE_JANITOR (1<<2)
|
||||
/// Module is compatible with Medical Cyborg models
|
||||
#define BORG_MODULE_MEDICAL (1<<3)
|
||||
/// Module is compatible with Engineering Cyborg models
|
||||
#define BORG_MODULE_ENGINEERING (1<<4)
|
||||
|
||||
/// Module is compatible with Ripley Exosuit models
|
||||
#define EXOSUIT_MODULE_RIPLEY (1<<0)
|
||||
/// Module is compatible with Odyseeus Exosuit models
|
||||
#define EXOSUIT_MODULE_ODYSSEUS (1<<1)
|
||||
/// Module is compatible with Gygax Exosuit models
|
||||
#define EXOSUIT_MODULE_GYGAX (1<<2)
|
||||
/// Module is compatible with Durand Exosuit models
|
||||
#define EXOSUIT_MODULE_DURAND (1<<3)
|
||||
/// Module is compatible with Phazon Exosuit models
|
||||
#define EXOSUIT_MODULE_PHAZON (1<<4)
|
||||
|
||||
/// Module is compatible with "Working" Exosuit models - Ripley
|
||||
#define EXOSUIT_MODULE_WORKING EXOSUIT_MODULE_RIPLEY
|
||||
/// Module is compatible with "Combat" Exosuit models - Gygax, Durand and Phazon
|
||||
#define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON
|
||||
/// Module is compatible with "Medical" Exosuit modelsm - Odysseus
|
||||
#define EXOSUIT_MODULE_MEDICAL EXOSUIT_MODULE_ODYSSEUS
|
||||
@@ -463,10 +463,13 @@ GLOBAL_LIST_EMPTY(##LIST_NAME);\
|
||||
|
||||
#define FONT_GIANT(X) "<font size='5'>[X]</font>"
|
||||
|
||||
// Volume Channel Defines
|
||||
|
||||
#define VOLUME_CHANNEL_MASTER "Master"
|
||||
#define VOLUME_CHANNEL_AMBIENCE "Ambience"
|
||||
#define VOLUME_CHANNEL_ALARMS "Alarms"
|
||||
#define VOLUME_CHANNEL_VORE "Vore"
|
||||
#define VOLUME_CHANNEL_DOORS "Doors"
|
||||
|
||||
// Make sure you update this or clients won't be able to adjust the channel
|
||||
GLOBAL_LIST_INIT(all_volume_channels, list(
|
||||
@@ -474,4 +477,5 @@ GLOBAL_LIST_INIT(all_volume_channels, list(
|
||||
VOLUME_CHANNEL_AMBIENCE,
|
||||
VOLUME_CHANNEL_ALARMS,
|
||||
VOLUME_CHANNEL_VORE,
|
||||
VOLUME_CHANNEL_DOORS,
|
||||
))
|
||||
+20
-21
@@ -1,21 +1,20 @@
|
||||
#define SHEET_MATERIAL_AMOUNT 2000
|
||||
|
||||
#define TECH_MATERIAL "materials"
|
||||
#define TECH_ENGINEERING "engineering"
|
||||
#define TECH_PHORON "phorontech"
|
||||
#define TECH_POWER "powerstorage"
|
||||
#define TECH_BLUESPACE "bluespace"
|
||||
#define TECH_BIO "biotech"
|
||||
#define TECH_COMBAT "combat"
|
||||
#define TECH_MAGNET "magnets"
|
||||
#define TECH_DATA "programming"
|
||||
#define TECH_ILLEGAL "syndicate"
|
||||
#define TECH_ARCANE "arcane"
|
||||
#define TECH_PRECURSOR "precursor"
|
||||
|
||||
#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals.
|
||||
#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals
|
||||
#define MECHFAB 0x0004 //Mechfab
|
||||
#define CHASSIS 0x0008 //For protolathe, but differently
|
||||
#define PROSFAB 0x0010 //For prosthetics fab
|
||||
#define AUTOLATHE 32 //YW add, for autolathe
|
||||
#define SHEET_MATERIAL_AMOUNT 2000
|
||||
|
||||
#define TECH_MATERIAL "materials"
|
||||
#define TECH_ENGINEERING "engineering"
|
||||
#define TECH_PHORON "phorontech"
|
||||
#define TECH_POWER "powerstorage"
|
||||
#define TECH_BLUESPACE "bluespace"
|
||||
#define TECH_BIO "biotech"
|
||||
#define TECH_COMBAT "combat"
|
||||
#define TECH_MAGNET "magnets"
|
||||
#define TECH_DATA "programming"
|
||||
#define TECH_ILLEGAL "syndicate"
|
||||
#define TECH_ARCANE "arcane"
|
||||
#define TECH_PRECURSOR "precursor"
|
||||
|
||||
#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals.
|
||||
#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals
|
||||
#define MECHFAB 0x0004 //Mechfab
|
||||
#define CHASSIS 0x0008 //For protolathe, but differently
|
||||
#define PROSFAB 0x0010 //For prosthetics fab
|
||||
+47
-6
@@ -70,7 +70,9 @@
|
||||
// Restricted, military, or mercenary aligned locations like the armory, the merc ship/base, BSD, etc.
|
||||
#define AMBIENCE_HIGHSEC list(\
|
||||
'sound/ambience/highsec/highsec1.ogg',\
|
||||
'sound/ambience/highsec/highsec2.ogg'\
|
||||
'sound/ambience/highsec/highsec2.ogg',\
|
||||
'sound/ambience/highsec/highsec3.ogg',\
|
||||
'sound/ambience/highsec/highsec4.ogg'\
|
||||
)
|
||||
|
||||
// Ruined structures found on the surface or in the caves.
|
||||
@@ -108,14 +110,19 @@
|
||||
#define AMBIENCE_GENERIC list(\
|
||||
'sound/ambience/generic/generic1.ogg',\
|
||||
'sound/ambience/generic/generic2.ogg',\
|
||||
'sound/ambience/generic/generic3.ogg',\
|
||||
'sound/ambience/generic/generic4.ogg'\
|
||||
'sound/ambience/generic/generic3.ogg'\
|
||||
)
|
||||
// 'sound/ambience/generic/generic4.ogg'\ // VOREStation Edit: Comment out entry 4 as this doesn't fit on Virgo, and we have our own weather system.
|
||||
|
||||
// Sounds of PA announcements, presumably involving shuttles?
|
||||
#define AMBIENCE_ARRIVALS list(\
|
||||
'sound/ambience/arrivals/arrivals1.ogg',\
|
||||
'sound/ambience/arrivals/arrivals2.ogg'\
|
||||
'sound/ambience/arrivals/arrivals2.ogg',\
|
||||
'sound/ambience/arrivals/arrivals3.ogg',\
|
||||
'sound/ambience/arrivals/arrivals4.ogg',\
|
||||
'sound/ambience/arrivals/arrivals5.ogg',\
|
||||
'sound/ambience/arrivals/arrivals6.ogg',\
|
||||
'sound/ambience/arrivals/arrivals7.ogg'\
|
||||
)
|
||||
|
||||
// Sounds suitable for being inside dark, tight corridors in the underbelly of the station.
|
||||
@@ -124,7 +131,11 @@
|
||||
'sound/ambience/maintenance/maintenance2.ogg',\
|
||||
'sound/ambience/maintenance/maintenance3.ogg',\
|
||||
'sound/ambience/maintenance/maintenance4.ogg',\
|
||||
'sound/ambience/maintenance/maintenance5.ogg'\
|
||||
'sound/ambience/maintenance/maintenance5.ogg',\
|
||||
'sound/ambience/maintenance/maintenance6.ogg',\
|
||||
'sound/ambience/maintenance/maintenance7.ogg',\
|
||||
'sound/ambience/maintenance/maintenance8.ogg',\
|
||||
'sound/ambience/maintenance/maintenance9.ogg'\
|
||||
)
|
||||
|
||||
// Life support machinery at work, keeping everyone breathing.
|
||||
@@ -136,7 +147,9 @@
|
||||
|
||||
// Creepy AI/borg stuff.
|
||||
#define AMBIENCE_AI list(\
|
||||
'sound/ambience/ai/ai1.ogg'\
|
||||
'sound/ambience/ai/ai1.ogg',\
|
||||
'sound/ambience/ai/ai2.ogg',\
|
||||
'sound/ambience/ai/ai3.ogg'\
|
||||
)
|
||||
|
||||
// Peaceful sounds when floating in the void.
|
||||
@@ -179,4 +192,32 @@
|
||||
// For the memes.
|
||||
#define AMBIENCE_AESTHETIC list(\
|
||||
'sound/ambience/vaporwave.ogg'\
|
||||
)
|
||||
|
||||
#define AMBIENCE_OUTPOST list(\
|
||||
'sound/ambience/expoutpost/expoutpost1.ogg',\
|
||||
'sound/ambience/expoutpost/expoutpost2.ogg',\
|
||||
'sound/ambience/expoutpost/expoutpost3.ogg',\
|
||||
'sound/ambience/expoutpost/expoutpost4.ogg'\
|
||||
)
|
||||
|
||||
#define AMBIENCE_SUBSTATION list(\
|
||||
'sound/ambience/substation/substation1.ogg',\
|
||||
'sound/ambience/substation/substation2.ogg'\
|
||||
)
|
||||
|
||||
#define AMBIENCE_HANGAR list(\
|
||||
'sound/ambience/hangar/hangar1.ogg',\
|
||||
'sound/ambience/hangar/hangar2.ogg',\
|
||||
'sound/ambience/hangar/hangar3.ogg',\
|
||||
'sound/ambience/hangar/hangar4.ogg',\
|
||||
'sound/ambience/hangar/hangar5.ogg',\
|
||||
'sound/ambience/hangar/hangar6.ogg'\
|
||||
)
|
||||
|
||||
#define AMBIENCE_ATMOS list(\
|
||||
'sound/ambience/engineering/engineering1.ogg',\
|
||||
'sound/ambience/engineering/engineering2.ogg',\
|
||||
'sound/ambience/engineering/engineering3.ogg',\
|
||||
'sound/ambience/atmospherics/atmospherics1.ogg'\
|
||||
)
|
||||
@@ -49,7 +49,9 @@
|
||||
#define LANGUAGE_SIIK "Siik"
|
||||
#define LANGUAGE_SKRELLIAN "Common Skrellian"
|
||||
#define LANGUAGE_TRADEBAND "Tradeband"
|
||||
#define LANGUAGE_GUTTER "Gutter"
|
||||
//VOREStation edit 08/23/20
|
||||
#define LANGUAGE_GUTTER "Gutterband"
|
||||
//VS edit end
|
||||
#define LANGUAGE_SIGN "Sign Language"
|
||||
#define LANGUAGE_SCHECHI "Schechi"
|
||||
#define LANGUAGE_ROOTLOCAL "Local Rootspeak"
|
||||
|
||||
@@ -57,6 +57,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define INIT_ORDER_SKYBOX 30
|
||||
#define INIT_ORDER_MAPPING 25
|
||||
#define INIT_ORDER_DECALS 20
|
||||
#define INIT_ORDER_PLANTS 18 // Must initialize before atoms.
|
||||
#define INIT_ORDER_JOB 17
|
||||
#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
|
||||
#define INIT_ORDER_ATOMS 15
|
||||
@@ -87,6 +88,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define FIRE_PRIORITY_SHUTTLES 5
|
||||
#define FIRE_PRIORITY_SUPPLY 5
|
||||
#define FIRE_PRIORITY_NIGHTSHIFT 5
|
||||
#define FIRE_PRIORITY_PLANTS 5
|
||||
#define FIRE_PRIORITY_ORBIT 8
|
||||
#define FIRE_PRIORITY_VOTE 9
|
||||
#define FIRE_PRIORITY_AI 10
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#define DIGSITE_TECHNICAL 4
|
||||
#define DIGSITE_TEMPLE 5
|
||||
#define DIGSITE_WAR 6
|
||||
#define DIGSITE_MIDDEN 7
|
||||
|
||||
#define EFFECT_TOUCH 0
|
||||
#define EFFECT_AURA 1
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
clear_fullscreen(category, FALSE)
|
||||
screen = null
|
||||
else if(!severity || severity == screen.severity)
|
||||
return null
|
||||
return screen
|
||||
|
||||
if(!screen)
|
||||
screen = new type()
|
||||
|
||||
@@ -633,3 +633,43 @@
|
||||
/obj/screen/setup_preview/bg/Click(params)
|
||||
pref?.bgstate = next_in_list(pref.bgstate, pref.bgstate_options)
|
||||
pref?.update_preview_icon()
|
||||
|
||||
/obj/screen/splash
|
||||
screen_loc = "1,1"
|
||||
layer = LAYER_HUD_ABOVE
|
||||
plane = PLANE_PLAYER_HUD_ABOVE
|
||||
var/client/holder
|
||||
|
||||
/obj/screen/splash/New(client/C, visible)
|
||||
. = ..()
|
||||
|
||||
holder = C
|
||||
|
||||
if(!visible)
|
||||
alpha = 0
|
||||
|
||||
if(!lobby_image)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
icon = lobby_image.icon
|
||||
icon_state = lobby_image.icon_state
|
||||
|
||||
holder.screen += src
|
||||
|
||||
/obj/screen/splash/proc/Fade(out, qdel_after = TRUE)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(out)
|
||||
animate(src, alpha = 0, time = 30)
|
||||
else
|
||||
alpha = 0
|
||||
animate(src, alpha = 255, time = 30)
|
||||
if(qdel_after)
|
||||
QDEL_IN(src, 30)
|
||||
|
||||
/obj/screen/splash/Destroy()
|
||||
if(holder)
|
||||
holder.screen -= src
|
||||
holder = null
|
||||
return ..()
|
||||
|
||||
+1129
-1124
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,6 @@
|
||||
//
|
||||
|
||||
/datum/configuration
|
||||
var/static/list/engine_map // Comma separated list of engines to choose from. Blank means fully random.
|
||||
var/static/time_off = FALSE
|
||||
var/static/pto_job_change = FALSE
|
||||
var/static/limit_interns = -1 //Unlimited by default
|
||||
@@ -42,8 +41,6 @@
|
||||
config.chat_webhook_url = value
|
||||
if ("chat_webhook_key")
|
||||
config.chat_webhook_key = value
|
||||
if ("engine_map")
|
||||
config.engine_map = splittext(value, ",")
|
||||
if ("fax_export_dir")
|
||||
config.fax_export_dir = value
|
||||
if ("items_survive_digestion")
|
||||
|
||||
@@ -6,6 +6,12 @@ SUBSYSTEM_DEF(mapping)
|
||||
|
||||
var/list/map_templates = list()
|
||||
var/dmm_suite/maploader = null
|
||||
var/obj/effect/landmark/engine_loader/engine_loader
|
||||
var/list/shelter_templates = list()
|
||||
|
||||
/datum/controller/subsystem/mapping/Recover()
|
||||
flags |= SS_NO_INIT // Make extra sure we don't initialize twice.
|
||||
shelter_templates = SSmapping.shelter_templates
|
||||
|
||||
/datum/controller/subsystem/mapping/Initialize(timeofday)
|
||||
if(subsystem_initialized)
|
||||
@@ -17,7 +23,15 @@ SUBSYSTEM_DEF(mapping)
|
||||
if(config.generate_map)
|
||||
// Map-gen is still very specific to the map, however putting it here should ensure it loads in the correct order.
|
||||
using_map.perform_map_generation()
|
||||
|
||||
|
||||
loadEngine()
|
||||
preloadShelterTemplates() // VOREStation EDIT: Re-enable Shelter Capsules
|
||||
// Mining generation probably should be here too
|
||||
// TODO - Other stuff related to maps and areas could be moved here too. Look at /tg
|
||||
// Lateload Code related to Expedition areas.
|
||||
if(using_map) // VOREStation Edit: Re-enable this.
|
||||
loadLateMaps()
|
||||
..()
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/load_map_templates()
|
||||
for(var/T in subtypesof(/datum/map_template))
|
||||
@@ -27,3 +41,84 @@ SUBSYSTEM_DEF(mapping)
|
||||
template = new T()
|
||||
map_templates[template.name] = template
|
||||
return TRUE
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/loadEngine()
|
||||
if(!engine_loader)
|
||||
return // Seems this map doesn't need an engine loaded.
|
||||
|
||||
var/turf/T = get_turf(engine_loader)
|
||||
if(!isturf(T))
|
||||
to_world_log("[log_info_line(engine_loader)] not on a turf! Cannot place engine template.")
|
||||
return
|
||||
|
||||
// Choose an engine type
|
||||
var/datum/map_template/engine/chosen_type = null
|
||||
if (LAZYLEN(config.engine_map))
|
||||
var/chosen_name = pick(config.engine_map)
|
||||
chosen_type = map_templates[chosen_name]
|
||||
if(!istype(chosen_type))
|
||||
error("Configured engine map [chosen_name] is not a valid engine map name!")
|
||||
if(!istype(chosen_type))
|
||||
var/list/engine_types = list()
|
||||
for(var/map in map_templates)
|
||||
var/datum/map_template/engine/MT = map_templates[map]
|
||||
if(istype(MT))
|
||||
engine_types += MT
|
||||
chosen_type = pick(engine_types)
|
||||
to_world_log("Chose Engine Map: [chosen_type.name]")
|
||||
admin_notice("<span class='danger'>Chose Engine Map: [chosen_type.name]</span>", R_DEBUG)
|
||||
|
||||
// Annihilate movable atoms
|
||||
engine_loader.annihilate_bounds()
|
||||
//CHECK_TICK //Don't let anything else happen for now
|
||||
// Actually load it
|
||||
chosen_type.load(T)
|
||||
|
||||
// VOREStation Edit Start: Enable This
|
||||
/datum/controller/subsystem/mapping/proc/loadLateMaps()
|
||||
var/list/deffo_load = using_map.lateload_z_levels
|
||||
var/list/maybe_load = using_map.lateload_single_pick
|
||||
|
||||
for(var/list/maplist in deffo_load)
|
||||
if(!islist(maplist))
|
||||
error("Lateload Z level [maplist] is not a list! Must be in a list!")
|
||||
continue
|
||||
for(var/mapname in maplist)
|
||||
var/datum/map_template/MT = map_templates[mapname]
|
||||
if(!istype(MT))
|
||||
error("Lateload Z level \"[mapname]\" is not a valid map!")
|
||||
continue
|
||||
MT.load_new_z(centered = FALSE)
|
||||
CHECK_TICK
|
||||
|
||||
if(LAZYLEN(maybe_load))
|
||||
var/picklist = pick(maybe_load)
|
||||
|
||||
if(!picklist) //No lateload maps at all
|
||||
return
|
||||
|
||||
if(!islist(picklist)) //So you can have a 'chain' of z-levels that make up one away mission
|
||||
error("Randompick Z level [picklist] is not a list! Must be in a list!")
|
||||
return
|
||||
|
||||
for(var/map in picklist)
|
||||
var/datum/map_template/MT = map_templates[map]
|
||||
if(!istype(MT))
|
||||
error("Randompick Z level \"[map]\" is not a valid map!")
|
||||
else
|
||||
MT.load_new_z(centered = FALSE)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/preloadShelterTemplates()
|
||||
for(var/item in subtypesof(/datum/map_template/shelter))
|
||||
var/datum/map_template/shelter/shelter_type = item
|
||||
if(!(initial(shelter_type.mappath)))
|
||||
continue
|
||||
var/datum/map_template/shelter/S = new shelter_type()
|
||||
|
||||
shelter_templates[S.shelter_id] = S
|
||||
// VOREStation Edit End: Re-enable this
|
||||
|
||||
/datum/controller/subsystem/mapping/stat_entry(msg)
|
||||
if (!Debug2)
|
||||
return // Only show up in stat panel if debugging is enabled.
|
||||
. = ..()
|
||||
@@ -1,126 +0,0 @@
|
||||
//
|
||||
// Mapping subsystem handles initialization of random map elements at server start
|
||||
// On VOREStation that means loading our random roundstart engine!
|
||||
//
|
||||
SUBSYSTEM_DEF(mapping)
|
||||
name = "Mapping"
|
||||
init_order = INIT_ORDER_MAPPING
|
||||
flags = SS_NO_FIRE
|
||||
|
||||
var/list/map_templates = list()
|
||||
var/dmm_suite/maploader = null
|
||||
var/obj/effect/landmark/engine_loader/engine_loader
|
||||
var/obj/effect/landmark/engine_loader_pickable/engine_loader_pickable
|
||||
|
||||
var/list/shelter_templates = list()
|
||||
|
||||
/datum/controller/subsystem/mapping/Recover()
|
||||
flags |= SS_NO_INIT // Make extra sure we don't initialize twice.
|
||||
shelter_templates = SSmapping.shelter_templates
|
||||
|
||||
/datum/controller/subsystem/mapping/Initialize(timeofday)
|
||||
if(subsystem_initialized)
|
||||
return
|
||||
world.max_z_changed() // This is to set up the player z-level list, maxz hasn't actually changed (probably)
|
||||
maploader = new()
|
||||
load_map_templates()
|
||||
|
||||
if(config.generate_map)
|
||||
// Map-gen is still very specific to the map, however putting it here should ensure it loads in the correct order.
|
||||
using_map.perform_map_generation()
|
||||
|
||||
loadEngine()
|
||||
preloadShelterTemplates()
|
||||
// Mining generation probably should be here too
|
||||
// TODO - Other stuff related to maps and areas could be moved here too. Look at /tg
|
||||
if(using_map)
|
||||
loadLateMaps()
|
||||
..()
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/load_map_templates()
|
||||
for(var/T in subtypesof(/datum/map_template))
|
||||
var/datum/map_template/template = T
|
||||
if(!(initial(template.mappath))) // If it's missing the actual path its probably a base type or being used for inheritence.
|
||||
continue
|
||||
template = new T()
|
||||
map_templates[template.name] = template
|
||||
return TRUE
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/loadEngine()
|
||||
if(!engine_loader)
|
||||
return // Seems this map doesn't need an engine loaded.
|
||||
|
||||
var/turf/T = get_turf(engine_loader)
|
||||
if(!isturf(T))
|
||||
to_world_log("[log_info_line(engine_loader)] not on a turf! Cannot place engine template.")
|
||||
return
|
||||
|
||||
// Choose an engine type
|
||||
var/datum/map_template/engine/chosen_type = null
|
||||
if (LAZYLEN(config.engine_map))
|
||||
var/chosen_name = pick(config.engine_map)
|
||||
chosen_type = map_templates[chosen_name]
|
||||
if(!istype(chosen_type))
|
||||
error("Configured engine map [chosen_name] is not a valid engine map name!")
|
||||
if(!istype(chosen_type))
|
||||
var/list/engine_types = list()
|
||||
for(var/map in map_templates)
|
||||
var/datum/map_template/engine/MT = map_templates[map]
|
||||
if(istype(MT))
|
||||
engine_types += MT
|
||||
chosen_type = pick(engine_types)
|
||||
to_world_log("Chose Engine Map: [chosen_type.name]")
|
||||
admin_notice("<span class='danger'>Chose Engine Map: [chosen_type.name]</span>", R_DEBUG)
|
||||
|
||||
// Annihilate movable atoms
|
||||
engine_loader.annihilate_bounds()
|
||||
//CHECK_TICK //Don't let anything else happen for now
|
||||
// Actually load it
|
||||
chosen_type.load(T)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/loadLateMaps()
|
||||
var/list/deffo_load = using_map.lateload_z_levels
|
||||
var/list/maybe_load = using_map.lateload_single_pick
|
||||
|
||||
for(var/list/maplist in deffo_load)
|
||||
if(!islist(maplist))
|
||||
error("Lateload Z level [maplist] is not a list! Must be in a list!")
|
||||
continue
|
||||
for(var/mapname in maplist)
|
||||
var/datum/map_template/MT = map_templates[mapname]
|
||||
if(!istype(MT))
|
||||
error("Lateload Z level \"[mapname]\" is not a valid map!")
|
||||
continue
|
||||
MT.load_new_z(centered = FALSE)
|
||||
CHECK_TICK
|
||||
|
||||
if(LAZYLEN(maybe_load))
|
||||
var/picklist = pick(maybe_load)
|
||||
|
||||
if(!picklist) //No lateload maps at all
|
||||
return
|
||||
|
||||
if(!islist(picklist)) //So you can have a 'chain' of z-levels that make up one away mission
|
||||
error("Randompick Z level [picklist] is not a list! Must be in a list!")
|
||||
return
|
||||
|
||||
for(var/map in picklist)
|
||||
var/datum/map_template/MT = map_templates[map]
|
||||
if(!istype(MT))
|
||||
error("Randompick Z level \"[map]\" is not a valid map!")
|
||||
else
|
||||
MT.load_new_z(centered = FALSE)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/preloadShelterTemplates()
|
||||
for(var/item in subtypesof(/datum/map_template/shelter))
|
||||
var/datum/map_template/shelter/shelter_type = item
|
||||
if(!(initial(shelter_type.mappath)))
|
||||
continue
|
||||
var/datum/map_template/shelter/S = new shelter_type()
|
||||
|
||||
shelter_templates[S.shelter_id] = S
|
||||
|
||||
/datum/controller/subsystem/mapping/stat_entry(msg)
|
||||
if (!Debug2)
|
||||
return // Only show up in stat panel if debugging is enabled.
|
||||
. = ..()
|
||||
+54
-63
@@ -1,32 +1,12 @@
|
||||
// Attempts to offload processing for the spreading plants from the MC.
|
||||
// Processes vines/spreading plants.
|
||||
|
||||
#define PLANTS_PER_TICK 500 // Cap on number of plant segments processed.
|
||||
#define PLANT_TICK_TIME 75 // Number of ticks between the plant processor cycling.
|
||||
|
||||
// Debug for testing seed genes.
|
||||
/client/proc/show_plant_genes()
|
||||
set category = "Debug"
|
||||
set name = "Show Plant Genes"
|
||||
set desc = "Prints the round's plant gene masks."
|
||||
SUBSYSTEM_DEF(plants)
|
||||
name = "Plants"
|
||||
init_order = INIT_ORDER_PLANTS
|
||||
priority = FIRE_PRIORITY_PLANTS
|
||||
wait = PLANT_TICK_TIME
|
||||
|
||||
if(!holder) return
|
||||
|
||||
if(!plant_controller || !plant_controller.gene_tag_masks)
|
||||
to_chat(usr, "Gene masks not set.")
|
||||
return
|
||||
|
||||
for(var/mask in plant_controller.gene_tag_masks)
|
||||
to_chat(usr, "[mask]: [plant_controller.gene_tag_masks[mask]]")
|
||||
|
||||
var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
|
||||
/datum/controller/plants
|
||||
|
||||
var/plants_per_tick = PLANTS_PER_TICK
|
||||
var/plant_tick_time = PLANT_TICK_TIME
|
||||
var/list/product_descs = list() // Stores generated fruit descs.
|
||||
var/list/plant_queue = list() // All queued plants.
|
||||
var/list/seeds = list() // All seed data stored here.
|
||||
var/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness.
|
||||
var/list/plant_icon_cache = list() // Stores images of growth, fruits and seeds.
|
||||
@@ -34,24 +14,26 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
var/list/accessible_plant_sprites = list() // List of all plant sprites allowed to appear in random generation.
|
||||
var/list/plant_product_sprites = list() // List of all harvested product sprites.
|
||||
var/list/accessible_product_sprites = list() // List of all product sprites allowed to appear in random generation.
|
||||
var/processing = 0 // Off/on.
|
||||
var/list/gene_masked_list = list() // Stored gene masked list, rather than recreating it when needed.
|
||||
var/list/plant_gene_datums = list() // Stored datum versions of the gene masked list.
|
||||
|
||||
/datum/controller/plants/New()
|
||||
if(plant_controller && plant_controller != src)
|
||||
log_debug("Rebuilding plant controller.")
|
||||
qdel(plant_controller)
|
||||
plant_controller = src
|
||||
// To be clear, the only thing this processes are spreading plants
|
||||
// Hydro trays and growing food normally just chill in SSobj
|
||||
var/list/processing = list()
|
||||
var/list/currentrun = list()
|
||||
|
||||
/datum/controller/subsystem/plants/stat_entry()
|
||||
..("P:[processing.len]|S:[seeds.len]")
|
||||
|
||||
/datum/controller/subsystem/plants/Initialize(timeofday)
|
||||
setup()
|
||||
process()
|
||||
return ..()
|
||||
|
||||
// Predefined/roundstart varieties use a string key to make it
|
||||
// easier to grab the new variety when mutating. Post-roundstart
|
||||
// and mutant varieties use their uid converted to a string instead.
|
||||
// Looks like shit but it's sort of necessary.
|
||||
/datum/controller/plants/proc/setup()
|
||||
|
||||
/datum/controller/subsystem/plants/proc/setup()
|
||||
// Build the icon lists.
|
||||
for(var/icostate in cached_icon_states('icons/obj/hydroponics_growing.dmi'))
|
||||
var/split = findtext(icostate,"-")
|
||||
@@ -116,10 +98,10 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
gene_masked_list.Add(list(list("tag" = gene_tag, "mask" = gene_mask)))
|
||||
|
||||
// Proc for creating a random seed type.
|
||||
/datum/controller/plants/proc/create_random_seed(var/survive_on_station)
|
||||
/datum/controller/subsystem/plants/proc/create_random_seed(var/survive_on_station)
|
||||
var/datum/seed/seed = new()
|
||||
seed.randomize()
|
||||
seed.uid = plant_controller.seeds.len + 1
|
||||
seed.uid = SSplants.seeds.len + 1
|
||||
seed.name = "[seed.uid]"
|
||||
seeds[seed.name] = seed
|
||||
|
||||
@@ -138,32 +120,41 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
seed.set_trait(TRAIT_HIGHKPA_TOLERANCE,200)
|
||||
return seed
|
||||
|
||||
/datum/controller/plants/process()
|
||||
processing = 1
|
||||
spawn(0)
|
||||
set background = 1
|
||||
var/processed = 0
|
||||
while(1)
|
||||
if(!processing)
|
||||
sleep(plant_tick_time)
|
||||
else
|
||||
processed = 0
|
||||
if(plant_queue.len)
|
||||
var/target_to_process = min(plant_queue.len,plants_per_tick)
|
||||
for(var/x=0;x<target_to_process;x++)
|
||||
if(!plant_queue.len)
|
||||
break
|
||||
var/obj/effect/plant/plant = pick(plant_queue)
|
||||
plant_queue -= plant
|
||||
if(!istype(plant))
|
||||
continue
|
||||
plant.process()
|
||||
processed++
|
||||
sleep(1) // Stagger processing out so previous tick can resolve (overlapping plant segments etc)
|
||||
sleep(max(1,(plant_tick_time-processed)))
|
||||
/datum/controller/subsystem/plants/fire(resumed = 0)
|
||||
if(!resumed)
|
||||
src.currentrun = processing.Copy()
|
||||
|
||||
/datum/controller/plants/proc/add_plant(var/obj/effect/plant/plant)
|
||||
plant_queue |= plant
|
||||
// Caching
|
||||
var/list/currentrun = src.currentrun
|
||||
|
||||
while(currentrun.len)
|
||||
var/obj/effect/plant/P = currentrun[currentrun.len]
|
||||
--currentrun.len
|
||||
if(!P || QDELETED(P))
|
||||
continue
|
||||
P.process()
|
||||
|
||||
/datum/controller/plants/proc/remove_plant(var/obj/effect/plant/plant)
|
||||
plant_queue -= plant
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/plants/proc/add_plant(var/obj/effect/plant/plant)
|
||||
processing |= plant
|
||||
|
||||
/datum/controller/subsystem/plants/proc/remove_plant(var/obj/effect/plant/plant)
|
||||
processing -= plant
|
||||
|
||||
|
||||
// Debug for testing seed genes.
|
||||
/client/proc/show_plant_genes()
|
||||
set category = "Debug"
|
||||
set name = "Show Plant Genes"
|
||||
set desc = "Prints the round's plant gene masks."
|
||||
|
||||
if(!holder) return
|
||||
|
||||
if(!SSplants || !SSplants.gene_tag_masks)
|
||||
to_chat(usr, "Gene masks not set.")
|
||||
return
|
||||
|
||||
for(var/mask in SSplants.gene_tag_masks)
|
||||
to_chat(usr, "[mask]: [SSplants.gene_tag_masks[mask]]")
|
||||
@@ -78,6 +78,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
/datum/controller/subsystem/ticker/proc/pregame_welcome()
|
||||
to_world("<span class='boldannounce notice'><em>Welcome to the pregame lobby!</em></span>")
|
||||
to_world("<span class='boldannounce notice'>Please set up your character and select ready. The round will start in [pregame_timeleft] seconds.</span>")
|
||||
world << sound('sound/misc/server-ready.ogg', volume = 100)
|
||||
|
||||
// Called during GAME_STATE_PREGAME (RUNLEVEL_LOBBY)
|
||||
/datum/controller/subsystem/ticker/proc/pregame_tick()
|
||||
@@ -402,20 +403,23 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
for(var/mob/new_player/player in player_list)
|
||||
if(player && player.ready && player.mind?.assigned_role)
|
||||
var/datum/job/J = SSjob.get_job(player.mind.assigned_role)
|
||||
|
||||
|
||||
// Snowflakey AI treatment
|
||||
if(J?.mob_type & JOB_SILICON_AI)
|
||||
player.close_spawn_windows()
|
||||
player.AIize(move = TRUE)
|
||||
continue
|
||||
|
||||
|
||||
// Ask their new_player mob to spawn them
|
||||
if(!player.spawn_checks_vr(player.mind.assigned_role)) continue //VOREStation Add
|
||||
var/mob/living/carbon/human/new_char = player.create_character()
|
||||
|
||||
|
||||
// Created their playable character, delete their /mob/new_player
|
||||
if(new_char)
|
||||
qdel(player)
|
||||
if(new_char.client)
|
||||
var/obj/screen/splash/S = new(new_char.client, TRUE)
|
||||
S.Fade(TRUE)
|
||||
|
||||
// If they're a carbon, they can get manifested
|
||||
if(J?.mob_type & JOB_CARBON)
|
||||
@@ -431,7 +435,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
var/captainless=1
|
||||
for(var/mob/living/carbon/human/player in player_list)
|
||||
if(player && player.mind && player.mind.assigned_role)
|
||||
if(player.mind.assigned_role == "Colony Director")
|
||||
if(player.mind.assigned_role == "Site Manager")
|
||||
captainless=0
|
||||
if(!player_is_antag(player.mind, only_offstation_roles = 1))
|
||||
job_master.EquipRank(player, player.mind.assigned_role, 0)
|
||||
@@ -441,7 +445,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
if(captainless)
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player))
|
||||
to_chat(M, "<span class='notice'>Colony Directorship not forced on anyone.</span>")
|
||||
to_chat(M, "<span class='notice'>Site Management is not forced on anyone.</span>")
|
||||
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/declare_completion()
|
||||
|
||||
@@ -97,7 +97,6 @@
|
||||
options["LEGACY: cameranet"] = cameranet
|
||||
options["LEGACY: transfer_controller"] = transfer_controller
|
||||
options["LEGACY: gas_data"] = gas_data
|
||||
options["LEGACY: plant_controller"] = plant_controller
|
||||
|
||||
var/pick = input(mob, "Choose a controller to debug/view variables of.", "VV controller:") as null|anything in options
|
||||
if(!pick)
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
/datum/category_item/autolathe/arms/pistol_5mm
|
||||
name = "pistol magazine (5mm)"
|
||||
path =/obj/item/ammo_magazine/c5mm
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
*/
|
||||
|
||||
@@ -237,93 +237,93 @@
|
||||
/datum/category_item/autolathe/arms/pistol_5mm
|
||||
name = "pistol magazine (5mm)"
|
||||
path =/obj/item/ammo_magazine/c5mm/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/smg_5mm
|
||||
name = "top-mounted SMG magazine (5mm)"
|
||||
path =/obj/item/ammo_magazine/c5mmt/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_45
|
||||
name = "pistol magazine (.45)"
|
||||
path =/obj/item/ammo_magazine/m45/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_45uzi
|
||||
name = "uzi magazine (.45)"
|
||||
path =/obj/item/ammo_magazine/m45uzi/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/tommymag
|
||||
name = "Tommy Gun magazine (.45)"
|
||||
path =/obj/item/ammo_magazine/m45tommy/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/tommydrum
|
||||
name = "Tommy Gun drum magazine (.45)"
|
||||
path =/obj/item/ammo_magazine/m45tommydrum/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_9mm
|
||||
name = "pistol magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mm/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/smg_9mm
|
||||
name = "top-mounted SMG magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mmt/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/smg_10mm
|
||||
name = "SMG magazine (10mm)"
|
||||
path =/obj/item/ammo_magazine/m10mm/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_44
|
||||
name = "pistol magazine (.44)"
|
||||
path =/obj/item/ammo_magazine/m44/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_545
|
||||
name = "10rnd rifle magazine (5.45mm)"
|
||||
path =/obj/item/ammo_magazine/m545saw/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_545m
|
||||
name = "20rnd rifle magazine (5.45mm)"
|
||||
path =/obj/item/ammo_magazine/m545sawm/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_SVD
|
||||
name = "10rnd rifle magazine (7.62mm)"
|
||||
path =/obj/item/ammo_magazine/m762svd/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_762
|
||||
name = "20rnd rifle magazine (7.62mm)"
|
||||
path =/obj/item/ammo_magazine/m762/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/machinegun_762
|
||||
name = "machinegun box magazine (7.62)"
|
||||
path =/obj/item/ammo_magazine/a762/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/shotgun_magazine
|
||||
name = "24rnd shotgun magazine (12g)"
|
||||
path =/obj/item/ammo_magazine/m12gdrum/empty
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1*/
|
||||
|
||||
///////////////////////////////
|
||||
@@ -357,73 +357,73 @@
|
||||
/*/datum/category_item/autolathe/arms/pistol_clip_45
|
||||
name = "ammo clip (.45)"
|
||||
path =/obj/item/ammo_magazine/clip/c45
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_45r
|
||||
name = "ammo clip (.45 rubber)"
|
||||
path =/obj/item/ammo_magazine/clip/c45/rubber
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_45f
|
||||
name = "ammo clip (.45 flash)"
|
||||
path =/obj/item/ammo_magazine/clip/c45/flash
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_45p
|
||||
name = "ammo clip (.45 practice)"
|
||||
path =/obj/item/ammo_magazine/clip/c45/practice
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_9mm
|
||||
name = "ammo clip (9mm)"
|
||||
path =/obj/item/ammo_magazine/clip/c9mm
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_9mmr
|
||||
name = "ammo clip (9mm rubber)"
|
||||
path =/obj/item/ammo_magazine/clip/c9mm/rubber
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_9mmp
|
||||
name = "ammo clip (9mm practice)"
|
||||
path =/obj/item/ammo_magazine/clip/c9mm/practice
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_9mmf
|
||||
name = "ammo clip (9mm flash)"
|
||||
path =/obj/item/ammo_magazine/clip/c9mm/flash
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_5mm
|
||||
name = "ammo clip (5mm)"
|
||||
path =/obj/item/ammo_magazine/clip/c5mm
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_10mm
|
||||
name = "ammo clip (10mm)"
|
||||
path =/obj/item/ammo_magazine/clip/c10mm
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_50
|
||||
name = "ammo clip (.44)"
|
||||
path =/obj/item/ammo_magazine/clip/c50
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
*/
|
||||
/datum/category_item/autolathe/arms/rifle_clip_545
|
||||
name = "ammo clip (5.45mm)"
|
||||
path =/obj/item/ammo_magazine/clip/c545
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_clip_545_practice
|
||||
name = "ammo clip (5.45mm practice)"
|
||||
path =/obj/item/ammo_magazine/clip/c545/practice
|
||||
category = "Arms and Ammunition"
|
||||
category = list("Arms and Ammunition")
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_clip_762
|
||||
name = "ammo clip (7.62mm)"
|
||||
|
||||
@@ -1,345 +0,0 @@
|
||||
/datum/design/item/autolathe
|
||||
//var/hidden = 0
|
||||
build_type = AUTOLATHE //Flag as to what kind machine the design is built in. See defines.
|
||||
|
||||
/datum/design/item/autolathe/arms //Datum for object designs, used in construction //IDs of that techs the object originated from and the minimum level requirements.
|
||||
category = "Arms and Ammunition" //category item goes to
|
||||
|
||||
|
||||
////////////////
|
||||
/*Ammo casings*/
|
||||
////////////////
|
||||
//Shotgun
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_blanks
|
||||
name = "ammunition (12g, blank)"
|
||||
id = "shotgun_blanks"
|
||||
build_path = /obj/item/ammo_casing/a12g/blank
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 112)
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_beanbag
|
||||
name = "ammunition (12g, beanbag)"
|
||||
id = "shotgun_beanbag"
|
||||
build_path = /obj/item/ammo_casing/a12g/beanbag
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 225)
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_flash
|
||||
name = "ammunition (12g, flash)"
|
||||
id = "shotgun_flash"
|
||||
build_path = /obj/item/ammo_casing/a12g/flash
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 112, "glass" = 112)
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_slug
|
||||
name = "ammunition (12g, slug)"
|
||||
id = "shotgun_slug"
|
||||
build_path = /obj/item/ammo_casing/a12g
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 450)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_pellet
|
||||
name = "ammunition (12g, pellet)"
|
||||
id = "shotgun_pellet"
|
||||
build_path = /obj/item/ammo_casing/a12g/pellet
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 450)
|
||||
hidden = 1
|
||||
|
||||
/*/datum/design/item/autolathe/arms/stunshell
|
||||
name = "ammunition (stun cartridge, shotgun)"
|
||||
id = "shotgun_stunshell"
|
||||
build_path = /obj/item/ammo_casing/a12g/stunshell
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 450, "glass" = 900)
|
||||
hidden = 1*/
|
||||
//It Gotta be manually added by a Design_disk, uncomment in case it shall be constructed normally(or add it other way, this causes some irrelevant unit test errors)
|
||||
|
||||
//////////////////
|
||||
/*Ammo magazines*/
|
||||
//////////////////
|
||||
|
||||
/////// .45
|
||||
/datum/design/item/autolathe/arms/pistol_45
|
||||
name = "pistol magazine (.45)"
|
||||
id = "pistol_45"
|
||||
build_path = /obj/item/ammo_magazine/m45
|
||||
time = 10
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 656)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_45p
|
||||
name = "pistol magazine (.45 practice)"
|
||||
id = "pistol_45p"
|
||||
build_path = /obj/item/ammo_magazine/m45/practice
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 656)
|
||||
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_45r
|
||||
name = "pistol magazine (.45 rubber)"
|
||||
id = "pistol_45r"
|
||||
build_path = /obj/item/ammo_magazine/m45/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 656)
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_45f
|
||||
name = "pistol magazine (.45 flash)"
|
||||
id = "pistol_45f"
|
||||
build_path = /obj/item/ammo_magazine/m45/flash
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 656)
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_45uzi
|
||||
name = "uzi magazine (.45)"
|
||||
id = "pistol_45uzi"
|
||||
build_path = /obj/item/ammo_magazine/m45uzi
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 656)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/tommymag
|
||||
name = "Tommy Gun magazine (.45)"
|
||||
id = "tommymag"
|
||||
build_path = /obj/item/ammo_magazine/m45tommy
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1875)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/tommydrum
|
||||
name = "Tommy Gun drum magazine (.45)"
|
||||
id = "tommydrum"
|
||||
build_path = /obj/item/ammo_magazine/m45tommydrum
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4687)
|
||||
hidden = 1
|
||||
|
||||
/////// 9mm
|
||||
|
||||
// Full size pistol mags.
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_9mm
|
||||
name = "pistol magazine (9mm)"
|
||||
id = "pistol_9mm"
|
||||
build_path = /obj/item/ammo_magazine/m9mm
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_9mmr
|
||||
name = "pistol magazine (9mm rubber)"
|
||||
id = "pistol_9mm_rubber"
|
||||
build_path = /obj/item/ammo_magazine/m9mm/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_9mmp
|
||||
name = "pistol magazine (9mm practice)"
|
||||
id = "pistol_9mm_practice"
|
||||
build_path = /obj/item/ammo_magazine/m9mm/practice
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_9mmf
|
||||
name = "pistol magazine (9mm flash)"
|
||||
id = "pistol_9mm_flash"
|
||||
build_path = /obj/item/ammo_magazine/m9mm/flash
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_9mm_compact
|
||||
name = "compact pistol magazine (9mm)"
|
||||
id = "pistol_9mm_compact"
|
||||
build_path = /obj/item/ammo_magazine/m9mm/compact
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_9mmr_compact
|
||||
name = "compact pistol magazine (9mm rubber)"
|
||||
id = "pistol_9mm_compact_rubber"
|
||||
build_path = /obj/item/ammo_magazine/m9mm/compact/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
hidden = 1
|
||||
/datum/design/item/autolathe/arms/pistol_9mmp_compact
|
||||
name = "compact pistol magazine (9mm)"
|
||||
id = "pistol_9mm_compact_practice"
|
||||
build_path = /obj/item/ammo_magazine/m9mm/compact/practice
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/pistol_9mmf_compact
|
||||
name = "compact pistol magazine (9mm)"
|
||||
id = "pistol_9mm_compact_flash"
|
||||
build_path = /obj/item/ammo_magazine/m9mm/compact/flash
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
hidden = 1
|
||||
|
||||
/////// SMG Mags
|
||||
|
||||
/datum/design/item/autolathe/arms/smg_9mm
|
||||
name = "top-mounted SMG magazine (9mm)"
|
||||
id = "smg_9mm"
|
||||
build_path = /obj/item/ammo_magazine/m9mmt
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 750)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/smg_9mmr
|
||||
name = "top-mounted SMG magazine (9mm rubber)"
|
||||
id = "smg_9mmr"
|
||||
build_path = /obj/item/ammo_magazine/m9mmt/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 380)
|
||||
|
||||
/datum/design/item/autolathe/arms/smg_9mmp
|
||||
name = "top-mounted SMG magazine (9mm practice)"
|
||||
id = "smg_9mmp"
|
||||
build_path = /obj/item/ammo_magazine/m9mmt/practice
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 380)
|
||||
|
||||
/datum/design/item/autolathe/arms/smg_9mmf
|
||||
name = "top-mounted SMG magazine (9mm flash)"
|
||||
id = "smg_9mmf"
|
||||
build_path = /obj/item/ammo_magazine/m9mmt/flash
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 380)
|
||||
|
||||
|
||||
/////// 10mm
|
||||
|
||||
/datum/design/item/autolathe/arms/smg_10mm
|
||||
name = "SMG magazine (10mm)"
|
||||
id = "smg_10mm"
|
||||
build_path = /obj/item/ammo_magazine/m10mm
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1875)
|
||||
|
||||
|
||||
/////// 5.45mm
|
||||
/datum/design/item/autolathe/arms/rifle_545
|
||||
name = "rifle magazine (5.45mm)"
|
||||
id = "rifle_545"
|
||||
build_path = /obj/item/ammo_magazine/m545
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2250)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/rifle_545p
|
||||
name = "rifle magazine (5.45mm practice)"
|
||||
id = "rifle_545_practice"
|
||||
build_path = /obj/item/ammo_magazine/m545/practice
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2250)
|
||||
|
||||
/datum/design/item/autolathe/arms/machinegun_545
|
||||
name = "machinegun box magazine (5.45)"
|
||||
id = "machinegun_545"
|
||||
build_path = /obj/item/ammo_magazine/m545saw
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 12500)
|
||||
hidden = 1
|
||||
|
||||
/////// 7.62
|
||||
|
||||
/datum/design/item/autolathe/arms/rifle_762
|
||||
name = "rifle magazine (7.62mm)"
|
||||
id = "rifle_762"
|
||||
build_path = /obj/item/ammo_magazine/m762
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2500)
|
||||
hidden = 1
|
||||
|
||||
|
||||
/////// Shotgun
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_clip_beanbag
|
||||
name = "2-round 12g speedloader (beanbag)"
|
||||
id = "shotgun_speedloader_beanbag"
|
||||
build_path = /obj/item/ammo_magazine/clip/c12g/beanbag
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 887)
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_clip_pellet
|
||||
name = "2-round 12g speedloader (pellet)"
|
||||
id = "shotgun_speedloader_pellet"
|
||||
build_path = /obj/item/ammo_magazine/clip/c12g/pellet
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1337)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_clip_slug
|
||||
name = "2-round 12g speedloader (slug)"
|
||||
id = "shotgun_speedloader_slug"
|
||||
build_path = /obj/item/ammo_magazine/clip/c12g
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1337)
|
||||
hidden = 1
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
/*Ammo clips and Speedloaders*/
|
||||
///////////////////////////////
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_357
|
||||
name = "speedloader (.357)"
|
||||
id = "speedloader_357"
|
||||
build_path = /obj/item/ammo_magazine/s357
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_38
|
||||
name = "speedloader (.38)"
|
||||
id = "speedloader_38"
|
||||
build_path = /obj/item/ammo_magazine/s38
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 450)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_38r
|
||||
name = "speedloader (.38 rubber)"
|
||||
id = "speedloader_38_rubber"
|
||||
build_path = /obj/item/ammo_magazine/s38/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 450)
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_45
|
||||
name = "speedloader (.45)"
|
||||
id = "speedloader_45"
|
||||
build_path = /obj/item/ammo_magazine/s45
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 656)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_45r
|
||||
name = "speedloader (.45 rubber)"
|
||||
id = "speedloader_45_rubber"
|
||||
build_path = /obj/item/ammo_magazine/s45/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 656)
|
||||
|
||||
/datum/design/item/autolathe/arms/rifle_clip_545
|
||||
name = "ammo clip (5.45mm)"
|
||||
id = "rifle_clip_545"
|
||||
build_path = /obj/item/ammo_magazine/clip/c545
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 565)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/rifle_clip_545_practice
|
||||
name = "ammo clip (5.45mm practice)"
|
||||
id = "rifle_clip_545p"
|
||||
build_path = /obj/item/ammo_magazine/clip/c545/practice
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 565)
|
||||
|
||||
/datum/design/item/autolathe/arms/rifle_clip_762
|
||||
name = "ammo clip (7.62mm)"
|
||||
id = "rifle_clip_762"
|
||||
build_path = /obj/item/ammo_magazine/clip/c762
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1250)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/rifle_clip_762_practice
|
||||
name = "ammo clip (7.62mm practice)"
|
||||
id = "rifle_clip_762p"
|
||||
build_path = /obj/item/ammo_magazine/clip/c762/practice
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1250)
|
||||
|
||||
/datum/design/item/autolathe/arms/knuckledusters
|
||||
name = "knuckle dusters"
|
||||
id = "knuckledusters"
|
||||
build_path = /obj/item/clothing/gloves/knuckledusters
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 625)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/tacknife
|
||||
name = "tactical knife"
|
||||
id = "tacknife"
|
||||
build_path = /obj/item/weapon/material/knife/tacknife
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 625)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/flamethrower
|
||||
name = "flamethrower"
|
||||
id = "flamethrower"
|
||||
build_path = /obj/item/weapon/flamethrower/full
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 625)
|
||||
hidden = 1
|
||||
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
/datum/design/item/autolathe/arms/speedloader_357_flash
|
||||
name = "speedloader (.357 flash)"
|
||||
id = "speedloader_357f"
|
||||
build_path = /obj/item/ammo_magazine/s357/flash
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_357_stun
|
||||
name = "speedloader (.357 stun)"
|
||||
id = "speedloader_357s"
|
||||
build_path = /obj/item/ammo_magazine/s357/stun
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_357_rubber
|
||||
name = "speedloader (.357 rubber)"
|
||||
id = "speedloader_357r"
|
||||
build_path = /obj/item/ammo_magazine/s357/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_44
|
||||
name = "speedloader (.44)"
|
||||
id = "speedloader_44"
|
||||
build_path = /obj/item/ammo_magazine/s44
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/speedloader_44_rubber
|
||||
name = "speedloader (.44)"
|
||||
id = "speedloader_44r"
|
||||
build_path = /obj/item/ammo_magazine/s44/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/mag_44
|
||||
name = "magazine (.44)"
|
||||
id = "mag_44"
|
||||
build_path = /obj/item/ammo_magazine/m44
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/mag_44_rubber
|
||||
name = "magazine (.44 rubber)"
|
||||
id = "mag_44r"
|
||||
build_path = /obj/item/ammo_magazine/m44/rubber
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1575)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/classic_smg_9mm
|
||||
name = "SMG magazine (9mm)"
|
||||
id = "classic_smg_9mm"
|
||||
build_path = /obj/item/ammo_magazine/m9mml
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2250)
|
||||
hidden = 1
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/datum/design/item/autolathe/arms/shotgun_scatter
|
||||
name = "ammunition (12g, scatter)"
|
||||
id = "shotgun_scatter"
|
||||
build_path = /obj/item/ammo_casing/a12g/scatter
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 450)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_clip_scatter
|
||||
name = "2-round 12g speedloader (scatter)"
|
||||
id = "shotgun_speedloader_scatter"
|
||||
build_path = /obj/item/ammo_magazine/clip/c12g/scatter
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1337)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/shotgun_drum_empty
|
||||
name = "shotgun 12g drum magazine (Empty)"
|
||||
id = "shotgun_empty_drum_magazine"
|
||||
build_path = /obj/item/ammo_magazine/m12gdrumjack/empty
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1625) //Why these cost so much ? the normal ones have 13000 matter so i just multiplied by 1.25(default) don't know why it costs so much
|
||||
|
||||
//printable boxes of shotgun ammo, by KK
|
||||
//the prices are rounded up to the cost of nine shells, but compared to printing a bunch of speedloaders you get a small discount. honestly the speedloaders are overpriced (the metal frame is somehow more expensive than a third shell!) but take it up with polaris.
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_beanbag
|
||||
name = "8-round 12g ammo box (beanbag)"
|
||||
id = "shotgun_ammobox_beanbag"
|
||||
build_path = /obj/item/weapon/storage/box/beanbags
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2025)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_slugs
|
||||
name = "8-round 12g ammo box (slug)"
|
||||
id = "shotgun_ammobox_slug"
|
||||
build_path = /obj/item/weapon/storage/box/shotgunammo
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4050)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_pellet
|
||||
name = "8-round 12g ammo box (pellet)"
|
||||
id = "shotgun_ammobox_pellet"
|
||||
build_path = /obj/item/weapon/storage/box/shotgunshells
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4050)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_scatter
|
||||
name = "8-round 12g ammo box (scatter)"
|
||||
id = "shotgun_ammobox_scatter"
|
||||
build_path = /obj/item/weapon/storage/box/scattershot
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4050)
|
||||
hidden = 1
|
||||
|
||||
//commented out, pending review, maybe 16rnd boxes should be cargo only?
|
||||
/*
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_beanbag_large
|
||||
name = "16-round 12g ammo box (beanbag)"
|
||||
id = "shotgun_ammobox_beanbag_large"
|
||||
build_path = /obj/item/weapon/storage/box/beanbags/large
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4050)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_slugs_large
|
||||
name = "16-round 12g ammo box (slug)"
|
||||
id = "shotgun_ammobox_slug_large"
|
||||
build_path = /obj/item/weapon/storage/box/shotgunammo/large
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8100)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_pellet_large
|
||||
name = "16-round 12g ammo box (pellet)"
|
||||
id = "shotgun_ammobox_pellet_large"
|
||||
build_path = /obj/item/weapon/storage/box/shotgunshells/large
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8100)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/arms/ammobox/shotgun_box_scatter_large
|
||||
name = "16-round 12g ammo box (scatter)"
|
||||
id = "shotgun_ammobox_scatter_large"
|
||||
build_path = /obj/item/weapon/storage/box/scattershot/large
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8100)
|
||||
hidden = 1
|
||||
*/
|
||||
@@ -2,3 +2,12 @@
|
||||
name = "ammunition (12g scatter)"
|
||||
path =/obj/item/ammo_casing/a12g/scatter
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/shotgun_clip_scatter
|
||||
name = "2-round 12g speedloader (scatter)"
|
||||
path =/obj/item/ammo_magazine/clip/c12g/scatter
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/shotgun_drum_empty
|
||||
name = "shotgun 12g drum magazine (Empty)"
|
||||
path =/obj/item/ammo_magazine/m12gdrumjack/empty
|
||||
@@ -1,5 +1,3 @@
|
||||
var/datum/category_collection/autolathe/autolathe_recipes
|
||||
|
||||
/datum/category_item/autolathe/New()
|
||||
..()
|
||||
var/obj/item/I = new path()
|
||||
|
||||
@@ -1,631 +0,0 @@
|
||||
#define AUTOLATHE_MAIN_MENU 1
|
||||
#define AUTOLATHE_CATEGORY_MENU 2
|
||||
#define AUTOLATHE_SEARCH_MENU 3
|
||||
|
||||
/obj/machinery/autolathe
|
||||
name = "autolathe"
|
||||
desc = "It produces items using metal and glass."
|
||||
icon_state = "autolathe"
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 2000
|
||||
clicksound = "keyboard"
|
||||
clickvol = 30
|
||||
|
||||
circuit = /obj/item/weapon/circuitboard/autolathe
|
||||
var/list/stored_material = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0)
|
||||
var/list/storage_capacity = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0)
|
||||
|
||||
var/hacked = 0
|
||||
var/disabled = 0
|
||||
var/shocked = 0
|
||||
var/busy = 0
|
||||
var/input_dir_name = "North"
|
||||
var/input_dir = NORTH
|
||||
var/operating = 0.0
|
||||
var/list/queue = list()
|
||||
var/queue_max_len = 12
|
||||
var/turf/BuildTurf
|
||||
var/list/L = list()
|
||||
var/list/LL = list()
|
||||
var/prod_coeff
|
||||
var/list/being_built = list()
|
||||
var/datum/research/files
|
||||
|
||||
var/mat_efficiency = 1
|
||||
var/list/datum/design/item/autolathe/matching_designs
|
||||
var/temp_search
|
||||
var/selected_category
|
||||
var/screen = 1
|
||||
var/list/categories = list("Arms and Ammunition", "Devices", "Engineering", "General", "Medical", "Tools", "Imported")
|
||||
|
||||
var/datum/wires/autolathe/wires = null
|
||||
|
||||
/obj/machinery/autolathe/New()
|
||||
..()
|
||||
|
||||
/obj/machinery/autolathe/Initialize()
|
||||
. = ..()
|
||||
wires = new(src)
|
||||
default_apply_parts()
|
||||
RefreshParts()
|
||||
files = new /datum/research/autolathe(src)
|
||||
matching_designs = list()
|
||||
|
||||
/obj/machinery/autolathe/Destroy()
|
||||
qdel(wires)
|
||||
wires = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/autolathe/attack_hand(mob/user)
|
||||
|
||||
if(..() || (disabled && !panel_open))
|
||||
to_chat(user, "<span class='danger'>\The [src] is disabled!</span>")
|
||||
return
|
||||
|
||||
if(shocked)
|
||||
shock(user, 50)
|
||||
else
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/autolathe/dismantle()
|
||||
for(var/mat in stored_material)
|
||||
var/material/M = get_material_by_name(mat)
|
||||
if(!istype(M))
|
||||
continue
|
||||
var/obj/item/stack/material/S = new M.stack_type(get_turf(src))
|
||||
if(stored_material[mat] > S.perunit)
|
||||
S.amount = round(stored_material[mat] / S.perunit)
|
||||
else
|
||||
qdel(S)
|
||||
..()
|
||||
return 1
|
||||
|
||||
/obj/machinery/autolathe/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
user.set_machine(src)
|
||||
var/data[0]
|
||||
data["screen"] = screen
|
||||
data["total_amount"] = (stored_material[DEFAULT_WALL_MATERIAL] + stored_material["glass"])
|
||||
data["max_amount"] = (storage_capacity[DEFAULT_WALL_MATERIAL] + storage_capacity["glass"])
|
||||
data["metal_amount"] = stored_material[DEFAULT_WALL_MATERIAL]
|
||||
data["glass_amount"] = stored_material["glass"]
|
||||
switch(screen)
|
||||
if(AUTOLATHE_MAIN_MENU)
|
||||
data["uid"] = "\ref[src]"
|
||||
data["categories"] = categories
|
||||
if(AUTOLATHE_CATEGORY_MENU)
|
||||
data["selected_category"] = selected_category
|
||||
var/list/designs = list()
|
||||
data["designs"] = designs
|
||||
for(var/datum/design/item/D in files.known_designs)
|
||||
if(!D.build_path || D.hidden && !hacked || selected_category != D.category)
|
||||
continue
|
||||
var/list/design = list()
|
||||
designs[++designs.len] = design
|
||||
design["name"] = D.name
|
||||
design["id"] = D.id
|
||||
design["disabled"] = disabled || !can_build(D) ? "disabled" : null
|
||||
if(ispath(D.build_path, /obj/item/stack))
|
||||
design["max_multiplier"] = min(D.maxstack, D.materials[DEFAULT_WALL_MATERIAL] ? round(stored_material[DEFAULT_WALL_MATERIAL] / D.materials[DEFAULT_WALL_MATERIAL]) : INFINITY, D.materials["glass"] ? round(stored_material["glass"] / D.materials["glass"]) : INFINITY)
|
||||
else
|
||||
design["max_multiplier"] = null
|
||||
design["materials"] = design_cost_data(D)
|
||||
if(AUTOLATHE_SEARCH_MENU)
|
||||
data["search"] = temp_search
|
||||
var/list/designs = list()
|
||||
data["designs"] = designs
|
||||
for(var/datum/design/item/D in matching_designs)
|
||||
var/list/design = list()
|
||||
designs[++designs.len] = design
|
||||
design["name"] = D.name
|
||||
design["id"] = D.id
|
||||
design["disabled"] = disabled || !can_build(D) ? "disabled" : null
|
||||
if(ispath(D.build_path, /obj/item/stack))
|
||||
design["max_multiplier"] = min(D.maxstack, D.materials[DEFAULT_WALL_MATERIAL] ? round(stored_material[DEFAULT_WALL_MATERIAL] / D.materials[DEFAULT_WALL_MATERIAL]) : INFINITY, D.materials["glass"] ? round(stored_material["glass"] / D.materials["glass"]) : INFINITY)
|
||||
else
|
||||
design["max_multiplier"] = null
|
||||
design["materials"] = design_cost_data(D)
|
||||
|
||||
data = queue_data(data)
|
||||
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "autolathe.tmpl", name, 800, 550)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/autolathe/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
add_fingerprint(usr)
|
||||
|
||||
if(href_list["menu"])
|
||||
screen = text2num(href_list["menu"])
|
||||
|
||||
if(href_list["category"])
|
||||
selected_category = href_list["category"]
|
||||
screen = AUTOLATHE_CATEGORY_MENU
|
||||
|
||||
if(href_list["make"])
|
||||
BuildTurf = loc
|
||||
|
||||
/////////////////
|
||||
//href protection
|
||||
var/datum/design/design_last_ordered
|
||||
design_last_ordered = FindDesign(href_list["make"]) //check if it's a valid design
|
||||
if(!design_last_ordered)
|
||||
return
|
||||
|
||||
//multiplier checks : only stacks can have one and its value is 1, 10 ,25 or max_multiplier
|
||||
var/multiplier = text2num(href_list["multiplier"])
|
||||
var/max_multiplier = min(design_last_ordered.maxstack, design_last_ordered.materials[DEFAULT_WALL_MATERIAL] ?round(stored_material[DEFAULT_WALL_MATERIAL]/design_last_ordered.materials[DEFAULT_WALL_MATERIAL]):INFINITY,design_last_ordered.materials["glass"]?round(stored_material["glass"]/design_last_ordered.materials["glass"]):INFINITY)
|
||||
var/is_stack = ispath(design_last_ordered.build_path, /obj/item/stack)
|
||||
|
||||
if(!is_stack && (multiplier > 1))
|
||||
return
|
||||
if(!(multiplier in list(1, 10, 25, max_multiplier))) //"enough materials ?" is checked in the build proc
|
||||
return
|
||||
/////////////////
|
||||
|
||||
if((queue.len + 1) < queue_max_len)
|
||||
add_to_queue(design_last_ordered,multiplier)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>The autolathe queue is full!</span>")
|
||||
if(!busy)
|
||||
busy = 1
|
||||
update_icon()
|
||||
process_queue()
|
||||
busy = 0
|
||||
update_icon()
|
||||
|
||||
if(href_list["remove_from_queue"])
|
||||
var/index = text2num(href_list["remove_from_queue"])
|
||||
if(isnum(index) && ISINRANGE(index, 1, queue.len))
|
||||
remove_from_queue(index)
|
||||
if(href_list["queue_move"] && href_list["index"])
|
||||
var/index = text2num(href_list["index"])
|
||||
var/new_index = index + text2num(href_list["queue_move"])
|
||||
if(isnum(index) && isnum(new_index))
|
||||
if(ISINRANGE(new_index, 1, queue.len))
|
||||
queue.Swap(index,new_index)
|
||||
if(href_list["clear_queue"])
|
||||
queue = list()
|
||||
if(href_list["search"])
|
||||
if(href_list["to_search"])
|
||||
temp_search = href_list["to_search"]
|
||||
if(!temp_search)
|
||||
return
|
||||
matching_designs.Cut()
|
||||
|
||||
for(var/datum/design/item/autolathe/D in files.known_designs)
|
||||
if(findtext(D.name, temp_search))
|
||||
matching_designs.Add(D)
|
||||
|
||||
screen = AUTOLATHE_SEARCH_MENU
|
||||
|
||||
SSnanoui.update_uis(src)
|
||||
return 1
|
||||
|
||||
/obj/machinery/autolathe/update_icon()
|
||||
overlays.Cut()
|
||||
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
if(panel_open)
|
||||
overlays.Add(image(icon, "[icon_state]_panel"))
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(busy)
|
||||
icon_state = "[icon_state]_work"
|
||||
if(!busy)
|
||||
icon_state = "[icon_state]_pause"
|
||||
|
||||
|
||||
|
||||
/obj/machinery/autolathe/RefreshParts()
|
||||
..()
|
||||
var/mb_rating = 0
|
||||
var/man_rating = 0
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts)
|
||||
mb_rating += MB.rating
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
man_rating += M.rating
|
||||
|
||||
storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000
|
||||
storage_capacity["glass"] = mb_rating * 12500
|
||||
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/proc/design_cost_data(datum/design/D)
|
||||
var/list/data = list()
|
||||
var/coeff = get_coeff(D)
|
||||
var/has_metal = 1
|
||||
if(D.materials[DEFAULT_WALL_MATERIAL] && (stored_material[DEFAULT_WALL_MATERIAL] < (D.materials[DEFAULT_WALL_MATERIAL] * coeff)))
|
||||
has_metal = 0
|
||||
var/has_glass = 1
|
||||
if(D.materials["glass"] && (stored_material["glass"] < (D.materials["glass"] * coeff)))
|
||||
has_glass = 0
|
||||
|
||||
data[++data.len] = list("name" = "metal", "amount" = D.materials[DEFAULT_WALL_MATERIAL] * coeff, "is_red" = !has_metal)
|
||||
data[++data.len] = list("name" = "glass", "amount" = D.materials["glass"] * coeff, "is_red" = !has_glass)
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/autolathe/proc/queue_data(list/data)
|
||||
var/temp_metal = stored_material[DEFAULT_WALL_MATERIAL]
|
||||
var/temp_glass = stored_material["glass"]
|
||||
data["processing"] = being_built.len ? get_processing_line() : null
|
||||
if(istype(queue) && queue.len)
|
||||
var/list/data_queue = list()
|
||||
for(var/list/L in queue)
|
||||
var/datum/design/item/autolathe/D = L[1]
|
||||
var/list/LL = get_design_cost_as_list(D, L[2])
|
||||
data_queue[++data_queue.len] = list("name" = initial(D.name), "can_build" = can_build(D, L[2], temp_metal, temp_glass), "multiplier" = L[2])
|
||||
temp_metal = max(temp_metal - LL[1], 1)
|
||||
temp_glass = max(temp_glass - LL[2], 1)
|
||||
data["queue"] = data_queue
|
||||
data["queue_len"] = data_queue.len
|
||||
else
|
||||
data["queue"] = null
|
||||
return data
|
||||
|
||||
/obj/machinery/autolathe/proc/get_coeff(datum/design/D)
|
||||
var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : mat_efficiency)//stacks are unaffected by production coefficient
|
||||
return coeff
|
||||
|
||||
/obj/machinery/autolathe/proc/build_item(datum/design/D, multiplier)
|
||||
desc = initial(desc)+"\nIt's building \a [initial(D.name)]."
|
||||
var/is_stack = ispath(D.build_path, /obj/item/stack)
|
||||
var/is_box = ispath(D.build_path, /obj/item/weapon/storage/box)
|
||||
var/coeff = get_coeff(D)
|
||||
var/metal_cost = D.materials[DEFAULT_WALL_MATERIAL]
|
||||
var/glass_cost = D.materials["glass"]
|
||||
var/power = max(2000, (metal_cost+glass_cost)*multiplier/5)
|
||||
if(can_build(D, multiplier))
|
||||
being_built = list(D, multiplier)
|
||||
use_power(power)
|
||||
update_icon()
|
||||
if(is_stack)
|
||||
var/list/materials_used = list(DEFAULT_WALL_MATERIAL=metal_cost*multiplier, "glass"=glass_cost*multiplier)
|
||||
//stored_material = list(DEFAULT_WALL_MATERIAL -= materials_used[DEFAULT_WALL_MATERIAL], "glass" -= materials_used["glass"])
|
||||
stored_material[DEFAULT_WALL_MATERIAL] -= materials_used[DEFAULT_WALL_MATERIAL]
|
||||
stored_material["glass"] -= materials_used["glass"]
|
||||
else
|
||||
var/list/materials_used = list(DEFAULT_WALL_MATERIAL=metal_cost*coeff, "glass"=glass_cost*coeff)
|
||||
stored_material[DEFAULT_WALL_MATERIAL] -= materials_used[DEFAULT_WALL_MATERIAL]
|
||||
stored_material["glass"] -= materials_used["glass"]
|
||||
SSnanoui.update_uis(src)
|
||||
sleep(32*coeff)
|
||||
flick("[initial(icon_state)]_finish", src)
|
||||
if(is_stack)
|
||||
var/obj/item/stack/S = new D.build_path(BuildTurf)
|
||||
S.amount = multiplier
|
||||
else
|
||||
var/obj/item/new_item = new D.build_path(BuildTurf)
|
||||
if(is_box)
|
||||
for(var/obj/item/L in new_item.contents)
|
||||
if(!(L.matter))
|
||||
continue
|
||||
L.matter[DEFAULT_WALL_MATERIAL] *= coeff
|
||||
L.matter["glass"] *= coeff
|
||||
else
|
||||
new_item.matter[DEFAULT_WALL_MATERIAL] *= coeff
|
||||
new_item.matter["glass"] *= coeff
|
||||
SSnanoui.update_uis(src)
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/machinery/autolathe/proc/can_build(var/datum/design/D, var/multiplier = 1, custom_metal, custom_glass)
|
||||
if(D.chemicals.len)
|
||||
return 0
|
||||
|
||||
var/coeff = get_coeff(D)
|
||||
var/metal_amount = stored_material[DEFAULT_WALL_MATERIAL]
|
||||
if(custom_metal)
|
||||
metal_amount = custom_metal
|
||||
var/glass_amount = stored_material["glass"]
|
||||
if(custom_glass)
|
||||
glass_amount = custom_glass
|
||||
|
||||
if(D.materials[DEFAULT_WALL_MATERIAL] && (metal_amount < (multiplier*D.materials[DEFAULT_WALL_MATERIAL] * coeff)))
|
||||
return 0
|
||||
if(D.materials["glass"] && (glass_amount < (multiplier*D.materials["glass"] * coeff)))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/autolathe/proc/get_design_cost_as_list(datum/design/D, multiplier = 1)
|
||||
var/list/OutputList = list(0,0)
|
||||
var/coeff = get_coeff(D)
|
||||
if(D.materials[DEFAULT_WALL_MATERIAL])
|
||||
OutputList[1] = (D.materials[DEFAULT_WALL_MATERIAL] * coeff)*multiplier
|
||||
if(D.materials["glass"])
|
||||
OutputList[2] = (D.materials["glass"] * coeff)*multiplier
|
||||
return OutputList
|
||||
|
||||
/obj/machinery/autolathe/proc/get_processing_line()
|
||||
var/datum/design/D = being_built[1]
|
||||
var/multiplier = being_built[2]
|
||||
var/is_stack = (multiplier>1)
|
||||
var/output = "PROCESSING: [initial(D.name)][is_stack?" (x[multiplier])":null]"
|
||||
return output
|
||||
|
||||
/obj/machinery/autolathe/proc/add_to_queue(D, multiplier)
|
||||
if(!istype(queue))
|
||||
queue = list()
|
||||
if(D)
|
||||
queue.Add(list(list(D,multiplier)))
|
||||
return queue.len
|
||||
|
||||
/obj/machinery/autolathe/proc/remove_from_queue(index)
|
||||
if(!isnum(index) || !istype(queue) || (index<1 || index>queue.len))
|
||||
return 0
|
||||
queue.Cut(index,++index)
|
||||
return 1
|
||||
|
||||
/obj/machinery/autolathe/proc/process_queue()
|
||||
var/datum/design/D = queue[1][1]
|
||||
var/multiplier = queue[1][2]
|
||||
if(!D)
|
||||
remove_from_queue(1)
|
||||
if(queue.len)
|
||||
return process_queue()
|
||||
else
|
||||
return
|
||||
while(D)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
being_built = new /list()
|
||||
return 0
|
||||
if(!can_build(D, multiplier))
|
||||
visible_message("[bicon(src)] <b>\The [src]</b> beeps, \"Not enough resources. Queue processing terminated.\"")
|
||||
queue = list()
|
||||
being_built = new /list()
|
||||
return 0
|
||||
|
||||
remove_from_queue(1)
|
||||
build_item(D,multiplier)
|
||||
D = listgetindex(listgetindex(queue, 1),1)
|
||||
multiplier = listgetindex(listgetindex(queue,1),2)
|
||||
being_built = new /list()
|
||||
|
||||
|
||||
/datum/research/autolathe
|
||||
|
||||
/datum/research/autolathe/New() //Insert techs into possible_tech here. Known_tech automatically updated.
|
||||
for(var/T in typesof(/datum/tech) - /datum/tech)
|
||||
known_tech += new T(src)
|
||||
for(var/D in typesof(/datum/design) - /datum/design)
|
||||
possible_designs += new D(src)
|
||||
// generate_integrated_circuit_designs()
|
||||
RefreshResearch()
|
||||
|
||||
|
||||
/datum/research/autolathe/DesignHasReqs(var/datum/design/D)
|
||||
if(D.req_tech.len == 0)
|
||||
return 1
|
||||
if(D.build_type == AUTOLATHE)
|
||||
return 1
|
||||
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/autolathe/proc/AddDesignViaDisk(var/mob/user, var/datum/design/D)
|
||||
for(var/datum/design/F in files.possible_designs)
|
||||
if(F.autolathe_build != 1 || F.id != D.id)
|
||||
continue
|
||||
if(F in files.known_designs)
|
||||
to_chat(user, "This design is already exists")
|
||||
return
|
||||
if(!F.category)
|
||||
F.category = "Imported"
|
||||
files.known_designs.Add(F)
|
||||
return
|
||||
|
||||
/obj/machinery/autolathe/proc/FindDesign(var/id)
|
||||
for(var/datum/design/item/desired_design in files.known_designs)
|
||||
if(desired_design.id == id)
|
||||
return desired_design
|
||||
return 0
|
||||
|
||||
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(busy)
|
||||
to_chat(user, "<span class='notice'>\The [src] is busy. Please wait for completion of previous operation.</span>")
|
||||
return
|
||||
|
||||
if(default_deconstruction_screwdriver(user, O))
|
||||
updateUsrDialog()
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, O))
|
||||
return
|
||||
if(default_part_replacement(user, O))
|
||||
return
|
||||
|
||||
if(stat)
|
||||
return
|
||||
|
||||
if(panel_open)
|
||||
//Don't eat multitools or wirecutters used on an open lathe.
|
||||
if(O.is_multitool() || O.is_wirecutter())
|
||||
wires.Interact(user)
|
||||
return
|
||||
|
||||
if(O.loc != user && !(istype(O,/obj/item/stack)))
|
||||
return 0
|
||||
|
||||
if(istype(O, /obj/item/weapon/disk))
|
||||
if(istype(O, /obj/item/weapon/disk/design_disk))
|
||||
var/obj/item/weapon/disk/design_disk/D = O
|
||||
var/datum/design/B = D.blueprint
|
||||
if(D.blueprint)
|
||||
if(B.autolathe_build == 1 || B.build_type == AUTOLATHE)
|
||||
user.visible_message("[user] begins to load \the [O] in \the [src]...", "You begin to load a design from \the [O]...", "You hear the chatter of a floppy drive.")
|
||||
busy = 1
|
||||
AddDesignViaDisk(user, D.blueprint)
|
||||
busy = 0
|
||||
else
|
||||
to_chat(user, "<span class='warning'>That disk doens't have a compatible design</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>That disk does not have a design on it!</span>")
|
||||
return
|
||||
else
|
||||
// So that people who are bad at computers don't shred their disks
|
||||
to_chat(user, "<span class='warning'>This is not the correct type of disk for the autolathe!</span>")
|
||||
return
|
||||
|
||||
if(is_robot_module(O))
|
||||
return 0
|
||||
|
||||
if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38) || istype (O,/obj/item/ammo_magazine/s44)/* VOREstation Edit*/) // Prevents ammo recycling exploit with speedloaders.
|
||||
to_chat(user, "\The [O] is too hazardous to recycle with the autolathe!")
|
||||
return
|
||||
/* ToDo: Make this actually check for ammo and change the value of the magazine if it's empty. -Spades
|
||||
var/obj/item/ammo_magazine/speedloader = O
|
||||
if(speedloader.stored_ammo)
|
||||
to_chat(user, "\The [speedloader] is too hazardous to put back into the autolathe while there's ammunition inside of it!")
|
||||
return
|
||||
else
|
||||
speedloader.matter = list(DEFAULT_WALL_MATERIAL = 75) // It's just a hunk of scrap metal now.
|
||||
if(istype(O,/obj/item/ammo_magazine)) // This was just for immersion consistency with above.
|
||||
var/obj/item/ammo_magazine/mag = O
|
||||
if(mag.stored_ammo)
|
||||
to_chat(user, "\The [mag] is too hazardous to put back into the autolathe while there's ammunition inside of it!")
|
||||
return*/
|
||||
|
||||
//Resources are being loaded.
|
||||
var/obj/item/eating = O
|
||||
if(!eating.matter)
|
||||
to_chat(user, "\The [eating] does not contain significant amounts of useful materials and cannot be accepted.")
|
||||
return
|
||||
|
||||
var/filltype = 0 // Used to determine message.
|
||||
var/total_used = 0 // Amount of material used.
|
||||
var/mass_per_sheet = 0 // Amount of material constituting one sheet.
|
||||
|
||||
for(var/material in eating.matter)
|
||||
|
||||
if(isnull(stored_material[material]) || isnull(storage_capacity[material]))
|
||||
continue
|
||||
|
||||
if(stored_material[material] >= storage_capacity[material])
|
||||
continue
|
||||
|
||||
var/total_material = eating.matter[material]
|
||||
|
||||
//If it's a stack, we eat multiple sheets.
|
||||
if(istype(eating,/obj/item/stack))
|
||||
var/obj/item/stack/stack = eating
|
||||
total_material *= stack.get_amount()
|
||||
|
||||
if(stored_material[material] + total_material > storage_capacity[material])
|
||||
total_material = storage_capacity[material] - stored_material[material]
|
||||
filltype = 1
|
||||
else
|
||||
filltype = 2
|
||||
|
||||
stored_material[material] += total_material
|
||||
total_used += total_material
|
||||
mass_per_sheet += eating.matter[material]
|
||||
|
||||
if(!filltype)
|
||||
to_chat(user, "<span class='notice'>\The [src] is full. Please remove material from the autolathe in order to insert more.</span>")
|
||||
return
|
||||
else if(filltype == 1)
|
||||
to_chat(user, "You fill \the [src] to capacity with \the [eating].")
|
||||
else
|
||||
to_chat(user, "You fill \the [src] with \the [eating].")
|
||||
|
||||
flick("autolathe_loading", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z
|
||||
|
||||
if(istype(eating,/obj/item/stack))
|
||||
var/obj/item/stack/stack = eating
|
||||
stack.use(max(1, round(total_used/mass_per_sheet))) // Always use at least 1 to prevent infinite materials.
|
||||
else
|
||||
user.remove_from_mob(O)
|
||||
qdel(O)
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/autolathe/verb/eatmaterialsnearby()
|
||||
set name = "Recycle nearby materials"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
var/filltype = 0 // Used to determine message.
|
||||
var/total_used = 0 // Amount of material used.
|
||||
if(busy)
|
||||
visible_message("[bicon(src)]<b>\The [src]</b> beeps, \"Autolathe is busy. Please wait for completion of previous operation\"")
|
||||
return
|
||||
busy = 1
|
||||
for(var/obj/item/eating in get_step(src,input_dir))
|
||||
if(istype(eating,/obj/item/ammo_magazine/clip) || istype(eating,/obj/item/ammo_magazine/s357) || istype(eating,/obj/item/ammo_magazine/s38) || istype(eating,/obj/item/ammo_magazine/s44) || istype(eating,/obj/item/stack))
|
||||
continue
|
||||
|
||||
if(!eating.matter)
|
||||
continue
|
||||
|
||||
|
||||
var/mass_per_sheet = 0 // Amount of material constituting one sheet.
|
||||
for(var/material in eating.matter)
|
||||
|
||||
if(isnull(stored_material[material]) || isnull(storage_capacity[material]))
|
||||
continue
|
||||
|
||||
if(stored_material[material] >= storage_capacity[material])
|
||||
continue
|
||||
|
||||
var/total_material = eating.matter[material]
|
||||
|
||||
|
||||
if(stored_material[material] + total_material > storage_capacity[material])
|
||||
total_material = storage_capacity[material] - stored_material[material]
|
||||
filltype = 1
|
||||
else
|
||||
filltype = 2
|
||||
|
||||
stored_material[material] += total_material
|
||||
total_used += total_material
|
||||
mass_per_sheet += eating.matter[material]
|
||||
|
||||
if(!filltype)
|
||||
visible_message("[bicon(src)]<b>\The [src]</b> beeps, \"Storage is full. Operation aborted\"")
|
||||
break
|
||||
|
||||
flick("autolathe_loading", src)
|
||||
|
||||
if(istype(eating,/obj/item/stack))
|
||||
var/obj/item/stack/stack = eating
|
||||
stack.use(max(1, round(total_used/mass_per_sheet))) // Always use at least 1 to prevent infinite materials.
|
||||
else
|
||||
qdel(eating)
|
||||
sleep(10*mat_efficiency)
|
||||
|
||||
busy = 0
|
||||
if(filltype == 1)
|
||||
visible_message("[bicon(src)] <b>\The [src]</b> beeps, \"Storage capacity full. Operation terminated. Materials recycled: [total_used]\"")
|
||||
else
|
||||
visible_message("[bicon(src)] <b>\The [src]</b> beeps, \"All materials recycled. Operation terminated. Materials recycled: [total_used]\"")
|
||||
|
||||
|
||||
|
||||
/obj/machinery/autolathe/verb/setrecyclepos()
|
||||
set name = "Set recycle input"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
input_dir_name = input("Which direction ?") in list("North", "South", "East", "West")
|
||||
switch(input_dir_name)
|
||||
if("North")
|
||||
input_dir = NORTH
|
||||
if("South")
|
||||
input_dir = SOUTH
|
||||
if("East")
|
||||
input_dir = EAST
|
||||
if("West")
|
||||
input_dir = WEST
|
||||
to_chat(src, "You set the material input to [input_dir_name]")
|
||||
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
/datum/design/item/autolathe/devices //Datum for object designs, used in construction //IDs of that techs the object originated from and the minimum level requirements.
|
||||
category = "Devices" //category item goes to
|
||||
|
||||
/datum/design/item/autolathe/devices/consolescreen
|
||||
name = "console screen"
|
||||
id = "console_screen"
|
||||
build_path = /obj/item/weapon/stock_parts/console_screen
|
||||
materials = list("glass" = 200)
|
||||
|
||||
/datum/design/item/autolathe/devices/igniter
|
||||
name = "igniter"
|
||||
id = "igniter"
|
||||
build_path = /obj/item/device/assembly/igniter
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 625, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/devices/signaler
|
||||
name = "signaler"
|
||||
id = "signaler"
|
||||
build_path = /obj/item/device/assembly/signaler
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1250, "glass" = 250)
|
||||
|
||||
/datum/design/item/autolathe/devices/sensor_infra
|
||||
name = "infrared sensor"
|
||||
id = "infrared_sensor"
|
||||
build_path = /obj/item/device/assembly/infra
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1250, "glass" = 625)
|
||||
|
||||
/datum/design/item/autolathe/devices/sensor_prox
|
||||
name = "proximity sensor"
|
||||
id = "proximity_sensor"
|
||||
build_path = /obj/item/device/assembly/prox_sensor
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250)
|
||||
|
||||
/datum/design/item/autolathe/devices/beartrap
|
||||
name = "mechanical trap"
|
||||
id = "beartrap"
|
||||
build_path = /obj/item/weapon/beartrap
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 23437)
|
||||
|
||||
/datum/design/item/autolathe/devices/electropack
|
||||
name = "electropack"
|
||||
id = "electropack"
|
||||
build_path = /obj/item/device/radio/electropack
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 3125)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/devices/timer
|
||||
name = "timer"
|
||||
id = "timer"
|
||||
build_path = /obj/item/device/assembly/timer
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250)
|
||||
@@ -1,5 +0,0 @@
|
||||
/datum/design/item/autolathe/devices/sleevecard
|
||||
name = "sleevecard"
|
||||
id = "sleevecard"
|
||||
build_path = /obj/item/device/sleevecard
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000)
|
||||
@@ -1,146 +0,0 @@
|
||||
/datum/design/item/autolathe/engineering //Datum for object designs, used in construction //IDs of that techs the object originated from and the minimum level requirements.
|
||||
category = "Engineering" //category item goes to
|
||||
|
||||
/datum/design/item/autolathe/engineering/powercontrolmodule
|
||||
name = "power control module"
|
||||
id = "powercontrolmodule"
|
||||
build_path = /obj/item/weapon/module/power_control
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/airlockmodule
|
||||
name = "airlock electronics"
|
||||
id = "airlock_electronics"
|
||||
build_path = /obj/item/weapon/airlock_electronics
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/airalarm
|
||||
name = "air alarm electronics"
|
||||
id = "airalarm_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/airalarm
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/firealarm
|
||||
name = "fire alarm electronics"
|
||||
id = "firealarm_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/firealarm
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/statusdisplay
|
||||
name = "ai status display electronics"
|
||||
id = "statusdisplay_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/ai_status_display
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/newscaster
|
||||
name = "newscaster electronics"
|
||||
id = "newscaster_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/newscaster
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/atm
|
||||
name = "atm electronics"
|
||||
id = "atm_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/atm
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/intercom
|
||||
name = "intercom electronics"
|
||||
id = "intercom_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/intercom
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/holopad
|
||||
name = "holopad electronics"
|
||||
id = "holopad_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/holopad
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/guestpass
|
||||
name = "guestpass console electronics"
|
||||
id = "guestpass_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/guestpass
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/entertainment
|
||||
name = "entertainment camera electronics"
|
||||
id = "entertainmentcamera_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/security/telescreen/entertainment
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/keycard_auth
|
||||
name = "keycard authenticator electronics"
|
||||
id = "keycardauth_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/keycard_auth
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/photocopier
|
||||
name = "photocopíer electronics"
|
||||
id = "photocopier_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/photocopier
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/fax
|
||||
name = "fax machine electronics"
|
||||
id = "fax_machine_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/fax
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/papershredder
|
||||
name = "paper shredder electronics"
|
||||
id = "papershredder_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/papershredder
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
/* Commented out for build errors
|
||||
/datum/design/item/autolathe/engineering/microwave
|
||||
name = "microwave electronics"
|
||||
id = "microwave_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/microwave
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
*/
|
||||
/datum/design/item/autolathe/engineering/washing
|
||||
name = "washing machine electronics"
|
||||
id = "washingmachine_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/washing
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/request
|
||||
name = "request console electronics"
|
||||
id = "requestconsole_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/request
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/motor
|
||||
name = "motor"
|
||||
id = "motor"
|
||||
build_path = /obj/item/weapon/stock_parts/motor
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 75, "glass" = 12)
|
||||
|
||||
/datum/design/item/autolathe/engineering/gear
|
||||
name = "gear"
|
||||
id = "gear"
|
||||
build_path = /obj/item/weapon/stock_parts/gear
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/spring
|
||||
name = "spring"
|
||||
id = "spring"
|
||||
build_path = /obj/item/weapon/stock_parts/spring
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 50)
|
||||
|
||||
/datum/design/item/autolathe/engineering/rcd_ammo
|
||||
name = "matter cartridge"
|
||||
id = "rcd_ammo"
|
||||
build_path = /obj/item/weapon/rcd_ammo
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 30000, "glass" = 15000)
|
||||
|
||||
/datum/design/item/autolathe/engineering/rcd
|
||||
name = "rapid construction device"
|
||||
id = "rcd"
|
||||
build_path = /obj/item/weapon/rcd
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62500)
|
||||
|
||||
/datum/design/item/autolathe/engineering/camera_assembly
|
||||
name = "camera assembly"
|
||||
id = "camera_assembly"
|
||||
build_path = /obj/item/weapon/camera_assembly
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 875, "glass" = 375)
|
||||
@@ -1,11 +0,0 @@
|
||||
/datum/design/item/autolathe/engineering/timeclock
|
||||
name = "timeclock electronics"
|
||||
id = "timeclock_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/timeclock
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/engineering/id_restorer
|
||||
name = "ID restoration console electronics"
|
||||
id = "idrestorer_electronics"
|
||||
build_path = /obj/item/weapon/circuitboard/id_restorer
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 62)
|
||||
@@ -158,10 +158,6 @@
|
||||
name = "maglight"
|
||||
path =/obj/item/device/flashlight/maglight
|
||||
|
||||
/datum/category_item/autolathe/general/emergency_cell
|
||||
name = "light fixture battery"
|
||||
path =/obj/item/weapon/cell/emergency_light
|
||||
|
||||
/datum/category_item/autolathe/general/idcard
|
||||
name = "ID Card"
|
||||
path = /obj/item/weapon/card/id
|
||||
|
||||
@@ -1,209 +0,0 @@
|
||||
/datum/design/item/autolathe/general //Datum for object designs, used in construction //IDs of that techs the object originated from and the minimum level requirements.
|
||||
category = "General" //category item goes to
|
||||
|
||||
/datum/design/item/autolathe/general/bucket
|
||||
name = "bucket"
|
||||
id = "bucket"
|
||||
build_path = /obj/item/weapon/reagent_containers/glass/bucket
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 250)
|
||||
|
||||
|
||||
/datum/design/item/autolathe/general/cooler_bottle
|
||||
name = "water cooler bottle"
|
||||
id = "cooler_bottle"
|
||||
build_path = /obj/item/weapon/reagent_containers/glass/cooler_bottle
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 15000)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_square
|
||||
name = "half-pint glass"
|
||||
id = "halfpint_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/square
|
||||
materials = list("glass" = 75)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_rocks
|
||||
name = "rocks glass"
|
||||
id = "rocks_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks
|
||||
materials = list("glass" = 50)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_shake
|
||||
name = "milkshake glass"
|
||||
id = "milkshake_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/shake
|
||||
materials = list("glass" = 37)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_cocktail
|
||||
name = "cocktail glass"
|
||||
id = "cocktail_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail
|
||||
materials = list("glass" = 37)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_shot
|
||||
name = "shot glass"
|
||||
id = "shot_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/shot
|
||||
materials = list("glass" = 75)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_pint
|
||||
name = "pint glass"
|
||||
id = "pint_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/pint
|
||||
materials = list("glass" = 150)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_mug
|
||||
name = "glass mug"
|
||||
id = "mug_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/mug
|
||||
materials = list("glass" = 100)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_wine
|
||||
name = "wine glass"
|
||||
id = "wine_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/wine
|
||||
materials = list("glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/general/flashlight
|
||||
name = "flashlight"
|
||||
id = "flashlight"
|
||||
build_path = /obj/item/device/flashlight
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 25)
|
||||
|
||||
|
||||
/datum/design/item/autolathe/general/floor_light
|
||||
name = "floor light"
|
||||
id = "floor_light"
|
||||
build_path = /obj/machinery/floor_light
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 3125, "glass" = 3437)
|
||||
|
||||
/datum/design/item/autolathe/general/extinguisher
|
||||
name = "fire extinguisher"
|
||||
id = "fire_extinguisher"
|
||||
build_path = /obj/item/weapon/extinguisher
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 112)
|
||||
|
||||
/datum/design/item/autolathe/general/jar
|
||||
name = "jar"
|
||||
id = "glass_jar"
|
||||
build_path = /obj/item/glass_jar
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 250)
|
||||
|
||||
/datum/design/item/autolathe/general/radio_headset
|
||||
name = "radio headset"
|
||||
id = "radio_headset"
|
||||
build_path = /obj/item/device/radio/headset
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 93)
|
||||
|
||||
/datum/design/item/autolathe/general/radio_bounced
|
||||
name = "station bounced radio"
|
||||
id = "radio_bounced"
|
||||
build_path = /obj/item/device/radio/off
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 93, "glass" = 31)
|
||||
|
||||
/datum/design/item/autolathe/general/suit_cooler
|
||||
name = "suit cooling unit"
|
||||
id = "suit_cooler"
|
||||
build_path = /obj/item/device/suit_cooling_unit
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 18750, "glass" = 4375)
|
||||
|
||||
/datum/design/item/autolathe/general/weldermask
|
||||
name = "welding mask"
|
||||
id = "weldermask"
|
||||
build_path = /obj/item/clothing/head/welding
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 3750, "glass" = 1250)
|
||||
|
||||
/datum/design/item/autolathe/general/metal
|
||||
name = "steel sheets"
|
||||
id = "steel_sheets"
|
||||
build_path = /obj/item/stack/material/steel
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
maxstack = 50
|
||||
|
||||
/datum/design/item/autolathe/general/glass
|
||||
name = "glass sheets"
|
||||
id = "glass_sheets"
|
||||
build_path = /obj/item/stack/material/glass
|
||||
materials = list("glass" = 2000)
|
||||
maxstack = 50
|
||||
|
||||
/datum/design/item/autolathe/general/rglass
|
||||
name = "reinforced glass sheets"
|
||||
id = "reinforcedglass_sheets"
|
||||
build_path = /obj/item/stack/material/glass/reinforced
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 2000)
|
||||
maxstack = 50
|
||||
|
||||
/datum/design/item/autolathe/general/rods
|
||||
name = "metal rods"
|
||||
id = "metal_rods"
|
||||
build_path = /obj/item/stack/rods
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 500)
|
||||
maxstack = 60
|
||||
|
||||
/datum/design/item/autolathe/general/spraybottle
|
||||
name = "empty spray bottle"
|
||||
id = "spraybottle"
|
||||
build_path = /obj/item/weapon/reagent_containers/spray
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 375, "glass" = 375)
|
||||
|
||||
/datum/design/item/autolathe/general/knife
|
||||
name = "kitchen knife"
|
||||
id = "kitchen_knife"
|
||||
build_path = /obj/item/weapon/material/knife
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 375)
|
||||
|
||||
/datum/design/item/autolathe/general/taperecorder
|
||||
name = "tape recorder"
|
||||
id = "taperecorder"
|
||||
build_path = /obj/item/device/taperecorder
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 75, "glass" = 37)
|
||||
|
||||
/datum/design/item/autolathe/general/light_tube
|
||||
name = "light tube"
|
||||
id = "light_tube"
|
||||
build_path = /obj/item/weapon/light/tube
|
||||
materials = list("glass" = 125)
|
||||
|
||||
/datum/design/item/autolathe/general/light_bulb
|
||||
name = "light bulb"
|
||||
id = "light_bulb"
|
||||
build_path = /obj/item/weapon/light/bulb
|
||||
materials = list("glass" = 125)
|
||||
|
||||
/datum/design/item/autolathe/general/ashtray_glass
|
||||
name = "glass ashtray"
|
||||
id = "ashtray_glass"
|
||||
build_path = /obj/item/weapon/material/ashtray/glass
|
||||
materials = list("glass" = 250)
|
||||
|
||||
/datum/design/item/autolathe/general/weldinggoggles
|
||||
name = "welding goggles"
|
||||
id = "weldinggoggles"
|
||||
build_path = /obj/item/clothing/glasses/welding
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1875, "glass" = 1250)
|
||||
|
||||
/datum/design/item/autolathe/general/maglight
|
||||
name = "maglight"
|
||||
id = "maglight"
|
||||
build_path = /obj/item/device/flashlight/maglight
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 250, "glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/general/emergency_cell
|
||||
name = "light fixture battery"
|
||||
id = "emergency_cell"
|
||||
build_path = /obj/item/weapon/cell/emergency_light
|
||||
materials = list("glass" = 25)
|
||||
|
||||
/datum/design/item/autolathe/general/handcuffs
|
||||
name = "handcuffs"
|
||||
id = "handcuffs"
|
||||
build_path = /obj/item/weapon/handcuffs
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 625)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/general/legcuffs
|
||||
name = "legcuffs"
|
||||
id = "legcuffs"
|
||||
build_path = /obj/item/weapon/handcuffs/legcuffs
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 625)
|
||||
hidden = 1
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
/datum/design/item/autolathe/general/holocollar
|
||||
name = "Holo-collar"
|
||||
id = "holocollar"
|
||||
build_path = /obj/item/clothing/accessory/collar/holo
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62)
|
||||
|
||||
/datum/design/item/autolathe/general/metaglass
|
||||
name = "metamorphic glass"
|
||||
id = "metaglass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/metaglass
|
||||
materials = list("glass" = 625)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_carafe
|
||||
name = "glass carafe"
|
||||
id = "carafe_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/carafe
|
||||
materials = list("glass" = 62)
|
||||
|
||||
/datum/design/item/autolathe/general/drinkingglass_pitcher
|
||||
name = "pitcher"
|
||||
id = "pitcher_glass"
|
||||
build_path = /obj/item/weapon/reagent_containers/food/drinks/glass2/pitcher
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62)
|
||||
@@ -1,71 +0,0 @@
|
||||
/datum/design/item/autolathe/medical //Datum for object designs, used in construction //IDs of that techs the object originated from and the minimum level requirements.
|
||||
category = "Medical" //category item goes to
|
||||
|
||||
/datum/design/item/autolathe/medical/scalpel
|
||||
name = "scalpel"
|
||||
id = "scalpel"
|
||||
build_path = /obj/item/weapon/surgical/scalpel
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 6250)
|
||||
|
||||
/datum/design/item/autolathe/medical/circularsaw
|
||||
name = "circular saw"
|
||||
id = "circularsaw"
|
||||
build_path = /obj/item/weapon/surgical/circular_saw
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 12500)
|
||||
|
||||
/datum/design/item/autolathe/medical/surgicaldrill
|
||||
name = "surgical drill"
|
||||
id = "surgicaldrill"
|
||||
build_path = /obj/item/weapon/surgical/surgicaldrill
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 18750, "glass" = 12500)
|
||||
|
||||
/datum/design/item/autolathe/medical/retractor
|
||||
name = "retractor"
|
||||
id = "retractor"
|
||||
build_path = /obj/item/weapon/surgical/retractor
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 6250)
|
||||
|
||||
/datum/design/item/autolathe/medical/cautery
|
||||
name = "cautery"
|
||||
id = "cautery"
|
||||
build_path = /obj/item/weapon/surgical/cautery
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 6250, "glass" = 3125)
|
||||
|
||||
/datum/design/item/autolathe/medical/hemostat
|
||||
name = "hemostat"
|
||||
id = "hemostat"
|
||||
build_path = /obj/item/weapon/surgical/hemostat
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 6250, "glass" = 3125)
|
||||
|
||||
/datum/design/item/autolathe/medical/beaker
|
||||
name = "glass beaker"
|
||||
id = "beaker"
|
||||
build_path = /obj/item/weapon/reagent_containers/glass/beaker
|
||||
materials = list("glass" = 625)
|
||||
|
||||
/datum/design/item/autolathe/medical/large_beaker
|
||||
name = "large glass beaker"
|
||||
id = "large_beaker"
|
||||
build_path = /obj/item/weapon/reagent_containers/glass/beaker/large
|
||||
materials = list("glass" = 1300)
|
||||
|
||||
/datum/design/item/autolathe/medical/vial
|
||||
name = "glass vial"
|
||||
id = "vial"
|
||||
build_path = /obj/item/weapon/reagent_containers/glass/beaker/vial
|
||||
materials = list("glass" = 312)
|
||||
|
||||
/datum/design/item/autolathe/medical/syringe
|
||||
name = "syringe"
|
||||
id = "syringe"
|
||||
build_path = /obj/item/weapon/reagent_containers/syringe
|
||||
materials = list("glass" = 187)
|
||||
|
||||
/datum/design/item/autolathe/medical/implanter
|
||||
name = "implanter"
|
||||
id = "implanter"
|
||||
build_path = /obj/item/weapon/implanter
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1250, "glass" = 1250)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
/datum/design/item/autolathe/medical/autoinjector
|
||||
name = "empty autoinjector"
|
||||
id = "autoinjector"
|
||||
build_path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/empty
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 100)
|
||||
@@ -1,70 +0,0 @@
|
||||
/datum/design/item/autolathe/tools //Datum for object designs, used in construction //IDs of that techs the object originated from and the minimum level requirements.
|
||||
category = "Tools" //category item goes to
|
||||
|
||||
/datum/design/item/autolathe/tools/crowbar
|
||||
name = "crowbar"
|
||||
id = "crowbar"
|
||||
build_path = /obj/item/weapon/tool/crowbar
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62)
|
||||
|
||||
/datum/design/item/autolathe/tools/multitool
|
||||
name = "multitool"
|
||||
id = "multitool"
|
||||
build_path = /obj/item/device/multitool
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62, "glass" = 25)
|
||||
|
||||
/* Causes build errors 2020-05-13 - izac112
|
||||
/datum/design/item/autolathe/tools/t_scanner
|
||||
name = "T-ray scanner"
|
||||
id = "t_scanner"
|
||||
build_path = /obj/item/device/t_scanner
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 187)
|
||||
*/
|
||||
/datum/design/item/autolathe/tools/weldertool
|
||||
name = "welding tool"
|
||||
id = "weldertool"
|
||||
build_path = /obj/item/weapon/weldingtool
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 87, "glass" = 37)
|
||||
|
||||
/datum/design/item/autolathe/tools/electric_welder
|
||||
name = "electric welding tool"
|
||||
id = "electric_welder"
|
||||
build_path = /obj/item/weapon/weldingtool/electric/unloaded
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 87, "glass" = 37)
|
||||
hidden = 1
|
||||
|
||||
/datum/design/item/autolathe/tools/screwdriver
|
||||
name = "screwdriver"
|
||||
id = "screwdriver"
|
||||
build_path = /obj/item/weapon/tool/screwdriver
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 93)
|
||||
|
||||
/datum/design/item/autolathe/tools/wirecutters
|
||||
name = "wirecutters"
|
||||
id = "wirecutters"
|
||||
build_path = /obj/item/weapon/tool/wirecutters
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 100)
|
||||
|
||||
/datum/design/item/autolathe/tools/wrench
|
||||
name = "wrench"
|
||||
id = "wrench"
|
||||
build_path = /obj/item/weapon/tool/wrench
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 187)
|
||||
|
||||
/datum/design/item/autolathe/tools/hatchet
|
||||
name = "hatchet"
|
||||
id = "hatchet"
|
||||
build_path = /obj/item/weapon/material/knife/machete/hatchet
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 500)
|
||||
|
||||
/datum/design/item/autolathe/tools/minihoe
|
||||
name = "mini hoe"
|
||||
id = "minihoe"
|
||||
build_path = /obj/item/weapon/material/minihoe
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 625)
|
||||
|
||||
/datum/design/item/autolathe/tools/welder_industrial
|
||||
name = "industrial welding tool"
|
||||
id = "welder_industrial"
|
||||
build_path = /obj/item/weapon/weldingtool/largetank
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 87, "glass" = 75)
|
||||
@@ -1,5 +0,0 @@
|
||||
/datum/design/item/autolathe/tools/prybar
|
||||
name = "prybar"
|
||||
id = "prybar"
|
||||
build_path = /obj/item/weapon/tool/prybar
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 37)
|
||||
@@ -1,15 +0,0 @@
|
||||
/datum/design/item/autolathe/tools/ice_pick
|
||||
name = "ice pick"
|
||||
id = "ice_pick"
|
||||
build_path = /obj/item/weapon/ice_pick
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 15000)
|
||||
|
||||
/datum/design/item/autolathe/tools/shovel
|
||||
name = "shovel"
|
||||
id = "shovel"
|
||||
build_path = /obj/item/weapon/shovel
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 62)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -218,7 +218,7 @@ var/global/list/PDA_Manifest = list()
|
||||
heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
|
||||
department = 1
|
||||
depthead = 1
|
||||
if(rank=="Colony Director" && heads.len != 1)
|
||||
if(rank=="Site Manager" && heads.len != 1)
|
||||
heads.Swap(1,heads.len)
|
||||
|
||||
if(SSjob.is_job_in_department(real_rank, DEPARTMENT_SECURITY))
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
var/volume = 100
|
||||
var/max_loops
|
||||
var/direct
|
||||
var/vary
|
||||
var/extra_range
|
||||
var/opacity_check
|
||||
var/pref_check
|
||||
|
||||
@@ -89,7 +91,7 @@
|
||||
continue
|
||||
SEND_SOUND(thing, S)
|
||||
else
|
||||
playsound(thing, S, volume, ignore_walls = !opacity_check, preference = pref_check)
|
||||
playsound(thing, S, volume, vary, extra_range, ignore_walls = !opacity_check, preference = pref_check)
|
||||
|
||||
/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
|
||||
if(!_mid_sounds)
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/supermatter
|
||||
mid_sounds = list('sound/machines/sm/supermatter1.ogg'=1,'sound/machines/sm/supermatter2.ogg'=1,'sound/machines/sm/supermatter3.ogg'=1)
|
||||
mid_length = 10
|
||||
volume = 1
|
||||
mid_sounds = list('sound/machines/sm/loops/calm.ogg'=1)
|
||||
mid_length = 60
|
||||
volume = 40
|
||||
extra_range = 10
|
||||
pref_check = /datum/client_preference/supermatter_hum
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -28,25 +29,74 @@
|
||||
|
||||
|
||||
/datum/looping_sound/deep_fryer
|
||||
start_sound = 'sound/machines/fryer/deep_fryer_immerse.ogg' //my immersions
|
||||
start_sound = 'sound/machines/kitchen/fryer/deep_fryer_immerse.ogg' //my immersions
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
|
||||
mid_sounds = list('sound/machines/kitchen/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/kitchen/fryer/deep_fryer_2.ogg' = 1)
|
||||
mid_length = 2
|
||||
end_sound = 'sound/machines/fryer/deep_fryer_emerge.ogg'
|
||||
end_sound = 'sound/machines/kitchen/fryer/deep_fryer_emerge.ogg'
|
||||
volume = 15
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/microwave
|
||||
start_sound = 'sound/machines/microwave/microwave-start.ogg'
|
||||
start_sound = 'sound/machines/kitchen/microwave/microwave-start.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
|
||||
mid_sounds = list('sound/machines/kitchen/microwave/microwave-mid1.ogg'=10, 'sound/machines/kitchen/microwave/microwave-mid2.ogg'=1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/microwave/microwave-end.ogg'
|
||||
end_sound = 'sound/machines/kitchen/microwave/microwave-end.ogg'
|
||||
volume = 90
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/oven
|
||||
start_sound = 'sound/machines/kitchen/oven/oven-start.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/kitchen/oven/oven-mid1.ogg'=10)
|
||||
mid_length = 40
|
||||
end_sound = 'sound/machines/kitchen/oven/oven-stop.ogg'
|
||||
volume = 50
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/grill
|
||||
start_sound = 'sound/machines/kitchen/grill/grill-start.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/kitchen/grill/grill-mid1.ogg'=10)
|
||||
mid_length = 40
|
||||
end_sound = 'sound/machines/kitchen/grill/grill-stop.ogg'
|
||||
volume = 50
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/mixer
|
||||
start_sound = 'sound/machines/kitchen/mixer/mixer-start.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/kitchen/mixer/mixer-mid1.ogg'=10)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/kitchen/mixer/mixer-stop.ogg'
|
||||
volume = 50
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/cerealmaker
|
||||
start_sound = 'sound/machines/kitchen/cerealmaker/cerealmaker-start.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/kitchen/cerealmaker/cerealmaker-mid1.ogg'=10)
|
||||
mid_length = 60
|
||||
end_sound = 'sound/machines/kitchen/cerealmaker/cerealmaker-stop.ogg'
|
||||
volume = 50
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/candymaker
|
||||
start_sound = 'sound/machines/kitchen/candymaker/candymaker-start.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/kitchen/candymaker/candymaker-mid1.ogg'=10)
|
||||
mid_length = 40
|
||||
end_sound = 'sound/machines/kitchen/candymaker/candymaker-stop.ogg'
|
||||
volume = 20
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/datum/looping_sound/air_pump
|
||||
start_sound = 'sound/machines/air_pump/airpumpstart.ogg'
|
||||
start_length = 10
|
||||
|
||||
@@ -50,13 +50,13 @@
|
||||
access = access_atmospherics
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/phoron)
|
||||
|
||||
/datum/supply_pack/atmos/canister_sleeping_agent
|
||||
/datum/supply_pack/atmos/canister_nitrous_oxide
|
||||
name = "N2O gas canister"
|
||||
cost = 15
|
||||
containername = "N2O gas canister crate"
|
||||
containertype = /obj/structure/closet/crate/secure/large/aether
|
||||
access = access_atmospherics
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/sleeping_agent)
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/nitrous_oxide)
|
||||
|
||||
/datum/supply_pack/atmos/canister_carbon_dioxide
|
||||
name = "Carbon dioxide gas canister"
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
/obj/item/clothing/under/lawyer/bluesuit,
|
||||
/obj/item/clothing/under/lawyer/purpsuit,
|
||||
/obj/item/clothing/shoes/black = 2,
|
||||
/obj/item/clothing/shoes/leather,
|
||||
/obj/item/clothing/shoes/laceup/brown,
|
||||
/obj/item/clothing/accessory/wcoat
|
||||
)
|
||||
name = "Formalwear (Suits)"
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
/obj/item/clothing/under/pants/chaps,
|
||||
/obj/item/clothing/under/pants/chaps/black,
|
||||
/obj/item/clothing/under/harness,
|
||||
/obj/item/clothing/shoes/leather,
|
||||
/obj/item/clothing/shoes/laceup/brown,
|
||||
/obj/item/clothing/shoes/boots/jungle,
|
||||
/obj/item/clothing/shoes/boots/jackboots,
|
||||
/obj/item/clothing/shoes/boots/cowboy,
|
||||
@@ -261,4 +261,24 @@
|
||||
)
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Saddlebags crate"
|
||||
containername = "Saddlebags crate"
|
||||
|
||||
/datum/supply_pack/costumes/knights_gear
|
||||
name = "Knights Gear"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/galahad,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/lancelot,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/robin,
|
||||
/obj/item/clothing/suit/armor/combat/crusader_costume,
|
||||
/obj/item/clothing/suit/armor/combat/crusader_costume/bedevere,
|
||||
/obj/item/clothing/head/helmet/combat/crusader_costume,
|
||||
/obj/item/clothing/head/helmet/combat/bedevere_costume,
|
||||
/obj/item/clothing/gloves/combat/knight_costume,
|
||||
/obj/item/clothing/gloves/combat/knight_costume/brown,
|
||||
/obj/item/clothing/shoes/knight_costume,
|
||||
/obj/item/clothing/shoes/knight_costume/black
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Knights Gear Crate"
|
||||
@@ -54,19 +54,12 @@
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "cooking oil tank crate"
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/
|
||||
group = "Hospitality"
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/pizza
|
||||
/datum/supply_pack/hospitality/pizza
|
||||
name = "Surprise pack of five pizzas"
|
||||
contains = list(
|
||||
/obj/random/pizzabox,
|
||||
/obj/random/pizzabox,
|
||||
/obj/random/pizzabox,
|
||||
/obj/random/pizzabox,
|
||||
/obj/random/pizzabox,
|
||||
/obj/random/pizzabox = 5,
|
||||
/obj/item/weapon/material/knife/plastic
|
||||
)
|
||||
name = "Surprise pack of five pizzas"
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/freezer/centauri
|
||||
containername = "Pizza crate"
|
||||
@@ -83,4 +76,8 @@
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/allico
|
||||
containername = "crate of gifts"
|
||||
containername = "crate of gifts"
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/
|
||||
group = "Hospitality"
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
switch(wire)
|
||||
if(WIRE_AUTOLATHE_HACK)
|
||||
A.hacked = !mend
|
||||
A.update_tgui_static_data(usr)
|
||||
if(WIRE_ELECTRIFY)
|
||||
A.shocked = !mend
|
||||
if(WIRE_AUTOLATHE_DISABLE)
|
||||
@@ -38,9 +39,11 @@
|
||||
switch(wire)
|
||||
if(WIRE_AUTOLATHE_HACK)
|
||||
A.hacked = !A.hacked
|
||||
A.update_tgui_static_data(usr)
|
||||
spawn(50)
|
||||
if(A && !is_cut(wire))
|
||||
A.hacked = 0
|
||||
A.update_tgui_static_data(usr)
|
||||
if(WIRE_ELECTRIFY)
|
||||
A.shocked = !A.shocked
|
||||
spawn(50)
|
||||
|
||||
@@ -43,12 +43,12 @@
|
||||
|
||||
flags = XGM_GAS_FUEL
|
||||
|
||||
/decl/xgm_gas/sleeping_agent
|
||||
id = "sleeping_agent"
|
||||
name = "Sleeping Agent"
|
||||
/decl/xgm_gas/nitrous_oxide
|
||||
id = "nitrous_oxide"
|
||||
name = "Nitrous Oxide"
|
||||
specific_heat = 40 // J/(mol*K)
|
||||
molar_mass = 0.044 // kg/mol. N2O
|
||||
|
||||
tile_overlay = "sleeping_agent"
|
||||
tile_overlay = "nitrous_oxide"
|
||||
overlay_limit = 1
|
||||
flags = XGM_GAS_OXIDIZER
|
||||
@@ -127,6 +127,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 20
|
||||
drop_sound = 'sound/items/drop/rubber.ogg'
|
||||
pickup_sound = 'sound/items/pickup/rubber.ogg'
|
||||
|
||||
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
|
||||
user.drop_item()
|
||||
|
||||
@@ -79,6 +79,8 @@
|
||||
/obj/item/weapon/disk
|
||||
name = "disk"
|
||||
icon = 'icons/obj/discs_vr.dmi' //VOREStation Edit
|
||||
drop_sound = 'sound/items/drop/disk.ogg'
|
||||
pickup_sound = 'sound/items/pickup/disk.ogg'
|
||||
|
||||
/obj/item/weapon/disk/nuclear
|
||||
name = "nuclear authentication disk"
|
||||
|
||||
@@ -6,7 +6,7 @@ var/datum/antagonist/mutineer/mutineers
|
||||
role_text_plural = "Mutineers"
|
||||
id = MODE_MUTINEER
|
||||
antag_indicator = "mutineer"
|
||||
restricted_jobs = list("Colony Director")
|
||||
restricted_jobs = list("Site Manager")
|
||||
|
||||
/datum/antagonist/mutineer/New(var/no_reference)
|
||||
..()
|
||||
@@ -39,7 +39,7 @@ var/datum/antagonist/mutineer/mutineers
|
||||
proc/get_head_loyalist_candidates()
|
||||
var/list/candidates[0]
|
||||
for(var/mob/loyalist in player_list)
|
||||
if(loyalist.mind && loyalist.mind.assigned_role == "Colony Director")
|
||||
if(loyalist.mind && loyalist.mind.assigned_role == "Site Manager")
|
||||
candidates.Add(loyalist.mind)
|
||||
return candidates
|
||||
|
||||
@@ -47,7 +47,7 @@ var/datum/antagonist/mutineer/mutineers
|
||||
var/list/candidates[0]
|
||||
for(var/mob/mutineer in player_list)
|
||||
if(mutineer.client.prefs.be_special & BE_MUTINEER)
|
||||
for(var/job in command_positions - "Colony Director")
|
||||
for(var/job in command_positions - "Site Manager")
|
||||
if(mutineer.mind && mutineer.mind.assigned_role == job)
|
||||
candidates.Add(mutineer.mind)
|
||||
return candidates
|
||||
|
||||
@@ -14,7 +14,7 @@ var/datum/antagonist/ert/ert
|
||||
and before taking extreme actions, please try to also contact the administration! \
|
||||
Think through your actions and make the roleplay immersive! <b>Please remember all \
|
||||
rules aside from those without explicit exceptions apply to the ERT.</b>"
|
||||
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Colony Director where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Colony Director where possible, however."
|
||||
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Site Manager where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Site Manager where possible, however."
|
||||
landmark_id = "Response Team"
|
||||
id_type = /obj/item/weapon/card/id/centcom/ERT
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
bantype = "changeling"
|
||||
feedback_tag = "changeling_objective"
|
||||
avoid_silicons = TRUE
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Colony Director")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Site Manager")
|
||||
welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
|
||||
antag_sound = 'sound/effects/antag_notice/ling_alert.ogg'
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
|
||||
@@ -13,8 +13,8 @@ var/datum/antagonist/cultist/cult
|
||||
bantype = "cultist"
|
||||
restricted_jobs = list("Chaplain")
|
||||
avoid_silicons = TRUE
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
roundstart_restricted = list("Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Site Manager")
|
||||
roundstart_restricted = list("Internal Affairs Agent", "Head of Security", "Site Manager")
|
||||
role_type = BE_CULTIST
|
||||
feedback_tag = "cult_objective"
|
||||
antag_indicator = "cult"
|
||||
|
||||
@@ -11,7 +11,7 @@ var/datum/antagonist/traitor/infiltrator/infiltrators
|
||||
role_text = "Infiltrator"
|
||||
role_text_plural = "Infiltrators"
|
||||
welcome_text = "To speak on your team's private channel, use :t."
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Site Manager")
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
can_speak_aooc = TRUE
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@ var/datum/antagonist/revolutionary/revs
|
||||
faction_invisible = 1
|
||||
|
||||
avoid_silicons = TRUE
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
roundstart_restricted = list("Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Site Manager", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
roundstart_restricted = list("Internal Affairs Agent", "Site Manager", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
|
||||
/datum/antagonist/revolutionary/New()
|
||||
..()
|
||||
|
||||
@@ -4,7 +4,7 @@ var/datum/antagonist/traitor/traitors
|
||||
/datum/antagonist/traitor
|
||||
id = MODE_TRAITOR
|
||||
antag_sound = 'sound/effects/antag_notice/traitor_alert.ogg'
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Site Manager")
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
can_speak_aooc = FALSE // If they want to plot and plan as this sort of traitor, they'll need to do it ICly.
|
||||
|
||||
|
||||
@@ -289,6 +289,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/centcom/bathroom
|
||||
name = "\improper CentCom Bathroom"
|
||||
icon_state = "centcom_crew"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
//SYNDICATES
|
||||
|
||||
@@ -745,6 +746,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Substation"
|
||||
icon_state = "substation"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
ambience = AMBIENCE_SUBSTATION
|
||||
|
||||
/area/maintenance/substation/engineering // Probably will be connected to engineering SMES room, as wires cannot be crossed properly without them sharing powernets.
|
||||
name = "Engineering Substation"
|
||||
@@ -959,7 +961,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/captain
|
||||
name = "\improper Command - Colony Director's Office"
|
||||
name = "\improper Command - Site Manager's Office"
|
||||
icon_state = "captain"
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
@@ -1216,6 +1218,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/recreation_area_restroom
|
||||
name = "\improper Recreation Area Restroom"
|
||||
icon_state = "recreation_area_restroom"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/pool
|
||||
name = "\improper Pool"
|
||||
@@ -1241,6 +1244,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/barrestroom
|
||||
name = "\improper Cafeteria Restroom"
|
||||
icon_state = "bar"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/theatre
|
||||
name = "\improper Theatre"
|
||||
@@ -1390,6 +1394,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "\improper Atmospherics"
|
||||
icon_state = "atmos"
|
||||
sound_env = LARGE_ENCLOSED
|
||||
ambience = AMBIENCE_ATMOS
|
||||
|
||||
/area/engineering/atmos/monitoring
|
||||
name = "\improper Atmospherics Monitoring Room"
|
||||
@@ -1613,6 +1618,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/medical_restroom
|
||||
name = "\improper Medbay Restroom"
|
||||
icon_state = "medbay_restroom"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/medical/patients_rooms
|
||||
name = "\improper Patient's Rooms"
|
||||
@@ -1806,6 +1812,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/security/security_bathroom
|
||||
name = "\improper Security - Restroom"
|
||||
icon_state = "security_bathroom"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/security/security_cell_hallway
|
||||
name = "\improper Security - Cell Hallway"
|
||||
@@ -1954,6 +1961,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/rnd/research_restroom
|
||||
name = "\improper Research Restroom"
|
||||
icon_state = "research_restroom"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
/area/rnd/research_storage
|
||||
name = "\improper Research Storage"
|
||||
|
||||
+3
-1
@@ -488,7 +488,7 @@
|
||||
// Use for objects performing visible actions
|
||||
// message is output to anyone who can see, e.g. "The [src] does something!"
|
||||
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
||||
/atom/proc/visible_message(var/message, var/blind_message)
|
||||
/atom/proc/visible_message(var/message, var/blind_message, var/list/exclude_mobs = null)
|
||||
|
||||
//VOREStation Edit
|
||||
var/list/see
|
||||
@@ -501,6 +501,8 @@
|
||||
|
||||
var/list/seeing_mobs = see["mobs"]
|
||||
var/list/seeing_objs = see["objs"]
|
||||
if(LAZYLEN(exclude_mobs))
|
||||
seeing_mobs -= exclude_mobs
|
||||
|
||||
for(var/obj in seeing_objs)
|
||||
var/obj/O = obj
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
force = 30
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
drop_sound = 'sound/items/drop/sword.ogg'
|
||||
pickup_sound = 'sound/items/pickup/sword.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
edge = 1
|
||||
sharp = 1
|
||||
|
||||
@@ -297,9 +297,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE")
|
||||
if(5)
|
||||
to_chat(M, "<br>")
|
||||
to_chat(M, "<span class='danger'>THE COLONY DIRECTOR, HOP AND HOS ARE [who2]...LAWS UPDATED</span>")
|
||||
to_chat(M, "<span class='danger'>THE SITE MANAGER, HOP AND HOS ARE [who2]...LAWS UPDATED</span>")
|
||||
to_chat(M, "<br>")
|
||||
M.add_ion_law("THE COLONY DIRECTOR, HOP AND HOS ARE [who2]")
|
||||
M.add_ion_law("THE SITE MANAGER, HOP AND HOS ARE [who2]")
|
||||
if(6)
|
||||
to_chat(M, "<br>")
|
||||
to_chat(M, "<span class='danger'>THE STATION IS BUILT FOR [who2]...LAWS UPDATED</span>")
|
||||
|
||||
@@ -564,7 +564,7 @@ datum
|
||||
|
||||
captainslaser
|
||||
steal_target = /obj/item/weapon/gun/energy/captain
|
||||
explanation_text = "Steal the Colony Director's antique laser gun."
|
||||
explanation_text = "Steal the Site Manager's antique laser gun."
|
||||
weight = 20
|
||||
|
||||
get_points(var/job)
|
||||
|
||||
@@ -427,11 +427,11 @@ datum/objective/steal
|
||||
var/target_name
|
||||
|
||||
var/global/possible_items[] = list(
|
||||
"the Colony Director's antique laser gun" = /obj/item/weapon/gun/energy/captain,
|
||||
"the Site Manager's antique laser gun" = /obj/item/weapon/gun/energy/captain,
|
||||
"a hand teleporter" = /obj/item/weapon/hand_tele,
|
||||
"an RCD" = /obj/item/weapon/rcd,
|
||||
"a jetpack" = /obj/item/weapon/tank/jetpack,
|
||||
"a colony director's jumpsuit" = /obj/item/clothing/under/rank/captain,
|
||||
"a site manager's jumpsuit" = /obj/item/clothing/under/rank/captain,
|
||||
"a functional AI" = /obj/item/device/aicard,
|
||||
"a pair of magboots" = /obj/item/clothing/shoes/magboots,
|
||||
"the station blueprints" = /obj/item/blueprints,
|
||||
@@ -445,7 +445,7 @@ datum/objective/steal
|
||||
"a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security,
|
||||
"a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel,
|
||||
"the hypospray" = /obj/item/weapon/reagent_containers/hypospray/vial,
|
||||
"the colony director's pinpointer" = /obj/item/weapon/pinpointer,
|
||||
"the site manager's pinpointer" = /obj/item/weapon/pinpointer,
|
||||
"an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof,
|
||||
)
|
||||
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
"Glass Shattering" = "shatter",
|
||||
"Grille Damage" = 'sound/effects/grillehit.ogg',
|
||||
"Energy Pulse" = 'sound/effects/EMPulse.ogg',
|
||||
"Airlock" = 'sound/machines/airlock.ogg',
|
||||
"Airlock Creak" = 'sound/machines/airlock_creaking.ogg',
|
||||
"Airlock" = 'sound/machines/door/old_airlock.ogg',
|
||||
"Airlock Creak" = 'sound/machines/door/airlock_creaking.ogg',
|
||||
|
||||
"Shotgun Pumping" = 'sound/weapons/shotgunpump.ogg',
|
||||
"Flash" = 'sound/weapons/flash.ogg',
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
/var/const/access_captain = 20
|
||||
/datum/access/captain
|
||||
id = access_captain
|
||||
desc = "Colony Director"
|
||||
desc = "Site Manager"
|
||||
region = ACCESS_REGION_COMMAND
|
||||
|
||||
/var/const/access_all_personal_lockers = 21
|
||||
|
||||
@@ -5,7 +5,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
//////////////////////////////////
|
||||
|
||||
/datum/job/captain
|
||||
title = "Colony Director"
|
||||
title = "Site Manager"
|
||||
flag = CAPTAIN
|
||||
departments = list(DEPARTMENT_COMMAND)
|
||||
sorting_order = 3 // Above everyone.
|
||||
@@ -26,11 +26,10 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
ideal_character_age = 70 // Old geezer captains ftw
|
||||
|
||||
outfit_type = /decl/hierarchy/outfit/job/captain
|
||||
job_description = "The Colony Director manages the other Command Staff, and through them the rest of the station. Though they have access to everything, \
|
||||
they do not understand everything, and are expected to delegate tasks to the appropriate crew member. The Colony Director is expected to \
|
||||
job_description = "The Site Manager manages the other Command Staff, and through them the rest of the station. Though they have access to everything, \
|
||||
they do not understand everything, and are expected to delegate tasks to the appropriate crew member. The Site Manager is expected to \
|
||||
have an understanding of Standard Operating Procedure, and is subject to it, and legal action, in the same way as every other crew member."
|
||||
alt_titles = list("Site Manager" = /datum/alt_title/site_manager,
|
||||
"Overseer" = /datum/alt_title/overseer)
|
||||
alt_titles = list("Overseer"= /datum/alt_title/overseer)
|
||||
|
||||
//YW UNCOMMENTINGSTART: REINSTATE LOYALTY IMPLANT
|
||||
/datum/job/captain/equip(var/mob/living/carbon/human/H)
|
||||
@@ -45,9 +44,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
|
||||
|
||||
// Captain Alt Titles
|
||||
/datum/alt_title/site_manager
|
||||
title = "Site Manager"
|
||||
|
||||
/datum/alt_title/overseer
|
||||
title = "Overseer"
|
||||
|
||||
@@ -64,7 +60,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
supervisors = "the Site Manager"
|
||||
selection_color = "#1D1D4F"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
supervisors = "the Site Manager"
|
||||
selection_color = "#7F6E2C"
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
supervisors = "the Site Manager"
|
||||
selection_color = "#026865"
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
supervisors = "the Site Manager"
|
||||
selection_color = "#AD6BAD"
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 15
|
||||
|
||||
@@ -20,6 +20,11 @@
|
||||
alt_titles = list("Xenoarchaeologist" = /datum/alt_title/xenoarch, "Anomalist" = /datum/alt_title/anomalist, \
|
||||
"Phoron Researcher" = /datum/alt_title/phoron_research, "Circuit Designer" = /datum/alt_title/circuit_designer)
|
||||
|
||||
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_xenobotany)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) // Unchanged (for now?), mostly here for reference
|
||||
|
||||
|
||||
/datum/alt_title/circuit_designer
|
||||
title = "Circuit Designer"
|
||||
title_blurb = "A Circuit Designer is a Scientist whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the Colony Director"
|
||||
supervisors = "the Site Manager"
|
||||
selection_color = "#8E2929"
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
|
||||
@@ -394,7 +394,7 @@ var/global/datum/controller/occupations/job_master
|
||||
var/datum/gear/G = gear_datums[thing]
|
||||
if(!G) //Not a real gear datum (maybe removed, as this is loaded from their savefile)
|
||||
continue
|
||||
|
||||
|
||||
var/permitted
|
||||
// Check if it is restricted to certain roles
|
||||
if(G.allowed_roles)
|
||||
@@ -435,13 +435,13 @@ var/global/datum/controller/occupations/job_master
|
||||
|
||||
// Set up their account
|
||||
job.setup_account(H)
|
||||
|
||||
|
||||
// Equip job items.
|
||||
job.equip(H, H.mind ? H.mind.role_alt_title : "")
|
||||
|
||||
|
||||
// Stick their fingerprints on literally everything
|
||||
job.apply_fingerprints(H)
|
||||
|
||||
|
||||
// Only non-silicons get post-job-equip equipment
|
||||
if(!(job.mob_type & JOB_SILICON))
|
||||
H.equip_post_job()
|
||||
@@ -487,11 +487,11 @@ var/global/datum/controller/occupations/job_master
|
||||
return H.Robotize()
|
||||
if(job.mob_type & JOB_SILICON_AI)
|
||||
return H
|
||||
|
||||
|
||||
// TWEET PEEP
|
||||
if(rank == "Colony Director")
|
||||
if(rank == "Site Manager")
|
||||
var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP) ? null : sound('sound/misc/boatswain.ogg', volume=20)
|
||||
captain_announcement.Announce("All hands, [alt_title ? alt_title : "Colony Director"] [H.real_name] on deck!", new_sound = announce_sound, zlevel = H.z)
|
||||
captain_announcement.Announce("All hands, [alt_title ? alt_title : "Site Manager"] [H.real_name] on deck!", new_sound = announce_sound, zlevel = H.z)
|
||||
|
||||
//Deferred item spawning.
|
||||
if(spawn_in_storage && spawn_in_storage.len)
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
M.forceMove(src)
|
||||
occupant = M
|
||||
update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such.
|
||||
playsound(src, 'sound/machines/medbayscanner1.ogg', 50) // Beepboop you're being scanned. <3
|
||||
add_fingerprint(user)
|
||||
qdel(G)
|
||||
SStgui.update_uis(src)
|
||||
@@ -101,6 +102,7 @@
|
||||
O.forceMove(src)
|
||||
occupant = O
|
||||
update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such.
|
||||
playsound(src, 'sound/machines/medbayscanner1.ogg', 50) // Beepboop you're being scanned. <3
|
||||
add_fingerprint(user)
|
||||
SStgui.update_uis(src)
|
||||
|
||||
@@ -332,6 +334,7 @@
|
||||
if("print_p")
|
||||
var/atom/target = console ? console : src
|
||||
visible_message("<span class='notice'>[target] rattles and prints out a sheet of paper.</span>")
|
||||
playsound(src, 'sound/machines/printer.ogg', 50, 1)
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(target))
|
||||
var/name = occupant ? occupant.name : "Unknown"
|
||||
P.info = "<CENTER><B>Body Scan - [name]</B></CENTER><BR>"
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/list/TLV = list()
|
||||
var/list/trace_gas = list("sleeping_agent", "volatile_fuel") //list of other gases that this air alarm is able to detect
|
||||
var/list/trace_gas = list("nitrous_oxide", "volatile_fuel") //list of other gases that this air alarm is able to detect
|
||||
|
||||
var/danger_level = 0
|
||||
var/pressure_dangerlevel = 0
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
/obj/machinery/portable_atmospherics/canister/drain_power()
|
||||
return -1
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/sleeping_agent
|
||||
/obj/machinery/portable_atmospherics/canister/nitrous_oxide
|
||||
name = "Canister: \[N2O\]"
|
||||
icon_state = "redws"
|
||||
canister_color = "redws"
|
||||
@@ -88,7 +88,7 @@
|
||||
name = "Canister \[CO2\]"
|
||||
icon_state = "black"
|
||||
canister_color = "black"
|
||||
/obj/machinery/portable_atmospherics/canister/empty/sleeping_agent
|
||||
/obj/machinery/portable_atmospherics/canister/empty/nitrous_oxide
|
||||
name = "Canister \[N2O\]"
|
||||
icon_state = "redws"
|
||||
canister_color = "redws"
|
||||
@@ -390,17 +390,17 @@ update_flag
|
||||
src.update_icon()
|
||||
return 1
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/sleeping_agent/New()
|
||||
/obj/machinery/portable_atmospherics/canister/nitrous_oxide/New()
|
||||
..()
|
||||
|
||||
air_contents.adjust_gas("sleeping_agent", MolesForPressure())
|
||||
air_contents.adjust_gas("nitrous_oxide", MolesForPressure())
|
||||
src.update_icon()
|
||||
return 1
|
||||
|
||||
//Dirty way to fill room with gas. However it is a bit easier to do than creating some floor/engine/n2o -rastaf0
|
||||
/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller/Initialize()
|
||||
/obj/machinery/portable_atmospherics/canister/nitrous_oxide/roomfiller/Initialize()
|
||||
. = ..()
|
||||
air_contents.gas["sleeping_agent"] = 9*4000
|
||||
air_contents.gas["nitrous_oxide"] = 9*4000
|
||||
var/turf/simulated/location = src.loc
|
||||
if (istype(src.loc))
|
||||
location.assume_air(air_contents)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/minrate = 0
|
||||
var/maxrate = 10 * ONE_ATMOSPHERE
|
||||
|
||||
var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "volatile_fuel")
|
||||
var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "nitrous_oxide", "volatile_fuel")
|
||||
|
||||
/obj/machinery/portable_atmospherics/powered/scrubber/New()
|
||||
..()
|
||||
|
||||
+227
-147
@@ -11,16 +11,19 @@
|
||||
clickvol = 30
|
||||
|
||||
circuit = /obj/item/weapon/circuitboard/autolathe
|
||||
var/datum/category_collection/autolathe/machine_recipes
|
||||
|
||||
var/static/datum/category_collection/autolathe/autolathe_recipes
|
||||
var/list/stored_material = list(DEFAULT_WALL_MATERIAL = 0, MAT_GLASS = 0, MAT_PLASTEEL = 0, MAT_PLASTIC = 0)
|
||||
var/list/storage_capacity = list(DEFAULT_WALL_MATERIAL = 0, MAT_GLASS = 0, MAT_PLASTEEL = 0, MAT_PLASTIC = 0)
|
||||
var/datum/category_group/autolathe/current_category
|
||||
|
||||
var/hacked = 0
|
||||
var/disabled = 0
|
||||
var/shocked = 0
|
||||
var/busy = 0
|
||||
|
||||
var/input_dir = NORTH //YWedit
|
||||
var/input_dir_name = "North"//YWEdit
|
||||
|
||||
var/mat_efficiency = 1
|
||||
var/build_time = 50
|
||||
|
||||
@@ -33,6 +36,8 @@
|
||||
|
||||
/obj/machinery/autolathe/Initialize()
|
||||
. = ..()
|
||||
if(!autolathe_recipes)
|
||||
autolathe_recipes = new()
|
||||
wires = new(src)
|
||||
default_apply_parts()
|
||||
RefreshParts()
|
||||
@@ -42,87 +47,77 @@
|
||||
wires = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/autolathe/proc/update_recipe_list()
|
||||
if(!machine_recipes)
|
||||
if(!autolathe_recipes)
|
||||
autolathe_recipes = new()
|
||||
machine_recipes = autolathe_recipes
|
||||
current_category = machine_recipes.categories[1]
|
||||
/obj/machinery/autolathe/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Autolathe", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/autolathe/interact(mob/user as mob)
|
||||
update_recipe_list()
|
||||
/obj/machinery/autolathe/tgui_status(mob/user)
|
||||
if(disabled)
|
||||
return STATUS_CLOSE
|
||||
return ..()
|
||||
|
||||
if(..() || (disabled && !panel_open))
|
||||
/obj/machinery/autolathe/tgui_static_data(mob/user)
|
||||
var/list/data = ..()
|
||||
|
||||
var/list/categories = list()
|
||||
var/list/recipes = list()
|
||||
for(var/datum/category_group/autolathe/A in autolathe_recipes.categories)
|
||||
categories += A.name
|
||||
for(var/datum/category_item/autolathe/M in A.items)
|
||||
if(M.hidden && !hacked)
|
||||
continue
|
||||
if(M.man_rating > man_rating)
|
||||
continue
|
||||
recipes.Add(list(list(
|
||||
"category" = A.name,
|
||||
"name" = M.name,
|
||||
"ref" = REF(M),
|
||||
"requirements" = M.resources,
|
||||
"hidden" = M.hidden,
|
||||
"coeff_applies" = !M.no_scale,
|
||||
)))
|
||||
data["recipes"] = recipes
|
||||
data["categories"] = categories
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/autolathe/ui_assets(mob/user)
|
||||
return list(
|
||||
get_asset_datum(/datum/asset/spritesheet/sheetmaterials)
|
||||
)
|
||||
|
||||
/obj/machinery/autolathe/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
var/list/data = ..()
|
||||
|
||||
var/list/material_data = list()
|
||||
for(var/mat_id in stored_material)
|
||||
var/amount = stored_material[mat_id]
|
||||
var/list/material_info = list(
|
||||
"name" = mat_id,
|
||||
"amount" = amount,
|
||||
"sheets" = round(amount / SHEET_MATERIAL_AMOUNT),
|
||||
"removable" = amount >= SHEET_MATERIAL_AMOUNT
|
||||
)
|
||||
material_data += list(material_info)
|
||||
data["busy"] = busy
|
||||
data["materials"] = material_data
|
||||
data["mat_efficiency"] = mat_efficiency
|
||||
return data
|
||||
|
||||
/obj/machinery/autolathe/interact(mob/user)
|
||||
if(panel_open)
|
||||
return wires.Interact(user)
|
||||
|
||||
if(disabled)
|
||||
to_chat(user, "<span class='danger'>\The [src] is disabled!</span>")
|
||||
return
|
||||
|
||||
if(shocked)
|
||||
shock(user, 50)
|
||||
var/list/dat = list()
|
||||
dat += "<center><h1>Autolathe Control Panel</h1><hr/>"
|
||||
|
||||
if(!disabled)
|
||||
dat += "<table width = '100%'>"
|
||||
var/list/material_top = list("<tr>")
|
||||
var/list/material_bottom = list("<tr>")
|
||||
|
||||
for(var/material in stored_material)
|
||||
if(material != DEFAULT_WALL_MATERIAL && material != MAT_GLASS) // Don't show the Extras unless people care enough to put them in.
|
||||
if(stored_material[material] <= 0)
|
||||
continue
|
||||
material_top += "<td width = '25%' align = center><b>[material]</b></td>"
|
||||
material_bottom += "<td width = '25%' align = center>[stored_material[material]]<b>/[storage_capacity[material]]</b></td>"
|
||||
|
||||
dat += "[material_top.Join()]</tr>[material_bottom.Join()]</tr></table><hr>"
|
||||
dat += "<b>Filter:</b> <a href='?src=\ref[src];setfilter=1'>[filtertext ? filtertext : "None Set"]</a><br>"
|
||||
dat += "<h2>Printable Designs</h2><h3>Showing: <a href='?src=\ref[src];change_category=1'>[current_category]</a>.</h3></center><table width = '100%'>"
|
||||
|
||||
for(var/datum/category_item/autolathe/R in current_category.items)
|
||||
if(R.hidden && !hacked) // Illegal or nonstandard.
|
||||
continue
|
||||
if(R.man_rating > man_rating) // Advanced parts.
|
||||
continue
|
||||
if(filtertext && findtext(R.name, filtertext) == 0)
|
||||
continue
|
||||
var/can_make = 1
|
||||
var/list/material_string = list()
|
||||
var/list/multiplier_string = list()
|
||||
var/max_sheets
|
||||
var/comma
|
||||
if(!R.resources || !R.resources.len)
|
||||
material_string += "No resources required.</td>"
|
||||
else
|
||||
//Make sure it's buildable and list requires resources.
|
||||
for(var/material in R.resources)
|
||||
var/coeff = (R.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
|
||||
var/sheets = round(stored_material[material]/round(R.resources[material]*coeff))
|
||||
if(isnull(max_sheets) || max_sheets > sheets)
|
||||
max_sheets = sheets
|
||||
if(!isnull(stored_material[material]) && stored_material[material] < round(R.resources[material]*coeff))
|
||||
can_make = 0
|
||||
if(!comma)
|
||||
comma = 1
|
||||
else
|
||||
material_string += ", "
|
||||
material_string += "[round(R.resources[material] * coeff)] [material]"
|
||||
material_string += ".<br></td>"
|
||||
//Build list of multipliers for sheets.
|
||||
if(R.is_stack)
|
||||
if(max_sheets && max_sheets > 0)
|
||||
max_sheets = min(max_sheets, R.max_stack) // Limit to the max allowed by stack type.
|
||||
multiplier_string += "<br>"
|
||||
for(var/i = 5;i<max_sheets;i*=2) //5,10,20,40...
|
||||
multiplier_string += "<a href='?src=\ref[src];make=\ref[R];multiplier=[i]'>\[x[i]\]</a>"
|
||||
multiplier_string += "<a href='?src=\ref[src];make=\ref[R];multiplier=[max_sheets]'>\[x[max_sheets]\]</a>"
|
||||
|
||||
dat += "<tr><td width = 180>[R.hidden ? "<font color = 'red'>*</font>" : ""]<b>[can_make ? "<a href='?src=\ref[src];make=\ref[R];multiplier=1'>" : "<span class='linkOff'>"][R.name][can_make ? "</a>" : "</span>"]</b>[R.hidden ? "<font color = 'red'>*</font>" : ""][multiplier_string.Join()]</td><td align = right>[material_string.Join()]</tr>"
|
||||
|
||||
dat += "</table><hr>"
|
||||
|
||||
dat = jointext(dat, null)
|
||||
var/datum/browser/popup = new(user, "autolathe", "Autolathe Production Menu", 550, 700)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(busy)
|
||||
@@ -130,7 +125,7 @@
|
||||
return
|
||||
|
||||
if(default_deconstruction_screwdriver(user, O))
|
||||
updateUsrDialog()
|
||||
interact(user)
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, O))
|
||||
return
|
||||
@@ -155,18 +150,6 @@
|
||||
if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38) || istype (O,/obj/item/ammo_magazine/s44)/* VOREstation Edit*/) // Prevents ammo recycling exploit with speedloaders.
|
||||
to_chat(user, "\The [O] is too hazardous to recycle with the autolathe!")
|
||||
return
|
||||
/* ToDo: Make this actually check for ammo and change the value of the magazine if it's empty. -Spades
|
||||
var/obj/item/ammo_magazine/speedloader = O
|
||||
if(speedloader.stored_ammo)
|
||||
to_chat(user, "\The [speedloader] is too hazardous to put back into the autolathe while there's ammunition inside of it!")
|
||||
return
|
||||
else
|
||||
speedloader.matter = list(DEFAULT_WALL_MATERIAL = 75) // It's just a hunk of scrap metal now.
|
||||
if(istype(O,/obj/item/ammo_magazine)) // This was just for immersion consistency with above.
|
||||
var/obj/item/ammo_magazine/mag = O
|
||||
if(mag.stored_ammo)
|
||||
to_chat(user, "\The [mag] is too hazardous to put back into the autolathe while there's ammunition inside of it!")
|
||||
return*/
|
||||
|
||||
//Resources are being loaded.
|
||||
var/obj/item/eating = O
|
||||
@@ -227,9 +210,9 @@
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/autolathe/Topic(href, href_list)
|
||||
/obj/machinery/autolathe/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
if(..())
|
||||
return
|
||||
return TRUE
|
||||
|
||||
usr.set_machine(src)
|
||||
add_fingerprint(usr)
|
||||
@@ -237,72 +220,69 @@
|
||||
if(busy)
|
||||
to_chat(usr, "<span class='notice'>The autolathe is busy. Please wait for completion of previous operation.</span>")
|
||||
return
|
||||
switch(action)
|
||||
if("make")
|
||||
var/datum/category_item/autolathe/making = locate(params["make"])
|
||||
if(!istype(making))
|
||||
return
|
||||
if(making.hidden && !hacked)
|
||||
return
|
||||
|
||||
else if(href_list["setfilter"])
|
||||
var/filterstring = input(usr, "Input a filter string, or blank to not filter:", "Design Filter", filtertext) as null|text
|
||||
if(!Adjacent(usr))
|
||||
return
|
||||
if(isnull(filterstring)) //Clicked Cancel
|
||||
return
|
||||
if(filterstring == "") //Cleared value
|
||||
filtertext = null
|
||||
filtertext = sanitize(filterstring, 25)
|
||||
var/multiplier = 1
|
||||
|
||||
if(href_list["change_category"])
|
||||
if(making.is_stack)
|
||||
var/max_sheets
|
||||
for(var/material in making.resources)
|
||||
var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
|
||||
var/sheets = round(stored_material[material]/round(making.resources[material]*coeff))
|
||||
if(isnull(max_sheets) || max_sheets > sheets)
|
||||
max_sheets = sheets
|
||||
if(!isnull(stored_material[material]) && stored_material[material] < round(making.resources[material]*coeff))
|
||||
max_sheets = 0
|
||||
//Build list of multipliers for sheets.
|
||||
multiplier = input(usr, "How many do you want to print? (0-[max_sheets])") as num|null
|
||||
if(!multiplier || multiplier <= 0 || multiplier > max_sheets || tgui_status(usr, state) != STATUS_INTERACTIVE)
|
||||
return FALSE
|
||||
|
||||
var/choice = input("Which category do you wish to display?") as null|anything in machine_recipes.categories
|
||||
if(!choice) return
|
||||
current_category = choice
|
||||
busy = making.name
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
|
||||
if(href_list["make"] && machine_recipes)
|
||||
var/multiplier = text2num(href_list["multiplier"])
|
||||
var/datum/category_item/autolathe/making = locate(href_list["make"]) in current_category.items
|
||||
//Check if we still have the materials.
|
||||
var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
|
||||
for(var/material in making.resources)
|
||||
if(!isnull(stored_material[material]))
|
||||
if(stored_material[material] < round(making.resources[material] * coeff) * multiplier)
|
||||
return
|
||||
|
||||
//Exploit detection, not sure if necessary after rewrite.
|
||||
if(!making || multiplier < 0 || multiplier > 100)
|
||||
var/turf/exploit_loc = get_turf(usr)
|
||||
message_admins("[key_name_admin(usr)] tried to exploit an autolathe to duplicate an item! ([exploit_loc ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[exploit_loc.x];Y=[exploit_loc.y];Z=[exploit_loc.z]'>JMP</a>" : "null"])", 0)
|
||||
log_admin("EXPLOIT : [key_name(usr)] tried to exploit an autolathe to duplicate an item!")
|
||||
return
|
||||
//Consume materials.
|
||||
for(var/material in making.resources)
|
||||
if(!isnull(stored_material[material]))
|
||||
stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * coeff) * multiplier)
|
||||
|
||||
busy = 1
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
update_icon() // So lid closes
|
||||
|
||||
//Check if we still have the materials.
|
||||
var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
|
||||
for(var/material in making.resources)
|
||||
if(!isnull(stored_material[material]))
|
||||
if(stored_material[material] < round(making.resources[material] * coeff) * multiplier)
|
||||
return
|
||||
sleep(build_time)
|
||||
|
||||
//Consume materials.
|
||||
for(var/material in making.resources)
|
||||
if(!isnull(stored_material[material]))
|
||||
stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * coeff) * multiplier)
|
||||
busy = 0
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
update_icon() // So lid opens
|
||||
|
||||
update_icon() // So lid closes
|
||||
//Sanity check.
|
||||
if(!making || !src)
|
||||
return
|
||||
|
||||
sleep(build_time)
|
||||
|
||||
busy = 0
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
update_icon() // So lid opens
|
||||
|
||||
//Sanity check.
|
||||
if(!making || !src) return
|
||||
|
||||
//Create the desired item.
|
||||
var/obj/item/I = new making.path(src.loc)
|
||||
flick("[initial(icon_state)]_finish", src)
|
||||
if(multiplier > 1)
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/S = I
|
||||
S.amount = multiplier
|
||||
else
|
||||
for(multiplier; multiplier > 1; --multiplier) // Create multiple items if it's not a stack.
|
||||
new making.path(src.loc)
|
||||
|
||||
updateUsrDialog()
|
||||
//Create the desired item.
|
||||
var/obj/item/I = new making.path(src.loc)
|
||||
flick("[initial(icon_state)]_finish", src)
|
||||
if(multiplier > 1)
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/S = I
|
||||
S.amount = multiplier
|
||||
else
|
||||
for(multiplier; multiplier > 1; --multiplier) // Create multiple items if it's not a stack.
|
||||
new making.path(src.loc)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/autolathe/update_icon()
|
||||
overlays.Cut()
|
||||
@@ -332,6 +312,7 @@
|
||||
storage_capacity["glass"] = mb_rating * 12500
|
||||
build_time = 50 / man_rating
|
||||
mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.6. Maximum rating of parts is 5
|
||||
update_tgui_static_data(usr)
|
||||
|
||||
/obj/machinery/autolathe/dismantle()
|
||||
for(var/mat in stored_material)
|
||||
@@ -345,3 +326,102 @@
|
||||
qdel(S)
|
||||
..()
|
||||
return 1
|
||||
|
||||
/obj/machinery/autolathe/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/matstring = lowertext(material)
|
||||
var/material/M = get_material_by_name(matstring)
|
||||
|
||||
var/obj/item/stack/material/S = M.place_sheet(get_turf(src))
|
||||
if(amount <= 0)
|
||||
amount = S.max_amount
|
||||
var/ejected = min(round(stored_material[matstring] / S.perunit), amount)
|
||||
S.amount = min(ejected, amount)
|
||||
if(S.amount <= 0)
|
||||
qdel(S)
|
||||
return
|
||||
stored_material[matstring] -= ejected * S.perunit
|
||||
if(recursive && stored_material[matstring] >= S.perunit)
|
||||
eject_materials(matstring, -1)
|
||||
|
||||
|
||||
//YWAdd start.
|
||||
/obj/machinery/autolathe/verb/eatmaterialsnearby()
|
||||
set name = "Recycle nearby materials"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
var/filltype = 0 // Used to determine message.
|
||||
var/total_used = 0 // Amount of material used.
|
||||
if(busy)
|
||||
visible_message("[bicon(src)]<b>\The [src]</b> beeps, \"Autolathe is busy. Please wait for completion of previous operation\"")
|
||||
return
|
||||
busy = 1
|
||||
for(var/obj/item/eating in get_step(src,input_dir))
|
||||
if(istype(eating,/obj/item/ammo_magazine/clip) || istype(eating,/obj/item/ammo_magazine/s357) || istype(eating,/obj/item/ammo_magazine/s38) || istype(eating,/obj/item/ammo_magazine/s44) || istype(eating,/obj/item/stack))
|
||||
continue
|
||||
|
||||
if(!eating.matter)
|
||||
continue
|
||||
|
||||
|
||||
var/mass_per_sheet = 0 // Amount of material constituting one sheet.
|
||||
for(var/material in eating.matter)
|
||||
|
||||
if(isnull(stored_material[material]) || isnull(storage_capacity[material]))
|
||||
continue
|
||||
|
||||
if(stored_material[material] >= storage_capacity[material])
|
||||
continue
|
||||
|
||||
var/total_material = eating.matter[material]
|
||||
|
||||
|
||||
if(stored_material[material] + total_material > storage_capacity[material])
|
||||
total_material = storage_capacity[material] - stored_material[material]
|
||||
filltype = 1
|
||||
else
|
||||
filltype = 2
|
||||
|
||||
stored_material[material] += total_material
|
||||
total_used += total_material
|
||||
mass_per_sheet += eating.matter[material]
|
||||
|
||||
if(!filltype)
|
||||
visible_message("[bicon(src)]<b>\The [src]</b> beeps, \"Storage is full. Operation aborted\"")
|
||||
break
|
||||
|
||||
flick("autolathe_loading", src)
|
||||
|
||||
if(istype(eating,/obj/item/stack))
|
||||
var/obj/item/stack/stack = eating
|
||||
stack.use(max(1, round(total_used/mass_per_sheet))) // Always use at least 1 to prevent infinite materials.
|
||||
else
|
||||
qdel(eating)
|
||||
sleep(10*mat_efficiency)
|
||||
|
||||
busy = 0
|
||||
if(filltype == 1)
|
||||
visible_message("[bicon(src)] <b>\The [src]</b> beeps, \"Storage capacity full. Operation terminated. Materials recycled: [total_used]\"")
|
||||
else
|
||||
visible_message("[bicon(src)] <b>\The [src]</b> beeps, \"All materials recycled. Operation terminated. Materials recycled: [total_used]\"")
|
||||
|
||||
|
||||
|
||||
/obj/machinery/autolathe/verb/setrecyclepos()
|
||||
set name = "Set recycle input"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
input_dir_name = input("Which direction ?") in list("North", "South", "East", "West")
|
||||
switch(input_dir_name)
|
||||
if("North")
|
||||
input_dir = NORTH
|
||||
if("South")
|
||||
input_dir = SOUTH
|
||||
if("East")
|
||||
input_dir = EAST
|
||||
if("West")
|
||||
input_dir = WEST
|
||||
to_chat(src, "You set the material input to [input_dir_name]")
|
||||
//YWAdd END.
|
||||
|
||||
+178
-185
@@ -1,3 +1,17 @@
|
||||
// Use this define to register something as a creatable!
|
||||
// * n - The proper name of the purchasable
|
||||
// * o - The object type path of the purchasable to spawn
|
||||
// * r - The amount to dispense
|
||||
// * p - The price of the purchasable in biomass
|
||||
#define BIOGEN_ITEM(n, o, r, p) n = new /datum/data/biogenerator_item(n, o, r, p)
|
||||
|
||||
// Use this define to register something as dispensable
|
||||
// * n - The proper name of the purchasable
|
||||
// * o - The reagent ID
|
||||
// * r - The amount of reagent to dispense
|
||||
// * p - The price of the purchasable in biomass
|
||||
#define BIOGEN_REAGENT(n, o, r, p) n = new /datum/data/biogenerator_reagent(n, o, r, p)
|
||||
|
||||
/obj/machinery/biogenerator
|
||||
name = "biogenerator"
|
||||
desc = "Converts plants into biomass, which can be used for fertilizer and sort-of-synthetic products."
|
||||
@@ -11,10 +25,34 @@
|
||||
var/processing = 0
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker = null
|
||||
var/points = 0
|
||||
var/menustat = "menu"
|
||||
var/build_eff = 1
|
||||
var/eat_eff = 1
|
||||
|
||||
var/list/item_list
|
||||
|
||||
|
||||
/datum/data/biogenerator_item
|
||||
var/equipment_path = null
|
||||
var/equipment_amt = 1
|
||||
var/cost = 0
|
||||
|
||||
/datum/data/biogenerator_item/New(name, path, amt, cost)
|
||||
src.name = name
|
||||
src.equipment_path = path
|
||||
src.equipment_amt = amt
|
||||
src.cost = cost
|
||||
|
||||
/datum/data/biogenerator_reagent
|
||||
var/reagent_id = null
|
||||
var/reagent_amt = 0
|
||||
var/cost = 0
|
||||
|
||||
/datum/data/biogenerator_reagent/New(name, id, amt, cost)
|
||||
src.name = name
|
||||
src.reagent_id = id
|
||||
src.reagent_amt = amt
|
||||
src.cost = cost
|
||||
|
||||
/obj/machinery/biogenerator/Initialize()
|
||||
. = ..()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
@@ -24,6 +62,139 @@
|
||||
beaker = new /obj/item/weapon/reagent_containers/glass/bottle(src)
|
||||
default_apply_parts()
|
||||
|
||||
item_list = list()
|
||||
item_list["Food Items"] = list(
|
||||
BIOGEN_REAGENT("10 milk", "milk", 10, 20),
|
||||
BIOGEN_REAGENT("50 milk", "milk", 50, 95),
|
||||
BIOGEN_REAGENT("10 Cream", "cream", 10, 30),
|
||||
BIOGEN_REAGENT("50 Cream", "cream", 50, 120),
|
||||
BIOGEN_ITEM("Slab of meat", /obj/item/weapon/reagent_containers/food/snacks/meat, 1, 50),
|
||||
BIOGEN_ITEM("5 slabs of meat", /obj/item/weapon/reagent_containers/food/snacks/meat, 5, 250),
|
||||
)
|
||||
item_list["Cooking Ingredients"] = list(
|
||||
BIOGEN_REAGENT("10 Universal Enzyme", "enzyme", 10, 30),
|
||||
BIOGEN_REAGENT("50 Universal Enzyme", "enzyme", 50, 120),
|
||||
BIOGEN_ITEM("Nutri-spread", /obj/item/weapon/reagent_containers/food/snacks/spreads, 1, 30),
|
||||
BIOGEN_ITEM("5 nutri-spread", /obj/item/weapon/reagent_containers/food/snacks/spreads, 5, 120),
|
||||
)
|
||||
item_list["Gardening Nutrients"] = list(
|
||||
BIOGEN_ITEM("E-Z-Nutrient", /obj/item/weapon/reagent_containers/glass/bottle/eznutrient, 1, 60),
|
||||
BIOGEN_ITEM("5 E-Z-Nutrient", /obj/item/weapon/reagent_containers/glass/bottle/eznutrient, 5, 300),
|
||||
BIOGEN_ITEM("Left 4 Zed", /obj/item/weapon/reagent_containers/glass/bottle/left4zed, 1, 120),
|
||||
BIOGEN_ITEM("5 Left 4 Zed", /obj/item/weapon/reagent_containers/glass/bottle/left4zed, 5, 600),
|
||||
BIOGEN_ITEM("Robust Harvest", /obj/item/weapon/reagent_containers/glass/bottle/robustharvest, 1, 150),
|
||||
BIOGEN_ITEM("5 Robust Harvest", /obj/item/weapon/reagent_containers/glass/bottle/robustharvest, 5, 750),
|
||||
)
|
||||
item_list["Leather Products"] = list(
|
||||
BIOGEN_ITEM("Wallet", /obj/item/weapon/storage/wallet, 1, 100),
|
||||
BIOGEN_ITEM("Botanical gloves", /obj/item/clothing/gloves/botanic_leather, 1, 250),
|
||||
BIOGEN_ITEM("Plant bag", /obj/item/weapon/storage/bag/plants, 1, 320),
|
||||
BIOGEN_ITEM("Large plant bag", /obj/item/weapon/storage/bag/plants/large, 1, 640),
|
||||
BIOGEN_ITEM("Utility belt", /obj/item/weapon/storage/belt/utility, 1, 300),
|
||||
BIOGEN_ITEM("Leather Satchel", /obj/item/weapon/storage/backpack/satchel, 1, 400),
|
||||
BIOGEN_ITEM("Cash Bag", /obj/item/weapon/storage/bag/cash, 1, 400),
|
||||
BIOGEN_ITEM("Chemistry Bag", /obj/item/weapon/storage/bag/chemistry, 1, 400),
|
||||
BIOGEN_ITEM("Workboots", /obj/item/clothing/shoes/boots/workboots, 1, 400),
|
||||
BIOGEN_ITEM("Leather Chaps", /obj/item/clothing/under/pants/chaps, 1, 400),
|
||||
BIOGEN_ITEM("Leather Coat", /obj/item/clothing/suit/leathercoat, 1, 500),
|
||||
BIOGEN_ITEM("Leather Jacket", /obj/item/clothing/suit/storage/toggle/brown_jacket, 1, 500),
|
||||
BIOGEN_ITEM("Winter Coat", /obj/item/clothing/suit/storage/hooded/wintercoat, 1, 500),
|
||||
//VOREStation Edit - Algae for oxygen generator
|
||||
BIOGEN_ITEM("4 Algae Sheets", /obj/item/stack/material/algae, 4, 400),
|
||||
)
|
||||
|
||||
/obj/machinery/biogenerator/tgui_static_data(mob/user)
|
||||
var/list/static_data[0]
|
||||
|
||||
// Available items - in static data because we don't wanna compute this list every time! It hardly changes.
|
||||
static_data["items"] = list()
|
||||
for(var/cat in item_list)
|
||||
var/list/cat_items = list()
|
||||
for(var/prize_name in item_list[cat])
|
||||
var/datum/data/biogenerator_reagent/prize = item_list[cat][prize_name]
|
||||
cat_items[prize_name] = list("name" = prize_name, "price" = prize.cost, "reagent" = istype(prize))
|
||||
static_data["items"][cat] = cat_items
|
||||
|
||||
return static_data
|
||||
|
||||
/obj/machinery/biogenerator/tgui_data(mob/user)
|
||||
var/list/data = ..()
|
||||
|
||||
data["build_eff"] = build_eff
|
||||
data["points"] = points
|
||||
data["processing"] = processing
|
||||
data["beaker"] = !!beaker
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/biogenerator/tgui_interact(mob/user, datum/tgui/ui = null)
|
||||
// Open the window
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Biogenerator", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/biogenerator/tgui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("activate")
|
||||
INVOKE_ASYNC(src, .proc/activate)
|
||||
return TRUE
|
||||
if("detach")
|
||||
if(beaker)
|
||||
beaker.forceMove(loc)
|
||||
beaker = null
|
||||
update_icon()
|
||||
return TRUE
|
||||
if("purchase")
|
||||
var/category = params["cat"] // meow
|
||||
var/name = params["name"]
|
||||
|
||||
if(!(category in item_list) || !(name in item_list[category])) // Not trying something that's not in the list, are you?
|
||||
return
|
||||
|
||||
var/datum/data/biogenerator_item/bi = item_list[category][name]
|
||||
if(!istype(bi))
|
||||
var/datum/data/biogenerator_reagent/br = item_list[category][name]
|
||||
if(!istype(br))
|
||||
return
|
||||
if(!beaker)
|
||||
return
|
||||
var/cost = round(br.cost / build_eff)
|
||||
if(cost > points)
|
||||
to_chat(usr, "<span class='danger'>Insufficient biomass.</span>")
|
||||
return
|
||||
var/amt_to_actually_dispense = round(min(beaker.reagents.get_free_space(), br.reagent_amt))
|
||||
if(amt_to_actually_dispense <= 0)
|
||||
to_chat(usr, "<span class='danger'>The loaded beaker is full!</span>")
|
||||
return
|
||||
points -= (cost * (amt_to_actually_dispense / br.reagent_amt))
|
||||
beaker.reagents.add_reagent(br.reagent_id, amt_to_actually_dispense)
|
||||
playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1)
|
||||
return
|
||||
|
||||
var/cost = round(bi.cost / build_eff)
|
||||
if(cost > points)
|
||||
to_chat(usr, "<span class='danger'>Insufficient biomass.</span>")
|
||||
return
|
||||
|
||||
points -= cost
|
||||
if(ispath(bi.equipment_path, /obj/item/stack))
|
||||
var/obj/item/stack/S = new bi.equipment_path(loc)
|
||||
S.amount = bi.equipment_amt
|
||||
playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
|
||||
return TRUE
|
||||
|
||||
for(var/i in 1 to bi.equipment_amt)
|
||||
new bi.equipment_path(loc)
|
||||
playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
|
||||
update_icon()
|
||||
|
||||
@@ -87,68 +258,10 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/interact(mob/user as mob)
|
||||
/obj/machinery/biogenerator/attack_hand(mob/user as mob)
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<TITLE>Biogenerator</TITLE>Biogenerator:<BR>"
|
||||
if(processing)
|
||||
dat += "<FONT COLOR=red>Biogenerator is processing! Please wait...</FONT>"
|
||||
else
|
||||
dat += "Biomass: [points] points.<HR>"
|
||||
switch(menustat)
|
||||
if("menu")
|
||||
if(beaker)
|
||||
dat += "<A href='?src=\ref[src];action=activate'>Activate Biogenerator!</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=detach'>Detach Container</A><BR><BR>"
|
||||
dat += "Food Items:<BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=milk;cost=20'>10 milk</A> <FONT COLOR=blue>([round(20/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=milk5;cost=95'>x5</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=cream;cost=30'>10 cream</A> <FONT COLOR=blue>([round(20/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=cream5;cost=120'>x5</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=meat;cost=50'>Slab of meat</A> <FONT COLOR=blue>([round(50/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=meat5;cost=250'>x5</A><BR>"
|
||||
dat += "Cooking Ingredient:<BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=unizyme;cost=30'>Universal Enzyme</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=unizyme50;cost=120'>x5</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=nutrispread;cost=30'>Nutri-Spread</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=nutrispread5;cost=120'>x5</A><BR>"
|
||||
// dat += "<A href='?src=\ref[src];action=create;item=unizyme;cost=50'>Universal Enzyme</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=unizyme;cost=180'>x5</A><BR>"
|
||||
// dat += "<A href='?src=\ref[src];action=create;item=unizyme;cost=50'>Universal Enzyme</A> <FONT COLOR=yellow>([round(30/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=unizyme;cost=180'>x5</A><BR>"
|
||||
dat += "Gardening Nutrients:<BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=ez;cost=60'>E-Z-Nutrient</A> <FONT COLOR=green>([round(60/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=ez5;cost=300'>x5</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=l4z;cost=120'>Left 4 Zed</A> <FONT COLOR=green>([round(120/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=l4z5;cost=600'>x5</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=rh;cost=150'>Robust Harvest</A> <FONT COLOR=green>([round(150/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=rh5;cost=750'>x5</A><BR>"
|
||||
dat += "Leather Products:<BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=wallet;cost=100'>Wallet</A> <FONT COLOR=brown>([round(100/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=gloves;cost=250'>Botanical gloves</A> <FONT COLOR=green>([round(250/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=plantbag;cost=320'>Plant bag</A> <FONT COLOR=green>([round(250/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=plantbaglarge;cost=640'>Large plant bag</A> <FONT COLOR=green>([round(250/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=tbelt;cost=300'>Utility belt</A> <FONT COLOR=brown>([round(300/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=satchel;cost=400'>Leather Satchel</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=cashbag;cost=400'>Cash Bag</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=chembag;cost=400'>Chemistry Bag</A> <FONT COLOR=green>([round(400/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=workboots;cost=400'>Workboots</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=leathershoes;cost=400'>Leather Shoes</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=leatherchaps;cost=400'>Leather Chaps</A> <FONT COLOR=brown>([round(400/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=leathercoat;cost=500'>Leather Coat</A> <FONT COLOR=brown>([round(500/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=leatherjacket;cost=500'>Leather Jacket</A> <FONT COLOR=brown>([round(500/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=wintercoat;cost=500'>Winter Coat</A> <FONT COLOR=brown>([round(500/build_eff)])</FONT><BR>"
|
||||
dat += "<A href='?src=\ref[src];action=create;item=algae;cost=400'>4 Algae Sheets</A> <FONT COLOR=green>([round(400/build_eff)])</FONT><BR>" //VOREStation Edit - Algae for oxygen generator
|
||||
//dat += "Other<BR>"
|
||||
//dat += "<A href='?src=\ref[src];action=create;item=monkey;cost=500'>Monkey</A> <FONT COLOR=blue>(500)</FONT><BR>"
|
||||
else
|
||||
dat += "<BR><FONT COLOR=red>No beaker inside. Please insert a beaker.</FONT><BR>"
|
||||
if("nopoints")
|
||||
dat += "You do not have biomass to create products.<BR>Please, put growns into reactor and activate it.<BR>"
|
||||
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
|
||||
if("complete")
|
||||
dat += "Operation complete.<BR>"
|
||||
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
|
||||
if("void")
|
||||
dat += "<FONT COLOR=red>Error: No growns inside.</FONT><BR>Please, put growns into reactor.<BR>"
|
||||
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
|
||||
user << browse(dat, "window=biogenerator")
|
||||
onclose(user, "biogenerator")
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/attack_hand(mob/user as mob)
|
||||
interact(user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/biogenerator/proc/activate()
|
||||
if(usr.stat)
|
||||
@@ -168,139 +281,17 @@
|
||||
if(S)
|
||||
processing = 1
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
playsound(src, 'sound/machines/blender.ogg', 40, 1)
|
||||
use_power(S * 30)
|
||||
sleep((S + 15) / eat_eff)
|
||||
processing = 0
|
||||
SStgui.update_uis(src)
|
||||
playsound(src, 'sound/machines/biogenerator_end.ogg', 40, 1)
|
||||
update_icon()
|
||||
else
|
||||
menustat = "void"
|
||||
to_chat(usr, "<span class='warning'>Error: No growns inside. Please insert growns.</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/proc/create_product(var/item, var/cost)
|
||||
cost = round(cost/build_eff)
|
||||
if(cost > points)
|
||||
menustat = "nopoints"
|
||||
return 0
|
||||
processing = 1
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
points -= cost
|
||||
sleep(30)
|
||||
switch(item)
|
||||
if("milk")
|
||||
beaker.reagents.add_reagent("milk", 10)
|
||||
if("milk5")
|
||||
beaker.reagents.add_reagent("milk", 50)
|
||||
if("cream")
|
||||
beaker.reagents.add_reagent("cream", 10)
|
||||
if("cream5")
|
||||
beaker.reagents.add_reagent("cream", 50)
|
||||
if("meat")
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
|
||||
if("meat5")
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc) //This is ugly.
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
|
||||
if("unizyme")
|
||||
beaker.reagents.add_reagent("enzyme", 10)
|
||||
if("unizyme50")
|
||||
beaker.reagents.add_reagent("enzyme", 50)
|
||||
if("nutrispread")
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
|
||||
if("nutrispread5")
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/spreads(loc)
|
||||
if("ez")
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
|
||||
if("l4z")
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/left4zed(loc)
|
||||
if("rh")
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/robustharvest(loc)
|
||||
if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
|
||||
if("l4z5")
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/left4zed(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/left4zed(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/left4zed(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/left4zed(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/left4zed(loc)
|
||||
if("rh5")
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/robustharvest(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/robustharvest(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/robustharvest(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/robustharvest(loc)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/robustharvest(loc)
|
||||
if("wallet")
|
||||
new/obj/item/weapon/storage/wallet(loc)
|
||||
if("gloves")
|
||||
new/obj/item/clothing/gloves/botanic_leather(loc)
|
||||
if("plantbag")
|
||||
new/obj/item/weapon/storage/bag/plants(loc)
|
||||
if("plantbaglarge")
|
||||
new/obj/item/weapon/storage/bag/plants/large(loc)
|
||||
if("tbelt")
|
||||
new/obj/item/weapon/storage/belt/utility(loc)
|
||||
if("satchel")
|
||||
new/obj/item/weapon/storage/backpack/satchel(loc)
|
||||
if("cashbag")
|
||||
new/obj/item/weapon/storage/bag/cash(loc)
|
||||
if("chembag")
|
||||
new/obj/item/weapon/storage/bag/chemistry(loc)
|
||||
if("monkey")
|
||||
new/mob/living/carbon/human/monkey(loc)
|
||||
if("workboots")
|
||||
new/obj/item/clothing/shoes/boots/workboots(loc)
|
||||
if("leathershoes")
|
||||
new/obj/item/clothing/shoes/leather(loc)
|
||||
if("leatherchaps")
|
||||
new/obj/item/clothing/under/pants/chaps
|
||||
if("leathercoat")
|
||||
new/obj/item/clothing/suit/leathercoat(loc)
|
||||
if("leatherjacket")
|
||||
new/obj/item/clothing/suit/storage/toggle/brown_jacket(loc)
|
||||
if("wintercoat")
|
||||
new/obj/item/clothing/suit/storage/hooded/wintercoat(loc)
|
||||
if("algae") //VOREStation Edit - Algae for oxygen generator
|
||||
var/obj/item/stack/material/algae/A = new(loc)
|
||||
A.amount = 4 //VOREStation Edit End
|
||||
processing = 0
|
||||
menustat = "complete"
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/machinery/biogenerator/Topic(href, href_list)
|
||||
if(stat & BROKEN) return
|
||||
if(usr.stat || usr.restrained()) return
|
||||
if(!in_range(src, usr)) return
|
||||
|
||||
usr.set_machine(src)
|
||||
|
||||
switch(href_list["action"])
|
||||
if("activate")
|
||||
activate()
|
||||
if("detach")
|
||||
if(beaker)
|
||||
beaker.loc = src.loc
|
||||
beaker = null
|
||||
update_icon()
|
||||
if("create")
|
||||
create_product(href_list["item"], text2num(href_list["cost"]))
|
||||
if("menu")
|
||||
menustat = "menu"
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/biogenerator/RefreshParts()
|
||||
..()
|
||||
var/man_rating = 0
|
||||
@@ -314,3 +305,5 @@
|
||||
|
||||
build_eff = man_rating
|
||||
eat_eff = bin_rating
|
||||
|
||||
#undef BIOGENITEM
|
||||
|
||||
@@ -101,137 +101,128 @@
|
||||
else
|
||||
tank2 = I
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
SStgui.update_uis(src)
|
||||
to_chat(user, "<span class='notice'>You connect \the [I] to \the [src]'s [I==tank1 ? "primary" : "secondary"] slot.</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/bomb_tester/attack_hand(var/mob/user)
|
||||
add_fingerprint(user)
|
||||
interact(user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/bomb_tester/interact(var/mob/user)
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
/obj/machinery/bomb_tester/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "BombTester", name)
|
||||
ui.open()
|
||||
|
||||
var/dat = "<HEAD><TITLE>Bomb Tester</TITLE></HEAD>"
|
||||
/obj/machinery/bomb_tester/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
var/list/data = ..()
|
||||
|
||||
data["simulating"] = simulating
|
||||
if(!simulating)
|
||||
data["mode"] = sim_mode
|
||||
data["tank1"] = tank1
|
||||
data["tank1ref"] = REF(tank1)
|
||||
data["tank2"] = tank2
|
||||
data["tank2ref"] = REF(tank2)
|
||||
data["canister"] = test_canister
|
||||
data["sim_canister_output"] = sim_canister_output
|
||||
|
||||
return data
|
||||
|
||||
dat += "<font face='terminal' size ='3'>Virtual Explosive Simulator v1.03</font>"
|
||||
dat += "<br>"
|
||||
|
||||
if(simulating)
|
||||
dat += "<br><center>Simulation in progress! Please wait for results.</center>"
|
||||
|
||||
else
|
||||
dat += "<br><center>Mode: [sim_mode==MODE_SINGLE?"Single Tank":"<A href='?src=\ref[src];set_mode=1'>Single Tank</a>"] -- [sim_mode==MODE_DOUBLE?"Transfer Valve":"<A href='?src=\ref[src];set_mode=2'>Transfer Valve</a>"] -- [sim_mode==MODE_CANISTER?"Canister":"<A href='?src=\ref[src];set_mode=3'>Canister</a>"]</center>"
|
||||
dat += "<br>"
|
||||
dat += "<br><center><u>Gas Sources</u></center>"
|
||||
dat += "<br><center><A href='?src=\ref[src];tank=1'>[tank1?"\[[tank1.name]\]":"\[Primary Slot\]"]</a> -- <A href='?src=\ref[src];tank=2'>[tank2?"\[[tank2.name]\]":"\[Secondary Slot\]"]</a></center>"
|
||||
dat += "<br><center>Connected Canister: [test_canister?"[test_canister.name] -- ":"None -- "]<A href='?src=\ref[src];canister_scan=1'>[test_canister?"\[Rescan\]":"\[Scan for canister\]"]</a></center>"
|
||||
if(test_canister)
|
||||
dat += "<br><center>Canister Release Pressure: [sim_canister_output] Kilopascals</center>"
|
||||
|
||||
dat += "<br><center>"
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=-1000'>-1000</a>|"
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=-100'>-100</a>|"
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=-10'>-10</a>|"
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=-1'>-1</a> ||| "
|
||||
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=1'>+1</a>|"
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=10'>+10</a>|"
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=100'>+100</a>|"
|
||||
dat += "<A href='?src=\ref[src];set_can_pressure=1000'>+1000</a>"
|
||||
dat += "</center>"
|
||||
|
||||
dat += "<br><br>"
|
||||
dat += "<br><center><font size='6'><b><A href='?src=\ref[src];start_sim=1'>BEGIN SIMULATION</a></b></font></center>"
|
||||
|
||||
user.set_machine(src)
|
||||
user << browse(dat, "window=bomb_tester")
|
||||
onclose(user, "bomb_tester")
|
||||
|
||||
/obj/machinery/bomb_tester/Topic(href, href_list)
|
||||
/obj/machinery/bomb_tester/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
if(..())
|
||||
return
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(!usr.Adjacent(src))
|
||||
usr << browse(null, "window=bomb_tester")
|
||||
usr.unset_machine()
|
||||
return
|
||||
return TRUE
|
||||
|
||||
if(simulating)
|
||||
return
|
||||
|
||||
if(href_list["set_mode"])
|
||||
sim_mode = text2num(href_list["set_mode"])
|
||||
var/text_mode
|
||||
switch(sim_mode)
|
||||
if(MODE_SINGLE)
|
||||
text_mode = "single gas tank detonation"
|
||||
if(MODE_DOUBLE)
|
||||
text_mode = "tank transfer valve detonation"
|
||||
if(MODE_CANISTER)
|
||||
text_mode = "canister-assisted single gas tank detonation"
|
||||
to_chat(usr, "<span class='notice'>[src] set to simulate a [text_mode].</span>")
|
||||
|
||||
if(href_list["tank"])
|
||||
var/tankvar = "tank[href_list["tank"]]"
|
||||
var/obj/item/weapon/tank/T
|
||||
if(vars[tankvar])
|
||||
T = vars[tankvar]
|
||||
T.forceMove(get_turf(src))
|
||||
vars[tankvar] = null
|
||||
else if(istype(usr.get_active_hand(),/obj/item/weapon/tank))
|
||||
T = usr.get_active_hand()
|
||||
usr.drop_item(T)
|
||||
T.forceMove(src)
|
||||
vars[tankvar] = T
|
||||
update_icon()
|
||||
|
||||
if(href_list["canister_scan"])
|
||||
for(var/obj/machinery/portable_atmospherics/canister/C in orange(1,src))
|
||||
if(C && C == test_canister)
|
||||
continue
|
||||
else if(C)
|
||||
test_canister = C
|
||||
break
|
||||
switch(action)
|
||||
if("set_mode")
|
||||
sim_mode = clamp(text2num(params["mode"]), MODE_SINGLE, MODE_CANISTER)
|
||||
var/text_mode
|
||||
switch(sim_mode)
|
||||
if(MODE_SINGLE)
|
||||
text_mode = "single gas tank detonation"
|
||||
if(MODE_DOUBLE)
|
||||
text_mode = "tank transfer valve detonation"
|
||||
if(MODE_CANISTER)
|
||||
text_mode = "canister-assisted single gas tank detonation"
|
||||
to_chat(usr, "<span class='notice'>[src] set to simulate a [text_mode].</span>")
|
||||
return TRUE
|
||||
|
||||
if("add_tank")
|
||||
if(istype(usr.get_active_hand(), /obj/item/weapon/tank))
|
||||
var/obj/item/weapon/tank/T = usr.get_active_hand()
|
||||
var/slot = params["slot"]
|
||||
if(slot == 1 && !tank1)
|
||||
tank1 = T
|
||||
else if(slot == 2 && !tank2)
|
||||
tank2 = T
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Slot [slot] is full.</span>")
|
||||
return
|
||||
|
||||
usr.drop_item(T)
|
||||
T.forceMove(src)
|
||||
return TRUE
|
||||
else
|
||||
test_canister = null
|
||||
to_chat(usr, "<span class='warning'>You must be wielding a tank to insert it!</span>")
|
||||
|
||||
if(href_list["set_can_pressure"])
|
||||
var/change = text2num(href_list["set_can_pressure"])
|
||||
sim_canister_output = CLAMP(sim_canister_output+change, ONE_ATMOSPHERE/10, ONE_ATMOSPHERE*10)
|
||||
if("remove_tank")
|
||||
var/obj/item/weapon/tank/T = locate(params["ref"]) in list(tank1, tank2)
|
||||
if(istype(T))
|
||||
if(T == tank1)
|
||||
tank1 = null
|
||||
if(T == tank2)
|
||||
tank2 = null
|
||||
T.forceMove(get_turf(src))
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
if(href_list["start_sim"])
|
||||
start_simulating()
|
||||
if("canister_scan")
|
||||
for(var/obj/machinery/portable_atmospherics/canister/C in orange(1,src))
|
||||
if(C && C == test_canister)
|
||||
continue
|
||||
else if(C)
|
||||
test_canister = C
|
||||
break
|
||||
else
|
||||
test_canister = null
|
||||
return TRUE
|
||||
|
||||
updateUsrDialog()
|
||||
if("set_can_pressure")
|
||||
sim_canister_output = CLAMP(text2num(params["pressure"]), ONE_ATMOSPHERE/10, ONE_ATMOSPHERE*10)
|
||||
return TRUE
|
||||
|
||||
if("start_sim")
|
||||
start_simulating()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/bomb_tester/proc/start_simulating()
|
||||
if(!tank1 || (sim_mode == MODE_DOUBLE && !tank2) || (sim_mode == MODE_CANISTER && !test_canister))
|
||||
simulation_results = "Error"
|
||||
simulation_finish()
|
||||
return
|
||||
if((tank1?.air_contents.return_pressure() > TANK_RUPTURE_PRESSURE) || (tank2?.air_contents.return_pressure() > TANK_RUPTURE_PRESSURE))
|
||||
simulation_results = "Unstable"
|
||||
simulation_finish()
|
||||
return
|
||||
simulating = 1
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
simulation_started = world.time
|
||||
update_icon()
|
||||
switch(sim_mode)
|
||||
if(MODE_SINGLE)
|
||||
if(!tank1)
|
||||
simulation_results = "Error"
|
||||
return
|
||||
spawn()
|
||||
single_tank_sim()
|
||||
|
||||
if(MODE_DOUBLE)
|
||||
if(!tank1 || !tank2)
|
||||
simulation_results = "Error"
|
||||
return
|
||||
spawn()
|
||||
ttv_sim()
|
||||
|
||||
if(MODE_CANISTER)
|
||||
if(!tank1 || !test_canister)
|
||||
simulation_results = "Error"
|
||||
return
|
||||
spawn()
|
||||
canister_sim()
|
||||
|
||||
@@ -361,9 +352,12 @@
|
||||
if(simulation_results == "Error")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
state("Invalid parameters.")
|
||||
else if(simulation_results == "Unstable")
|
||||
playsound(src, 'sound/machines/buzz-two.ogg', 50, 0)
|
||||
state("Tank instability detected. Please step away from the device.")
|
||||
else
|
||||
ping("Simulation complete!")
|
||||
playsound(src, "sound/effects/printer.ogg", 50, 1)
|
||||
playsound(src, "sound/machines/printer.ogg", 50, 1)
|
||||
var/obj/item/weapon/paper/P = new(get_turf(src))
|
||||
P.name = "Explosive Simulator printout"
|
||||
P.info = simulation_results
|
||||
@@ -383,4 +377,4 @@
|
||||
|
||||
#undef MODE_SINGLE
|
||||
#undef MODE_DOUBLE
|
||||
#undef MODE_CANISTER
|
||||
#undef MODE_CANISTER
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
return
|
||||
|
||||
else if((occupant.health >= heal_level || occupant.health == occupant.getMaxHealth()) && (!eject_wait))
|
||||
playsound(src, 'sound/machines/ding.ogg', 50, 1)
|
||||
playsound(src, 'sound/machines/medbayscanner1.ogg', 50, 1)
|
||||
audible_message("\The [src] signals that the cloning process is complete.")
|
||||
connected_message("Cloning Process Complete.")
|
||||
locked = 0
|
||||
|
||||
@@ -342,6 +342,7 @@
|
||||
cloneresult = pod.growclone(C)
|
||||
if(cloneresult)
|
||||
set_temp("Initiating cloning cycle...", "success")
|
||||
playsound(src, 'sound/machines/medbayscanner1.ogg', 100, 1)
|
||||
records.Remove(C)
|
||||
qdel(C)
|
||||
menu = MENU_MAIN
|
||||
|
||||
@@ -6,162 +6,225 @@
|
||||
light_color = "#a97faa"
|
||||
req_access = list(access_robotics)
|
||||
circuit = /obj/item/weapon/circuitboard/robotics
|
||||
var/safety = 1
|
||||
|
||||
/obj/machinery/computer/robotics/attack_ai(var/mob/user as mob)
|
||||
ui_interact(user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/computer/robotics/attack_hand(var/mob/user as mob)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/computer/robotics/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/data[0]
|
||||
data["robots"] = get_cyborgs(user)
|
||||
data["is_ai"] = issilicon(user)
|
||||
|
||||
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/computer/robotics/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/mob/user = usr
|
||||
if(!src.allowed(user))
|
||||
to_chat(user, "Access Denied")
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
tgui_interact(user)
|
||||
|
||||
// Locks or unlocks the cyborg
|
||||
if (href_list["lockdown"])
|
||||
var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["lockdown"])
|
||||
var/failmsg = ""
|
||||
if(!target || !istype(target))
|
||||
return
|
||||
/obj/machinery/computer/robotics/proc/is_authenticated(mob/user)
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(isobserver(user))
|
||||
var/mob/observer/dead/D = user
|
||||
if(D.can_admin_interact())
|
||||
return TRUE
|
||||
if(allowed(user))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
if(isAI(user) && (target.connected_ai != user))
|
||||
to_chat(user, "Access Denied. This robot is not linked to you.")
|
||||
return
|
||||
/**
|
||||
* Does this borg show up in the console
|
||||
*
|
||||
* Returns TRUE if a robot will show up in the console
|
||||
* Returns FALSE if a robot will not show up in the console
|
||||
* Arguments:
|
||||
* * R - The [mob/living/silicon/robot] to be checked
|
||||
*/
|
||||
/obj/machinery/computer/robotics/proc/console_shows(mob/living/silicon/robot/R)
|
||||
if(!istype(R))
|
||||
return FALSE
|
||||
if(istype(R, /mob/living/silicon/robot/drone))
|
||||
return FALSE
|
||||
if(R.scrambledcodes)
|
||||
return FALSE
|
||||
if(!AreConnectedZLevels(get_z(src), get_z(R)))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
if(isrobot(user))
|
||||
to_chat(user, "Access Denied.")
|
||||
return
|
||||
/**
|
||||
* Check if a user can send a lockdown/detonate command to a specific borg
|
||||
*
|
||||
* Returns TRUE if a user can send the command (does not guarantee it will work)
|
||||
* Returns FALSE if a user cannot
|
||||
* Arguments:
|
||||
* * user - The [mob/user] to be checked
|
||||
* * R - The [mob/living/silicon/robot] to be checked
|
||||
* * telluserwhy - Bool of whether the user should be sent a to_chat message if they don't have access
|
||||
*/
|
||||
/obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R, telluserwhy = FALSE)
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(!console_shows(R))
|
||||
return FALSE
|
||||
if(isAI(user))
|
||||
if(R.connected_ai != user)
|
||||
if(telluserwhy)
|
||||
to_chat(user, "<span class='warning'>AIs can only control cyborgs which are linked to them.</span>")
|
||||
return FALSE
|
||||
if(isrobot(user))
|
||||
if(R != user)
|
||||
if(telluserwhy)
|
||||
to_chat(user, "<span class='warning'>Cyborgs cannot control other cyborgs.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
var/choice = input("Really [target.lockcharge ? "unlock" : "lockdown"] [target.name] ?") in list ("Yes", "No")
|
||||
if(choice != "Yes")
|
||||
return
|
||||
/**
|
||||
* Check if the user is the right kind of entity to be able to hack borgs
|
||||
*
|
||||
* Returns TRUE if a user is a traitor AI, or aghost
|
||||
* Returns FALSE otherwise
|
||||
* Arguments:
|
||||
* * user - The [mob/user] to be checked
|
||||
*/
|
||||
/obj/machinery/computer/robotics/proc/can_hack_any(mob/user)
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(isobserver(user))
|
||||
var/mob/observer/dead/D = user
|
||||
if(D.can_admin_interact())
|
||||
return TRUE
|
||||
if(!isAI(user))
|
||||
return FALSE
|
||||
return (user.mind.special_role && user.mind.original == user)
|
||||
|
||||
if(!target || !istype(target))
|
||||
return
|
||||
|
||||
var/istraitor = target.mind.special_role
|
||||
if (istraitor)
|
||||
failmsg = "failed (target is traitor) "
|
||||
target.lockcharge = !target.lockcharge
|
||||
if (target.lockcharge)
|
||||
to_chat(target, "Someone tried to lock you down!")
|
||||
else
|
||||
to_chat(target, "Someone tried to lift your lockdown!")
|
||||
else if (target.emagged)
|
||||
failmsg = "failed (target is hacked) "
|
||||
target.lockcharge = !target.lockcharge
|
||||
if (target.lockcharge)
|
||||
to_chat(target, "Someone tried to lock you down!")
|
||||
else
|
||||
to_chat(target, "Someone tried to lift your lockdown!")
|
||||
else
|
||||
target.canmove = !target.canmove
|
||||
target.lockcharge = !target.canmove //when canmove is 1, lockcharge should be 0
|
||||
target.lockdown = !target.canmove
|
||||
if (target.lockcharge)
|
||||
to_chat(target, "You have been locked down!")
|
||||
else
|
||||
to_chat(target, "Your lockdown has been lifted!")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] [failmsg][target.lockcharge ? "lockdown" : "release"] on [target.name]!</span>")
|
||||
log_game("[key_name(usr)] attempted to [target.lockcharge ? "lockdown" : "release"] [target.name] on the robotics console!")
|
||||
/**
|
||||
* Check if the user is allowed to hack a specific borg
|
||||
*
|
||||
* Returns TRUE if a user can hack the specific cyborg
|
||||
* Returns FALSE if a user cannot
|
||||
* Arguments:
|
||||
* * user - The [mob/user] to be checked
|
||||
* * R - The [mob/living/silicon/robot] to be checked
|
||||
*/
|
||||
/obj/machinery/computer/robotics/proc/can_hack(mob/user, mob/living/silicon/robot/R)
|
||||
if(!can_hack_any(user))
|
||||
return FALSE
|
||||
if(!istype(R))
|
||||
return FALSE
|
||||
if(R.emagged)
|
||||
return FALSE
|
||||
if(R.connected_ai != user)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
// Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs.
|
||||
else if (href_list["hack"])
|
||||
var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["hack"])
|
||||
if(!target || !istype(target))
|
||||
return
|
||||
|
||||
// Antag synthetic checks
|
||||
if(!istype(user, /mob/living/silicon) || !(user.mind.special_role && user.mind.original == user))
|
||||
to_chat(user, "Access Denied")
|
||||
return
|
||||
|
||||
if(target.emagged)
|
||||
to_chat(user, "Robot is already hacked.")
|
||||
return
|
||||
|
||||
var/choice = input("Really hack [target.name]? This cannot be undone.") in list("Yes", "No")
|
||||
if(choice != "Yes")
|
||||
return
|
||||
|
||||
if(!target || !istype(target))
|
||||
return
|
||||
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] emagged [target.name] using the robotic console!</span>")
|
||||
log_game("[key_name(usr)] emagged [target.name] using robotic console!")
|
||||
target.emagged = 1
|
||||
to_chat(target, "<span class='notice'>Failsafe protocols overriden. New tools available.</span>")
|
||||
|
||||
|
||||
// Proc: get_cyborgs()
|
||||
// Parameters: 1 (operator - mob which is operating the console.)
|
||||
// Description: Returns NanoUI-friendly list of accessible cyborgs.
|
||||
/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/operator)
|
||||
var/list/robots = list()
|
||||
/obj/machinery/computer/robotics/tgui_interact(mob/user, datum/tgui/ui = null)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "RoboticsControlConsole", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/robotics/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["auth"] = is_authenticated(user)
|
||||
data["can_hack"] = can_hack_any(user)
|
||||
data["cyborgs"] = list()
|
||||
data["safety"] = safety
|
||||
for(var/mob/living/silicon/robot/R in mob_list)
|
||||
// Ignore drones
|
||||
if(istype(R, /mob/living/silicon/robot/drone))
|
||||
continue
|
||||
// Ignore antagonistic cyborgs
|
||||
if(R.scrambledcodes)
|
||||
if(!console_shows(R))
|
||||
continue
|
||||
var/area/A = get_area(R)
|
||||
var/turf/T = get_turf(R)
|
||||
var/list/cyborg_data = list(
|
||||
name = R.name,
|
||||
ref = REF(R),
|
||||
locked_down = R.lockcharge,
|
||||
locstring = "[A.name] ([T.x], [T.y])",
|
||||
status = R.stat,
|
||||
health = round(R.health * 100 / R.maxHealth, 0.1),
|
||||
charge = R.cell ? round(R.cell.percent()) : null,
|
||||
cell_capacity = R.cell ? R.cell.maxcharge : null,
|
||||
module = R.module ? R.module.name : "No Module Detected",
|
||||
synchronization = R.connected_ai,
|
||||
is_hacked = R.connected_ai && R.emagged,
|
||||
hackable = can_hack(user, R),
|
||||
)
|
||||
data["cyborgs"] += list(cyborg_data)
|
||||
data["show_detonate_all"] = (data["auth"] && length(data["cyborgs"]) > 0 && ishuman(user))
|
||||
return data
|
||||
|
||||
var/list/robot = list()
|
||||
robot["name"] = R.name
|
||||
if(R.stat)
|
||||
robot["status"] = "Not Responding"
|
||||
else if (R.lockcharge)
|
||||
robot["status"] = "Lockdown"
|
||||
else
|
||||
robot["status"] = "Operational"
|
||||
|
||||
if(R.cell)
|
||||
robot["cell"] = 1
|
||||
robot["cell_capacity"] = R.cell.maxcharge
|
||||
robot["cell_current"] = R.cell.charge
|
||||
robot["cell_percentage"] = round(R.cell.percent())
|
||||
else
|
||||
robot["cell"] = 0
|
||||
|
||||
robot["module"] = R.module ? R.module.name : "None"
|
||||
robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None"
|
||||
robot["hackable"] = 0
|
||||
//Antag synths should be able to hack themselves and see their hacked status.
|
||||
if(operator && isrobot(operator) && (operator.mind.special_role && operator.mind.original == operator) && (operator == R))
|
||||
robot["hacked"] = R.emagged ? 1 : 0
|
||||
robot["hackable"] = R.emagged? 0 : 1
|
||||
// Antag AIs know whether linked cyborgs are hacked or not.
|
||||
if(operator && isAI(operator) && (R.connected_ai == operator) && (operator.mind.special_role && operator.mind.original == operator))
|
||||
robot["hacked"] = R.emagged ? 1 : 0
|
||||
robot["hackable"] = R.emagged? 0 : 1
|
||||
robots.Add(list(robot))
|
||||
return robots
|
||||
|
||||
// Proc: get_cyborg_by_name()
|
||||
// Parameters: 1 (name - Cyborg we are trying to find)
|
||||
// Description: Helper proc for finding cyborg by name
|
||||
/obj/machinery/computer/robotics/proc/get_cyborg_by_name(var/name)
|
||||
if (!name)
|
||||
/obj/machinery/computer/robotics/tgui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
for(var/mob/living/silicon/robot/R in mob_list)
|
||||
if(R.name == name)
|
||||
return R
|
||||
. = FALSE
|
||||
if(!is_authenticated(usr))
|
||||
to_chat(usr, "<span class='warning'>Access denied.</span>")
|
||||
return
|
||||
switch(action)
|
||||
if("arm") // Arms the emergency self-destruct system
|
||||
if(issilicon(usr))
|
||||
to_chat(usr, "<span class='danger'>Access Denied (silicon detected)</span>")
|
||||
return
|
||||
safety = !safety
|
||||
to_chat(usr, "<span class='notice'>You [safety ? "disarm" : "arm"] the emergency self destruct.</span>")
|
||||
. = TRUE
|
||||
if("nuke") // Destroys all accessible cyborgs if safety is disabled
|
||||
if(issilicon(usr))
|
||||
to_chat(usr, "<span class='danger'>Access Denied (silicon detected)</span>")
|
||||
return
|
||||
if(safety)
|
||||
to_chat(usr, "<span class='danger'>Self-destruct aborted - safety active</span>")
|
||||
return
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] detonated all cyborgs!</span>")
|
||||
log_game("\<span class='notice'>[key_name(usr)] detonated all cyborgs!</span>")
|
||||
for(var/mob/living/silicon/robot/R in mob_list)
|
||||
if(istype(R, /mob/living/silicon/robot/drone))
|
||||
continue
|
||||
// Ignore antagonistic cyborgs
|
||||
if(R.scrambledcodes)
|
||||
continue
|
||||
to_chat(R, "<span class='danger'>Self-destruct command received.</span>")
|
||||
if(R.connected_ai)
|
||||
to_chat(R.connected_ai, "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>")
|
||||
R.self_destruct()
|
||||
. = TRUE
|
||||
if("killbot") // destroys one specific cyborg
|
||||
var/mob/living/silicon/robot/R = locate(params["ref"])
|
||||
if(!can_control(usr, R, TRUE))
|
||||
return
|
||||
if(R.mind && R.mind.special_role && R.emagged)
|
||||
to_chat(R, "<span class='userdanger'>Extreme danger! Termination codes detected. Scrambling security codes and automatic AI unlink triggered.</span>")
|
||||
R.ResetSecurityCodes()
|
||||
. = TRUE
|
||||
return
|
||||
var/turf/T = get_turf(R)
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] detonated [key_name_admin(R)] ([ADMIN_COORDJMP(T)])!</span>")
|
||||
log_game("\<span class='notice'>[key_name(usr)] detonated [key_name(R)]!</span>")
|
||||
to_chat(R, "<span class='danger'>Self-destruct command received.</span>")
|
||||
if(R.connected_ai)
|
||||
to_chat(R.connected_ai, "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>")
|
||||
R.self_destruct()
|
||||
. = TRUE
|
||||
if("stopbot") // lock or unlock the borg
|
||||
if(isrobot(usr))
|
||||
to_chat(usr, "<span class='danger'>Access Denied.</span>")
|
||||
return
|
||||
var/mob/living/silicon/robot/R = locate(params["ref"])
|
||||
if(!can_control(usr, R, TRUE))
|
||||
return
|
||||
message_admins("<span class='notice'>[ADMIN_LOOKUPFLW(usr)] [!R.lockcharge ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!</span>")
|
||||
log_game("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!")
|
||||
R.SetLockdown(!R.lockcharge)
|
||||
to_chat(R, "[!R.lockcharge ? "<span class='notice'>Your lockdown has been lifted!" : "<span class='alert'>You have been locked down!"]</span>")
|
||||
if(R.connected_ai)
|
||||
to_chat(R.connected_ai, "[!R.lockcharge ? "<span class='notice'>NOTICE - Cyborg lockdown lifted</span>" : "<span class='alert'>ALERT - Cyborg lockdown detected</span>"]: <a href='?src=[REF(R.connected_ai)];track=[html_encode(R.name)]'>[R.name]</a></span><br>")
|
||||
. = TRUE
|
||||
if("hackbot") // AIs hacking/emagging a borg
|
||||
var/mob/living/silicon/robot/R = locate(params["ref"])
|
||||
if(!can_hack(usr, R))
|
||||
return
|
||||
var/choice = input("Really hack [R.name]? This cannot be undone.") in list("Yes", "No")
|
||||
if(choice != "Yes")
|
||||
return
|
||||
log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] emagged [key_name_admin(R)] using robotic console!</span>")
|
||||
R.emagged = TRUE
|
||||
to_chat(R, "<span class='notice'>Failsafe protocols overriden. New tools available.</span>")
|
||||
. = TRUE
|
||||
|
||||
@@ -509,4 +509,4 @@
|
||||
/obj/machinery/computer/secure_data/detective_computer
|
||||
icon_state = "messyfiles"
|
||||
|
||||
#undef FIELD
|
||||
#undef FIELD
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
if(..())
|
||||
return
|
||||
if(!allowed(user))
|
||||
to_chat(user, "<span class='warning'>You don't have the required access to use this console.</span>")
|
||||
return
|
||||
user.set_machine(src)
|
||||
tgui_interact(user)
|
||||
|
||||
@@ -35,8 +35,8 @@
|
||||
var jobs_all = ""
|
||||
jobs_all += "<table><tr><td></td><td><b>Command</b></td>"
|
||||
|
||||
jobs_all += "</tr><tr height='20'><td><b>Special</b></td>"//Colony Director in special because he is head of heads ~Intercross21
|
||||
jobs_all += "<td weight='100'><a href='?src=\ref[src];;assign=Colony Director'>Colony Director</a></td>"
|
||||
jobs_all += "</tr><tr height='20'><td><b>Special</b></td>"//Site Manager in special because he is head of heads ~Intercross21
|
||||
jobs_all += "<td weight='100'><a href='?src=\ref[src];;assign=Site Manager'>Site Manager</a></td>"
|
||||
jobs_all += "<td weight='100'><a href='?src=\ref[src];;assign=Custom'>Custom</a></td>"
|
||||
|
||||
counter = 0
|
||||
|
||||
@@ -39,12 +39,16 @@
|
||||
var/secured_wires = 0
|
||||
var/datum/wires/airlock/wires = null
|
||||
|
||||
var/open_sound_powered = 'sound/machines/airlock.ogg'
|
||||
var/open_sound_unpowered = 'sound/machines/airlockforced.ogg'
|
||||
var/close_sound_powered = 'sound/machines/airlockclose.ogg'
|
||||
var/open_sound_powered = 'sound/machines/door/covert1o.ogg'
|
||||
var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg'
|
||||
var/close_sound_powered = 'sound/machines/door/covert1c.ogg'
|
||||
var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg'
|
||||
var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg'
|
||||
var/department_open_powered = null
|
||||
var/department_close_powered = null
|
||||
var/denied_sound = 'sound/machines/deniedbeep.ogg'
|
||||
var/bolt_up_sound = 'sound/machines/boltsup.ogg'
|
||||
var/bolt_down_sound = 'sound/machines/boltsdown.ogg'
|
||||
var/bolt_up_sound = 'sound/machines/door/boltsup.ogg'
|
||||
var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
@@ -81,7 +85,7 @@
|
||||
if(do_after(user,5 SECONDS,src))
|
||||
visible_message("<span class='danger'>\The [user] forces \the [src] open, sparks flying from its electronics!</span>")
|
||||
src.do_animate("spark")
|
||||
playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS)
|
||||
src.locked = 0
|
||||
src.welded = 0
|
||||
update_icon()
|
||||
@@ -90,7 +94,7 @@
|
||||
else if(src.density)
|
||||
visible_message("<span class='alium'>\The [user] begins forcing \the [src] open!</span>")
|
||||
if(do_after(user, 5 SECONDS,src))
|
||||
playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS)
|
||||
visible_message("<span class='danger'>\The [user] forces \the [src] open!</span>")
|
||||
open(1)
|
||||
else
|
||||
@@ -112,40 +116,66 @@
|
||||
icon = 'icons/obj/doors/Doorcom.dmi'
|
||||
req_one_access = list(access_heads)
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_com
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/cmd3o.ogg'
|
||||
department_close_powered = 'sound/machines/door/cmd3c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/security
|
||||
name = "Security Airlock"
|
||||
icon = 'icons/obj/doors/Doorsec.dmi'
|
||||
req_one_access = list(access_security)
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_sec
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/sec1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/sec1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/engineering
|
||||
name = "Engineering Airlock"
|
||||
icon = 'icons/obj/doors/Dooreng.dmi'
|
||||
req_one_access = list(access_engine)
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_eng
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/eng1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/eng1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/engineeringatmos
|
||||
name = "Atmospherics Airlock"
|
||||
icon = 'icons/obj/doors/Doorengatmos.dmi'
|
||||
req_one_access = list(access_atmospherics)
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_eat
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/eng1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/eng1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/medical
|
||||
name = "Medical Airlock"
|
||||
icon = 'icons/obj/doors/Doormed.dmi'
|
||||
req_one_access = list(access_medical)
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_med
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/med1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/med1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/maintenance
|
||||
name = "Maintenance Access"
|
||||
icon = 'icons/obj/doors/Doormaint.dmi'
|
||||
//req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_mai
|
||||
open_sound_powered = 'sound/machines/door/door2o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/door2c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/maintenance/cargo
|
||||
icon = 'icons/obj/doors/Doormaint_cargo.dmi'
|
||||
req_one_access = list(access_cargo)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/door2o.ogg'
|
||||
department_close_powered = 'sound/machines/door/door2c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/maintenance/command
|
||||
icon = 'icons/obj/doors/Doormaint_command.dmi'
|
||||
@@ -153,6 +183,8 @@
|
||||
|
||||
/obj/machinery/door/airlock/maintenance/common
|
||||
icon = 'icons/obj/doors/Doormaint_common.dmi'
|
||||
open_sound_powered = 'sound/machines/door/hall3o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/hall3c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/maintenance/engi
|
||||
icon = 'icons/obj/doors/Doormaint_engi.dmi'
|
||||
@@ -177,6 +209,8 @@
|
||||
name = "External Airlock"
|
||||
icon = 'icons/obj/doors/Doorext.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_ext
|
||||
open_sound_powered = 'sound/machines/door/space1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/space1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/external/glass/bolted
|
||||
icon_state = "door_locked" // So it looks visibly bolted in map editor
|
||||
@@ -193,12 +227,16 @@
|
||||
opacity = 0
|
||||
glass = 1
|
||||
req_one_access = list(access_external_airlocks)
|
||||
open_sound_powered = 'sound/machines/door/space1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/space1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass
|
||||
name = "Glass Airlock"
|
||||
icon = 'icons/obj/doors/Doorglass.dmi'
|
||||
hitsound = 'sound/effects/Glasshit.ogg'
|
||||
open_sound_powered = 'sound/machines/windowdoor.ogg'
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg'
|
||||
legacy_open_powered = 'sound/machines/door/windowdoor.ogg'
|
||||
maxhealth = 300
|
||||
explosion_resistance = 5
|
||||
opacity = 0
|
||||
@@ -209,12 +247,16 @@
|
||||
icon = 'icons/obj/doors/Doorele.dmi'
|
||||
req_one_access = list(access_cent_general)
|
||||
opacity = 1
|
||||
open_sound_powered = 'sound/machines/door/cmd3o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/cmd3c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_centcom
|
||||
name = "Airlock"
|
||||
icon = 'icons/obj/doors/Dooreleglass.dmi'
|
||||
opacity = 0
|
||||
glass = 1
|
||||
open_sound_powered = 'sound/machines/door/cmd3o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/cmd3c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/vault
|
||||
name = "Vault"
|
||||
@@ -224,6 +266,8 @@
|
||||
secured_wires = 1
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
|
||||
req_one_access = list(access_heads_vault)
|
||||
open_sound_powered = 'sound/machines/door/vault1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/vault1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/vault/bolted
|
||||
icon_state = "door_locked"
|
||||
@@ -242,6 +286,9 @@
|
||||
opacity = 1
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_hatch
|
||||
req_one_access = list(access_maint_tunnels)
|
||||
open_sound_powered = 'sound/machines/door/hatchopen.ogg'
|
||||
close_sound_powered = 'sound/machines/door/hatchclose.ogg'
|
||||
open_sound_unpowered = 'sound/machines/door/hatchforced.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/maintenance_hatch
|
||||
name = "Maintenance Hatch"
|
||||
@@ -250,6 +297,9 @@
|
||||
opacity = 1
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_mhatch
|
||||
req_one_access = list(access_maint_tunnels)
|
||||
open_sound_powered = 'sound/machines/door/hatchopen.ogg'
|
||||
close_sound_powered = 'sound/machines/door/hatchclose.ogg'
|
||||
open_sound_unpowered = 'sound/machines/door/hatchforced.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_command
|
||||
name = "Command Airlock"
|
||||
@@ -261,6 +311,10 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_com
|
||||
glass = 1
|
||||
req_one_access = list(access_heads)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/cmd1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/cmd1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_engineering
|
||||
name = "Engineering Airlock"
|
||||
@@ -272,6 +326,8 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_eng
|
||||
glass = 1
|
||||
req_one_access = list(access_engine)
|
||||
department_open_powered = 'sound/machines/door/eng1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/eng1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_engineeringatmos
|
||||
name = "Atmospherics Airlock"
|
||||
@@ -283,6 +339,10 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_eat
|
||||
glass = 1
|
||||
req_one_access = list(access_atmospherics)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/eng1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/eng1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_security
|
||||
name = "Security Airlock"
|
||||
@@ -294,6 +354,10 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_sec
|
||||
glass = 1
|
||||
req_one_access = list(access_security)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/sec1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/sec1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_medical
|
||||
name = "Medical Airlock"
|
||||
@@ -305,23 +369,39 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_med
|
||||
glass = 1
|
||||
req_one_access = list(access_medical)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/med1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/med1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/mining
|
||||
name = "Mining Airlock"
|
||||
icon = 'icons/obj/doors/Doormining.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_min
|
||||
req_one_access = list(access_mining)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/cgo1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/cgo1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/atmos
|
||||
name = "Atmospherics Airlock"
|
||||
icon = 'icons/obj/doors/Dooratmo.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
|
||||
req_one_access = list(access_atmospherics)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/eng1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/eng1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/research
|
||||
name = "Research Airlock"
|
||||
icon = 'icons/obj/doors/Doorresearch.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_research
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/sci1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/sci1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_research
|
||||
name = "Research Airlock"
|
||||
@@ -333,6 +413,10 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_research
|
||||
glass = 1
|
||||
req_one_access = list(access_research)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/sci1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/sci1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_mining
|
||||
name = "Mining Airlock"
|
||||
@@ -344,6 +428,10 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_min
|
||||
glass = 1
|
||||
req_one_access = list(access_mining)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/cgo1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/cgo1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_atmos
|
||||
name = "Atmospherics Airlock"
|
||||
@@ -355,6 +443,10 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
|
||||
glass = 1
|
||||
req_one_access = list(access_atmospherics)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/eng1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/eng1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/gold
|
||||
name = "Gold Airlock"
|
||||
@@ -435,6 +527,10 @@
|
||||
icon = 'icons/obj/doors/Doorsci.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_science
|
||||
req_one_access = list(access_research)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/sci1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/sci1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/glass_science
|
||||
name = "Glass Airlocks"
|
||||
@@ -443,6 +539,10 @@
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_science
|
||||
glass = 1
|
||||
req_one_access = list(access_research)
|
||||
open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off.
|
||||
department_open_powered = 'sound/machines/door/sci1o.ogg'
|
||||
department_close_powered = 'sound/machines/door/sci1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/highsecurity
|
||||
name = "Secure Airlock"
|
||||
@@ -451,6 +551,8 @@
|
||||
secured_wires = 1
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
|
||||
req_one_access = list(access_heads_vault)
|
||||
open_sound_powered = 'sound/machines/door/secure1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/secure1c.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/voidcraft
|
||||
name = "voidcraft hatch"
|
||||
@@ -460,11 +562,15 @@
|
||||
opacity = 0
|
||||
glass = 1
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft
|
||||
open_sound_powered = 'sound/machines/door/shuttle1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/shuttle1c.ogg'
|
||||
|
||||
// Airlock opens from top-bottom instead of left-right.
|
||||
/obj/machinery/door/airlock/voidcraft/vertical
|
||||
icon = 'icons/obj/doors/shuttledoors_vertical.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical
|
||||
open_sound_powered = 'sound/machines/door/shuttle1o.ogg'
|
||||
close_sound_powered = 'sound/machines/door/shuttle1c.ogg'
|
||||
|
||||
|
||||
/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock
|
||||
@@ -1107,10 +1213,41 @@ About the new airlock wires panel:
|
||||
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
|
||||
|
||||
//if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator
|
||||
if(arePowerSystemsOn())
|
||||
playsound(src, open_sound_powered, 50, 1)
|
||||
else
|
||||
playsound(src, open_sound_unpowered, 75, 1)
|
||||
for(var/P in player_list)
|
||||
var/mob/M = P
|
||||
if(!M || !M.client)
|
||||
continue
|
||||
var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds)
|
||||
var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds)
|
||||
var/sound
|
||||
var/volume
|
||||
if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled.
|
||||
if(arePowerSystemsOn())
|
||||
sound = legacy_open_powered
|
||||
volume = 50
|
||||
else
|
||||
sound = open_sound_unpowered
|
||||
volume = 75
|
||||
else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these.
|
||||
if(arePowerSystemsOn())
|
||||
sound = department_open_powered
|
||||
volume = 50
|
||||
else
|
||||
sound = open_sound_unpowered
|
||||
volume = 75
|
||||
else // Else, play these.
|
||||
if(arePowerSystemsOn())
|
||||
sound = open_sound_powered
|
||||
volume = 50
|
||||
else
|
||||
sound = open_sound_unpowered
|
||||
volume = 75
|
||||
|
||||
var/turf/T = get_turf(M)
|
||||
var/distance = get_dist(T, get_turf(src))
|
||||
if(distance <= world.view * 2)
|
||||
if(T && T.z == get_z(src))
|
||||
M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS)
|
||||
|
||||
if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density)
|
||||
src.closeOther.close()
|
||||
@@ -1205,10 +1342,41 @@ About the new airlock wires panel:
|
||||
|
||||
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
|
||||
has_beeped = 0
|
||||
if(arePowerSystemsOn())
|
||||
playsound(src, close_sound_powered, 50, 1)
|
||||
else
|
||||
playsound(src, open_sound_unpowered, 75, 1)
|
||||
for(var/P in player_list)
|
||||
var/mob/M = P
|
||||
if(!M || !M.client)
|
||||
continue
|
||||
var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds)
|
||||
var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds)
|
||||
var/sound
|
||||
var/volume
|
||||
if(old_sounds)
|
||||
if(arePowerSystemsOn())
|
||||
sound = legacy_close_powered
|
||||
volume = 50
|
||||
else
|
||||
sound = open_sound_unpowered
|
||||
volume = 75
|
||||
else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these.
|
||||
if(arePowerSystemsOn())
|
||||
sound = department_close_powered
|
||||
volume = 50
|
||||
else
|
||||
sound = open_sound_unpowered
|
||||
volume = 75
|
||||
else
|
||||
if(arePowerSystemsOn())
|
||||
sound = close_sound_powered
|
||||
volume = 50
|
||||
else
|
||||
sound = open_sound_unpowered
|
||||
volume = 75
|
||||
|
||||
var/turf/T = get_turf(M)
|
||||
var/distance = get_dist(T, get_turf(src))
|
||||
if(distance <= world.view * 2)
|
||||
if(T && T.z == get_z(src))
|
||||
M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS)
|
||||
for(var/turf/turf in locs)
|
||||
var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf)
|
||||
if(killthis)
|
||||
@@ -1222,7 +1390,7 @@ About the new airlock wires panel:
|
||||
if (operating && !forced) return 0
|
||||
|
||||
src.locked = 1
|
||||
playsound(src, bolt_down_sound, 30, 0, 3)
|
||||
playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS)
|
||||
for(var/mob/M in range(1,src))
|
||||
M.show_message("You hear a click from the bottom of the door.", 2)
|
||||
update_icon()
|
||||
@@ -1236,7 +1404,7 @@ About the new airlock wires panel:
|
||||
if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return
|
||||
|
||||
src.locked = 0
|
||||
playsound(src, bolt_up_sound, 30, 0, 3)
|
||||
playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS)
|
||||
for(var/mob/M in range(1,src))
|
||||
M.show_message("You hear a click from the bottom of the door.", 2)
|
||||
update_icon()
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
var/icon_state_opening = null
|
||||
var/icon_state_closed = null
|
||||
var/icon_state_closing = null
|
||||
var/open_sound = 'sound/machines/blastdooropen.ogg'
|
||||
var/close_sound = 'sound/machines/blastdoorclose.ogg'
|
||||
var/open_sound = 'sound/machines/door/blastdooropen.ogg'
|
||||
var/close_sound = 'sound/machines/door/blastdoorclose.ogg'
|
||||
var/damage = BLAST_DOOR_CRUSH_DAMAGE
|
||||
var/multiplier = 1 // The multiplier for how powerful our YEET is.
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
// Description: Opens or closes the door, depending on current state. No checks are done inside this proc.
|
||||
/obj/machinery/door/blast/proc/force_toggle(var/forced = 0, mob/user as mob)
|
||||
if (forced)
|
||||
playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1)
|
||||
|
||||
if(src.density)
|
||||
src.force_open()
|
||||
@@ -219,13 +219,13 @@
|
||||
if(src.density)
|
||||
visible_message("<span class='alium'>\The [user] begins forcing \the [src] open!</span>")
|
||||
if(do_after(user, 15 SECONDS,src))
|
||||
playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1)
|
||||
visible_message("<span class='danger'>\The [user] forces \the [src] open!</span>")
|
||||
force_open(1)
|
||||
else
|
||||
visible_message("<span class='alium'>\The [user] begins forcing \the [src] closed!</span>")
|
||||
if(do_after(user, 5 SECONDS,src))
|
||||
playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1)
|
||||
visible_message("<span class='danger'>\The [user] forces \the [src] closed!</span>")
|
||||
force_close(1)
|
||||
else
|
||||
|
||||
@@ -200,14 +200,14 @@
|
||||
if(src.blocked)
|
||||
visible_message("<span class='alium'>\The [user] begins digging into \the [src] internals!</span>")
|
||||
if(do_after(user,5 SECONDS,src))
|
||||
playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1)
|
||||
src.blocked = 0
|
||||
update_icon()
|
||||
open(1)
|
||||
else if(src.density)
|
||||
visible_message("<span class='alium'>\The [user] begins forcing \the [src] open!</span>")
|
||||
if(do_after(user, 2 SECONDS,src))
|
||||
playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1)
|
||||
visible_message("<span class='danger'>\The [user] forces \the [src] open!</span>")
|
||||
open(1)
|
||||
else
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
appearance_flags = 0
|
||||
var/obj/machinery/filler_object/filler1
|
||||
var/obj/machinery/filler_object/filler2
|
||||
open_sound_powered = 'sound/machines/door/WideOpen.ogg'
|
||||
close_sound_powered = 'sound/machines/door/WideClose.ogg'
|
||||
|
||||
/obj/machinery/door/airlock/multi_tile/New()
|
||||
..()
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
if (!operating) //in case of emag
|
||||
operating = 1
|
||||
flick(text("[src.base_state]opening"), src)
|
||||
playsound(src, 'sound/machines/windowdoor.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/windowdoor.ogg', 100, 1)
|
||||
sleep(10)
|
||||
|
||||
explosion_resistance = 0
|
||||
@@ -132,7 +132,7 @@
|
||||
return FALSE
|
||||
operating = TRUE
|
||||
flick(text("[]closing", src.base_state), src)
|
||||
playsound(src, 'sound/machines/windowdoor.ogg', 100, 1)
|
||||
playsound(src, 'sound/machines/door/windowdoor.ogg', 100, 1)
|
||||
|
||||
density = TRUE
|
||||
update_icon()
|
||||
|
||||
@@ -45,10 +45,7 @@ var/list/doppler_arrays = list()
|
||||
|
||||
/obj/machinery/doppler_array/power_change()
|
||||
..()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "[initial(icon_state)]-broken"
|
||||
if(!(stat & NOPOWER))
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
if(!(stat & NOPOWER))
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "[initial(icon_state)]-off"
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
|
||||
@@ -68,6 +68,11 @@
|
||||
var/flash_time = strength
|
||||
if(istype(O, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = O
|
||||
//VOREStation Edit Start
|
||||
if(H.nif && H.nif.flag_check(NIF_V_FLASHPROT,NIF_FLAGS_VISION))
|
||||
H.nif.notify("High intensity light detected, and blocked!",TRUE)
|
||||
continue
|
||||
//VOREStation Edit End
|
||||
if(!H.eyecheck() <= 0)
|
||||
continue
|
||||
flash_time *= H.species.flash_mod
|
||||
|
||||
@@ -810,6 +810,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
|
||||
var/scribble=""
|
||||
var/scribble_page = null
|
||||
drop_sound = 'sound/items/drop/wrapper.ogg'
|
||||
pickup_sound = 'sound/items/pickup/wrapper.ogg'
|
||||
|
||||
obj/item/weapon/newspaper/attack_self(mob/user as mob)
|
||||
if(ishuman(user))
|
||||
|
||||
@@ -234,116 +234,123 @@
|
||||
if(..())
|
||||
return
|
||||
ui_interact(user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/partslathe/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
user.set_machine(src)
|
||||
/obj/machinery/partslathe/ui_assets(mob/user)
|
||||
return list(
|
||||
get_asset_datum(/datum/asset/spritesheet/sheetmaterials)
|
||||
)
|
||||
|
||||
var/data[0]
|
||||
/obj/machinery/partslathe/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "PartsLathe", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/partslathe/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
var/list/data = ..()
|
||||
data["panelOpen"] = panel_open
|
||||
|
||||
var/materials_ui[0]
|
||||
var/list/materials_ui = list()
|
||||
for(var/M in materials)
|
||||
materials_ui[++materials_ui.len] = list(
|
||||
"name" = M,
|
||||
"display" = material_display_name(M),
|
||||
"qty" = materials[M],
|
||||
"max" = storage_capacity[M],
|
||||
"percent" = (materials[M] / storage_capacity[M] * 100))
|
||||
materials_ui.Add(list(list(
|
||||
"name" = M,
|
||||
"amount" = materials[M],
|
||||
"sheets" = round(materials[M] / SHEET_MATERIAL_AMOUNT),
|
||||
"removable" = materials[M] >= SHEET_MATERIAL_AMOUNT,
|
||||
)))
|
||||
data["materials"] = materials_ui
|
||||
|
||||
data["copyBoard"] = null
|
||||
data["copyBoardReqComponents"] = null
|
||||
if(istype(copy_board))
|
||||
data["copyBoard"] = copy_board.name
|
||||
var/req_components_ui[0]
|
||||
var/list/req_components_ui = list()
|
||||
for(var/CP in (copy_board.req_components || list()))
|
||||
var/obj/comp_path = CP
|
||||
var/comp_amt = copy_board.req_components[comp_path]
|
||||
if(comp_amt && (comp_path in partslathe_recipies))
|
||||
req_components_ui[++req_components_ui.len] = list("name" = initial(comp_path.name), "qty" = comp_amt)
|
||||
req_components_ui.Add(list(list("name" = initial(comp_path.name), "qty" = comp_amt)))
|
||||
data["copyBoardReqComponents"] = req_components_ui
|
||||
|
||||
data["queue"] = list()
|
||||
for(var/datum/category_item/partslathe/Q in queue)
|
||||
data["queue"] += Q.name
|
||||
|
||||
data["building"] = null
|
||||
data["buildPercent"] = null
|
||||
if(busy && queue.len > 0)
|
||||
var/datum/category_item/partslathe/current = queue[1]
|
||||
data["building"] = current.name
|
||||
data["buildProgress"] = progress
|
||||
data["buildTime"] = current.time
|
||||
data["buildPercent"] = (progress / current.time * 100)
|
||||
|
||||
data["error"] = null
|
||||
if(queue.len > 0 && !canBuild(queue[1]))
|
||||
data["error"] = getLackingMaterials(queue[1])
|
||||
|
||||
var/recipies_ui[0]
|
||||
var/list/recipies_ui = list()
|
||||
for(var/T in partslathe_recipies)
|
||||
var/datum/category_item/partslathe/R = partslathe_recipies[T]
|
||||
recipies_ui[++recipies_ui.len] = list("name" = R.name, "type" = "[T]")
|
||||
recipies_ui.Add(list(list("name" = R.name, "type" = "[T]")))
|
||||
data["recipies"] = recipies_ui
|
||||
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "partslathe.tmpl", "Parts Lathe UI", 500, 450)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(5)
|
||||
return data
|
||||
|
||||
/obj/machinery/partslathe/Topic(href, href_list)
|
||||
/obj/machinery/partslathe/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
if(..())
|
||||
return 1
|
||||
usr.set_machine(src)
|
||||
return TRUE
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
// Queue management can be done even while busy
|
||||
if(href_list["queue"])
|
||||
var/type_to_build = text2path(href_list["queue"])
|
||||
var/datum/category_item/partslathe/to_build = partslathe_recipies[type_to_build]
|
||||
if(to_build)
|
||||
addToQueue(to_build)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["queueBoard"])
|
||||
if(!istype(copy_board) || !copy_board.req_components)
|
||||
return
|
||||
for(var/comp_path in copy_board.req_components)
|
||||
var/comp_amt = copy_board.req_components[comp_path]
|
||||
if(!comp_amt)
|
||||
continue
|
||||
var/datum/category_item/partslathe/to_build = partslathe_recipies[comp_path]
|
||||
if(!to_build)
|
||||
continue // We don't support building whatever this is
|
||||
for(var/i in 1 to comp_amt)
|
||||
switch(action)
|
||||
// Queue management can be done even while busy
|
||||
if("queue")
|
||||
var/type_to_build = text2path(params["queue"])
|
||||
var/datum/category_item/partslathe/to_build = partslathe_recipies[type_to_build]
|
||||
if(to_build)
|
||||
addToQueue(to_build)
|
||||
return
|
||||
return TRUE
|
||||
|
||||
if(href_list["cancel"])
|
||||
var/index = text2num(href_list["cancel"])
|
||||
if(index < 1 || index > queue.len)
|
||||
return
|
||||
if(busy && index == 1)
|
||||
return
|
||||
removeFromQueue(index)
|
||||
return
|
||||
if("queueBoard")
|
||||
if(!istype(copy_board) || !copy_board.req_components)
|
||||
return
|
||||
for(var/comp_path in copy_board.req_components)
|
||||
var/comp_amt = copy_board.req_components[comp_path]
|
||||
if(!comp_amt)
|
||||
continue
|
||||
var/datum/category_item/partslathe/to_build = partslathe_recipies[comp_path]
|
||||
if(!to_build)
|
||||
continue // We don't support building whatever this is
|
||||
for(var/i in 1 to comp_amt)
|
||||
addToQueue(to_build)
|
||||
return TRUE
|
||||
|
||||
if("cancel")
|
||||
var/index = text2num(params["cancel"])
|
||||
if(index < 1 || index > queue.len)
|
||||
return
|
||||
if(busy && index == 1)
|
||||
return
|
||||
removeFromQueue(index)
|
||||
return TRUE
|
||||
|
||||
if(busy)
|
||||
to_chat(usr, "<span class='notice'>\The [src]is busy. Please wait for completion of previous operation.</span>")
|
||||
to_chat(usr, "<span class='notice'>[src] is busy. Please wait for completion of previous operation.</span>")
|
||||
return
|
||||
|
||||
if(href_list["ejectBoard"])
|
||||
if(copy_board)
|
||||
visible_message("<span class='notice'>\The [copy_board] is ejected from \the [src]'s circuit reader</span>.")
|
||||
copy_board.forceMove(src.loc)
|
||||
copy_board = null
|
||||
updateUsrDialog()
|
||||
return
|
||||
switch(action)
|
||||
if("ejectBoard")
|
||||
if(copy_board)
|
||||
visible_message("<span class='notice'>[copy_board] is ejected from [src]'s circuit reader</span>.")
|
||||
copy_board.forceMove(src.loc)
|
||||
copy_board = null
|
||||
return TRUE
|
||||
|
||||
if(href_list["ejectMaterial"])
|
||||
var/matName = href_list["ejectMaterial"]
|
||||
if(!(matName in materials))
|
||||
if("remove_mat")
|
||||
// Remove a material from the fab
|
||||
var/mat_id = params["id"]
|
||||
var/amount = text2num(params["amount"])
|
||||
eject_materials(mat_id, amount)
|
||||
return
|
||||
eject_materials(matName, 0)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/** Build list of recipies to include all tech level 1 stock parts. */
|
||||
/obj/machinery/partslathe/proc/update_recipe_list()
|
||||
|
||||
@@ -16,10 +16,10 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
|
||||
var/datum/seed/new_seed_type
|
||||
if(istype(O, /obj/item/weapon/grown))
|
||||
var/obj/item/weapon/grown/F = O
|
||||
new_seed_type = plant_controller.seeds[F.plantname]
|
||||
new_seed_type = SSplants.seeds[F.plantname]
|
||||
else
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
|
||||
new_seed_type = plant_controller.seeds[F.plantname]
|
||||
new_seed_type = SSplants.seeds[F.plantname]
|
||||
|
||||
if(new_seed_type)
|
||||
to_chat(user, "<span class='notice'>You extract some seeds from [O].</span>")
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
if("door")
|
||||
toggle_open(usr)
|
||||
. = TRUE
|
||||
if("dispense")
|
||||
if("dispense")
|
||||
switch(params["item"])
|
||||
if("helmet")
|
||||
dispense_helmet(usr)
|
||||
@@ -653,12 +653,12 @@
|
||||
name = "Vintage Pilot suit cycler"
|
||||
model_text = "Vintage Pilot"
|
||||
departments = list("Vintage Pilot (Bubble Helm)","Vintage Pilot (Closed Helm)")
|
||||
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/medsci
|
||||
name = "Vintage MedSci suit cycler"
|
||||
model_text = "Vintage MedSci"
|
||||
departments = list("Vintage Medical (Bubble Helm)","Vintage Medical (Closed Helm)","Vintage Research (Bubble Helm)","Vintage Research (Closed Helm)")
|
||||
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/rugged
|
||||
name = "Vintage Ruggedized suit cycler"
|
||||
model_text = "Vintage Ruggedized"
|
||||
@@ -751,7 +751,7 @@
|
||||
if(istype(I,/obj/item/clothing/head/helmet/space/void/autolok))
|
||||
to_chat(user, "You cannot refit an autolok helmet. In fact you shouldn't even be able to remove it in the first place. Inform an admin!")
|
||||
return
|
||||
|
||||
|
||||
//Ditto the Mk7
|
||||
if(istype(I,/obj/item/clothing/head/helmet/space/void/responseteam))
|
||||
to_chat(user, "The cycler indicates that the Mark VII Emergency Response Helmet is not compatible with the refitting system. How did you manage to detach it anyway? Inform an admin!")
|
||||
@@ -791,13 +791,13 @@
|
||||
if(istype(I,/obj/item/clothing/suit/space/void/autolok))
|
||||
to_chat(user, "You cannot refit an autolok suit.")
|
||||
return
|
||||
|
||||
|
||||
//Ditto the Mk7
|
||||
if(istype(I,/obj/item/clothing/suit/space/void/responseteam))
|
||||
to_chat(user, "The cycler indicates that the Mark VII Emergency Response Suit is not compatible with the refitting system.")
|
||||
return
|
||||
//VOREStation Edit ENDS
|
||||
|
||||
|
||||
to_chat(user, "You fit \the [I] into the suit cycler.")
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
@@ -886,7 +886,7 @@
|
||||
return TRUE
|
||||
|
||||
switch(action)
|
||||
if("dispense")
|
||||
if("dispense")
|
||||
switch(params["item"])
|
||||
if("helmet")
|
||||
helmet.forceMove(get_turf(src))
|
||||
@@ -895,23 +895,23 @@
|
||||
suit.forceMove(get_turf(src))
|
||||
suit = null
|
||||
. = TRUE
|
||||
|
||||
|
||||
if("department")
|
||||
var/choice = params["department"]
|
||||
if(choice in departments)
|
||||
target_department = choice
|
||||
. = TRUE
|
||||
|
||||
|
||||
if("species")
|
||||
var/choice = params["species"]
|
||||
if(choice in species)
|
||||
target_species = choice
|
||||
. = TRUE
|
||||
|
||||
|
||||
if("radlevel")
|
||||
radiation_level = clamp(params["radlevel"], 1, emagged ? 5 : 3)
|
||||
. = TRUE
|
||||
|
||||
|
||||
if("repair_suit")
|
||||
if(!suit || !can_repair)
|
||||
return
|
||||
@@ -1055,7 +1055,7 @@
|
||||
|
||||
if(target_species)
|
||||
if(helmet) helmet.refit_for_species(target_species)
|
||||
if(suit)
|
||||
if(suit)
|
||||
suit.refit_for_species(target_species)
|
||||
if(suit.helmet)
|
||||
suit.helmet.refit_for_species(target_species)
|
||||
@@ -1176,7 +1176,7 @@
|
||||
parent_suit = /obj/item/clothing/suit/space/void/refurb/mercenary
|
||||
//BEGIN: Space for additional downstream variants
|
||||
//VOREStation Addition Start
|
||||
if("Director")
|
||||
if("Manager")
|
||||
parent_helmet = /obj/item/clothing/head/helmet/space/void/captain
|
||||
parent_suit = /obj/item/clothing/suit/space/void/captain
|
||||
if("Prototype")
|
||||
@@ -1217,7 +1217,7 @@
|
||||
parent_suit = /obj/item/clothing/suit/space/void/refurb/mercenary/talon
|
||||
//VOREStation Addition End
|
||||
//END: downstream variant space
|
||||
|
||||
|
||||
//look at this! isn't it beautiful? -KK (well ok not beautiful but it's a lot cleaner)
|
||||
if(helmet && target_department != "No Change")
|
||||
var/obj/item/clothing/H = new parent_helmet
|
||||
@@ -1235,9 +1235,9 @@
|
||||
suit.desc = initial(parent_suit.desc)
|
||||
suit.icon_state = initial(parent_suit.icon_state)
|
||||
suit.item_state = initial(parent_suit.item_state)
|
||||
suit.item_state_slots = S.item_state_slots
|
||||
suit.item_state_slots = S.item_state_slots
|
||||
qdel(S)
|
||||
|
||||
|
||||
//can't believe I forgot to fix this- now helmets will properly cycle if they're attached to a suit -KK
|
||||
if(suit.helmet && target_department != "No Change")
|
||||
var/obj/item/clothing/AH = new parent_helmet
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/machinery/suit_cycler
|
||||
departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Exploration","Pilot Blue","Pilot","Director","Prototype")
|
||||
departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Exploration","Pilot Blue","Pilot","Manager","Prototype")
|
||||
species = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_VULPKANIN, SPECIES_GREY_YW /*ywedit*/)
|
||||
|
||||
// Old Exploration is too WIP to use right now
|
||||
@@ -11,10 +11,10 @@
|
||||
req_access = list(access_pilot)
|
||||
|
||||
/obj/machinery/suit_cycler/captain
|
||||
name = "Director suit cycler"
|
||||
model_text = "Director"
|
||||
name = "Manager suit cycler"
|
||||
model_text = "Manager"
|
||||
req_access = list(access_captain)
|
||||
departments = list("Director")
|
||||
departments = list("Manager")
|
||||
|
||||
/obj/machinery/suit_cycler/captain/Initialize() //No Teshari Sprites
|
||||
species -= SPECIES_TESHARI
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
/obj/item/clothing/shoes/brown = 5,
|
||||
/obj/item/clothing/shoes/laceup = 5,
|
||||
/obj/item/clothing/shoes/green = 5,
|
||||
/obj/item/clothing/shoes/leather = 5,
|
||||
/obj/item/clothing/shoes/laceup/brown = 5,
|
||||
/obj/item/clothing/shoes/orange = 5,
|
||||
/obj/item/clothing/shoes/purple = 5,
|
||||
/obj/item/clothing/shoes/red = 5,
|
||||
@@ -228,7 +228,7 @@
|
||||
/obj/item/clothing/shoes/brown = 50,
|
||||
/obj/item/clothing/shoes/laceup = 50,
|
||||
/obj/item/clothing/shoes/green = 50,
|
||||
/obj/item/clothing/shoes/leather = 50,
|
||||
/obj/item/clothing/shoes/laceup/brown = 50,
|
||||
/obj/item/clothing/shoes/orange = 50,
|
||||
/obj/item/clothing/shoes/purple = 50,
|
||||
/obj/item/clothing/shoes/red = 50,
|
||||
@@ -1172,7 +1172,19 @@
|
||||
/obj/item/clothing/mask/gas/sexyclown = 3,
|
||||
/obj/item/clothing/under/sexyclown = 3,
|
||||
/obj/item/clothing/mask/gas/sexymime = 3,
|
||||
/obj/item/clothing/under/sexymime = 3)
|
||||
/obj/item/clothing/under/sexymime = 3,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume = 3,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/galahad = 3,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/lancelot = 3,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/robin = 3,
|
||||
/obj/item/clothing/suit/armor/combat/crusader_costume = 3,
|
||||
/obj/item/clothing/suit/armor/combat/crusader_costume/bedevere = 3,
|
||||
/obj/item/clothing/head/helmet/combat/crusader_costume = 3,
|
||||
/obj/item/clothing/head/helmet/combat/bedevere_costume = 3,
|
||||
/obj/item/clothing/gloves/combat/knight_costume = 3,
|
||||
/obj/item/clothing/gloves/combat/knight_costume/brown = 3,
|
||||
/obj/item/clothing/shoes/knight_costume = 3,
|
||||
/obj/item/clothing/shoes/knight_costume/black = 3)
|
||||
prices = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 200,
|
||||
/obj/item/clothing/suit/storage/hooded/carp_costume = 200,
|
||||
/obj/item/clothing/suit/chickensuit = 200,
|
||||
@@ -1225,7 +1237,19 @@
|
||||
/obj/item/clothing/mask/gas/sexyclown = 600,
|
||||
/obj/item/clothing/under/sexyclown = 200,
|
||||
/obj/item/clothing/mask/gas/sexymime = 600,
|
||||
/obj/item/clothing/under/sexymime = 200)
|
||||
/obj/item/clothing/under/sexymime = 200,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume = 200,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/galahad = 200,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/lancelot = 200,
|
||||
/obj/item/clothing/suit/storage/hooded/knight_costume/robin = 200,
|
||||
/obj/item/clothing/suit/armor/combat/crusader_costume = 200,
|
||||
/obj/item/clothing/suit/armor/combat/crusader_costume/bedevere = 200,
|
||||
/obj/item/clothing/head/helmet/combat/crusader_costume = 200,
|
||||
/obj/item/clothing/head/helmet/combat/bedevere_costume = 200,
|
||||
/obj/item/clothing/gloves/combat/knight_costume = 200,
|
||||
/obj/item/clothing/gloves/combat/knight_costume/brown = 200,
|
||||
/obj/item/clothing/shoes/knight_costume = 200,
|
||||
/obj/item/clothing/shoes/knight_costume/black = 200)
|
||||
premium = list(/obj/item/clothing/suit/imperium_monk = 3,
|
||||
/obj/item/clothing/suit/barding/agatha = 2,
|
||||
/obj/item/clothing/suit/barding/alt_agatha = 2,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user