Merge branch 'kbraid.edit/additions' of https://github.com/KBraid/YWPolarisVore into kbraid.edit/additions

This commit is contained in:
Braiden
2020-09-19 03:03:11 -05:00
1020 changed files with 172936 additions and 702366 deletions
+11
View File
@@ -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"
+1 -1
View File
@@ -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"
+28
View File
@@ -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
+4
View File
@@ -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
View File
@@ -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
View File
@@ -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'\
)
+3 -1
View File
@@ -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"
+2
View File
@@ -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
+1
View File
@@ -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
+1 -1
View File
@@ -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()
+40
View File
@@ -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 ..()
File diff suppressed because it is too large Load Diff
-3
View File
@@ -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")
+96 -1
View File
@@ -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.
. = ..()
-126
View File
@@ -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.
. = ..()
@@ -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]]")
+9 -5
View File
@@ -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()
-1
View File
@@ -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)
+30 -30
View File
@@ -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)"
-345
View File
@@ -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
-56
View File
@@ -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
-80
View File
@@ -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
*/
+9
View File
@@ -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
-2
View File
@@ -1,5 +1,3 @@
var/datum/category_collection/autolathe/autolathe_recipes
/datum/category_item/autolathe/New()
..()
var/obj/item/I = new path()
-631
View File
@@ -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]")
-51
View File
@@ -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)
-5
View File
@@ -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)
-146
View File
@@ -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)
-11
View File
@@ -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)
-4
View File
@@ -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
-209
View File
@@ -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
-23
View File
@@ -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)
-71
View File
@@ -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)
-5
View File
@@ -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)
-70
View File
@@ -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)
-5
View File
@@ -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)
-15
View File
@@ -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)
+1 -1
View File
@@ -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))
+3 -1
View File
@@ -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)
+59 -9
View File
@@ -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
+2 -2
View File
@@ -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"
+1 -1
View File
@@ -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)"
+22 -2
View File
@@ -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"
+8 -11
View File
@@ -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"
+3
View File
@@ -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)
+4 -4
View File
@@ -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
+1
View File
@@ -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()
+2
View File
@@ -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"
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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"
+1 -1
View File
@@ -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()
..()
+1 -1
View File
@@ -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.
+9 -1
View File
@@ -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
View File
@@ -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
+2
View File
@@ -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
+2 -2
View File
@@ -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>")
+1 -1
View File
@@ -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)
+3 -3
View File
@@ -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',
+1 -1
View File
@@ -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 -9
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+5
View File
@@ -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. \
+1 -1
View File
@@ -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
+7 -7
View File
@@ -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)
+3
View File
@@ -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>"
+1 -1
View File
@@ -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
+6 -6
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
+93 -99
View File
@@ -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
+1 -1
View File
@@ -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
+1
View File
@@ -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
+203 -140
View File
@@ -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
+1 -1
View File
@@ -509,4 +509,4 @@
/obj/machinery/computer/secure_data/detective_computer
icon_state = "messyfiles"
#undef FIELD
#undef FIELD
+1
View File
@@ -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
+186 -18
View File
@@ -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()
+5 -5
View File
@@ -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
+2 -2
View File
@@ -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
+2
View File
@@ -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()
..()
+2 -2
View File
@@ -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()
+3 -6
View File
@@ -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"
+5
View File
@@ -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
+1
View File
@@ -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))
+76 -69
View File
@@ -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()
+2 -2
View File
@@ -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>")
+16 -16
View File
@@ -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
+4 -4
View File
@@ -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
+28 -4
View File
@@ -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