Merge branch 'master' into upstream-merge-31077

This commit is contained in:
LetterJay
2017-09-29 12:46:25 -04:00
committed by GitHub
99 changed files with 1533 additions and 766 deletions
@@ -9,7 +9,7 @@
var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new
var/datum/action/innate/set_droppoint/set_droppoint_action = new
var/obj/machinery/abductor/console/console
z_lock = ZLEVEL_STATION_PRIMARY
station_lock_override = TRUE
icon = 'icons/obj/abductor.dmi'
icon_state = "camera"
+27 -49
View File
@@ -22,27 +22,17 @@
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
var/list/pre_nukeops = list()
/datum/game_mode/nuclear/pre_setup()
var/n_players = num_players()
var/n_agents = min(round(n_players / 10, 1), agents_possible)
if(antag_candidates.len < n_agents) //In the case of having less candidates than the selected number of agents
n_agents = antag_candidates.len
while(n_agents > 0)
var/datum/mind/new_syndicate = pick(antag_candidates)
syndicates += new_syndicate
antag_candidates -= new_syndicate //So it doesn't pick the same guy each time.
n_agents--
for(var/datum/mind/synd_mind in syndicates)
synd_mind.assigned_role = "Syndicate"
synd_mind.special_role = "Syndicate"//So they actually have a special role/N
log_game("[synd_mind.key] (ckey) has been selected as a nuclear operative")
return 1
var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible)
for(var/i = 0, i < n_agents, ++i)
var/datum/mind/new_op = pick_n_take(antag_candidates)
pre_nukeops += new_op
new_op.assigned_role = "Nuclear Operative"
new_op.special_role = "Nuclear Operative"
log_game("[new_op.key] (ckey) has been selected as a nuclear operative")
return TRUE
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
@@ -60,48 +50,36 @@
////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/nuclear/post_setup()
var/list/turf/synd_spawn = list()
for(var/obj/effect/landmark/A in GLOB.landmarks_list)
if(A.name == "Syndicate-Spawn")
synd_spawn += get_turf(A)
continue
var/nuke_code = random_nukecode()
var/leader_selected = 0
var/agent_number = 1
var/spawnpos = 1
var/datum/mind/leader = pick(pre_nukeops)
syndicates += pre_nukeops
for(var/i = 1 to pre_nukeops.len)
var/datum/mind/op = pre_nukeops[i]
for(var/datum/mind/synd_mind in syndicates)
if(spawnpos > synd_spawn.len)
spawnpos = 2
synd_mind.current.loc = synd_spawn[spawnpos]
forge_syndicate_objectives(synd_mind)
greet_syndicate(synd_mind)
equip_syndicate(synd_mind.current)
forge_syndicate_objectives(op)
greet_syndicate(op)
equip_syndicate(op.current)
if(nuke_code)
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
to_chat(synd_mind.current, "The nuclear authorization code is: <B>[nuke_code]</B>")
op.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
to_chat(op.current, "The nuclear authorization code is: <B>[nuke_code]</B>")
if(!leader_selected)
prepare_syndicate_leader(synd_mind, nuke_code)
leader_selected = 1
if(op == leader)
op.current.forceMove(pick(GLOB.nukeop_leader_start))
prepare_syndicate_leader(op, nuke_code)
else
synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]"
agent_number++
spawnpos++
update_synd_icons_added(synd_mind)
synd_mind.current.playsound_local(get_turf(synd_mind.current), 'sound/ambience/antag/ops.ogg',100,0)
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1])
op.current.real_name = "[syndicate_name()] Operative #[agent_number++]"
update_synd_icons_added(op)
op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0)
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
if(nuke)
nuke.r_code = nuke_code
return ..()
/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code)
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
spawn(1)
+1 -1
View File
@@ -121,7 +121,7 @@
return target
/datum/objective/assassinate/check_completion()
return !target || !considered_alive(target)
return !considered_alive(target) || considered_afk(target)
/datum/objective/assassinate/update_explanation_text()
..()
+3 -9
View File
@@ -154,8 +154,7 @@
var/obj/item/device/assembly/flash/T = new(mob)
var/obj/item/toy/crayon/spraycan/R = new(mob)
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob)
var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -163,13 +162,8 @@
"right pocket" = slot_r_store
)
var/where = mob.equip_in_one_of_slots(T, slots)
var/where2 = mob.equip_in_one_of_slots(C, slots)
mob.equip_in_one_of_slots(R,slots)
if (!where2)
to_chat(mob, "The Syndicate were unfortunately unable to get you a chameleon security HUD.")
else
to_chat(mob, "The chameleon security HUD in your [where2] will help you keep track of who is mindshield-implanted, and unable to be recruited.")
S.Insert(mob, special = FALSE, drop_if_replaced = FALSE)
to_chat(mob, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.")
if (!where)
to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.")
@@ -3,7 +3,8 @@
desc = "Used to access the various cameras on the station."
icon_screen = "cameras"
icon_keyboard = "security_key"
var/z_lock = null // Lock use to this zlevel
var/list/z_lock = list() // Lock use to these z levels
var/station_lock_override = FALSE
var/mob/camera/aiEye/remote/eyeobj
var/mob/living/current_user = null
var/list/networks = list("SS13")
@@ -13,6 +14,11 @@
light_color = LIGHT_COLOR_RED
/obj/machinery/computer/camera_advanced/Initialize()
. = ..()
if(station_lock_override)
z_lock = GLOB.station_z_levels.Copy()
/obj/machinery/computer/camera_advanced/syndie
icon_keyboard = "syndie_key"
@@ -76,7 +82,7 @@
if(!eyeobj.eye_initialized)
var/camera_location
for(var/obj/machinery/camera/C in GLOB.cameranet.cameras)
if(!C.can_use() || z_lock && C.z != z_lock)
if(!C.can_use() || z_lock.len && !(C.z in z_lock))
continue
if(C.network & networks)
camera_location = get_turf(C)
@@ -201,7 +207,7 @@
var/list/L = list()
for (var/obj/machinery/camera/cam in GLOB.cameranet.cameras)
if(origin.z_lock && cam.z != origin.z_lock)
if(origin.z_lock.len && !(cam.z in origin.z_lock))
continue
L.Add(cam)
+2
View File
@@ -213,6 +213,8 @@ GLOBAL_LIST_INIT(pipeID2State, list(
return ..()
if (!isturf(src.loc))
return 1
add_fingerprint(user)
fixdir()
if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER))
+17 -18
View File
@@ -157,11 +157,27 @@
/obj/effect/landmark/start/wizard
name = "wizard"
/obj/effect/landmark/start/wizard/Initialize(mapload)
/obj/effect/landmark/start/wizard/Initialize()
..()
GLOB.wizardstart += loc
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/start/nukeop
name = "nukeop"
/obj/effect/landmark/start/nukeop/Initialize()
..()
GLOB.nukeop_start += loc
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/start/nukeop_leader
name = "nukeop leader"
/obj/effect/landmark/start/nukeop_leader/Initialize()
..()
GLOB.nukeop_leader_start += loc
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/start/new_player
name = "New Player"
@@ -205,23 +221,6 @@
/obj/effect/landmark/tripai
name = "tripai"
// marauder entry (XXX WTF IS MAURADER ENTRY???)
/obj/effect/landmark/marauder_entry
name = "Marauder Entry"
// syndicate breach area (XXX I DON'T KNOW WHAT THIS IS EITHER)
/obj/effect/landmark/syndicate_breach_area
name = "Syndicate Breach Area"
// teleport scroll landmark, XXX DOES THIS DO ANYTHING?
/obj/effect/landmark/teleport_scroll
name = "Teleport-Scroll"
/obj/effect/landmark/syndicate_spawn
name = "Syndicate-Spawn"
// xenos.
/obj/effect/landmark/xeno_spawn
name = "xeno_spawn"
+1 -1
View File
@@ -33,7 +33,7 @@
if(!force_rebuild && range == current_range)
return FALSE
. = TRUE
current_range = range
var/list/checkers_local = checkers
+3
View File
@@ -234,6 +234,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M))
return ..()
if(M.on_fire && !lit)
light("<span class='notice'>[user] lights [src] with [M]'s burning body. What a cold-blooded badass.</span>")
return
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == INTENT_HELP)
if(cig.lit)
+36 -3
View File
@@ -26,6 +26,14 @@ GLOBAL_LIST_EMPTY(PDAs)
var/obj/item/cartridge/cartridge = null //current cartridge
var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge.
var/icon_alert = "pda-r" //Icon to be overlayed for message alerts. Taken from the pda icon file.
var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again.
var/font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" //The currently selected font.
var/background_color = "#808000" //The currently selected background color.
#define FONT_VT 0
#define FONT_SHARE 1
#define FONT_ORBITRON 2
#define FONT_MONO 3
//Secondary variables
var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner.
@@ -121,7 +129,8 @@ GLOBAL_LIST_EMPTY(PDAs)
hidden_uplink.interact(user)
return
var/dat = "<html><head><title>Personal Data Assistant</title></head><body bgcolor=\"#808000\"><style>a, a:link, a:visited, a:active, a:hover { color: #000000; }img {border-style:none;}</style>"
var/dat = "<!DOCTYPE html><html><head><title>Personal Data Assistant</title><link href=\"https://fonts.googleapis.com/css?family=Orbitron|Share+Tech+Mono|VT323\" rel=\"stylesheet\"></head><body bgcolor=\"" + background_color + "\"><style>body{" + font_mode + "}ul,ol{list-style-type: none;}a, a:link, a:visited, a:active, a:hover { color: #000000;text-decoration:none; }img {border-style:none;}</style>"
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=pda_refresh.png> Refresh</a>"
@@ -130,6 +139,12 @@ GLOBAL_LIST_EMPTY(PDAs)
if (mode)
dat += " | <a href='byond://?src=\ref[src];choice=Return'><img src=pda_menu.png> Return</a>"
if (mode == 0)
dat += "<div align=\"center\">"
dat += "<br><a href='byond://?src=\ref[src];choice=Toggle_Font'>Toggle Font</a>"
dat += " | <a href='byond://?src=\ref[src];choice=Change_Color'>Change Color</a>"
dat += "</div>"
dat += "<br>"
if (!owner)
@@ -307,6 +322,24 @@ GLOBAL_LIST_EMPTY(PDAs)
//BASIC FUNCTIONS===================================
if("Refresh")//Refresh, goes to the end of the proc.
if ("Toggle_Font")
//CODE REVISION 2
font_index = (font_index + 1) % 4
switch(font_index)
if (FONT_VT)
font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;"
if (FONT_SHARE)
font_mode = "font-family:\"Share Tech Mono\", monospace;letter-spacing:0px;"
if (FONT_ORBITRON)
font_mode = "font-family:\"Orbitron\", monospace;letter-spacing:0px; font-size:15px"
if (FONT_MONO)
font_mode = "font-family:monospace;"
if ("Change_Color")
var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').")as color
background_color = new_color
if("Return")//Return
if(mode<=9)
mode = 0
@@ -538,7 +571,7 @@ GLOBAL_LIST_EMPTY(PDAs)
P.show_recieved_message(msg,src)
if(!multiple)
show_to_ghosts(user,msg)
log_talk(user,"[key_name(user)] (PDA: [name]) sent \"[message]\" to [key_name(P,null,TRUE)]",LOGPDA)
log_talk(user,"[key_name(user)] (PDA: [initial(name)]) sent \"[message]\" to [key_name(P,null,TRUE)]",LOGPDA)
else
if(!multiple)
to_chat(user, "<span class='notice'>ERROR: Server isn't responding.</span>")
@@ -548,7 +581,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if(multiple)
show_to_sender(last_sucessful_msg,1)
show_to_ghosts(user,last_sucessful_msg,1)
log_talk(user,"[user] (PDA: [name]) sent \"[message]\" to Everyone",LOGPDA)
log_talk(user,"[user] (PDA: [initial(name)]) sent \"[message]\" to Everyone",LOGPDA)
/obj/item/device/pda/proc/show_to_sender(datum/data_pda_msg/msg,multiple = 0)
tnote += "<i><b>&rarr; To [multiple ? "Everyone" : msg.recipient]:</b></i><br>[msg.message][msg.get_photo_ref()]<br>"
+1 -1
View File
@@ -214,7 +214,7 @@ MASS SPECTROMETER
var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in C.internal_organs)
if(CI.status == ORGAN_ROBOTIC)
if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant)
cyberimp_detect += "[C.name] is modified with a [CI.name].<br>"
if(cyberimp_detect)
to_chat(user, "<span class='notice'>Detected cybernetic modifications:</span>")
+9 -2
View File
@@ -38,10 +38,14 @@
/obj/item/toy/eightball/Initialize(mapload)
. = ..()
if(prob(1))
new /obj/item/toy/eightball/haunted(get_turf(src))
if(MakeHaunted())
return INITIALIZE_HINT_QDEL
/obj/item/toy/eightball/proc/MakeHaunted()
. = prob(1)
if(.)
new /obj/item/toy/eightball/haunted(loc)
/obj/item/toy/eightball/attack_self(mob/user)
if(shaking)
return
@@ -105,6 +109,9 @@
GLOB.poi_list -= src
. = ..()
/obj/item/toy/eightball/haunted/MakeHaunted()
return FALSE
/obj/item/toy/eightball/haunted/attack_ghost(mob/user)
if(!shaking)
to_chat(user, "<span class='warning'>[src] is not currently being shaken.</span>")
@@ -390,7 +390,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
singular_name = "plastic sheet"
icon_state = "sheet-plastic"
throwforce = 7
origin_tech = "materials=1"
origin_tech = "materials=1;biotech=1"
merge_type = /obj/item/stack/sheet/plastic
+13 -15
View File
@@ -28,31 +28,29 @@
/obj/item/storage/secure/examine(mob/user)
..()
to_chat(user, text("The service panel is [src.open ? "open" : "closed"]."))
to_chat(user, text("The service panel is currently <b>[open ? "unscrewed" : "screwed shut"]</b>."))
/obj/item/storage/secure/attackby(obj/item/W, mob/user, params)
if(locked)
if (istype(W, /obj/item/screwdriver))
if (do_after(user, 20*W.toolspeed, target = src))
src.open =! src.open
user.show_message("<span class='notice'>You [open ? "open" : "close"] the service panel.</span>", 1)
if (do_after(user, 20*W.toolspeed, target = user))
open =! open
to_chat(user, "<span class='notice'>You [open ? "open" : "close"] the service panel.</span>")
return
if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking))
user.show_message("<span class='danger'>Now attempting to reset internal memory, please hold.</span>", 1)
src.l_hacking = 1
if (do_after(usr, 100*W.toolspeed, target = src))
if (prob(33))
src.l_setshort = 1
if (istype(W, /obj/item/wirecutters) || istype(W, /obj/item/card/emag))
to_chat(user, "<span class='danger'>[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be <b>pulsed</b>.</span>")
if ((istype(W, /obj/item/device/multitool)) && (!l_hacking))
if(src.open == 1)
to_chat(user, "<span class='danger'>Now attempting to reset internal memory, please hold.</span>")
src.l_hacking = 1
if (do_after(usr, 400*W.toolspeed, target = user))
to_chat(user, "<span class='danger'>Internal memory reset - lock has been disengaged.</span>")
src.l_set = 0
user.show_message("<span class='danger'>Internal memory reset. Please give it a few seconds to reinitialize.</span>", 1)
sleep(80)
src.l_setshort = 0
src.l_hacking = 0
else
user.show_message("<span class='danger'>Unable to reset internal memory.</span>", 1)
src.l_hacking = 0
else
src.l_hacking = 0
to_chat(user, "<span class='notice'>You must <b>unscrew</b> the service panel before you can pulse the wiring.</span>")
return
//At this point you have exhausted all the special things to do when locked
// ... but it's still locked.
+1 -1
View File
@@ -177,7 +177,7 @@
if("pressure")
var/pressure = params["pressure"]
if(pressure == "reset")
pressure = TANK_DEFAULT_RELEASE_PRESSURE
pressure = initial(distribute_pressure)
. = TRUE
else if(pressure == "min")
pressure = TANK_MIN_RELEASE_PRESSURE
+13
View File
@@ -138,3 +138,16 @@
desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
icon = 'icons/turf/walls/hierophant_wall.dmi'
icon_state = "wall"
/turf/closed/bullet_act(obj/item/projectile/Proj)
..()
if(!Proj.nodamage && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
var/mutable_appearance/bullet_hole = mutable_appearance('icons/effects/effects.dmi', "bullet_hole", BULLET_HOLE_LAYER)
var/random_x = rand(-13, 13)
bullet_hole.pixel_x += random_x
var/random_y = rand(-13, 13)
bullet_hole.pixel_y += random_y
add_overlay(bullet_hole, TRUE)
+1 -1
View File
@@ -444,7 +444,7 @@
/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE)
// Remove all atoms except observers, landmarks, docking ports
var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object))
var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(ignore_typecache), ignored_atoms)
var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(), ignored_atoms | ignore_typecache)
allowed_contents -= src
for(var/i in 1 to allowed_contents.len)
var/thing = allowed_contents[i]