Merge pull request #899 from Yawn-Wider/izac

Voreupdate (big)
This commit is contained in:
Izac Joof Forsgren
2020-07-25 16:19:54 +02:00
committed by GitHub
545 changed files with 50935 additions and 14814 deletions
+10 -9
View File
@@ -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)"
+13
View File
@@ -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
+2 -1
View File
@@ -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
+111
View File
@@ -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
View File
@@ -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"
+2
View File
@@ -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
+19
View File
@@ -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))
+122
View File
@@ -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"
+3
View File
@@ -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
View File
@@ -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))
+1 -1
View File
@@ -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,
+16
View File
@@ -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)
+6
View File
@@ -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
+13
View File
@@ -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
*/
+8
View File
@@ -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
View File
@@ -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)]") }
-5
View File
@@ -123,8 +123,3 @@
/obj/screen/fullscreen/fishbed
icon_state = "fishbed"
#undef FULLSCREEN_LAYER
#undef BLIND_LAYER
#undef DAMAGE_LAYER
#undef CRIT_LAYER
+171
View File
@@ -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")
-1
View File
@@ -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.")
+6 -3
View File
@@ -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)
+8 -3
View File
@@ -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()
+1 -1
View File
@@ -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
+343
View File
@@ -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
+2 -2
View File
@@ -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"
-166
View File
@@ -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 .
-49
View File
@@ -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
+1
View File
@@ -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
+12 -12
View File
@@ -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"
+5 -5
View File
@@ -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"
+13 -13
View File
@@ -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(
+88 -36
View File
@@ -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)
+14
View File
@@ -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"
+11 -4
View File
@@ -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"
+6 -6
View File
@@ -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
+7 -7
View File
@@ -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)
+26 -26
View File
@@ -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"
+11 -11
View File
@@ -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"
+7 -7
View File
@@ -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
+15 -13
View File
@@ -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
+5 -5
View File
@@ -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
+41 -42
View File
@@ -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
+15 -9
View File
@@ -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"
+16 -16
View File
@@ -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
+64 -71
View File
@@ -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
View File
@@ -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
View File
@@ -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
+31 -38
View File
@@ -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
View File
@@ -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()
+12 -9
View File
@@ -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
+34 -36
View File
@@ -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)
..()
+29 -35
View File
@@ -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
View File
@@ -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
+22 -26
View File
@@ -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
View File
@@ -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
View File
@@ -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
+34 -32
View File
@@ -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)
..()
+30 -29
View File
@@ -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
..()
+32 -27
View File
@@ -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
View File
@@ -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
..()
+28 -29
View File
@@ -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
+10 -7
View File
@@ -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()
..()
+31 -27
View File
@@ -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
View File
@@ -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
+25 -1
View File
@@ -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"
+9
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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)
+12 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+36
View File
@@ -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!"
+4 -2
View File
@@ -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
+25 -1
View File
@@ -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."
+6 -12
View File
@@ -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"
+2
View File
@@ -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(
)
+1 -1
View File
@@ -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
+3 -30
View File
@@ -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()
-1
View File
@@ -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)
+105 -115
View File
@@ -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"
+26 -183
View File
@@ -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>")
+6 -6
View File
@@ -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)
+1 -1
View File
@@ -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)
+12 -16
View File
@@ -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)
+25
View File
@@ -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
+3 -1
View File
@@ -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)
+2
View File
@@ -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)
+18 -1
View File
@@ -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
+6 -12
View File
@@ -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
+31
View File
@@ -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
+3 -3
View File
@@ -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