Merge branch 'master' into upstream-merge-37476

This commit is contained in:
LetterJay
2018-05-20 23:12:07 -05:00
committed by GitHub
172 changed files with 6336 additions and 4958 deletions
+1 -1
View File
@@ -211,7 +211,7 @@ Credit where due:
to_chat(L, "<span class='bold large_brass'>There is a paper in your backpack! It'll tell you if anything's changed, as well as what to expect.</span>")
to_chat(L, "<span class='alloy'>[slot] is a <b>clockwork slab</b>, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \
as a servant, you can find a concise tutorial in the Recollection category of its interface.</span>")
to_chat(L, "<span class='alloy italics'>If you want more information, you can find a wiki link here!</span> https://tgstation13.org/wiki/Clockwork_Cult")
to_chat(L, "<span class='alloy italics'>If you want more information, you can read <a href=\"https://tgstation13.org/wiki/Clockwork_Cult\">the wiki page</a> to learn more.</span>")
return TRUE
return FALSE
+19 -19
View File
@@ -712,6 +712,8 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/min_lings = 3 //Minimum amount of lings for this team objective to be possible
var/escape_objective_compatible = FALSE
/datum/objective/changeling_team_objective/proc/prepare()
return FALSE
//Impersonate department
//Picks as many people as it can from a department (Security,Engineer,Medical,Science)
@@ -724,6 +726,19 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/department_string = ""
/datum/objective/changeling_team_objective/impersonate_department/prepare()
var/result = FALSE
if(command_staff_only)
result = get_heads()
else
result = get_department_staff()
if(result)
update_explanation_text()
return TRUE
else
return FALSE
/datum/objective/changeling_team_objective/impersonate_department/proc/get_department_staff()
department_minds = list()
department_real_names = list()
@@ -756,9 +771,8 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(!department_minds.len)
log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally")
owner.objectives -= src
qdel(src)
return
return FALSE
return TRUE
/datum/objective/changeling_team_objective/impersonate_department/proc/get_heads()
@@ -785,19 +799,8 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(!department_minds.len)
log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally")
owner.objectives -= src
qdel(src)
return
/datum/objective/changeling_team_objective/impersonate_department/New(var/text)
..()
if(command_staff_only)
get_heads()
else
get_department_staff()
update_explanation_text()
return FALSE
return TRUE
/datum/objective/changeling_team_objective/impersonate_department/update_explanation_text()
@@ -862,9 +865,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return TRUE
return FALSE
//A subtype of impersonate_department
//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD)
//and tasks the lings with killing and replacing them
+1 -1
View File
@@ -41,7 +41,7 @@
name = "a hand teleporter."
targetitem = /obj/item/hand_tele
difficulty = 5
excludefromjob = list("Captain")
excludefromjob = list("Captain", "Research Director")
/datum/objective_item/steal/jetpack
name = "the Captain's jetpack."
+1 -1
View File
@@ -399,7 +399,7 @@
QDEL_IN(mob_occupant, 40)
/obj/machinery/clonepod/relaymove(mob/user)
container_resist()
container_resist(user)
/obj/machinery/clonepod/container_resist(mob/living/user)
if(user.stat == CONSCIOUS)
+2 -30
View File
@@ -323,12 +323,12 @@
return
else
return
else if(user.hallucinating() && ishuman(user) && prob(4) && !operating)
else if(user.hallucinating() && ishuman(user) && prob(1) && !operating)
var/mob/living/carbon/human/H = user
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient)//not insulated
hallucinate_shock(H)
new /datum/hallucination/shock(H)
return
if (cyclelinkedairlock)
if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user))
@@ -338,34 +338,6 @@
addtimer(CALLBACK(cyclelinkedairlock, .proc/close), 2)
..()
/obj/machinery/door/airlock/proc/hallucinate_shock(mob/living/user)
var/image/shock_image = image(user, user, dir = user.dir)
var/image/electrocution_skeleton_anim = image('icons/mob/human.dmi', user, icon_state = "electrocuted_base", layer=ABOVE_MOB_LAYER)
shock_image.color = rgb(0,0,0)
shock_image.override = TRUE
electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART
to_chat(user, "<span class='userdanger'>You feel a powerful shock course through your body!</span>")
if(user.client)
user.client.images |= shock_image
user.client.images |= electrocution_skeleton_anim
addtimer(CALLBACK(src, .proc/reset_hallucinate_shock_animation, user, shock_image, electrocution_skeleton_anim), 40)
user.playsound_local(get_turf(src), "sparks", 100, 1)
user.staminaloss += 50
user.Stun(40)
user.jitteriness += 1000
user.do_jitter_animation(user.jitteriness)
addtimer(CALLBACK(src, .proc/hallucinate_shock_drop, user), 20)
/obj/machinery/door/airlock/proc/reset_hallucinate_shock_animation(mob/living/user, shock_image, electrocution_skeleton_anim)
if(user.client)
user.client.images.Remove(shock_image)
user.client.images.Remove(electrocution_skeleton_anim)
/obj/machinery/door/airlock/proc/hallucinate_shock_drop(mob/living/user)
user.jitteriness = max(user.jitteriness - 990, 10) //Still jittery, but vastly less
user.Knockdown(60)
/obj/machinery/door/airlock/proc/isElectrified()
if(src.secondsElectrified != NOT_ELECTRIFIED)
return TRUE
@@ -154,6 +154,10 @@
name = "Labor Camp teleporter console (Computer Board)"
build_path = /obj/machinery/computer/gulag_teleporter_computer
/obj/item/circuitboard/computer/rdconsole/production
name = "R&D Console Production Only (Computer Board)"
build_path = /obj/machinery/computer/rdconsole/production
/obj/item/circuitboard/computer/rdconsole
name = "R&D Console (Computer Board)"
build_path = /obj/machinery/computer/rdconsole/core
@@ -841,6 +841,13 @@
/obj/item/stack/sheet/glass = 1,
/obj/item/vending_refill/donksoft = 3)
/obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
name = "Syndicate Donksoft Toy Vendor (Machine Board)"
build_path = /obj/machinery/vending/toyliberationstation
req_components = list(
/obj/item/stack/sheet/glass = 1,
/obj/item/vending_refill/donksoft = 3)
/obj/item/circuitboard/machine/dish_drive
name = "Dish Drive (Machine Board)"
build_path = /obj/machinery/dish_drive
@@ -866,3 +873,17 @@
return
transmit = !transmit
to_chat(user, "<span class='notice'>You [transmit ? "enable" : "disable"] the board's automatic disposal transmission.</span>")
/obj/item/circuitboard/machine/stacking_unit_console
name = "Stacking Machine Console (Machine Board)"
build_path = /obj/machinery/mineral/stacking_unit_console
req_components = list(
/obj/item/stack/sheet/glass = 2,
/obj/item/stack/cable_coil = 5)
/obj/item/circuitboard/machine/stacking_machine
name = "Stacking Machine (Machine Board)"
build_path = /obj/machinery/mineral/stacking_machine
req_components = list(
/obj/item/stock_parts/manipulator = 2,
/obj/item/stock_parts/matter_bin = 2)
+5 -4
View File
@@ -208,12 +208,13 @@
if(stored_swap == user)
to_chat(user,"<span class='notice'>You stare at the book some more, but there doesn't seem to be anything else to learn...</span>")
return
var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new
swapper.cast(user, stored_swap, TRUE)
if(swapper.cast(list(stored_swap), user, TRUE, TRUE))
to_chat(user,"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>")
to_chat(stored_swap,"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>")
else
user.visible_message("<span class='warning'>[src] fizzles slightly as it stops glowing!</span>") //if the mind_transfer failed to transfer mobs, likely due to the target being catatonic.
to_chat(stored_swap,"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>")
to_chat(user,"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>")
stored_swap = null
/obj/item/book/granter/spell/forcewall
@@ -352,6 +352,11 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
if(!iscultist(user))
to_chat(user, "<span class='warning'>Only one with forbidden knowledge could hope to work this metal...</span>")
return
var/turf/T = get_turf(user) //we may have moved. adjust as needed...
var/area/A = get_area(user)
if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed))
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
return FALSE
return ..()
/obj/item/stack/sheet/runed_metal/Initialize(mapload, new_amount, merge = TRUE)
@@ -511,6 +511,8 @@
new /obj/item/storage/box/syringes(src)
new /obj/item/ammo_box/foambox/riot(src)
new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
if(prob(5))
new /obj/item/reagent_containers/food/snacks/pizza/pineapple(src)
/obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents()
for(var/i in 1 to 10)
+42
View File
@@ -966,3 +966,45 @@ obj/item/storage/box/clown
/obj/item/storage/box/holy_grenades/PopulateContents()
for(var/i in 1 to 7)
new/obj/item/grenade/chem_grenade/holy(src)
/obj/item/storage/box/stockparts/basic //for ruins where it's a bad idea to give access to an autolathe/protolathe, but still want to make stock parts accessible
name = "box of stock parts"
desc = "Contains a variety of basic stock parts."
/obj/item/storage/box/stockparts/basic/PopulateContents()
new /obj/item/stock_parts/capacitor(src)
new /obj/item/stock_parts/capacitor(src)
new /obj/item/stock_parts/capacitor(src)
new /obj/item/stock_parts/scanning_module(src)
new /obj/item/stock_parts/scanning_module(src)
new /obj/item/stock_parts/scanning_module(src)
new /obj/item/stock_parts/manipulator(src)
new /obj/item/stock_parts/manipulator(src)
new /obj/item/stock_parts/manipulator(src)
new /obj/item/stock_parts/micro_laser(src)
new /obj/item/stock_parts/micro_laser(src)
new /obj/item/stock_parts/micro_laser(src)
new /obj/item/stock_parts/matter_bin(src)
new /obj/item/stock_parts/matter_bin(src)
new /obj/item/stock_parts/matter_bin(src)
/obj/item/storage/box/stockparts/deluxe
name = "box of deluxe stock parts"
desc = "Contains a variety of deluxe stock parts."
/obj/item/storage/box/stockparts/deluxe/PopulateContents()
new /obj/item/stock_parts/capacitor/quadratic(src)
new /obj/item/stock_parts/capacitor/quadratic(src)
new /obj/item/stock_parts/capacitor/quadratic(src)
new /obj/item/stock_parts/scanning_module/triphasic(src)
new /obj/item/stock_parts/scanning_module/triphasic(src)
new /obj/item/stock_parts/scanning_module/triphasic(src)
new /obj/item/stock_parts/manipulator/femto(src)
new /obj/item/stock_parts/manipulator/femto(src)
new /obj/item/stock_parts/manipulator/femto(src)
new /obj/item/stock_parts/micro_laser/quadultra(src)
new /obj/item/stock_parts/micro_laser/quadultra(src)
new /obj/item/stock_parts/micro_laser/quadultra(src)
new /obj/item/stock_parts/matter_bin/bluespace(src)
new /obj/item/stock_parts/matter_bin/bluespace(src)
new /obj/item/stock_parts/matter_bin/bluespace(src)
@@ -280,7 +280,7 @@
new /obj/item/radio/headset/chameleon(src)
new /obj/item/stamp/chameleon(src)
new /obj/item/pda/chameleon(src)
new /obj/item/gun/energy/laser/chameleon(src)
//new /obj/item/gun/energy/laser/chameleon(src) //crashes the server right now. please fix it!
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
//Not counting the damage it will do while embedded (2*4 = 8, at 15% chance)
+9 -5
View File
@@ -38,16 +38,20 @@
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
refreshID()
// The loc has not actually changed yet when this proc is called, so call
// refreshID and have it ignore the outgoing atom.
refreshID(AM)
/obj/item/storage/wallet/proc/refreshID()
if(!(front_id in src))
/obj/item/storage/wallet/proc/refreshID(atom/movable/removed)
LAZYCLEARLIST(combined_access)
if(!(front_id in src) || front_id == removed)
front_id = null
for(var/obj/item/card/id/I in contents)
LAZYINITLIST(combined_access)
LAZYCLEARLIST(combined_access)
if(I == removed)
continue
if(!front_id)
front_id = I
LAZYINITLIST(combined_access)
combined_access |= I.access
update_icon()
+1 -1
View File
@@ -236,7 +236,7 @@
/obj/item/twohanded/fireaxe/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 100, 80, hitsound) //axes are not known for being precision butchering tools
AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "fireaxe[wielded]"
@@ -310,7 +310,7 @@
message_cooldown = world.time + 50
to_chat(user, "<span class='warning'>[src]'s door won't budge!</span>")
return
container_resist()
container_resist(user)
/obj/structure/closet/attack_hand(mob/user)
. = ..()
@@ -148,3 +148,32 @@
name = "science crate"
desc = "A science crate."
icon_state = "scicrate"
/obj/structure/closet/crate/solarpanel_small
name = "budget solar panel crate"
icon_state = "engi_e_crate"
/obj/structure/closet/crate/solarpanel_small/PopulateContents()
..()
for(var/i in 1 to 13)
new /obj/item/solar_assembly(src)
new /obj/item/circuitboard/computer/solar_control(src)
new /obj/item/paper/guides/jobs/engi/solars(src)
new /obj/item/electronics/tracker(src)
/obj/structure/closet/crate/goldcrate
name = "gold crate"
/obj/structure/closet/crate/goldcrate/PopulateContents()
..()
for(var/i in 1 to 3)
new /obj/item/stack/sheet/mineral/gold(src, 1, FALSE)
new /obj/item/storage/belt/champion(src)
/obj/structure/closet/crate/silvercrate
name = "silver crate"
/obj/structure/closet/crate/silvercrate/PopulateContents()
..()
for(var/i in 1 to 5)
new /obj/item/coin/silver(src)
@@ -117,9 +117,8 @@
/turf/open/floor/engine/cult
name = "engraved floor"
desc = "The air hangs heavy over this sinister flooring."
desc = "The air smells strangely over this sinister flooring."
icon_state = "plating"
CanAtmosPass = ATMOS_PASS_NO
floor_tile = null
var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance
+1 -1
View File
@@ -343,7 +343,7 @@
for(var/V in contents)
var/atom/A = V
if(A.level >= affecting_level)
if(!QDELETED(A) && A.level >= affecting_level)
if(ismovableatom(A))
var/atom/movable/AM = A
if(!AM.ex_check(explosion_id))
+9 -6
View File
@@ -17,6 +17,10 @@ GLOBAL_PROTECT(security_mode)
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
TgsNew()
GLOB.revdata = new
config.Load()
//SetupLogs depends on the RoundID, so lets check
@@ -25,8 +29,6 @@ GLOBAL_PROTECT(security_mode)
SSdbcore.SetRoundID()
SetupLogs()
SERVER_TOOLS_ON_NEW
load_admins()
LoadVerbs(/datum/verbs/menu)
if(CONFIG_GET(flag/usewhitelist))
@@ -93,6 +95,7 @@ GLOBAL_PROTECT(security_mode)
GLOB.sql_error_log = "[GLOB.log_directory]/sql.log"
GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log"
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log"
#ifdef UNIT_TESTS
GLOB.test_log = file("[GLOB.log_directory]/tests.log")
@@ -129,7 +132,7 @@ GLOBAL_PROTECT(security_mode)
warning("/tg/station 13 uses many file operations, a few shell()s, and some external call()s. Trusted mode is recommended. You can download our source code for your own browsing and compilation at https://github.com/tgstation/tgstation")
/world/Topic(T, addr, master, key)
SERVER_TOOLS_ON_TOPIC //redirect to server tools if necessary
TGS_TOPIC //redirect to server tools if necessary
var/static/list/topic_handlers = TopicHandlers()
@@ -185,7 +188,7 @@ GLOBAL_PROTECT(security_mode)
qdel(src) //shut it down
/world/Reboot(reason = 0, fast_track = FALSE)
SERVER_TOOLS_ON_REBOOT
TgsReboot()
if (reason || fast_track) //special reboot, do none of the normal stuff
if (usr)
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
@@ -199,7 +202,7 @@ GLOBAL_PROTECT(security_mode)
FinishTestRun()
return
if(SERVER_TOOLS_PRESENT)
if(TgsAvailable())
var/do_hard_reboot
// check the hard reboot counter
var/ruhr = CONFIG_GET(number/rounds_until_hard_restart)
@@ -218,7 +221,7 @@ GLOBAL_PROTECT(security_mode)
if(do_hard_reboot)
log_world("World hard rebooted at [time_stamp()]")
shutdown_logging() // See comment below.
SERVER_TOOLS_REBOOT_BYOND
TgsEndProcess()
log_world("World rebooted at [time_stamp()]")
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.