Merge branch 'master' into no-more-myisam

This commit is contained in:
AffectedArc07
2021-05-07 15:28:47 +01:00
committed by GitHub
282 changed files with 11214 additions and 10843 deletions
+1
View File
@@ -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"
+4 -1
View File
@@ -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)
+3 -3
View File
@@ -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])
+20
View File
@@ -513,6 +513,7 @@
text = replacetext(text, "\[cell\]", "<td>")
text = replacetext(text, "\[logo\]", "&ZeroWidthSpace;<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
+2
View File
@@ -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)
+3
View File
@@ -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.")
+7 -3
View File
@@ -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
+22 -4
View File
@@ -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
+31
View File
@@ -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")
+10 -2
View File
@@ -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)
+41
View File
@@ -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!"
+7 -3
View File
@@ -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
-8
View File
@@ -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"
+9
View File
@@ -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"
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)))
+8
View File
@@ -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
-39
View File
@@ -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"
+8 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+11 -6
View File
@@ -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)
+7 -5
View File
@@ -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."
+4
View File
@@ -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
+15 -2
View File
@@ -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)
+2 -4
View File
@@ -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
+2 -23
View File
@@ -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
+25 -16
View File
@@ -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"
+1 -3
View File
@@ -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
+1 -5
View File
@@ -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
+1 -2
View File
@@ -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
View File
@@ -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"
+1
View File
@@ -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()
+68 -120
View File
@@ -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
-16
View File
@@ -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///
+3 -5
View File
@@ -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 //
+8 -3
View File
@@ -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])
+1
View File
@@ -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,
+2 -2
View File
@@ -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'
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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)
+1 -2
View File
@@ -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,
+4
View File
@@ -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)
+23 -12
View File
@@ -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]&deg;C ([H.bodytemperature*1.8-459.67]&deg;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>")
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+9 -8
View File
@@ -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()
+8 -5
View File
@@ -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>")
+1 -1
View File
@@ -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 = {"
+5
View File
@@ -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!"
+2 -2
View File
@@ -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()
+4 -3
View File
@@ -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)
..()
+1 -1
View File
@@ -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)
-3
View File
@@ -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
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -21
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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>"
+1
View File
@@ -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
View File
@@ -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))
+2 -3
View File
@@ -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)
+27
View File
@@ -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"
+2 -2
View File
@@ -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))
+1
View File
@@ -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(
+6 -4
View File
@@ -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
+49 -45
View File
@@ -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
+10 -10
View File
@@ -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.
+5 -5
View File
@@ -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)
+3 -6
View File
@@ -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
+1 -1
View File
@@ -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."
+12 -6
View File
@@ -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