mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-07-21 05:04:10 +01:00
+10
-9
@@ -4,13 +4,10 @@ language: c
|
||||
env:
|
||||
global:
|
||||
- BASENAME="vorestation" # $BASENAME.dmb, $BASENAME.dme, etc.
|
||||
- BYOND_MAJOR="513"
|
||||
- BYOND_MINOR="1520"
|
||||
- MACRO_COUNT=4
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}
|
||||
- $HOME/BYOND
|
||||
|
||||
addons:
|
||||
apt:
|
||||
@@ -37,13 +34,17 @@ jobs:
|
||||
include:
|
||||
- stage: "File Tests" #This is the odd man out, with specific installs and stuff.
|
||||
name: "Validate Files"
|
||||
install: #Need python for some of the tag matching stuff
|
||||
- pip install --user PyYaml -q
|
||||
- pip install --user beautifulsoup4 -q
|
||||
script: ./tools/travis/validate_files.sh
|
||||
addons:
|
||||
apt:
|
||||
packages: ~ # Don't need any packages for this
|
||||
packages:
|
||||
- python3
|
||||
- python3-pip
|
||||
- python3-setuptools
|
||||
install: #Need python for some of the tag matching stuff
|
||||
- tools/travis/install_build_deps.sh
|
||||
script:
|
||||
- tools/travis/validate_files.sh
|
||||
- tools/travis/build_tgui.sh
|
||||
- stage: "Unit Tests"
|
||||
env: TEST_DEFINE="UNIT_TEST" TEST_FILE="code/_unit_tests.dm" RUN="1"
|
||||
name: "Compile normally (unit tests)"
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
# This file has all the information on what versions of libraries are thrown into the code
|
||||
# For dreamchecker
|
||||
export SPACEMANDMM_TAG=suite-1.4
|
||||
# For NanoUI + TGUI
|
||||
export NODE_VERSION=12
|
||||
# For the scripts in tools
|
||||
export PHP_VERSION=5.6
|
||||
# Byond Major
|
||||
export BYOND_MAJOR=513
|
||||
# Byond Minor
|
||||
export BYOND_MINOR=1526
|
||||
# Macro Count
|
||||
export MACRO_COUNT=4
|
||||
@@ -1,4 +1,5 @@
|
||||
// More for our custom races
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_SHADEKIN 13
|
||||
#define IS_GREY 14 //ywedit
|
||||
#define IS_ALRAUNE 14
|
||||
#define IS_GREY 15 //ywedit
|
||||
@@ -46,6 +46,10 @@
|
||||
|
||||
#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (isclient(I) ? I : null))
|
||||
|
||||
|
||||
//Persistence
|
||||
#define AREA_FLAG_IS_NOT_PERSISTENT 8 // SSpersistence will not track values from this area.
|
||||
|
||||
// Shuttles.
|
||||
|
||||
// These define the time taken for the shuttle to get to the space station, and the time before it leaves again.
|
||||
@@ -351,3 +355,110 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define JOB_SILICON 0x6 // 2|4, probably don't set jobs to this, but good for checking
|
||||
|
||||
#define DEFAULT_OVERMAP_RANGE 0 // Makes general computers and devices be able to connect to other overmap z-levels on the same tile.
|
||||
|
||||
/*
|
||||
Used for wire name appearances. Replaces the color name on the left with the one on the right.
|
||||
The color on the left is the one used as the actual color of the wire, but it doesn't look good when written.
|
||||
So, we need to replace the name to something that looks better.
|
||||
*/
|
||||
#define LIST_COLOR_RENAME \
|
||||
list( \
|
||||
"rebeccapurple" = "dark purple",\
|
||||
"darkslategrey" = "dark grey", \
|
||||
"darkolivegreen"= "dark green", \
|
||||
"darkslateblue" = "dark blue", \
|
||||
"darkkhaki" = "khaki", \
|
||||
"darkseagreen" = "light green",\
|
||||
"midnightblue" = "blue", \
|
||||
"lightgrey" = "light grey", \
|
||||
"darkgrey" = "dark grey", \
|
||||
"darkmagenta" = "dark magenta",\
|
||||
"steelblue" = "blue", \
|
||||
"goldenrod" = "gold" \
|
||||
)
|
||||
|
||||
/// Pure Black and white colorblindness. Every species except Vulpkanins and Tajarans will have this.
|
||||
#define GREYSCALE_COLOR_REPLACE \
|
||||
list( \
|
||||
"red" = "grey", \
|
||||
"blue" = "grey", \
|
||||
"green" = "grey", \
|
||||
"orange" = "light grey", \
|
||||
"brown" = "grey", \
|
||||
"gold" = "light grey", \
|
||||
"cyan" = "silver", \
|
||||
"magenta" = "grey", \
|
||||
"purple" = "grey", \
|
||||
"pink" = "light grey" \
|
||||
)
|
||||
|
||||
/// Red colorblindness. Vulpkanins/Wolpins have this.
|
||||
#define PROTANOPIA_COLOR_REPLACE \
|
||||
list( \
|
||||
"red" = "darkolivegreen", \
|
||||
"darkred" = "darkolivegreen", \
|
||||
"green" = "yellow", \
|
||||
"orange" = "goldenrod", \
|
||||
"gold" = "goldenrod", \
|
||||
"brown" = "darkolivegreen", \
|
||||
"cyan" = "steelblue", \
|
||||
"magenta" = "blue", \
|
||||
"purple" = "darkslategrey", \
|
||||
"pink" = "beige" \
|
||||
)
|
||||
|
||||
/// Green colorblindness.
|
||||
#define DEUTERANOPIA_COLOR_REPLACE \
|
||||
list( \
|
||||
"red" = "goldenrod", \
|
||||
"green" = "tan", \
|
||||
"yellow" = "tan", \
|
||||
"orange" = "goldenrod", \
|
||||
"gold" = "burlywood", \
|
||||
"brown" = "saddlebrown",\
|
||||
"cyan" = "lavender", \
|
||||
"magenta" = "blue", \
|
||||
"darkmagenta" = "darkslateblue", \
|
||||
"purple" = "slateblue", \
|
||||
"pink" = "thistle" \
|
||||
)
|
||||
|
||||
/// Yellow-Blue colorblindness. Tajarans/Farwas have this.
|
||||
#define TRITANOPIA_COLOR_REPLACE \
|
||||
list( \
|
||||
"red" = "rebeccapurple", \
|
||||
"blue" = "darkslateblue", \
|
||||
"green" = "darkolivegreen", \
|
||||
"orange" = "darkkhaki", \
|
||||
"gold" = "darkkhaki", \
|
||||
"brown" = "rebeccapurple", \
|
||||
"cyan" = "darkseagreen", \
|
||||
"magenta" = "darkslateblue", \
|
||||
"navy" = "darkslateblue", \
|
||||
"purple" = "darkslateblue", \
|
||||
"pink" = "lightgrey" \
|
||||
)
|
||||
|
||||
//Various stuff used in Persistence
|
||||
|
||||
#define send_output(target, msg, control) target << output(msg, control)
|
||||
|
||||
#define send_link(target, url) target << link(url)
|
||||
|
||||
#define SPAN_NOTICE(X) "<span class='notice'>[X]</span>"
|
||||
|
||||
#define SPAN_WARNING(X) "<span class='warning'>[X]</span>"
|
||||
|
||||
#define SPAN_DANGER(X) "<span class='danger'>[X]</span>"
|
||||
|
||||
#define SPAN_OCCULT(X) "<span class='cult'>[X]</span>"
|
||||
|
||||
#define FONT_SMALL(X) "<font size='1'>[X]</font>"
|
||||
|
||||
#define FONT_NORMAL(X) "<font size='2'>[X]</font>"
|
||||
|
||||
#define FONT_LARGE(X) "<font size='3'>[X]</font>"
|
||||
|
||||
#define FONT_HUGE(X) "<font size='4'>[X]</font>"
|
||||
|
||||
#define FONT_GIANT(X) "<font size='5'>[X]</font>"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as
|
||||
|
||||
#define LANGUAGE_DRUDAKAR "D'Rudak'Ar"
|
||||
#define LANGUAGE_SLAVIC "Pan-Slavic"
|
||||
#define LANGUAGE_BIRDSONG "Birdsong"
|
||||
#define LANGUAGE_SAGARU "Sagaru"
|
||||
|
||||
@@ -77,6 +77,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define INIT_ORDER_AI -22
|
||||
#define INIT_ORDER_AI_FAST -23
|
||||
#define INIT_ORDER_GAME_MASTER -24
|
||||
#define INIT_ORDER_PERSISTENCE -25
|
||||
#define INIT_ORDER_TICKER -50
|
||||
#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
|
||||
|
||||
@@ -100,6 +101,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define FIRE_PRIORITY_TICKER 60
|
||||
#define FIRE_PRIORITY_PLANETS 75
|
||||
#define FIRE_PRIORITY_MACHINES 100
|
||||
#define FIRE_PRIORITY_TGUI 110
|
||||
#define FIRE_PRIORITY_PROJECTILES 150
|
||||
#define FIRE_PRIORITY_CHAT 400
|
||||
#define FIRE_PRIORITY_OVERLAYS 500
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/// Maximum number of windows that can be suspended/reused
|
||||
#define TGUI_WINDOW_SOFT_LIMIT 5
|
||||
/// Maximum number of open windows
|
||||
#define TGUI_WINDOW_HARD_LIMIT 9
|
||||
|
||||
/// Maximum ping timeout allowed to detect zombie windows
|
||||
#define TGUI_PING_TIMEOUT 4 SECONDS
|
||||
|
||||
/// Window does not exist
|
||||
#define TGUI_WINDOW_CLOSED 0
|
||||
/// Window was just opened, but is still not ready to be sent data
|
||||
#define TGUI_WINDOW_LOADING 1
|
||||
/// Window is free and ready to receive data
|
||||
#define TGUI_WINDOW_READY 2
|
||||
|
||||
/// Get a window id based on the provided pool index
|
||||
#define TGUI_WINDOW_ID(index) "tgui-window-[index]"
|
||||
/// Get a pool index of the provided window id
|
||||
#define TGUI_WINDOW_INDEX(window_id) text2num(copytext(window_id, 13))
|
||||
@@ -0,0 +1,122 @@
|
||||
// Wire defines for all machines/items.
|
||||
|
||||
// Miscellaneous
|
||||
#define WIRE_DUD_PREFIX "__dud"
|
||||
|
||||
// General
|
||||
#define WIRE_IDSCAN "ID Scan"
|
||||
#define WIRE_MAIN_POWER1 "Primary Power"
|
||||
#define WIRE_MAIN_POWER2 "Secondary Power"
|
||||
#define WIRE_AI_CONTROL "AI Control"
|
||||
#define WIRE_ELECTRIFY "Electrification"
|
||||
#define WIRE_SAFETY "Safety"
|
||||
|
||||
// Vendors and smartfridges
|
||||
#define WIRE_THROW_ITEM "Item Throw"
|
||||
#define WIRE_CONTRABAND "Contraband"
|
||||
|
||||
// Airlock
|
||||
#define WIRE_DOOR_BOLTS "Door Bolts"
|
||||
#define WIRE_BACKUP_POWER1 "Primary Backup Power"
|
||||
#define WIRE_BACKUP_POWER2 "Secondary Backup Power"
|
||||
#define WIRE_OPEN_DOOR "Door State"
|
||||
#define WIRE_SPEED "Door Timing"
|
||||
#define WIRE_BOLT_LIGHT "Bolt Lights"
|
||||
|
||||
// Air alarm
|
||||
#define WIRE_SYPHON "Siphon"
|
||||
#define WIRE_AALARM "Atmospherics Alarm"
|
||||
|
||||
// Camera
|
||||
#define WIRE_FOCUS "Focus"
|
||||
#define WIRE_CAM_LIGHT "Camera Light"
|
||||
#define WIRE_CAM_ALARM "Camera Alarm"
|
||||
|
||||
// Grid Check
|
||||
#define WIRE_REBOOT "Reboot"
|
||||
#define WIRE_LOCKOUT "Lockout"
|
||||
#define WIRE_ALLOW_MANUAL1 "Manual Override 1"
|
||||
#define WIRE_ALLOW_MANUAL2 "Manual Override 2"
|
||||
#define WIRE_ALLOW_MANUAL3 "Manual Override 3"
|
||||
|
||||
// Jukebox
|
||||
#define WIRE_POWER "Power"
|
||||
#define WIRE_JUKEBOX_HACK "Hack"
|
||||
#define WIRE_SPEEDUP "Speedup"
|
||||
#define WIRE_SPEEDDOWN "Speeddown"
|
||||
#define WIRE_REVERSE "Reverse"
|
||||
#define WIRE_START "Start"
|
||||
#define WIRE_STOP "Stop"
|
||||
#define WIRE_PREV "Prev"
|
||||
#define WIRE_NEXT "Next"
|
||||
|
||||
// Mulebot
|
||||
#define WIRE_MOB_AVOIDANCE "Mob Avoidance"
|
||||
#define WIRE_LOADCHECK "Load Checking"
|
||||
#define WIRE_MOTOR1 "Primary Motor"
|
||||
#define WIRE_MOTOR2 "Secondary Motor"
|
||||
#define WIRE_REMOTE_RX "Signal Receiver"
|
||||
#define WIRE_REMOTE_TX "Signal Sender"
|
||||
#define WIRE_BEACON_RX "Beacon Receiver"
|
||||
|
||||
// Explosives, bombs
|
||||
#define WIRE_EXPLODE "Explode" // Explodes if pulsed or cut while active, defuses a bomb that isn't active on cut.
|
||||
#define WIRE_EXPLODE_DELAY "Explode Delay" // Explodes immediately if cut, explodes 3 seconds later if pulsed.
|
||||
#define WIRE_DISARM "Disarm" // Explicit "disarming" wire.
|
||||
#define WIRE_BADDISARM "Bad Disarm" // Disarming wire, except it blows up anyways.
|
||||
#define WIRE_BOMB_UNBOLT "Unbolt" // Unbolts the bomb if cut, hint on pulsed.
|
||||
#define WIRE_BOMB_DELAY "Delay" // Raises the timer on pulse, does nothing on cut.
|
||||
#define WIRE_BOMB_PROCEED "Proceed" // Lowers the timer, explodes if cut while the bomb is active.
|
||||
#define WIRE_BOMB_ACTIVATE "Activate" // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut.
|
||||
|
||||
// Nuclear bomb
|
||||
#define WIRE_BOMB_LIGHT "Bomb Light"
|
||||
#define WIRE_BOMB_TIMING "Bomb Timing"
|
||||
#define WIRE_BOMB_SAFETY "Bomb Safety"
|
||||
|
||||
// Particle accelerator
|
||||
#define WIRE_PARTICLE_POWER "Power Toggle" // Toggles whether the PA is on or not.
|
||||
#define WIRE_PARTICLE_STRENGTH "Strength" // Determines the strength of the PA.
|
||||
#define WIRE_PARTICLE_INTERFACE "Interface" // Determines the interface showing up.
|
||||
#define WIRE_PARTICLE_POWER_LIMIT "Maximum Power" // Determines how strong the PA can be.
|
||||
|
||||
// Autolathe
|
||||
#define WIRE_AUTOLATHE_HACK "Hack"
|
||||
#define WIRE_AUTOLATHE_DISABLE "Disable"
|
||||
|
||||
// Radio
|
||||
#define WIRE_RADIO_SIGNAL "Signal"
|
||||
#define WIRE_RADIO_RECEIVER "Receiver"
|
||||
#define WIRE_RADIO_TRANSMIT "Transmitter"
|
||||
|
||||
// Cyborg
|
||||
#define WIRE_BORG_LOCKED "Lockdown"
|
||||
#define WIRE_BORG_CAMERA "Camera"
|
||||
#define WIRE_BORG_LAWCHECK "Law Check"
|
||||
|
||||
// Seed Storage
|
||||
#define WIRE_SEED_SMART "Smart"
|
||||
#define WIRE_SEED_LOCKDOWN "Lockdown"
|
||||
|
||||
// Shield Generator
|
||||
#define WIRE_SHIELD_CONTROL "Shield Controls" // Cut to lock most shield controls. Mend to unlock them. Pulse does nothing.
|
||||
|
||||
// SMES
|
||||
#define WIRE_SMES_RCON "RCon" // Remote control (AI and consoles), cut to disable
|
||||
#define WIRE_SMES_INPUT "Input" // Input wire, cut to disable input, pulse to disable for 60s
|
||||
#define WIRE_SMES_OUTPUT "Output" // Output wire, cut to disable output, pulse to disable for 60s
|
||||
#define WIRE_SMES_GROUNDING "Grounding" // Cut to quickly discharge causing sparks, pulse to only create few sparks
|
||||
#define WIRE_SMES_FAILSAFES "Failsafes" // Cut to disable failsafes, mend to reenable
|
||||
|
||||
// Suit storage unit
|
||||
#define WIRE_SSU_UV "UV wire"
|
||||
|
||||
// Tesla coil
|
||||
#define WIRE_TESLACOIL_ZAP "Zap"
|
||||
|
||||
// RIGsuits
|
||||
#define WIRE_RIG_SECURITY "Security"
|
||||
#define WIRE_RIG_AI_OVERRIDE "AI Override"
|
||||
#define WIRE_RIG_SYSTEM_CONTROL "System Control"
|
||||
#define WIRE_RIG_INTERFACE_LOCK "Interface Lock"
|
||||
#define WIRE_RIG_INTERFACE_SHOCK "Interface Shock"
|
||||
@@ -1,2 +1,5 @@
|
||||
GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))
|
||||
GLOBAL_LIST_EMPTY(meteor_list)
|
||||
|
||||
/// List of wire colors for each object type of that round. One for airlocks, one for vendors, etc.
|
||||
GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value.
|
||||
+22
-1
@@ -615,4 +615,25 @@ datum/projectile_data
|
||||
/proc/window_flash(var/client_or_usr)
|
||||
if (!client_or_usr)
|
||||
return
|
||||
winset(client_or_usr, "mainwindow", "flash=5")
|
||||
winset(client_or_usr, "mainwindow", "flash=5")
|
||||
|
||||
/**
|
||||
* Get a bounding box of a list of atoms.
|
||||
*
|
||||
* Arguments:
|
||||
* - atoms - List of atoms. Can accept output of view() and range() procs.
|
||||
*
|
||||
* Returns: list(x1, y1, x2, y2)
|
||||
*/
|
||||
/proc/get_bbox_of_atoms(list/atoms)
|
||||
var/list/list_x = list()
|
||||
var/list/list_y = list()
|
||||
for(var/_a in atoms)
|
||||
var/atom/a = _a
|
||||
list_x += a.x
|
||||
list_y += a.y
|
||||
return list(
|
||||
min(list_x),
|
||||
min(list_y),
|
||||
max(list_x),
|
||||
max(list_y))
|
||||
@@ -154,7 +154,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/weapon/bone,
|
||||
/obj/item/weapon/broken_bottle,
|
||||
/obj/item/weapon/card/emag_broken,
|
||||
/obj/item/weapon/cigbutt,
|
||||
/obj/item/trash/cigbutt,
|
||||
/obj/item/weapon/circuitboard/broken,
|
||||
/obj/item/weapon/clipboard,
|
||||
/obj/item/weapon/corncob,
|
||||
|
||||
@@ -176,6 +176,22 @@
|
||||
/proc/log_unit_test(text)
|
||||
to_world_log("## UNIT_TEST: [text]")
|
||||
|
||||
/proc/log_tgui(user_or_client, text)
|
||||
var/entry = ""
|
||||
if(!user_or_client)
|
||||
entry += "no user"
|
||||
else if(istype(user_or_client, /mob))
|
||||
var/mob/user = user_or_client
|
||||
entry += "[user.ckey] (as [user])"
|
||||
else if(istype(user_or_client, /client))
|
||||
var/client/client = user_or_client
|
||||
entry += "[client.ckey]"
|
||||
entry += ":\n[text]"
|
||||
WRITE_LOG(diary, entry)
|
||||
|
||||
/proc/log_asset(text)
|
||||
WRITE_LOG(diary, "ASSET: [text]")
|
||||
|
||||
/proc/report_progress(var/progress_message)
|
||||
admin_notice("<span class='boldannounce'>[progress_message]</span>", R_DEBUG)
|
||||
to_world_log(progress_message)
|
||||
|
||||
@@ -56,3 +56,9 @@
|
||||
. = B[STAT_ENTRY_TIME] - A[STAT_ENTRY_TIME]
|
||||
if (!.)
|
||||
. = B[STAT_ENTRY_COUNT] - A[STAT_ENTRY_COUNT]
|
||||
|
||||
// Compares complexity of recipes for use in cooking, etc. This is for telling which recipe to make, not for showing things to the player.
|
||||
/proc/cmp_recipe_complexity_dsc(datum/recipe/A, datum/recipe/B)
|
||||
var/a_score = LAZYLEN(A.items) + LAZYLEN(A.reagents) + LAZYLEN(A.fruit)
|
||||
var/b_score = LAZYLEN(B.items) + LAZYLEN(B.reagents) + LAZYLEN(B.fruit)
|
||||
return b_score - a_score
|
||||
@@ -138,6 +138,19 @@
|
||||
/proc/sanitize_old(var/t,var/list/repl_chars = list("\n"="#","\t"="#"))
|
||||
return html_encode(replace_characters(t,repl_chars))
|
||||
|
||||
|
||||
//Removes a few problematic characters
|
||||
/proc/sanitize_simple(t,list/repl_chars = list("\n"="#","\t"="#"))
|
||||
for(var/char in repl_chars)
|
||||
var/index = findtext(t, char)
|
||||
while(index)
|
||||
t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index + length(char))
|
||||
index = findtext(t, char, index + length(char))
|
||||
return t
|
||||
|
||||
/proc/sanitize_filename(t)
|
||||
return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"=""))
|
||||
|
||||
/*
|
||||
* Text searches
|
||||
*/
|
||||
|
||||
@@ -1571,6 +1571,14 @@ var/mob/dview/dview_mob = new
|
||||
/datum/proc/stack_trace(msg)
|
||||
CRASH(msg)
|
||||
|
||||
GLOBAL_REAL_VAR(list/stack_trace_storage)
|
||||
/proc/gib_stack_trace()
|
||||
stack_trace_storage = list()
|
||||
stack_trace()
|
||||
stack_trace_storage.Cut(1, min(3,stack_trace_storage.len))
|
||||
. = stack_trace_storage
|
||||
stack_trace_storage = null
|
||||
|
||||
// \ref behaviour got changed in 512 so this is necesary to replicate old behaviour.
|
||||
// If it ever becomes necesary to get a more performant REF(), this lies here in wait
|
||||
// #define REF(thing) (thing && istype(thing, /datum) && (thing:datum_flags & DF_USE_TAG) && thing:tag ? "[thing:tag]" : "\ref[thing]")
|
||||
|
||||
+1
-1
@@ -37,4 +37,4 @@
|
||||
|
||||
#define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id)
|
||||
|
||||
#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") }
|
||||
#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") }
|
||||
@@ -123,8 +123,3 @@
|
||||
|
||||
/obj/screen/fullscreen/fishbed
|
||||
icon_state = "fishbed"
|
||||
|
||||
#undef FULLSCREEN_LAYER
|
||||
#undef BLIND_LAYER
|
||||
#undef DAMAGE_LAYER
|
||||
#undef CRIT_LAYER
|
||||
@@ -0,0 +1,171 @@
|
||||
/client
|
||||
/**
|
||||
* Assoc list with all the active maps - when a screen obj is added to
|
||||
* a map, it's put in here as well.
|
||||
*
|
||||
* Format: list(<mapname> = list(/obj/screen))
|
||||
*/
|
||||
var/list/screen_maps = list()
|
||||
|
||||
/obj/screen
|
||||
/**
|
||||
* Map name assigned to this object.
|
||||
* Automatically set by /client/proc/register_map_obj.
|
||||
*/
|
||||
var/assigned_map
|
||||
/**
|
||||
* Mark this object as garbage-collectible after you clean the map
|
||||
* it was registered on.
|
||||
*
|
||||
* This could probably be changed to be a proc, for conditional removal.
|
||||
* But for now, this works.
|
||||
*/
|
||||
var/del_on_map_removal = TRUE
|
||||
|
||||
/**
|
||||
* A screen object, which acts as a container for turfs and other things
|
||||
* you want to show on the map, which you usually attach to "vis_contents".
|
||||
*/
|
||||
/obj/screen/map_view
|
||||
icon_state = "blank"
|
||||
// Map view has to be on the lowest plane to enable proper lighting
|
||||
layer = SPACE_PLANE
|
||||
plane = SPACE_PLANE
|
||||
|
||||
/**
|
||||
* A generic background object.
|
||||
* It is also implicitly used to allocate a rectangle on the map, which will
|
||||
* be used for auto-scaling the map.
|
||||
*/
|
||||
/obj/screen/background
|
||||
name = "background"
|
||||
icon = 'icons/mob/map_backgrounds.dmi'
|
||||
icon_state = "clear"
|
||||
layer = SPACE_PLANE
|
||||
plane = SPACE_PLANE
|
||||
|
||||
/**
|
||||
* Sets screen_loc of this screen object, in form of point coordinates,
|
||||
* with optional pixel offset (px, py).
|
||||
*
|
||||
* If applicable, "assigned_map" has to be assigned before this proc call.
|
||||
*/
|
||||
/obj/screen/proc/set_position(x, y, px = 0, py = 0)
|
||||
if(assigned_map)
|
||||
screen_loc = "[assigned_map]:[x]:[px],[y]:[py]"
|
||||
else
|
||||
screen_loc = "[x]:[px],[y]:[py]"
|
||||
|
||||
/**
|
||||
* Sets screen_loc to fill a rectangular area of the map.
|
||||
*
|
||||
* If applicable, "assigned_map" has to be assigned before this proc call.
|
||||
*/
|
||||
/obj/screen/proc/fill_rect(x1, y1, x2, y2)
|
||||
if(assigned_map)
|
||||
screen_loc = "[assigned_map]:[x1],[y1] to [x2],[y2]"
|
||||
else
|
||||
screen_loc = "[x1],[y1] to [x2],[y2]"
|
||||
|
||||
/**
|
||||
* Registers screen obj with the client, which makes it visible on the
|
||||
* assigned map, and becomes a part of the assigned map's lifecycle.
|
||||
*/
|
||||
/client/proc/register_map_obj(obj/screen/screen_obj)
|
||||
if(!screen_obj.assigned_map)
|
||||
CRASH("Can't register [screen_obj] without 'assigned_map' property.")
|
||||
if(!screen_maps[screen_obj.assigned_map])
|
||||
screen_maps[screen_obj.assigned_map] = list()
|
||||
// NOTE: Possibly an expensive operation
|
||||
var/list/screen_map = screen_maps[screen_obj.assigned_map]
|
||||
if(!screen_map.Find(screen_obj))
|
||||
screen_map += screen_obj
|
||||
if(!screen.Find(screen_obj))
|
||||
screen += screen_obj
|
||||
|
||||
/**
|
||||
* Clears the map of registered screen objects.
|
||||
*
|
||||
* Not really needed most of the time, as the client's screen list gets reset
|
||||
* on relog. any of the buttons are going to get caught by garbage collection
|
||||
* anyway. they're effectively qdel'd.
|
||||
*/
|
||||
/client/proc/clear_map(map_name)
|
||||
if(!map_name || !(map_name in screen_maps))
|
||||
return FALSE
|
||||
for(var/obj/screen/screen_obj in screen_maps[map_name])
|
||||
screen_maps[map_name] -= screen_obj
|
||||
if(screen_obj.del_on_map_removal)
|
||||
qdel(screen_obj)
|
||||
screen_maps -= map_name
|
||||
|
||||
/**
|
||||
* Clears all the maps of registered screen objects.
|
||||
*/
|
||||
/client/proc/clear_all_maps()
|
||||
for(var/map_name in screen_maps)
|
||||
clear_map(map_name)
|
||||
|
||||
/**
|
||||
* Creates a popup window with a basic map element in it, without any
|
||||
* further initialization.
|
||||
*
|
||||
* Ratio is how many pixels by how many pixels (keep it simple).
|
||||
*
|
||||
* Returns a map name.
|
||||
*/
|
||||
/client/proc/create_popup(name, ratiox = 100, ratioy = 100)
|
||||
winclone(src, "popupwindow", name)
|
||||
var/list/winparams = list()
|
||||
winparams["size"] = "[ratiox]x[ratioy]"
|
||||
winparams["on-close"] = "handle-popup-close [name]"
|
||||
winset(src, "[name]", list2params(winparams))
|
||||
winshow(src, "[name]", 1)
|
||||
|
||||
var/list/params = list()
|
||||
params["parent"] = "[name]"
|
||||
params["type"] = "map"
|
||||
params["size"] = "[ratiox]x[ratioy]"
|
||||
params["anchor1"] = "0,0"
|
||||
params["anchor2"] = "[ratiox],[ratioy]"
|
||||
winset(src, "[name]_map", list2params(params))
|
||||
|
||||
return "[name]_map"
|
||||
|
||||
/**
|
||||
* Create the popup, and get it ready for generic use by giving
|
||||
* it a background.
|
||||
*
|
||||
* Width and height are multiplied by 64 by default.
|
||||
*/
|
||||
/client/proc/setup_popup(popup_name, width = 9, height = 9, \
|
||||
tilesize = 2, bg_icon)
|
||||
if(!popup_name)
|
||||
return
|
||||
clear_map("[popup_name]_map")
|
||||
var/x_value = world.icon_size * tilesize * width
|
||||
var/y_value = world.icon_size * tilesize * height
|
||||
var/map_name = create_popup(popup_name, x_value, y_value)
|
||||
|
||||
var/obj/screen/background/background = new
|
||||
background.assigned_map = map_name
|
||||
background.fill_rect(1, 1, width, height)
|
||||
if(bg_icon)
|
||||
background.icon_state = bg_icon
|
||||
register_map_obj(background)
|
||||
|
||||
return map_name
|
||||
|
||||
/**
|
||||
* Closes a popup.
|
||||
*/
|
||||
/client/proc/close_popup(popup)
|
||||
winshow(src, popup, 0)
|
||||
handle_popup_close(popup)
|
||||
|
||||
/**
|
||||
* When the popup closes in any way (player or proc call) it calls this.
|
||||
*/
|
||||
/client/verb/handle_popup_close(window_id as text)
|
||||
set hidden = TRUE
|
||||
clear_map("[window_id]_map")
|
||||
@@ -470,7 +470,6 @@
|
||||
var/mob/living/silicon/robot/R = usr
|
||||
if(R.module)
|
||||
R.uneq_active()
|
||||
R.hud_used.update_robot_modules_display()
|
||||
else
|
||||
to_chat(R, "You haven't selected a module yet.")
|
||||
|
||||
|
||||
@@ -3,17 +3,20 @@
|
||||
#define SKYBOX_TURFS (SKYBOX_PIXELS/WORLD_ICON_SIZE)
|
||||
|
||||
// Skybox screen object.
|
||||
/obj/skybox
|
||||
/obj/screen/skybox
|
||||
name = "skybox"
|
||||
icon = null
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE
|
||||
mouse_opacity = 0
|
||||
anchored = TRUE
|
||||
simulated = FALSE
|
||||
screen_loc = "CENTER,CENTER"
|
||||
layer = OBJ_LAYER
|
||||
plane = SKYBOX_PLANE
|
||||
blend_mode = BLEND_MULTIPLY // You actually need to do it this way or you see it in occlusion.
|
||||
|
||||
// Adjust transform property to scale for client's view var. We assume the skybox is 736x736 px
|
||||
/obj/skybox/proc/scale_to_view(var/view)
|
||||
/obj/screen/skybox/proc/scale_to_view(var/view)
|
||||
var/matrix/M = matrix()
|
||||
// Translate to center the icon over us!
|
||||
M.Translate(-(SKYBOX_PIXELS - WORLD_ICON_SIZE) / 2)
|
||||
@@ -23,7 +26,7 @@
|
||||
src.transform = M
|
||||
|
||||
/client
|
||||
var/obj/skybox/skybox
|
||||
var/obj/screen/skybox/skybox
|
||||
|
||||
/client/proc/update_skybox(rebuild)
|
||||
if(!skybox)
|
||||
|
||||
@@ -237,6 +237,8 @@ var/list/gamemode_cache = list()
|
||||
var/static/dooc_allowed = 1
|
||||
var/static/dsay_allowed = 1
|
||||
|
||||
var/persistence_enabled = 1
|
||||
|
||||
var/allow_byond_links = 0
|
||||
var/allow_discord_links = 0
|
||||
var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations
|
||||
@@ -435,15 +437,15 @@ var/list/gamemode_cache = list()
|
||||
|
||||
if ("allow_admin_spawning")
|
||||
config.allow_admin_spawning = 1
|
||||
|
||||
|
||||
if ("allow_byond_links")
|
||||
allow_byond_links = 1
|
||||
|
||||
if ("allow_discord_links")
|
||||
allow_discord_links = 1
|
||||
allow_discord_links = 1
|
||||
|
||||
if ("allow_url_links")
|
||||
allow_url_links = 1
|
||||
allow_url_links = 1
|
||||
|
||||
if ("no_dead_vote")
|
||||
config.vote_no_dead = 1
|
||||
@@ -581,6 +583,9 @@ var/list/gamemode_cache = list()
|
||||
if("protect_roles_from_antagonist")
|
||||
config.protect_roles_from_antagonist = 1
|
||||
|
||||
if ("persistence_enabled")
|
||||
config.persistence_enabled = 1
|
||||
|
||||
if ("probability")
|
||||
var/prob_pos = findtext(value, " ")
|
||||
var/prob_name = null
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
SUBSYSTEM_DEF(persistence)
|
||||
name = "Persistence"
|
||||
init_order = INIT_ORDER_PERSISTENCE
|
||||
flags = SS_NO_FIRE
|
||||
var/list/tracking_values = list()
|
||||
var/list/persistence_datums = list()
|
||||
|
||||
/datum/controller/subsystem/persistence/Initialize()
|
||||
. = ..()
|
||||
for(var/thing in subtypesof(/datum/persistent))
|
||||
var/datum/persistent/P = new thing
|
||||
persistence_datums[thing] = P
|
||||
P.Initialize()
|
||||
|
||||
/datum/controller/subsystem/persistence/Shutdown()
|
||||
for(var/thing in persistence_datums)
|
||||
var/datum/persistent/P = persistence_datums[thing]
|
||||
P.Shutdown()
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/track_value(var/atom/value, var/track_type)
|
||||
|
||||
if(config.persistence_enabled == 0) //if the config is not set to persistent nothing will save or load.
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(value)
|
||||
if(!T)
|
||||
return
|
||||
|
||||
var/area/A = get_area(T)
|
||||
if(!A || (A.flags & AREA_FLAG_IS_NOT_PERSISTENT))
|
||||
return
|
||||
|
||||
// if((!T.z in GLOB.using_map.station_levels) || !initialized)
|
||||
if(!T.z in using_map.station_levels)
|
||||
return
|
||||
|
||||
if(!tracking_values[track_type])
|
||||
tracking_values[track_type] = list()
|
||||
tracking_values[track_type] += value
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/forget_value(var/atom/value, var/track_type)
|
||||
if(tracking_values[track_type])
|
||||
tracking_values[track_type] -= value
|
||||
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/show_info(var/mob/user)
|
||||
if(!user.client.holder)
|
||||
return
|
||||
|
||||
var/list/dat = list("<table width = '100%'>")
|
||||
var/can_modify = check_rights(R_ADMIN, 0, user)
|
||||
for(var/thing in persistence_datums)
|
||||
var/datum/persistent/P = persistence_datums[thing]
|
||||
if(P.has_admin_data)
|
||||
dat += P.GetAdminSummary(user, can_modify)
|
||||
dat += "</table>"
|
||||
var/datum/browser/popup = new(user, "admin_persistence", "Persistence Data")
|
||||
popup.set_content(jointext(dat, null))
|
||||
popup.open()
|
||||
@@ -132,7 +132,7 @@ SUBSYSTEM_DEF(skybox)
|
||||
for(var/z in zlevels)
|
||||
skybox_cache["[z]"] = generate_skybox(z)
|
||||
|
||||
for(var/client/C)
|
||||
for(var/client/C in GLOB.clients)
|
||||
var/their_z = get_z(C.mob)
|
||||
if(!their_z) //Nullspace
|
||||
continue
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
/**
|
||||
* tgui subsystem
|
||||
*
|
||||
* Contains all tgui state and subsystem code.
|
||||
**/
|
||||
|
||||
|
||||
SUBSYSTEM_DEF(tgui)
|
||||
name = "TGUI"
|
||||
wait = 9
|
||||
flags = SS_NO_INIT
|
||||
priority = FIRE_PRIORITY_TGUI
|
||||
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
|
||||
|
||||
/// A list of UIs scheduled to process
|
||||
var/list/current_run = list()
|
||||
/// A list of open UIs
|
||||
var/list/open_uis = list()
|
||||
/// A list of open UIs, grouped by src_object and ui_key.
|
||||
var/list/open_uis_by_src = list()
|
||||
/// The HTML base used for all UIs.
|
||||
var/basehtml
|
||||
|
||||
/datum/controller/subsystem/tgui/PreInit()
|
||||
basehtml = file2text('tgui/packages/tgui/public/tgui.html')
|
||||
|
||||
/datum/controller/subsystem/tgui/Shutdown()
|
||||
close_all_uis()
|
||||
|
||||
/datum/controller/subsystem/tgui/stat_entry()
|
||||
..("P:[open_uis.len]")
|
||||
|
||||
/datum/controller/subsystem/tgui/fire(resumed = 0)
|
||||
if(!resumed)
|
||||
src.current_run = open_uis.Copy()
|
||||
// Cache for sanic speed (lists are references anyways)
|
||||
var/list/current_run = src.current_run
|
||||
while(current_run.len)
|
||||
var/datum/tgui/ui = current_run[current_run.len]
|
||||
current_run.len--
|
||||
// TODO: Move user/src_object check to process()
|
||||
if(ui && ui.user && ui.src_object)
|
||||
ui.process()
|
||||
else
|
||||
open_uis.Remove(ui)
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Requests a usable tgui window from the pool.
|
||||
* Returns null if pool was exhausted.
|
||||
*
|
||||
* required user mob
|
||||
* return datum/tgui
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/request_pooled_window(mob/user)
|
||||
if(!user.client)
|
||||
return null
|
||||
var/list/windows = user.client.tgui_windows
|
||||
var/window_id
|
||||
var/datum/tgui_window/window
|
||||
var/window_found = FALSE
|
||||
// Find a usable window
|
||||
for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT)
|
||||
window_id = TGUI_WINDOW_ID(i)
|
||||
window = windows[window_id]
|
||||
// As we are looping, create missing window datums
|
||||
if(!window)
|
||||
window = new(user.client, window_id, pooled = TRUE)
|
||||
// Skip windows with acquired locks
|
||||
if(window.locked)
|
||||
continue
|
||||
if(window.status == TGUI_WINDOW_READY)
|
||||
return window
|
||||
if(window.status == TGUI_WINDOW_CLOSED)
|
||||
window.status = TGUI_WINDOW_LOADING
|
||||
window_found = TRUE
|
||||
break
|
||||
if(!window_found)
|
||||
return null
|
||||
return window
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Force closes all tgui windows.
|
||||
*
|
||||
* required user mob
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/force_close_all_windows(mob/user)
|
||||
if(user.client)
|
||||
user.client.tgui_windows = list()
|
||||
for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT)
|
||||
var/window_id = TGUI_WINDOW_ID(i)
|
||||
user << browse(null, "window=[window_id]")
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Force closes the tgui window by window_id.
|
||||
*
|
||||
* required user mob
|
||||
* required window_id string
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/force_close_window(mob/user, window_id)
|
||||
// Close all tgui datums based on window_id.
|
||||
for(var/datum/tgui/ui in user.tgui_open_uis)
|
||||
if(ui.window && ui.window.id == window_id)
|
||||
ui.close(can_be_suspended = FALSE)
|
||||
// Unset machine just to be sure.
|
||||
user.unset_machine()
|
||||
// Close window directly just to be sure.
|
||||
user << browse(null, "window=[window_id]")
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Get a open UI given a user, src_object, and ui_key and try to update it with data.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* required src_object datum The object/datum which owns the UI.
|
||||
* required ui_key string The ui_key of the UI.
|
||||
*
|
||||
* return datum/tgui The found UI.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/try_update_ui(
|
||||
mob/user,
|
||||
datum/src_object,
|
||||
datum/tgui/ui)
|
||||
// Look up a UI if it wasn't passed.
|
||||
if(isnull(ui))
|
||||
ui = get_open_ui(user, src_object)
|
||||
// Couldn't find a UI.
|
||||
if(isnull(ui))
|
||||
return null
|
||||
ui.process_status()
|
||||
// UI ended up with the closed status
|
||||
// or is actively trying to close itself.
|
||||
// FIXME: Doesn't actually fix the paper bug.
|
||||
if(ui.status <= STATUS_CLOSE)
|
||||
ui.close()
|
||||
return null
|
||||
ui.send_update()
|
||||
return ui
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Get a open UI given a user, src_object, and ui_key.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* required src_object datum The object/datum which owns the UI.
|
||||
* required ui_key string The ui_key of the UI.
|
||||
*
|
||||
* return datum/tgui The found UI.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object)
|
||||
var/key = "[REF(src_object)]"
|
||||
// No UIs opened for this src_object
|
||||
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
|
||||
return null // No UIs open.
|
||||
for(var/datum/tgui/ui in open_uis_by_src[key]) // Find UIs for this object.
|
||||
// Make sure we have the right user
|
||||
if(ui.user == user)
|
||||
return ui
|
||||
return null // Couldn't find a UI!
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Update all UIs attached to src_object.
|
||||
*
|
||||
* required src_object datum The object/datum which owns the UIs.
|
||||
*
|
||||
* return int The number of UIs updated.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/update_uis(datum/src_object)
|
||||
var/count = 0
|
||||
var/key = "[REF(src_object)]"
|
||||
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
|
||||
return count // Couldn't find any UIs for this object.
|
||||
for(var/datum/tgui/ui in open_uis_by_src[key])
|
||||
// Check the UI is valid.
|
||||
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user))
|
||||
ui.process(force = 1) // Update the UI.
|
||||
count++ // Count each UI we update.
|
||||
return count
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Close all UIs attached to src_object.
|
||||
*
|
||||
* required src_object datum The object/datum which owns the UIs.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/close_uis(datum/src_object)
|
||||
var/count = 0
|
||||
var/key = "[REF(src_object)]"
|
||||
// No UIs opened for this src_object
|
||||
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
|
||||
return count
|
||||
for(var/datum/tgui/ui in open_uis_by_src[key])
|
||||
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
|
||||
ui.close() // Close the UI.
|
||||
count++ // Count each UI we close.
|
||||
return count
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Close all UIs regardless of their attachment to src_object.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/close_all_uis()
|
||||
var/count = 0
|
||||
for(var/key in open_uis_by_src)
|
||||
for(var/datum/tgui/ui in open_uis_by_src[key])
|
||||
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
|
||||
ui.close() // Close the UI.
|
||||
count++ // Count each UI we close.
|
||||
return count
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Update all UIs belonging to a user.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* optional src_object datum If provided, only update UIs belonging this src_object.
|
||||
*
|
||||
* return int The number of UIs updated.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object)
|
||||
var/count = 0
|
||||
if(length(user?.tgui_open_uis) == 0)
|
||||
return count
|
||||
for(var/datum/tgui/ui in user.tgui_open_uis)
|
||||
if(isnull(src_object) || ui.src_object == src_object)
|
||||
ui.process(force = 1)
|
||||
count++
|
||||
return count
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Close all UIs belonging to a user.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* optional src_object datum If provided, only close UIs belonging this src_object.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object)
|
||||
var/count = 0
|
||||
if(length(user?.tgui_open_uis) == 0)
|
||||
return count
|
||||
for(var/datum/tgui/ui in user.tgui_open_uis)
|
||||
if(isnull(src_object) || ui.src_object == src_object)
|
||||
ui.close()
|
||||
count++
|
||||
return count
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Add a UI to the list of open UIs.
|
||||
*
|
||||
* required ui datum/tgui The UI to be added.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui)
|
||||
var/key = "[REF(ui.src_object)]"
|
||||
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
|
||||
open_uis_by_src[key] = list()
|
||||
ui.user.tgui_open_uis |= ui
|
||||
var/list/uis = open_uis_by_src[key]
|
||||
uis |= ui
|
||||
open_uis |= ui
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Remove a UI from the list of open UIs.
|
||||
*
|
||||
* required ui datum/tgui The UI to be removed.
|
||||
*
|
||||
* return bool If the UI was removed or not.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui)
|
||||
var/key = "[REF(ui.src_object)]"
|
||||
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
|
||||
return FALSE
|
||||
// Remove it from the list of processing UIs.
|
||||
open_uis.Remove(ui)
|
||||
// If the user exists, remove it from them too.
|
||||
if(ui.user)
|
||||
ui.user.tgui_open_uis.Remove(ui)
|
||||
var/list/uis = open_uis_by_src[key]
|
||||
uis.Remove(ui)
|
||||
if(length(uis) == 0)
|
||||
open_uis_by_src.Remove(key)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Handle client logout, by closing all their UIs.
|
||||
*
|
||||
* required user mob The mob which logged out.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_logout(mob/user)
|
||||
return close_user_uis(user)
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Handle clients switching mobs, by transferring their UIs.
|
||||
*
|
||||
* required user source The client's original mob.
|
||||
* required user target The client's new mob.
|
||||
*
|
||||
* return bool If the UIs were transferred.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_transfer(mob/source, mob/target)
|
||||
// The old mob had no open UIs.
|
||||
if(length(source?.tgui_open_uis) == 0)
|
||||
return FALSE
|
||||
if(isnull(target.tgui_open_uis) || !istype(target.tgui_open_uis, /list))
|
||||
target.tgui_open_uis = list()
|
||||
// Transfer all the UIs.
|
||||
for(var/datum/tgui/ui in source.tgui_open_uis)
|
||||
// Inform the UIs of their new owner.
|
||||
ui.user = target
|
||||
target.tgui_open_uis.Add(ui)
|
||||
// Clear the old list.
|
||||
source.tgui_open_uis.Cut()
|
||||
return TRUE
|
||||
@@ -90,13 +90,13 @@
|
||||
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"
|
||||
|
||||
@@ -1,166 +0,0 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* /datum/recipe by rastaf0 13 apr 2011 *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* This is powerful and flexible recipe system.
|
||||
* It exists not only for food.
|
||||
* supports both reagents and objects as prerequisites.
|
||||
* In order to use this system you have to define a deriative from /datum/recipe
|
||||
* * reagents are reagents. Acid, milc, booze, etc.
|
||||
* * items are objects. Fruits, tools, circuit boards.
|
||||
* * result is type to create as new object
|
||||
* * time is optional parameter, you shall use in in your machine,
|
||||
default /datum/recipe/ procs does not rely on this parameter.
|
||||
*
|
||||
* Functions you need:
|
||||
* /datum/recipe/proc/make(var/obj/container as obj)
|
||||
* Creates result inside container,
|
||||
* deletes prerequisite reagents,
|
||||
* transfers reagents from prerequisite objects,
|
||||
* deletes all prerequisite objects (even not needed for recipe at the moment).
|
||||
*
|
||||
* /proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj as obj, exact = 1)
|
||||
* Wonderful function that select suitable recipe for you.
|
||||
* obj is a machine (or magik hat) with prerequisites,
|
||||
* exact = 0 forces algorithm to ignore superfluous stuff.
|
||||
*
|
||||
*
|
||||
* Functions you do not need to call directly but could:
|
||||
* /datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents)
|
||||
* /datum/recipe/proc/check_items(var/obj/container as obj)
|
||||
*
|
||||
* */
|
||||
|
||||
/datum/recipe
|
||||
var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
|
||||
var/list/items // example: = list(/obj/item/weapon/tool/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
|
||||
var/list/fruit // example: = list("fruit" = 3)
|
||||
var/result // example: = /obj/item/weapon/reagent_containers/food/snacks/donut/normal
|
||||
var/time = 100 // 1/10 part of second
|
||||
|
||||
/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents)
|
||||
. = 1
|
||||
for (var/r_r in reagents)
|
||||
var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r)
|
||||
if (!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals
|
||||
if (aval_r_amnt>reagents[r_r])
|
||||
. = 0
|
||||
else
|
||||
return -1
|
||||
if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
|
||||
return 0
|
||||
return .
|
||||
|
||||
/datum/recipe/proc/check_fruit(var/obj/container)
|
||||
. = 1
|
||||
if(fruit && fruit.len)
|
||||
var/list/checklist = list()
|
||||
// You should trust Copy().
|
||||
checklist = fruit.Copy()
|
||||
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in container)
|
||||
if(!G.seed || !G.seed.kitchen_tag || isnull(checklist[G.seed.kitchen_tag]))
|
||||
continue
|
||||
checklist[G.seed.kitchen_tag]--
|
||||
for(var/ktag in checklist)
|
||||
if(!isnull(checklist[ktag]))
|
||||
if(checklist[ktag] < 0)
|
||||
. = 0
|
||||
else if(checklist[ktag] > 0)
|
||||
. = -1
|
||||
break
|
||||
return .
|
||||
|
||||
/datum/recipe/proc/check_items(var/obj/container as obj)
|
||||
. = 1
|
||||
if (items && items.len)
|
||||
var/list/checklist = list()
|
||||
checklist = items.Copy() // You should really trust Copy
|
||||
if(istype(container, /obj/machinery))
|
||||
var/obj/machinery/machine = container
|
||||
for(var/obj/O in ((machine.contents - machine.component_parts) - machine.circuit))
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
|
||||
continue // Fruit is handled in check_fruit().
|
||||
var/found = 0
|
||||
for(var/i = 1; i < checklist.len+1; i++)
|
||||
var/item_type = checklist[i]
|
||||
if (istype(O,item_type))
|
||||
checklist.Cut(i, i+1)
|
||||
found = 1
|
||||
break
|
||||
if (!found)
|
||||
. = 0
|
||||
else
|
||||
for(var/obj/O in container.contents)
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
|
||||
continue // Fruit is handled in check_fruit().
|
||||
var/found = 0
|
||||
for(var/i = 1; i < checklist.len+1; i++)
|
||||
var/item_type = checklist[i]
|
||||
if (istype(O,item_type))
|
||||
checklist.Cut(i, i+1)
|
||||
found = 1
|
||||
break
|
||||
if (!found)
|
||||
. = 0
|
||||
if (checklist.len)
|
||||
. = -1
|
||||
return .
|
||||
|
||||
//general version
|
||||
/datum/recipe/proc/make(var/obj/container as obj)
|
||||
var/obj/result_obj = new result(container)
|
||||
if(istype(container, /obj/machinery))
|
||||
var/obj/machinery/machine = container
|
||||
for (var/obj/O in ((machine.contents-result_obj - machine.component_parts) - machine.circuit))
|
||||
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
|
||||
qdel(O)
|
||||
else
|
||||
for (var/obj/O in (container.contents-result_obj))
|
||||
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
|
||||
qdel(O)
|
||||
container.reagents.clear_reagents()
|
||||
return result_obj
|
||||
|
||||
// food-related
|
||||
/datum/recipe/proc/make_food(var/obj/container as obj)
|
||||
if(!result)
|
||||
to_world("<span class='danger'>Recipe [type] is defined without a result, please bug report this.</span>")
|
||||
return
|
||||
var/obj/result_obj = new result(container)
|
||||
if(istype(container, /obj/machinery))
|
||||
var/obj/machinery/machine = container
|
||||
for (var/obj/O in ((machine.contents-result_obj - machine.component_parts) - machine.circuit))
|
||||
if (O.reagents)
|
||||
O.reagents.del_reagent("nutriment")
|
||||
O.reagents.update_total()
|
||||
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
|
||||
qdel(O)
|
||||
else
|
||||
for (var/obj/O in (container.contents-result_obj))
|
||||
if (O.reagents)
|
||||
O.reagents.del_reagent("nutriment")
|
||||
O.reagents.update_total()
|
||||
O.reagents.trans_to_obj(result_obj, O.reagents.total_volume)
|
||||
qdel(O)
|
||||
container.reagents.clear_reagents()
|
||||
return result_obj
|
||||
|
||||
/proc/select_recipe(var/list/datum/recipe/avaiable_recipes, var/obj/obj as obj, var/exact)
|
||||
var/list/datum/recipe/possible_recipes = new
|
||||
var/target = exact ? 0 : 1
|
||||
for (var/datum/recipe/recipe in avaiable_recipes)
|
||||
if((recipe.check_reagents(obj.reagents) < target) || (recipe.check_items(obj) < target) || (recipe.check_fruit(obj) < target))
|
||||
continue
|
||||
possible_recipes |= recipe
|
||||
if (possible_recipes.len==0)
|
||||
return null
|
||||
else if (possible_recipes.len==1)
|
||||
return possible_recipes[1]
|
||||
else //okay, let's select the most complicated recipe
|
||||
var/highest_count = 0
|
||||
. = possible_recipes[1]
|
||||
for (var/datum/recipe/recipe in possible_recipes)
|
||||
var/count = ((recipe.items)?(recipe.items.len):0) + ((recipe.reagents)?(recipe.reagents.len):0) + ((recipe.fruit)?(recipe.fruit.len):0)
|
||||
if (count >= highest_count)
|
||||
highest_count = count
|
||||
. = recipe
|
||||
return .
|
||||
@@ -1,49 +0,0 @@
|
||||
var/global/datum/repository/cameras/camera_repository = new()
|
||||
|
||||
/proc/invalidateCameraCache()
|
||||
camera_repository.networks.Cut()
|
||||
camera_repository.invalidated = 1
|
||||
camera_repository.camera_cache_id = (++camera_repository.camera_cache_id % 999999)
|
||||
|
||||
/datum/repository/cameras
|
||||
var/list/networks
|
||||
var/invalidated = 1
|
||||
var/camera_cache_id = 1
|
||||
|
||||
/datum/repository/cameras/New()
|
||||
networks = list()
|
||||
..()
|
||||
|
||||
/datum/repository/cameras/proc/cameras_in_network(var/network, var/list/zlevels)
|
||||
setup_cache()
|
||||
var/list/network_list = networks[network]
|
||||
if(LAZYLEN(zlevels))
|
||||
var/list/filtered_cameras = list()
|
||||
for(var/list/C in network_list)
|
||||
//Camera is marked as always-visible
|
||||
if(C["omni"])
|
||||
filtered_cameras[++filtered_cameras.len] = C
|
||||
continue
|
||||
//Camera might be in an adjacent zlevel
|
||||
var/camz = C["z"]
|
||||
if(!camz) //It's inside something (helmet, communicator, etc) or nullspace or who knows
|
||||
camz = get_z(locate(C["camera"]) in cameranet.cameras)
|
||||
if(camz in zlevels)
|
||||
filtered_cameras[++filtered_cameras.len] = C //Can't add lists to lists with +=
|
||||
return filtered_cameras
|
||||
else
|
||||
return network_list
|
||||
|
||||
/datum/repository/cameras/proc/setup_cache()
|
||||
if(!invalidated)
|
||||
return
|
||||
invalidated = 0
|
||||
|
||||
cameranet.process_sort()
|
||||
for(var/obj/machinery/camera/C in cameranet.cameras)
|
||||
var/cam = C.nano_structure()
|
||||
for(var/network in C.network)
|
||||
if(!networks[network])
|
||||
networks[network] = list()
|
||||
var/list/netlist = networks[network]
|
||||
netlist[++netlist.len] = cam
|
||||
|
||||
@@ -51,6 +51,7 @@ var/global/datum/repository/crew/crew_repository = new()
|
||||
crewmemberData["area"] = sanitize(A.get_name())
|
||||
crewmemberData["x"] = pos.x
|
||||
crewmemberData["y"] = pos.y
|
||||
crewmemberData["realZ"] = pos.z
|
||||
crewmemberData["z"] = using_map.get_zlevel_name(pos.z)
|
||||
|
||||
crewmembers[++crewmembers.len] = crewmemberData
|
||||
|
||||
@@ -11,42 +11,42 @@
|
||||
name = "Inflatable barriers"
|
||||
contains = list(/obj/item/weapon/storage/briefcase/inflatable = 3)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/aether
|
||||
containername = "Inflatable Barrier Crate"
|
||||
|
||||
/datum/supply_pack/atmos/canister_empty
|
||||
name = "Empty gas canister"
|
||||
cost = 7
|
||||
containername = "Empty gas canister crate"
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/aether
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister)
|
||||
|
||||
/datum/supply_pack/atmos/canister_air
|
||||
name = "Air canister"
|
||||
cost = 10
|
||||
containername = "Air canister crate"
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/aether
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/air)
|
||||
|
||||
/datum/supply_pack/atmos/canister_oxygen
|
||||
name = "Oxygen canister"
|
||||
cost = 15
|
||||
containername = "Oxygen canister crate"
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/aether
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/oxygen)
|
||||
|
||||
/datum/supply_pack/atmos/canister_nitrogen
|
||||
name = "Nitrogen canister"
|
||||
cost = 10
|
||||
containername = "Nitrogen canister crate"
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/aether
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen)
|
||||
|
||||
/datum/supply_pack/atmos/canister_phoron
|
||||
name = "Phoron gas canister"
|
||||
cost = 60
|
||||
containername = "Phoron gas canister crate"
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containertype = /obj/structure/closet/crate/secure/large/aether
|
||||
access = access_atmospherics
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/phoron)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
name = "N2O gas canister"
|
||||
cost = 15
|
||||
containername = "N2O gas canister crate"
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containertype = /obj/structure/closet/crate/secure/large/aether
|
||||
access = access_atmospherics
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/sleeping_agent)
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
name = "Carbon dioxide gas canister"
|
||||
cost = 15
|
||||
containername = "CO2 canister crate"
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containertype = /obj/structure/closet/crate/secure/large/aether
|
||||
access = access_atmospherics
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide)
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
contains = list(/obj/machinery/pipedispenser/orderable)
|
||||
name = "Pipe Dispenser"
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containertype = /obj/structure/closet/crate/secure/large/aether
|
||||
containername = "Pipe Dispenser Crate"
|
||||
access = access_atmospherics
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
contains = list(/obj/machinery/pipedispenser/disposal/orderable)
|
||||
name = "Disposals Pipe Dispenser"
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containertype = /obj/structure/closet/crate/secure/large/aether
|
||||
containername = "Disposal Dispenser Crate"
|
||||
access = access_atmospherics
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
/obj/item/weapon/tank/air = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/internals
|
||||
containertype = /obj/structure/closet/crate/aether
|
||||
containername = "Internals crate"
|
||||
|
||||
/datum/supply_pack/atmos/evacuation
|
||||
@@ -104,5 +104,5 @@
|
||||
/obj/item/clothing/mask/gas = 4
|
||||
)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/internals
|
||||
containertype = /obj/structure/closet/crate/aether
|
||||
containername = "Emergency crate"
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
/obj/item/weapon/grenade/smokebomb = 4,
|
||||
/obj/item/weapon/grenade/chem_grenade/incendiary
|
||||
)
|
||||
cost = 500
|
||||
containertype = /obj/structure/closet/crate
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/weapon
|
||||
containername = "Special Ops crate"
|
||||
contraband = 1
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/unajerky = 4
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/unathi
|
||||
containername = "Moghes imports crate"
|
||||
contraband = 1
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
)
|
||||
cost = 1000
|
||||
contraband = 1
|
||||
containertype = /obj/structure/closet/crate/secure/weapon
|
||||
containertype = /obj/structure/closet/crate/hedberg
|
||||
containername = "Ballistic weapons crate"
|
||||
|
||||
/datum/supply_pack/randomised/misc/telecrate
|
||||
@@ -95,5 +95,5 @@
|
||||
)
|
||||
cost = 400 //price,
|
||||
contraband = 1
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large
|
||||
containername = "Suspicious crate"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Here is where any supply packs
|
||||
* related to weapons live.
|
||||
* related to costumes live.
|
||||
*/
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/clothing/head/wizard/fake
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/nanothreads
|
||||
containername = "Wizard costume crate"
|
||||
|
||||
/datum/supply_pack/randomised/costumes/hats
|
||||
@@ -48,8 +48,8 @@
|
||||
)
|
||||
name = "Collectable hat crate!"
|
||||
cost = 200
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Collectable hats crate! Brought to you by Bass.inc!"
|
||||
containertype = /obj/structure/closet/crate/nanothreads
|
||||
containername = "Collectable hats crate"
|
||||
|
||||
/datum/supply_pack/randomised/costumes/costume
|
||||
num_contained = 3
|
||||
@@ -84,7 +84,7 @@
|
||||
)
|
||||
name = "Costumes crate"
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/nanothreads
|
||||
containername = "Actor Costumes"
|
||||
|
||||
/datum/supply_pack/costumes/formal_wear
|
||||
@@ -104,15 +104,15 @@
|
||||
/obj/item/clothing/shoes/leather,
|
||||
/obj/item/clothing/accessory/wcoat
|
||||
)
|
||||
name = "Formalwear closet"
|
||||
name = "Formalwear (Suits)"
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet
|
||||
containername = "Formalwear for the best occasions."
|
||||
containertype = /obj/structure/closet/crate/gilthari
|
||||
containername = "Formal suit crate"
|
||||
|
||||
datum/supply_pack/costumes/witch
|
||||
name = "Witch costume"
|
||||
containername = "Witch costume"
|
||||
containertype = /obj/structure/closet
|
||||
containertype = /obj/structure/closet/crate/nanothreads
|
||||
cost = 20
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/wizrobe/marisa/fake,
|
||||
@@ -124,7 +124,7 @@ datum/supply_pack/costumes/witch
|
||||
/datum/supply_pack/randomised/costumes/costume_hats
|
||||
name = "Costume hats"
|
||||
containername = "Actor hats crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/nanothreads
|
||||
cost = 10
|
||||
num_contained = 3
|
||||
contains = list(
|
||||
@@ -147,9 +147,9 @@ datum/supply_pack/costumes/witch
|
||||
)
|
||||
|
||||
/datum/supply_pack/randomised/costumes/dresses
|
||||
name = "Womens formal dress locker"
|
||||
containername = "Pretty dress locker"
|
||||
containertype = /obj/structure/closet
|
||||
name = "Formalwear (Dresses)"
|
||||
containername = "Formal dress crate"
|
||||
containertype = /obj/structure/closet/crate/gilthari
|
||||
cost = 15
|
||||
num_contained = 3
|
||||
contains = list(
|
||||
|
||||
@@ -11,30 +11,72 @@
|
||||
name = "Replacement lights"
|
||||
contains = list(/obj/item/weapon/storage/box/lights/mixed = 3)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/galaksi
|
||||
containername = "Replacement lights"
|
||||
|
||||
/datum/supply_pack/eng/smescoil
|
||||
name = "Superconducting Magnetic Coil"
|
||||
contains = list(/obj/item/weapon/smes_coil)
|
||||
cost = 75
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "Superconducting Magnetic Coil crate"
|
||||
|
||||
/datum/supply_pack/eng/smescoil/super_capacity
|
||||
name = "Superconducting Capacitance Coil"
|
||||
contains = list(/obj/item/weapon/smes_coil/super_capacity)
|
||||
cost = 90
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "Superconducting Capacitance Coil crate"
|
||||
|
||||
/datum/supply_pack/eng/smescoil/super_io
|
||||
name = "Superconducting Transmission Coil"
|
||||
contains = list(/obj/item/weapon/smes_coil/super_io)
|
||||
cost = 90
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "Superconducting Transmission Coil crate"
|
||||
|
||||
/datum/supply_pack/eng/shield_capacitor
|
||||
name = "Shield Capacitor"
|
||||
contains = list(/obj/machinery/shield_capacitor)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "shield capacitor crate"
|
||||
|
||||
/datum/supply_pack/eng/shield_capacitor/advanced
|
||||
name = "Advanced Shield Capacitor"
|
||||
contains = list(/obj/machinery/shield_capacitor/advanced)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "advanced shield capacitor crate"
|
||||
|
||||
/datum/supply_pack/eng/bubble_shield
|
||||
name = "Bubble Shield Generator"
|
||||
contains = list(/obj/machinery/shield_gen)
|
||||
cost = 40
|
||||
containertype =/obj/structure/closet/crate/focalpoint
|
||||
containername = "shield bubble generator crate"
|
||||
|
||||
/datum/supply_pack/eng/bubble_shield/advanced
|
||||
name = "Advanced Bubble Shield Generator"
|
||||
contains = list(/obj/machinery/shield_gen/advanced)
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "advanced bubble shield generator crate"
|
||||
|
||||
/datum/supply_pack/eng/hull_shield
|
||||
name = "Hull Shield Generator"
|
||||
contains = list(/obj/machinery/shield_gen/external)
|
||||
cost = 80
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "shield hull generator crate"
|
||||
|
||||
/datum/supply_pack/eng/hull_shield/advanced
|
||||
name = "Advanced Hull Shield Generator"
|
||||
contains = list(/obj/machinery/shield_gen/external/advanced)
|
||||
cost = 120
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "advanced hull shield generator crate"
|
||||
|
||||
/datum/supply_pack/eng/electrical
|
||||
name = "Electrical maintenance crate"
|
||||
contains = list(
|
||||
@@ -44,7 +86,7 @@
|
||||
/obj/item/weapon/cell/high = 2
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/engineering/electrical
|
||||
containertype = /obj/structure/closet/crate/ward
|
||||
containername = "Electrical maintenance crate"
|
||||
|
||||
/datum/supply_pack/eng/e_welders
|
||||
@@ -53,7 +95,7 @@
|
||||
/obj/item/weapon/weldingtool/electric = 3
|
||||
)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/engineering/electrical
|
||||
containertype = /obj/structure/closet/crate/ward
|
||||
containername = "Electric welder crate"
|
||||
|
||||
/datum/supply_pack/eng/mechanical
|
||||
@@ -65,14 +107,14 @@
|
||||
/obj/item/clothing/head/hardhat
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/xion
|
||||
containername = "Mechanical maintenance crate"
|
||||
|
||||
/datum/supply_pack/eng/fueltank
|
||||
name = "Fuel tank crate"
|
||||
contains = list(/obj/structure/reagent_dispensers/fueltank)
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/nanotrasen
|
||||
containername = "fuel tank crate"
|
||||
|
||||
/datum/supply_pack/eng/solar
|
||||
@@ -84,35 +126,35 @@
|
||||
/obj/item/weapon/paper/solar
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/einstein
|
||||
containername = "Solar pack crate"
|
||||
|
||||
/datum/supply_pack/eng/engine
|
||||
name = "Emitter crate"
|
||||
contains = list(/obj/machinery/power/emitter = 2)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
containername = "Emitter crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/eng/engine/field_gen
|
||||
name = "Field Generator crate"
|
||||
contains = list(/obj/machinery/field_generator = 2)
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Field Generator crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/eng/engine/sing_gen
|
||||
name = "Singularity Generator crate"
|
||||
contains = list(/obj/machinery/the_singularitygen)
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
containername = "Singularity Generator crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/eng/engine/collector
|
||||
name = "Collector crate"
|
||||
contains = list(/obj/machinery/power/rad_collector = 3)
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
containername = "Collector crate"
|
||||
|
||||
/datum/supply_pack/eng/engine/PA
|
||||
@@ -127,23 +169,33 @@
|
||||
/obj/structure/particle_accelerator/power_box,
|
||||
/obj/structure/particle_accelerator/end_cap
|
||||
)
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
containername = "Particle Accelerator crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/eng/shield_generator
|
||||
name = "Shield Generator Construction Kit"
|
||||
contains = list(
|
||||
/obj/item/weapon/circuitboard/shield_generator,
|
||||
/obj/item/weapon/stock_parts/capacitor,
|
||||
/obj/item/weapon/stock_parts/micro_laser,
|
||||
/obj/item/weapon/smes_coil,
|
||||
/obj/item/weapon/stock_parts/console_screen,
|
||||
/obj/item/weapon/stock_parts/subspace/amplifier
|
||||
)
|
||||
cost = 80
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containername = "shield generator construction kit crate"
|
||||
/datum/supply_pack/eng/shield_gen
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_gen)
|
||||
name = "Bubble shield generator circuitry"
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/focalpoint
|
||||
containername = "bubble shield generator circuitry crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/eng/shield_gen_ex
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_gen_ex)
|
||||
name = "Hull shield generator circuitry"
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/focalpoint
|
||||
containername = "hull shield generator circuitry crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/eng/shield_cap
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_cap)
|
||||
name = "Bubble shield capacitor circuitry"
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/focalpoint
|
||||
containername = "shield capacitor circuitry crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/eng/smbig
|
||||
name = "Supermatter Core"
|
||||
@@ -157,7 +209,7 @@
|
||||
contains = list(/obj/machinery/power/generator)
|
||||
name = "Mark I Thermoelectric Generator"
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containertype = /obj/structure/closet/crate/secure/large/einstein
|
||||
containername = "Mk1 TEG crate"
|
||||
access = access_engine
|
||||
|
||||
@@ -165,7 +217,7 @@
|
||||
contains = list(/obj/machinery/atmospherics/binary/circulator)
|
||||
name = "Binary atmospheric circulator"
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containertype = /obj/structure/closet/crate/secure/large/einstein
|
||||
containername = "Atmospheric circulator crate"
|
||||
access = access_engine
|
||||
|
||||
@@ -183,7 +235,7 @@
|
||||
name = "P.A.C.M.A.N. portable generator parts"
|
||||
cost = 25
|
||||
containername = "P.A.C.M.A.N. Portable Generator Construction Kit"
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/focalpoint
|
||||
access = access_tech_storage
|
||||
contains = list(
|
||||
/obj/item/weapon/stock_parts/micro_laser,
|
||||
@@ -196,7 +248,7 @@
|
||||
name = "Super P.A.C.M.A.N. portable generator parts"
|
||||
cost = 35
|
||||
containername = "Super P.A.C.M.A.N. portable generator construction kit"
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/focalpoint
|
||||
access = access_tech_storage
|
||||
contains = list(
|
||||
/obj/item/weapon/stock_parts/micro_laser,
|
||||
@@ -209,7 +261,7 @@
|
||||
name = "R-UST Mk. 8 Tokamak fusion core crate"
|
||||
cost = 50
|
||||
containername = "R-UST Mk. 8 Tokamak Fusion Core crate"
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
access = access_engine
|
||||
contains = list(
|
||||
/obj/item/weapon/book/manual/rust_engine,
|
||||
@@ -221,7 +273,7 @@
|
||||
name = "R-UST Mk. 8 fuel injector crate"
|
||||
cost = 30
|
||||
containername = "R-UST Mk. 8 fuel injector crate"
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
access = access_engine
|
||||
contains = list(
|
||||
/obj/machinery/fusion_fuel_injector,
|
||||
@@ -233,7 +285,7 @@
|
||||
name = "Gyrotron crate"
|
||||
cost = 15
|
||||
containername = "Gyrotron Crate"
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
access = access_engine
|
||||
contains = list(
|
||||
/obj/machinery/power/emitter/gyrotron,
|
||||
@@ -244,12 +296,12 @@
|
||||
name = "Fusion Fuel Compressor circuitry crate"
|
||||
cost = 10
|
||||
containername = "Fusion Fuel Compressor circuitry crate"
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/einstein
|
||||
contains = list(/obj/item/weapon/circuitboard/fusion_fuel_compressor)
|
||||
|
||||
/datum/supply_pack/eng/tritium
|
||||
name = "Tritium crate"
|
||||
cost = 75
|
||||
containername = "Tritium crate"
|
||||
containertype = /obj/structure/closet/crate/engineering
|
||||
containertype = /obj/structure/closet/crate/einstein
|
||||
contains = list(/obj/fiftyspawner/tritium)
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
/datum/supply_pack/eng/modern_shield
|
||||
name = "Modern Shield Construction Kit"
|
||||
contains = list(
|
||||
/obj/item/weapon/circuitboard/shield_generator,
|
||||
/obj/item/weapon/stock_parts/capacitor,
|
||||
/obj/item/weapon/stock_parts/micro_laser,
|
||||
/obj/item/weapon/smes_coil,
|
||||
/obj/item/weapon/stock_parts/console_screen,
|
||||
/obj/item/weapon/stock_parts/subspace/amplifier
|
||||
)
|
||||
cost = 80
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "shield generator construction kit crate"
|
||||
|
||||
/datum/supply_pack/eng/thermoregulator
|
||||
contains = list(/obj/machinery/power/thermoregulator)
|
||||
name = "Thermal Regulator"
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 4,
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/gilthari
|
||||
containername = "Party equipment"
|
||||
|
||||
/datum/supply_pack/hospitality/barsupplies
|
||||
@@ -43,8 +43,15 @@
|
||||
/obj/item/weapon/storage/box/glass_extras/sticks
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/gilthari
|
||||
containername = "crate of bar supplies"
|
||||
|
||||
/datum/supply_pack/hospitality/cookingoil
|
||||
name = "Cooking oil tank crate"
|
||||
contains = list(/obj/structure/reagent_dispensers/cookingoil)
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "cooking oil tank crate"
|
||||
|
||||
/datum/supply_pack/randomised/hospitality/
|
||||
group = "Hospitality"
|
||||
@@ -60,7 +67,7 @@
|
||||
)
|
||||
name = "Surprise pack of five pizzas"
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containertype = /obj/structure/closet/crate/freezer/centauri
|
||||
containername = "Pizza crate"
|
||||
|
||||
/datum/supply_pack/hospitality/gifts
|
||||
@@ -74,5 +81,5 @@
|
||||
/obj/item/weapon/paper/card/flower
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/allico
|
||||
containername = "crate of gifts"
|
||||
@@ -11,7 +11,7 @@
|
||||
name = "Monkey crate"
|
||||
contains = list (/obj/item/weapon/storage/box/monkeycubes)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containertype = /obj/structure/closet/crate/freezer/nanotrasen
|
||||
containername = "Monkey crate"
|
||||
|
||||
/datum/supply_pack/hydro/farwa
|
||||
@@ -110,7 +110,7 @@
|
||||
/obj/item/seeds/sugarcaneseed
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containertype = /obj/structure/closet/crate/carp
|
||||
containername = "Seeds crate"
|
||||
access = access_hydroponics
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
/obj/item/weapon/material/twohanded/fireaxe/scythe
|
||||
)
|
||||
cost = 45
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Weed control crate"
|
||||
access = access_hydroponics
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
name = "Water tank crate"
|
||||
contains = list(/obj/structure/reagent_dispensers/watertank)
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/aether
|
||||
containername = "water tank crate"
|
||||
|
||||
/datum/supply_pack/hydro/bee_keeper
|
||||
@@ -144,14 +144,14 @@
|
||||
/obj/item/bee_pack
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containertype = /obj/structure/closet/crate/carp
|
||||
containername = "Beekeeping crate"
|
||||
access = access_hydroponics
|
||||
|
||||
/datum/supply_pack/hydro/tray
|
||||
name = "Empty hydroponics trays"
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containertype = /obj/structure/closet/crate/aether
|
||||
containername = "Hydroponics tray crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0} = 3)
|
||||
access = access_hydroponics
|
||||
|
||||
@@ -11,40 +11,40 @@
|
||||
name = "50 metal sheets"
|
||||
contains = list(/obj/fiftyspawner/steel)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Metal sheets crate"
|
||||
|
||||
/datum/supply_pack/materials/glass50
|
||||
name = "50 glass sheets"
|
||||
contains = list(/obj/fiftyspawner/glass)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Glass sheets crate"
|
||||
|
||||
/datum/supply_pack/materials/wood50
|
||||
name = "50 wooden planks"
|
||||
contains = list(/obj/fiftyspawner/wood)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Wooden planks crate"
|
||||
|
||||
/datum/supply_pack/materials/plastic50
|
||||
name = "50 plastic sheets"
|
||||
contains = list(/obj/fiftyspawner/plastic)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Plastic sheets crate"
|
||||
|
||||
/datum/supply_pack/materials/cardboard_sheets
|
||||
contains = list(/obj/fiftyspawner/cardboard)
|
||||
name = "50 cardboard sheets"
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Cardboard sheets crate"
|
||||
|
||||
/datum/supply_pack/materials/carpet
|
||||
name = "Imported carpet"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Imported carpet crate"
|
||||
cost = 15
|
||||
contains = list(
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
/datum/supply_pack/misc/linoleum
|
||||
name = "Linoleum"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
containername = "Linoleum crate"
|
||||
cost = 15
|
||||
contains = list(/obj/fiftyspawner/linoleum)
|
||||
@@ -22,28 +22,28 @@
|
||||
/obj/item/weapon/storage/box/autoinjectors
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containertype = /obj/structure/closet/crate/zenghu
|
||||
containername = "Medical crate"
|
||||
|
||||
/datum/supply_pack/med/bloodpack
|
||||
name = "BloodPack crate"
|
||||
contains = list(/obj/item/weapon/storage/box/bloodpacks = 3)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containertype = /obj/structure/closet/crate/nanocare
|
||||
containername = "BloodPack crate"
|
||||
|
||||
/datum/supply_pack/med/bodybag
|
||||
name = "Body bag crate"
|
||||
contains = list(/obj/item/weapon/storage/box/bodybags = 3)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containertype = /obj/structure/closet/crate/nanocare
|
||||
containername = "Body bag crate"
|
||||
|
||||
/datum/supply_pack/med/cryobag
|
||||
name = "Stasis bag crate"
|
||||
contains = list(/obj/item/bodybag/cryobag = 3)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containertype = /obj/structure/closet/crate/nanocare
|
||||
containername = "Stasis bag crate"
|
||||
|
||||
/datum/supply_pack/med/surgery
|
||||
@@ -62,7 +62,7 @@
|
||||
/obj/item/weapon/surgical/circular_saw
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/veymed
|
||||
containername = "Surgery crate"
|
||||
access = access_medical
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/item/weapon/storage/box/cdeathalarm_kit
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/ward
|
||||
containername = "Death Alarm crate"
|
||||
access = access_medical
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
)
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/zenghu
|
||||
containername = "Clotting Medicine crate"
|
||||
access = access_medical
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
/obj/item/weapon/storage/belt/medical = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/veymed
|
||||
containername = "Sterile equipment crate"
|
||||
|
||||
/datum/supply_pack/med/extragear
|
||||
@@ -109,7 +109,7 @@
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Medical surplus equipment"
|
||||
access = access_medical
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Chief medical officer equipment"
|
||||
access = access_cmo
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Medical Doctor equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Chemist equipment"
|
||||
access = access_chemistry
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
/obj/item/clothing/accessory/storage/white_vest
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Paramedic equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
/obj/item/weapon/cartridge/medical
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Psychiatrist equipment"
|
||||
access = access_psychiatrist
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Medical scrubs crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -264,7 +264,7 @@
|
||||
/obj/item/weapon/pen
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/veymed
|
||||
containername = "Autopsy equipment crate"
|
||||
access = access_morgue
|
||||
|
||||
@@ -291,7 +291,7 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Medical uniform crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -309,7 +309,7 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Medical biohazard equipment"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -317,7 +317,7 @@
|
||||
name = "Portable freezers crate"
|
||||
contains = list(/obj/item/weapon/storage/box/freezer = 7)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/veymed
|
||||
containername = "Portable freezers"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -325,7 +325,7 @@
|
||||
name = "Virus sample crate"
|
||||
contains = list(/obj/item/weapon/virusdish/random = 4)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/zenghu
|
||||
containername = "Virus sample crate"
|
||||
access = access_cmo
|
||||
|
||||
@@ -333,40 +333,40 @@
|
||||
name = "Defibrillator crate"
|
||||
contains = list(/obj/item/device/defib_kit = 2)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containertype = /obj/structure/closet/crate/veymed
|
||||
containername = "Defibrillator crate"
|
||||
|
||||
/datum/supply_pack/med/distillery
|
||||
name = "Chemical distiller crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery = 1)
|
||||
cost = 50
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/nanotrasen
|
||||
containername = "Chemical distiller crate"
|
||||
|
||||
/datum/supply_pack/med/advdistillery
|
||||
name = "Industrial Chemical distiller crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial = 1)
|
||||
cost = 150
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/xion
|
||||
containername = "Industrial Chemical distiller crate"
|
||||
|
||||
/datum/supply_pack/med/oxypump
|
||||
name = "Oxygen pump crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile = 1)
|
||||
cost = 125
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/xion
|
||||
containername = "Oxygen pump crate"
|
||||
|
||||
/datum/supply_pack/med/anestheticpump
|
||||
name = "Anesthetic pump crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile/anesthetic = 1)
|
||||
cost = 130
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/nanotrasen
|
||||
containername = "Anesthetic pump crate"
|
||||
|
||||
/datum/supply_pack/med/stablepump
|
||||
name = "Portable stabilizer crate"
|
||||
contains = list(/obj/machinery/oxygen_pump/mobile/stabilizer = 1)
|
||||
cost = 175
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/nanotrasen
|
||||
containername = "Portable stabilizer crate"
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
)
|
||||
name = "Trading Card Crate"
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/oculum
|
||||
containername = "cards crate"
|
||||
|
||||
/datum/supply_pack/randomised/misc/dnd
|
||||
@@ -36,7 +36,7 @@
|
||||
)
|
||||
name = "Miniatures Crate"
|
||||
cost = 200
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/oculum
|
||||
containername = "Miniature Crate"
|
||||
|
||||
/datum/supply_pack/randomised/misc/plushies
|
||||
@@ -88,14 +88,14 @@
|
||||
//VOREStation Add End
|
||||
name = "Plushies Crate"
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/allico
|
||||
containername = "Plushies Crate"
|
||||
|
||||
/datum/supply_pack/misc/eftpos
|
||||
contains = list(/obj/item/device/eftpos)
|
||||
name = "EFTPOS scanner"
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/nanotrasen
|
||||
containername = "EFTPOS crate"
|
||||
|
||||
/datum/supply_pack/misc/chaplaingear
|
||||
@@ -113,7 +113,7 @@
|
||||
/obj/item/weapon/storage/fancy/candle_box = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/gilthari
|
||||
containername = "Chaplain equipment crate"
|
||||
|
||||
/datum/supply_pack/misc/hoverpod
|
||||
@@ -136,14 +136,14 @@
|
||||
/obj/item/clothing/accessory/storage/webbing
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/nanothreads
|
||||
containername = "Webbing crate"
|
||||
|
||||
/datum/supply_pack/misc/holoplant
|
||||
name = "Holoplant Pot"
|
||||
contains = list(/obj/machinery/holoplant/shipped)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/thinktronic
|
||||
containername = "Holoplant crate"
|
||||
|
||||
/datum/supply_pack/misc/glucose_hypos
|
||||
@@ -152,7 +152,7 @@
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/zenghu
|
||||
containername = "Glucose Hypo Crate"
|
||||
|
||||
/datum/supply_pack/misc/mre_rations
|
||||
@@ -169,7 +169,7 @@
|
||||
/obj/item/weapon/storage/mre/menu9,
|
||||
/obj/item/weapon/storage/mre/menu10)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containertype = /obj/structure/closet/crate/centauri
|
||||
containername = "ready to eat rations"
|
||||
|
||||
/datum/supply_pack/misc/paste_rations
|
||||
@@ -178,7 +178,7 @@
|
||||
/obj/item/weapon/storage/mre/menu11 = 2
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containertype = /obj/structure/closet/crate/freezer/centauri
|
||||
containername = "emergency rations"
|
||||
|
||||
/datum/supply_pack/misc/medical_rations
|
||||
@@ -187,5 +187,5 @@
|
||||
/obj/item/weapon/storage/mre/menu13 = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containertype = /obj/structure/closet/crate/zenghu
|
||||
containername = "emergency rations"
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
/obj/item/weapon/material/twohanded/fireaxe/foam = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/allico
|
||||
containername = "foam weapon crate"
|
||||
|
||||
/datum/supply_pack/recreation/lasertag
|
||||
@@ -31,8 +31,8 @@
|
||||
/obj/item/weapon/gun/energy/lasertag/blue,
|
||||
/obj/item/clothing/suit/bluetag
|
||||
)
|
||||
containertype = /obj/structure/closet
|
||||
containername = "Lasertag Closet"
|
||||
containertype = /obj/structure/closet/crate/ward
|
||||
containername = "Lasertag Supplies"
|
||||
cost = 10
|
||||
|
||||
/datum/supply_pack/recreation/artscrafts
|
||||
@@ -55,14 +55,14 @@
|
||||
/obj/item/weapon/wrapping_paper = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/allico
|
||||
containername = "Arts and Crafts crate"
|
||||
|
||||
/datum/supply_pack/recreation/painters
|
||||
name = "Station Painting Supplies"
|
||||
cost = 10
|
||||
containername = "station painting supplies crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/grayson
|
||||
contains = list(
|
||||
/obj/item/device/pipe_painter = 2,
|
||||
/obj/item/device/floor_painter = 2,
|
||||
@@ -82,7 +82,7 @@
|
||||
name = "Deluxe Fishing Bait"
|
||||
cost = 40
|
||||
containername = "deluxe bait crate"
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containertype = /obj/structure/closet/crate/carp
|
||||
num_contained = 8
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/wormcan,
|
||||
@@ -93,7 +93,7 @@
|
||||
name = "Laser Tag Turrets"
|
||||
cost = 40
|
||||
containername = "laser tag turret crate"
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/ward
|
||||
contains = list(
|
||||
/obj/machinery/porta_turret/lasertag/blue,
|
||||
/obj/machinery/porta_turret/lasertag/red
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
/obj/item/weapon/cell/high = 2
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Robotics assembly"
|
||||
access = access_robotics
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
name = "Morpheus robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/morpheus)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/morpheus
|
||||
containername = "Robolimb blueprints (Morpheus)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
name = "Cyber Solutions robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/cybersolutions)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/cybersolutions
|
||||
containername = "Robolimb blueprints (Cyber Solutions)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
name = "Xion robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/xion)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Robolimb blueprints (Xion)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
name = "Grayson robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/grayson)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/grayson
|
||||
containername = "Robolimb blueprints (Grayson)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
name = "Hephaestus robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/hephaestus)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Robolimb blueprints (Hephaestus)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
name = "Ward-Takahashi robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/wardtakahashi)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/ward
|
||||
containername = "Robolimb blueprints (Ward-Takahashi)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
name = "Zeng Hu robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/zenghu)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/zenghu
|
||||
containername = "Robolimb blueprints (Zeng Hu)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
name = "Bishop robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/bishop)
|
||||
cost = 70
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/bishop
|
||||
containername = "Robolimb blueprints (Bishop)"
|
||||
access = access_robotics
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
/obj/item/weapon/circuitboard/mecha/ripley/peripherals
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "APLU \"Ripley\" Circuit Crate"
|
||||
access = access_robotics
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
/obj/item/weapon/circuitboard/mecha/odysseus/main
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/veymed
|
||||
containername = "\"Odysseus\" Circuit Crate"
|
||||
access = access_robotics
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
)
|
||||
name = "Random APLU modkit"
|
||||
cost = 200
|
||||
containertype = /obj/structure/closet/crate/science
|
||||
containertype = /obj/structure/closet/crate/xion
|
||||
containername = "heavy crate"
|
||||
|
||||
/datum/supply_pack/randomised/robotics/exosuit_mod/durand
|
||||
@@ -168,6 +168,7 @@
|
||||
/obj/item/device/kit/paint/durand/phazon
|
||||
)
|
||||
name = "Random Durand exosuit modkit"
|
||||
containertype = /obj/structure/closet/crate/heph
|
||||
|
||||
/datum/supply_pack/randomised/robotics/exosuit_mod/gygax
|
||||
contains = list(
|
||||
@@ -176,6 +177,7 @@
|
||||
/obj/item/device/kit/paint/gygax/recitence
|
||||
)
|
||||
name = "Random Gygax exosuit modkit"
|
||||
containertype = /obj/structure/closet/crate/heph
|
||||
|
||||
/datum/supply_pack/robotics/jumper_cables
|
||||
name = "Jumper kit crate"
|
||||
@@ -183,7 +185,7 @@
|
||||
/obj/item/device/defib_kit/jumper_kit = 2
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/einstein
|
||||
containername = "Jumper kit crate"
|
||||
access = access_robotics
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
name = "Coolant tank crate"
|
||||
contains = list(/obj/structure/reagent_dispensers/coolanttank)
|
||||
cost = 15
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/aether
|
||||
containername = "coolant tank crate"
|
||||
|
||||
/datum/supply_pack/sci/phoron
|
||||
@@ -39,7 +39,7 @@
|
||||
/obj/item/seeds/kudzuseed
|
||||
)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containertype = /obj/structure/closet/crate/carp
|
||||
containername = "Exotic Seeds crate"
|
||||
access = access_hydroponics
|
||||
|
||||
@@ -47,14 +47,14 @@
|
||||
name = "Integrated circuit printer"
|
||||
contains = list(/obj/item/device/integrated_circuit_printer = 2)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/ward
|
||||
containername = "Integrated circuit crate"
|
||||
|
||||
/datum/supply_pack/sci/integrated_circuit_printer_upgrade
|
||||
name = "Integrated circuit printer upgrade - advanced designs"
|
||||
contains = list(/obj/item/weapon/disk/integrated_circuit/upgrade/advanced)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/ward
|
||||
containername = "Integrated circuit crate"
|
||||
|
||||
/datum/supply_pack/sci/xenoarch
|
||||
@@ -75,6 +75,6 @@
|
||||
/obj/item/weapon/storage/bag/fossils,
|
||||
/obj/item/weapon/hand_labeler)
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Xenoarchaeology Tech crate"
|
||||
access = access_research
|
||||
@@ -53,11 +53,11 @@
|
||||
/obj/item/clothing/accessory/storage/pouches/blue,
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Plate Carrier crate"
|
||||
|
||||
/datum/supply_pack/security/carriersgreen
|
||||
name = "Armor - Blue modular armor"
|
||||
name = "Armor - Green modular armor"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/armor/pcarrier/green,
|
||||
/obj/item/clothing/accessory/armor/armguards/green,
|
||||
@@ -65,7 +65,7 @@
|
||||
/obj/item/clothing/accessory/storage/pouches/green,
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Plate Carrier crate"
|
||||
|
||||
/datum/supply_pack/security/carriersnavy
|
||||
@@ -77,7 +77,7 @@
|
||||
/obj/item/clothing/accessory/storage/pouches/navy,
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Plate Carrier crate"
|
||||
|
||||
/datum/supply_pack/security/carrierstan
|
||||
@@ -89,7 +89,7 @@
|
||||
/obj/item/clothing/accessory/storage/pouches/tan,
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Plate Carrier crate"
|
||||
|
||||
/datum/supply_pack/security/armorplate
|
||||
@@ -98,7 +98,7 @@
|
||||
/obj/item/clothing/accessory/armor/armorplate,
|
||||
)
|
||||
cost = 5
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/security/armorplatestab
|
||||
@@ -107,7 +107,7 @@
|
||||
/obj/item/clothing/accessory/armor/armorplate/stab,
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/security/armorplatemedium
|
||||
@@ -116,7 +116,7 @@
|
||||
/obj/item/clothing/accessory/armor/armorplate/medium,
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/security/armorplatetac
|
||||
@@ -125,7 +125,7 @@
|
||||
/obj/item/clothing/accessory/armor/armorplate/tactical,
|
||||
)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/randomised/security/carriers
|
||||
@@ -140,7 +140,7 @@
|
||||
/obj/item/clothing/suit/armor/pcarrier/press
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/scg
|
||||
containername = "Plate Carrier crate"
|
||||
|
||||
/datum/supply_pack/security/carriertags
|
||||
@@ -158,7 +158,7 @@
|
||||
/obj/item/clothing/accessory/armor/tag/abneg
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/scg
|
||||
containername = "Plate Carrier crate"
|
||||
|
||||
/datum/supply_pack/security/helmcovers
|
||||
@@ -174,7 +174,7 @@
|
||||
/obj/item/clothing/accessory/armor/helmcover/tan
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/scg
|
||||
containername = "Helmet Covers crate"
|
||||
|
||||
/datum/supply_pack/randomised/security/armorplates
|
||||
@@ -193,7 +193,7 @@
|
||||
/obj/item/clothing/accessory/armor/armorplate/bulletproof
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/scg
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/randomised/security/carrierarms
|
||||
@@ -210,7 +210,7 @@
|
||||
/obj/item/clothing/accessory/armor/armguards/bulletproof
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/scg
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/randomised/security/carrierlegs
|
||||
@@ -227,7 +227,7 @@
|
||||
/obj/item/clothing/accessory/armor/legguards/bulletproof
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/scg
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/randomised/security/carrierbags
|
||||
@@ -246,7 +246,7 @@
|
||||
/obj/item/clothing/accessory/storage/pouches/large/tan
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/scg
|
||||
containername = "Armor plate crate"
|
||||
|
||||
/datum/supply_pack/security/riot_gear
|
||||
@@ -260,7 +260,7 @@
|
||||
/obj/item/weapon/storage/box/handcuffs
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Riot gear crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
/obj/item/clothing/shoes/leg_guard/riot
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Riot armor crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -287,7 +287,7 @@
|
||||
/obj/item/clothing/accessory/armor/legguards/riot
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Riot armor crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -300,7 +300,7 @@
|
||||
/obj/item/clothing/shoes/leg_guard/laserproof
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Ablative armor crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -314,7 +314,7 @@
|
||||
/obj/item/clothing/accessory/armor/legguards/laserproof
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
containername = "Ablative armor crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -327,7 +327,7 @@
|
||||
/obj/item/clothing/shoes/leg_guard/bulletproof
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Ballistic armor crate"
|
||||
access = access_armory
|
||||
/* VOREStation Removal - Howabout no ERT armor being orderable?
|
||||
@@ -342,7 +342,7 @@
|
||||
/obj/item/clothing/accessory/armor/legguards/bulletproof
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Ballistic armor crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -355,13 +355,13 @@
|
||||
/obj/item/clothing/shoes/leg_guard/combat
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/saare
|
||||
containername = "Combat armor crate"
|
||||
access = access_armory
|
||||
|
||||
/datum/supply_pack/security/tactical
|
||||
name = "Armor - Tactical"
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/saare
|
||||
containername = "Tactical armor crate"
|
||||
cost = 40
|
||||
access = access_armory
|
||||
@@ -387,7 +387,7 @@
|
||||
|
||||
/datum/supply_pack/security/flexitac
|
||||
name = "Armor - Tactical Light"
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containertype = /obj/structure/closet/crate/secure/saare
|
||||
containername = "Tactical Light armor crate"
|
||||
cost = 75
|
||||
access = access_armory
|
||||
@@ -412,15 +412,14 @@
|
||||
name = "Misc - Security Barriers"
|
||||
contains = list(/obj/machinery/deployable/barrier = 4)
|
||||
cost = 20
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/secure/heph
|
||||
containername = "Security barrier crate"
|
||||
access = null
|
||||
|
||||
/datum/supply_pack/security/securityshieldgen
|
||||
name = "Misc - Wall shield generators"
|
||||
contains = list(/obj/machinery/shieldwallgen = 4)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Wall shield generators crate"
|
||||
access = access_teleporter
|
||||
|
||||
@@ -434,7 +433,7 @@
|
||||
/obj/item/clothing/accessory/holster/hip
|
||||
)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/hedberg
|
||||
containername = "Holster crate"
|
||||
|
||||
/datum/supply_pack/security/extragear
|
||||
@@ -446,7 +445,7 @@
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/security = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/nanothreads
|
||||
containername = "Security surplus equipment"
|
||||
|
||||
/datum/supply_pack/security/detectivegear
|
||||
@@ -473,7 +472,7 @@
|
||||
/obj/item/weapon/storage/bag/detective
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Forensic equipment"
|
||||
access = access_forensics_lockers
|
||||
|
||||
@@ -486,7 +485,7 @@
|
||||
/obj/item/device/detective_scanner
|
||||
)
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/ward
|
||||
containername = "Forensic equipment"
|
||||
access = access_forensics_lockers
|
||||
|
||||
@@ -508,7 +507,7 @@
|
||||
/obj/item/clothing/gloves/black = 2
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Investigation clothing"
|
||||
access = access_forensics_lockers
|
||||
|
||||
@@ -538,7 +537,7 @@
|
||||
/obj/item/device/flashlight/maglight
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Officer equipment"
|
||||
access = access_brig
|
||||
|
||||
@@ -567,7 +566,7 @@
|
||||
/obj/item/device/flashlight/maglight
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Warden equipment"
|
||||
access = access_armory
|
||||
|
||||
@@ -594,7 +593,7 @@
|
||||
/obj/item/device/flashlight/maglight
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Head of security equipment"
|
||||
access = access_hos
|
||||
|
||||
@@ -613,7 +612,7 @@
|
||||
/obj/item/weapon/storage/box/holobadge
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Security uniform crate"
|
||||
|
||||
/datum/supply_pack/security/navybluesecurityclothing
|
||||
@@ -634,7 +633,7 @@
|
||||
/obj/item/weapon/storage/box/holobadge
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Navy blue security uniform crate"
|
||||
|
||||
/datum/supply_pack/security/corporatesecurityclothing
|
||||
@@ -654,7 +653,7 @@
|
||||
/obj/item/weapon/storage/box/holobadge
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Corporate security uniform crate"
|
||||
|
||||
/datum/supply_pack/security/biosuit
|
||||
@@ -670,7 +669,7 @@
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Security biohazard gear"
|
||||
access = access_security
|
||||
|
||||
@@ -680,6 +679,6 @@
|
||||
/obj/item/weapon/contraband/poster/nanotrasen = 6
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanotrasen
|
||||
containername = "Morale Posters"
|
||||
access = access_maint_tunnels
|
||||
|
||||
@@ -18,14 +18,14 @@
|
||||
/obj/item/weapon/reagent_containers/food/condiment/yeast = 3
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containertype = /obj/structure/closet/crate/freezer/centauri
|
||||
containername = "Food crate"
|
||||
|
||||
/datum/supply_pack/supply/toner
|
||||
name = "Toner cartridges"
|
||||
contains = list(/obj/item/device/toner = 6)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/ummarcar
|
||||
containername = "Toner cartridges"
|
||||
|
||||
/datum/supply_pack/supply/janitor
|
||||
@@ -48,7 +48,7 @@
|
||||
/obj/structure/mopbucket
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/galaksi
|
||||
containername = "Janitorial supplies"
|
||||
|
||||
/datum/supply_pack/supply/shipping
|
||||
@@ -62,7 +62,7 @@
|
||||
/obj/item/weapon/tool/wirecutters,
|
||||
/obj/item/weapon/tape_roll = 2)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/ummarcar
|
||||
containername = "Shipping supplies crate"
|
||||
|
||||
/datum/supply_pack/supply/bureaucracy
|
||||
@@ -82,13 +82,19 @@
|
||||
)
|
||||
name = "Office supplies"
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/ummarcar
|
||||
containername = "Office supplies crate"
|
||||
|
||||
/datum/supply_pack/supply/sticky_notes
|
||||
name = "Stationery - sticky notes (50)"
|
||||
contains = list(/obj/item/sticky_pad/random)
|
||||
cost = 10
|
||||
containername = "\improper Sticky notes crate"
|
||||
|
||||
/datum/supply_pack/supply/spare_pda
|
||||
name = "Spare PDAs"
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/thinktronic
|
||||
containername = "Spare PDA crate"
|
||||
contains = list(/obj/item/device/pda = 3)
|
||||
|
||||
@@ -112,7 +118,7 @@
|
||||
/obj/item/clothing/glasses/meson
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Shaft miner equipment"
|
||||
access = access_mining
|
||||
/* //VOREStation Edit - Pointless on Tether.
|
||||
@@ -127,12 +133,12 @@
|
||||
name = "Cargo Train Tug"
|
||||
contains = list(/obj/vehicle/train/engine)
|
||||
cost = 35
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/xion
|
||||
containername = "Cargo Train Tug Crate"
|
||||
|
||||
/datum/supply_pack/supply/cargotrailer
|
||||
name = "Cargo Train Trolley"
|
||||
contains = list(/obj/vehicle/train/trolley)
|
||||
cost = 15
|
||||
containertype = /obj/structure/largecrate
|
||||
containertype = /obj/structure/closet/crate/large/xion
|
||||
containername = "Cargo Train Trolley Crate"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2,
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/aether
|
||||
containername = "Atmospheric voidsuit crate"
|
||||
access = access_atmospherics
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2,
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/aether
|
||||
containername = "Heavy Duty Atmospheric voidsuit crate"
|
||||
access = access_atmospherics
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Engineering voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Engineering Construction voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 45
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Engineering Hazmat voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Reinforced Engineering voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/veymed
|
||||
containername = "Medical voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/veymed
|
||||
containername = "Medical EMT voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 45
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/nanocare
|
||||
containername = "Medical Biohazard voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/veymed
|
||||
containername = "Vey-Med Autoadaptive voidsuit (humanoid) crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Security voidsuit crate"
|
||||
|
||||
/datum/supply_pack/voidsuits/security/crowd
|
||||
@@ -181,7 +181,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Security Crowd Control voidsuit crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
containername = "Security EVA voidsuit crate"
|
||||
access = access_armory
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/xion
|
||||
containername = "Mining voidsuit crate"
|
||||
access = access_mining
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/grayson
|
||||
containername = "Frontier Mining voidsuit crate"
|
||||
access = access_mining
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
/obj/item/clothing/mask/gas/zaddat = 1
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate
|
||||
containertype = /obj/structure/closet/crate/nanotrasen
|
||||
containername = "Zaddat Shroud crate"
|
||||
access = access_mining
|
||||
|
||||
|
||||
@@ -1,61 +1,53 @@
|
||||
// Wires for airlocks
|
||||
|
||||
/datum/wires/airlock/secure
|
||||
random = 1
|
||||
randomize = 1
|
||||
wire_count = 14
|
||||
window_y = 680
|
||||
|
||||
/datum/wires/airlock
|
||||
holder_type = /obj/machinery/door/airlock
|
||||
wire_count = 12
|
||||
window_y = 570
|
||||
proper_name = "Airlock"
|
||||
|
||||
var/const/AIRLOCK_WIRE_IDSCAN = 1
|
||||
var/const/AIRLOCK_WIRE_MAIN_POWER1 = 2
|
||||
var/const/AIRLOCK_WIRE_MAIN_POWER2 = 4
|
||||
var/const/AIRLOCK_WIRE_DOOR_BOLTS = 8
|
||||
var/const/AIRLOCK_WIRE_BACKUP_POWER1 = 16
|
||||
var/const/AIRLOCK_WIRE_BACKUP_POWER2 = 32
|
||||
var/const/AIRLOCK_WIRE_OPEN_DOOR = 64
|
||||
var/const/AIRLOCK_WIRE_AI_CONTROL = 128
|
||||
var/const/AIRLOCK_WIRE_ELECTRIFY = 256
|
||||
var/const/AIRLOCK_WIRE_SAFETY = 512
|
||||
var/const/AIRLOCK_WIRE_SPEED = 1024
|
||||
var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
|
||||
/datum/wires/airlock/CanUse(var/mob/living/L)
|
||||
/datum/wires/airlock/interactable(mob/user)
|
||||
var/obj/machinery/door/airlock/A = holder
|
||||
if(!istype(L, /mob/living/silicon))
|
||||
if(!issilicon(user))
|
||||
if(A.isElectrified())
|
||||
if(A.shock(L, 100))
|
||||
return 0
|
||||
if(A.shock(user, 100))
|
||||
return FALSE
|
||||
if(A.p_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/airlock/GetInteractWindow()
|
||||
/datum/wires/airlock/New(atom/_holder)
|
||||
wires = list(
|
||||
WIRE_IDSCAN, WIRE_MAIN_POWER1, WIRE_MAIN_POWER2, WIRE_DOOR_BOLTS,
|
||||
WIRE_BACKUP_POWER1, WIRE_BACKUP_POWER2, WIRE_OPEN_DOOR, WIRE_AI_CONTROL,
|
||||
WIRE_ELECTRIFY, WIRE_SAFETY, WIRE_SPEED, WIRE_BOLT_LIGHT
|
||||
)
|
||||
return ..()
|
||||
|
||||
/datum/wires/airlock/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/door/airlock/A = holder
|
||||
var/haspower = A.arePowerSystemsOn() //If there's no power, then no lights will be on.
|
||||
|
||||
. += ..()
|
||||
. += show_hint(0x01, A.locked, "The door bolts have fallen!", "The door bolts look up.")
|
||||
. += show_hint(0x02, A.lights && haspower, "The door bolt lights are on.", "The door bolt lights are off!")
|
||||
. += show_hint(0x04, haspower, "The test light is on.", "The test light is off!")
|
||||
. += show_hint(0x08, A.backup_power_lost_until, "The backup power light is off!", "The backup power light is on.")
|
||||
. += show_hint(0x10, A.aiControlDisabled == 0 && !A.emagged && haspower, "The 'AI control allowed' light is on.", "The 'AI control allowed' light is off.")
|
||||
. += show_hint(0x20, A.safe == 0 && haspower, "The 'Check Wiring' light is on.", "The 'Check Wiring' light is off.")
|
||||
. += show_hint(0x40, A.normalspeed == 0 && haspower, "The 'Check Timing Mechanism' light is on.", "The 'Check Timing Mechanism' light is off.")
|
||||
. += show_hint(0x80, A.aiDisabledIdScanner == 0 && haspower, "The IDScan light is on.", "The IDScan light is off.")
|
||||
|
||||
/datum/wires/airlock/UpdateCut(var/index, var/mended)
|
||||
. += "The door bolts [A.locked ? "have fallen!" : "look up."]"
|
||||
. += "The door bolt lights are [(A.lights && haspower) ? "on." : "off!"]"
|
||||
. += "The test light is [haspower ? "on." : "off!"]"
|
||||
. += "The backup power light is [A.backup_power_lost_until ? "off!" : "on."]"
|
||||
. += "The 'AI control allowed' light is [(A.aiControlDisabled == 0 && !A.emagged && haspower) ? "on" : "off"]."
|
||||
. += "The 'Check Wiring' light is [(A.safe == 0 && haspower) ? "on" : "off"]."
|
||||
. += "The 'Check Timing Mechanism' light is [(A.normalspeed == 0 && haspower) ? "on" : "off"]."
|
||||
. += "The IDScan light is [(A.aiDisabledIdScanner == 0 && haspower) ? "on" : "off."]"
|
||||
|
||||
/datum/wires/airlock/on_cut(wire, mend)
|
||||
var/obj/machinery/door/airlock/A = holder
|
||||
switch(index)
|
||||
if(AIRLOCK_WIRE_IDSCAN)
|
||||
A.aiDisabledIdScanner = !mended
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2)
|
||||
|
||||
if(!mended)
|
||||
switch(wire)
|
||||
if(WIRE_IDSCAN)
|
||||
A.aiDisabledIdScanner = !mend
|
||||
if(WIRE_MAIN_POWER1, WIRE_MAIN_POWER2)
|
||||
if(!mend)
|
||||
//Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be crowbarred open, but bolts-raising will not work. Cutting these wires may electocute the user.
|
||||
A.loseMainPower()
|
||||
A.shock(usr, 50)
|
||||
@@ -63,9 +55,8 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
A.regainMainPower()
|
||||
A.shock(usr, 50)
|
||||
|
||||
if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
|
||||
if(!mended)
|
||||
if(WIRE_BACKUP_POWER1, WIRE_BACKUP_POWER2)
|
||||
if(!mend)
|
||||
//Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user.
|
||||
A.loseBackupPower()
|
||||
A.shock(usr, 50)
|
||||
@@ -73,16 +64,14 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
A.regainBackupPower()
|
||||
A.shock(usr, 50)
|
||||
|
||||
if(AIRLOCK_WIRE_DOOR_BOLTS)
|
||||
|
||||
if(!mended)
|
||||
if(WIRE_DOOR_BOLTS)
|
||||
if(!mend)
|
||||
//Cutting this wire also drops the door bolts, and mending it does not raise them. (This is what happens now, except there are a lot more wires going to door bolts at present)
|
||||
A.lock(1)
|
||||
A.update_icon()
|
||||
|
||||
if(AIRLOCK_WIRE_AI_CONTROL)
|
||||
|
||||
if(!mended)
|
||||
if(WIRE_AI_CONTROL)
|
||||
if(!mend)
|
||||
//one wire for AI control. Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all.
|
||||
//aiControlDisabled: If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
|
||||
if(A.aiControlDisabled == 0)
|
||||
@@ -95,40 +84,41 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
else if(A.aiControlDisabled == 2)
|
||||
A.aiControlDisabled = -1
|
||||
|
||||
if(AIRLOCK_WIRE_ELECTRIFY)
|
||||
if(!mended)
|
||||
if(WIRE_ELECTRIFY)
|
||||
if(!mend)
|
||||
//Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted.
|
||||
A.electrify(-1)
|
||||
else
|
||||
A.electrify(0)
|
||||
return // Don't update the dialog.
|
||||
|
||||
if (AIRLOCK_WIRE_SAFETY)
|
||||
A.safe = mended
|
||||
if (WIRE_SAFETY)
|
||||
A.safe = mend
|
||||
|
||||
if(AIRLOCK_WIRE_SPEED)
|
||||
A.autoclose = mended
|
||||
if(mended)
|
||||
if(WIRE_SPEED)
|
||||
A.autoclose = mend
|
||||
if(mend)
|
||||
if(!A.density)
|
||||
A.close()
|
||||
|
||||
if(AIRLOCK_WIRE_LIGHT)
|
||||
A.lights = mended
|
||||
if(WIRE_BOLT_LIGHT)
|
||||
A.lights = mend
|
||||
A.update_icon()
|
||||
|
||||
|
||||
/datum/wires/airlock/UpdatePulsed(var/index)
|
||||
|
||||
/datum/wires/airlock/on_pulse(wire)
|
||||
var/obj/machinery/door/airlock/A = holder
|
||||
switch(index)
|
||||
if(AIRLOCK_WIRE_IDSCAN)
|
||||
switch(wire)
|
||||
if(WIRE_IDSCAN)
|
||||
//Sending a pulse through flashes the red light on the door (if the door has power).
|
||||
if(A.arePowerSystemsOn() && A.density)
|
||||
A.do_animate("deny")
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2)
|
||||
|
||||
if(WIRE_MAIN_POWER1, WIRE_MAIN_POWER2)
|
||||
//Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter).
|
||||
A.loseMainPower()
|
||||
if(AIRLOCK_WIRE_DOOR_BOLTS)
|
||||
|
||||
if(WIRE_DOOR_BOLTS)
|
||||
//one wire for door bolts. Sending a pulse through this drops door bolts if they're not down (whether power's on or not),
|
||||
//raises them if they are down (only if power's on)
|
||||
if(!A.locked)
|
||||
@@ -136,10 +126,11 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
else
|
||||
A.unlock()
|
||||
|
||||
if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
if(WIRE_BACKUP_POWER1, WIRE_BACKUP_POWER2)
|
||||
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
|
||||
A.loseBackupPower()
|
||||
if(AIRLOCK_WIRE_AI_CONTROL)
|
||||
|
||||
if(WIRE_AI_CONTROL)
|
||||
if(A.aiControlDisabled == 0)
|
||||
A.aiControlDisabled = 1
|
||||
else if(A.aiControlDisabled == -1)
|
||||
@@ -152,24 +143,26 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
else if(A.aiControlDisabled == 2)
|
||||
A.aiControlDisabled = -1
|
||||
|
||||
if(AIRLOCK_WIRE_ELECTRIFY)
|
||||
if(WIRE_ELECTRIFY)
|
||||
//one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds.
|
||||
A.electrify(30)
|
||||
if(AIRLOCK_WIRE_OPEN_DOOR)
|
||||
|
||||
if(WIRE_OPEN_DOOR)
|
||||
//tries to open the door without ID
|
||||
//will succeed only if the ID wire is cut or the door requires no access and it's not emagged
|
||||
if(A.emagged) return
|
||||
if(!A.requiresID() || A.check_access(null))
|
||||
if(A.density) A.open()
|
||||
else A.close()
|
||||
if(AIRLOCK_WIRE_SAFETY)
|
||||
|
||||
if(WIRE_SAFETY)
|
||||
A.safe = !A.safe
|
||||
if(!A.density)
|
||||
A.close()
|
||||
|
||||
if(AIRLOCK_WIRE_SPEED)
|
||||
if(WIRE_SPEED)
|
||||
A.normalspeed = !A.normalspeed
|
||||
|
||||
if(AIRLOCK_WIRE_LIGHT)
|
||||
if(WIRE_BOLT_LIGHT)
|
||||
A.lights = !A.lights
|
||||
A.update_icon()
|
||||
|
||||
+49
-57
@@ -1,94 +1,86 @@
|
||||
/datum/wires/alarm
|
||||
holder_type = /obj/machinery/alarm
|
||||
wire_count = 5
|
||||
proper_name = "Air alarm"
|
||||
|
||||
var/const/AALARM_WIRE_IDSCAN = 1
|
||||
var/const/AALARM_WIRE_POWER = 2
|
||||
var/const/AALARM_WIRE_SYPHON = 4
|
||||
var/const/AALARM_WIRE_AI_CONTROL = 8
|
||||
var/const/AALARM_WIRE_AALARM = 16
|
||||
/datum/wires/alarm/New(atom/_holder)
|
||||
wires = list(
|
||||
WIRE_IDSCAN, WIRE_MAIN_POWER1, WIRE_SYPHON,
|
||||
WIRE_AI_CONTROL, WIRE_AALARM
|
||||
)
|
||||
return ..()
|
||||
|
||||
/datum/wires/alarm/CanUse(var/mob/living/L)
|
||||
/datum/wires/alarm/interactable(mob/user)
|
||||
var/obj/machinery/alarm/A = holder
|
||||
if(A.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/alarm/GetInteractWindow()
|
||||
/datum/wires/alarm/get_status()
|
||||
var/obj/machinery/alarm/A = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, A.locked, "The Air Alarm is locked.", "The Air Alarm is unlocked.")
|
||||
. += show_hint(0x2, A.shorted || (A.stat & (NOPOWER|BROKEN)), "The Air Alarm is offline.", "The Air Alarm is working properly!")
|
||||
. += show_hint(0x4, A.aidisabled, "The 'AI control allowed' light is off.", "The 'AI control allowed' light is on.")
|
||||
. = ..()
|
||||
. += "The Air Alarm is [A.locked ? "locked." : "unlocked."]"
|
||||
. += "The Air Alarm is [(A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "offline." : "working properly!"]"
|
||||
. += "The 'AI control allowed' light is [A.aidisabled ? "off" : "on"]."
|
||||
|
||||
/datum/wires/alarm/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/alarm/on_cut(wire, mend)
|
||||
var/obj/machinery/alarm/A = holder
|
||||
switch(index)
|
||||
if(AALARM_WIRE_IDSCAN)
|
||||
if(!mended)
|
||||
A.locked = 1
|
||||
//to_world("Idscan wire cut")
|
||||
switch(wire)
|
||||
if(WIRE_IDSCAN)
|
||||
if(!mend)
|
||||
A.locked = TRUE
|
||||
|
||||
if(AALARM_WIRE_POWER)
|
||||
if(WIRE_MAIN_POWER1)
|
||||
A.shock(usr, 50)
|
||||
A.shorted = !mended
|
||||
A.shorted = !mend
|
||||
A.update_icon()
|
||||
//to_world("Power wire cut")
|
||||
|
||||
if (AALARM_WIRE_AI_CONTROL)
|
||||
if (A.aidisabled == !mended)
|
||||
A.aidisabled = mended
|
||||
//to_world("AI Control Wire Cut")
|
||||
if(WIRE_AI_CONTROL)
|
||||
A.aidisabled = !mend
|
||||
|
||||
if(AALARM_WIRE_SYPHON)
|
||||
if(!mended)
|
||||
A.mode = 3 // AALARM_MODE_PANIC
|
||||
if(WIRE_SYPHON)
|
||||
if(!mend)
|
||||
A.mode = 3 // MODE_PANIC
|
||||
A.apply_mode()
|
||||
//to_world("Syphon Wire Cut")
|
||||
|
||||
if(AALARM_WIRE_AALARM)
|
||||
if (A.alarm_area.atmosalert(2, A))
|
||||
if(WIRE_AALARM)
|
||||
if(A.alarm_area.atmosalert(2, A))
|
||||
A.post_alert(2)
|
||||
A.update_icon()
|
||||
..()
|
||||
|
||||
/datum/wires/alarm/UpdatePulsed(var/index)
|
||||
/datum/wires/alarm/on_pulse(wire)
|
||||
var/obj/machinery/alarm/A = holder
|
||||
switch(index)
|
||||
if(AALARM_WIRE_IDSCAN)
|
||||
switch(wire)
|
||||
if(WIRE_IDSCAN)
|
||||
A.locked = !A.locked
|
||||
// to_world("Idscan wire pulsed")
|
||||
|
||||
if (AALARM_WIRE_POWER)
|
||||
// to_world("Power wire pulsed")
|
||||
if(A.shorted == 0)
|
||||
A.shorted = 1
|
||||
if(WIRE_MAIN_POWER1)
|
||||
if(!A.shorted)
|
||||
A.shorted = TRUE
|
||||
A.update_icon()
|
||||
|
||||
spawn(12000)
|
||||
if(A.shorted == 1)
|
||||
A.shorted = 0
|
||||
if(A.shorted)
|
||||
A.shorted = FALSE
|
||||
A.update_icon()
|
||||
|
||||
|
||||
if (AALARM_WIRE_AI_CONTROL)
|
||||
// to_world("AI Control wire pulsed")
|
||||
if (A.aidisabled == 0)
|
||||
A.aidisabled = 1
|
||||
if(WIRE_AI_CONTROL)
|
||||
if(!A.aidisabled)
|
||||
A.aidisabled = TRUE
|
||||
A.updateDialog()
|
||||
spawn(100)
|
||||
if (A.aidisabled == 1)
|
||||
A.aidisabled = 0
|
||||
if(A.aidisabled)
|
||||
A.aidisabled = FALSE
|
||||
|
||||
if(AALARM_WIRE_SYPHON)
|
||||
// to_world("Syphon wire pulsed")
|
||||
if(A.mode == 1) // AALARM_MODE_SCRUB
|
||||
A.mode = 3 // AALARM_MODE_PANIC
|
||||
if(WIRE_SYPHON)
|
||||
if(A.mode == 1) // MODE_SCRUB
|
||||
A.mode = 3 // MODE_PANIC
|
||||
else
|
||||
A.mode = 1 // AALARM_MODE_SCRUB
|
||||
A.mode = 1 // MODE_SCRUB
|
||||
A.apply_mode()
|
||||
|
||||
if(AALARM_WIRE_AALARM)
|
||||
// to_world("Aalarm wire pulsed")
|
||||
if (A.alarm_area.atmosalert(0, A))
|
||||
if(WIRE_AALARM)
|
||||
if(A.alarm_area.atmosalert(0, A))
|
||||
A.post_alert(0)
|
||||
A.update_icon()
|
||||
|
||||
+36
-46
@@ -1,76 +1,66 @@
|
||||
/datum/wires/apc
|
||||
holder_type = /obj/machinery/power/apc
|
||||
wire_count = 4
|
||||
proper_name = "APC"
|
||||
|
||||
#define APC_WIRE_IDSCAN 1
|
||||
#define APC_WIRE_MAIN_POWER1 2
|
||||
#define APC_WIRE_MAIN_POWER2 4
|
||||
#define APC_WIRE_AI_CONTROL 8
|
||||
/datum/wires/apc/New(atom/_holder)
|
||||
wires = list(WIRE_IDSCAN, WIRE_MAIN_POWER1, WIRE_MAIN_POWER2, WIRE_AI_CONTROL)
|
||||
return ..()
|
||||
|
||||
/datum/wires/apc/GetInteractWindow()
|
||||
/datum/wires/apc/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/power/apc/A = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, A.locked, "The APC is locked.", "The APC is unlocked.")
|
||||
. += show_hint(0x2, A.shorted, "The APCs power has been shorted.", "The APC is working properly!")
|
||||
. += show_hint(0x4, A.aidisabled, "The 'AI control allowed' light is off.", "The 'AI control allowed' light is on.")
|
||||
. += "The APC is [A.locked ? "" : "un"]locked."
|
||||
. += A.shorted ? "The APCs power has been shorted." : "The APC is working properly!"
|
||||
. += "The 'AI control allowed' light is [A.aidisabled ? "off" : "on"]."
|
||||
|
||||
|
||||
/datum/wires/apc/CanUse(var/mob/living/L)
|
||||
/datum/wires/apc/interactable(mob/user)
|
||||
var/obj/machinery/power/apc/A = holder
|
||||
if(A.wiresexposed)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/wires/apc/UpdatePulsed(var/index)
|
||||
|
||||
/datum/wires/apc/on_pulse(wire)
|
||||
var/obj/machinery/power/apc/A = holder
|
||||
|
||||
switch(index)
|
||||
|
||||
if(APC_WIRE_IDSCAN)
|
||||
A.locked = 0
|
||||
switch(wire)
|
||||
if(WIRE_IDSCAN)
|
||||
A.locked = FALSE
|
||||
|
||||
spawn(300)
|
||||
if(A)
|
||||
A.locked = 1
|
||||
A.locked = TRUE
|
||||
|
||||
if (APC_WIRE_MAIN_POWER1, APC_WIRE_MAIN_POWER2)
|
||||
if(A.shorted == 0)
|
||||
A.shorted = 1
|
||||
if(WIRE_MAIN_POWER1, WIRE_MAIN_POWER2)
|
||||
if(!A.shorted)
|
||||
A.shorted = TRUE
|
||||
|
||||
spawn(1200)
|
||||
if(A && !IsIndexCut(APC_WIRE_MAIN_POWER1) && !IsIndexCut(APC_WIRE_MAIN_POWER2))
|
||||
A.shorted = 0
|
||||
if(A && !is_cut(WIRE_MAIN_POWER1) && !is_cut(WIRE_MAIN_POWER2))
|
||||
A.shorted = FALSE
|
||||
|
||||
if (APC_WIRE_AI_CONTROL)
|
||||
if (A.aidisabled == 0)
|
||||
A.aidisabled = 1
|
||||
if(WIRE_AI_CONTROL)
|
||||
if(!A.aidisabled)
|
||||
A.aidisabled = TRUE
|
||||
|
||||
spawn(10)
|
||||
if(A && !IsIndexCut(APC_WIRE_AI_CONTROL))
|
||||
A.aidisabled = 0
|
||||
if(A && !is_cut(WIRE_AI_CONTROL))
|
||||
A.aidisabled = FALSE
|
||||
|
||||
/datum/wires/apc/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/apc/on_cut(wire, mend)
|
||||
var/obj/machinery/power/apc/A = holder
|
||||
|
||||
switch(index)
|
||||
if(APC_WIRE_MAIN_POWER1, APC_WIRE_MAIN_POWER2)
|
||||
|
||||
if(!mended)
|
||||
if(istype(usr, /mob/living))
|
||||
switch(wire)
|
||||
if(WIRE_MAIN_POWER1, WIRE_MAIN_POWER2)
|
||||
if(!mend)
|
||||
if(isliving(usr))
|
||||
A.shock(usr, 50)
|
||||
A.shorted = 1
|
||||
A.shorted = TRUE
|
||||
|
||||
else if(!IsIndexCut(APC_WIRE_MAIN_POWER1) && !IsIndexCut(APC_WIRE_MAIN_POWER2))
|
||||
A.shorted = 0
|
||||
if(istype(usr, /mob/living))
|
||||
else if(!is_cut(WIRE_MAIN_POWER1) && !is_cut(WIRE_MAIN_POWER2))
|
||||
A.shorted = FALSE
|
||||
if(isliving(usr))
|
||||
A.shock(usr, 50)
|
||||
|
||||
if(APC_WIRE_AI_CONTROL)
|
||||
|
||||
if(!mended)
|
||||
if (A.aidisabled == 0)
|
||||
A.aidisabled = 1
|
||||
else
|
||||
if (A.aidisabled == 1)
|
||||
A.aidisabled = 0
|
||||
if(WIRE_AI_CONTROL)
|
||||
A.aidisabled = !mend
|
||||
|
||||
@@ -1,61 +1,54 @@
|
||||
/datum/wires/autolathe
|
||||
|
||||
holder_type = /obj/machinery/autolathe
|
||||
wire_count = 6
|
||||
proper_name = "Autolathe"
|
||||
|
||||
var/const/AUTOLATHE_HACK_WIRE = 1
|
||||
var/const/AUTOLATHE_SHOCK_WIRE = 2
|
||||
var/const/AUTOLATHE_DISABLE_WIRE = 4
|
||||
/datum/wires/autolathe/New(atom/_holder)
|
||||
wires = list(WIRE_AUTOLATHE_HACK, WIRE_ELECTRIFY, WIRE_AUTOLATHE_DISABLE)
|
||||
return ..()
|
||||
|
||||
/datum/wires/autolathe/GetInteractWindow()
|
||||
/datum/wires/autolathe/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/autolathe/A = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, A.disabled, "The red light is off.", "The red light is on.")
|
||||
. += show_hint(0x2, A.shocked, "The green light is off.", "The green light is on.")
|
||||
. += show_hint(0x4, A.hacked, "The blue light is off.", "The blue light is on.")
|
||||
. += "The red light is [A.disabled ? "off" : "on"]."
|
||||
. += "The green light is [A.shocked ? "off" : "on"]."
|
||||
. += "The blue light is [A.hacked ? "off" : "on"]."
|
||||
|
||||
/datum/wires/autolathe/CanUse()
|
||||
/datum/wires/autolathe/interactable(mob/user)
|
||||
var/obj/machinery/autolathe/A = holder
|
||||
if(A.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/autolathe/proc/update_autolathe_ui(mob/living/user)
|
||||
if(CanUse(user))
|
||||
var/obj/machinery/autolathe/A = holder
|
||||
A.interact(user)
|
||||
|
||||
/datum/wires/autolathe/UpdateCut(index, mended)
|
||||
/datum/wires/autolathe/on_cut(wire, mend)
|
||||
var/obj/machinery/autolathe/A = holder
|
||||
switch(index)
|
||||
if(AUTOLATHE_HACK_WIRE)
|
||||
A.hacked = !mended
|
||||
if(AUTOLATHE_SHOCK_WIRE)
|
||||
A.shocked = !mended
|
||||
if(AUTOLATHE_DISABLE_WIRE)
|
||||
A.disabled = !mended
|
||||
update_autolathe_ui(usr)
|
||||
switch(wire)
|
||||
if(WIRE_AUTOLATHE_HACK)
|
||||
A.hacked = !mend
|
||||
if(WIRE_ELECTRIFY)
|
||||
A.shocked = !mend
|
||||
if(WIRE_AUTOLATHE_DISABLE)
|
||||
A.disabled = !mend
|
||||
..()
|
||||
|
||||
/datum/wires/autolathe/UpdatePulsed(index)
|
||||
if(IsIndexCut(index))
|
||||
/datum/wires/autolathe/on_pulse(wire)
|
||||
if(is_cut(wire))
|
||||
return
|
||||
var/obj/machinery/autolathe/A = holder
|
||||
switch(index)
|
||||
if(AUTOLATHE_HACK_WIRE)
|
||||
switch(wire)
|
||||
if(WIRE_AUTOLATHE_HACK)
|
||||
A.hacked = !A.hacked
|
||||
spawn(50)
|
||||
if(A && !IsIndexCut(index))
|
||||
if(A && !is_cut(wire))
|
||||
A.hacked = 0
|
||||
update_autolathe_ui(usr)
|
||||
if(AUTOLATHE_SHOCK_WIRE)
|
||||
if(WIRE_ELECTRIFY)
|
||||
A.shocked = !A.shocked
|
||||
spawn(50)
|
||||
if(A && !IsIndexCut(index))
|
||||
if(A && !is_cut(wire))
|
||||
A.shocked = 0
|
||||
if(AUTOLATHE_DISABLE_WIRE)
|
||||
if(WIRE_AUTOLATHE_DISABLE)
|
||||
A.disabled = !A.disabled
|
||||
spawn(50)
|
||||
if(A && !IsIndexCut(index))
|
||||
if(A && !is_cut(wire))
|
||||
A.disabled = 0
|
||||
update_autolathe_ui(usr)
|
||||
update_autolathe_ui(usr)
|
||||
..()
|
||||
+31
-37
@@ -1,70 +1,64 @@
|
||||
// Wires for cameras.
|
||||
|
||||
/datum/wires/camera
|
||||
random = 1
|
||||
randomize = TRUE
|
||||
holder_type = /obj/machinery/camera
|
||||
wire_count = 6
|
||||
proper_name = "Camera"
|
||||
|
||||
/datum/wires/camera/GetInteractWindow()
|
||||
/datum/wires/camera/New(atom/_holder)
|
||||
wires = list(WIRE_FOCUS, WIRE_MAIN_POWER1, WIRE_CAM_LIGHT, WIRE_CAM_ALARM)
|
||||
return ..()
|
||||
|
||||
/datum/wires/camera/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/camera/C = holder
|
||||
. += show_hint(0x1, C.view_range == initial(C.view_range), "The focus light is on.", "The focus light is off.")
|
||||
. += show_hint(0x2, C.can_use(), "The power link light is on.", "The power link light is off.")
|
||||
. += show_hint(0x4, C.light_disabled, "The camera light is off.", "The camera light is on.")
|
||||
. += show_hint(0x8, C.alarm_on, "The alarm light is on.", "The alarm light is off.")
|
||||
return .
|
||||
. += "The focus light is [(C.view_range == initial(C.view_range)) ? "on" : "off"]."
|
||||
. += "The power link light is [C.can_use() ? "on" : "off"]."
|
||||
. += "The camera light is [C.light_disabled ? "off" : "on"]."
|
||||
. += "The alarm light is [C.alarm_on ? "on" : "off"]."
|
||||
|
||||
/datum/wires/camera/CanUse(var/mob/living/L)
|
||||
/datum/wires/camera/interactable(mob/user)
|
||||
var/obj/machinery/camera/C = holder
|
||||
return C.panel_open
|
||||
|
||||
var/const/CAMERA_WIRE_FOCUS = 1
|
||||
var/const/CAMERA_WIRE_POWER = 2
|
||||
var/const/CAMERA_WIRE_LIGHT = 4
|
||||
var/const/CAMERA_WIRE_ALARM = 8
|
||||
var/const/CAMERA_WIRE_NOTHING1 = 16
|
||||
var/const/CAMERA_WIRE_NOTHING2 = 32
|
||||
|
||||
/datum/wires/camera/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/camera/on_cut(wire, mend)
|
||||
var/obj/machinery/camera/C = holder
|
||||
|
||||
switch(index)
|
||||
if(CAMERA_WIRE_FOCUS)
|
||||
var/range = (mended ? initial(C.view_range) : C.short_range)
|
||||
switch(wire)
|
||||
if(WIRE_FOCUS)
|
||||
var/range = (mend ? initial(C.view_range) : C.short_range)
|
||||
C.setViewRange(range)
|
||||
|
||||
if(CAMERA_WIRE_POWER)
|
||||
if(C.status && !mended || !C.status && mended)
|
||||
if(WIRE_MAIN_POWER1)
|
||||
if(C.status && !mend || !C.status && mend)
|
||||
C.deactivate(usr, 1)
|
||||
|
||||
if(CAMERA_WIRE_LIGHT)
|
||||
C.light_disabled = !mended
|
||||
if(WIRE_CAM_LIGHT)
|
||||
C.light_disabled = !mend
|
||||
|
||||
if(CAMERA_WIRE_ALARM)
|
||||
if(!mended)
|
||||
if(WIRE_CAM_ALARM)
|
||||
if(!mend)
|
||||
C.triggerCameraAlarm()
|
||||
else
|
||||
C.cancelCameraAlarm()
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/wires/camera/UpdatePulsed(var/index)
|
||||
/datum/wires/camera/on_pulse(wire)
|
||||
var/obj/machinery/camera/C = holder
|
||||
if(IsIndexCut(index))
|
||||
if(is_cut(wire))
|
||||
return
|
||||
switch(index)
|
||||
if(CAMERA_WIRE_FOCUS)
|
||||
switch(wire)
|
||||
if(WIRE_FOCUS)
|
||||
var/new_range = (C.view_range == initial(C.view_range) ? C.short_range : initial(C.view_range))
|
||||
C.setViewRange(new_range)
|
||||
|
||||
if(CAMERA_WIRE_LIGHT)
|
||||
if(WIRE_CAM_LIGHT)
|
||||
C.light_disabled = !C.light_disabled
|
||||
|
||||
if(CAMERA_WIRE_ALARM)
|
||||
if(WIRE_CAM_ALARM)
|
||||
C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/wires/camera/proc/CanDeconstruct()
|
||||
if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return is_all_cut()
|
||||
|
||||
@@ -1,30 +1,33 @@
|
||||
/datum/wires/explosive
|
||||
wire_count = 1
|
||||
proper_name = "Explosive wires"
|
||||
|
||||
var/const/WIRE_EXPLODE = 1
|
||||
/datum/wires/explosive/New(atom/_holder)
|
||||
wires = list(WIRE_EXPLODE)
|
||||
return ..()
|
||||
|
||||
/datum/wires/explosive/proc/explode()
|
||||
return
|
||||
|
||||
/datum/wires/explosive/UpdatePulsed(var/index)
|
||||
switch(index)
|
||||
/datum/wires/explosive/on_pulse(wire)
|
||||
switch(wire)
|
||||
if(WIRE_EXPLODE)
|
||||
explode()
|
||||
|
||||
/datum/wires/explosive/UpdateCut(var/index, var/mended)
|
||||
switch(index)
|
||||
/datum/wires/explosive/on_cut(wire, mend)
|
||||
switch(wire)
|
||||
if(WIRE_EXPLODE)
|
||||
if(!mended)
|
||||
if(!mend)
|
||||
explode()
|
||||
|
||||
/datum/wires/explosive/c4
|
||||
holder_type = /obj/item/weapon/plastique
|
||||
|
||||
/datum/wires/explosive/c4/CanUse(var/mob/living/L)
|
||||
/datum/wires/explosive/c4/interactable(mob/user)
|
||||
var/obj/item/weapon/plastique/P = holder
|
||||
if(P.open_panel)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/explosive/c4/explode()
|
||||
var/obj/item/weapon/plastique/P = holder
|
||||
|
||||
@@ -1,66 +1,64 @@
|
||||
/datum/wires/grid_checker
|
||||
holder_type = /obj/machinery/power/grid_checker
|
||||
wire_count = 8
|
||||
proper_name = "Grid Checker"
|
||||
|
||||
var/const/GRID_CHECKER_WIRE_REBOOT = 1 // This wire causes the grid-check to end, if pulsed.
|
||||
var/const/GRID_CHECKER_WIRE_LOCKOUT = 2 // If cut or pulsed, locks the user out for half a minute.
|
||||
var/const/GRID_CHECKER_WIRE_ALLOW_MANUAL_1 = 4 // Needs to be cut for REBOOT to be possible.
|
||||
var/const/GRID_CHECKER_WIRE_ALLOW_MANUAL_2 = 8 // Needs to be cut for REBOOT to be possible.
|
||||
var/const/GRID_CHECKER_WIRE_ALLOW_MANUAL_3 = 16 // Needs to be cut for REBOOT to be possible.
|
||||
var/const/GRID_CHECKER_WIRE_SHOCK = 32 // Shocks the user if not wearing gloves.
|
||||
var/const/GRID_CHECKER_WIRE_NOTHING_1 = 64 // Does nothing, but makes it a bit harder.
|
||||
var/const/GRID_CHECKER_WIRE_NOTHING_2 = 128 // Does nothing, but makes it a bit harder.
|
||||
/datum/wires/grid_checker/New(atom/_holder)
|
||||
wires = list(
|
||||
WIRE_REBOOT, WIRE_LOCKOUT, WIRE_ALLOW_MANUAL1,
|
||||
WIRE_ALLOW_MANUAL2, WIRE_ALLOW_MANUAL3, WIRE_ELECTRIFY
|
||||
)
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/wires/grid_checker/CanUse(var/mob/living/L)
|
||||
/datum/wires/grid_checker/interactable(mob/user)
|
||||
var/obj/machinery/power/grid_checker/G = holder
|
||||
if(G.opened)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/wires/grid_checker/GetInteractWindow()
|
||||
/datum/wires/grid_checker/get_status()
|
||||
var/obj/machinery/power/grid_checker/G = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, G.power_failing, "The green light is off.", "The green light is on.")
|
||||
. += show_hint(0x2, G.wire_locked_out, "The red light is on.", "The red light is off.")
|
||||
. += show_hint(0x4, G.wire_allow_manual_1 && G.wire_allow_manual_2 && G.wire_allow_manual_3, "The blue light is on.", "The blue light is off.")
|
||||
. = ..()
|
||||
. += "The green light is [G.power_failing ? "off." : "on."]"
|
||||
. += "The red light is [G.wire_locked_out ? "on." : "off."]"
|
||||
. += "The blue light is [(G.wire_allow_manual_1 && G.wire_allow_manual_2 && G.wire_allow_manual_3) ? "on." : "off."]"
|
||||
|
||||
|
||||
/datum/wires/grid_checker/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/grid_checker/on_cut(wire, mend)
|
||||
var/obj/machinery/power/grid_checker/G = holder
|
||||
switch(index)
|
||||
if(GRID_CHECKER_WIRE_LOCKOUT)
|
||||
G.wire_locked_out = !mended
|
||||
if(GRID_CHECKER_WIRE_ALLOW_MANUAL_1)
|
||||
G.wire_allow_manual_1 = !mended
|
||||
if(GRID_CHECKER_WIRE_ALLOW_MANUAL_2)
|
||||
G.wire_allow_manual_2 = !mended
|
||||
if(GRID_CHECKER_WIRE_ALLOW_MANUAL_3)
|
||||
G.wire_allow_manual_3 = !mended
|
||||
if(GRID_CHECKER_WIRE_SHOCK)
|
||||
switch(wire)
|
||||
if(WIRE_LOCKOUT)
|
||||
G.wire_locked_out = !mend
|
||||
if(WIRE_ALLOW_MANUAL1)
|
||||
G.wire_allow_manual_1 = !mend
|
||||
if(WIRE_ALLOW_MANUAL2)
|
||||
G.wire_allow_manual_2 = !mend
|
||||
if(WIRE_ALLOW_MANUAL3)
|
||||
G.wire_allow_manual_3 = !mend
|
||||
if(WIRE_ELECTRIFY)
|
||||
if(G.wire_locked_out)
|
||||
return
|
||||
G.shock(usr, 70)
|
||||
..()
|
||||
|
||||
|
||||
/datum/wires/grid_checker/UpdatePulsed(var/index)
|
||||
/datum/wires/grid_checker/on_pulse(wire)
|
||||
var/obj/machinery/power/grid_checker/G = holder
|
||||
switch(index)
|
||||
if(GRID_CHECKER_WIRE_REBOOT)
|
||||
switch(wire)
|
||||
if(WIRE_REBOOT)
|
||||
if(G.wire_locked_out)
|
||||
return
|
||||
|
||||
if(G.power_failing && G.wire_allow_manual_1 && G.wire_allow_manual_2 && G.wire_allow_manual_3)
|
||||
G.end_power_failure(TRUE)
|
||||
if(GRID_CHECKER_WIRE_LOCKOUT)
|
||||
|
||||
if(WIRE_LOCKOUT)
|
||||
if(G.wire_locked_out)
|
||||
return
|
||||
|
||||
G.wire_locked_out = TRUE
|
||||
spawn(30 SECONDS)
|
||||
G.wire_locked_out = FALSE
|
||||
if(GRID_CHECKER_WIRE_SHOCK)
|
||||
|
||||
if(WIRE_ELECTRIFY)
|
||||
if(G.wire_locked_out)
|
||||
return
|
||||
G.shock(usr, 70)
|
||||
G.shock(usr, 70)
|
||||
..()
|
||||
@@ -1,42 +1,39 @@
|
||||
/datum/wires/jukebox
|
||||
random = 1
|
||||
randomize = TRUE
|
||||
holder_type = /obj/machinery/media/jukebox
|
||||
wire_count = 11
|
||||
proper_name = "Jukebox"
|
||||
|
||||
var/const/WIRE_POWER = 1
|
||||
var/const/WIRE_HACK = 2
|
||||
var/const/WIRE_SPEEDUP = 4
|
||||
var/const/WIRE_SPEEDDOWN = 8
|
||||
var/const/WIRE_REVERSE = 16
|
||||
var/const/WIRE_NOTHING1 = 32
|
||||
var/const/WIRE_NOTHING2 = 64
|
||||
var/const/WIRE_START = 128
|
||||
var/const/WIRE_STOP = 256
|
||||
var/const/WIRE_PREV = 512
|
||||
var/const/WIRE_NEXT = 1024
|
||||
/datum/wires/jukebox/New(atom/_holder)
|
||||
wires = list(
|
||||
WIRE_MAIN_POWER1, WIRE_JUKEBOX_HACK,
|
||||
WIRE_SPEEDUP, WIRE_SPEEDDOWN, WIRE_REVERSE,
|
||||
WIRE_START, WIRE_STOP, WIRE_PREV, WIRE_NEXT
|
||||
)
|
||||
return ..()
|
||||
|
||||
/datum/wires/jukebox/CanUse(var/mob/living/L)
|
||||
/datum/wires/jukebox/interactable(mob/user)
|
||||
var/obj/machinery/media/jukebox/A = holder
|
||||
if(A.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
// Show the status of lights as a hint to the current state
|
||||
/datum/wires/jukebox/GetInteractWindow()
|
||||
/datum/wires/jukebox/get_status()
|
||||
var/obj/machinery/media/jukebox/A = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, A.stat & (BROKEN|NOPOWER), "The power light is off.", "The power light is on.")
|
||||
. += show_hint(0x2, A.hacked, "The parental guidance light is off.", "The parental guidance light is on.")
|
||||
. += show_hint(0x4, IsIndexCut(WIRE_REVERSE), "The data light is hauntingly dark.", "The data light is glowing softly.")
|
||||
. = ..()
|
||||
. += "The power light is [A.stat & (BROKEN|NOPOWER) ? "off." : "on."]"
|
||||
. += "The parental guidance light is [A.hacked ? "off." : "on."]"
|
||||
. += "The data light is [is_cut(WIRE_REVERSE) ? "hauntingly dark." : "glowing softly."]"
|
||||
|
||||
// Give a hint as to what each wire does
|
||||
/datum/wires/jukebox/UpdatePulsed(var/index)
|
||||
/datum/wires/jukebox/on_pulse(wire)
|
||||
var/obj/machinery/media/jukebox/A = holder
|
||||
switch(index)
|
||||
if(WIRE_POWER)
|
||||
switch(wire)
|
||||
if(WIRE_MAIN_POWER1)
|
||||
holder.visible_message("<span class='notice'>[bicon(holder)] The power light flickers.</span>")
|
||||
A.shock(usr, 90)
|
||||
if(WIRE_HACK)
|
||||
if(WIRE_JUKEBOX_HACK)
|
||||
holder.visible_message("<span class='notice'>[bicon(holder)] The parental guidance light flickers.</span>")
|
||||
if(WIRE_REVERSE)
|
||||
holder.visible_message("<span class='notice'>[bicon(holder)] The data light blinks ominously.</span>")
|
||||
@@ -55,24 +52,21 @@ var/const/WIRE_NEXT = 1024
|
||||
else
|
||||
A.shock(usr, 10) // The nothing wires give a chance to shock just for fun
|
||||
|
||||
/datum/wires/jukebox/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/jukebox/on_cut(wire, mend)
|
||||
var/obj/machinery/media/jukebox/A = holder
|
||||
|
||||
switch(index)
|
||||
if(WIRE_POWER)
|
||||
switch(wire)
|
||||
if(WIRE_MAIN_POWER1)
|
||||
// TODO - Actually make machine electrified or something.
|
||||
A.shock(usr, 90)
|
||||
|
||||
if(WIRE_HACK)
|
||||
if(mended)
|
||||
A.set_hacked(0)
|
||||
else
|
||||
A.set_hacked(1)
|
||||
if(WIRE_JUKEBOX_HACK)
|
||||
A.set_hacked(!mend)
|
||||
|
||||
if(WIRE_SPEEDUP, WIRE_SPEEDDOWN, WIRE_REVERSE)
|
||||
var/newfreq = IsIndexCut(WIRE_REVERSE) ? -1 : 1;
|
||||
if (IsIndexCut(WIRE_SPEEDUP))
|
||||
var/newfreq = is_cut(WIRE_REVERSE) ? -1 : 1;
|
||||
if(is_cut(WIRE_SPEEDUP))
|
||||
newfreq *= 2
|
||||
if (IsIndexCut(WIRE_SPEEDDOWN))
|
||||
if(is_cut(WIRE_SPEEDDOWN))
|
||||
newfreq *= 0.5
|
||||
A.freq = newfreq
|
||||
|
||||
+19
-36
@@ -1,32 +1,29 @@
|
||||
/datum/wires/mines
|
||||
wire_count = 6
|
||||
random = 1
|
||||
randomize = TRUE
|
||||
holder_type = /obj/effect/mine
|
||||
proper_name = "Explosive Wires"
|
||||
|
||||
#define WIRE_DETONATE 1
|
||||
#define WIRE_TIMED_DET 2
|
||||
#define WIRE_DISARM 4
|
||||
#define WIRE_DUMMY_1 8
|
||||
#define WIRE_DUMMY_2 16
|
||||
#define WIRE_BADDISARM 32
|
||||
/datum/wires/mines/New(atom/_holder)
|
||||
wires = list(WIRE_EXPLODE, WIRE_EXPLODE_DELAY, WIRE_DISARM, WIRE_BADDISARM)
|
||||
return ..()
|
||||
|
||||
/datum/wires/mines/GetInteractWindow()
|
||||
/datum/wires/mines/get_status()
|
||||
. = ..()
|
||||
. += "<br>\n["Warning: detonation may occur even with proper equipment."]"
|
||||
return .
|
||||
. += "\[Warning: detonation may occur even with proper equipment.]"
|
||||
|
||||
/datum/wires/mines/proc/explode()
|
||||
return
|
||||
|
||||
/datum/wires/mines/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/mines/on_cut(wire, mend)
|
||||
var/obj/effect/mine/C = holder
|
||||
|
||||
switch(index)
|
||||
if(WIRE_DETONATE)
|
||||
switch(wire)
|
||||
if(WIRE_EXPLODE)
|
||||
C.visible_message("[bicon(C)] *BEEE-*", "[bicon(C)] *BEEE-*")
|
||||
C.explode()
|
||||
|
||||
if(WIRE_TIMED_DET)
|
||||
if(WIRE_EXPLODE_DELAY)
|
||||
C.visible_message("[bicon(C)] *BEEE-*", "[bicon(C)] *BEEE-*")
|
||||
C.explode()
|
||||
|
||||
@@ -35,30 +32,22 @@
|
||||
new C.mineitemtype(get_turf(C))
|
||||
spawn(0)
|
||||
qdel(C)
|
||||
return
|
||||
|
||||
if(WIRE_DUMMY_1)
|
||||
return
|
||||
|
||||
|
||||
if(WIRE_DUMMY_2)
|
||||
return
|
||||
|
||||
if(WIRE_BADDISARM)
|
||||
C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*")
|
||||
spawn(20)
|
||||
C.explode()
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/wires/mines/UpdatePulsed(var/index)
|
||||
/datum/wires/mines/on_pulse(wire)
|
||||
var/obj/effect/mine/C = holder
|
||||
if(IsIndexCut(index))
|
||||
if(is_cut(wire))
|
||||
return
|
||||
switch(index)
|
||||
if(WIRE_DETONATE)
|
||||
switch(wire)
|
||||
if(WIRE_EXPLODE)
|
||||
C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
|
||||
|
||||
if(WIRE_TIMED_DET)
|
||||
if(WIRE_EXPLODE_DELAY)
|
||||
C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*")
|
||||
spawn(20)
|
||||
C.explode()
|
||||
@@ -66,16 +55,10 @@
|
||||
if(WIRE_DISARM)
|
||||
C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
|
||||
|
||||
if(WIRE_DUMMY_1)
|
||||
C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
|
||||
|
||||
if(WIRE_DUMMY_2)
|
||||
C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
|
||||
|
||||
if(WIRE_BADDISARM)
|
||||
C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/wires/mines/CanUse(var/mob/living/L)
|
||||
/datum/wires/mines/interactable(mob/user)
|
||||
var/obj/effect/mine/M = holder
|
||||
return M.panel_open
|
||||
|
||||
@@ -1,52 +1,48 @@
|
||||
/datum/wires/particle_acc/control_box
|
||||
wire_count = 5
|
||||
holder_type = /obj/machinery/particle_accelerator/control_box
|
||||
proper_name = "Particle accelerator control"
|
||||
|
||||
var/const/PARTICLE_TOGGLE_WIRE = 1 // Toggles whether the PA is on or not.
|
||||
var/const/PARTICLE_STRENGTH_WIRE = 2 // Determines the strength of the PA.
|
||||
var/const/PARTICLE_INTERFACE_WIRE = 4 // Determines the interface showing up.
|
||||
var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be.
|
||||
//var/const/PARTICLE_NOTHING_WIRE = 16 // Blank wire
|
||||
/datum/wires/particle_acc/control_box/New(atom/_holder)
|
||||
wires = list(WIRE_PARTICLE_POWER, WIRE_PARTICLE_STRENGTH, WIRE_PARTICLE_INTERFACE, WIRE_PARTICLE_POWER_LIMIT)
|
||||
return ..()
|
||||
|
||||
/datum/wires/particle_acc/control_box/CanUse(var/mob/living/L)
|
||||
/datum/wires/particle_acc/control_box/interactable(mob/user)
|
||||
var/obj/machinery/particle_accelerator/control_box/C = holder
|
||||
if(C.construction_state == 2)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/particle_acc/control_box/UpdatePulsed(var/index)
|
||||
/datum/wires/particle_acc/control_box/on_pulse(wire)
|
||||
var/obj/machinery/particle_accelerator/control_box/C = holder
|
||||
switch(index)
|
||||
|
||||
if(PARTICLE_TOGGLE_WIRE)
|
||||
switch(wire)
|
||||
if(WIRE_PARTICLE_POWER)
|
||||
C.toggle_power()
|
||||
|
||||
if(PARTICLE_STRENGTH_WIRE)
|
||||
if(WIRE_PARTICLE_STRENGTH)
|
||||
C.add_strength()
|
||||
|
||||
if(PARTICLE_INTERFACE_WIRE)
|
||||
if(WIRE_PARTICLE_INTERFACE)
|
||||
C.interface_control = !C.interface_control
|
||||
|
||||
if(PARTICLE_LIMIT_POWER_WIRE)
|
||||
if(WIRE_PARTICLE_POWER_LIMIT)
|
||||
C.visible_message("[bicon(C)]<b>[C]</b> makes a large whirring noise.")
|
||||
|
||||
/datum/wires/particle_acc/control_box/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/particle_acc/control_box/on_cut(wire, mend)
|
||||
var/obj/machinery/particle_accelerator/control_box/C = holder
|
||||
switch(index)
|
||||
|
||||
if(PARTICLE_TOGGLE_WIRE)
|
||||
if(C.active == !mended)
|
||||
switch(wire)
|
||||
if(WIRE_PARTICLE_POWER)
|
||||
if(C.active == !mend)
|
||||
C.toggle_power()
|
||||
|
||||
if(PARTICLE_STRENGTH_WIRE)
|
||||
|
||||
if(WIRE_PARTICLE_STRENGTH)
|
||||
for(var/i = 1; i < 3; i++)
|
||||
C.remove_strength()
|
||||
|
||||
if(PARTICLE_INTERFACE_WIRE)
|
||||
C.interface_control = mended
|
||||
if(WIRE_PARTICLE_INTERFACE)
|
||||
C.interface_control = mend
|
||||
|
||||
if(PARTICLE_LIMIT_POWER_WIRE)
|
||||
C.strength_upper_limit = (mended ? 2 : 3)
|
||||
if(WIRE_PARTICLE_POWER_LIMIT)
|
||||
C.strength_upper_limit = (mend ? 2 : 3)
|
||||
if(C.strength_upper_limit < C.strength)
|
||||
C.remove_strength()
|
||||
|
||||
+27
-26
@@ -1,41 +1,42 @@
|
||||
/datum/wires/radio
|
||||
holder_type = /obj/item/device/radio
|
||||
wire_count = 3
|
||||
proper_name = "Radio"
|
||||
|
||||
var/const/WIRE_SIGNAL = 1
|
||||
var/const/WIRE_RECEIVE = 2
|
||||
var/const/WIRE_TRANSMIT = 4
|
||||
/datum/wires/radio/New(atom/_holder)
|
||||
wires = list(WIRE_RADIO_SIGNAL, WIRE_RADIO_RECEIVER, WIRE_RADIO_TRANSMIT)
|
||||
return ..()
|
||||
|
||||
/datum/wires/radio/CanUse(var/mob/living/L)
|
||||
/datum/wires/radio/interactable(mob/user)
|
||||
var/obj/item/device/radio/R = holder
|
||||
if(R.b_stat)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/radio/UpdatePulsed(var/index)
|
||||
/datum/wires/radio/on_pulse(wire)
|
||||
var/obj/item/device/radio/R = holder
|
||||
switch(index)
|
||||
if(WIRE_SIGNAL)
|
||||
R.listening = !R.listening && !IsIndexCut(WIRE_RECEIVE)
|
||||
R.broadcasting = R.listening && !IsIndexCut(WIRE_TRANSMIT)
|
||||
switch(wire)
|
||||
if(WIRE_RADIO_SIGNAL)
|
||||
R.listening = !R.listening && !is_cut(WIRE_RADIO_RECEIVER)
|
||||
R.broadcasting = R.listening && !is_cut(WIRE_RADIO_TRANSMIT)
|
||||
|
||||
if(WIRE_RECEIVE)
|
||||
R.listening = !R.listening && !IsIndexCut(WIRE_SIGNAL)
|
||||
if(WIRE_RADIO_RECEIVER)
|
||||
R.listening = !R.listening && !is_cut(WIRE_RADIO_SIGNAL)
|
||||
|
||||
if(WIRE_TRANSMIT)
|
||||
R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL)
|
||||
SSnanoui.update_uis(holder)
|
||||
if(WIRE_RADIO_TRANSMIT)
|
||||
R.broadcasting = !R.broadcasting && !is_cut(WIRE_RADIO_SIGNAL)
|
||||
..()
|
||||
|
||||
/datum/wires/radio/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/radio/on_cut(wire, mend)
|
||||
var/obj/item/device/radio/R = holder
|
||||
switch(index)
|
||||
if(WIRE_SIGNAL)
|
||||
R.listening = mended && !IsIndexCut(WIRE_RECEIVE)
|
||||
R.broadcasting = mended && !IsIndexCut(WIRE_TRANSMIT)
|
||||
switch(wire)
|
||||
if(WIRE_RADIO_SIGNAL)
|
||||
R.listening = mend && !is_cut(WIRE_RADIO_RECEIVER)
|
||||
R.broadcasting = mend && !is_cut(WIRE_RADIO_TRANSMIT)
|
||||
|
||||
if(WIRE_RECEIVE)
|
||||
R.listening = mended && !IsIndexCut(WIRE_SIGNAL)
|
||||
if(WIRE_RADIO_RECEIVER)
|
||||
R.listening = mend && !is_cut(WIRE_RADIO_SIGNAL)
|
||||
|
||||
if(WIRE_TRANSMIT)
|
||||
R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL)
|
||||
SSnanoui.update_uis(holder)
|
||||
if(WIRE_RADIO_TRANSMIT)
|
||||
R.broadcasting = mend && !is_cut(WIRE_RADIO_SIGNAL)
|
||||
..()
|
||||
|
||||
+34
-47
@@ -1,76 +1,63 @@
|
||||
/datum/wires/robot
|
||||
random = 1
|
||||
randomize = TRUE
|
||||
holder_type = /mob/living/silicon/robot
|
||||
wire_count = 5
|
||||
proper_name = "Cyborg"
|
||||
|
||||
var/const/BORG_WIRE_LAWCHECK = 1
|
||||
var/const/BORG_WIRE_MAIN_POWER = 2 // The power wires do nothing whyyyyyyyyyyyyy
|
||||
var/const/BORG_WIRE_LOCKED_DOWN = 4
|
||||
var/const/BORG_WIRE_AI_CONTROL = 8
|
||||
var/const/BORG_WIRE_CAMERA = 16
|
||||
/datum/wires/robot/New(atom/_holder)
|
||||
wires = list(WIRE_AI_CONTROL, WIRE_BORG_CAMERA, WIRE_BORG_LAWCHECK, WIRE_BORG_LOCKED)
|
||||
return ..()
|
||||
|
||||
/datum/wires/robot/GetInteractWindow()
|
||||
/datum/wires/robot/get_status()
|
||||
. = ..()
|
||||
var/mob/living/silicon/robot/R = holder
|
||||
. += show_hint(0x1, R.lawupdate, "The LawSync light is on.", "The LawSync light is off.")
|
||||
. += show_hint(0x2, R.connected_ai, "The AI link light is on.", "The AI link light is off.")
|
||||
. += show_hint(0x4, (!isnull(R.camera) && R.camera.status == 1), "The camera light is on.", "The camera light is off.")
|
||||
. += show_hint(0x8, R.lockdown, "The lockdown light is on.", "The lockdown light is off.")
|
||||
return .
|
||||
|
||||
/datum/wires/robot/UpdateCut(var/index, var/mended)
|
||||
. += "The LawSync light is [R.lawupdate ? "on" : "off"]."
|
||||
. += "The AI link light is [R.connected_ai ? "on" : "off"]."
|
||||
. += "The Camera light is [(R.camera && R.camera.status == 1) ? "on" : "off"]."
|
||||
. += "The lockdown light is [R.lockcharge ? "on" : "off"]."
|
||||
|
||||
/datum/wires/robot/on_cut(wire, mend)
|
||||
var/mob/living/silicon/robot/R = holder
|
||||
switch(index)
|
||||
if(BORG_WIRE_LAWCHECK) //Cut the law wire, and the borg will no longer receive law updates from its AI
|
||||
if(!mended)
|
||||
if (R.lawupdate == 1)
|
||||
switch(wire)
|
||||
if(WIRE_BORG_LAWCHECK) //Cut the law wire, and the borg will no longer receive law updates from its AI
|
||||
if(!mend)
|
||||
if(R.lawupdate)
|
||||
to_chat(R, "LawSync protocol engaged.")
|
||||
R.lawsync()
|
||||
R.show_laws()
|
||||
else
|
||||
if (R.lawupdate == 0 && !R.emagged)
|
||||
R.lawupdate = 1
|
||||
if(!R.lawupdate && !R.emagged)
|
||||
R.lawupdate = TRUE
|
||||
|
||||
if (BORG_WIRE_AI_CONTROL) //Cut the AI wire to reset AI control
|
||||
if(!mended)
|
||||
if(WIRE_AI_CONTROL) //Cut the AI wire to reset AI control
|
||||
if(!mend)
|
||||
R.disconnect_from_ai()
|
||||
|
||||
if (BORG_WIRE_CAMERA)
|
||||
if(WIRE_BORG_CAMERA)
|
||||
if(!isnull(R.camera) && !R.scrambledcodes)
|
||||
R.camera.status = mended
|
||||
R.camera.status = mend
|
||||
|
||||
if(BORG_WIRE_LAWCHECK) //Forces a law update if the borg is set to receive them. Since an update would happen when the borg checks its laws anyway, not much use, but eh
|
||||
if (R.lawupdate)
|
||||
R.lawsync()
|
||||
if(WIRE_BORG_LOCKED)
|
||||
R.SetLockdown(!mend)
|
||||
..()
|
||||
|
||||
if(BORG_WIRE_LOCKED_DOWN)
|
||||
R.SetLockdown(!mended)
|
||||
|
||||
|
||||
/datum/wires/robot/UpdatePulsed(var/index)
|
||||
/datum/wires/robot/on_pulse(wire)
|
||||
var/mob/living/silicon/robot/R = holder
|
||||
switch(index)
|
||||
if (BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI
|
||||
switch(wire)
|
||||
if(WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI
|
||||
if(!R.emagged)
|
||||
var/mob/living/silicon/ai/new_ai = select_active_ai(R)
|
||||
R.connect_to_ai(new_ai)
|
||||
R.connect_to_ai(select_active_ai(R))
|
||||
|
||||
if (BORG_WIRE_CAMERA)
|
||||
if(WIRE_BORG_CAMERA)
|
||||
if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes)
|
||||
R.visible_message("[R]'s camera lense focuses loudly.")
|
||||
to_chat(R, "Your camera lense focuses loudly.")
|
||||
|
||||
if(BORG_WIRE_LOCKED_DOWN)
|
||||
if(WIRE_BORG_LOCKED)
|
||||
R.SetLockdown(!R.lockdown) // Toggle
|
||||
|
||||
/datum/wires/robot/CanUse(var/mob/living/L)
|
||||
/datum/wires/robot/interactable(mob/user)
|
||||
var/mob/living/silicon/robot/R = holder
|
||||
if(R.wiresexposed)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/wires/robot/proc/IsCameraCut()
|
||||
return wires_status & BORG_WIRE_CAMERA
|
||||
|
||||
/datum/wires/robot/proc/LockedCut()
|
||||
return wires_status & BORG_WIRE_LOCKED_DOWN
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -1,56 +1,58 @@
|
||||
#define SEED_WIRE_SMART 1
|
||||
#define SEED_WIRE_CONTRABAND 2
|
||||
#define SEED_WIRE_ELECTRIFY 4
|
||||
#define SEED_WIRE_LOCKDOWN 8
|
||||
|
||||
/datum/wires/seedstorage
|
||||
holder_type = /obj/machinery/seed_storage
|
||||
wire_count = 4
|
||||
random = 1
|
||||
randomize = TRUE
|
||||
proper_name = "Seed Storage"
|
||||
|
||||
/datum/wires/seedstorage/CanUse(var/mob/living/L)
|
||||
/datum/wires/seedstorage/New(atom/_holder)
|
||||
wires = list(WIRE_SEED_SMART, WIRE_CONTRABAND, WIRE_ELECTRIFY, WIRE_SEED_LOCKDOWN)
|
||||
return ..()
|
||||
|
||||
/datum/wires/seedstorage/interactable(mob/user)
|
||||
var/obj/machinery/seed_storage/V = holder
|
||||
if(V.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/seedstorage/GetInteractWindow()
|
||||
/datum/wires/seedstorage/get_status()
|
||||
var/obj/machinery/seed_storage/V = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, V.seconds_electrified, "The orange light is off.", "The orange light is on.")
|
||||
. += show_hint(0x2, V.smart, "The red light is off.", "The red light is blinking.")
|
||||
. += show_hint(0x4, V.hacked || V.emagged, "The green light is on.", "The green light is off.")
|
||||
. += show_hint(0x8, V.lockdown, "The keypad lock is deployed.", "The keypad lock is retracted.")
|
||||
. = ..()
|
||||
. += "The orange light is [V.seconds_electrified ? "off." : "on."]"
|
||||
. += "The red light is [V.smart ? "off." : "blinking."]"
|
||||
. += "The green light is [(V.hacked || V.emagged) ? "on." : "off."]"
|
||||
. += "The keypad lock light is [V.lockdown ? "deployed." : "retracted."]"
|
||||
|
||||
/datum/wires/seedstorage/UpdatePulsed(var/index)
|
||||
/datum/wires/seedstorage/on_pulse(wire)
|
||||
var/obj/machinery/seed_storage/V = holder
|
||||
switch(index)
|
||||
if(SEED_WIRE_SMART)
|
||||
switch(wire)
|
||||
if(WIRE_SEED_SMART)
|
||||
V.smart = !V.smart
|
||||
if(SEED_WIRE_CONTRABAND)
|
||||
if(WIRE_CONTRABAND)
|
||||
V.hacked = !V.hacked
|
||||
if(SEED_WIRE_ELECTRIFY)
|
||||
if(WIRE_ELECTRIFY)
|
||||
V.seconds_electrified = 30
|
||||
if(SEED_WIRE_LOCKDOWN)
|
||||
if(WIRE_SEED_LOCKDOWN)
|
||||
V.lockdown = !V.lockdown
|
||||
..()
|
||||
|
||||
/datum/wires/seedstorage/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/seedstorage/on_cut(wire, mend)
|
||||
var/obj/machinery/seed_storage/V = holder
|
||||
switch(index)
|
||||
if(SEED_WIRE_SMART)
|
||||
V.smart = 0
|
||||
if(SEED_WIRE_CONTRABAND)
|
||||
V.hacked = !mended
|
||||
if(SEED_WIRE_ELECTRIFY)
|
||||
if(mended)
|
||||
switch(wire)
|
||||
if(WIRE_SEED_SMART)
|
||||
V.smart = FALSE
|
||||
if(WIRE_CONTRABAND)
|
||||
V.hacked = !mend
|
||||
if(WIRE_ELECTRIFY)
|
||||
if(mend)
|
||||
V.seconds_electrified = 0
|
||||
else
|
||||
V.seconds_electrified = -1
|
||||
if(SEED_WIRE_LOCKDOWN)
|
||||
if(mended)
|
||||
V.lockdown = 1
|
||||
if(WIRE_SEED_LOCKDOWN)
|
||||
if(mend)
|
||||
V.lockdown = TRUE
|
||||
V.req_access = list()
|
||||
V.req_one_access = list()
|
||||
else
|
||||
V.req_access = initial(V.req_access)
|
||||
V.req_one_access = initial(V.req_one_access)
|
||||
..()
|
||||
@@ -1,46 +1,47 @@
|
||||
/datum/wires/shield_generator
|
||||
holder_type = /obj/machinery/power/shield_generator
|
||||
wire_count = 5
|
||||
proper_name = "Shield Generator"
|
||||
|
||||
var/const/SHIELDGEN_WIRE_POWER = 1 // Cut to disable power input into the generator. Pulse does nothing. Mend to restore.
|
||||
var/const/SHIELDGEN_WIRE_HACK = 2 // Pulse to hack the generator, enabling hacked modes. Cut to unhack. Mend does nothing.
|
||||
var/const/SHIELDGEN_WIRE_CONTROL = 4 // Cut to lock most shield controls. Mend to unlock them. Pulse does nothing.
|
||||
var/const/SHIELDGEN_WIRE_AICONTROL = 8 // Cut to disable AI control. Mend to restore.
|
||||
var/const/SHIELDGEN_WIRE_NOTHING = 16 // A blank wire that doesn't have any specific function
|
||||
/datum/wires/shield_generator/New(atom/_holder)
|
||||
wires = list(WIRE_MAIN_POWER1, WIRE_CONTRABAND, WIRE_AI_CONTROL, WIRE_SHIELD_CONTROL)
|
||||
return ..()
|
||||
|
||||
/datum/wires/shield_generator/CanUse(var/mob/living/L)
|
||||
/datum/wires/shield_generator/interactable(mob/user)
|
||||
var/obj/machinery/power/shield_generator/S = holder
|
||||
if(S.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/shield_generator/GetInteractWindow()
|
||||
/datum/wires/shield_generator/get_status()
|
||||
var/obj/machinery/power/shield_generator/S = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, S.mode_changes_locked, "The orange light is on.", "The orange light is off.")
|
||||
. += show_hint(0x2, S.ai_control_disabled, "The blue light is off.", "The blue light is blinking.")
|
||||
. += show_hint(0x4, S.hacked, "The violet light is pulsing.", "The violet light is steady.")
|
||||
. += show_hint(0x8, S.input_cut, "The red light is off.", "The red light is on.")
|
||||
. = ..()
|
||||
. += "The orange light is [S.mode_changes_locked ? "on." : "off."]"
|
||||
. += "The blue light is [S.ai_control_disabled ? "off." : "blinking."]"
|
||||
. += "The violet light is [S.hacked ? "pulsing." : "steady."]"
|
||||
. += "The red light is [S.input_cut ? "off." : "on."]"
|
||||
|
||||
/datum/wires/shield_generator/UpdateCut(index, mended)
|
||||
/datum/wires/shield_generator/on_cut(wire, mend)
|
||||
var/obj/machinery/power/shield_generator/S = holder
|
||||
switch(index)
|
||||
if(SHIELDGEN_WIRE_POWER)
|
||||
S.input_cut = !mended
|
||||
if(SHIELDGEN_WIRE_HACK)
|
||||
if(!mended)
|
||||
S.hacked = 0
|
||||
switch(wire)
|
||||
if(WIRE_MAIN_POWER1)
|
||||
S.input_cut = !mend
|
||||
if(WIRE_CONTRABAND)
|
||||
if(!mend)
|
||||
S.hacked = FALSE
|
||||
if(S.check_flag(MODEFLAG_BYPASS))
|
||||
S.toggle_flag(MODEFLAG_BYPASS)
|
||||
if(S.check_flag(MODEFLAG_OVERCHARGE))
|
||||
S.toggle_flag(MODEFLAG_OVERCHARGE)
|
||||
if(SHIELDGEN_WIRE_CONTROL)
|
||||
S.mode_changes_locked = !mended
|
||||
if(SHIELDGEN_WIRE_AICONTROL)
|
||||
S.ai_control_disabled = !mended
|
||||
if(WIRE_SHIELD_CONTROL)
|
||||
S.mode_changes_locked = !mend
|
||||
if(WIRE_AI_CONTROL)
|
||||
S.ai_control_disabled = !mend
|
||||
..()
|
||||
|
||||
/datum/wires/shield_generator/UpdatePulsed(var/index)
|
||||
/datum/wires/shield_generator/on_pulse(wire)
|
||||
var/obj/machinery/power/shield_generator/S = holder
|
||||
switch(index)
|
||||
if(SHIELDGEN_WIRE_HACK)
|
||||
S.hacked = 1
|
||||
switch(wire)
|
||||
if(WIRE_CONTRABAND)
|
||||
S.hacked = TRUE
|
||||
..()
|
||||
@@ -1,47 +1,52 @@
|
||||
/datum/wires/smartfridge
|
||||
holder_type = /obj/machinery/smartfridge
|
||||
wire_count = 3
|
||||
proper_name = "Smartfridge"
|
||||
|
||||
/datum/wires/smartfridge/New(atom/_holder)
|
||||
wires = list(WIRE_ELECTRIFY, WIRE_IDSCAN, WIRE_THROW_ITEM)
|
||||
return ..()
|
||||
|
||||
/datum/wires/smartfridge/secure
|
||||
random = 1
|
||||
wire_count = 4
|
||||
randomize = TRUE
|
||||
wire_count = 4 // 3 actual, 1 dud.
|
||||
|
||||
var/const/SMARTFRIDGE_WIRE_ELECTRIFY = 1
|
||||
var/const/SMARTFRIDGE_WIRE_THROW = 2
|
||||
var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
|
||||
|
||||
/datum/wires/smartfridge/CanUse(var/mob/living/L)
|
||||
/datum/wires/smartfridge/interactable(mob/user)
|
||||
var/obj/machinery/smartfridge/S = holder
|
||||
if(iscarbon(user) && S.Adjacent(user) && S.seconds_electrified && S.shock(user, 100))
|
||||
return FALSE
|
||||
if(S.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/smartfridge/GetInteractWindow()
|
||||
/datum/wires/smartfridge/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/smartfridge/S = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, S.seconds_electrified, "The orange light is off.", "The orange light is on.")
|
||||
. += show_hint(0x2, S.shoot_inventory, "The red light is off.", "The red light is blinking.")
|
||||
. += show_hint(0x4, S.scan_id, "A purple light is on.", "A yellow light is on.")
|
||||
. += "The orange light is [S.seconds_electrified ? "off" : "on"]."
|
||||
. += "The red light is [S.shoot_inventory ? "off" : "blinking"]."
|
||||
. += "A [S.scan_id ? "purple" : "yellow"] light is on."
|
||||
|
||||
/datum/wires/smartfridge/UpdatePulsed(var/index)
|
||||
/datum/wires/smartfridge/on_pulse(wire)
|
||||
var/obj/machinery/smartfridge/S = holder
|
||||
switch(index)
|
||||
if(SMARTFRIDGE_WIRE_THROW)
|
||||
switch(wire)
|
||||
if(WIRE_THROW_ITEM)
|
||||
S.shoot_inventory = !S.shoot_inventory
|
||||
if(SMARTFRIDGE_WIRE_ELECTRIFY)
|
||||
if(WIRE_ELECTRIFY)
|
||||
S.seconds_electrified = 30
|
||||
if(SMARTFRIDGE_WIRE_IDSCAN)
|
||||
if(WIRE_IDSCAN)
|
||||
S.scan_id = !S.scan_id
|
||||
..()
|
||||
|
||||
/datum/wires/smartfridge/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/smartfridge/on_cut(wire, mend)
|
||||
var/obj/machinery/smartfridge/S = holder
|
||||
switch(index)
|
||||
if(SMARTFRIDGE_WIRE_THROW)
|
||||
S.shoot_inventory = !mended
|
||||
if(SMARTFRIDGE_WIRE_ELECTRIFY)
|
||||
if(mended)
|
||||
switch(wire)
|
||||
if(WIRE_THROW_ITEM)
|
||||
S.shoot_inventory = !mend
|
||||
if(WIRE_ELECTRIFY)
|
||||
if(mend)
|
||||
S.seconds_electrified = 0
|
||||
else
|
||||
S.seconds_electrified = -1
|
||||
if(SMARTFRIDGE_WIRE_IDSCAN)
|
||||
S.scan_id = 1
|
||||
if(WIRE_IDSCAN)
|
||||
S.scan_id = TRUE
|
||||
..()
|
||||
|
||||
+34
-36
@@ -1,59 +1,57 @@
|
||||
/datum/wires/smes
|
||||
holder_type = /obj/machinery/power/smes/buildable
|
||||
wire_count = 5
|
||||
proper_name = "SMES"
|
||||
|
||||
var/const/SMES_WIRE_RCON = 1 // Remote control (AI and consoles), cut to disable
|
||||
var/const/SMES_WIRE_INPUT = 2 // Input wire, cut to disable input, pulse to disable for 60s
|
||||
var/const/SMES_WIRE_OUTPUT = 4 // Output wire, cut to disable output, pulse to disable for 60s
|
||||
var/const/SMES_WIRE_GROUNDING = 8 // Cut to quickly discharge causing sparks, pulse to only create few sparks
|
||||
var/const/SMES_WIRE_FAILSAFES = 16 // Cut to disable failsafes, mend to reenable
|
||||
/datum/wires/smes/New(atom/_holder)
|
||||
wires = list(WIRE_SMES_RCON, WIRE_SMES_INPUT, WIRE_SMES_OUTPUT, WIRE_SMES_GROUNDING, WIRE_SMES_FAILSAFES)
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/wires/smes/CanUse(var/mob/living/L)
|
||||
/datum/wires/smes/interactable(mob/user)
|
||||
var/obj/machinery/power/smes/buildable/S = holder
|
||||
if(S.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/wires/smes/GetInteractWindow()
|
||||
/datum/wires/smes/get_status()
|
||||
var/obj/machinery/power/smes/buildable/S = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, S.input_cut || S.input_pulsed || S.output_cut || S.output_pulsed, "The green light is off.", "The green light is on.")
|
||||
. += show_hint(0x2, S.safeties_enabled || S.grounding, "The red light is off.", "The red light is blinking.")
|
||||
. += show_hint(0x4, S.RCon, "The blue light is on.", "The blue light is off.")
|
||||
. = ..()
|
||||
. += "The green light is [(S.input_cut || S.input_pulsed || S.output_cut || S.output_pulsed) ? "off" : "on"]."
|
||||
. += "The red light is [(S.safeties_enabled || S.grounding) ? "off" : "blinking"]."
|
||||
. += "The blue light is [S.RCon ? "on" : "off"]."
|
||||
|
||||
/datum/wires/smes/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/smes/on_cut(wire, mend)
|
||||
var/obj/machinery/power/smes/buildable/S = holder
|
||||
switch(index)
|
||||
if(SMES_WIRE_RCON)
|
||||
S.RCon = mended
|
||||
if(SMES_WIRE_INPUT)
|
||||
S.input_cut = !mended
|
||||
if(SMES_WIRE_OUTPUT)
|
||||
S.output_cut = !mended
|
||||
if(SMES_WIRE_GROUNDING)
|
||||
S.grounding = mended
|
||||
if(SMES_WIRE_FAILSAFES)
|
||||
S.safeties_enabled = mended
|
||||
switch(wire)
|
||||
if(WIRE_SMES_RCON)
|
||||
S.RCon = mend
|
||||
if(WIRE_SMES_INPUT)
|
||||
S.input_cut = !mend
|
||||
if(WIRE_SMES_OUTPUT)
|
||||
S.output_cut = !mend
|
||||
if(WIRE_SMES_GROUNDING)
|
||||
S.grounding = mend
|
||||
if(WIRE_SMES_FAILSAFES)
|
||||
S.safeties_enabled = mend
|
||||
..()
|
||||
|
||||
|
||||
/datum/wires/smes/UpdatePulsed(var/index)
|
||||
/datum/wires/smes/on_pulse(wire)
|
||||
var/obj/machinery/power/smes/buildable/S = holder
|
||||
switch(index)
|
||||
if(SMES_WIRE_RCON)
|
||||
switch(wire)
|
||||
if(WIRE_SMES_RCON)
|
||||
if(S.RCon)
|
||||
S.RCon = 0
|
||||
spawn(10)
|
||||
S.RCon = 1
|
||||
if(SMES_WIRE_INPUT)
|
||||
if(WIRE_SMES_INPUT)
|
||||
S.toggle_input()
|
||||
if(SMES_WIRE_OUTPUT)
|
||||
if(WIRE_SMES_OUTPUT)
|
||||
S.toggle_output()
|
||||
if(SMES_WIRE_GROUNDING)
|
||||
if(WIRE_SMES_GROUNDING)
|
||||
S.grounding = 0
|
||||
if(SMES_WIRE_FAILSAFES)
|
||||
if(WIRE_SMES_FAILSAFES)
|
||||
if(S.safeties_enabled)
|
||||
S.safeties_enabled = 0
|
||||
spawn(10)
|
||||
S.safeties_enabled = 1
|
||||
S.safeties_enabled = 1
|
||||
..()
|
||||
@@ -1,47 +1,46 @@
|
||||
/datum/wires/suit_storage_unit
|
||||
holder_type = /obj/machinery/suit_cycler
|
||||
wire_count = 3
|
||||
proper_name = "Suit storage unit"
|
||||
|
||||
var/const/SUIT_STORAGE_WIRE_ELECTRIFY = 1
|
||||
var/const/SUIT_STORAGE_WIRE_SAFETY = 2
|
||||
var/const/SUIT_STORAGE_WIRE_LOCKED = 4
|
||||
/datum/wires/suit_storage_unit/New(atom/_holder)
|
||||
wires = list(WIRE_IDSCAN, WIRE_ELECTRIFY, WIRE_SAFETY)
|
||||
return ..()
|
||||
|
||||
/datum/wires/suit_storage_unit/CanUse(var/mob/living/L)
|
||||
/datum/wires/suit_storage_unit/interactable(mob/user)
|
||||
var/obj/machinery/suit_cycler/S = holder
|
||||
if(!istype(L, /mob/living/silicon))
|
||||
if(S.electrified)
|
||||
if(S.shock(L, 100))
|
||||
return 0
|
||||
if(iscarbon(user) && S.Adjacent(user) && S.electrified)
|
||||
return !S.shock(user, 100)
|
||||
if(S.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/suit_storage_unit/GetInteractWindow()
|
||||
var/obj/machinery/suit_cycler/S = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, S.electrified, "The orange light is off.", "The orange light is on.")
|
||||
. += show_hint(0x2, S.safeties, "The red light is off.", "The red light is blinking.")
|
||||
. += show_hint(0x4, S.locked, "The yellow light is on.", "The yellow light is off.")
|
||||
/datum/wires/suit_storage_unit/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/suit_cycler/A = holder
|
||||
. += "The orange light is [A.electrified ? "off" : "on"]."
|
||||
. += "The red light is [A.safeties ? "off" : "blinking"]."
|
||||
. += "The yellow light is [A.locked ? "on" : "off"]."
|
||||
|
||||
/datum/wires/suit_storage_unit/UpdatePulsed(var/index)
|
||||
/datum/wires/suit_storage_unit/on_pulse(wire)
|
||||
var/obj/machinery/suit_cycler/S = holder
|
||||
switch(index)
|
||||
if(SUIT_STORAGE_WIRE_SAFETY)
|
||||
switch(wire)
|
||||
if(WIRE_SAFETY)
|
||||
S.safeties = !S.safeties
|
||||
if(SUIT_STORAGE_WIRE_ELECTRIFY)
|
||||
if(WIRE_ELECTRIFY)
|
||||
S.electrified = 30
|
||||
if(SUIT_STORAGE_WIRE_LOCKED)
|
||||
if(WIRE_IDSCAN)
|
||||
S.locked = !S.locked
|
||||
|
||||
/datum/wires/suit_storage_unit/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/suit_storage_unit/on_cut(wire, mend)
|
||||
var/obj/machinery/suit_cycler/S = holder
|
||||
switch(index)
|
||||
if(SUIT_STORAGE_WIRE_SAFETY)
|
||||
S.safeties = mended
|
||||
if(SUIT_STORAGE_WIRE_LOCKED)
|
||||
S.locked = mended
|
||||
if(SUIT_STORAGE_WIRE_ELECTRIFY)
|
||||
if(mended)
|
||||
switch(wire)
|
||||
if(WIRE_SAFETY)
|
||||
S.safeties = mend
|
||||
if(WIRE_IDSCAN)
|
||||
S.locked = mend
|
||||
if(WIRE_ELECTRIFY)
|
||||
if(mend)
|
||||
S.electrified = 0
|
||||
else
|
||||
S.electrified = -1
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
/datum/wires/tesla_coil
|
||||
wire_count = 1
|
||||
holder_type = /obj/machinery/power/tesla_coil
|
||||
proper_name = "Tesla coil"
|
||||
|
||||
var/const/WIRE_ZAP = 1
|
||||
/datum/wires/tesla_coil/New(atom/_holder)
|
||||
wires = list(WIRE_TESLACOIL_ZAP)
|
||||
return ..()
|
||||
|
||||
/datum/wires/tesla_coil/CanUse(mob/living/L)
|
||||
/datum/wires/tesla_coil/interactable(mob/user)
|
||||
var/obj/machinery/power/tesla_coil/T = holder
|
||||
if(T && T.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/tesla_coil/UpdatePulsed(index)
|
||||
/datum/wires/tesla_coil/on_pulse(wire)
|
||||
var/obj/machinery/power/tesla_coil/T = holder
|
||||
switch(index)
|
||||
if(WIRE_ZAP)
|
||||
switch(wire)
|
||||
if(WIRE_TESLACOIL_ZAP)
|
||||
T.zap()
|
||||
..()
|
||||
|
||||
@@ -1,49 +1,53 @@
|
||||
/datum/wires/vending
|
||||
holder_type = /obj/machinery/vending
|
||||
wire_count = 4
|
||||
proper_name = "Vending machine"
|
||||
|
||||
var/const/VENDING_WIRE_THROW = 1
|
||||
var/const/VENDING_WIRE_CONTRABAND = 2
|
||||
var/const/VENDING_WIRE_ELECTRIFY = 4
|
||||
var/const/VENDING_WIRE_IDSCAN = 8
|
||||
/datum/wires/vending/New(atom/_holder)
|
||||
wires = list(WIRE_THROW_ITEM, WIRE_IDSCAN, WIRE_ELECTRIFY, WIRE_CONTRABAND)
|
||||
return ..()
|
||||
|
||||
/datum/wires/vending/CanUse(var/mob/living/L)
|
||||
/datum/wires/vending/interactable(mob/user)
|
||||
var/obj/machinery/vending/V = holder
|
||||
if(iscarbon(user) && V.seconds_electrified && V.shock(user, 100))
|
||||
return FALSE
|
||||
if(V.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/wires/vending/GetInteractWindow()
|
||||
/datum/wires/vending/get_status()
|
||||
var/obj/machinery/vending/V = holder
|
||||
. += ..()
|
||||
. += show_hint(0x1, V.seconds_electrified, "The orange light is off.", "The orange light is on.")
|
||||
. += show_hint(0x2, V.shoot_inventory, "The red light is off.", "The red light is blinking.")
|
||||
. += show_hint(0x4, V.categories & CAT_HIDDEN, "A green light is on.", "A green light is off.")
|
||||
. += show_hint(0x8, V.scan_id, "A purple light is on.", "A yellow light is on.")
|
||||
. = ..()
|
||||
. += "The orange light is [V.seconds_electrified ? "on" : "off"]."
|
||||
. += "The red light is [V.shoot_inventory ? "off" : "blinking"]."
|
||||
. += "The green light is [(V.categories & CAT_HIDDEN) ? "on" : "off"]."
|
||||
. += "A [V.scan_id ? "purple" : "yellow"] light is on."
|
||||
|
||||
/datum/wires/vending/UpdatePulsed(var/index)
|
||||
/datum/wires/vending/on_pulse(wire)
|
||||
var/obj/machinery/vending/V = holder
|
||||
switch(index)
|
||||
if(VENDING_WIRE_THROW)
|
||||
switch(wire)
|
||||
if(WIRE_THROW_ITEM)
|
||||
V.shoot_inventory = !V.shoot_inventory
|
||||
if(VENDING_WIRE_CONTRABAND)
|
||||
if(WIRE_CONTRABAND)
|
||||
V.categories ^= CAT_HIDDEN
|
||||
if(VENDING_WIRE_ELECTRIFY)
|
||||
if(WIRE_ELECTRIFY)
|
||||
V.seconds_electrified = 30
|
||||
if(VENDING_WIRE_IDSCAN)
|
||||
if(WIRE_IDSCAN)
|
||||
V.scan_id = !V.scan_id
|
||||
..()
|
||||
|
||||
/datum/wires/vending/UpdateCut(var/index, var/mended)
|
||||
/datum/wires/vending/on_cut(wire, mend)
|
||||
var/obj/machinery/vending/V = holder
|
||||
switch(index)
|
||||
if(VENDING_WIRE_THROW)
|
||||
V.shoot_inventory = !mended
|
||||
if(VENDING_WIRE_CONTRABAND)
|
||||
switch(wire)
|
||||
if(WIRE_THROW_ITEM)
|
||||
V.shoot_inventory = !mend
|
||||
if(WIRE_CONTRABAND)
|
||||
V.categories &= ~CAT_HIDDEN
|
||||
if(VENDING_WIRE_ELECTRIFY)
|
||||
if(mended)
|
||||
if(WIRE_ELECTRIFY)
|
||||
if(mend)
|
||||
V.seconds_electrified = 0
|
||||
else
|
||||
V.seconds_electrified = -1
|
||||
if(VENDING_WIRE_IDSCAN)
|
||||
if(WIRE_IDSCAN)
|
||||
V.scan_id = 1
|
||||
..()
|
||||
+428
-308
@@ -1,340 +1,460 @@
|
||||
// Wire datums. Created by Giacomand.
|
||||
// Was created to replace a horrible case of copy and pasted code with no care for maintability.
|
||||
// Goodbye Door wires, Cyborg wires, Vending Machine wires, Autolathe wires
|
||||
// Protolathe wires, APC wires and Camera wires!
|
||||
|
||||
#define MAX_FLAG 65535
|
||||
|
||||
var/list/same_wires = list()
|
||||
// 14 colours, if you're adding more than 14 wires then add more colours here
|
||||
var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink", "black", "yellow")
|
||||
|
||||
/datum/wires
|
||||
/// TRUE if the wires will be different every time a new wire datum is created.
|
||||
var/randomize = FALSE
|
||||
/// The atom the wires belong too. For example: an airlock.
|
||||
var/atom/holder
|
||||
/// The holder type; used to make sure that the holder is the correct type.
|
||||
var/holder_type
|
||||
/// The display name for the TGUI window. For example, given the var is "APC"...
|
||||
/// When the TGUI window is opened, "wires" will be appended to it's title, and it would become "APC wires".
|
||||
var/proper_name = "Unknown"
|
||||
/// The total number of wires that our holder atom has.
|
||||
var/wire_count = NONE
|
||||
/// A list of all wires. For a list of valid wires defines that can go here, see `code/__DEFINES/wires.dm`
|
||||
var/list/wires
|
||||
/// A list of all cut wires. The same values that can go into `wires` will get added and removed from this list.
|
||||
var/list/cut_wires
|
||||
/// An associative list with the wire color as the key, and the wire define as the value.
|
||||
var/list/colors
|
||||
/// An associative list of signalers attached to the wires. The wire color is the key, and the signaler object reference is the value.
|
||||
var/list/assemblies
|
||||
|
||||
var/random = 0 // Will the wires be different for every single instance.
|
||||
var/atom/holder = null // The holder
|
||||
var/holder_type = null // The holder type; used to make sure that the holder is the correct type.
|
||||
var/wire_count = 0 // Max is 16
|
||||
var/wires_status = 0 // BITFLAG OF WIRES
|
||||
|
||||
var/hint_states = 0 // BITFLAG OF HINT STATES (For tracking if they changed for bolding in UI)
|
||||
var/hint_states_initialized = FALSE // False until first time window is rendered.
|
||||
|
||||
var/list/wires = list()
|
||||
var/list/signallers = list()
|
||||
|
||||
var/table_options = " align='center'"
|
||||
var/row_options1 = " width='80px'"
|
||||
var/row_options2 = " width='260px'"
|
||||
var/window_x = 370
|
||||
var/window_y = 470
|
||||
|
||||
// Note: Its assumed states are boolean. If you ever have a multi-state hint, you must implement that yourself.
|
||||
/datum/wires/proc/show_hint(flag, current_state, true_text, false_text)
|
||||
var/state_changed = FALSE
|
||||
if(hint_states_initialized)
|
||||
if(!(hint_states & flag) != !current_state) // NOT-ing to convert to boolean
|
||||
state_changed = TRUE
|
||||
if(current_state)
|
||||
hint_states |= flag
|
||||
return state_changed ? "<br><b>[true_text]</b>" : "<br>[true_text]"
|
||||
else
|
||||
hint_states &= ~flag
|
||||
return state_changed ? "<br><b>[false_text]</b>" : "<br>[false_text]"
|
||||
|
||||
/datum/wires/New(var/atom/holder)
|
||||
/datum/wires/New(atom/_holder)
|
||||
..()
|
||||
src.holder = holder
|
||||
if(!istype(holder, holder_type))
|
||||
if(!istype(_holder, holder_type))
|
||||
CRASH("Our holder is null/the wrong type!")
|
||||
|
||||
holder = _holder
|
||||
cut_wires = list()
|
||||
colors = list()
|
||||
assemblies = list()
|
||||
|
||||
// Add in the appropriate amount of dud wires.
|
||||
var/wire_len = length(wires)
|
||||
if(wire_len < wire_count) // If the amount of "real" wires is less than the total we're suppose to have...
|
||||
add_duds(wire_count - wire_len) // Add in the appropriate amount of duds to reach `wire_count`.
|
||||
|
||||
// If the randomize is true, we need to generate a new set of wires and ignore any wire color directories.
|
||||
if(randomize)
|
||||
randomize()
|
||||
return
|
||||
|
||||
// Generate new wires
|
||||
if(random)
|
||||
GenerateWires()
|
||||
// Get the same wires
|
||||
if(!GLOB.wire_color_directory[holder_type])
|
||||
randomize()
|
||||
GLOB.wire_color_directory[holder_type] = colors
|
||||
else
|
||||
// We don't have any wires to copy yet, generate some and then copy it.
|
||||
if(!same_wires[holder_type])
|
||||
GenerateWires()
|
||||
same_wires[holder_type] = src.wires.Copy()
|
||||
else
|
||||
var/list/wires = same_wires[holder_type]
|
||||
src.wires = wires // Reference the wires list.
|
||||
colors = GLOB.wire_color_directory[holder_type]
|
||||
|
||||
/datum/wires/Destroy()
|
||||
holder = null
|
||||
signallers.Cut()
|
||||
for(var/color in colors)
|
||||
detach_assembly(color)
|
||||
return ..()
|
||||
|
||||
/datum/wires/proc/GenerateWires()
|
||||
var/list/colours_to_pick = wireColours.Copy() // Get a copy, not a reference.
|
||||
var/list/indexes_to_pick = list()
|
||||
//Generate our indexes
|
||||
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
|
||||
indexes_to_pick += i
|
||||
colours_to_pick.len = wire_count // Downsize it to our specifications.
|
||||
/**
|
||||
* Randomly generates a new set of wires. and corresponding colors from the given pool. Assigns the information as an associative list, to `colors`.
|
||||
*
|
||||
* In the `colors` list, the name of the color is the key, and the wire is the value.
|
||||
* For example: `colors["red"] = WIRE_ELECTRIFY`. This will look like `list("red" = WIRE_ELECTRIFY)` internally.
|
||||
*/
|
||||
/datum/wires/proc/randomize()
|
||||
var/static/list/possible_colors = list("red", "blue", "green", "darkmagenta", "orange", "brown", "gold", "grey", "cyan", "white", "purple", "pink", "darkslategrey", "yellow")
|
||||
var/list/my_possible_colors = possible_colors.Copy()
|
||||
|
||||
while(colours_to_pick.len && indexes_to_pick.len)
|
||||
// Pick and remove a colour
|
||||
var/colour = pick_n_take(colours_to_pick)
|
||||
for(var/wire in shuffle(wires))
|
||||
colors[pick_n_take(my_possible_colors)] = wire
|
||||
|
||||
// Pick and remove an index
|
||||
var/index = pick_n_take(indexes_to_pick)
|
||||
/**
|
||||
* Proc called when the user attempts to interact with wires UI.
|
||||
*
|
||||
* Checks if the user exists, is a mob, the wires are attached to something (`holder`) and makes sure `interactable(user)` returns TRUE.
|
||||
* If all the checks succeed, open the TGUI interface for the user.
|
||||
*
|
||||
* Arugments:
|
||||
* * user - the mob trying to interact with the wires.
|
||||
*/
|
||||
/datum/wires/proc/Interact(mob/user)
|
||||
if(user && istype(user) && holder && interactable(user))
|
||||
tgui_interact(user)
|
||||
|
||||
src.wires[colour] = index
|
||||
//wires = shuffle(wires)
|
||||
/**
|
||||
* Base proc, intended to be overriden. Wire datum specific checks you want to run before the TGUI is shown to the user should go here.
|
||||
*/
|
||||
/datum/wires/proc/interactable(mob/user)
|
||||
return TRUE
|
||||
|
||||
/// Users will be interacting with our holder object and not the wire datum directly, therefore we need to return the holder.
|
||||
/datum/wires/tgui_host()
|
||||
return holder
|
||||
|
||||
/datum/wires/proc/Interact(var/mob/living/user)
|
||||
/datum/wires/tgui_interact(mob/user, datum/tgui/ui = null)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Wires", "[proper_name] wires")
|
||||
ui.open()
|
||||
|
||||
var/html = null
|
||||
if(holder && CanUse(user))
|
||||
html = GetInteractWindow()
|
||||
hint_states_initialized = TRUE
|
||||
if(html)
|
||||
user.set_machine(holder)
|
||||
else
|
||||
user.unset_machine()
|
||||
// No content means no window.
|
||||
user << browse(null, "window=wires")
|
||||
/datum/wires/tgui_state(mob/user)
|
||||
return GLOB.tgui_physical_state
|
||||
|
||||
/datum/wires/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/list/replace_colors
|
||||
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
for(var/datum/modifier/M in L.modifiers)
|
||||
if(!isnull(M.wire_colors_replace))
|
||||
replace_colors = M.wire_colors_replace
|
||||
break
|
||||
|
||||
var/list/wires_list = list()
|
||||
|
||||
for(var/color in colors)
|
||||
var/replaced_color = color
|
||||
var/color_name = color
|
||||
|
||||
if(color in replace_colors) // If this color is one that needs to be replaced using the colorblindness list.
|
||||
replaced_color = replace_colors[color]
|
||||
if(replaced_color in LIST_COLOR_RENAME) // If its an ugly written color name like "darkolivegreen", rename it to something like "dark green".
|
||||
color_name = LIST_COLOR_RENAME[replaced_color]
|
||||
else
|
||||
color_name = replaced_color // Else just keep the normal color name
|
||||
|
||||
if(color in LIST_COLOR_RENAME)
|
||||
color_name = LIST_COLOR_RENAME[color]
|
||||
|
||||
wires_list += list(list(
|
||||
"seen_color" = replaced_color, // The color of the wire that the mob will see. This will be the same as `color` if the user is NOT colorblind.
|
||||
"color_name" = color_name, // The wire's name. This will be the same as `color` if the user is NOT colorblind.
|
||||
"color" = color, // The "real" color of the wire. No replacements.
|
||||
"wire" = can_see_wire_info(user) && !is_dud_color(color) ? get_wire(color) : null, // Wire define information like "Contraband" or "Door Bolts".
|
||||
"cut" = is_color_cut(color), // Whether the wire is cut or not. Used to display "cut" or "mend".
|
||||
"attached" = is_attached(color) // Whether or not a signaler is attached to this wire.
|
||||
))
|
||||
data["wires"] = wires_list
|
||||
|
||||
// Get the information shown at the bottom of wire TGUI window, such as "The red light is blinking", etc.
|
||||
// If the user is colorblind, we need to replace these colors as well.
|
||||
var/list/status = get_status()
|
||||
|
||||
if(replace_colors)
|
||||
var/i
|
||||
for(i in 1 to length(status))
|
||||
for(var/color in replace_colors)
|
||||
var/new_color = replace_colors[color]
|
||||
if(new_color in LIST_COLOR_RENAME)
|
||||
new_color = LIST_COLOR_RENAME[new_color]
|
||||
if(findtext(status[i], color))
|
||||
status[i] = replacetext(status[i], color, new_color)
|
||||
break
|
||||
|
||||
data["status"] = status
|
||||
return data
|
||||
|
||||
/datum/wires/tgui_act(action, list/params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/datum/browser/popup = new(user, "wires", holder.name, window_x, window_y)
|
||||
popup.set_content(html)
|
||||
popup.set_title_image(user.browse_rsc_icon(holder.icon, holder.icon_state))
|
||||
popup.open()
|
||||
|
||||
/datum/wires/proc/GetInteractWindow()
|
||||
var/html = "<div class='block'>"
|
||||
html += "<h3>Exposed Wires</h3>"
|
||||
html += "<table[table_options]>"
|
||||
|
||||
for(var/colour in wires)
|
||||
html += "<tr>"
|
||||
html += "<td[row_options1]><font color='[colour]'>[capitalize(colour)]</font></td>"
|
||||
html += "<td[row_options2]>"
|
||||
html += "<A href='?src=\ref[src];action=1;cut=[colour]'>[IsColourCut(colour) ? "Mend" : "Cut"]</A>"
|
||||
html += " <A href='?src=\ref[src];action=1;pulse=[colour]'>Pulse</A>"
|
||||
html += " <A href='?src=\ref[src];action=1;attach=[colour]'>[IsAttached(colour) ? "Detach" : "Attach"] Signaller</A></td></tr>"
|
||||
html += "</table>"
|
||||
html += "</div>"
|
||||
|
||||
if (random)
|
||||
html += "<i>\The [holder] appears to have tamper-resistant electronics installed.</i><br><br>" //maybe this could be more generic?
|
||||
|
||||
return html
|
||||
|
||||
/datum/wires/Topic(href, href_list)
|
||||
..()
|
||||
if(in_range(holder, usr) && isliving(usr))
|
||||
|
||||
var/mob/living/L = usr
|
||||
if(CanUse(L) && href_list["action"])
|
||||
holder.add_hiddenprint(L)
|
||||
|
||||
var/list/items = L.get_all_held_items()
|
||||
var/success = FALSE
|
||||
|
||||
if(href_list["cut"]) // Toggles the cut/mend status
|
||||
for(var/obj/item/I in items) // Paranoid about someone somehow grabbing a non-/obj/item, lets play it safe.
|
||||
if(I.is_wirecutter())
|
||||
var/colour = href_list["cut"]
|
||||
CutWireColour(colour)
|
||||
playsound(holder, I.usesound, 20, 1)
|
||||
success = TRUE
|
||||
break
|
||||
if(!success)
|
||||
to_chat(L, span("warning", "You need wirecutters!"))
|
||||
|
||||
else if(href_list["pulse"])
|
||||
for(var/obj/item/I in items)
|
||||
if(I.is_multitool())
|
||||
var/colour = href_list["pulse"]
|
||||
PulseColour(colour)
|
||||
playsound(holder, 'sound/weapons/empty.ogg', 20, 1)
|
||||
success = TRUE
|
||||
break
|
||||
if(!success)
|
||||
to_chat(L, span("warning", "You need a multitool!"))
|
||||
|
||||
else if(href_list["attach"])
|
||||
var/colour = href_list["attach"]
|
||||
// Detach
|
||||
if(IsAttached(colour))
|
||||
var/obj/item/O = Detach(colour)
|
||||
if(O)
|
||||
L.put_in_hands(O)
|
||||
|
||||
// Attach
|
||||
else
|
||||
var/obj/item/device/assembly/signaler/S = L.is_holding_item_of_type(/obj/item/device/assembly/signaler)
|
||||
if(istype(S))
|
||||
L.drop_from_inventory(S)
|
||||
Attach(colour, S)
|
||||
else
|
||||
to_chat(L, span("warning", "You need a remote signaller!"))
|
||||
|
||||
|
||||
|
||||
|
||||
// Update Window
|
||||
Interact(usr)
|
||||
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=wires")
|
||||
usr.unset_machine(holder)
|
||||
|
||||
//
|
||||
// Overridable Procs
|
||||
//
|
||||
|
||||
// Called when wires cut/mended.
|
||||
/datum/wires/proc/UpdateCut(var/index, var/mended)
|
||||
return
|
||||
|
||||
// Called when wire pulsed. Add code here.
|
||||
/datum/wires/proc/UpdatePulsed(var/index)
|
||||
return
|
||||
|
||||
/datum/wires/proc/CanUse(var/mob/living/L)
|
||||
return 1
|
||||
|
||||
// Example of use:
|
||||
/*
|
||||
|
||||
var/const/BOLTED= 1
|
||||
var/const/SHOCKED = 2
|
||||
var/const/SAFETY = 4
|
||||
var/const/POWER = 8
|
||||
|
||||
/datum/wires/door/UpdateCut(var/index, var/mended)
|
||||
var/obj/machinery/door/airlock/A = holder
|
||||
switch(index)
|
||||
if(BOLTED)
|
||||
if(!mended)
|
||||
A.bolt()
|
||||
if(SHOCKED)
|
||||
A.shock()
|
||||
if(SAFETY )
|
||||
A.safety()
|
||||
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// Helper Procs
|
||||
//
|
||||
|
||||
/datum/wires/proc/PulseColour(var/colour)
|
||||
PulseIndex(GetIndex(colour))
|
||||
|
||||
/datum/wires/proc/PulseIndex(var/index)
|
||||
if(IsIndexCut(index))
|
||||
var/mob/user = usr
|
||||
if(!interactable(user))
|
||||
return
|
||||
UpdatePulsed(index)
|
||||
|
||||
/datum/wires/proc/GetIndex(var/colour)
|
||||
if(wires[colour])
|
||||
var/index = wires[colour]
|
||||
return index
|
||||
var/obj/item/I = user.get_active_hand()
|
||||
var/color = lowertext(params["wire"])
|
||||
holder.add_hiddenprint(user)
|
||||
|
||||
switch(action)
|
||||
// Toggles the cut/mend status.
|
||||
if("cut")
|
||||
// if(!I.is_wirecutter() && !user.can_admin_interact())
|
||||
if(!istype(I) || !I.is_wirecutter())
|
||||
to_chat(user, "<span class='error'>You need wirecutters!</span>")
|
||||
return
|
||||
|
||||
playsound(holder, I.usesound, 20, 1)
|
||||
cut_color(color)
|
||||
return TRUE
|
||||
|
||||
// Pulse a wire.
|
||||
if("pulse")
|
||||
// if(!I.is_multitool() && !user.can_admin_interact())
|
||||
if(!istype(I) || !I.is_multitool())
|
||||
to_chat(user, "<span class='error'>You need a multitool!</span>")
|
||||
return
|
||||
|
||||
playsound(holder, 'sound/weapons/empty.ogg', 20, 1)
|
||||
pulse_color(color)
|
||||
|
||||
// If they pulse the electrify wire, call interactable() and try to shock them.
|
||||
if(get_wire(color) == WIRE_ELECTRIFY)
|
||||
interactable(user)
|
||||
|
||||
return TRUE
|
||||
|
||||
// Attach a signaler to a wire.
|
||||
if("attach")
|
||||
if(is_attached(color))
|
||||
var/obj/item/O = detach_assembly(color)
|
||||
if(O)
|
||||
user.put_in_hands(O)
|
||||
return TRUE
|
||||
|
||||
if(!istype(I, /obj/item/device/assembly/signaler))
|
||||
to_chat(user, "<span class='error'>You need a remote signaller!</span>")
|
||||
return
|
||||
|
||||
if(user.unEquip(I))
|
||||
attach_assembly(color, I)
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
|
||||
/**
|
||||
* Proc called to determine if the user can see wire define information, such as "Contraband", "Door Bolts", etc.
|
||||
*
|
||||
* If the user is an admin, or has a multitool which reveals wire information in their active hand, the proc returns TRUE.
|
||||
*
|
||||
* Arguments:
|
||||
* * user - the mob who is interacting with the wires.
|
||||
*/
|
||||
/datum/wires/proc/can_see_wire_info(mob/user)
|
||||
// TODO: Reimplement this if we ever get Advanced Admin Interaction.
|
||||
// if(user.can_admin_interact())
|
||||
// return TRUE
|
||||
var/obj/item/I = user.get_active_hand()
|
||||
if(istype(I, /obj/item/device/multitool/alien))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* Base proc, intended to be overwritten. Put wire information you'll see at the botton of the TGUI window here, such as "The red light is blinking".
|
||||
*/
|
||||
/datum/wires/proc/get_status()
|
||||
return list()
|
||||
|
||||
/**
|
||||
* Clears the `colors` list, and randomizes it to a new set of color-to-wire relations.
|
||||
*/
|
||||
/datum/wires/proc/shuffle_wires()
|
||||
colors.Cut()
|
||||
randomize()
|
||||
|
||||
/**
|
||||
* Repairs all cut wires.
|
||||
*/
|
||||
/datum/wires/proc/repair()
|
||||
cut_wires.Cut()
|
||||
|
||||
/**
|
||||
* Adds in dud wires, which do nothing when cut/pulsed.
|
||||
*
|
||||
* Arguments:
|
||||
* * duds - the amount of dud wires to generate.
|
||||
*/
|
||||
/datum/wires/proc/add_duds(duds)
|
||||
while(duds)
|
||||
var/dud = WIRE_DUD_PREFIX + "[--duds]"
|
||||
if(dud in wires)
|
||||
continue
|
||||
wires += dud
|
||||
|
||||
/**
|
||||
* Determines if the passed in wire is a dud or not. Returns TRUE if the wire is a dud, FALSE otherwise.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire define, NOT a color. For example `WIRE_ELECTRIFY`.
|
||||
*/
|
||||
/datum/wires/proc/is_dud(wire)
|
||||
return findtext(wire, WIRE_DUD_PREFIX, 1, length(WIRE_DUD_PREFIX) + 1)
|
||||
|
||||
/**
|
||||
* Returns TRUE if the wire that corresponds to the passed in color is a dud. FALSE otherwise.
|
||||
*
|
||||
* Arugments:
|
||||
* * color - a wire color.
|
||||
*/
|
||||
/datum/wires/proc/is_dud_color(color)
|
||||
return is_dud(get_wire(color))
|
||||
|
||||
/**
|
||||
* Gets the wire associated with the color passed in.
|
||||
*
|
||||
* Arugments:
|
||||
* * color - a wire color.
|
||||
*/
|
||||
/datum/wires/proc/get_wire(color)
|
||||
return colors[color]
|
||||
|
||||
/**
|
||||
* Determines if the passed in wire is cut or not. Returns TRUE if it's cut, FALSE otherwise.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire define, NOT a color. For example `WIRE_ELECTRIFY`.
|
||||
*/
|
||||
/datum/wires/proc/is_cut(wire)
|
||||
return (wire in cut_wires)
|
||||
|
||||
/**
|
||||
* Determines if the wire associated with the passed in color, is cut or not. Returns TRUE if it's cut, FALSE otherwise.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire color.
|
||||
*/
|
||||
/datum/wires/proc/is_color_cut(color)
|
||||
return is_cut(get_wire(color))
|
||||
|
||||
/**
|
||||
* Determines if all of the wires are cut. Returns TRUE they're all cut, FALSE otherwise.
|
||||
*/
|
||||
/datum/wires/proc/is_all_cut()
|
||||
return (length(cut_wires) == length(wires))
|
||||
|
||||
/**
|
||||
* Cut or mend a wire. Calls `on_cut()`.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire define, NOT a color. For example `WIRE_ELECTRIFY`.
|
||||
*/
|
||||
/datum/wires/proc/cut(wire)
|
||||
if(is_cut(wire))
|
||||
cut_wires -= wire
|
||||
on_cut(wire, mend = TRUE)
|
||||
else
|
||||
CRASH("[colour] is not a key in wires.")
|
||||
cut_wires += wire
|
||||
on_cut(wire, mend = FALSE)
|
||||
|
||||
//
|
||||
// Is Index/Colour Cut procs
|
||||
//
|
||||
/**
|
||||
* Cut the wire which corresponds with the passed in color.
|
||||
*
|
||||
* Arugments:
|
||||
* * color - a wire color.
|
||||
*/
|
||||
/datum/wires/proc/cut_color(color)
|
||||
cut(get_wire(color))
|
||||
|
||||
/datum/wires/proc/IsColourCut(var/colour)
|
||||
var/index = GetIndex(colour)
|
||||
return IsIndexCut(index)
|
||||
/**
|
||||
* Cuts a random wire.
|
||||
*/
|
||||
/datum/wires/proc/cut_random()
|
||||
cut(wires[rand(1, length(wires))])
|
||||
|
||||
/datum/wires/proc/IsIndexCut(var/index)
|
||||
return (index & wires_status)
|
||||
/**
|
||||
* Cuts all wires.
|
||||
*/
|
||||
/datum/wires/proc/cut_all()
|
||||
for(var/wire in wires)
|
||||
cut(wire)
|
||||
|
||||
//
|
||||
// Signaller Procs
|
||||
//
|
||||
/**
|
||||
* Proc called when any wire is cut.
|
||||
*
|
||||
* Base proc, intended to be overriden.
|
||||
* Place an behavior you want to happen when certain wires are cut, into this proc.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire define, NOT color. For example 'WIRE_ELECTRIFY'.
|
||||
* * mend - TRUE if we're mending the wire. FALSE if we're cutting.
|
||||
*/
|
||||
/datum/wires/proc/on_cut(wire, mend = FALSE)
|
||||
return
|
||||
|
||||
/datum/wires/proc/IsAttached(var/colour)
|
||||
if(signallers[colour])
|
||||
return 1
|
||||
return 0
|
||||
/**
|
||||
* Pulses the given wire. Calls `on_pulse()`.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire define, NOT a color. For example `WIRE_ELECTRIFY`.
|
||||
*/
|
||||
/datum/wires/proc/pulse(wire)
|
||||
if(is_cut(wire))
|
||||
return
|
||||
on_pulse(wire)
|
||||
|
||||
/datum/wires/proc/GetAttached(var/colour)
|
||||
if(signallers[colour])
|
||||
return signallers[colour]
|
||||
/**
|
||||
* Pulses the wire associated with the given color.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire color.
|
||||
*/
|
||||
/datum/wires/proc/pulse_color(color)
|
||||
pulse(get_wire(color))
|
||||
|
||||
/**
|
||||
* Proc called when any wire is pulsed.
|
||||
*
|
||||
* Base proc, intended to be overriden.
|
||||
* Place behavior you want to happen when certain wires are pulsed, into this proc.
|
||||
*
|
||||
* Arugments:
|
||||
* * wire - a wire define, NOT color. For example 'WIRE_ELECTRIFY'.
|
||||
*/
|
||||
/datum/wires/proc/on_pulse(wire)
|
||||
return
|
||||
|
||||
/**
|
||||
* Proc called when an attached signaler receives a signal.
|
||||
*
|
||||
* Searches through the `assemblies` list for the wire that the signaler is attached to. Pulses the wire when it's found.
|
||||
*
|
||||
* Arugments:
|
||||
* * S - the attached signaler receiving the signal.
|
||||
*/
|
||||
/datum/wires/proc/pulse_assembly(obj/item/device/assembly/signaler/S)
|
||||
for(var/color in assemblies)
|
||||
if(S == assemblies[color])
|
||||
pulse_color(color)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Proc called when a mob tries to attach a signaler to a wire.
|
||||
*
|
||||
* Makes sure that `S` is actually a signaler and that something is not already attached to the wire.
|
||||
* Adds the signaler to the `assemblies` list as a value, with the `color` as a the key.
|
||||
*
|
||||
* Arguments:
|
||||
* * color - the wire color.
|
||||
* * S - the signaler that a mob is trying to attach.
|
||||
*/
|
||||
/datum/wires/proc/attach_assembly(color, obj/item/device/assembly/signaler/S)
|
||||
if(S && istype(S) && !is_attached(color))
|
||||
assemblies[color] = S
|
||||
S.forceMove(holder)
|
||||
S.connected = src
|
||||
return S
|
||||
|
||||
/**
|
||||
* Proc called when a mob tries to detach a signaler from a wire.
|
||||
*
|
||||
* First checks if there is a signaler on the wire. If so, removes the signaler, and clears it from `assemblies` list.
|
||||
*
|
||||
* Arguments:
|
||||
* * color - the wire color.
|
||||
*/
|
||||
/datum/wires/proc/detach_assembly(color)
|
||||
var/obj/item/device/assembly/signaler/S = get_attached(color)
|
||||
if(S && istype(S))
|
||||
assemblies -= color
|
||||
S.connected = null
|
||||
S.forceMove(holder.drop_location())
|
||||
return S
|
||||
|
||||
/**
|
||||
* Gets the signaler attached to the given wire color, if there is one.
|
||||
*
|
||||
* Arguments:
|
||||
* * color - the wire color.
|
||||
*/
|
||||
/datum/wires/proc/get_attached(color)
|
||||
if(assemblies[color])
|
||||
return assemblies[color]
|
||||
return null
|
||||
|
||||
/datum/wires/proc/Attach(var/colour, var/obj/item/device/assembly/signaler/S)
|
||||
if(colour && S)
|
||||
if(!IsAttached(colour))
|
||||
signallers[colour] = S
|
||||
S.loc = holder
|
||||
S.connected = src
|
||||
return S
|
||||
|
||||
/datum/wires/proc/Detach(var/colour)
|
||||
if(colour)
|
||||
var/obj/item/device/assembly/signaler/S = GetAttached(colour)
|
||||
if(S)
|
||||
signallers -= colour
|
||||
S.connected = null
|
||||
S.loc = holder.loc
|
||||
return S
|
||||
|
||||
|
||||
/datum/wires/proc/Pulse(var/obj/item/device/assembly/signaler/S)
|
||||
|
||||
for(var/colour in signallers)
|
||||
if(S == signallers[colour])
|
||||
PulseColour(colour)
|
||||
break
|
||||
|
||||
|
||||
//
|
||||
// Cut Wire Colour/Index procs
|
||||
//
|
||||
|
||||
/datum/wires/proc/CutWireColour(var/colour)
|
||||
var/index = GetIndex(colour)
|
||||
CutWireIndex(index)
|
||||
|
||||
/datum/wires/proc/CutWireIndex(var/index)
|
||||
if(IsIndexCut(index))
|
||||
wires_status &= ~index
|
||||
UpdateCut(index, 1)
|
||||
else
|
||||
wires_status |= index
|
||||
UpdateCut(index, 0)
|
||||
|
||||
/datum/wires/proc/RandomCut()
|
||||
var/r = rand(1, wires.len)
|
||||
CutWireIndex(r)
|
||||
|
||||
/datum/wires/proc/RandomCutAll(var/probability = 10)
|
||||
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
|
||||
if(prob(probability))
|
||||
CutWireIndex(i)
|
||||
|
||||
/datum/wires/proc/CutAll()
|
||||
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
|
||||
CutWireIndex(i)
|
||||
|
||||
/datum/wires/proc/IsAllCut()
|
||||
if(wires_status == (1 << wire_count) - 1)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/wires/proc/MendAll()
|
||||
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
|
||||
if(IsIndexCut(i))
|
||||
CutWireIndex(i)
|
||||
|
||||
//
|
||||
//Shuffle and Mend
|
||||
//
|
||||
|
||||
/datum/wires/proc/Shuffle()
|
||||
wires_status = 0
|
||||
GenerateWires()
|
||||
/**
|
||||
* Checks if the given wire has a signaler on it.
|
||||
*
|
||||
* Arguments:
|
||||
* * color - the wire color.
|
||||
*/
|
||||
/datum/wires/proc/is_attached(color)
|
||||
if(assemblies[color])
|
||||
return TRUE
|
||||
|
||||
@@ -32,6 +32,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg','sound/ambience/space/space_serithi.ogg','sound/music/freefallin.mid')
|
||||
base_turf = /turf/space
|
||||
ambience = AMBIENCE_SPACE
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/space/atmosalert()
|
||||
return
|
||||
@@ -69,7 +70,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
/area/shuttle
|
||||
requires_power = 0
|
||||
flags = RAD_SHIELDED
|
||||
flags = RAD_SHIELDED | AREA_FLAG_IS_NOT_PERSISTENT
|
||||
sound_env = SMALL_ENCLOSED
|
||||
base_turf = /turf/space
|
||||
forbid_events = TRUE
|
||||
@@ -210,6 +211,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "\improper Alien base"
|
||||
icon_state = "yellow"
|
||||
requires_power = 0
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
// CENTCOM
|
||||
|
||||
@@ -218,6 +220,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
icon_state = "centcom"
|
||||
requires_power = 0
|
||||
dynamic_lighting = 0
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/centcom/control
|
||||
name = "\improper CentCom Control"
|
||||
@@ -295,6 +298,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
requires_power = 0
|
||||
dynamic_lighting = 0
|
||||
ambience = AMBIENCE_HIGHSEC
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/syndicate_mothership/control
|
||||
name = "\improper Mercenary Control Room"
|
||||
@@ -311,6 +315,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
icon_state = "asteroid"
|
||||
requires_power = 0
|
||||
sound_env = ASTEROID
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/asteroid/cave // -- TLE
|
||||
name = "\improper Moon - Underground"
|
||||
@@ -334,6 +339,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
requires_power = 0
|
||||
dynamic_lighting = 0
|
||||
sound_env = ARENA
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/tdome/tdome1
|
||||
name = "\improper Thunderdome (Team 1)"
|
||||
@@ -361,6 +367,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
flags = RAD_SHIELDED
|
||||
base_turf = /turf/space
|
||||
ambience = AMBIENCE_HIGHSEC
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/syndicate_station/start
|
||||
name = "\improper Mercenary Forward Operating Base"
|
||||
@@ -416,6 +423,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
requires_power = 0
|
||||
dynamic_lighting = 0
|
||||
ambience = AMBIENCE_OTHERWORLDLY
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/skipjack_station
|
||||
name = "\improper Skipjack"
|
||||
@@ -423,6 +431,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
requires_power = 0
|
||||
base_turf = /turf/space
|
||||
ambience = AMBIENCE_HIGHSEC
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/skipjack_station/start
|
||||
name = "\improper Skipjack"
|
||||
@@ -457,6 +466,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "\improper Prison Station"
|
||||
icon_state = "brig"
|
||||
ambience = AMBIENCE_HIGHSEC
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/prison/arrival_airlock
|
||||
name = "\improper Prison Station Airlock"
|
||||
@@ -642,6 +652,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/maintenance/disposal
|
||||
name = "Waste Disposal"
|
||||
icon_state = "disposal"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT //If trash items got this far, they can be safely deleted.
|
||||
|
||||
/area/maintenance/engineering
|
||||
name = "Engineering Maintenance"
|
||||
@@ -955,10 +966,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/heads/hop
|
||||
name = "\improper Command - HoP's Office"
|
||||
icon_state = "head_quarters"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/crew_quarters/heads/hor
|
||||
name = "\improper Research - RD's Office"
|
||||
icon_state = "head_quarters"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/crew_quarters/heads/chief
|
||||
name = "\improper Engineering - CE's Office"
|
||||
@@ -971,6 +984,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/heads/cmo
|
||||
name = "\improper Medbay - CMO's Office"
|
||||
icon_state = "head_quarters"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/crew_quarters/courtroom
|
||||
name = "\improper Courtroom"
|
||||
@@ -1297,6 +1311,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
dynamic_lighting = 0
|
||||
sound_env = LARGE_ENCLOSED
|
||||
forbid_events = TRUE
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/holodeck/alphadeck
|
||||
name = "\improper Holodeck Alpha"
|
||||
@@ -1658,10 +1673,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/medical/surgery
|
||||
name = "\improper Operating Theatre 1"
|
||||
icon_state = "surgery"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT //This WOULD become a filth pit
|
||||
|
||||
/area/medical/surgery2
|
||||
name = "\improper Operating Theatre 2"
|
||||
icon_state = "surgery"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/medical/surgeryobs
|
||||
name = "\improper Operation Observation Room"
|
||||
@@ -1698,6 +1715,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/medical/sleeper
|
||||
name = "\improper Emergency Treatment Centre"
|
||||
icon_state = "exam_room"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT //Trust me.
|
||||
|
||||
/area/medical/first_aid_station_starboard
|
||||
name = "\improper Starboard First-Aid Station"
|
||||
@@ -1912,6 +1930,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/quartermaster/delivery
|
||||
name = "\improper Cargo - Delivery Office"
|
||||
icon_state = "quart"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT //So trash doesn't pile up too hard.
|
||||
|
||||
/area/quartermaster/miningdock
|
||||
name = "\improper Cargo Mining Dock"
|
||||
@@ -1951,6 +1970,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/rnd/rdoffice
|
||||
name = "\improper Research Director's Office"
|
||||
icon_state = "head_quarters"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/rnd/supermatter
|
||||
name = "\improper Supermatter Lab"
|
||||
@@ -2082,6 +2102,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "\improper Derelict Station"
|
||||
icon_state = "storage"
|
||||
ambience = AMBIENCE_RUINS
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/derelict/hallway/primary
|
||||
name = "\improper Derelict Primary Hallway"
|
||||
@@ -2182,6 +2203,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/constructionsite
|
||||
name = "\improper Construction Site"
|
||||
icon_state = "storage"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/constructionsite/storage
|
||||
name = "\improper Construction Site Storage Area"
|
||||
@@ -2367,6 +2389,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
/area/wreck
|
||||
ambience = AMBIENCE_RUINS
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/wreck/ai
|
||||
name = "\improper AI Chamber"
|
||||
@@ -2443,6 +2466,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "\improper Strange Location"
|
||||
icon_state = "away"
|
||||
ambience = AMBIENCE_FOREBODING
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/awaymission/gateway
|
||||
name = "\improper Gateway"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/area/mine
|
||||
icon_state = "mining"
|
||||
sound_env = ASTEROID
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/mine/explored
|
||||
name = "Mine"
|
||||
@@ -27,21 +28,27 @@
|
||||
/area/outpost/mining_north
|
||||
name = "North Mining Outpost"
|
||||
icon_state = "outpost_mine_north"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/outpost/mining_west
|
||||
name = "West Mining Outpost"
|
||||
icon_state = "outpost_mine_west"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/outpost/abandoned
|
||||
name = "Abandoned Outpost"
|
||||
icon_state = "dark"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
//lower level hallway
|
||||
/area/outpost/hall
|
||||
name = "Lower Level Hall"
|
||||
icon_state = "dark"
|
||||
|
||||
// Main mining outpost
|
||||
/area/outpost/mining_main
|
||||
icon_state = "outpost_mine_main"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/outpost/mining_main/airlock
|
||||
name = "Mining Outpost Airlock"
|
||||
@@ -93,6 +100,7 @@
|
||||
// Engineering Outpost
|
||||
/area/outpost/engineering
|
||||
icon_state = "outpost_engine"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/outpost/engineering/hallway
|
||||
name = "Engineering Outpost Hallway"
|
||||
@@ -166,6 +174,7 @@
|
||||
// Research Outpost
|
||||
/area/outpost/research
|
||||
icon_state = "outpost_research"
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT
|
||||
|
||||
/area/outpost/research/hallway
|
||||
name = "Research Outpost Hallway"
|
||||
|
||||
+12
-12
@@ -1,6 +1,6 @@
|
||||
/atom/movable
|
||||
layer = OBJ_LAYER
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER
|
||||
glide_size = 8
|
||||
var/last_move = null //The direction the atom last moved
|
||||
var/anchored = 0
|
||||
@@ -24,7 +24,7 @@
|
||||
var/datum/riding/riding_datum = null
|
||||
var/does_spin = TRUE // Does the atom spin when thrown (of course it does :P)
|
||||
var/movement_type = NONE
|
||||
|
||||
|
||||
var/cloaked = FALSE //If we're cloaked or not
|
||||
var/image/cloaked_selfimage //The image we use for our client to let them see where we are
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
glide_for(movetime)
|
||||
loc = newloc
|
||||
. = TRUE
|
||||
|
||||
|
||||
// So objects can be informed of z-level changes
|
||||
if (old_z != dest_z)
|
||||
onTransitZ(old_z, dest_z)
|
||||
@@ -133,7 +133,7 @@
|
||||
var/atom/movable/thing = i
|
||||
// We don't call parent so we are calling this for byond
|
||||
thing.Crossed(src)
|
||||
|
||||
|
||||
// We're a multi-tile object (multiple locs)
|
||||
else if(. && newloc)
|
||||
. = doMove(newloc)
|
||||
@@ -282,7 +282,7 @@
|
||||
glide_for(movetime)
|
||||
last_move = isnull(direction) ? 0 : direction
|
||||
loc = destination
|
||||
|
||||
|
||||
// Unset this in case it was set in some other proc. We're no longer moving diagonally for sure.
|
||||
moving_diagonally = 0
|
||||
|
||||
@@ -294,27 +294,27 @@
|
||||
// If it's not the same area, Exited() it
|
||||
if(old_area && old_area != destarea)
|
||||
old_area.Exited(src, destination)
|
||||
|
||||
|
||||
// Uncross everything where we left
|
||||
for(var/i in oldloc)
|
||||
var/atom/movable/AM = i
|
||||
if(AM == src)
|
||||
continue
|
||||
AM.Uncrossed(src)
|
||||
|
||||
|
||||
// Information about turf and z-levels for source and dest collected
|
||||
var/turf/oldturf = get_turf(oldloc)
|
||||
var/turf/destturf = get_turf(destination)
|
||||
var/old_z = (oldturf ? oldturf.z : null)
|
||||
var/dest_z = (destturf ? destturf.z : null)
|
||||
|
||||
|
||||
// So objects can be informed of z-level changes
|
||||
if (old_z != dest_z)
|
||||
onTransitZ(old_z, dest_z)
|
||||
|
||||
|
||||
// Destination atom Entered
|
||||
destination.Entered(src, oldloc)
|
||||
|
||||
|
||||
// Entered() the new area if it's not the same area
|
||||
if(destarea && old_area != destarea)
|
||||
destarea.Entered(src, oldloc)
|
||||
@@ -366,7 +366,7 @@
|
||||
glide_size = initial(glide_size)
|
||||
else
|
||||
glide_size = initial(glide_size)
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
//called when src is thrown into hit_atom
|
||||
@@ -623,7 +623,7 @@
|
||||
/atom/movable/proc/cloak_animation(var/length = 1 SECOND)
|
||||
//Save these
|
||||
var/initial_alpha = alpha
|
||||
|
||||
|
||||
//Animate alpha fade
|
||||
animate(src, alpha = 0, time = length)
|
||||
|
||||
|
||||
@@ -182,20 +182,20 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
add = 0
|
||||
if(add && TurfBlockedNonWindow(t))
|
||||
add = 0
|
||||
for(var/obj/O in t)
|
||||
if(!O.density)
|
||||
for(var/obj/O in t)
|
||||
if(O.density)
|
||||
add = 0
|
||||
break
|
||||
if(istype(O, /obj/machinery/door))
|
||||
//not sure why this doesn't fire on LinkBlocked()
|
||||
add = 0
|
||||
break
|
||||
for(var/type in allowed)
|
||||
if (istype(O, type))
|
||||
add = 1
|
||||
break
|
||||
if(istype(O, /obj/machinery/door))
|
||||
//not sure why this doesn't fire on LinkBlocked()
|
||||
add = 0
|
||||
break
|
||||
for(var/type in allowed)
|
||||
if (istype(O, type))
|
||||
add = 1
|
||||
break
|
||||
if(!add)
|
||||
break
|
||||
if(!add)
|
||||
break
|
||||
if(add)
|
||||
L.Add(t)
|
||||
return L
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
src.invisibility = INVISIBILITY_MAXIMUM
|
||||
density = 0
|
||||
|
||||
/obj/machinery/cooker/cultify()
|
||||
/obj/machinery/appliance/cooker/cultify()
|
||||
new /obj/structure/cult/talisman(loc)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -16,4 +16,15 @@ var/const/access_pilot = 67
|
||||
id = access_talon
|
||||
desc = "Talon"
|
||||
access_type = ACCESS_TYPE_PRIVATE
|
||||
|
||||
|
||||
/var/const/access_xenobotany = 77
|
||||
/datum/access/xenobotany
|
||||
id = access_xenobotany
|
||||
desc = "Xenobotany Garden"
|
||||
region = ACCESS_REGION_RESEARCH
|
||||
|
||||
/var/const/access_entertainment = 72
|
||||
/datum/access/entertainment
|
||||
id = access_entertainment
|
||||
desc = "Entertainment Backstage"
|
||||
region = ACCESS_REGION_GENERAL
|
||||
@@ -65,7 +65,7 @@
|
||||
department_flag = CIVILIAN
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 1
|
||||
spawn_positions = 2
|
||||
supervisors = "the Head of Personnel"
|
||||
selection_color = "#515151"
|
||||
access = list(access_hydroponics, access_bar, access_kitchen)
|
||||
|
||||
@@ -57,3 +57,39 @@
|
||||
/datum/job/chaplain
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////
|
||||
// Entertainer
|
||||
//////////////////////////////////
|
||||
|
||||
/datum/job/entertainer
|
||||
title = "Entertainer"
|
||||
flag = ENTERTAINER
|
||||
departments = list(DEPARTMENT_CIVILIAN)
|
||||
department_flag = CIVILIAN
|
||||
faction = "Station"
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
supervisors = "the Head of Personnel"
|
||||
selection_color = "#515151"
|
||||
access = list(access_entertainment)
|
||||
minimal_access = list(access_entertainment)
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
outfit_type = /decl/hierarchy/outfit/job/assistant
|
||||
job_description = "An entertainer does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic."
|
||||
alt_titles = list("Performer" = /datum/alt_title/performer, "Musician" = /datum/alt_title/musician, "Stagehand" = /datum/alt_title/stagehand)
|
||||
|
||||
// Entertainer Alt Titles
|
||||
/datum/alt_title/performer
|
||||
title = "Performer"
|
||||
title_blurb = "A Performer is someone who performs! Acting, dancing, wrestling, etc!"
|
||||
|
||||
/datum/alt_title/musician
|
||||
title = "Musician"
|
||||
title_blurb = "A Musician is someone who makes music! Singing, playing instruments, slam poetry, it's your call!"
|
||||
|
||||
/datum/alt_title/stagehand
|
||||
title = "Stagehand"
|
||||
title_blurb = "A Stagehand typically performs everything the rest of the entertainers don't. Operate lights, shutters, windows, or narrate through your voicebox!"
|
||||
@@ -39,7 +39,7 @@
|
||||
// Research Director Alt Titles
|
||||
/datum/alt_title/research_supervisor
|
||||
title = "Research Supervisor"
|
||||
|
||||
|
||||
//////////////////////////////////
|
||||
// Scientist
|
||||
//////////////////////////////////
|
||||
@@ -105,13 +105,15 @@
|
||||
outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
|
||||
job_description = "A Xenobiologist studies esoteric lifeforms, usually in the relative safety of their lab. They attempt to find ways to benefit \
|
||||
from the byproducts of these lifeforms, and their main subject at present is the Giant Slime."
|
||||
/*VR edit start
|
||||
alt_titles = list("Xenobotanist" = /datum/alt_title/xenobot)
|
||||
|
||||
// Xenibiologist Alt Titles
|
||||
Xenibiologist Alt Titles
|
||||
/datum/alt_title/xenobot
|
||||
title = "Xenobotanist"
|
||||
title_blurb = "A Xenobotanist grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \
|
||||
is both safe and beneficial to the station, they may choose to introduce it to the rest of the crew."
|
||||
VR edit end*/
|
||||
|
||||
//////////////////////////////////
|
||||
// Roboticist
|
||||
|
||||
@@ -31,4 +31,28 @@
|
||||
|
||||
/datum/job/roboticist
|
||||
total_positions = 3
|
||||
pto_type = PTO_SCIENCE
|
||||
pto_type = PTO_SCIENCE
|
||||
|
||||
//////////////////////////////////
|
||||
// Xenobotanist
|
||||
//////////////////////////////////
|
||||
/datum/job/xenobotanist
|
||||
title = "Xenobotanist"
|
||||
flag = XENOBOTANIST
|
||||
departments = list(DEPARTMENT_RESEARCH)
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the Research Director"
|
||||
selection_color = "#633D63"
|
||||
economic_modifier = 7
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobotany, access_hydroponics)
|
||||
minimal_access = list(access_research, access_xenobotany, access_hydroponics, access_tox_storage)
|
||||
pto_type = PTO_SCIENCE
|
||||
|
||||
minimal_player_age = 14
|
||||
|
||||
outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
|
||||
job_description = "A Xenobotanist grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \
|
||||
are both safe and beneficial to the station, they may choose to introduce it to the rest of the crew."
|
||||
@@ -84,10 +84,10 @@
|
||||
supervisors = "the spirit of laughter"
|
||||
selection_color = "#515151"
|
||||
economic_modifier = 1
|
||||
access = list()
|
||||
minimal_access = list()
|
||||
access = list(access_entertainment)
|
||||
minimal_access = list(access_entertainment)
|
||||
job_description = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!"
|
||||
alt_titles = list("Clown" = /datum/alt_title/clown, "Comedian" = /datum/alt_title/comedian, "Jester" = /datum/alt_title/jester)
|
||||
alt_titles = list("Clown" = /datum/alt_title/clown, "Jester" = /datum/alt_title/jester)
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/clown
|
||||
@@ -96,9 +96,6 @@
|
||||
/datum/alt_title/clown
|
||||
title = "Clown"
|
||||
|
||||
/datum/alt_title/comedian
|
||||
title = "Comedian"
|
||||
|
||||
/datum/alt_title/jester
|
||||
title = "Jester"
|
||||
|
||||
@@ -119,10 +116,10 @@
|
||||
supervisors = "the spirit of performance"
|
||||
selection_color = "#515151"
|
||||
economic_modifier = 1
|
||||
access = list()
|
||||
minimal_access = list()
|
||||
access = list(access_entertainment)
|
||||
minimal_access = list(access_entertainment)
|
||||
job_description = "A Mime is there to entertain the crew and keep high morale using unbelievable performances and acting skills!"
|
||||
alt_titles = list("Mime" = /datum/alt_title/mime, "Performer" = /datum/alt_title/performer, "Interpretive Dancer" = /datum/alt_title/interpretive_dancer)
|
||||
alt_titles = list("Mime" = /datum/alt_title/mime, "Interpretive Dancer" = /datum/alt_title/interpretive_dancer)
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/mime
|
||||
@@ -131,9 +128,6 @@
|
||||
/datum/alt_title/mime
|
||||
title = "Mime"
|
||||
|
||||
/datum/alt_title/performer
|
||||
title = "Performer"
|
||||
|
||||
/datum/alt_title/interpretive_dancer
|
||||
title = "Interpretive Dancer"
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ var/const/PSYCHIATRIST =(1<<7)
|
||||
var/const/ROBOTICIST =(1<<8)
|
||||
var/const/XENOBIOLOGIST =(1<<9)
|
||||
var/const/PARAMEDIC =(1<<10)
|
||||
var/const/XENOBOTANIST =(1<<15) //VOREStation Add
|
||||
|
||||
var/const/CIVILIAN =(1<<2)
|
||||
|
||||
@@ -46,6 +47,7 @@ var/const/ASSISTANT =(1<<11)
|
||||
var/const/BRIDGE =(1<<12)
|
||||
var/const/CLOWN =(1<<13) //VOREStation Add
|
||||
var/const/MIME =(1<<14) //VOREStation Add
|
||||
var/const/ENTERTAINER =(1<<15) //VOREStation Add
|
||||
|
||||
var/list/assistant_occupations = list(
|
||||
)
|
||||
|
||||
@@ -773,7 +773,7 @@
|
||||
to_chat(user, "It does nothing.")
|
||||
return
|
||||
else
|
||||
if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
|
||||
if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN))
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the Air Alarm interface.</span>")
|
||||
else
|
||||
|
||||
@@ -42,24 +42,6 @@
|
||||
|
||||
var/list/camera_computers_using_this = list()
|
||||
|
||||
/obj/machinery/camera/apply_visual(mob/living/carbon/human/M)
|
||||
if(!M.client)
|
||||
return
|
||||
M.overlay_fullscreen("fishbed",/obj/screen/fullscreen/fishbed)
|
||||
M.overlay_fullscreen("scanlines",/obj/screen/fullscreen/scanline)
|
||||
M.overlay_fullscreen("whitenoise",/obj/screen/fullscreen/noise)
|
||||
M.machine_visual = src
|
||||
return 1
|
||||
|
||||
/obj/machinery/camera/remove_visual(mob/living/carbon/human/M)
|
||||
if(!M.client)
|
||||
return
|
||||
M.clear_fullscreen("fishbed",0)
|
||||
M.clear_fullscreen("scanlines")
|
||||
M.clear_fullscreen("whitenoise")
|
||||
M.machine_visual = null
|
||||
return 1
|
||||
|
||||
/obj/machinery/camera/New()
|
||||
wires = new(src)
|
||||
assembly = new(src)
|
||||
@@ -232,12 +214,6 @@
|
||||
else
|
||||
to_chat(O, "<b><a href='byond://?src=\ref[O];track2=\ref[O];track=\ref[U];trackname=[U.name]'>[U]</a></b> holds \a [itemname] up to one of your cameras ...")
|
||||
O << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", itemname, info), text("window=[]", itemname))
|
||||
for(var/mob/O in player_list)
|
||||
if (istype(O.machine, /obj/machinery/computer/security))
|
||||
var/obj/machinery/computer/security/S = O.machine
|
||||
if (S.current_camera == src)
|
||||
to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...")
|
||||
O << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", itemname, info), text("window=[]", itemname))
|
||||
|
||||
else if (istype(W, /obj/item/weapon/camera_bug))
|
||||
if (!src.can_use())
|
||||
@@ -298,7 +274,7 @@
|
||||
//Used when someone breaks a camera
|
||||
/obj/machinery/camera/proc/destroy()
|
||||
stat |= BROKEN
|
||||
wires.RandomCutAll()
|
||||
wires.cut_all()
|
||||
|
||||
triggerCameraAlarm()
|
||||
update_icon()
|
||||
@@ -333,7 +309,7 @@
|
||||
camera_alarm.triggerAlarm(loc, src, duration)
|
||||
|
||||
/obj/machinery/camera/proc/cancelCameraAlarm()
|
||||
if(wires.IsIndexCut(CAMERA_WIRE_ALARM))
|
||||
if(wires.is_cut(WIRE_CAM_ALARM))
|
||||
return
|
||||
|
||||
alarm_on = 0
|
||||
@@ -494,15 +470,12 @@
|
||||
else
|
||||
cameranet.updateVisibility(src, 0)
|
||||
|
||||
invalidateCameraCache()
|
||||
|
||||
// Resets the camera's wires to fully operational state. Used by one of Malfunction abilities.
|
||||
/obj/machinery/camera/proc/reset_wires()
|
||||
if(!wires)
|
||||
return
|
||||
if (stat & BROKEN) // Fix the camera
|
||||
stat &= ~BROKEN
|
||||
wires.CutAll()
|
||||
wires.MendAll()
|
||||
wires.repair()
|
||||
update_icon()
|
||||
update_coverage()
|
||||
|
||||
@@ -189,7 +189,6 @@ var/global/list/engineering_networks = list(
|
||||
var/number = my_area.len
|
||||
|
||||
c_tag = "[A.name] #[number]"
|
||||
invalidateCameraCache()
|
||||
|
||||
/obj/machinery/camera/autoname/Destroy()
|
||||
var/area/A = get_area(src)
|
||||
|
||||
@@ -1,142 +1,132 @@
|
||||
/obj/machinery/computer/aifixer
|
||||
name = "\improper AI system integrity restorer"
|
||||
desc = "Restores AI units to working condition, assuming you have one inside!"
|
||||
icon_keyboard = "rd_key"
|
||||
icon_screen = "ai-fixer"
|
||||
light_color = "#a97faa"
|
||||
circuit = /obj/item/weapon/circuitboard/aifixer
|
||||
desc = "Used with intelliCards containing nonfunctional AIs to restore them to working order."
|
||||
req_one_access = list(access_robotics, access_heads)
|
||||
var/mob/living/silicon/ai/occupant = null
|
||||
var/active = 0
|
||||
circuit = /obj/item/weapon/circuitboard/aifixer
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "ai-fixer"
|
||||
light_color = LIGHT_COLOR_PINK
|
||||
|
||||
active_power_usage = 1000
|
||||
|
||||
/obj/machinery/computer/aifixer/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/aifixer/proc/load_ai(var/mob/living/silicon/ai/transfer, var/obj/item/device/aicard/card, var/mob/user)
|
||||
|
||||
if(!transfer)
|
||||
return
|
||||
|
||||
// Transfer over the AI.
|
||||
to_chat(transfer, "You have been transferred into a stationary terminal. Sadly, there is no remote access from here.")
|
||||
to_chat(user, "<span class='notice'>Transfer successful:</span> [transfer.name] placed within stationary terminal.")
|
||||
|
||||
transfer.loc = src
|
||||
transfer.cancel_camera()
|
||||
transfer.control_disabled = 1
|
||||
occupant = transfer
|
||||
|
||||
if(card)
|
||||
card.clear()
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob)
|
||||
/// Variable containing transferred AI
|
||||
var/mob/living/silicon/ai/occupier
|
||||
/// Variable dictating if we are in the process of restoring the occupier AI
|
||||
var/restoring = FALSE
|
||||
|
||||
/obj/machinery/computer/aifixer/attackby(obj/item/I, mob/living/user)
|
||||
if(I.is_screwdriver())
|
||||
if(occupier)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
to_chat(user, "<span class='warning'>The screws on [name]'s screen won't budge.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The screws on [name]'s screen won't budge and it emits a warning beep.</span>")
|
||||
return
|
||||
if(istype(I, /obj/item/device/aicard))
|
||||
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
to_chat(user, "This terminal isn't functioning right now.")
|
||||
to_chat(user, "<span class='warning'>This terminal isn't functioning right now.</span>")
|
||||
return
|
||||
if(restoring)
|
||||
to_chat(user, "<span class='danger'>Terminal is busy restoring [occupier] right now.</span>")
|
||||
return
|
||||
|
||||
var/obj/item/device/aicard/card = I
|
||||
var/mob/living/silicon/ai/comp_ai = locate() in src
|
||||
var/mob/living/silicon/ai/card_ai = locate() in card
|
||||
if(occupier)
|
||||
if(card.grab_ai(occupier, user))
|
||||
occupier = null
|
||||
else if(card.carded_ai)
|
||||
var/mob/living/silicon/ai/new_occupant = card.carded_ai
|
||||
to_chat(new_occupant, "<span class='notice'>You have been transferred into a stationary terminal. Sadly there is no remote access from here.</span>")
|
||||
to_chat(user, "<span class='notice'>Transfer Successful:</span> [new_occupant] placed within stationary terminal.")
|
||||
new_occupant.forceMove(src)
|
||||
new_occupant.cancel_camera()
|
||||
new_occupant.control_disabled = TRUE
|
||||
occupier = new_occupant
|
||||
card.clear()
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There is no AI loaded onto this computer, and no AI loaded onto [I]. What exactly are you trying to do here?</span>")
|
||||
return ..()
|
||||
|
||||
if(istype(comp_ai))
|
||||
if(active)
|
||||
to_chat(user, "<span class='danger'>ERROR:</span> Reconstruction in progress.")
|
||||
return
|
||||
card.grab_ai(comp_ai, user)
|
||||
if(!(locate(/mob/living/silicon/ai) in src)) occupant = null
|
||||
else if(istype(card_ai))
|
||||
load_ai(card_ai,card,user)
|
||||
occupant = locate(/mob/living/silicon/ai) in src
|
||||
|
||||
update_icon()
|
||||
/obj/machinery/computer/aifixer/attack_hand(mob/user)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
..()
|
||||
return
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
/obj/machinery/computer/aifixer/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "AiRestorer", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob)
|
||||
/obj/machinery/computer/aifixer/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["ejectable"] = FALSE
|
||||
data["AI_present"] = FALSE
|
||||
data["error"] = null
|
||||
if(!occupier)
|
||||
data["error"] = "Please transfer an AI unit."
|
||||
else
|
||||
data["AI_present"] = TRUE
|
||||
data["name"] = occupier.name
|
||||
data["restoring"] = restoring
|
||||
data["health"] = (occupier.health + 100) / 2
|
||||
data["isDead"] = occupier.stat == DEAD
|
||||
var/list/laws = list()
|
||||
for(var/datum/ai_law/law in occupier.laws.all_laws())
|
||||
laws += "[law.get_index()]: [law.law]"
|
||||
data["laws"] = laws
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/aifixer/tgui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
if(!occupier)
|
||||
restoring = FALSE
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat = "<h3>AI System Integrity Restorer</h3><br><br>"
|
||||
switch(action)
|
||||
if("PRG_beginReconstruction")
|
||||
if(occupier?.health < 100)
|
||||
to_chat(usr, "<span class='notice'>Reconstruction in progress. This will take several minutes.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 25, FALSE)
|
||||
restoring = TRUE
|
||||
var/mob/observer/dead/ghost = occupier.get_ghost()
|
||||
if(ghost)
|
||||
ghost.notify_revive("Your core files are being restored!", source = src)
|
||||
. = TRUE
|
||||
|
||||
if (src.occupant)
|
||||
var/laws
|
||||
dat += "Stored AI: [src.occupant.name]<br>System integrity: [src.occupant.hardware_integrity()]%<br>Backup Capacitor: [src.occupant.backup_capacitor()]%<br>"
|
||||
/obj/machinery/computer/aifixer/proc/Fix()
|
||||
use_power(active_power_usage)
|
||||
occupier.adjustOxyLoss(-5, 0, FALSE)
|
||||
occupier.adjustFireLoss(-5, 0, FALSE)
|
||||
occupier.adjustBruteLoss(-5, 0)
|
||||
if(occupier.health >= 0 && occupier.stat == DEAD)
|
||||
occupier.revive()
|
||||
|
||||
for (var/datum/ai_law/law in occupant.laws.all_laws())
|
||||
laws += "[law.get_index()]: [law.law]<BR>"
|
||||
|
||||
dat += "Laws:<br>[laws]<br>"
|
||||
|
||||
if (src.occupant.stat == 2)
|
||||
dat += "<b>AI nonfunctional</b>"
|
||||
else
|
||||
dat += "<b>AI functional</b>"
|
||||
if (!src.active)
|
||||
dat += {"<br><br><A href='byond://?src=\ref[src];fix=1'>Begin Reconstruction</A>"}
|
||||
else
|
||||
dat += "<br><br>Reconstruction in process, please wait.<br>"
|
||||
dat += {" <A href='?src=\ref[user];mach_close=computer'>Close</A>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=400x500")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
return occupier.health < 100
|
||||
|
||||
/obj/machinery/computer/aifixer/process()
|
||||
if(..())
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if (href_list["fix"])
|
||||
src.active = 1
|
||||
src.overlays += image(icon, "ai-fixer-on")
|
||||
while (src.occupant.getOxyLoss() > 0 || src.occupant.getFireLoss() > 0 || src.occupant.getToxLoss() > 0 || src.occupant.getBruteLoss() > 0)
|
||||
src.occupant.adjustOxyLoss(-1)
|
||||
src.occupant.adjustFireLoss(-1)
|
||||
src.occupant.adjustToxLoss(-1)
|
||||
src.occupant.adjustBruteLoss(-1)
|
||||
src.occupant.updatehealth()
|
||||
if (src.occupant.health >= 0 && src.occupant.stat == DEAD)
|
||||
src.occupant.set_stat(CONSCIOUS)
|
||||
src.occupant.lying = 0
|
||||
dead_mob_list -= src.occupant
|
||||
living_mob_list += src.occupant
|
||||
src.overlays -= image(icon, "ai-fixer-404")
|
||||
src.overlays += image(icon, "ai-fixer-full")
|
||||
src.occupant.add_ai_verbs()
|
||||
src.updateUsrDialog()
|
||||
sleep(10)
|
||||
src.active = 0
|
||||
src.overlays -= image(icon, "ai-fixer-on")
|
||||
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
if(restoring)
|
||||
var/oldstat = occupier.stat
|
||||
restoring = Fix()
|
||||
if(oldstat != occupier.stat)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/aifixer/update_icon()
|
||||
..()
|
||||
if((stat & BROKEN) || (stat & NOPOWER))
|
||||
. = ..()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
if(occupant.stat)
|
||||
add_overlay("ai-fixer-404")
|
||||
else
|
||||
add_overlay("ai-fixer-full")
|
||||
if(restoring)
|
||||
. += "ai-fixer-on"
|
||||
if (occupier)
|
||||
switch (occupier.stat)
|
||||
if (CONSCIOUS)
|
||||
. += "ai-fixer-full"
|
||||
if (UNCONSCIOUS)
|
||||
. += "ai-fixer-404"
|
||||
else
|
||||
add_overlay("ai-fixer-empty")
|
||||
. += "ai-fixer-empty"
|
||||
@@ -3,201 +3,44 @@
|
||||
/obj/machinery/computer/security
|
||||
name = "security camera monitor"
|
||||
desc = "Used to access the various cameras on the station."
|
||||
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "cameras"
|
||||
light_color = "#a91515"
|
||||
var/current_network = null
|
||||
var/obj/machinery/camera/current_camera = null
|
||||
var/last_pic = 1.0
|
||||
var/list/network
|
||||
var/mapping = 0//For the overview file, interesting bit of code.
|
||||
var/cache_id = 0
|
||||
circuit = /obj/item/weapon/circuitboard/security
|
||||
|
||||
/obj/machinery/computer/security/New()
|
||||
if(!network)
|
||||
var/mapping = 0//For the overview file, interesting bit of code.
|
||||
var/list/network = list()
|
||||
|
||||
var/datum/tgui_module/camera/camera
|
||||
|
||||
/obj/machinery/computer/security/Initialize()
|
||||
. = ..()
|
||||
if(!LAZYLEN(network))
|
||||
network = using_map.station_networks.Copy()
|
||||
..()
|
||||
if(network.len)
|
||||
current_network = network[1]
|
||||
camera = new(src, network)
|
||||
|
||||
/obj/machinery/computer/security/attack_ai(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
/obj/machinery/computer/security/Destroy()
|
||||
QDEL_NULL(camera)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/security/check_eye(var/mob/user as mob)
|
||||
if (user.stat || ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded) && !istype(user, /mob/living/silicon))) //user can't see - not sure why canmove is here.
|
||||
return -1
|
||||
if(!current_camera)
|
||||
return 0
|
||||
var/viewflag = current_camera.check_eye(user)
|
||||
if ( viewflag < 0 ) //camera doesn't work
|
||||
reset_current()
|
||||
return viewflag
|
||||
/obj/machinery/computer/security/tgui_interact(mob/user, datum/tgui/ui = null)
|
||||
camera.tgui_interact(user, ui)
|
||||
|
||||
/obj/machinery/computer/security/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
|
||||
if(stat & (NOPOWER|BROKEN)) return
|
||||
if(user.stat) return
|
||||
|
||||
var/data[0]
|
||||
|
||||
data["current_camera"] = current_camera ? current_camera.nano_structure() : null
|
||||
data["current_network"] = current_network
|
||||
data["networks"] = network ? network : list()
|
||||
|
||||
var/map_levels = using_map.get_map_levels(src.z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)
|
||||
data["map_levels"] = map_levels
|
||||
|
||||
if(current_network)
|
||||
data["cameras"] = camera_repository.cameras_in_network(current_network, map_levels)
|
||||
if(current_camera)
|
||||
switch_to_camera(user, current_camera)
|
||||
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800)
|
||||
|
||||
// adding a template with the key "mapContent" enables the map ui functionality
|
||||
ui.add_template("mapContent", "sec_camera_map_content.tmpl")
|
||||
// adding a template with the key "mapHeader" replaces the map header content
|
||||
ui.add_template("mapHeader", "sec_camera_map_header.tmpl")
|
||||
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/security/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["switch_camera"])
|
||||
if(stat&(NOPOWER|BROKEN)) return //VOREStation Edit - Removed zlevel check
|
||||
if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return
|
||||
var/obj/machinery/camera/C = locate(href_list["switch_camera"]) in cameranet.cameras
|
||||
if(!C)
|
||||
return
|
||||
if(!(current_network in C.network))
|
||||
return
|
||||
|
||||
switch_to_camera(usr, C)
|
||||
return 1
|
||||
else if(href_list["switch_network"])
|
||||
if(stat&(NOPOWER|BROKEN)) return //VOREStation Edit - Removed zlevel check
|
||||
if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return
|
||||
if(href_list["switch_network"] in network)
|
||||
current_network = href_list["switch_network"]
|
||||
return 1
|
||||
else if(href_list["reset"])
|
||||
if(stat&(NOPOWER|BROKEN)) return //VOREStation Edit - Removed zlevel check
|
||||
if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return
|
||||
reset_current()
|
||||
usr.reset_view(current_camera)
|
||||
return 1
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/computer/security/attack_hand(var/mob/user as mob)
|
||||
if(stat & (NOPOWER|BROKEN)) return
|
||||
|
||||
if(!isAI(user))
|
||||
user.set_machine(src)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/computer/security/proc/switch_to_camera(var/mob/user, var/obj/machinery/camera/C)
|
||||
//don't need to check if the camera works for AI because the AI jumps to the camera location and doesn't actually look through cameras.
|
||||
if(isAI(user))
|
||||
var/mob/living/silicon/ai/A = user
|
||||
// Only allow non-carded AIs to view because the interaction with the eye gets all wonky otherwise.
|
||||
if(!A.is_in_chassis())
|
||||
return 0
|
||||
|
||||
A.eyeobj.setLoc(get_turf(C))
|
||||
A.client.eye = A.eyeobj
|
||||
return 1
|
||||
|
||||
if (!C.can_use() || user.stat || (get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) && !istype(user, /mob/living/silicon)))
|
||||
return 0
|
||||
set_current(C)
|
||||
user.reset_view(current_camera)
|
||||
check_eye(user)
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/security/relaymove(mob/user,direct)
|
||||
var/turf/T = get_turf(current_camera)
|
||||
for(var/i; i < 10; i++)
|
||||
T = get_step(T, direct)
|
||||
jump_on_click(user, T)
|
||||
|
||||
//Camera control: moving.
|
||||
/obj/machinery/computer/security/proc/jump_on_click(var/mob/user,var/A)
|
||||
if(user.machine != src)
|
||||
/obj/machinery/computer/security/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
var/obj/machinery/camera/jump_to
|
||||
if(istype(A,/obj/machinery/camera))
|
||||
jump_to = A
|
||||
else if(ismob(A))
|
||||
if(ishuman(A))
|
||||
jump_to = locate() in A:head
|
||||
else if(isrobot(A))
|
||||
jump_to = A:camera
|
||||
else if(isobj(A))
|
||||
jump_to = locate() in A
|
||||
else if(isturf(A))
|
||||
var/best_dist = INFINITY
|
||||
for(var/obj/machinery/camera/camera in get_area(A))
|
||||
if(!camera.can_use())
|
||||
continue
|
||||
if(!can_access_camera(camera))
|
||||
continue
|
||||
var/dist = get_dist(camera,A)
|
||||
if(dist < best_dist)
|
||||
best_dist = dist
|
||||
jump_to = camera
|
||||
if(isnull(jump_to))
|
||||
return
|
||||
if(can_access_camera(jump_to))
|
||||
switch_to_camera(user,jump_to)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/computer/security/process()
|
||||
if(cache_id != camera_repository.camera_cache_id)
|
||||
cache_id = camera_repository.camera_cache_id
|
||||
SSnanoui.update_uis(src)
|
||||
/obj/machinery/computer/security/attack_ai(mob/user)
|
||||
to_chat(user, "<span class='notice'>You realise its kind of stupid to access a camera console when you have the entire camera network at your metaphorical fingertips</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/security/proc/can_access_camera(var/obj/machinery/camera/C)
|
||||
var/list/shared_networks = src.network & C.network
|
||||
if(shared_networks.len)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/computer/security/proc/set_current(var/obj/machinery/camera/C)
|
||||
if(current_camera == C)
|
||||
return
|
||||
|
||||
if(current_camera)
|
||||
reset_current()
|
||||
|
||||
src.current_camera = C
|
||||
if(current_camera)
|
||||
current_camera.camera_computers_using_this.Add(src)
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
var/mob/living/L = current_camera.loc
|
||||
if(istype(L))
|
||||
L.tracking_initiated()
|
||||
|
||||
/obj/machinery/computer/security/proc/reset_current()
|
||||
if(current_camera)
|
||||
current_camera.camera_computers_using_this.Remove(src)
|
||||
var/mob/living/L = current_camera.loc
|
||||
if(istype(L))
|
||||
L.tracking_cancelled()
|
||||
current_camera = null
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
|
||||
//Camera control: mouse.
|
||||
/* Oh my god
|
||||
/atom/DblClick()
|
||||
..()
|
||||
if(istype(usr.machine,/obj/machinery/computer/security))
|
||||
var/obj/machinery/computer/security/console = usr.machine
|
||||
console.jump_on_click(usr,src)
|
||||
*/
|
||||
/obj/machinery/computer/security/proc/set_network(list/new_network)
|
||||
network = new_network
|
||||
camera.network = network
|
||||
camera.access_based = FALSE
|
||||
|
||||
//Camera control: arrow keys.
|
||||
/obj/machinery/computer/security/telescreen
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
|
||||
//the researchable camera circuit that can connect to any camera network
|
||||
|
||||
/obj/item/weapon/circuitboard/camera
|
||||
//name = "Circuit board (Camera)"
|
||||
var/secured = 1
|
||||
var/authorised = 0
|
||||
var/possibleNets[0]
|
||||
var/network = ""
|
||||
build_path = null
|
||||
|
||||
//when adding a new camera network, you should only need to update these two procs
|
||||
New()
|
||||
possibleNets["Engineering"] = access_ce
|
||||
possibleNets["SS13"] = access_hos
|
||||
possibleNets["Mining"] = access_mining
|
||||
possibleNets["Cargo"] = access_qm
|
||||
possibleNets["Research"] = access_rd
|
||||
possibleNets["Medbay"] = access_cmo
|
||||
..()
|
||||
|
||||
proc/updateBuildPath()
|
||||
build_path = null
|
||||
if(authorised && secured)
|
||||
switch(network)
|
||||
if("SS13")
|
||||
build_path = /obj/machinery/computer/security
|
||||
if("Engineering")
|
||||
build_path = /obj/machinery/computer/security/engineering
|
||||
if("Mining")
|
||||
build_path = /obj/machinery/computer/security/mining
|
||||
if("Research")
|
||||
build_path = /obj/machinery/computer/security/research
|
||||
if("Medbay")
|
||||
build_path = /obj/machinery/computer/security/medbay
|
||||
if("Cargo")
|
||||
build_path = /obj/machinery/computer/security/cargo
|
||||
|
||||
attackby(var/obj/item/I, var/mob/user)//if(health > 50)
|
||||
..()
|
||||
else if(I.is_screwdriver())
|
||||
secured = !secured
|
||||
user.visible_message("<span class='notice'>The [src] can [secured ? "no longer" : "now"] be modified.</span>")
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
updateBuildPath()
|
||||
return
|
||||
|
||||
attack_self(var/mob/user)
|
||||
if(!secured && ishuman(user))
|
||||
user.machine = src
|
||||
interact(user, 0)
|
||||
|
||||
proc/interact(var/mob/user, var/ai=0)
|
||||
if(secured)
|
||||
return
|
||||
if (!ishuman(user))
|
||||
return ..(user)
|
||||
var/t = "<B>Circuitboard Console - Camera Monitoring Computer</B><BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
t += "<hr> Please select a camera network:<br>"
|
||||
|
||||
for(var/curNet in possibleNets)
|
||||
if(network == curNet)
|
||||
t += "- [curNet]<br>"
|
||||
else
|
||||
t += "- <A href='?src=\ref[src];net=[curNet]'>[curNet]</A><BR>"
|
||||
t += "<hr>"
|
||||
if(network)
|
||||
if(authorised)
|
||||
t += "Authenticated <A href='?src=\ref[src];removeauth=1'>(Clear Auth)</A><BR>"
|
||||
else
|
||||
t += "<A href='?src=\ref[src];auth=1'><b>*Authenticate*</b></A> (Requires an appropriate access ID)<br>"
|
||||
else
|
||||
t += "<A href='?src=\ref[src];auth=1'>*Authenticate*</A> (Requires an appropriate access ID)<BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
user << browse(t, "window=camcircuit;size=500x400")
|
||||
onclose(user, "camcircuit")
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=camcircuit")
|
||||
usr.machine = null
|
||||
return
|
||||
else if(href_list["net"])
|
||||
network = href_list["net"]
|
||||
authorised = 0
|
||||
else if( href_list["auth"] )
|
||||
var/mob/M = usr
|
||||
var/obj/item/weapon/card/id/I = M.equipped()
|
||||
if (istype(I, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/pda = I
|
||||
I = pda.id
|
||||
if (I && istype(I))
|
||||
if(access_captain in I.access)
|
||||
authorised = 1
|
||||
else if (possibleNets[network] in I.access)
|
||||
authorised = 1
|
||||
if(istype(I,/obj/item/weapon/card/emag))
|
||||
I.resolve_attackby(src, usr)
|
||||
else if( href_list["removeauth"] )
|
||||
authorised = 0
|
||||
updateDialog()
|
||||
|
||||
updateDialog()
|
||||
if(istype(src.loc,/mob))
|
||||
attack_self(src.loc)
|
||||
|
||||
/obj/item/weapon/circuitboard/camera/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(network)
|
||||
authorised = 1
|
||||
to_chat(user, "<span class='notice'>You authorised the circuit network!</span>")
|
||||
updateDialog()
|
||||
return 1
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You must select a camera network circuit!</span>")
|
||||
@@ -8,7 +8,7 @@
|
||||
idle_power_usage = 250
|
||||
active_power_usage = 500
|
||||
circuit = /obj/item/weapon/circuitboard/crew
|
||||
var/datum/nano_module/program/crew_monitor/crew_monitor
|
||||
var/datum/tgui_module/crew_monitor/crew_monitor
|
||||
|
||||
/obj/machinery/computer/crew/New()
|
||||
crew_monitor = new(src)
|
||||
@@ -20,16 +20,16 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/crew/attack_ai(mob/user)
|
||||
ui_interact(user)
|
||||
attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/crew/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
ui_interact(user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
crew_monitor.ui_interact(user, ui_key, ui, force_open)
|
||||
/obj/machinery/computer/crew/tgui_interact(mob/user, datum/tgui/ui = null)
|
||||
crew_monitor.tgui_interact(user, ui)
|
||||
|
||||
/obj/machinery/computer/crew/interact(mob/user)
|
||||
crew_monitor.ui_interact(user)
|
||||
crew_monitor.tgui_interact(user)
|
||||
|
||||
@@ -522,7 +522,7 @@
|
||||
|
||||
announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE))
|
||||
//visible_message("<span class='notice'>\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.</span>", 3)
|
||||
visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].</span>", 3)
|
||||
visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]</span>", 3)
|
||||
|
||||
//VOREStation Edit begin: Dont delete mobs-in-mobs
|
||||
if(to_despawn.client && to_despawn.stat<2)
|
||||
|
||||
@@ -543,10 +543,6 @@ About the new airlock wires panel:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/door/airlock/proc/isWireCut(var/wireIndex)
|
||||
// You can find the wires in the datum folder.
|
||||
return wires.IsIndexCut(wireIndex)
|
||||
|
||||
/obj/machinery/door/airlock/proc/canAIControl()
|
||||
return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss()));
|
||||
|
||||
@@ -559,7 +555,7 @@ About the new airlock wires panel:
|
||||
return (src.main_power_lost_until==0 || src.backup_power_lost_until==0)
|
||||
|
||||
/obj/machinery/door/airlock/requiresID()
|
||||
return !(src.isWireCut(AIRLOCK_WIRE_IDSCAN) || aiDisabledIdScanner)
|
||||
return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner)
|
||||
|
||||
/obj/machinery/door/airlock/proc/isAllPowerLoss()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
@@ -569,10 +565,10 @@ About the new airlock wires panel:
|
||||
return 0
|
||||
|
||||
/obj/machinery/door/airlock/proc/mainPowerCablesCut()
|
||||
return src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1) || src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2)
|
||||
return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2)
|
||||
|
||||
/obj/machinery/door/airlock/proc/backupPowerCablesCut()
|
||||
return src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1) || src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2)
|
||||
|
||||
/obj/machinery/door/airlock/proc/loseMainPower()
|
||||
main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60)
|
||||
@@ -620,7 +616,7 @@ About the new airlock wires panel:
|
||||
|
||||
/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0)
|
||||
var/message = ""
|
||||
if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn())
|
||||
if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn())
|
||||
message = text("The electrification wire is cut - Door permanently electrified.")
|
||||
src.electrified_until = -1
|
||||
else if(duration && !arePowerSystemsOn())
|
||||
@@ -646,7 +642,7 @@ About the new airlock wires panel:
|
||||
|
||||
/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0)
|
||||
var/message = ""
|
||||
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
|
||||
if(wires.is_cut(WIRE_IDSCAN))
|
||||
message = "The IdScan wire is cut - IdScan feature permanently disabled."
|
||||
else if(activate && src.aiDisabledIdScanner)
|
||||
src.aiDisabledIdScanner = 0
|
||||
@@ -661,7 +657,7 @@ About the new airlock wires panel:
|
||||
/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0)
|
||||
var/message = ""
|
||||
// Safeties! We don't need no stinking safeties!
|
||||
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
|
||||
if (wires.is_cut(WIRE_SAFETY))
|
||||
message = text("The safety wire is cut - Cannot enable safeties.")
|
||||
else if (!activate && src.safe)
|
||||
safe = 0
|
||||
@@ -879,7 +875,7 @@ About the new airlock wires panel:
|
||||
if(!backup_power_lost_until)
|
||||
src.loseBackupPower()
|
||||
if("bolts")
|
||||
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
|
||||
if(wires.is_cut(WIRE_DOOR_BOLTS))
|
||||
to_chat(usr, "The door bolt control wire is cut - Door bolts permanently dropped.")
|
||||
else if(activate && src.lock())
|
||||
to_chat(usr, "The door bolts have been dropped.")
|
||||
@@ -902,7 +898,7 @@ About the new airlock wires panel:
|
||||
set_safeties(!activate, 1)
|
||||
if("timing")
|
||||
// Door speed control
|
||||
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
|
||||
if(wires.is_cut(WIRE_SPEED))
|
||||
to_chat(usr, "The timing wire is cut - Cannot alter timing.")
|
||||
else if (activate && src.normalspeed)
|
||||
normalspeed = 0
|
||||
@@ -910,7 +906,7 @@ About the new airlock wires panel:
|
||||
normalspeed = 1
|
||||
if("lights")
|
||||
// Bolt lights
|
||||
if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
|
||||
if(wires.is_cut(WIRE_BOLT_LIGHT))
|
||||
to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.")
|
||||
else if (!activate && src.lights)
|
||||
lights = 0
|
||||
@@ -1076,7 +1072,7 @@ About the new airlock wires panel:
|
||||
|
||||
/obj/machinery/door/airlock/can_open(var/forced=0)
|
||||
if(!forced)
|
||||
if(!arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR))
|
||||
if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR))
|
||||
return 0
|
||||
|
||||
if(locked || welded)
|
||||
@@ -1089,7 +1085,7 @@ About the new airlock wires panel:
|
||||
|
||||
if(!forced)
|
||||
//despite the name, this wire is for general door control.
|
||||
if(!arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR))
|
||||
if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR))
|
||||
return 0
|
||||
|
||||
return ..()
|
||||
@@ -1190,7 +1186,7 @@ About the new airlock wires panel:
|
||||
return
|
||||
|
||||
if (!forced)
|
||||
if(operating || !src.arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return
|
||||
if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return
|
||||
|
||||
src.locked = 0
|
||||
playsound(src, bolt_up_sound, 30, 0, 3)
|
||||
|
||||
@@ -81,6 +81,31 @@
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
frame_size = 4
|
||||
|
||||
/datum/frame/frame_types/oven
|
||||
name = "Oven"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
frame_size = 4
|
||||
|
||||
/datum/frame/frame_types/fryer
|
||||
name = "Fryer"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
frame_size = 4
|
||||
|
||||
/datum/frame/frame_types/grill
|
||||
name = "Grill"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
frame_size = 4
|
||||
|
||||
/datum/frame/frame_types/cerealmaker
|
||||
name = "Cereal Maker"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
frame_size = 4
|
||||
|
||||
/datum/frame/frame_types/candymachine
|
||||
name = "Candy Machine"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
frame_size = 4
|
||||
|
||||
/datum/frame/frame_types/fax
|
||||
name = "Fax"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
|
||||
@@ -365,7 +365,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
|
||||
/obj/item/weapon/tray = 8,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/knife = 6,
|
||||
/obj/item/weapon/material/knife/plastic = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/material/knife = 3,
|
||||
/obj/item/weapon/material/kitchen/rollingpin = 2,
|
||||
@@ -383,6 +383,8 @@
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/cti = 3,
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/nymph = 3,
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3,
|
||||
/obj/item/weapon/reagent_containers/cooking_container/oven = 5,
|
||||
/obj/item/weapon/reagent_containers/cooking_container/fryer = 4,
|
||||
/obj/item/trash/bowl = 10) //VOREStation Add
|
||||
contraband = list(/obj/item/weapon/material/knife/butch = 2)
|
||||
|
||||
|
||||
@@ -164,6 +164,8 @@
|
||||
var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new
|
||||
var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new
|
||||
|
||||
var/weapons_only_cycle = FALSE //So combat mechs don't switch to their equipment at times.
|
||||
|
||||
|
||||
|
||||
/obj/mecha/drain_power(var/drain_check)
|
||||
|
||||
@@ -185,12 +185,15 @@
|
||||
var/list/available_equipment = list()
|
||||
available_equipment = chassis.equipment
|
||||
|
||||
if(chassis.weapons_only_cycle)
|
||||
available_equipment = chassis.weapon_equipment
|
||||
|
||||
if(available_equipment.len == 0)
|
||||
chassis.occupant_message("No equipment available.")
|
||||
return
|
||||
if(!chassis.selected)
|
||||
chassis.selected = available_equipment[1]
|
||||
chassis.occupant_message("You select [chassis.selected]")
|
||||
chassis.occupant_message("You select [chassis.selected]")
|
||||
send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
|
||||
button_icon_state = "mech_cycle_equip_on"
|
||||
button.UpdateIcon()
|
||||
@@ -419,3 +422,17 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/verb/toggle_weapons_only_cycle()
|
||||
set category = "Exosuit Interface"
|
||||
set name = "Toggle weapons only cycling"
|
||||
set src = usr.loc
|
||||
set popup_menu = 0
|
||||
set_weapons_only_cycle()
|
||||
|
||||
/obj/mecha/proc/set_weapons_only_cycle()
|
||||
if(usr!=src.occupant)
|
||||
return
|
||||
weapons_only_cycle = !weapons_only_cycle
|
||||
src.occupant_message("<font color=\"[weapons_only_cycle?"#00f\">En":"#f00\">Dis"]abled weapons only cycling.</font>")
|
||||
return
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ var/global/list/image/splatter_cache=list()
|
||||
var/synthblood = 0
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
var/amount = 5
|
||||
generic_filth = TRUE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/reveal_blood()
|
||||
if(!fluorescent)
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
icon_state = "gib1"
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
|
||||
generic_filth = FALSE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
|
||||
color = "#FFFFFF"
|
||||
@@ -39,6 +41,8 @@
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
generic_filth = FALSE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/dry()
|
||||
return
|
||||
|
||||
@@ -1,7 +1,22 @@
|
||||
/obj/effect/decal/cleanable
|
||||
plane = DIRTY_PLANE
|
||||
var/persistent = FALSE
|
||||
var/generic_filth = FALSE
|
||||
var/age = 0
|
||||
var/list/random_icon_states = list()
|
||||
|
||||
/obj/effect/decal/cleanable/Initialize(var/ml, var/_age)
|
||||
if(!isnull(_age))
|
||||
age = _age
|
||||
if(random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
SSpersistence.track_value(src, /datum/persistent/filth)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/decal/cleanable/Destroy()
|
||||
SSpersistence.forget_value(src, /datum/persistent/filth)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)
|
||||
if(!ignore)
|
||||
qdel(src)
|
||||
|
||||
@@ -262,6 +262,21 @@ steam.start() -- spawns the effect
|
||||
projectiles -= proj
|
||||
*/
|
||||
|
||||
// Burnt Food Smoke (Specialty for Cooking Failures)
|
||||
/obj/effect/effect/smoke/bad/burntfood
|
||||
color = "#000000"
|
||||
time_to_live = 600
|
||||
|
||||
/obj/effect/effect/smoke/bad/burntfood/process()
|
||||
for(var/mob/living/L in get_turf(src))
|
||||
affect(L)
|
||||
|
||||
/obj/effect/effect/smoke/bad/burntfood/affect(var/mob/living/L) // This stuff is extra-vile.
|
||||
if (!..())
|
||||
return 0
|
||||
if(L.needs_to_breathe())
|
||||
L.emote("cough")
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// 'Elemental' smoke
|
||||
/////////////////////////////////////////////
|
||||
@@ -376,6 +391,9 @@ steam.start() -- spawns the effect
|
||||
|
||||
/datum/effect/effect/system/smoke_spread/bad
|
||||
smoke_type = /obj/effect/effect/smoke/bad
|
||||
|
||||
/datum/effect/effect/system/smoke_spread/bad/burntfood
|
||||
smoke_type = /obj/effect/effect/smoke/bad/burntfood
|
||||
|
||||
/datum/effect/effect/system/smoke_spread/noxious
|
||||
smoke_type = /obj/effect/effect/smoke/bad/noxious
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
origin_tech = list(TECH_ILLEGAL = 4, TECH_MAGNET = 4)
|
||||
var/can_use = 1
|
||||
var/obj/effect/dummy/chameleon/active_dummy = null
|
||||
var/saved_item = /obj/item/weapon/cigbutt
|
||||
var/saved_item = /obj/item/trash/cigbutt
|
||||
var/saved_icon = 'icons/obj/clothing/masks.dmi'
|
||||
var/saved_icon_state = "cigbutt"
|
||||
var/saved_overlays
|
||||
|
||||
@@ -155,8 +155,8 @@ var/global/list/default_medbay_channels = list(
|
||||
data["freq"] = format_frequency(frequency)
|
||||
data["rawfreq"] = num2text(frequency)
|
||||
|
||||
data["mic_cut"] = (wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
|
||||
data["spk_cut"] = (wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL))
|
||||
data["mic_cut"] = (wires.is_cut(WIRE_RADIO_TRANSMIT) || wires.is_cut(WIRE_RADIO_SIGNAL))
|
||||
data["spk_cut"] = (wires.is_cut(WIRE_RADIO_RECEIVER) || wires.is_cut(WIRE_RADIO_SIGNAL))
|
||||
|
||||
var/list/chanlist = list_channels(user)
|
||||
if(islist(chanlist) && chanlist.len)
|
||||
@@ -215,12 +215,6 @@ var/global/list/default_medbay_channels = list(
|
||||
/mob/observer/dead/has_internal_radio_channel_access(var/list/req_one_accesses)
|
||||
return can_admin_interact()
|
||||
|
||||
/obj/item/device/radio/proc/text_wires()
|
||||
if (b_stat)
|
||||
return wires.GetInteractWindow()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/device/radio/proc/text_sec_channel(var/chan_name, var/chan_stat)
|
||||
var/list = !!(chan_stat&FREQ_LISTENING)!=0
|
||||
return {"
|
||||
@@ -229,10 +223,10 @@ var/global/list/default_medbay_channels = list(
|
||||
"}
|
||||
|
||||
/obj/item/device/radio/proc/ToggleBroadcast()
|
||||
broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
|
||||
broadcasting = !broadcasting && !(wires.is_cut(WIRE_RADIO_TRANSMIT) || wires.is_cut(WIRE_RADIO_SIGNAL))
|
||||
|
||||
/obj/item/device/radio/proc/ToggleReception()
|
||||
listening = !listening && !(wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL))
|
||||
listening = !listening && !(wires.is_cut(WIRE_RADIO_RECEIVER) || wires.is_cut(WIRE_RADIO_SIGNAL))
|
||||
|
||||
/obj/item/device/radio/CanUseTopic()
|
||||
if(!on)
|
||||
@@ -337,7 +331,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
|
||||
|
||||
// Uncommenting this. To the above comment:
|
||||
// The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom
|
||||
if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact
|
||||
if(wires.is_cut(WIRE_RADIO_TRANSMIT)) // The device has to have all its wires and shit intact
|
||||
return FALSE
|
||||
|
||||
if(!radio_connection)
|
||||
@@ -541,7 +535,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
|
||||
// check if this radio can receive on the given frequency, and if so,
|
||||
// what the range is in which mobs will hear the radio
|
||||
// returns: -1 if can't receive, range otherwise
|
||||
if(wires.IsIndexCut(WIRE_RECEIVE))
|
||||
if(wires.is_cut(WIRE_RADIO_RECEIVER))
|
||||
return -1
|
||||
if(!listening)
|
||||
return -1
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
//Only care about megabroadcasts or things that are targeted at us
|
||||
if(!(0 in level))
|
||||
return -1
|
||||
if(wires.IsIndexCut(WIRE_RECEIVE))
|
||||
if(wires.is_cut(WIRE_RADIO_RECEIVER))
|
||||
return -1
|
||||
if(!listening)
|
||||
return -1
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
R.add_language(LANGUAGE_ECUREUILIAN, 1)
|
||||
R.add_language(LANGUAGE_DAEMON, 1)
|
||||
R.add_language(LANGUAGE_ENOCHIAN, 1)
|
||||
R.add_language(LANGUAGE_SLAVIC, 1)
|
||||
R.add_language(LANGUAGE_SLAVIC, 1)
|
||||
R.add_language(LANGUAGE_DRUDAKAR, 1)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -7,6 +7,20 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
desc = "This is rubbish."
|
||||
drop_sound = 'sound/items/drop/wrapper.ogg'
|
||||
var/age = 0
|
||||
|
||||
/obj/item/trash/New(var/newloc, var/_age)
|
||||
..(newloc)
|
||||
if(!isnull(_age))
|
||||
age = _age
|
||||
|
||||
/obj/item/trash/Initialize()
|
||||
SSpersistence.track_value(src, /datum/persistent/filth/trash)
|
||||
. = ..()
|
||||
|
||||
/obj/item/trash/Destroy()
|
||||
SSpersistence.forget_value(src, /datum/persistent/filth/trash)
|
||||
. = ..()
|
||||
|
||||
/obj/item/trash/raisins
|
||||
name = "\improper 4no raisins"
|
||||
@@ -91,5 +105,22 @@
|
||||
name = "bread tube"
|
||||
icon_state = "tastybread"
|
||||
|
||||
// Aurora Food Port
|
||||
/obj/item/trash/brownies
|
||||
name = "brownie tray"
|
||||
icon_state = "brownies"
|
||||
|
||||
/obj/item/trash/snacktray
|
||||
name = "snacktray"
|
||||
icon_state = "snacktray"
|
||||
|
||||
/obj/item/trash/dipbowl
|
||||
name = "dip bowl"
|
||||
icon_state = "dipbowl"
|
||||
|
||||
/obj/item/trash/chipbasket
|
||||
name = "empty basket"
|
||||
icon_state = "chipbasket_empty"
|
||||
|
||||
/obj/item/trash/attack(mob/M as mob, mob/living/user as mob)
|
||||
return
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
var/datum/pipe_recipe/recipe = null // pipe recipie selected for display/construction //YW edit, added = null
|
||||
var/static/datum/pipe_recipe/first_atmos
|
||||
var/static/datum/pipe_recipe/first_disposal
|
||||
var/static/datum/asset/iconsheet/pipes/icon_assets
|
||||
var/static/datum/asset/spritesheet/pipes/icon_assets
|
||||
var/static/list/pipe_layers = list(
|
||||
"Regular" = PIPING_LAYER_REGULAR,
|
||||
"Supply" = PIPING_LAYER_SUPPLY,
|
||||
@@ -80,7 +80,7 @@
|
||||
/obj/item/weapon/pipe_dispenser/interact(mob/user)
|
||||
SetupPipes()
|
||||
if(!icon_assets)
|
||||
icon_assets = get_asset_datum(/datum/asset/iconsheet/pipes)
|
||||
icon_assets = get_asset_datum(/datum/asset/spritesheet/pipes)
|
||||
icon_assets.send(user)
|
||||
|
||||
var/list/lines = list()
|
||||
@@ -370,7 +370,7 @@
|
||||
if(_dir == p_dir && flipped == p_flipped)
|
||||
attrs += " class=\"linkOn\""
|
||||
if(icon_state)
|
||||
var/img_tag = icon_assets.icon_tag(icon_state, _dir)
|
||||
var/img_tag = icon_assets.icon_tag("[dirtext]-[icon_state]")
|
||||
return "<a href=\"?src=\ref[src];dir=[dirtext];flipped=[flipped]\" title=\"[title]\"[attrs]>[img_tag]</a>"
|
||||
else
|
||||
return "<a href=\"?src=\ref[src];dir=[dirtext];flipped=[flipped]\" title=\"[title]\"[attrs]>[noimg]</a>"
|
||||
|
||||
@@ -150,7 +150,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
/obj/item/clothing/mask/smokable/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
|
||||
if(!is_pipe)
|
||||
var/smoke_percent = round((smoketime / max_smoketime) * 100)
|
||||
switch(smoke_percent)
|
||||
@@ -283,7 +283,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_EARS | SLOT_MASK
|
||||
attack_verb = list("burnt", "singed")
|
||||
type_butt = /obj/item/weapon/cigbutt
|
||||
type_butt = /obj/item/trash/cigbutt
|
||||
chem_volume = 15
|
||||
max_smoketime = 300
|
||||
smoketime = 300
|
||||
@@ -341,7 +341,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
name = "premium cigar"
|
||||
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
|
||||
icon_state = "cigar2"
|
||||
type_butt = /obj/item/weapon/cigbutt/cigarbutt
|
||||
type_butt = /obj/item/trash/cigbutt/cigarbutt
|
||||
throw_speed = 0.5
|
||||
item_state = "cigar"
|
||||
max_smoketime = 1500
|
||||
@@ -369,7 +369,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
chem_volume = 30
|
||||
nicotine_amt = 10
|
||||
|
||||
/obj/item/weapon/cigbutt
|
||||
/obj/item/trash/cigbutt
|
||||
name = "cigarette butt"
|
||||
desc = "A manky old cigarette butt."
|
||||
icon = 'icons/obj/clothing/masks.dmi'
|
||||
@@ -379,12 +379,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
slot_flags = SLOT_EARS
|
||||
throwforce = 1
|
||||
|
||||
/obj/item/weapon/cigbutt/Initialize()
|
||||
/obj/item/trash/cigbutt/Initialize()
|
||||
. = ..()
|
||||
randpixel_xy()
|
||||
transform = turn(transform,rand(0,360))
|
||||
|
||||
/obj/item/weapon/cigbutt/cigarbutt
|
||||
/obj/item/trash/cigbutt/cigarbutt
|
||||
name = "cigar butt"
|
||||
desc = "A manky old cigar butt."
|
||||
icon_state = "cigarbutt"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user