mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-19 18:17:52 +01:00
Merge branch 'master' into no-more-myisam
This commit is contained in:
@@ -81,3 +81,4 @@
|
||||
#define NO_INTORGANS "no_internal_organs"
|
||||
#define CAN_WINGDINGS "can_wingdings"
|
||||
#define NO_CLONESCAN "no_clone_scan"
|
||||
#define NO_HAIR "no_hair"
|
||||
|
||||
@@ -6,11 +6,14 @@
|
||||
#define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats
|
||||
#define CHANNEL_BUZZ 1019
|
||||
#define CHANNEL_AMBIENCE 1018
|
||||
#define CHANNEL_ENGINE 1017 // Engine ambient sounds
|
||||
|
||||
#define USER_VOLUME(M, C) M?.client?.prefs.get_channel_volume(C)
|
||||
|
||||
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
|
||||
//KEEP IT UPDATED
|
||||
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1017
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1016
|
||||
|
||||
#define MAX_INSTRUMENT_CHANNELS (128 * 6)
|
||||
|
||||
|
||||
@@ -84,13 +84,13 @@
|
||||
continue
|
||||
|
||||
if(!use_name)
|
||||
error("Loadout - Missing display name: [G]")
|
||||
stack_trace("Loadout - Missing display name: [G]")
|
||||
continue
|
||||
if(!initial(G.cost))
|
||||
error("Loadout - Missing cost: [G]")
|
||||
stack_trace("Loadout - Missing cost: [G]")
|
||||
continue
|
||||
if(!initial(G.path))
|
||||
error("Loadout - Missing path definition: [G]")
|
||||
stack_trace("Loadout - Missing path definition: [G]")
|
||||
continue
|
||||
|
||||
if(!GLOB.loadout_categories[use_category])
|
||||
|
||||
@@ -513,6 +513,7 @@
|
||||
text = replacetext(text, "\[cell\]", "<td>")
|
||||
text = replacetext(text, "\[logo\]", "​<img src = ntlogo.png>")
|
||||
text = replacetext(text, "\[time\]", "[station_time_timestamp()]") // TO DO
|
||||
text = replacetext(text, "\[date\]", "[GLOB.current_date_string]")
|
||||
if(!no_font)
|
||||
if(P)
|
||||
text = "<font face=\"[deffont]\" color=[P ? P.colour : "black"]>[text]</font>"
|
||||
@@ -651,3 +652,22 @@
|
||||
|
||||
// return the split html object to the caller
|
||||
return s
|
||||
|
||||
/**
|
||||
* Proc to generate a "rank colour" from a client
|
||||
*
|
||||
* This takes the client and looks at various factors in order, such as patreon status, staff rank, and more
|
||||
* Arguments:
|
||||
* * C - The client were looking up
|
||||
*/
|
||||
/proc/client2rankcolour(client/C)
|
||||
// First check if end user is an admin
|
||||
if(C.holder)
|
||||
if(C.holder.rank in GLOB.rank_colour_map)
|
||||
// Return their rank colour if they are in here
|
||||
return GLOB.rank_colour_map[C.holder.rank]
|
||||
|
||||
// If they arent an admin, see if they are a patreon. Just accept any level
|
||||
if(C.donator_level)
|
||||
return "#e67e22" // Patreon orange
|
||||
return null
|
||||
|
||||
@@ -2116,6 +2116,8 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
return "White Noise"
|
||||
if(CHANNEL_AMBIENCE)
|
||||
return "Ambience"
|
||||
if(CHANNEL_ENGINE)
|
||||
return "Engine Ambience"
|
||||
|
||||
/proc/slot_bitfield_to_slot(input_slot_flags) // Kill off this garbage ASAP; slot flags and clothing flags should be IDENTICAL. GOSH DARN IT. Doesn't work with ears or pockets, either.
|
||||
switch(input_slot_flags)
|
||||
|
||||
@@ -54,4 +54,7 @@ GLOBAL_LIST_INIT(cooking_recipes, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN =
|
||||
GLOBAL_LIST_INIT(cooking_ingredients, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list()))
|
||||
GLOBAL_LIST_INIT(cooking_reagents, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list()))
|
||||
|
||||
/// Associative list of admin rank to colour. Set in config/rank_colours.txt
|
||||
GLOBAL_LIST_EMPTY(rank_colour_map)
|
||||
|
||||
#define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.")
|
||||
|
||||
@@ -132,6 +132,8 @@
|
||||
if(isovermind(usr))
|
||||
var/mob/camera/blob/B = usr
|
||||
B.split_consciousness()
|
||||
if(B.split_used) // Destroys split proc if the split is succesfully used
|
||||
qdel(src)
|
||||
|
||||
/datum/hud/blob_overmind/New(mob/user)
|
||||
..()
|
||||
@@ -194,6 +196,8 @@
|
||||
using.screen_loc = ui_storage2
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/blob/Split()
|
||||
using.screen_loc = ui_acti
|
||||
static_inventory += using
|
||||
var/mob/camera/blob/B = user
|
||||
if(!B.is_offspring) // Checks if the blob is an offspring, to not create split button if it is
|
||||
using = new /obj/screen/blob/Split()
|
||||
using.screen_loc = ui_acti
|
||||
static_inventory += using
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
var/last_parallax_shift //world.time of last update
|
||||
var/parallax_throttle = 0 //ds between updates
|
||||
var/parallax_movedir = 0
|
||||
var/parallax_layers_max = 3
|
||||
var/parallax_layers_max = 4
|
||||
var/parallax_animate_timer
|
||||
|
||||
/datum/hud/proc/create_parallax()
|
||||
@@ -21,6 +21,8 @@
|
||||
C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view)
|
||||
C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view)
|
||||
C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view)
|
||||
if(SSparallax.random_layer)
|
||||
C.parallax_layers_cached += new SSparallax.random_layer
|
||||
C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view)
|
||||
|
||||
C.parallax_layers = C.parallax_layers_cached.Copy()
|
||||
@@ -44,12 +46,12 @@
|
||||
switch(C.prefs.parallax)
|
||||
if (PARALLAX_INSANE)
|
||||
C.parallax_throttle = FALSE
|
||||
C.parallax_layers_max = 4
|
||||
C.parallax_layers_max = 5
|
||||
return TRUE
|
||||
|
||||
if (PARALLAX_MED)
|
||||
C.parallax_throttle = PARALLAX_DELAY_MED
|
||||
C.parallax_layers_max = 2
|
||||
C.parallax_layers_max = 3
|
||||
return TRUE
|
||||
|
||||
if (PARALLAX_LOW)
|
||||
@@ -60,8 +62,9 @@
|
||||
if (PARALLAX_DISABLE)
|
||||
return FALSE
|
||||
|
||||
//This is high parallax.
|
||||
C.parallax_throttle = PARALLAX_DELAY_DEFAULT
|
||||
C.parallax_layers_max = 3
|
||||
C.parallax_layers_max = 4
|
||||
return TRUE
|
||||
|
||||
/datum/hud/proc/update_parallax_pref()
|
||||
@@ -276,6 +279,21 @@
|
||||
speed = 1.4
|
||||
layer = 3
|
||||
|
||||
/obj/screen/parallax_layer/random
|
||||
blend_mode = BLEND_OVERLAY
|
||||
speed = 3
|
||||
layer = 3
|
||||
|
||||
/obj/screen/parallax_layer/random/space_gas
|
||||
icon_state = "space_gas"
|
||||
|
||||
/obj/screen/parallax_layer/random/space_gas/New(view)
|
||||
..()
|
||||
add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY)
|
||||
|
||||
/obj/screen/parallax_layer/random/asteroids
|
||||
icon_state = "asteroids"
|
||||
|
||||
/obj/screen/parallax_layer/planet
|
||||
icon_state = "planet"
|
||||
blend_mode = BLEND_OVERLAY
|
||||
|
||||
@@ -925,3 +925,34 @@
|
||||
runnable_modes[M] = probabilities[M.config_tag]
|
||||
// to_chat(world, "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]")
|
||||
return runnable_modes
|
||||
|
||||
/datum/configuration/proc/load_rank_colour_map()
|
||||
var/list/lines = file2list("config/rank_colours.txt")
|
||||
|
||||
for(var/line in lines)
|
||||
// Skip newlines
|
||||
if(!length(line))
|
||||
continue
|
||||
// Skip comments
|
||||
if(line[1] == "#")
|
||||
continue
|
||||
|
||||
//Split the line at every " - "
|
||||
var/list/split_holder = splittext(line, " - ")
|
||||
if(!length(split_holder))
|
||||
continue
|
||||
|
||||
// Rank is before the " - "
|
||||
var/rank = split_holder[1]
|
||||
if(!rank)
|
||||
continue
|
||||
|
||||
// Color is after the " - "
|
||||
var/colour = ""
|
||||
if(length(split_holder) >= 2)
|
||||
colour = split_holder[2]
|
||||
|
||||
if(rank && colour)
|
||||
GLOB.rank_colour_map[rank] = colour
|
||||
else
|
||||
stack_trace("Invalid colour for rank '[rank]' in config/rank_colours.txt")
|
||||
|
||||
@@ -1,19 +1,27 @@
|
||||
SUBSYSTEM_DEF(parallax)
|
||||
name = "Parallax"
|
||||
wait = 2
|
||||
flags = SS_POST_FIRE_TIMING | SS_BACKGROUND
|
||||
flags = SS_POST_FIRE_TIMING | SS_BACKGROUND | SS_NO_INIT
|
||||
priority = FIRE_PRIORITY_PARALLAX
|
||||
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
|
||||
offline_implications = "Space parallax will no longer move around. No immediate action is needed."
|
||||
var/list/currentrun
|
||||
var/planet_x_offset = 128
|
||||
var/planet_y_offset = 128
|
||||
var/random_layer
|
||||
var/random_parallax_color
|
||||
|
||||
/datum/controller/subsystem/parallax/Initialize(timeofday)
|
||||
|
||||
//These are cached per client so needs to be done asap so people joining at roundstart do not miss these.
|
||||
/datum/controller/subsystem/parallax/PreInit()
|
||||
. = ..()
|
||||
if(prob(70)) //70% chance to pick a special extra layer
|
||||
random_layer = pick(/obj/screen/parallax_layer/random/space_gas, /obj/screen/parallax_layer/random/asteroids)
|
||||
random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE) //Special color for random_layer1. Has to be done here so everyone sees the same color.
|
||||
planet_y_offset = rand(100, 160)
|
||||
planet_x_offset = rand(100, 160)
|
||||
|
||||
|
||||
/datum/controller/subsystem/parallax/fire(resumed = 0)
|
||||
if(!resumed)
|
||||
src.currentrun = GLOB.clients.Copy()
|
||||
|
||||
@@ -31,6 +31,8 @@ BONUS
|
||||
to_chat(M, "<span class='warning'>[pick("Your scalp itches.", "Your skin feels flakey.")]</span>")
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(NO_HAIR in H.dna.species.species_traits)
|
||||
return // Hair can't fall out if you don't have any
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
switch(A.stage)
|
||||
if(3, 4)
|
||||
|
||||
@@ -124,6 +124,10 @@
|
||||
name = "Pyromancer REAL_NAME"
|
||||
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "ONI SOMA!")
|
||||
|
||||
/datum/dog_fashion/head/black_wizard
|
||||
name = "Necromancer REAL_NAME"
|
||||
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
|
||||
|
||||
/datum/dog_fashion/head/cardborg
|
||||
name = "Borgi"
|
||||
speak = list("Ping!","Beep!","Woof!")
|
||||
@@ -148,6 +152,8 @@
|
||||
name = "Corgi Tech REAL_NAME"
|
||||
desc = "The reason your yellow gloves have chew-marks."
|
||||
|
||||
/datum/dog_fashion/head/softcap
|
||||
|
||||
/datum/dog_fashion/head/reindeer
|
||||
name = "REAL_NAME the red-nosed Corgi"
|
||||
emote_hear = list("lights the way!", "illuminates.", "yaps!")
|
||||
@@ -208,3 +214,38 @@
|
||||
/datum/dog_fashion/head/fried_vox_empty
|
||||
name = "Colonel REAL_NAME"
|
||||
desc = "Keep away from live vox."
|
||||
|
||||
/datum/dog_fashion/head/HoS
|
||||
name = "Head of Security REAL_NAME"
|
||||
desc = "Probably better than the last HoS."
|
||||
|
||||
/datum/dog_fashion/head/beret/sec
|
||||
name = "Officer REAL_NAME"
|
||||
desc = "Ever-loyal, ever-vigilant."
|
||||
|
||||
/datum/dog_fashion/head/bowlerhat
|
||||
name = "REAL_NAME"
|
||||
desc = "A sophisticated city gent."
|
||||
|
||||
/datum/dog_fashion/head/surgery
|
||||
name = "Nurse-in-Training REAL_NAME"
|
||||
desc = "The most adorable bed-side manner ever."
|
||||
|
||||
/datum/dog_fashion/head/bucket
|
||||
name = "REAL_NAME"
|
||||
desc = "A janitor's best friend."
|
||||
|
||||
/datum/dog_fashion/head/justice_wig
|
||||
name = "Arbiter REAL_NAME"
|
||||
desc = "Head of the High Court of Cute."
|
||||
|
||||
/datum/dog_fashion/head/wizard/magus
|
||||
name = "Battlemage REAL_NAME"
|
||||
|
||||
/datum/dog_fashion/head/wizard/marisa
|
||||
name = "Witch REAL_NAME"
|
||||
desc = "Flying broom not included."
|
||||
|
||||
/datum/dog_fashion/head/roman
|
||||
name = "Imperator REAL_NAME"
|
||||
desc = "For the Senate and the people of Rome!"
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
var/falloff_exponent
|
||||
var/muted = TRUE
|
||||
var/falloff_distance
|
||||
/// Channel of the audio, random otherwise
|
||||
var/channel
|
||||
|
||||
/datum/looping_sound/New(list/_output_atoms = list(), start_immediately = FALSE, _direct = FALSE)
|
||||
if(!mid_sounds)
|
||||
@@ -75,14 +77,16 @@
|
||||
var/list/atoms_cache = output_atoms
|
||||
var/sound/S = sound(soundfile)
|
||||
if(direct)
|
||||
S.channel = SSsounds.random_available_channel()
|
||||
S.volume = volume
|
||||
S.channel = channel || SSsounds.random_available_channel()
|
||||
for(var/i in 1 to atoms_cache.len)
|
||||
var/atom/thing = atoms_cache[i]
|
||||
if(direct)
|
||||
if(ismob(thing))
|
||||
var/mob/M = thing
|
||||
S.volume = volume * (USER_VOLUME(M, channel) || 1)
|
||||
SEND_SOUND(thing, S)
|
||||
else
|
||||
playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance)
|
||||
playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance, channel = channel)
|
||||
|
||||
/datum/looping_sound/proc/get_sound(looped, _mid_sounds)
|
||||
if(!_mid_sounds)
|
||||
|
||||
@@ -16,3 +16,4 @@
|
||||
falloff_exponent = 10
|
||||
falloff_distance = 5
|
||||
vary = TRUE
|
||||
channel = CHANNEL_ENGINE
|
||||
|
||||
@@ -51,14 +51,6 @@
|
||||
cost = 20
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/syndicate_base
|
||||
name = "Syndicate Lava Base"
|
||||
id = "lava-base"
|
||||
description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents."
|
||||
suffix = "lavaland_surface_syndicate_base1.dmm"
|
||||
cost = 20
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/lavaland/free_golem
|
||||
name = "Free Golem Ship"
|
||||
id = "golem-ship"
|
||||
|
||||
@@ -258,6 +258,15 @@
|
||||
always_place = TRUE
|
||||
cost = 0
|
||||
|
||||
/datum/map_template/ruin/space/syndicate_space_base
|
||||
name = "Syndicate Space Base"
|
||||
id = "syndie-space-base"
|
||||
description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents."
|
||||
suffix = "syndie_space_base.dmm"
|
||||
cost = 0
|
||||
always_place = TRUE
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/ruin/space/syndiecakesfactory
|
||||
id = "Syndiecakes Factory"
|
||||
suffix = "syndiecakesfactory.dmm"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1, mob/living/user = usr)
|
||||
var/thearea = before_cast(targets)
|
||||
if(!thearea || !cast_check(TRUE, FALSE, user))
|
||||
if(!thearea || !cast_check(FALSE, FALSE, user))
|
||||
revert_cast()
|
||||
return
|
||||
invocation(thearea)
|
||||
|
||||
@@ -374,7 +374,7 @@
|
||||
|
||||
for(var/am in thrownatoms)
|
||||
var/atom/movable/AM = am
|
||||
if(AM == user || AM.anchored)
|
||||
if(AM == user || AM.anchored || AM.move_resist == INFINITY)
|
||||
continue
|
||||
|
||||
throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
|
||||
|
||||
@@ -952,6 +952,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/toy/carpplushie/dehy_carp
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/combat_plus
|
||||
name = "Combat Gloves Plus"
|
||||
desc = "Combat gloves with installed nanochips that teach you Krav Maga when worn, great as a cheap backup weapon. Warning, the nanochips will override any other fighting styles such as CQC."
|
||||
reference = "CGP"
|
||||
item = /obj/item/clothing/gloves/color/black/krav_maga/combat
|
||||
cost = 5
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
// GRENADES AND EXPLOSIVES
|
||||
|
||||
/datum/uplink_item/explosives
|
||||
|
||||
@@ -37,45 +37,6 @@
|
||||
/area/ruin/powered/seedvault
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base
|
||||
name = "Secret Base"
|
||||
icon_state = "dk_yellow"
|
||||
ambientsounds = HIGHSEC_SOUNDS
|
||||
report_alerts = FALSE
|
||||
hide_attacklogs = TRUE
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/engineering
|
||||
name = "Syndicate Lavaland Engineering"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/medbay
|
||||
name = "Syndicate Lavaland Medbay"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/arrivals
|
||||
name = "Syndicate Lavaland Arrivals"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/bar
|
||||
name = "Syndicate Lavaland Bar"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/main
|
||||
name = "Syndicate Lavaland Primary Hallway"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/cargo
|
||||
name = "Syndicate Lavaland Cargo Bay"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/chemistry
|
||||
name = "Syndicate Lavaland Chemistry"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/virology
|
||||
name = "Syndicate Lavaland Virology"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/testlab
|
||||
name = "Syndicate Lavaland Experimentation Lab"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/dormitories
|
||||
name = "Syndicate Lavaland Dormitories"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/telecomms
|
||||
name = "Syndicate Lavaland Telecommunications"
|
||||
|
||||
//Xeno Nest
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/area/ruin/unpowered/syndicate_space_base
|
||||
name = "Secret Base"
|
||||
icon_state = "dk_yellow"
|
||||
ambientsounds = HIGHSEC_SOUNDS
|
||||
report_alerts = FALSE
|
||||
hide_attacklogs = TRUE
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/engineering
|
||||
name = "Syndicate Space Base Engineering"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/medbay
|
||||
name = "Syndicate Space Base Medbay"
|
||||
icon_state = "medbay2"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/arrivals
|
||||
name = "Syndicate Space Base Arrivals"
|
||||
icon_state = "teleporter"
|
||||
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/bar
|
||||
name = "Syndicate Space Base Bar"
|
||||
icon_state = "bar"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/main
|
||||
name = "Syndicate Space Base Primary Hallway"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/cargo
|
||||
name = "Syndicate Space Base Cargo Bay"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/chemistry
|
||||
name = "Syndicate Space Base Chemistry"
|
||||
icon_state = "chem"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/virology
|
||||
name = "Syndicate Space Base Virology"
|
||||
icon_state = "virology"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab
|
||||
name = "Syndicate Space Base Experimentation Lab"
|
||||
icon_state = "toxtest"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/dormitories
|
||||
name = "Syndicate Space Base Dormitories"
|
||||
icon_state = "dorms"
|
||||
|
||||
/area/ruin/unpowered/syndicate_space_base/telecomms
|
||||
name = "Syndicate Space Base Telecommunications"
|
||||
icon_state = "tcomsatcham"
|
||||
@@ -181,11 +181,18 @@
|
||||
var/dead = stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)
|
||||
// To the right of health bar
|
||||
if(dead)
|
||||
var/revivable = timeofdeath && (round(world.time - timeofdeath) < DEFIB_TIME_LIMIT)
|
||||
var/mob/dead/observer/ghost = get_ghost(TRUE)
|
||||
var/revivable
|
||||
if(ghost && !ghost.can_reenter_corpse) // DNR or AntagHUD
|
||||
revivable = FALSE
|
||||
else if(timeofdeath && (round(world.time - timeofdeath) < DEFIB_TIME_LIMIT))
|
||||
revivable = TRUE
|
||||
|
||||
if(revivable)
|
||||
holder.icon_state = "hudflatline"
|
||||
else
|
||||
holder.icon_state = "huddead"
|
||||
|
||||
else if(HAS_TRAIT(src, TRAIT_XENO_HOST))
|
||||
holder.icon_state = "hudxeno"
|
||||
else if(B && B.controlling)
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
icon = H.icon
|
||||
speak_emote = list("groans")
|
||||
icon_state = "zombie2_s"
|
||||
if(head_organ)
|
||||
if(head_organ && !(NO_HAIR in H.dna.species.species_traits))
|
||||
head_organ.h_style = null
|
||||
H.update_hair()
|
||||
human_overlays = H.overlays
|
||||
|
||||
@@ -117,13 +117,13 @@
|
||||
|
||||
if(C && !QDELETED(src))
|
||||
var/mob/camera/blob/B = new(loc)
|
||||
B.is_offspring = is_offspring
|
||||
B.key = C.key
|
||||
B.blob_core = src
|
||||
overmind = B
|
||||
color = overmind.blob_reagent_datum.color
|
||||
if(B.mind && !B.mind.special_role)
|
||||
B.mind.make_Overmind()
|
||||
B.is_offspring = is_offspring
|
||||
|
||||
/obj/structure/blob/core/proc/lateblobtimer()
|
||||
addtimer(CALLBACK(src, .proc/lateblobcheck), 50)
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
/datum/action/changeling/sting/transformation/can_sting(mob/user, mob/target)
|
||||
if(!..())
|
||||
return
|
||||
if(HAS_TRAIT(target, TRAIT_HUSK) || (!ishuman(target)))
|
||||
if(HAS_TRAIT(target, TRAIT_HUSK) || !ishuman(target) || (NOTRANSSTING in target.dna.species.species_traits))
|
||||
to_chat(user, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
|
||||
return FALSE
|
||||
if(ishuman(target))
|
||||
|
||||
@@ -331,7 +331,8 @@
|
||||
to_chat(L, "<span class='danger'><B>The blast wave from [src] tears you atom from atom!</B></span>")
|
||||
L.dust()
|
||||
to_chat(world, "<B>The AI cleansed the station of life with the doomsday device!</B>")
|
||||
SSticker.force_ending = 1
|
||||
SSticker.force_ending = TRUE
|
||||
SSticker.mode.station_was_nuked = TRUE
|
||||
|
||||
//AI Turret Upgrade: Increases the health and damage of all turrets.
|
||||
/datum/AI_Module/large/upgrade_turrets
|
||||
@@ -785,4 +786,3 @@
|
||||
/datum/AI_Module/large/cameracrack/upgrade(mob/living/silicon/ai/AI)
|
||||
if(AI.builtInCamera)
|
||||
QDEL_NULL(AI.builtInCamera)
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
remove_from_all_data_huds()
|
||||
generation = gen
|
||||
add_language("Cortical Link")
|
||||
notify_ghosts("A cortical borer has been created in [get_area(src)]!", enter_link = "<a href=?src=[UID()];ghostjoin=1>(Click to enter)</a>", source = src, action = NOTIFY_ATTACK)
|
||||
notify_ghosts("A cortical borer has been created in [get_area(src)]!", enter_link = "<a href=?src=[UID()];ghostjoin=1>(Click to enter)</a>", source = src, action = NOTIFY_ATTACK, role = ROLE_BORER)
|
||||
real_name = "Cortical Borer [rand(1000,9999)]"
|
||||
truename = "[borer_names[min(generation, borer_names.len)]] [rand(1000,9999)]"
|
||||
GrantBorerActions()
|
||||
|
||||
@@ -63,12 +63,10 @@
|
||||
mob_biotypes = MOB_ROBOTIC
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
status_flags = CANPUSH
|
||||
icon_state = "swarmer"
|
||||
icon_living = "swarmer"
|
||||
icon_dead = "swarmer_unactivated"
|
||||
icon_gib = null
|
||||
wander = 0
|
||||
wander = FALSE
|
||||
harm_intent_damage = 5
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 500
|
||||
@@ -86,22 +84,22 @@
|
||||
friendly = "pinches"
|
||||
speed = 0
|
||||
a_intent = INTENT_HARM
|
||||
can_change_intents = 0
|
||||
can_change_intents = FALSE
|
||||
faction = list("swarmer")
|
||||
AIStatus = AI_OFF
|
||||
pass_flags = PASSTABLE
|
||||
flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
projectiletype = /obj/item/projectile/beam/disabler
|
||||
ranged_cooldown_time = 20
|
||||
projectilesound = 'sound/weapons/taser2.ogg'
|
||||
loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal)
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
deathmessage = "explodes with a sharp pop!"
|
||||
light_color = LIGHT_COLOR_CYAN
|
||||
universal_speak = 0
|
||||
universal_understand = 0
|
||||
universal_understand = FALSE
|
||||
var/resources = 0 //Resource points, generated by consuming metal/glass
|
||||
var/max_resources = 100
|
||||
|
||||
|
||||
@@ -250,10 +250,9 @@
|
||||
var/name_list = list("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
|
||||
|
||||
/obj/item/guardiancreator/attack_self(mob/living/user)
|
||||
for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.alive_mob_list)
|
||||
if(G.summoner == user)
|
||||
to_chat(user, "You already have a [mob_name]!")
|
||||
return
|
||||
if(has_guardian(user))
|
||||
to_chat(user, "You already have a [mob_name]!")
|
||||
return
|
||||
if(user.mind && (user.mind.changeling || user.mind.vampire))
|
||||
to_chat(user, "[ling_failure]")
|
||||
return
|
||||
@@ -285,6 +284,10 @@
|
||||
|
||||
if(candidates.len)
|
||||
theghost = pick(candidates)
|
||||
if(has_guardian(user))
|
||||
to_chat(user, "You already have a [mob_name]!")
|
||||
used = FALSE
|
||||
return
|
||||
spawn_guardian(user, theghost.key, guardian_type)
|
||||
else
|
||||
to_chat(user, "[failure_message]")
|
||||
@@ -295,6 +298,13 @@
|
||||
if(used)
|
||||
. += "<span class='notice'>[used_message]</span>"
|
||||
|
||||
/obj/item/guardiancreator/proc/has_guardian(mob/living/user)
|
||||
for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.alive_mob_list)
|
||||
if(G.summoner == user)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, key, guardian_type)
|
||||
var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch
|
||||
switch(guardian_type)
|
||||
|
||||
@@ -14,7 +14,8 @@ GLOBAL_VAR(bomb_set)
|
||||
icon_state = "nuclearbomb0"
|
||||
density = 1
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/extended = FALSE
|
||||
anchored = TRUE
|
||||
var/extended = TRUE
|
||||
var/lighthack = FALSE
|
||||
var/timeleft = 120
|
||||
var/timing = FALSE
|
||||
@@ -34,6 +35,10 @@ GLOBAL_VAR(bomb_set)
|
||||
/obj/machinery/nuclearbomb/syndicate
|
||||
is_syndicate = TRUE
|
||||
|
||||
/obj/machinery/nuclearbomb/undeployed
|
||||
extended = FALSE
|
||||
anchored = FALSE
|
||||
|
||||
/obj/machinery/nuclearbomb/New()
|
||||
..()
|
||||
r_code = rand(10000, 99999.0) // Creates a random code upon object spawn.
|
||||
@@ -269,11 +274,6 @@ GLOBAL_VAR(bomb_set)
|
||||
else
|
||||
code = "ERROR"
|
||||
return
|
||||
|
||||
if(!yes_code) // All requests below here require both NAD inserted AND code correct
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("toggle_anchor")
|
||||
if(removal_stage == NUKE_MOBILE)
|
||||
anchored = FALSE
|
||||
@@ -288,6 +288,11 @@ GLOBAL_VAR(bomb_set)
|
||||
else
|
||||
visible_message("<span class='warning'>The anchoring bolts slide back into the depths of [src].</span>")
|
||||
return
|
||||
|
||||
if(!yes_code) // All requests below here require both NAD inserted AND code correct
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("set_time")
|
||||
var/time = input(usr, "Detonation time (seconds, min 120, max 600)", "Input Time", 120) as num|null
|
||||
if(time)
|
||||
|
||||
@@ -262,11 +262,13 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
|
||||
|
||||
/datum/objective/block/check_completion()
|
||||
if(!istype(owner.current, /mob/living/silicon))
|
||||
return 0
|
||||
return FALSE
|
||||
if(SSticker.mode.station_was_nuked)
|
||||
return TRUE
|
||||
if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME)
|
||||
return 0
|
||||
return FALSE
|
||||
if(!owner.current)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/area/A = SSshuttle.emergency.areaInstance
|
||||
|
||||
@@ -276,9 +278,9 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
|
||||
|
||||
if(player.mind && player.stat != DEAD)
|
||||
if(get_area(player) == A)
|
||||
return 0 // If there are any other organic mobs on the shuttle, you failed the objective.
|
||||
return FALSE // If there are any other organic mobs on the shuttle, you failed the objective.
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/objective/escape
|
||||
explanation_text = "Escape on the shuttle or an escape pod alive and free."
|
||||
|
||||
@@ -220,6 +220,10 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/enthrall = 300,
|
||||
/datum/vampire_passive/full = 500)
|
||||
|
||||
/datum/vampire/proc/adjust_nullification(base, extra)
|
||||
// First hit should give full nullification, while subsequent hits increase the value slower
|
||||
nullified = max(nullified + extra, base)
|
||||
|
||||
/datum/vampire/New(gend = FEMALE)
|
||||
gender = gend
|
||||
|
||||
|
||||
@@ -37,12 +37,13 @@
|
||||
var/list/recipiecache = list()
|
||||
|
||||
var/list/categories = list("Tools", "Electronics", "Construction", "Communication", "Security", "Machinery", "Medical", "Miscellaneous", "Dinnerware", "Imported")
|
||||
var/board_type = /obj/item/circuitboard/autolathe
|
||||
|
||||
/obj/machinery/autolathe/New()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/circuitboard/autolathe(null)
|
||||
component_parts += new board_type(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin(null)
|
||||
@@ -57,7 +58,7 @@
|
||||
/obj/machinery/autolathe/upgraded/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/circuitboard/autolathe(null)
|
||||
component_parts += new board_type(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
|
||||
@@ -288,6 +289,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/autolathe/crowbar_act(mob/user, obj/item/I)
|
||||
if(!panel_open)
|
||||
return
|
||||
if(!I.use_tool(src, user, 0, volume = 0))
|
||||
return
|
||||
. = TRUE
|
||||
@@ -491,3 +494,13 @@
|
||||
/obj/machinery/autolathe/proc/check_disabled_callback()
|
||||
if(!wires.is_cut(WIRE_AUTOLATHE_DISABLE))
|
||||
disabled = FALSE
|
||||
|
||||
/obj/machinery/autolathe/syndicate
|
||||
name = "syndicate autolathe"
|
||||
board_type = /obj/item/circuitboard/autolathe/syndi
|
||||
|
||||
/obj/machinery/autolathe/syndicate/New()
|
||||
..()
|
||||
if(files)
|
||||
QDEL_NULL(files)
|
||||
files = new /datum/research/autolathe/syndicate(src)
|
||||
|
||||
@@ -391,6 +391,7 @@
|
||||
icon_screen = "telesci"
|
||||
icon_keyboard = "teleport_key"
|
||||
window_height = 300
|
||||
req_access = list(ACCESS_SYNDICATE_LEADER)
|
||||
var/obj/machinery/bluespace_beacon/syndicate/mybeacon
|
||||
var/obj/effect/portal/redspace/myportal
|
||||
var/obj/effect/portal/redspace/myportal2
|
||||
@@ -486,7 +487,7 @@
|
||||
"status" = portal_enabled ? "ON" : "OFF",
|
||||
"buttontitle" = portal_enabled ? "Disable" : "Enable",
|
||||
"buttonact" = "secondary",
|
||||
"buttondisabled" = (!allowed(user) || (!depotarea.on_peaceful && !check_rights(R_ADMIN, FALSE, user))),
|
||||
"buttondisabled" = !allowed(user),
|
||||
"buttontooltip" = "When on, creates a bi-directional portal to the beacon of your choice."
|
||||
))
|
||||
return data
|
||||
@@ -500,9 +501,6 @@
|
||||
playsound(user, sound_yes, 50, 0)
|
||||
|
||||
/obj/machinery/computer/syndicate_depot/teleporter/secondary(mob/user)
|
||||
if(!depotarea.on_peaceful && !check_rights(R_ADMIN, FALSE, user))
|
||||
to_chat(user, "<span class='notice'>Outgoing Teleport Portal controls are only enabled when the depot has a signed-in agent visitor.</span>")
|
||||
return
|
||||
if(!portal_enabled && myportal)
|
||||
to_chat(user, "<span class='notice'>Outgoing Teleport Portal: deactivating... please wait...</span>")
|
||||
return
|
||||
|
||||
@@ -23,18 +23,19 @@
|
||||
var/list/data = list()
|
||||
var/list/pods = list()
|
||||
for(var/obj/item/spacepod_equipment/misc/tracker/TR in GLOB.pod_trackers)
|
||||
var/obj/spacepod/my_pod = TR.my_atom
|
||||
var/podname = capitalize(sanitize(my_pod.name))
|
||||
var/pilot = "None"
|
||||
var/passengers = list()
|
||||
if(my_pod.pilot)
|
||||
pilot = my_pod.pilot
|
||||
if(my_pod.passengers)
|
||||
for(var/mob/M in my_pod.passengers)
|
||||
passengers += M.name
|
||||
var/passengers_text = english_list(passengers, "None")
|
||||
if(TR.my_atom)
|
||||
var/obj/spacepod/my_pod = TR.my_atom
|
||||
var/podname = capitalize(sanitize(my_pod.name))
|
||||
var/pilot = "None"
|
||||
var/passengers = list()
|
||||
if(my_pod.pilot)
|
||||
pilot = my_pod.pilot
|
||||
if(my_pod.passengers)
|
||||
for(var/mob/M in my_pod.passengers)
|
||||
passengers += M.name
|
||||
var/passengers_text = english_list(passengers, "None")
|
||||
|
||||
pods.Add(list(list("name" = podname, "podx" = my_pod.x, "pody" = my_pod.y, "podz" = my_pod.z, "pilot" = pilot, "passengers" = passengers_text)))
|
||||
pods.Add(list(list("name" = podname, "podx" = my_pod.x, "pody" = my_pod.y, "podz" = my_pod.z, "pilot" = pilot, "passengers" = passengers_text)))
|
||||
|
||||
data["pods"] = pods
|
||||
return data
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#define SEC_DATA_R_LIST 1 // Record list
|
||||
#define SEC_DATA_MAINT 2 // Records maintenance
|
||||
#define SEC_DATA_RECORD 3 // Record
|
||||
#define SEC_DATA_RECORD 2 // Record
|
||||
|
||||
#define SEC_FIELD(N, V, E, LB) list(field = N, value = V, edit = E, line_break = LB)
|
||||
|
||||
@@ -166,7 +165,7 @@
|
||||
if("page") // Select Page
|
||||
if(!logged_in)
|
||||
return
|
||||
var/page_num = clamp(text2num(params["page"]), SEC_DATA_R_LIST, SEC_DATA_MAINT) // SEC_DATA_RECORD cannot be accessed through this act
|
||||
var/page_num = clamp(text2num(params["page"]), SEC_DATA_R_LIST, SEC_DATA_R_LIST) // SEC_DATA_RECORD cannot be accessed through this act
|
||||
current_page = page_num
|
||||
record_general = null
|
||||
record_security = null
|
||||
@@ -247,25 +246,6 @@
|
||||
QDEL_NULL(record_security)
|
||||
update_all_mob_security_hud()
|
||||
set_temp("Security record deleted.")
|
||||
if("delete_security_all") // Delete All Security Records
|
||||
if(!logged_in)
|
||||
return
|
||||
for(var/datum/data/record/S in GLOB.data_core.security)
|
||||
qdel(S)
|
||||
message_admins("[key_name_admin(usr)] has deleted all security records at [ADMIN_COORDJMP(usr)]")
|
||||
usr.create_log(MISC_LOG, "deleted all security records")
|
||||
update_all_mob_security_hud()
|
||||
set_temp("All security records deleted.")
|
||||
if("delete_cell_logs") // Delete All Cell Logs
|
||||
if(!logged_in)
|
||||
return
|
||||
if(!length(GLOB.cell_logs))
|
||||
set_temp("There are no cell logs to delete.")
|
||||
return
|
||||
message_admins("[key_name_admin(usr)] has deleted all cell logs at [ADMIN_COORDJMP(usr)]")
|
||||
usr.create_log(MISC_LOG, "deleted all cell logs")
|
||||
GLOB.cell_logs.Cut()
|
||||
set_temp("All cell logs deleted.")
|
||||
if("comment_delete") // Delete Comment
|
||||
if(!logged_in)
|
||||
return
|
||||
@@ -494,6 +474,5 @@
|
||||
density = FALSE
|
||||
|
||||
#undef SEC_DATA_R_LIST
|
||||
#undef SEC_DATA_MAINT
|
||||
#undef SEC_DATA_RECORD
|
||||
#undef SEC_FIELD
|
||||
|
||||
@@ -625,6 +625,10 @@ to destroy them and players will be able to make replacements.
|
||||
/obj/item/stock_parts/manipulator = 1,
|
||||
/obj/item/stack/sheet/glass = 1)
|
||||
|
||||
/obj/item/circuitboard/autolathe/syndi
|
||||
name = "Circuit board (Syndi Autolathe)"
|
||||
build_path = /obj/machinery/autolathe/syndicate
|
||||
|
||||
/obj/item/circuitboard/protolathe
|
||||
name = "Circuit board (Protolathe)"
|
||||
build_path = /obj/machinery/r_n_d/protolathe
|
||||
|
||||
@@ -225,6 +225,7 @@
|
||||
var/willing_time_divisor = 10
|
||||
var/time_entered = 0 // Used to keep track of the safe period.
|
||||
var/obj/item/radio/intercom/announce
|
||||
var/silent = FALSE
|
||||
|
||||
var/obj/machinery/computer/cryopod/control_computer
|
||||
var/last_no_computer_message = 0
|
||||
@@ -430,23 +431,27 @@
|
||||
//Make an announcement and log the person entering storage.
|
||||
control_computer.frozen_crew += "[occupant.real_name]"
|
||||
|
||||
var/list/ailist = list()
|
||||
for(var/thing in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/AI = thing
|
||||
if(AI.stat)
|
||||
continue
|
||||
ailist += AI
|
||||
if(length(ailist))
|
||||
var/mob/living/silicon/ai/announcer = pick(ailist)
|
||||
if(announce_rank)
|
||||
announcer.say(";[occupant.real_name] ([announce_rank]) [on_store_message]", ignore_languages = TRUE)
|
||||
if(!silent)
|
||||
var/list/ailist = list()
|
||||
for(var/thing in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/AI = thing
|
||||
if(AI.stat)
|
||||
continue
|
||||
ailist += AI
|
||||
if(length(ailist))
|
||||
var/mob/living/silicon/ai/announcer = pick(ailist)
|
||||
if(announce_rank)
|
||||
announcer.say(";[occupant.real_name] ([announce_rank]) [on_store_message]", ignore_languages = TRUE)
|
||||
else
|
||||
announcer.say(";[occupant.real_name] [on_store_message]", ignore_languages = TRUE)
|
||||
else
|
||||
announcer.say(";[occupant.real_name] [on_store_message]", ignore_languages = TRUE)
|
||||
else
|
||||
if(announce_rank)
|
||||
announce.autosay("[occupant.real_name] ([announce_rank]) [on_store_message]", "[on_store_name]")
|
||||
else
|
||||
announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]")
|
||||
if(announce_rank)
|
||||
announce.autosay("[occupant.real_name] ([announce_rank]) [on_store_message]", "[on_store_name]")
|
||||
else
|
||||
if(announce_rank)
|
||||
announce.autosay("[occupant.real_name] ([announce_rank]) [on_store_message]", "[on_store_name]")
|
||||
else
|
||||
announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]")
|
||||
visible_message("<span class='notice'>[src] hums and hisses as it moves [occupant.real_name] into storage.</span>")
|
||||
|
||||
// Ghost and delete the mob.
|
||||
@@ -711,6 +716,10 @@
|
||||
/obj/machinery/cryopod/blob_act()
|
||||
return //Sorta gamey, but we don't really want these to be destroyed.
|
||||
|
||||
/obj/machinery/cryopod/offstation
|
||||
// Won't announce when used for cryoing.
|
||||
silent = TRUE
|
||||
|
||||
/obj/machinery/computer/cryopod/robot
|
||||
name = "robotic storage console"
|
||||
desc = "An interface between crew and the robotic storage systems"
|
||||
|
||||
@@ -1285,6 +1285,7 @@ About the new airlock wires panel:
|
||||
sleep(6)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
electronics = new /obj/item/airlock_electronics/destroyed()
|
||||
operating = FALSE
|
||||
if(!open())
|
||||
update_icon(AIRLOCK_CLOSED, 1)
|
||||
@@ -1406,9 +1407,6 @@ About the new airlock wires panel:
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.forceMove(loc)
|
||||
if(emagged)
|
||||
ae.icon_state = "door_electronics_smoked"
|
||||
operating = 0
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/door/airlock/proc/note_type() //Returns a string representing the type of note pinned to this airlock
|
||||
|
||||
@@ -102,3 +102,16 @@
|
||||
|
||||
if("clear_all")
|
||||
selected_accesses = list()
|
||||
|
||||
/obj/item/airlock_electronics/destroyed
|
||||
name = "burned-out airlock electronics"
|
||||
icon_state = "door_electronics_smoked"
|
||||
|
||||
/obj/item/airlock_electronics/destroyed/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/airlock_electronics/destroyed/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
C.stored_comms["metal"] += 1
|
||||
C.stored_comms["glass"] += 1
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
@@ -219,6 +219,7 @@
|
||||
if(!operating && density && !emagged)
|
||||
emagged = TRUE
|
||||
operating = TRUE
|
||||
electronics = new /obj/item/airlock_electronics/destroyed()
|
||||
flick("[base_state]spark", src)
|
||||
playsound(src, "sparks", 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
sleep(6)
|
||||
@@ -279,11 +280,6 @@
|
||||
WA.update_icon()
|
||||
WA.created_name = name
|
||||
|
||||
if(emagged)
|
||||
to_chat(user, "<span class='warning'>You discard the damaged electronics.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You remove the airlock electronics.</span>")
|
||||
|
||||
var/obj/item/airlock_electronics/ae
|
||||
|
||||
@@ -98,9 +98,8 @@ FIRE ALARM
|
||||
if(istype(I, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/coil = I
|
||||
if(!coil.use(5))
|
||||
to_chat(user, "<span class='warning'>You cut the wires!</span>")
|
||||
to_chat(user, "<span class='warning'>You need a total of five cables to wire [src]!</span>")
|
||||
return
|
||||
|
||||
buildstage = FIRE_ALARM_READY
|
||||
playsound(get_turf(src), I.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You wire [src]!</span>")
|
||||
|
||||
+144
-114
@@ -39,21 +39,22 @@
|
||||
density = 0
|
||||
|
||||
|
||||
var/obj/item/card/id/giver
|
||||
var/obj/item/card/id/scan
|
||||
var/list/accesses = list()
|
||||
var/giv_name = "NOT SPECIFIED"
|
||||
var/reason = "NOT SPECIFIED"
|
||||
var/duration = 5
|
||||
var/print_cooldown = 0
|
||||
|
||||
var/list/internal_log = list()
|
||||
var/mode = 0 // 0 - making pass, 1 - viewing logs
|
||||
var/mode = FALSE // FALSE - making pass, TRUE - viewing logs
|
||||
|
||||
/obj/machinery/computer/guestpass/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/card/id))
|
||||
if(!giver)
|
||||
if(!scan)
|
||||
if(user.drop_item())
|
||||
I.forceMove(src)
|
||||
giver = I
|
||||
scan = I
|
||||
updateUsrDialog()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is already ID card inside.</span>")
|
||||
@@ -61,132 +62,161 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/guestpass/proc/get_changeable_accesses()
|
||||
return giver.access
|
||||
return scan.access
|
||||
|
||||
/obj/machinery/computer/guestpass/attack_ai(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
|
||||
/obj/machinery/computer/guestpass/attack_hand(mob/user as mob)
|
||||
/obj/machinery/computer/guestpass/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
ui_interact(user)
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat
|
||||
/obj/machinery/computer/guestpass/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "GuestPass", name, 500, 850, master_ui, state)
|
||||
ui.open()
|
||||
ui.set_autoupdate(FALSE)
|
||||
|
||||
if(mode == 1) //Logs
|
||||
dat += "<h3>Activity log</h3><br>"
|
||||
for(var/entry in internal_log)
|
||||
dat += "[entry]<br><hr>"
|
||||
dat += "<a href='?src=[UID()];action=print'>Print</a><br>"
|
||||
dat += "<a href='?src=[UID()];mode=0'>Back</a><br>"
|
||||
/obj/machinery/computer/guestpass/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["showlogs"] = mode
|
||||
data["scan_name"] = scan ? scan.name : FALSE
|
||||
data["issue_log"] = internal_log ? internal_log : list()
|
||||
data["giv_name"] = giv_name
|
||||
data["reason"] = reason
|
||||
data["duration"] = duration
|
||||
if(scan && !(ACCESS_CHANGE_IDS in scan.access))
|
||||
data["grantableList"] = scan ? scan.access : list()
|
||||
data["canprint"] = FALSE
|
||||
if(!scan)
|
||||
data["printmsg"] = "No card inserted."
|
||||
else if(!length(scan.access))
|
||||
data["printmsg"] = "Card has no access."
|
||||
else if(!length(accesses))
|
||||
data["printmsg"] = "No access types selected."
|
||||
else if(print_cooldown > world.time)
|
||||
data["printmsg"] = "Busy for [(round((print_cooldown - world.time) / 10))]s.."
|
||||
else
|
||||
dat += "<h3>Guest pass terminal #[uid]</h3><br>"
|
||||
dat += "<a href='?src=[UID()];mode=1'>View activity log</a><br><br>"
|
||||
dat += "Issuing ID: <a href='?src=[UID()];action=id'>[giver]</a><br>"
|
||||
dat += "Issued to: <a href='?src=[UID()];choice=giv_name'>[giv_name]</a><br>"
|
||||
dat += "Reason: <a href='?src=[UID()];choice=reason'>[reason]</a><br>"
|
||||
dat += "Duration (minutes): <a href='?src=[UID()];choice=duration'>[duration] m</a><br>"
|
||||
dat += "Access to areas:<br>"
|
||||
if(giver && giver.access)
|
||||
for(var/A in get_changeable_accesses())
|
||||
var/area = get_access_desc(A)
|
||||
if(A in accesses)
|
||||
area = "<b>[area]</b>"
|
||||
dat += "<a href='?src=[UID()];choice=access;access=[A]'>[area]</a><br>"
|
||||
dat += "<br><a href='?src=[UID()];action=issue'>Issue pass</a><br>"
|
||||
data["printmsg"] = "Print Pass"
|
||||
data["canprint"] = TRUE
|
||||
|
||||
var/datum/browser/popup = new(user, "guestpass", name, 400, 520)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
onclose(user, "guestpass")
|
||||
data["selectedAccess"] = accesses ? accesses : list()
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/guestpass/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["regions"] = get_accesslist_static_data(REGION_GENERAL, REGION_COMMAND)
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/guestpass/Topic(href, href_list)
|
||||
/obj/machinery/computer/guestpass/ui_act(action, params)
|
||||
if(..())
|
||||
return 1
|
||||
usr.set_machine(src)
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
|
||||
if(href_list["choice"])
|
||||
switch(href_list["choice"])
|
||||
if("giv_name")
|
||||
var/nam = strip_html_simple(input("Person pass is issued to", "Name", giv_name) as text|null)
|
||||
if(nam)
|
||||
giv_name = nam
|
||||
if("reason")
|
||||
var/reas = strip_html_simple(input("Reason why pass is issued", "Reason", reason) as text|null)
|
||||
if(reas)
|
||||
reason = reas
|
||||
if("duration")
|
||||
var/dur = input("Duration (in minutes) during which pass is valid (up to 30 minutes).", "Duration") as num|null
|
||||
if(dur)
|
||||
if(dur > 0 && dur <= 30)
|
||||
duration = dur
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Invalid duration.</span>")
|
||||
if("access")
|
||||
var/A = text2num(href_list["access"])
|
||||
if(A in accesses)
|
||||
accesses.Remove(A)
|
||||
return
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("scan") // insert/remove your ID card
|
||||
if(scan)
|
||||
if(ishuman(usr))
|
||||
scan.forceMove(get_turf(usr))
|
||||
usr.put_in_hands(scan)
|
||||
scan = null
|
||||
else
|
||||
if(giver && giver.access && (A in get_changeable_accesses()))
|
||||
scan.forceMove(get_turf(src))
|
||||
scan = null
|
||||
accesses.Cut()
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/card/id))
|
||||
if(usr.drop_item())
|
||||
I.forceMove(src)
|
||||
scan = I
|
||||
if("mode")
|
||||
mode = !mode
|
||||
if(!scan || !scan.access)
|
||||
return // everything below here requires card auth
|
||||
switch(action)
|
||||
if("giv_name")
|
||||
var/nam = strip_html_simple(input("Person pass is issued to", "Name", giv_name) as text | null)
|
||||
if(nam)
|
||||
giv_name = nam
|
||||
if("reason")
|
||||
var/reas = strip_html_simple(input("Reason why pass is issued", "Reason", reason) as text | null)
|
||||
if(reas)
|
||||
reason = reas
|
||||
if("duration")
|
||||
var/dur = input("Duration (in minutes) during which pass is valid (up to 30 minutes).", "Duration") as num | null
|
||||
if(dur)
|
||||
if(dur > 0 && dur <= 30)
|
||||
duration = dur
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Invalid duration.</span>")
|
||||
if("print")
|
||||
var/dat = "<h3>Activity log of guest pass terminal #[uid]</h3><br>"
|
||||
for(var/entry in internal_log)
|
||||
dat += "[entry]<br><hr>"
|
||||
var/obj/item/paper/P = new /obj/item/paper(loc)
|
||||
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE)
|
||||
P.name = "activity log"
|
||||
P.info = dat
|
||||
if("issue")
|
||||
if(!length(accesses))
|
||||
return
|
||||
if(print_cooldown > world.time)
|
||||
return
|
||||
var/number = add_zero("[rand(0, 9999)]", 4)
|
||||
var/entry = "\[[station_time()]\] Pass #[number] issued by [scan.registered_name] ([scan.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
|
||||
for(var/i in 1 to length(accesses))
|
||||
var/A = accesses[i]
|
||||
if(A)
|
||||
var/area = get_access_desc(A)
|
||||
entry += "[i > 1 ? ", [area]" : "[area]"]"
|
||||
var/obj/item/card/id/guest/pass = new(get_turf(src))
|
||||
pass.temp_access = accesses.Copy()
|
||||
pass.registered_name = giv_name
|
||||
pass.expiration_time = world.time + duration MINUTES
|
||||
pass.reason = reason
|
||||
pass.name = "guest pass #[number]"
|
||||
print_cooldown = world.time + 10 SECONDS
|
||||
entry += ". Expires at [station_time_timestamp("hh:mm:ss", pass.expiration_time)]."
|
||||
internal_log += entry
|
||||
if("access")
|
||||
var/A = text2num(params["access"])
|
||||
if(A in accesses)
|
||||
accesses.Remove(A)
|
||||
else if(ACCESS_CHANGE_IDS in scan.access)
|
||||
accesses += A
|
||||
else if(A in get_changeable_accesses())
|
||||
accesses += A
|
||||
if("grant_region")
|
||||
var/region = text2num(params["region"])
|
||||
if(isnull(region))
|
||||
return
|
||||
if(ACCESS_CHANGE_IDS in scan.access)
|
||||
accesses |= get_region_accesses(region)
|
||||
else
|
||||
var/list/new_accesses = get_region_accesses(region)
|
||||
for(var/A in new_accesses)
|
||||
if(A in scan.access)
|
||||
accesses.Add(A)
|
||||
if(href_list["action"])
|
||||
switch(href_list["action"])
|
||||
if("id")
|
||||
if(giver)
|
||||
if(ishuman(usr))
|
||||
giver.loc = usr.loc
|
||||
if(!usr.get_active_hand())
|
||||
usr.put_in_hands(giver)
|
||||
giver = null
|
||||
else
|
||||
giver.loc = src.loc
|
||||
giver = null
|
||||
accesses.Cut()
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/card/id))
|
||||
usr.drop_item()
|
||||
I.loc = src
|
||||
giver = I
|
||||
updateUsrDialog()
|
||||
|
||||
if("print")
|
||||
var/dat = "<h3>Activity log of guest pass terminal #[uid]</h3><br>"
|
||||
for(var/entry in internal_log)
|
||||
dat += "[entry]<br><hr>"
|
||||
// to_chat(usr, "Printing the log, standby...")
|
||||
//sleep(50)
|
||||
var/obj/item/paper/P = new/obj/item/paper( loc )
|
||||
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
|
||||
P.name = "activity log"
|
||||
P.info = dat
|
||||
|
||||
if("issue")
|
||||
if(giver)
|
||||
var/number = add_zero("[rand(0,9999)]", 4)
|
||||
var/entry = "\[[station_time()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
|
||||
for(var/i=1 to accesses.len)
|
||||
var/A = accesses[i]
|
||||
if(A)
|
||||
var/area = get_access_desc(A)
|
||||
entry += "[i > 1 ? ", [area]" : "[area]"]"
|
||||
entry += ". Expires at [station_time(world.time + duration*10*60)]."
|
||||
internal_log.Add(entry)
|
||||
|
||||
var/obj/item/card/id/guest/pass = new(src.loc)
|
||||
pass.temp_access = accesses.Copy()
|
||||
pass.registered_name = giv_name
|
||||
pass.expiration_time = world.time + duration*10*60
|
||||
pass.reason = reason
|
||||
pass.name = "guest pass #[number]"
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Cannot issue pass without issuing ID.</span>")
|
||||
updateUsrDialog()
|
||||
return
|
||||
if("deny_region")
|
||||
var/region = text2num(params["region"])
|
||||
if(isnull(region))
|
||||
return
|
||||
accesses -= get_region_accesses(region)
|
||||
if("clear_all")
|
||||
accesses = list()
|
||||
if("grant_all")
|
||||
if(ACCESS_CHANGE_IDS in scan.access)
|
||||
accesses = get_all_accesses()
|
||||
else
|
||||
var/list/new_accesses = get_all_accesses()
|
||||
for(var/A in new_accesses)
|
||||
if(A in scan.access)
|
||||
accesses += A
|
||||
if(.)
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/machinery/computer/guestpass/hop
|
||||
name = "\improper HoP guest pass terminal"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
opacity = FALSE
|
||||
anchored = 1
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
flags_2 = RAD_NO_CONTAMINATE_2
|
||||
max_integrity = 200
|
||||
|
||||
/obj/machinery/shield/New()
|
||||
|
||||
@@ -314,7 +314,7 @@
|
||||
if(state_open)
|
||||
if(store_item(I, user))
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
SStgui.update_uis(src)
|
||||
to_chat(user, "<span class='notice'>You load the [I] into the storage compartment.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't fit [I] into [src]!</span>")
|
||||
@@ -366,6 +366,7 @@
|
||||
helmet = null
|
||||
suit = null
|
||||
mask = null
|
||||
boots = null
|
||||
storage = null
|
||||
occupant = null
|
||||
|
||||
@@ -409,8 +410,6 @@
|
||||
if(uv_cycles)
|
||||
uv_cycles--
|
||||
uv = TRUE
|
||||
locked = TRUE
|
||||
update_icon()
|
||||
if(occupant)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(uv_super)
|
||||
@@ -422,7 +421,6 @@
|
||||
else
|
||||
uv_cycles = initial(uv_cycles)
|
||||
uv = FALSE
|
||||
locked = FALSE
|
||||
for(var/atom/A in contents)
|
||||
A.clean_blood(radiation_clean = FALSE) // we invoke the radiation cleaning proc directly
|
||||
A.clean_radiation(12) // instead of letting clean_blood do it
|
||||
@@ -451,9 +449,10 @@
|
||||
else
|
||||
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
|
||||
playsound(src, 'sound/machines/airlock_close.ogg', 25, 1)
|
||||
open_machine(FALSE)
|
||||
if(occupant)
|
||||
dump_contents()
|
||||
update_icon()
|
||||
SStgui.update_uis(src)
|
||||
|
||||
/obj/machinery/suit_storage_unit/relaymove(mob/user)
|
||||
if(locked)
|
||||
@@ -502,7 +501,7 @@
|
||||
if(drop)
|
||||
dropContents()
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
SStgui.update_uis(src)
|
||||
|
||||
/obj/machinery/suit_storage_unit/dropContents()
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -532,132 +531,81 @@
|
||||
if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled))
|
||||
occupant = target
|
||||
target.forceMove(src)
|
||||
updateUsrDialog()
|
||||
SStgui.update_uis(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
////////
|
||||
|
||||
/obj/machinery/suit_storage_unit/attack_hand(mob/user)
|
||||
var/dat
|
||||
if(shocked && !(stat & NOPOWER))
|
||||
if(shock(user, 100))
|
||||
return
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(..())
|
||||
return
|
||||
if(panel_open) //The maintenance panel is open. Time for some shady stuff
|
||||
wires.Interact(user)
|
||||
if(uv) //The thing is running its cauterisation cycle. You have to wait.
|
||||
dat += "<HEAD><TITLE>Suit storage unit</TITLE></HEAD>"
|
||||
dat+= "<font color ='red'><B>Unit is cauterising contents with selected UV ray intensity. Please wait.</font></B><BR>"
|
||||
else
|
||||
if(!broken)
|
||||
dat+= "<B>Welcome to the Unit control panel.</B><HR>"
|
||||
dat+= text("Helmet storage compartment: <B>[]</B><BR>",(helmet ? helmet.name : "</font><font color ='grey'>No helmet detected.") )
|
||||
if(helmet && state_open)
|
||||
dat+="<A href='?src=[UID()];dispense_helmet=1'>Dispense helmet</A><BR>"
|
||||
dat+= text("Suit storage compartment: <B>[]</B><BR>",(suit ? suit.name : "</font><font color ='grey'>No exosuit detected.") )
|
||||
if(suit && state_open)
|
||||
dat+="<A href='?src=[UID()];dispense_suit=1'>Dispense suit</A><BR>"
|
||||
dat+= text("Breathmask storage compartment: <B>[]</B><BR>",(mask ? mask.name : "</font><font color ='grey'>No breathmask detected.") )
|
||||
if(mask && state_open)
|
||||
dat+="<A href='?src=[UID()];dispense_mask=1'>Dispense mask</A><BR>"
|
||||
dat+= text("Magboots storage compartment: <B>[]</B><BR>",(boots ? boots.name : "</font><font color ='grey'>No magboots detected.") )
|
||||
if(boots && state_open)
|
||||
dat+="<A href='?src=[UID()];dispense_magboots=1'>Dispense magboots</A><BR>"
|
||||
dat+= text("Tank storage compartment: <B>[]</B><BR>",(storage ? storage.name : "</font><font color ='grey'>No storage item detected.") )
|
||||
if(storage && state_open)
|
||||
dat+="<A href='?src=[UID()];dispense_storage=1'>Dispense storage item</A><BR>"
|
||||
if(occupant)
|
||||
dat+= "<HR><B><font color ='red'>WARNING: Biological entity detected inside the Unit's storage. Please remove.</B></font><BR>"
|
||||
dat+= "<A href='?src=[UID()];eject_guy=1'>Eject extra load</A>"
|
||||
dat+= text("<HR>Unit is: [] - <A href='?src=[UID()];toggle_open=1'>[] Unit</A> ",(state_open ? "Open" : "Closed"),(state_open ? "Close" : "Open"))
|
||||
if(state_open)
|
||||
dat+="<HR>"
|
||||
else
|
||||
dat+= text(" - <A href='?src=[UID()];toggle_lock=1'>*[] Unit*</A><HR>",(locked ? "Unlock" : "Lock") )
|
||||
dat+= text("Unit status: []",(locked? "<font color ='red'><B>**LOCKED**</B></font><BR>" : "<font color ='green'><B>**UNLOCKED**</B></font><BR>") )
|
||||
dat+= "<A href='?src=[UID()];cook=1'>Start Disinfection cycle</A><BR>"
|
||||
dat += "<BR><BR><A href='?src=[user.UID()];mach_close=suit_storage_unit'>Close control panel</A>"
|
||||
else //Ohhhh shit it's dirty or broken! Let's inform the guy.
|
||||
dat+= "<HEAD><TITLE>Suit storage unit</TITLE></HEAD>"
|
||||
dat+= "<font color='maroon'><B>Unit chamber is too contaminated to continue usage. Please call for a qualified individual to perform maintenance.</font></B><BR><BR>"
|
||||
dat+= "<HR><A href='?src=[user.UID()];mach_close=suit_storage_unit'>Close control panel</A>"
|
||||
|
||||
|
||||
var/datum/browser/popup = new(user, "suit_storage_unit", name, 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
onclose(user, "suit_storage_unit")
|
||||
return
|
||||
|
||||
/obj/machinery/suit_storage_unit/proc/check_allowed(user)
|
||||
if(!(allowed(user) || !secure))
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/Topic(href, href_list)
|
||||
/obj/machinery/suit_storage_unit/attack_hand(mob/user)
|
||||
if(..() || (stat & NOPOWER))
|
||||
return
|
||||
if(shocked && shock(user, 100))
|
||||
return
|
||||
if(panel_open) //The maintenance panel is open. Time for some shady stuff
|
||||
wires.Interact(user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/suit_storage_unit/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "SuitStorage", name, 402, 268, master_ui, state)
|
||||
ui.set_autoupdate(FALSE)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/suit_storage_unit/ui_data(mob/user)
|
||||
var/list/data = list(
|
||||
"locked" = locked,
|
||||
"open" = state_open,
|
||||
"broken" = broken,
|
||||
"helmet" = helmet ? helmet.name : null,
|
||||
"suit" = suit ? suit.name : null,
|
||||
"magboots" = boots ? boots.name : null,
|
||||
"mask" = mask ? mask.name : null,
|
||||
"storage" = storage ? storage.name : null,
|
||||
"uv" = uv
|
||||
)
|
||||
return data
|
||||
|
||||
/obj/machinery/suit_storage_unit/ui_act(action, list/params)
|
||||
if(..())
|
||||
return 1
|
||||
return
|
||||
add_fingerprint(usr)
|
||||
if(shocked && !(stat & NOPOWER))
|
||||
if(shock(usr, 100))
|
||||
return
|
||||
if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
|
||||
usr.set_machine(src)
|
||||
if(href_list["toggleUV"])
|
||||
toggleUV()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["togglesafeties"])
|
||||
togglesafeties()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["dispense_helmet"])
|
||||
dispense_helmet()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["dispense_suit"])
|
||||
dispense_suit()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["dispense_mask"])
|
||||
dispense_mask()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["dispense_magboots"])
|
||||
dispense_magboots()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["dispense_storage"])
|
||||
dispense_storage()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["toggle_open"])
|
||||
if(!check_allowed(usr))
|
||||
return
|
||||
toggle_open(usr)
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["toggle_lock"])
|
||||
if(!check_allowed(usr))
|
||||
return
|
||||
toggle_lock(usr)
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["cook"])
|
||||
cook()
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["eject_guy"])
|
||||
eject_occupant(usr)
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
return FALSE
|
||||
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("dispense_helmet")
|
||||
dispense_helmet()
|
||||
if("dispense_suit")
|
||||
dispense_suit()
|
||||
if("dispense_mask")
|
||||
dispense_mask()
|
||||
if("dispense_boots")
|
||||
dispense_boots()
|
||||
if("dispense_storage")
|
||||
dispense_storage()
|
||||
if("toggle_open")
|
||||
if(!check_allowed(usr))
|
||||
return FALSE
|
||||
toggle_open(usr)
|
||||
if("toggle_lock")
|
||||
if(!check_allowed(usr))
|
||||
return FALSE
|
||||
toggle_lock(usr)
|
||||
if("cook")
|
||||
cook()
|
||||
if("eject_occupant")
|
||||
eject_occupant(usr)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/suit_storage_unit/proc/toggleUV()
|
||||
if(!panel_open)
|
||||
@@ -692,7 +640,7 @@
|
||||
mask.forceMove(loc)
|
||||
mask = null
|
||||
|
||||
/obj/machinery/suit_storage_unit/proc/dispense_magboots()
|
||||
/obj/machinery/suit_storage_unit/proc/dispense_boots()
|
||||
if(!boots)
|
||||
return
|
||||
else
|
||||
@@ -754,7 +702,7 @@
|
||||
return
|
||||
eject_occupant(usr)
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
SStgui.update_uis(src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -785,7 +733,7 @@
|
||||
update_icon()
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
SStgui.update_uis(src)
|
||||
return
|
||||
else
|
||||
occupant = null
|
||||
|
||||
@@ -303,22 +303,6 @@
|
||||
..()
|
||||
wires.cut_all()
|
||||
|
||||
/obj/machinery/syndicatebomb/self_destruct
|
||||
name = "self destruct device"
|
||||
desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age."
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
payload = /obj/item/bombcore/large
|
||||
can_unanchor = FALSE
|
||||
var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE // If set, this bomb will also cause explosive walls in the same group to explode
|
||||
|
||||
/obj/machinery/syndicatebomb/self_destruct/try_detonate(ignore_active = FALSE)
|
||||
. = ..()
|
||||
if(. && explosive_wall_group)
|
||||
for(var/wall in GLOB.explosive_walls)
|
||||
var/turf/simulated/wall/mineral/plastitanium/explosive/E = wall
|
||||
if(E.explosive_wall_group == explosive_wall_group)
|
||||
E.self_destruct()
|
||||
sleep(5)
|
||||
|
||||
///Bomb Cores///
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
/obj/machinery/tcomms
|
||||
name = "Telecommunications Device"
|
||||
desc = "Someone forgot to say what this thingy does. Please yell at a coder"
|
||||
icon = 'icons/obj/tcomms.dmi'
|
||||
icon = 'icons/obj/machines/telecomms.dmi'
|
||||
icon_state = "error"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
@@ -85,10 +85,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
/obj/machinery/tcomms/update_icon()
|
||||
. = ..()
|
||||
// Show the off sprite if were inactive, ion'd or unpowered
|
||||
if(!active || (stat & NOPOWER) || ion)
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
var/functioning = (active && !(stat & NOPOWER) && !ion)
|
||||
icon_state = "[initial(icon_state)][panel_open ? "_o" : null][functioning ? null : "_off"]"
|
||||
|
||||
|
||||
// Attack overrides. These are needed so the UIs can be opened up //
|
||||
|
||||
@@ -279,9 +279,14 @@
|
||||
if(toggle_command_bold)
|
||||
var/job = tcm.sender_job
|
||||
if((job in ert_jobs) || (job in heads) || (job in cc_jobs))
|
||||
for(var/datum/multilingual_say_piece/S in message_pieces)
|
||||
if(S.message)
|
||||
S.message = "<b>[capitalize(S.message)]</b>" // This only capitalizes the first word
|
||||
for(var/I in 1 to length(message_pieces))
|
||||
var/datum/multilingual_say_piece/S = message_pieces[I]
|
||||
if(!S.message)
|
||||
continue
|
||||
if(I == 1 && !istype(S.speaking, /datum/language/noise)) // Capitalise the first section only, unless it's an emote.
|
||||
S.message = "[capitalize(S.message)]"
|
||||
S.message = "<b>[S.message]</b>" // Make everything bolded
|
||||
|
||||
|
||||
// Language Conversion
|
||||
if(setting_language && valid_languages[setting_language])
|
||||
|
||||
@@ -1581,6 +1581,7 @@
|
||||
products = list(/obj/item/storage/bag/tray = 8,
|
||||
/obj/item/kitchen/utensil/fork = 6,
|
||||
/obj/item/trash/plate = 20,
|
||||
/obj/item/trash/bowl = 20,
|
||||
/obj/item/kitchen/knife = 3,
|
||||
/obj/item/kitchen/rollingpin = 2,
|
||||
/obj/item/kitchen/sushimat = 3,
|
||||
|
||||
@@ -517,8 +517,8 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
|
||||
equip_cooldown = 10
|
||||
name = "217-D Heavy Plasma Cutter"
|
||||
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demloishing solid obstacles."
|
||||
name = "\improper 217-D Heavy Plasma Cutter"
|
||||
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles."
|
||||
icon_state = "mecha_plasmacutter"
|
||||
item_state = "plasmacutter"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
add_overlay(occupant ? "ripley-g-full" : "ripley-g-full-open")
|
||||
|
||||
/obj/mecha/working/ripley/firefighter
|
||||
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
|
||||
desc = "A standard APLU chassis that was refitted with additional thermal protection and a cistern."
|
||||
name = "APLU \"Firefighter\""
|
||||
icon_state = "firefighter"
|
||||
initial_icon = "firefighter"
|
||||
|
||||
@@ -58,14 +58,14 @@
|
||||
/obj/effect/decal/straw/edge
|
||||
icon_state = "strawscatterededge"
|
||||
|
||||
/obj/effect/decal/ants
|
||||
/obj/effect/decal/cleanable/ants
|
||||
name = "space ants"
|
||||
desc = "A bunch of space ants."
|
||||
icon = 'icons/goonstation/effects/effects.dmi'
|
||||
icon_state = "spaceants"
|
||||
scoop_reagents = list("ants" = 20)
|
||||
|
||||
/obj/effect/decal/ants/Initialize(mapload)
|
||||
/obj/effect/decal/cleanable/ants/Initialize(mapload)
|
||||
. = ..()
|
||||
var/scale = (rand(2, 10) / 10) + (rand(0, 5) / 100)
|
||||
transform = matrix(transform, scale, scale, MATRIX_SCALE)
|
||||
|
||||
@@ -164,10 +164,9 @@
|
||||
new /obj/item/clothing/shoes/jackboots(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/nyangirl/New()
|
||||
/obj/effect/landmark/costume/schoolgirl/New()
|
||||
. = ..()
|
||||
new /obj/item/clothing/under/schoolgirl(src.loc)
|
||||
new /obj/item/clothing/head/kitty(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/maid/New()
|
||||
|
||||
@@ -255,7 +255,7 @@
|
||||
loot = list(
|
||||
// Robotics
|
||||
/obj/item/mmi/robotic_brain = 50, // Low-value, but we want to encourage getting more players back in the round.
|
||||
/obj/item/assembly/signaler/anomaly = 50, // anomaly core
|
||||
/obj/item/assembly/signaler/anomaly/random = 50, // anomaly core
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray = 25, // mecha x-ray laser
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter/precise = 25, // upgraded mecha teleporter
|
||||
/obj/item/autosurgeon = 50,
|
||||
@@ -388,11 +388,11 @@
|
||||
lootcount = 3
|
||||
lootdoubles = FALSE
|
||||
var/soups = list(
|
||||
/obj/item/reagent_containers/food/snacks/beetsoup,
|
||||
/obj/item/reagent_containers/food/snacks/stew,
|
||||
/obj/item/reagent_containers/food/snacks/hotchili,
|
||||
/obj/item/reagent_containers/food/snacks/nettlesoup,
|
||||
/obj/item/reagent_containers/food/snacks/meatballsoup)
|
||||
/obj/item/reagent_containers/food/snacks/soup/beetsoup,
|
||||
/obj/item/reagent_containers/food/snacks/soup/stew,
|
||||
/obj/item/reagent_containers/food/snacks/soup/hotchili,
|
||||
/obj/item/reagent_containers/food/snacks/soup/nettlesoup,
|
||||
/obj/item/reagent_containers/food/snacks/soup/meatballsoup)
|
||||
var/salads = list(
|
||||
/obj/item/reagent_containers/food/snacks/herbsalad,
|
||||
/obj/item/reagent_containers/food/snacks/validsalad,
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
|
||||
to_chat(user, "<span class='notice'>Now in mode: [mode].</span>")
|
||||
|
||||
/obj/item/door_remote/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>It's current mode is: [mode]</span>"
|
||||
|
||||
/obj/item/door_remote/afterattack(obj/machinery/door/airlock/D, mob/user)
|
||||
if(!istype(D))
|
||||
return
|
||||
|
||||
@@ -103,10 +103,10 @@
|
||||
/obj/item/radio/headset/syndicate/alt/syndteam
|
||||
ks1type = /obj/item/encryptionkey/syndteam
|
||||
|
||||
/obj/item/radio/headset/syndicate/alt/lavaland
|
||||
name = "syndicate lavaland headset"
|
||||
/obj/item/radio/headset/syndicate/alt/nocommon
|
||||
name = "syndicate researcher headset"
|
||||
|
||||
/obj/item/radio/headset/syndicate/alt/lavaland/New()
|
||||
/obj/item/radio/headset/syndicate/alt/nocommon/New()
|
||||
. = ..()
|
||||
set_frequency(SYND_FREQ)
|
||||
|
||||
|
||||
@@ -100,9 +100,9 @@ REAGENT SCANNER
|
||||
/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user)
|
||||
if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50))
|
||||
user.visible_message("<span class='warning'>[user] analyzes the floor's vitals!</span>", "<span class='notice'>You stupidly try to analyze the floor's vitals!</span>")
|
||||
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: <b>Healthy</b></span>")
|
||||
to_chat(user, "<span class='info'>Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FF8000'>Burn</font>/<font color='red'>Brute</font></span>")
|
||||
to_chat(user, "<span class='info'>\tDamage specifics: <font color='blue'>0</font>-<font color='green'>0</font>-<font color='#FF8000'>0</font>-<font color='red'>0</font></span>")
|
||||
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: Healthy</span>")
|
||||
to_chat(user, "<span class='info'>Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burn</font>/<font color='red'>Brute</font></span>")
|
||||
to_chat(user, "<span class='info'>\tDamage specifics: <font color='blue'>0</font> - <font color='green'>0</font> - <font color='#FFA500'>0</font> - <font color='red'>0</font></span>")
|
||||
to_chat(user, "<span class='info'>Body temperature: ???</span>")
|
||||
return
|
||||
|
||||
@@ -130,19 +130,30 @@ REAGENT SCANNER
|
||||
var/TX = H.getToxLoss() > 50 ? "<b>[H.getToxLoss()]</b>" : H.getToxLoss()
|
||||
var/BU = H.getFireLoss() > 50 ? "<b>[H.getFireLoss()]</b>" : H.getFireLoss()
|
||||
var/BR = H.getBruteLoss() > 50 ? "<b>[H.getBruteLoss()]</b>" : H.getBruteLoss()
|
||||
if(HAS_TRAIT(H, TRAIT_FAKEDEATH))
|
||||
OX = fake_oxy > 50 ? "<b>[fake_oxy]</b>" : fake_oxy
|
||||
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: dead</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: [H.stat > 1 ? "dead" : "[H.health]% healthy"]</span>")
|
||||
|
||||
var/status = "<font color='red'>Dead</font>" // Dead by default to make it simpler
|
||||
var/mob/dead/observer/ghost = H.get_ghost(TRUE)
|
||||
var/DNR = (ghost && !ghost.can_reenter_corpse)
|
||||
if(H.stat == DEAD)
|
||||
if(DNR)
|
||||
status = "<font color='red'>Dead <b>\[DNR]</b></font>"
|
||||
else // Alive or unconscious
|
||||
if(HAS_TRAIT(H, TRAIT_FAKEDEATH)) // status still shows as "Dead"
|
||||
OX = fake_oxy > 50 ? "<b>[fake_oxy]</b>" : fake_oxy
|
||||
else
|
||||
status = "[H.health]% Healthy"
|
||||
|
||||
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: [status]")
|
||||
to_chat(user, "\t Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font>")
|
||||
to_chat(user, "\t Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
|
||||
to_chat(user, "<span class='notice'>Body Temperature: [H.bodytemperature-T0C]°C ([H.bodytemperature*1.8-459.67]°F)</span>")
|
||||
if(H.timeofdeath && (H.stat == DEAD || (HAS_TRAIT(H, TRAIT_FAKEDEATH))))
|
||||
to_chat(user, "<span class='notice'>Time of Death: [station_time_timestamp("hh:mm:ss", H.timeofdeath)]</span>")
|
||||
var/tdelta = round(world.time - H.timeofdeath)
|
||||
if(tdelta < DEFIB_TIME_LIMIT)
|
||||
if(tdelta < DEFIB_TIME_LIMIT && !DNR)
|
||||
to_chat(user, "<span class='danger'>Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!</span>")
|
||||
else
|
||||
to_chat(user, "<font color='red'>Subject died [DisplayTimeText(tdelta)] ago.</font>")
|
||||
|
||||
if(mode == 1)
|
||||
var/list/damaged = H.get_damaged_organs(1,1)
|
||||
@@ -239,9 +250,9 @@ REAGENT SCANNER
|
||||
|
||||
to_chat(user, "<span class='notice'>Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font></span>")
|
||||
var/implant_detect
|
||||
for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs)
|
||||
if(CI.is_robotic())
|
||||
implant_detect += "[H.name] is modified with a [CI.name].<br>"
|
||||
for(var/obj/item/organ/internal/O in H.internal_organs)
|
||||
if(O.is_robotic())
|
||||
implant_detect += "[H.name] is modified with a [O.name].<br>"
|
||||
if(implant_detect)
|
||||
to_chat(user, "<span class='notice'>Detected cybernetic modifications:</span>")
|
||||
to_chat(user, "<span class='notice'>[implant_detect]</span>")
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "multitool"
|
||||
flags = CONDUCT
|
||||
force = 5.0
|
||||
force = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
throwforce = 0
|
||||
throw_range = 7
|
||||
|
||||
@@ -52,12 +52,12 @@
|
||||
icon_state = "waffles"
|
||||
|
||||
/obj/item/trash/plate
|
||||
name = "Plate"
|
||||
name = "plate"
|
||||
icon_state = "plate"
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/trash/snack_bowl
|
||||
name = "Snack bowl"
|
||||
name = "snack bowl"
|
||||
icon_state = "snack_bowl"
|
||||
|
||||
/obj/item/trash/fried_vox
|
||||
|
||||
@@ -332,11 +332,12 @@
|
||||
var/list/initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_EXTERNAL_AIRLOCKS)
|
||||
origin_tech = "syndicate=1"
|
||||
var/registered_user = null
|
||||
untrackable = 1
|
||||
var/anyone = FALSE //Can anyone forge the ID or just syndicate?
|
||||
untrackable = TRUE
|
||||
|
||||
/obj/item/card/id/syndicate/anyone
|
||||
anyone = TRUE
|
||||
/obj/item/card/id/syndicate/researcher
|
||||
initial_access = list(ACCESS_SYNDICATE)
|
||||
assignment = "Syndicate Researcher"
|
||||
icon_state = "syndie"
|
||||
|
||||
/obj/item/card/id/syndicate/New()
|
||||
access = initial_access.Copy()
|
||||
@@ -356,13 +357,13 @@
|
||||
if(istype(O, /obj/item/card/id))
|
||||
var/obj/item/card/id/I = O
|
||||
if(istype(user, /mob/living) && user.mind)
|
||||
if(user.mind.special_role || anyone)
|
||||
if(user.mind.special_role)
|
||||
to_chat(usr, "<span class='notice'>The card's microscanners activate as you pass it over \the [I], copying its access.</span>")
|
||||
src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming
|
||||
|
||||
/obj/item/card/id/syndicate/attack_self(mob/user as mob)
|
||||
if(!src.registered_name)
|
||||
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name))
|
||||
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name), TRUE)
|
||||
if(!t)
|
||||
to_chat(user, "<span class='warning'>Invalid name.</span>")
|
||||
return
|
||||
@@ -601,7 +602,7 @@
|
||||
registered_name = "Syndicate"
|
||||
icon_state = "syndie"
|
||||
assignment = "Syndicate Overlord"
|
||||
untrackable = 1
|
||||
untrackable = TRUE
|
||||
access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS)
|
||||
|
||||
/obj/item/card/id/captains_spare
|
||||
@@ -623,7 +624,7 @@
|
||||
item_state = "gold_id"
|
||||
registered_name = "Admin"
|
||||
assignment = "Testing Shit"
|
||||
untrackable = 1
|
||||
untrackable = TRUE
|
||||
|
||||
/obj/item/card/id/admin/New()
|
||||
access = get_absolutely_all_accesses()
|
||||
|
||||
@@ -363,7 +363,7 @@
|
||||
if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
|
||||
user.visible_message("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
|
||||
var/mob/dead/observer/ghost = H.get_ghost()
|
||||
var/mob/dead/observer/ghost = H.get_ghost(TRUE)
|
||||
if(ghost && !ghost.client)
|
||||
// In case the ghost's not getting deleted for some reason
|
||||
H.key = ghost.key
|
||||
@@ -446,10 +446,13 @@
|
||||
else if(total_burn >= 180 || total_brute >= 180)
|
||||
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
|
||||
else if(ghost)
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
|
||||
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
|
||||
window_flash(ghost.client)
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
if(!ghost.can_reenter_corpse) // DNR or AntagHUD
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: No electrical brain activity detected.</span>")
|
||||
else
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
|
||||
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
|
||||
window_flash(ghost.client)
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
else
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
|
||||
|
||||
@@ -457,7 +457,7 @@
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/firefighting
|
||||
payload_name = "fire fighting grenade"
|
||||
payload_name = "fire fighting"
|
||||
desc = "Can help to put out dangerous fires from a distance."
|
||||
stage = READY
|
||||
|
||||
|
||||
@@ -192,5 +192,10 @@
|
||||
desc = "A pair of broken zipties."
|
||||
icon_state = "cuff_white_used"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/used/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
C.stored_comms["glass"] += 1
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
|
||||
return
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
if(ishuman(M) && M.mind?.vampire)
|
||||
if(!M.mind.vampire.get_ability(/datum/vampire_passive/full))
|
||||
to_chat(M, "<span class='warning'>The nullrod's power interferes with your own!</span>")
|
||||
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
|
||||
M.mind.vampire.adjust_nullification(5, 2)
|
||||
|
||||
/obj/item/nullrod/pickup(mob/living/user)
|
||||
. = ..()
|
||||
@@ -476,7 +476,7 @@
|
||||
return
|
||||
|
||||
if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration.
|
||||
target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120)
|
||||
target.mind.vampire.adjust_nullification(120, 50)
|
||||
to_chat(target, "<span class='userdanger'>[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!</span>")
|
||||
praying = FALSE
|
||||
return
|
||||
@@ -500,7 +500,7 @@
|
||||
if(holder.l_hand == src || holder.r_hand == src) // Holding this in your hand will
|
||||
for(var/mob/living/carbon/human/H in range(5, loc))
|
||||
if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
|
||||
H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2)
|
||||
H.mind.vampire.adjust_nullification(5, 2)
|
||||
if(prob(10))
|
||||
to_chat(H, "<span class='userdanger'>Being in the presence of [holder]'s [src] is interfering with your powers!</span>")
|
||||
|
||||
|
||||
@@ -838,7 +838,7 @@
|
||||
|
||||
/obj/item/book/manual/chef_recipes
|
||||
name = "Chef Recipes"
|
||||
icon_state = "cooked_book"
|
||||
icon_state = "cook_book"
|
||||
author = "NanoTrasen"
|
||||
title = "Chef Recipes"
|
||||
dat = {"
|
||||
|
||||
@@ -52,6 +52,11 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/staff/broom/dropped(mob/user)
|
||||
if((user.mind in SSticker.mode.wizards) && user.flying)
|
||||
user.flying = FALSE
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/staff/broom/horsebroom
|
||||
name = "broomstick horse"
|
||||
desc = "Saddle up!"
|
||||
|
||||
@@ -638,7 +638,7 @@
|
||||
/obj/item/twohanded/singularityhammer
|
||||
name = "singularity hammer"
|
||||
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
|
||||
icon_state = "mjollnir0"
|
||||
icon_state = "singulohammer0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
force = 5
|
||||
@@ -665,7 +665,7 @@
|
||||
charged++
|
||||
|
||||
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
icon_state = "singulohammer[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
|
||||
|
||||
@@ -75,10 +75,14 @@
|
||||
|
||||
/obj/structure/closet/proc/dump_contents()
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(T)
|
||||
for(var/mob/AM1 in src) //Does the same as below but removes the mobs first to avoid forcing players to step on items in the locker (e.g. soap) when opened.
|
||||
AM1.forceMove(T)
|
||||
if(throwing) // you keep some momentum when getting out of a thrown closet
|
||||
step(AM, dir)
|
||||
step(AM1, dir)
|
||||
for(var/atom/movable/AM2 in src)
|
||||
AM2.forceMove(T)
|
||||
if(throwing) // you keep some momentum when getting out of a thrown closet
|
||||
step(AM2, dir)
|
||||
if(throwing)
|
||||
throwing.finalize(FALSE)
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
new /obj/item/storage/backpack/cultpack(src)
|
||||
new /obj/item/clothing/head/helmet/riot/knight/templar(src)
|
||||
new /obj/item/clothing/suit/armor/riot/knight/templar(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat(src)
|
||||
new /obj/item/soulstone/anybody/purified/chaplain(src)
|
||||
new /obj/item/storage/fancy/candle_box/eternal(src)
|
||||
new /obj/item/storage/fancy/candle_box/eternal(src)
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/shoes/laceup(src)
|
||||
new /obj/item/radio/headset/heads/captain/alt(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/gloves/color/captain(src)
|
||||
new /obj/item/storage/belt/rapier(src)
|
||||
new /obj/item/gun/energy/gun(src)
|
||||
@@ -50,6 +51,7 @@
|
||||
new /obj/item/clothing/head/hopcap(src)
|
||||
new /obj/item/cartridge/hop(src)
|
||||
new /obj/item/radio/headset/heads/hop(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/storage/box/ids(src)
|
||||
new /obj/item/storage/box/PDAs(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
@@ -272,6 +274,7 @@
|
||||
new /obj/item/paicard(src)
|
||||
new /obj/item/flash(src)
|
||||
new /obj/item/clothing/glasses/hud/skills/sunglasses(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/gloves/color/white(src)
|
||||
new /obj/item/clothing/shoes/centcom(src)
|
||||
new /obj/item/clothing/under/lawyer/oldman(src)
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
|
||||
to_chat(user, "<span class='notice'>You wire the airlock assembly.</span>")
|
||||
|
||||
else if(istype(W, /obj/item/airlock_electronics) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS && W.icon_state != "door_electronics_smoked")
|
||||
else if(istype(W, /obj/item/airlock_electronics) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS && !istype(W, /obj/item/airlock_electronics/destroyed))
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...")
|
||||
|
||||
@@ -187,6 +187,7 @@
|
||||
door.name = base_name
|
||||
door.previous_airlock = previous_assembly
|
||||
electronics.forceMove(door)
|
||||
electronics = null
|
||||
qdel(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -223,9 +223,10 @@
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/equipped(mob/living/user)
|
||||
. = ..()
|
||||
var/image/I = image(icon = 'icons/obj/flora/plants.dmi' , icon_state = src.icon_state, loc = user)
|
||||
I.override = 1
|
||||
user.add_alt_appearance("sneaking_mission", I, GLOB.player_list)
|
||||
if(wielded)
|
||||
var/image/I = image(icon, user, icon_state)
|
||||
I.override = TRUE
|
||||
user.add_alt_appearance("sneaking_mission", I, GLOB.player_list)
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/dropped(mob/living/user)
|
||||
..()
|
||||
|
||||
@@ -7,7 +7,7 @@ SAFE CODES
|
||||
*/
|
||||
|
||||
#define DRILL_SPARK_CHANCE 15
|
||||
#define DRILL_TIME 300 SECONDS
|
||||
#define DRILL_TIME 120 SECONDS
|
||||
#define SOUND_CHANCE 10
|
||||
|
||||
GLOBAL_LIST_EMPTY(safes)
|
||||
|
||||
@@ -46,9 +46,6 @@
|
||||
user.visible_message("[user] rubs some dust off from the [name]'s surface.", \
|
||||
"<span class='notice'>You rub some dust off from the [name]'s surface.</span>")
|
||||
|
||||
/obj/structure/statue/CanAtmosPass()
|
||||
return !density
|
||||
|
||||
/obj/structure/statue/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(material_drop_type)
|
||||
|
||||
@@ -156,3 +156,6 @@
|
||||
|
||||
else
|
||||
. = 1
|
||||
|
||||
/obj/structure/chair/wheelchair/bike/wrench_act(mob/user, obj/item/I)
|
||||
return
|
||||
|
||||
@@ -591,7 +591,7 @@
|
||||
verbs -= /obj/structure/table/verb/do_flip
|
||||
typecache_can_hold = typecacheof(typecache_can_hold)
|
||||
for(var/atom/movable/held in get_turf(src))
|
||||
if(is_type_in_typecache(held, typecache_can_hold))
|
||||
if(!held.anchored && held.move_resist != INFINITY && is_type_in_typecache(held, typecache_can_hold))
|
||||
held_items += held.UID()
|
||||
|
||||
/obj/structure/table/tray/Move(NewLoc, direct)
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
if("02")
|
||||
//Adding airlock electronics for access. Step 6 complete.
|
||||
if(istype(W, /obj/item/airlock_electronics))
|
||||
if(istype(W, /obj/item/airlock_electronics) && !istype(W, /obj/item/airlock_electronics/destroyed))
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...")
|
||||
user.drop_item()
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
var/mineralType = null
|
||||
var/mineralAmt = 3
|
||||
var/spread = 0 //will the seam spread?
|
||||
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
|
||||
var/spreadChance = 0 //the percentile chance of an ore spreading to the neighboring tiles
|
||||
var/last_act = 0
|
||||
var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner
|
||||
var/defer_change = 0
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
/turf/simulated/wall
|
||||
name = "wall"
|
||||
desc = "A huge chunk of metal used to seperate rooms."
|
||||
desc = "A huge chunk of metal used to separate rooms."
|
||||
icon = 'icons/turf/walls/wall.dmi'
|
||||
icon_state = "wall"
|
||||
var/rotting = FALSE
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
|
||||
/turf/simulated/wall/mineral/plasma
|
||||
name = "plasma wall"
|
||||
desc = "A wall with plasma plating. This is definately a bad idea."
|
||||
desc = "A wall with plasma plating. This is definitely a bad idea."
|
||||
icon = 'icons/turf/walls/plasma_wall.dmi'
|
||||
icon_state = "plasma"
|
||||
sheet_type = /obj/item/stack/sheet/mineral/plasma
|
||||
@@ -303,26 +303,6 @@
|
||||
icon_state = "map-overspace"
|
||||
fixed_underlay = list("space"=1)
|
||||
|
||||
/turf/simulated/wall/mineral/plastitanium/explosive
|
||||
var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE
|
||||
icon_state = "map-shuttle_nd"
|
||||
smooth = SMOOTH_MORE
|
||||
|
||||
/turf/simulated/wall/mineral/plastitanium/explosive/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.explosive_walls += src
|
||||
|
||||
/turf/simulated/wall/mineral/plastitanium/explosive/Destroy()
|
||||
GLOB.explosive_walls -= src
|
||||
return ..()
|
||||
|
||||
/turf/simulated/wall/mineral/plastitanium/explosive/proc/self_destruct()
|
||||
var/obj/item/bombcore/large/explosive_wall/bombcore = new(get_turf(src))
|
||||
bombcore.detonate()
|
||||
|
||||
/turf/simulated/wall/mineral/plastitanium/explosive/ex_act(severity)
|
||||
return
|
||||
|
||||
//have to copypaste this code
|
||||
/turf/simulated/wall/mineral/plastitanium/interior/copyTurf(turf/T)
|
||||
if(T.type != type)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/turf/simulated/wall/cult/Initialize(mapload)
|
||||
. = ..()
|
||||
if(SSticker.mode)//game hasn't started offically don't do shit..
|
||||
if(SSticker.mode)//game hasn't started officially don't do shit..
|
||||
new /obj/effect/temp_visual/cult/turf(src)
|
||||
icon_state = SSticker.cultdat.cult_wall_icon_state
|
||||
|
||||
|
||||
+103
-48
@@ -1,63 +1,98 @@
|
||||
|
||||
/client/verb/who()
|
||||
set name = "Who"
|
||||
set category = "OOC"
|
||||
|
||||
var/msg = "<b>Current Players:</b>\n"
|
||||
var/list/lines = list()
|
||||
var/list/temp = list()
|
||||
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.holder && C.holder.big_brother) // BB doesn't show up at all
|
||||
continue
|
||||
|
||||
if(C.holder && C.holder.fakekey)
|
||||
temp += C.holder.fakekey
|
||||
else
|
||||
temp += C.key
|
||||
|
||||
temp = sortList(temp) // Sort it. We dont do this above because fake keys would be out of order, which would be a giveaway
|
||||
|
||||
var/list/output_players = list()
|
||||
|
||||
// Now go over it again to apply colours.
|
||||
for(var/p in temp)
|
||||
var/client/C = GLOB.directory[ckey(p)]
|
||||
if(!C)
|
||||
// This should NEVER happen, but better to be safe
|
||||
continue
|
||||
// Get the colour
|
||||
var/colour = client2rankcolour(C)
|
||||
var/out = "[p]"
|
||||
if(C.holder)
|
||||
out = "<b>[out]</b>"
|
||||
if(colour)
|
||||
out = "<font color='[colour]'>[out]</font>"
|
||||
|
||||
output_players += out
|
||||
|
||||
lines += "<b>Current Players ([length(output_players)]): </b>"
|
||||
lines += output_players.Join(", ") // Turn players into a comma separated list
|
||||
|
||||
if(check_rights(R_ADMIN, FALSE))
|
||||
lines += "Click <a href='?_src_=holder;who_advanced=1'>here</a> for detailed (old) who."
|
||||
|
||||
var/msg = lines.Join("\n")
|
||||
|
||||
to_chat(src, msg)
|
||||
|
||||
// Advanced version of `who` to show player age, antag status and more. Lags the chat when loading, so its in its own proc
|
||||
/client/proc/who_advanced()
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/list/Lines = list()
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.holder && C.holder.big_brother && !check_rights(R_PERMISSIONS, 0)) // need PERMISSIONS to see BB
|
||||
continue
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.holder && C.holder.big_brother && !check_rights(R_PERMISSIONS, FALSE)) // need PERMISSIONS to see BB
|
||||
continue
|
||||
|
||||
var/entry = "\t[C.key]"
|
||||
if(C.holder && C.holder.fakekey)
|
||||
entry += " <i>(as [C.holder.fakekey])</i>"
|
||||
entry += " - Playing as [C.mob.real_name]"
|
||||
switch(C.mob.stat)
|
||||
if(UNCONSCIOUS)
|
||||
entry += " - <font color='darkgray'><b>Unconscious</b></font>"
|
||||
if(DEAD)
|
||||
if(isobserver(C.mob))
|
||||
var/mob/dead/observer/O = C.mob
|
||||
if(O.started_as_observer)
|
||||
entry += " - <font color='gray'>Observing</font>"
|
||||
else
|
||||
entry += " - <font color='black'><b>DEAD</b></font>"
|
||||
else if(isnewplayer(C.mob))
|
||||
entry += " - <font color='green'>New Player</font>"
|
||||
var/entry = "\t[C.key]"
|
||||
if(C.holder && C.holder.fakekey)
|
||||
entry += " <i>(as [C.holder.fakekey])</i>"
|
||||
entry += " - Playing as [C.mob.real_name]"
|
||||
switch(C.mob.stat)
|
||||
if(UNCONSCIOUS)
|
||||
entry += " - <font color='darkgray'><b>Unconscious</b></font>"
|
||||
if(DEAD)
|
||||
if(isobserver(C.mob))
|
||||
var/mob/dead/observer/O = C.mob
|
||||
if(O.started_as_observer)
|
||||
entry += " - <font color='gray'>Observing</font>"
|
||||
else
|
||||
entry += " - <font color='black'><b>DEAD</b></font>"
|
||||
else if(isnewplayer(C.mob))
|
||||
entry += " - <font color='green'>New Player</font>"
|
||||
else
|
||||
entry += " - <font color='black'><b>DEAD</b></font>"
|
||||
|
||||
var/age
|
||||
if(isnum(C.player_age))
|
||||
age = C.player_age
|
||||
else
|
||||
age = 0
|
||||
var/age
|
||||
if(isnum(C.player_age))
|
||||
age = C.player_age
|
||||
else
|
||||
age = 0
|
||||
|
||||
if(age <= 1)
|
||||
age = "<font color='#ff0000'><b>[age]</b></font>"
|
||||
else if(age < 10)
|
||||
age = "<font color='#ff8c00'><b>[age]</b></font>"
|
||||
if(age <= 1)
|
||||
age = "<font color='#ff0000'><b>[age]</b></font>"
|
||||
else if(age < 10)
|
||||
age = "<font color='#ff8c00'><b>[age]</b></font>"
|
||||
|
||||
entry += " - [age]"
|
||||
entry += " - [age]"
|
||||
|
||||
if(is_special_character(C.mob))
|
||||
entry += " - <b><font color='red'>Antagonist</font></b>"
|
||||
entry += " ([ADMIN_QUE(C.mob,"?")])"
|
||||
Lines += entry
|
||||
else
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.holder && C.holder.big_brother) // BB doesn't show up at all
|
||||
continue
|
||||
if(is_special_character(C.mob))
|
||||
entry += " - <b><font color='red'>Antagonist</font></b>"
|
||||
entry += " ([ADMIN_QUE(C.mob, "?")])"
|
||||
Lines += entry
|
||||
|
||||
if(C.holder && C.holder.fakekey)
|
||||
Lines += C.holder.fakekey
|
||||
else
|
||||
Lines += C.key
|
||||
var/msg = ""
|
||||
|
||||
for(var/line in sortList(Lines))
|
||||
msg += "[line]\n"
|
||||
@@ -83,7 +118,12 @@
|
||||
if(C.holder.big_brother && !check_rights(R_PERMISSIONS, 0)) // normal admins can't see BB
|
||||
continue
|
||||
|
||||
msg += "\t[C] is a [C.holder.rank]"
|
||||
// Their rank may not have a defined colour, only set colour if so
|
||||
var/rank_colour = client2rankcolour(C)
|
||||
if(rank_colour)
|
||||
msg += "<font color='[rank_colour]'><b>[C]</b></font> is a [C.holder.rank]"
|
||||
else
|
||||
msg += "<b>[C]</b> is a [C.holder.rank]"
|
||||
|
||||
if(C.holder.fakekey)
|
||||
msg += " <i>(as [C.holder.fakekey])</i>"
|
||||
@@ -102,7 +142,12 @@
|
||||
num_admins_online++
|
||||
|
||||
else if(check_rights(R_MENTOR|R_MOD, 0, C.mob))
|
||||
modmsg += "\t[C] is a [C.holder.rank]"
|
||||
// Their rank may not have a defined colour, only set colour if so
|
||||
var/rank_colour = client2rankcolour(C)
|
||||
if(rank_colour)
|
||||
modmsg += "<font color='[rank_colour]'><b>[C]</b></font> is a [C.holder.rank]"
|
||||
else
|
||||
modmsg += "<b>[C]</b> is a [C.holder.rank]"
|
||||
|
||||
if(isobserver(C.mob))
|
||||
modmsg += " - Observing"
|
||||
@@ -120,10 +165,20 @@
|
||||
|
||||
if(check_rights(R_ADMIN, 0, C.mob))
|
||||
if(!C.holder.fakekey)
|
||||
msg += "\t[C] is a [C.holder.rank]\n"
|
||||
var/rank_colour = client2rankcolour(C)
|
||||
if(rank_colour)
|
||||
msg += "<font color='[rank_colour]'><b>[C]</b></font> is a [C.holder.rank]"
|
||||
else
|
||||
msg += "<b>[C]</b> is a [C.holder.rank]"
|
||||
msg += "\n"
|
||||
num_admins_online++
|
||||
else if(check_rights(R_MOD|R_MENTOR, 0, C.mob) && !check_rights(R_ADMIN, 0, C.mob))
|
||||
modmsg += "\t[C] is a [C.holder.rank]\n"
|
||||
var/rank_colour = client2rankcolour(C)
|
||||
if(rank_colour)
|
||||
modmsg += "<font color='[rank_colour]'><b>[C]</b></font> is a [C.holder.rank]"
|
||||
else
|
||||
modmsg += "<b>[C]</b> is a [C.holder.rank]"
|
||||
modmsg += "\n"
|
||||
num_mods_online++
|
||||
|
||||
var/noadmins_info = "\n<span class='notice'><small>If no admins or mentors are online, make a ticket anyways. Adminhelps and mentorhelps will be relayed to discord, and staff will still be informed.<small></span>"
|
||||
|
||||
@@ -190,6 +190,7 @@ GLOBAL_LIST_EMPTY(world_topic_handlers)
|
||||
config.load("config/game_options.txt","game_options")
|
||||
config.loadsql("config/dbconfig.txt")
|
||||
config.loadoverflowwhitelist("config/ofwhitelist.txt")
|
||||
config.load_rank_colour_map()
|
||||
// apply some settings from config..
|
||||
|
||||
/world/proc/update_status()
|
||||
|
||||
+25
-11
@@ -2930,20 +2930,32 @@
|
||||
GLOB.event_announcement.Announce("Feedback surge detected in mass-distributions systems. Artifical gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")
|
||||
|
||||
if("power")
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All APCs")
|
||||
log_admin("[key_name(usr)] made all areas powered", 1)
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] made all areas powered</span>", 1)
|
||||
power_restore()
|
||||
switch(alert("What Would You Like to Do?", "Make All Areas Powered", "Power all APCs", "Repair all APCs", "Repair and Power APCs")) //Alert notification in this code for standarization purposes
|
||||
if("Power all APCs")
|
||||
power_restore(TRUE, 0)
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power all APCs")
|
||||
log_and_message_admins("<span class='notice'>[key_name_admin(usr)] powered all APCs</span>", 1)
|
||||
if("Repair all APCs")
|
||||
power_restore(TRUE, 1)
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Repair all APCs")
|
||||
log_and_message_admins("<span class='notice'>[key_name_admin(usr)] repaired all APCs</span>", 1)
|
||||
if("Repair and Power APCs")
|
||||
power_restore(TRUE, 2)
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Repair and Power all APCs")
|
||||
log_and_message_admins("<span class='notice'>[key_name_admin(usr)] repaired and powered all APCs</span>", 1)
|
||||
if("unpower")
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Depower All APCs")
|
||||
log_admin("[key_name(usr)] made all areas unpowered", 1)
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] made all areas unpowered</span>", 1)
|
||||
power_failure()
|
||||
if(alert("What Would You Like to Do?", "Make All Areas Unpowered", "Depower all APCs", "Short out APCs") == "Depower all APCs")
|
||||
depower_apcs()
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Depower all APCs")
|
||||
log_and_message_admins("<span class='notice'>[key_name_admin(usr)] made all areas unpowered</span>", 1)
|
||||
else
|
||||
power_failure()
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Short out APCs")
|
||||
log_and_message_admins("<span class='notice'>[key_name_admin(usr)] has shorted APCs</span>", 1)
|
||||
if("quickpower")
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All SMESs")
|
||||
log_admin("[key_name(usr)] made all SMESs powered", 1)
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] made all SMESs powered</span>", 1)
|
||||
power_restore_quick()
|
||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All SMESs")
|
||||
log_and_message_admins("<span class='notice'>[key_name(usr)] made all SMESs powered</span>", 1)
|
||||
if("prisonwarp")
|
||||
if(!SSticker)
|
||||
alert("The game hasn't started yet!", null, null, null, null, null)
|
||||
@@ -3544,6 +3556,8 @@
|
||||
var/datum/browser/popup = new(usr, "view_karma", "Karma stats for [target_ckey]", 600, 300)
|
||||
popup.set_content(dat)
|
||||
popup.open(FALSE)
|
||||
else if(href_list["who_advanced"])
|
||||
usr.client.who_advanced()
|
||||
|
||||
/client/proc/create_eventmob_for(mob/living/carbon/human/H, killthem = 0)
|
||||
if(!check_rights(R_EVENT))
|
||||
|
||||
@@ -136,15 +136,14 @@ GLOBAL_VAR_INIT(sent_strike_team, 0)
|
||||
/client/proc/create_death_commando(obj/spawn_location, is_leader = FALSE)
|
||||
var/mob/living/carbon/human/new_commando = new(spawn_location.loc)
|
||||
var/commando_leader_rank = pick("Lieutenant", "Captain", "Major")
|
||||
var/commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
|
||||
var/commando_name = pick(GLOB.last_names)
|
||||
var/commando_name = pick(GLOB.commando_names)
|
||||
|
||||
var/datum/preferences/A = new()//Randomize appearance for the commando.
|
||||
if(is_leader)
|
||||
A.age = rand(35,45)
|
||||
A.real_name = "[commando_leader_rank] [commando_name]"
|
||||
else
|
||||
A.real_name = "[commando_rank] [commando_name]"
|
||||
A.real_name = "[commando_name]"
|
||||
A.copy_to(new_commando)
|
||||
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
var/banType = ROLE_GHOST
|
||||
var/ghost_usable = TRUE
|
||||
var/offstation_role = TRUE // If set to true, the role of the user's mind will be set to offstation
|
||||
var/death_cooldown = 0 // How long you have to wait after dying before using it again, in deciseconds. People that join as observers are not included.
|
||||
|
||||
/obj/effect/mob_spawn/attack_ghost(mob/user)
|
||||
var/mob/dead/observer/O = user
|
||||
@@ -50,6 +51,8 @@
|
||||
if(!O.can_reenter_corpse)
|
||||
to_chat(user, "<span class='warning'>You have forfeited the right to respawn.</span>")
|
||||
return
|
||||
if(time_check(user))
|
||||
return
|
||||
var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
|
||||
if(ghost_role == "No")
|
||||
return
|
||||
@@ -86,6 +89,30 @@
|
||||
/obj/effect/mob_spawn/proc/equip(mob/M)
|
||||
return
|
||||
|
||||
/obj/effect/mob_spawn/proc/time_check(mob/user)
|
||||
var/deathtime = world.time - user.timeofdeath
|
||||
var/joinedasobserver = FALSE
|
||||
if(isobserver(user))
|
||||
var/mob/dead/observer/G = user
|
||||
if(G.started_as_observer)
|
||||
joinedasobserver = TRUE
|
||||
|
||||
var/deathtimeminutes = round(deathtime / 600)
|
||||
var/pluralcheck = "minute"
|
||||
if(deathtimeminutes == 0)
|
||||
pluralcheck = ""
|
||||
else if(deathtimeminutes == 1)
|
||||
pluralcheck = " [deathtimeminutes] minute and"
|
||||
else if(deathtimeminutes > 1)
|
||||
pluralcheck = " [deathtimeminutes] minutes and"
|
||||
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10, 1)
|
||||
|
||||
if(deathtime <= death_cooldown && !joinedasobserver)
|
||||
to_chat(user, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.")
|
||||
to_chat(user, "<span class='warning'>You must wait [death_cooldown / 600] minutes to respawn!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/effect/mob_spawn/proc/create(ckey, flavour = TRUE, name)
|
||||
var/mob/living/M = new mob_type(get_turf(src)) //living mobs only
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
death_cooldown = 300 SECONDS
|
||||
var/has_owner = FALSE
|
||||
var/can_transfer = TRUE //if golems can switch bodies to this new shell
|
||||
var/mob/living/owner = null //golem's owner if it has one
|
||||
@@ -134,6 +135,25 @@
|
||||
user.death()
|
||||
return
|
||||
|
||||
/obj/effect/mob_spawn/human/golem/attackby(obj/item/I, mob/living/carbon/user, params)
|
||||
if(!istype(I, /obj/item/slimepotion/transference))
|
||||
return ..()
|
||||
if(iscarbon(user) && can_transfer)
|
||||
var/human_transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)", null, "Yes", "No")
|
||||
if(human_transfer_choice != "Yes")
|
||||
return
|
||||
if(QDELETED(src) || uses <= 0 || user.stat >= 1 || QDELETED(I))
|
||||
return
|
||||
if(istype(src, /obj/effect/mob_spawn/human/golem/servant))
|
||||
has_owner = FALSE
|
||||
flavour_text = null
|
||||
user.visible_message("<span class='notice'>As [user] applies the potion on the golem shell, a faint light leaves them, moving to [src] and animating it!</span>",
|
||||
"<span class='notice'>You apply the potion to [src], feeling your mind leave your body!</span>")
|
||||
message_admins("[key_name(user)] used [I] to transfer their mind into [src]")
|
||||
create(ckey = user.ckey, name = user.real_name)
|
||||
user.death() //Keeps brain intact to prevent forcing redtext
|
||||
qdel(I)
|
||||
|
||||
/obj/effect/mob_spawn/human/golem/servant
|
||||
has_owner = TRUE
|
||||
name = "inert servant golem shell"
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
#define UPLOAD_LIMIT 10485760 //Restricts client uploads to the server to 10MB //Boosted this thing. What's the worst that can happen?
|
||||
#define MIN_CLIENT_VERSION 513 // Minimum byond major version required to play.
|
||||
//I would just like the code ready should it ever need to be used.
|
||||
#define SUGGESTED_CLIENT_VERSION 513 // only integers (e.g: 513, 514) are useful here. This is the part BEFORE the ".", IE 513 out of 513.1536
|
||||
#define SUGGESTED_CLIENT_BUILD 1536 // only integers (e.g: 1536, 1539) are useful here. This is the part AFTER the ".", IE 1536 out of 513.1536
|
||||
#define SUGGESTED_CLIENT_VERSION 513 // only integers (e.g: 513, 514) are useful here. This is the part BEFORE the ".", IE 513 out of 513.1542
|
||||
#define SUGGESTED_CLIENT_BUILD 1542 // only integers (e.g: 1542, 1543) are useful here. This is the part AFTER the ".", IE 1542 out of 513.1542
|
||||
|
||||
#define SSD_WARNING_TIMER 30 // cycles, not seconds, so 30=60s
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
slot = slot_w_uniform
|
||||
sort_category = "Uniforms and Casual Dress"
|
||||
|
||||
/datum/gear/uniform/suits
|
||||
/datum/gear/uniform/suit
|
||||
subtype_path = /datum/gear/uniform/suit
|
||||
|
||||
//there's a lot more colors than I thought there were @_@
|
||||
|
||||
@@ -192,6 +192,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
"1020" = 100, // CHANNEL_HEARTBEAT
|
||||
"1019" = 100, // CHANNEL_BUZZ
|
||||
"1018" = 100, // CHANNEL_AMBIENCE
|
||||
"1017" = 100, // CHANNEL_ENGINE
|
||||
)
|
||||
/// The volume mixer save timer handle. Used to debounce the DB call to save, to avoid spamming.
|
||||
var/volume_mixer_saving = null
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
//Sanitize
|
||||
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
|
||||
UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style))
|
||||
UI_style = sanitize_inlist(UI_style, list("White", "Midnight", "Plasmafire", "Retro", "Slimecore", "Operative"), initial(UI_style))
|
||||
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
|
||||
toggles = sanitize_integer(toggles, 0, TOGGLES_TOTAL, initial(toggles))
|
||||
toggles2 = sanitize_integer(toggles2, 0, TOGGLES_2_TOTAL, initial(toggles2))
|
||||
|
||||
@@ -263,6 +263,7 @@
|
||||
icon_state = "meson"
|
||||
item_state = "meson"
|
||||
resistance_flags = NONE
|
||||
prescription_upgradable = TRUE
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
|
||||
sprite_sheets = list(
|
||||
|
||||
@@ -486,8 +486,8 @@ BLIND // can't see anything
|
||||
|
||||
//Suit
|
||||
/obj/item/clothing/suit
|
||||
icon = 'icons/obj/clothing/suits.dmi'
|
||||
name = "suit"
|
||||
icon = 'icons/obj/clothing/suits.dmi'
|
||||
var/fire_resist = T0C+100
|
||||
allowed = list(/obj/item/tank/internals/emergency_oxygen)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
@@ -573,7 +573,7 @@ BLIND // can't see anything
|
||||
//Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together.
|
||||
// Meaning the the suit is defined directly after the corrisponding helmet. Just like below!
|
||||
/obj/item/clothing/head/helmet/space
|
||||
name = "Space helmet"
|
||||
name = "space helmet"
|
||||
icon_state = "space"
|
||||
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -596,7 +596,7 @@ BLIND // can't see anything
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space
|
||||
name = "Space suit"
|
||||
name = "space suit"
|
||||
desc = "A suit that protects against low pressure environments. Has a big 13 on the back."
|
||||
icon_state = "space"
|
||||
item_state = "s_suit"
|
||||
@@ -618,7 +618,9 @@ BLIND // can't see anything
|
||||
resistance_flags = NONE
|
||||
hide_tail_by_species = null
|
||||
species_restricted = list("exclude","Wryn")
|
||||
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
|
||||
//Under clothing
|
||||
/obj/item/clothing/under
|
||||
|
||||
@@ -4,31 +4,33 @@
|
||||
// Pre-upgraded upgradable glasses
|
||||
name = "prescription [name]"
|
||||
|
||||
/obj/item/clothing/glasses/attackby(obj/item/O as obj, mob/user as mob)
|
||||
if(user.stat || user.restrained() || !ishuman(user))
|
||||
/obj/item/clothing/glasses/attackby(obj/item/I, mob/user)
|
||||
if(!prescription_upgradable || user.stat || user.restrained() || !ishuman(user))
|
||||
return ..()
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(prescription_upgradable)
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
if(prescription)
|
||||
to_chat(H, "You can't possibly imagine how adding more lenses would improve \the [name].")
|
||||
return
|
||||
H.unEquip(O)
|
||||
O.loc = src // Store the glasses for later removal
|
||||
to_chat(H, "You fit \the [name] with lenses from \the [O].")
|
||||
prescription = 1
|
||||
name = "prescription [name]"
|
||||
|
||||
// Adding prescription glasses
|
||||
if(istype(I, /obj/item/clothing/glasses/regular))
|
||||
if(prescription)
|
||||
to_chat(H, "<span class='warning'>You can't possibly imagine how adding more lenses would improve [src].</span>")
|
||||
return
|
||||
if(prescription && istype(O, /obj/item/screwdriver))
|
||||
var/obj/item/clothing/glasses/regular/G = locate() in src
|
||||
if(!G)
|
||||
G = new(get_turf(H))
|
||||
to_chat(H, "You salvage the prescription lenses from \the [name].")
|
||||
prescription = 0
|
||||
name = initial(name)
|
||||
H.put_in_hands(G)
|
||||
return
|
||||
return ..()
|
||||
H.unEquip(I)
|
||||
I.loc = src // Store the glasses for later removal
|
||||
to_chat(H, "<span class='notice'>You fit [src] with lenses from [I].</span>")
|
||||
prescription = TRUE
|
||||
name = "prescription [initial(name)]"
|
||||
|
||||
// Removing prescription glasses
|
||||
else if(prescription && istype(I, /obj/item/screwdriver))
|
||||
var/obj/item/clothing/glasses/regular/G = locate() in src
|
||||
if(!G)
|
||||
G = new(src)
|
||||
to_chat(H, "<span class='notice'>You salvage the prescription lenses from [src].</span>")
|
||||
prescription = FALSE
|
||||
name = initial(name)
|
||||
H.put_in_hands(G)
|
||||
|
||||
H.update_nearsighted_effects()
|
||||
|
||||
/obj/item/clothing/glasses/visor_toggling()
|
||||
..()
|
||||
@@ -59,7 +61,7 @@
|
||||
eyes.receive_damage(5)
|
||||
|
||||
/obj/item/clothing/glasses/meson
|
||||
name = "Optical Meson Scanner"
|
||||
name = "optical meson scanner"
|
||||
desc = "Used for seeing walls, floors, and stuff through anything."
|
||||
icon_state = "meson"
|
||||
item_state = "meson"
|
||||
@@ -76,8 +78,8 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/meson/night
|
||||
name = "Night Vision Optical Meson Scanner"
|
||||
desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
|
||||
name = "night vision optical meson scanner"
|
||||
desc = "An optical meson scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
|
||||
icon_state = "nvgmeson"
|
||||
origin_tech = "magnets=4;engineering=5;plasmatech=4"
|
||||
see_in_dark = 8
|
||||
@@ -100,7 +102,7 @@
|
||||
sharp = 1
|
||||
|
||||
/obj/item/clothing/glasses/meson/cyber
|
||||
name = "Eye Replacement Implant"
|
||||
name = "eye replacement implant"
|
||||
desc = "An implanted replacement for a left eye with meson vision capabilities."
|
||||
icon_state = "cybereye-green"
|
||||
item_state = "eyepatch"
|
||||
@@ -114,7 +116,7 @@
|
||||
icon_state = "purple"
|
||||
item_state = "glasses"
|
||||
origin_tech = "magnets=2;engineering=1"
|
||||
prescription_upgradable = 0
|
||||
prescription_upgradable = TRUE
|
||||
scan_reagents = 1 //You can see reagents while wearing science goggles
|
||||
resistance_flags = ACID_PROOF
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
|
||||
@@ -130,15 +132,16 @@
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/science/night
|
||||
name = "Night Vision Science Goggle"
|
||||
name = "night vision science goggles"
|
||||
desc = "Now you can science in darkness."
|
||||
icon_state = "nvpurple"
|
||||
item_state = "glasses"
|
||||
see_in_dark = 8
|
||||
prescription_upgradable = FALSE
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these
|
||||
|
||||
/obj/item/clothing/glasses/janitor
|
||||
name = "Janitorial Goggles"
|
||||
name = "janitorial goggles"
|
||||
desc = "These'll keep the soap out of your eyes."
|
||||
icon_state = "purple"
|
||||
item_state = "glasses"
|
||||
@@ -148,7 +151,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/night
|
||||
name = "Night Vision Goggles"
|
||||
name = "night vision goggles"
|
||||
desc = "You can totally see in the dark now!"
|
||||
icon_state = "night"
|
||||
item_state = "glasses"
|
||||
@@ -188,7 +191,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/material
|
||||
name = "Optical Material Scanner"
|
||||
name = "optical material scanner"
|
||||
desc = "Very confusing glasses."
|
||||
icon_state = "material"
|
||||
item_state = "glasses"
|
||||
@@ -202,7 +205,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/material/cyber
|
||||
name = "Eye Replacement Implant"
|
||||
name = "eye replacement implant"
|
||||
desc = "An implanted replacement for a left eye with material vision capabilities."
|
||||
icon_state = "cybereye-blue"
|
||||
item_state = "eyepatch"
|
||||
@@ -210,7 +213,7 @@
|
||||
flags_cover = null
|
||||
|
||||
/obj/item/clothing/glasses/material/lighting
|
||||
name = "Neutron Goggles"
|
||||
name = "neutron goggles"
|
||||
desc = "These odd glasses use a form of neutron-based imaging to completely negate the effects of light and darkness."
|
||||
origin_tech = null
|
||||
vision_flags = 0
|
||||
@@ -238,8 +241,8 @@
|
||||
item_state = "hipster_glasses"
|
||||
|
||||
/obj/item/clothing/glasses/threedglasses
|
||||
name = "\improper 3D glasses"
|
||||
desc = "A long time ago, people used these glasses to makes images from screens threedimensional."
|
||||
name = "3D glasses"
|
||||
icon_state = "3d"
|
||||
item_state = "3d"
|
||||
|
||||
@@ -250,7 +253,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/gglasses
|
||||
name = "Green Glasses"
|
||||
name = "green glasses"
|
||||
desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme."
|
||||
icon_state = "gglasses"
|
||||
item_state = "gglasses"
|
||||
@@ -263,8 +266,8 @@
|
||||
prescription_upgradable = 1
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses
|
||||
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
|
||||
name = "sunglasses"
|
||||
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
|
||||
icon_state = "sun"
|
||||
item_state = "sunglasses"
|
||||
see_in_dark = 1
|
||||
@@ -279,8 +282,8 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses_fake
|
||||
desc = "Cheap, plastic sunglasses. They don't even have UV protection."
|
||||
name = "cheap sunglasses"
|
||||
desc = "Cheap, plastic sunglasses. They don't even have UV protection."
|
||||
icon_state = "sun"
|
||||
item_state = "sunglasses"
|
||||
see_in_dark = 0
|
||||
@@ -332,8 +335,8 @@
|
||||
scan_reagents = 1
|
||||
|
||||
/obj/item/clothing/glasses/virussunglasses
|
||||
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
|
||||
name = "sunglasses"
|
||||
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
|
||||
icon_state = "sun"
|
||||
item_state = "sunglasses"
|
||||
see_in_dark = 1
|
||||
@@ -347,8 +350,8 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/lasers
|
||||
desc = "A peculiar set of sunglasses; they have various chips and other panels attached to the sides of the frames."
|
||||
name = "high-tech sunglasses"
|
||||
desc = "A peculiar set of sunglasses; they have various chips and other panels attached to the sides of the frames."
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/lasers/equipped(mob/user, slot) //grant them laser eyes upon equipping it.
|
||||
@@ -401,7 +404,7 @@
|
||||
item_state = "bigsunglasses"
|
||||
|
||||
/obj/item/clothing/glasses/thermal
|
||||
name = "Optical Thermal Scanner"
|
||||
name = "optical thermal scanner"
|
||||
desc = "Thermals in the shape of glasses."
|
||||
icon_state = "thermal"
|
||||
item_state = "glasses"
|
||||
@@ -421,25 +424,25 @@
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/thermal/monocle
|
||||
name = "Thermoncle"
|
||||
desc = "A monocle thermal."
|
||||
name = "thermoncle"
|
||||
desc = "A thermal monocle."
|
||||
icon_state = "thermoncle"
|
||||
flags_cover = null //doesn't protect eyes because it's a monocle, duh
|
||||
|
||||
/obj/item/clothing/glasses/thermal/eyepatch
|
||||
name = "Optical Thermal Eyepatch"
|
||||
name = "optical thermal eyepatch"
|
||||
desc = "An eyepatch with built-in thermal optics"
|
||||
icon_state = "eyepatch"
|
||||
item_state = "eyepatch"
|
||||
|
||||
/obj/item/clothing/glasses/thermal/jensen
|
||||
name = "Optical Thermal Implants"
|
||||
name = "optical thermal implant"
|
||||
desc = "A set of implantable lenses designed to augment your vision"
|
||||
icon_state = "thermalimplants"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/clothing/glasses/thermal/cyber
|
||||
name = "Eye Replacement Implant"
|
||||
name = "eye replacement implant"
|
||||
desc = "An implanted replacement for a left eye with thermal vision capabilities."
|
||||
icon_state = "cybereye-red"
|
||||
item_state = "eyepatch"
|
||||
@@ -454,6 +457,7 @@
|
||||
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
see_in_dark = 8
|
||||
scan_reagents = 1
|
||||
prescription = TRUE
|
||||
flags = NODROP
|
||||
flags_cover = null
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
desc = desc + " The display flickers slightly."
|
||||
|
||||
/obj/item/clothing/glasses/hud/health
|
||||
name = "\improper Health Scanner HUD"
|
||||
name = "health scanner HUD"
|
||||
desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
|
||||
icon_state = "healthhud"
|
||||
origin_tech = "magnets=3;biotech=2"
|
||||
@@ -42,7 +42,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/night
|
||||
name = "\improper Night Vision Health Scanner HUD"
|
||||
name = "night vision health scanner HUD"
|
||||
desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
|
||||
icon_state = "healthhudnight"
|
||||
item_state = "glasses"
|
||||
@@ -60,7 +60,7 @@
|
||||
tint = 1
|
||||
|
||||
/obj/item/clothing/glasses/hud/diagnostic
|
||||
name = "Diagnostic HUD"
|
||||
name = "diagnostic HUD"
|
||||
desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits."
|
||||
icon_state = "diagnostichud"
|
||||
origin_tech = "magnets=2;engineering=2"
|
||||
@@ -73,7 +73,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/diagnostic/night
|
||||
name = "Night Vision Diagnostic HUD"
|
||||
name = "night vision diagnostic HUD"
|
||||
desc = "A robotics diagnostic HUD fitted with a light amplifier."
|
||||
icon_state = "diagnostichudnight"
|
||||
item_state = "glasses"
|
||||
@@ -91,7 +91,7 @@
|
||||
tint = 1
|
||||
|
||||
/obj/item/clothing/glasses/hud/security
|
||||
name = "\improper Security HUD"
|
||||
name = "security HUD"
|
||||
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records."
|
||||
icon_state = "securityhud"
|
||||
origin_tech = "magnets=3;combat=2"
|
||||
@@ -115,7 +115,7 @@
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/night
|
||||
name = "\improper Night Vision Security HUD"
|
||||
name = "night vision security HUD"
|
||||
desc = "An advanced heads-up display which provides id data and vision in complete darkness."
|
||||
icon_state = "securityhudnight"
|
||||
origin_tech = "magnets=4;combat=4;plasmatech=4;engineering=5"
|
||||
@@ -146,7 +146,7 @@
|
||||
prescription = 1
|
||||
|
||||
/obj/item/clothing/glasses/hud/hydroponic
|
||||
name = "Hydroponic HUD"
|
||||
name = "hydroponic HUD"
|
||||
desc = "A heads-up display capable of analyzing the health and status of plants growing in hydro trays and soil."
|
||||
icon_state = "hydroponichud"
|
||||
HUDType = DATA_HUD_HYDROPONIC
|
||||
@@ -158,7 +158,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/hydroponic/night
|
||||
name = "Night Vision Hydroponic HUD"
|
||||
name = "night vision hydroponic HUD"
|
||||
desc = "A hydroponic HUD fitted with a light amplifier."
|
||||
icon_state = "hydroponichudnight"
|
||||
item_state = "glasses"
|
||||
@@ -201,7 +201,7 @@
|
||||
toggle_veil()
|
||||
|
||||
/obj/item/clothing/glasses/hud/skills
|
||||
name = "Skills HUD"
|
||||
name = "skills HUD"
|
||||
desc = "A heads-up display capable of showing the employment history records of NT crew members."
|
||||
icon_state = "skill"
|
||||
item_state = "glasses"
|
||||
@@ -214,7 +214,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/skills/sunglasses
|
||||
name = "Skills HUD Sunglasses"
|
||||
name = "skills HUD sunglasses"
|
||||
desc = "Sunglasses with a build-in skills HUD, showing the employment history of nearby NT crew members."
|
||||
icon_state = "sunhudskill"
|
||||
see_in_dark = 1 // None of these three can be converted to booleans. Do not try it.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/clothing/gloves/color/yellow
|
||||
desc = "These gloves will protect the wearer from electric shock."
|
||||
name = "insulated gloves"
|
||||
desc = "These gloves will protect the wearer from electric shock."
|
||||
icon_state = "yellow"
|
||||
item_state = "ygloves"
|
||||
siemens_coefficient = 0
|
||||
@@ -52,8 +52,8 @@
|
||||
siemens_coefficient = 1
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
|
||||
desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly."
|
||||
name = "budget insulated gloves"
|
||||
desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly."
|
||||
icon_state = "yellow"
|
||||
item_state = "ygloves"
|
||||
siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
|
||||
@@ -66,16 +66,16 @@
|
||||
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow/old
|
||||
desc = "Old and worn out insulated gloves, hopefully they still work."
|
||||
name = "worn out insulated gloves"
|
||||
desc = "Old and worn out insulated gloves, hopefully they still work."
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow/old/New()
|
||||
..()
|
||||
siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75)
|
||||
|
||||
/obj/item/clothing/gloves/color/black
|
||||
desc = "These gloves are fire-resistant."
|
||||
name = "black gloves"
|
||||
desc = "These gloves are fire-resistant."
|
||||
icon_state = "black"
|
||||
item_state = "bgloves"
|
||||
item_color="brown"
|
||||
@@ -226,8 +226,8 @@
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/color/captain
|
||||
desc = "Regal blue gloves, with a nice gold trim. Swanky."
|
||||
name = "captain's gloves"
|
||||
desc = "Regal blue gloves, with a nice gold trim. Swanky."
|
||||
icon_state = "captain"
|
||||
item_state = "egloves"
|
||||
item_color = "captain"
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
clipped = 1
|
||||
|
||||
/obj/item/clothing/gloves/cyborg
|
||||
desc = "beep boop borp"
|
||||
name = "cyborg gloves"
|
||||
desc = "beep boop borp"
|
||||
icon_state = "black"
|
||||
item_state = "r_hands"
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
can_leave_fibers = FALSE
|
||||
|
||||
/obj/item/clothing/gloves/combat
|
||||
desc = "These tactical gloves are both insulated and offer protection from heat sources."
|
||||
name = "combat gloves"
|
||||
desc = "These tactical gloves are both insulated and offer protection from heat sources."
|
||||
icon_state = "combat"
|
||||
item_state = "swat_gl"
|
||||
siemens_coefficient = 0
|
||||
@@ -55,8 +55,8 @@
|
||||
armor = list("melee" = 15, "bullet" = 25, "laser" = 15, "energy" = 15, "bomb" = 20, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/gloves/botanic_leather
|
||||
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
|
||||
name = "botanist's leather gloves"
|
||||
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
|
||||
icon_state = "leather"
|
||||
item_state = "ggloves"
|
||||
permeability_coefficient = 0.9
|
||||
@@ -68,8 +68,8 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30)
|
||||
|
||||
/obj/item/clothing/gloves/batmangloves
|
||||
desc = "Used for handling all things bat related."
|
||||
name = "batgloves"
|
||||
desc = "Used for handling all things bat related."
|
||||
icon_state = "bmgloves"
|
||||
item_state = "bmgloves"
|
||||
item_color="bmgloves"
|
||||
@@ -157,7 +157,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/rapid
|
||||
name = "Gloves of the North Star"
|
||||
name = "gloves of the North Star"
|
||||
desc = "Just looking at these fills you with an urge to beat the shit out of people."
|
||||
var/accepted_intents = list(INTENT_HARM)
|
||||
var/click_speed_modifier = CLICK_CD_RAPID
|
||||
@@ -166,20 +166,20 @@
|
||||
var/mob/living/M = loc
|
||||
|
||||
if(M.a_intent in accepted_intents)
|
||||
if(istype(M.mind.martial_art, /datum/martial_art/cqc))
|
||||
if(M.mind.martial_art || HAS_TRAIT(M, TRAIT_HULK))
|
||||
M.changeNext_move(CLICK_CD_MELEE)//normal attack speed for hulk, CQC and Carp.
|
||||
else
|
||||
M.changeNext_move(click_speed_modifier)
|
||||
.= FALSE
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/rapid/admin
|
||||
name = "Advanced Interactive Gloves"
|
||||
name = "advanced interactive gloves"
|
||||
desc = "The gloves are covered in indecipherable buttons and dials, your mind warps by merely looking at them."
|
||||
accepted_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM)
|
||||
click_speed_modifier = 0
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/rapid/headpat
|
||||
name = "Gloves of Headpats"
|
||||
name = "gloves of headpats"
|
||||
desc = "You feel the irresistable urge to give headpats by merely glimpsing these."
|
||||
accepted_intents = list(INTENT_HELP)
|
||||
|
||||
@@ -55,14 +55,12 @@
|
||||
icon_state = "hardhat0_orange"
|
||||
item_state = "hardhat0_orange"
|
||||
item_color = "orange"
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/hardhat/red
|
||||
name = "firefighter helmet"
|
||||
icon_state = "hardhat0_red"
|
||||
item_state = "hardhat0_red"
|
||||
item_color = "red"
|
||||
dog_fashion = null
|
||||
name = "firefighter helmet"
|
||||
flags = STOPSPRESSUREDMAGE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
|
||||
@@ -84,14 +82,13 @@
|
||||
icon_state = "hardhat0_dblue"
|
||||
item_state = "hardhat0_dblue"
|
||||
item_color = "dblue"
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/hardhat/atmos
|
||||
name = "atmospheric technician's firefighting helmet"
|
||||
desc = "A firefighter's helmet, able to keep the user cool in any situation."
|
||||
icon_state = "hardhat0_atmos"
|
||||
item_state = "hardhat0_atmos"
|
||||
item_color = "atmos"
|
||||
name = "atmospheric technician's firefighting helmet"
|
||||
desc = "A firefighter's helmet, able to keep the user cool in any situation."
|
||||
flags = STOPSPRESSUREDMAGE
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
heat_protection = HEAD
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
icon_state = "roman"
|
||||
item_state = "roman"
|
||||
strip_delay = 100
|
||||
dog_fashion = null
|
||||
dog_fashion = /datum/dog_fashion/head/roman
|
||||
|
||||
/obj/item/clothing/head/helmet/roman/fake
|
||||
desc = "An ancient helmet made of plastic and leather."
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
name = "captain's parade cap"
|
||||
desc = "Worn only by Captains with an abundance of class."
|
||||
icon_state = "capcap"
|
||||
dog_fashion = null
|
||||
dog_fashion = /datum/dog_fashion/head/captain
|
||||
|
||||
//Head of Personnel
|
||||
/obj/item/clothing/head/hopcap
|
||||
@@ -101,16 +101,18 @@
|
||||
|
||||
//Security
|
||||
/obj/item/clothing/head/HoS
|
||||
name = "head of security cap"
|
||||
name = "head of security's cap"
|
||||
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
|
||||
icon_state = "hoscap"
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
|
||||
strip_delay = 80
|
||||
dog_fashion = /datum/dog_fashion/head/HoS
|
||||
|
||||
/obj/item/clothing/head/HoS/beret
|
||||
name = "head of security beret"
|
||||
name = "head of security's beret"
|
||||
desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection."
|
||||
icon_state = "beret_hos_black"
|
||||
dog_fashion = /datum/dog_fashion/head/HoS
|
||||
|
||||
/obj/item/clothing/head/warden
|
||||
name = "warden's police hat"
|
||||
@@ -134,7 +136,7 @@
|
||||
icon_state = "beret_officer"
|
||||
armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50)
|
||||
strip_delay = 60
|
||||
dog_fashion = null
|
||||
dog_fashion = /datum/dog_fashion/head/beret/sec
|
||||
|
||||
/obj/item/clothing/head/beret/sec/warden
|
||||
name = "warden's beret"
|
||||
@@ -153,7 +155,7 @@
|
||||
icon_state = "beret_atmospherics"
|
||||
|
||||
/obj/item/clothing/head/beret/ce
|
||||
name = "chief engineer beret"
|
||||
name = "chief engineer's beret"
|
||||
desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
|
||||
icon_state = "beret_ce"
|
||||
|
||||
@@ -180,15 +182,19 @@
|
||||
/obj/item/clothing/head/surgery/purple
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is deep purple."
|
||||
icon_state = "surgcap_purple"
|
||||
dog_fashion = /datum/dog_fashion/head/surgery
|
||||
|
||||
/obj/item/clothing/head/surgery/blue
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is baby blue."
|
||||
icon_state = "surgcap_blue"
|
||||
dog_fashion = /datum/dog_fashion/head/surgery
|
||||
|
||||
/obj/item/clothing/head/surgery/green
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is dark green."
|
||||
icon_state = "surgcap_green"
|
||||
dog_fashion = /datum/dog_fashion/head/surgery
|
||||
|
||||
/obj/item/clothing/head/surgery/black
|
||||
desc = "A cap coroners wear during autopsies. Keeps their hair from falling into the cadavers. It is as dark than the coroner's humor."
|
||||
desc = "A cap coroners wear during autopsies. Keeps their hair from falling into the cadavers. It is as dark as the coroner's humor."
|
||||
icon_state = "surgcap_black"
|
||||
dog_fashion = /datum/dog_fashion/head/surgery
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user