Merge branch 'master' into development

This commit is contained in:
Lohikar
2017-10-20 13:30:03 -05:00
56 changed files with 355 additions and 300 deletions
+4 -3
View File
@@ -270,6 +270,10 @@
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\observation\_debug.dm"
#include "code\datums\observation\destroyed.dm"
#include "code\datums\observation\moved.dm"
#include "code\datums\observation\observation.dm"
#include "code\datums\radio\frequency.dm"
#include "code\datums\radio\signal.dm"
#include "code\datums\repositories\cameras.dm"
@@ -370,9 +374,6 @@
#include "code\game\area\areas.dm"
#include "code\game\area\asteroid_areas.dm"
#include "code\game\area\Space Station 13 areas.dm"
#include "code\game\datum_events\death.dm"
#include "code\game\datum_events\destroyed.dm"
#include "code\game\datum_events\moved.dm"
#include "code\game\dna\dna2.dm"
#include "code\game\dna\dna2_domutcheck.dm"
#include "code\game\dna\dna2_helpers.dm"
+1 -1
View File
@@ -6,7 +6,7 @@
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
#define LAZYLEN(L) length(L)
#define LAZYCLEARLIST(L) if(L) L.Cut()
#define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V;
#define LAZYSET(L, K, V) if (!L) { L = list(); } L[K] = V;
#define LAZYPICK(L,DEFAULT) (LAZYLEN(L) ? pick(L) : DEFAULT)
// Shims for some list procs in lists.dm.
+4 -7
View File
@@ -235,22 +235,19 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
// This should be overridden to remove all references pointing to the object being destroyed.
// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
/datum/proc/Destroy(force=FALSE)
if (destroy_listeners)
RaiseOnDestroy()
SSnanoui.close_uis(src)
weakref = null
destroyed_event.raise_event(src)
SSnanoui.close_uis(src)
tag = null
var/list/timers = active_timers
active_timers = null
if (timers)
for(var/thing in timers)
for (var/thing in timers)
var/datum/timedevent/timer = thing
if (timer.spent)
continue
qdel(timer)
return QDEL_HINT_QUEUE
/datum/var/gcDestroyed //Time when this object was destroyed.
+12 -2
View File
@@ -505,6 +505,10 @@
H.centcomm_despawn_timer = addtimer(CALLBACK(H, /mob/living/.proc/centcomm_timeout), 10 MINUTES, TIMER_STOPPABLE)
var/datum/job/job = GetJob(rank)
if(spawning_at != "Arrivals Shuttle" || job.latejoin_at_spawnpoints)
return EquipRank(H, rank, 1)
var/list/spawn_in_storage = list()
H <<"<span class='notice'>You have ten minutes to reach the station before you will be forced there.</span>"
@@ -771,8 +775,14 @@
else
permitted = TRUE
if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted]))
permitted = FALSE
if (G.whitelisted)
var/found = FALSE
for (var/species in G.whitelisted)
if (is_alien_whitelisted(H, global.all_species[species]))
found = TRUE
break
if (!found)
permitted = FALSE
if(!permitted)
H << "<span class='warning'>Your current job or whitelist status does not permit you to spawn with [thing]!</span>"
+5 -1
View File
@@ -11,7 +11,8 @@
/var/list/controller_debug_list = list(
"Configuration",
"Cameras",
"Gas Data"
"Gas Data",
"Observation"
)
/client/proc/debug_controller(controller in controller_debug_list)
@@ -30,4 +31,7 @@
if("Gas Data")
debug_variables(gas_data)
feedback_add_details("admin_verb","DGasdata")
if("Observation")
debug_variables(all_observable_events)
feedback_add_details("admin_verb", "DObservation")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
+11
View File
@@ -0,0 +1,11 @@
/****************
* Debug Support *
****************/
var/datum/all_observable_events/all_observable_events = new()
/datum/all_observable_events
var/list/events
/datum/all_observable_events/New()
events = list()
..()
+4
View File
@@ -0,0 +1,4 @@
var/datum/observ/destroyed/destroyed_event = new()
/datum/observ/destroyed
name = "Destroyed"
+41
View File
@@ -0,0 +1,41 @@
var/datum/observ/moved/moved_event = new()
/datum/observ/moved
name = "Moved"
expected_type = /atom/movable
/datum/observ/moved/register(var/eventSource, var/datum/procOwner, var/proc_call)
. = ..()
var/atom/movable/child = eventSource
if(.)
var/atom/movable/parent = child.loc
while(istype(parent) && !moved_event.is_listening(parent, child))
moved_event.register(parent, child, /atom/movable/proc/recursive_move)
child = parent
parent = child.loc
/********************
* Movement Handling *
********************/
/atom/movable/proc/move_to_destination(var/atom/movable/am, var/old_loc, var/new_loc)
var/turf/T = get_turf(new_loc)
if(T && T != loc)
forceMove(T)
/atom/movable/proc/recursive_move(var/atom/movable/am, var/old_loc, var/new_loc)
moved_event.raise_event(list(src, old_loc, new_loc))
/atom/Entered(var/atom/movable/am, atom/old_loc)
..()
moved_event.raise_event(am, old_loc, am.loc)
/atom/movable/Entered(var/atom/movable/am, atom/old_loc)
..()
if(moved_event.has_listeners(am) && !moved_event.is_listening(src, am))
moved_event.register(src, am, /atom/movable/proc/recursive_move)
/atom/movable/Exited(var/atom/movable/am, atom/old_loc)
..()
if(moved_event.is_listening(src, am, /atom/movable/proc/recursive_move))
moved_event.unregister(src, am)
+60
View File
@@ -0,0 +1,60 @@
/datum/observ
var/name = "Unnamed Event"
var/expected_type = /datum
var/list/listeners_assoc
/datum/observ/New()
all_observable_events.events += src
listeners_assoc = list()
..()
/datum/observ/proc/is_listening(var/eventSource, var/datum/procOwner, var/proc_call)
var/listeners = listeners_assoc[eventSource]
if(!listeners)
return FALSE
var/stored_proc_call = listeners[procOwner]
return stored_proc_call && (!proc_call || stored_proc_call == proc_call)
/datum/observ/proc/has_listeners(var/eventSource)
var/list/listeners = listeners_assoc[eventSource]
return LAZYLEN(listeners)
/datum/observ/proc/register(var/eventSource, var/datum/procOwner, var/proc_call)
if(!(eventSource && procOwner && procOwner))
return FALSE
if(istype(eventSource, /datum/observ))
return FALSE
if(!istype(eventSource, expected_type))
CRASH("Unexpected type. Expected [expected_type], was [eventSource]")
LAZYINITLIST(listeners_assoc[eventSource])
listeners_assoc[eventSource][procOwner] = proc_call
destroyed_event.register(procOwner, src, /datum/observ/proc/unregister)
return TRUE
/datum/observ/proc/unregister(var/eventSource, var/datum/procOwner)
if(!(eventSource && procOwner))
return FALSE
if(istype(eventSource, /datum/observ))
return FALSE
var/list/listeners = listeners_assoc[eventSource]
if(!listeners)
return FALSE
listeners -= procOwner
if (!listeners.len)
listeners_assoc -= eventSource
destroyed_event.unregister(procOwner, src)
return TRUE
/datum/observ/proc/raise_event(...)
if(!args.len)
return
var/listeners = listeners_assoc[args[1]]
if(!listeners)
return
for(var/listener in listeners)
call(listener, listeners[listener])(arglist(args))
+2 -1
View File
@@ -49,7 +49,8 @@
possible_trading_items = list(
/obj/item/weapon/gun/projectile/dartgun/vox = TRADER_SUBTYPES_ONLY,
/obj/item/mecha_parts/mecha_equipment/tool = TRADER_SUBTYPES_ONLY,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic = TRADER_SUBTYPES_ONLY,
/obj/item/mecha_parts/mecha_equipment/weapon = TRADER_SUBTYPES_ONLY,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic = TRADER_BLACKLIST,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = TRADER_BLACKLIST,
/obj/item/trash = TRADER_SUBTYPES_ONLY,
/obj/item/clothing/accessory = TRADER_ALL,
+2 -2
View File
@@ -282,8 +282,8 @@
. = ..()
if (.)
// Events.
if (move_listeners)
RaiseOnMove(src, old_loc, loc)
if (moved_event.listeners_assoc[src])
moved_event.raise_event(src, old_loc, loc)
// Parallax.
if (contained_mobs)
-37
View File
@@ -1,37 +0,0 @@
/mob/living
var/list/death_listeners
/mob/living/proc/OnDeath(thingtocall, proctocall, ...)
.(CALLBACK(thingtocall, proctocall, ...))
/mob/living/OnDeath(datum/callback/callback)
LAZYSET(death_listeners, callback.object, callback)
if (callback.object && callback.object != GLOBAL_PROC)
callback.object.OnDestroy(CALLBACK(src, .proc/UnregisterOnDeath, callback.object))
/mob/living/proc/UnregisterOnDeath(object)
if (!death_listeners)
return FALSE
death_listeners[object] = null
death_listeners -= object
UNSETEMPTY(death_listeners)
. = TRUE
/mob/living/proc/RaiseOnDeath(gibbed)
if (!death_listeners)
return FALSE
for (var/thing in death_listeners)
var/datum/callback/cb = death_listeners[thing]
cb.InvokeAsync(gibbed)
/mob/living/Destroy()
death_listeners = null
return ..()
/mob/living/death(gibbed, deathmessage = "seizes up and falls limp...")
. = ..()
if (.)
RaiseOnDeath(gibbed)
-31
View File
@@ -1,31 +0,0 @@
/datum
var/list/destroy_listeners
/**
* @param second_link should only ever be passed as TRUE from this proc. It's a
* recursion guard. The reverse registration is necessary to clean up hard refs.
*/
/datum/proc/OnDestroy(datum/callback/callback, second_link = FALSE)
LAZYSET(destroy_listeners, callback.object, callback)
if (!second_link && callback.object && callback.object != GLOBAL_PROC)
callback.object.OnDestroy(CALLBACK(src, .proc/UnregisterOnDestroy, callback.object), TRUE)
/datum/proc/UnregisterOnDestroy(object)
if (!destroy_listeners)
return FALSE
destroy_listeners[object] = null
destroy_listeners -= object
UNSETEMPTY(destroy_listeners)
. = TRUE
/datum/proc/RaiseOnDestroy()
if (!destroy_listeners)
return FALSE
. = 0
for (var/thing in destroy_listeners)
var/datum/callback/cb = destroy_listeners[thing]
cb.InvokeAsync()
.++
-60
View File
@@ -1,60 +0,0 @@
/atom/movable
var/list/move_listeners
/atom/movable/proc/OnMove(datum/callback/callback)
if (!move_listeners || !move_listeners[callback.object])
LAZYSET(move_listeners, callback.object, callback)
if (callback.object && callback.object != GLOBAL_PROC)
callback.object.OnDestroy(CALLBACK(src, .proc/UnregisterOnMove, callback.object))
var/atom/movable/parent = loc
var/atom/movable/child = src
while (istype(parent) && (!parent.move_listeners || !(parent.move_listeners[child])))
parent.OnMove(CALLBACK(child, .proc/recursive_move))
child = parent
parent = child.loc
/atom/movable/proc/UnregisterOnMove(object)
if (!move_listeners)
return FALSE
move_listeners[object] = null
move_listeners -= object
UNSETEMPTY(move_listeners)
. = TRUE
/atom/movable/proc/RaiseOnMove(atom/movable/source, atom/old_loc, atom/new_loc)
if (!move_listeners)
return FALSE
. = 0
for (var/thing in move_listeners)
var/datum/callback/cb = move_listeners[thing]
cb.InvokeAsync(source, old_loc, new_loc)
.++
/atom/Entered(atom/movable/AM, atom/old_loc)
. = ..()
if (AM.move_listeners)
AM.RaiseOnMove(AM, old_loc, loc)
/atom/movable/Entered(atom/movable/AM, atom/old_loc)
. = ..()
if (AM.move_listeners && !(move_listeners && move_listeners[AM]))
OnMove(CALLBACK(AM, .proc/recursive_move))
/atom/movable/proc/recursive_move(atom/movable/AM, old_loc, new_loc)
if (move_listeners)
RaiseOnMove(AM, old_loc, new_loc)
/atom/movable/proc/move_to_destination(atom/movable/AM, old_loc, new_loc)
var/turf/T = get_turf(new_loc)
if (T && T != loc)
forceMove(T)
/atom/movable/forceMove(atom/dest)
var/oldloc = loc
. = ..()
if (. && move_listeners)
RaiseOnMove(src, oldloc, loc)
@@ -9,3 +9,4 @@
require_all_templates = 1
votable = 1
antag_tags = list(MODE_MALFUNCTION, MODE_NINJA)
disabled_jobs = list("AI")
+1 -1
View File
@@ -454,7 +454,7 @@
/datum/access/merchant
id = access_merchant
desc = "Merchant Access"
access_type = ACCESS_TYPE_NONE
access_type = ACCESS_TYPE_CENTCOM
/***************
* Antag access *
+17 -11
View File
@@ -114,11 +114,10 @@ var/const/HOLOPAD_MODE = RANGE_BASED
activate_holocall(caller_id)
/obj/machinery/hologram/holopad/proc/end_call(mob/user)
caller_id.unset_machine()
caller_id.reset_view() //Send the caller back to his body
clear_holo(caller_id) // destroy the hologram
caller_id = null //Reset caller_id
sourcepad.targetpad = null
sourcepad = null //Reset source
clear_holo(null, caller_id) // destroy the hologram
caller_id = null
/obj/machinery/hologram/holopad/proc/activate_holocall(mob/living/carbon/caller_id)
if(caller_id)
@@ -217,7 +216,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(caller_id)
var/tempicon = 0
for(var/datum/data/record/t in data_core.locked)
if(t.fields["name"]==caller_id.name)
if(t.fields["name"] == caller_id.name)
tempicon = t.fields["image"]
hologram.name = "[caller_id.name] (Hologram)"
hologram.loc = get_step(src,1)
@@ -245,14 +244,21 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
A.holo = src
return 1
/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user)
if(user.holo == src)
/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/carbon/caller_id)
if(user)
qdel(masters[user])//Get rid of user's hologram
user.holo = null
qdel(masters[user])//Get rid of user's hologram
masters -= user //Discard AI from the list of those who use holopad
masters -= user //Discard AI from the list of those who use holopad
if(caller_id)
qdel(masters[caller_id])//Get rid of user's hologram
masters -= caller_id //Discard the caller from the list of those who use holopad
if (!masters.len)//If no users left
set_light(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted)
icon_state = "holopad0"
if(sourcepad)
sourcepad.targetpad = null
sourcepad = null
caller_id = null
return 1
/obj/machinery/hologram/holopad/machinery_process()
@@ -267,13 +273,13 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
continue
use_power(power_per_hologram)
if(last_request + 200 < world.time&&incoming_connection==1)
if(last_request + 200 < world.time && incoming_connection==1)
incoming_connection = 0
end_call()
if(sourcepad)
sourcepad.audible_message("<i><span class='game say'>The holopad connection timed out</span></i>")
sourcepad = 0
if (caller_id&&sourcepad)
if (caller_id && sourcepad)
if(caller_id.loc!=sourcepad.loc)
sourcepad.visible_message("Severing connection to distant holopad.")
visible_message("The connection has been terminated by [caller_id].")
+2 -2
View File
@@ -64,7 +64,7 @@
/obj/machinery/icecream_vat/Initialize()
. = ..()
create_reagents(100)
while(product_types.len < 6)
while(product_types.len < 8)
product_types.Add(5)
reagents.add_reagent("milk", 5)
reagents.add_reagent("flour", 5)
@@ -82,7 +82,7 @@
dat += "<b>Vanilla icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)<br>"
dat += "<b>Strawberry icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_STRAWBERRY]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)<br>"
dat += "<b>Chocolate icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_CHOCOLATE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)<br>"
dat += "<b>Blue icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br></div>"
dat += "<b>Blue icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br>"
dat += "<b>Cherry icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_CHERRY]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHERRY];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHERRY]] dollops left. (Ingredients: milk, ice, cherry jelly)<br>"
dat += "<b>Banana icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BANANA]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BANANA];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BANANA];amount=5'><b>x5</b></a> [product_types[ICECREAM_BANANA]] dollops left. (Ingredients: milk, ice, banana)<br></div>"
dat += "<br><b>CONES</b><br><div class='statusDisplay'>"
+1 -1
View File
@@ -82,7 +82,7 @@
charging = null
update_icon()
/obj/machinery/recharger/process()
/obj/machinery/recharger/machinery_process()
if(stat & (NOPOWER|BROKEN) || !anchored)
update_use_power(0)
icon_state = icon_state_idle
+4 -3
View File
@@ -54,7 +54,8 @@
return
user << "<span class='notice'>You link \the [C] to \the [src], it will now ring upon someone using \the [src].</span>"
rings_pdas += C
C.OnDestroy(CALLBACK(src, .proc/remove_pda, C))
// WONT FIX: This requires callbacks fuck my dick.
destroyed_event.register(C, src, .proc/remove_pda)
update_icon()
else
@@ -100,7 +101,7 @@
addtimer(CALLBACK(src, .proc/unping), 45 SECONDS)
/obj/machinery/ringer/proc/unping(var/obj/item/device/pda/pda)
/obj/machinery/ringer/proc/unping()
pinged = FALSE
update_icon()
@@ -143,4 +144,4 @@
var/listener/L = thing
var/obj/machinery/ringer/C = L.target
if (istype(C))
C.ring_pda()
C.ring_pda()
+4 -4
View File
@@ -93,8 +93,8 @@
user.client.images |= holomap_datum.station_map
watching_mob = user
watching_mob.OnMove(CALLBACK(src, .proc/checkPosition))
watching_mob.OnDestroy(CALLBACK(src, .proc/stopWatching))
moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching)
update_use_power(2)
if(bogus)
@@ -120,8 +120,8 @@
animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING)
var/mob/M = watching_mob
addtimer(CALLBACK(src, .proc/clear_image, M, holomap_datum.station_map), 5, TIMER_CLIENT_TIME)//we give it time to fade out
watching_mob.UnregisterOnMove(src)
watching_mob.UnregisterOnDestroy(src)
moved_event.unregister(watching_mob, src)
destroyed_event.unregister(watching_mob, src)
watching_mob = null
update_use_power(1)
+3 -3
View File
@@ -17,7 +17,7 @@
/obj/item/device/multitool/hacktool/Destroy()
for(var/T in known_targets)
var/atom/target = T
target.UnregisterOnDestroy(src)
destroyed_event.unregister(target, src)
known_targets.Cut()
qdel(hack_state)
hack_state = null
@@ -68,7 +68,7 @@
return 0
known_targets.Insert(1, target) // Insert the newly hacked target first,
target.OnDestroy(CALLBACK(src, .proc/on_target_destroy))
destroyed_event.register(target, src, /obj/item/device/multitool/hacktool/proc/on_target_destroy)
return 1
/obj/item/device/multitool/hacktool/proc/sanity_check()
@@ -77,7 +77,7 @@
if(known_targets.len > max_known_targets)
for(var/i = (max_known_targets + 1) to known_targets.len)
var/atom/A = known_targets[i]
A.UnregisterOnDestroy(src)
destroyed_event.unregister(A, src)
known_targets.Cut(max_known_targets + 1)
/obj/item/device/multitool/hacktool/proc/on_target_destroy(var/target)
+2 -2
View File
@@ -50,13 +50,13 @@
unregister_buffer(buffer_object)
buffer_object = buffer
if(buffer_object)
buffer_object.OnDestroy(CALLBACK(src, .proc/unregister_buffer))
destroyed_event.register(buffer_object, src, /obj/item/device/multitool/proc/unregister_buffer)
/obj/item/device/multitool/proc/unregister_buffer(var/atom/buffer_to_unregister)
// Only remove the buffered object, don't reset the name
// This means one cannot know if the buffer has been destroyed until one attempts to use it.
if(buffer_to_unregister == buffer_object && buffer_object)
buffer_object.UnregisterOnDestroy(src)
destroyed_event.unregister(buffer_object, src)
buffer_object = null
/obj/item/device/multitool/resolve_attackby(atom/A, mob/user)
@@ -65,13 +65,13 @@
unset_registered_user()
registered_user = user
user.set_id_info(src)
user.OnDestroy(CALLBACK(src, .proc/unset_registered_user))
destroyed_event.register(user, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user)
return TRUE
/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user)
if(!registered_user || (user && user != registered_user))
return
registered_user.UnregisterOnDestroy(src)
destroyed_event.unregister(registered_user, src)
registered_user = null
/obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user)
@@ -444,7 +444,7 @@
/obj/item/weapon/storage/backpack/messenger/tox
name = "research messenger bag"
desc = "A backpack worn over one shoulder. Useful for holding science materials."
icon_state = "courierbagnt"
icon_state = "courierbagtox"
/obj/item/weapon/storage/backpack/messenger/gen
name = "geneticist messenger bag"
+2 -2
View File
@@ -151,8 +151,8 @@
if(!newname || newname == "")
var/datum/language/L = all_languages[user.species.default_language]
newname = L.get_random_name()
user.real_name = newname
user.name = user.real_name
user.fully_replace_character_name(user.real_name,newname)
user.h_style = "Short Vox Quills"
user.f_style = "Shaved"
user.update_hair(0)
..()
+2 -2
View File
@@ -1,7 +1,7 @@
#ifdef AO_USE_LIGHTING_OPACITY
#define AO_TURF_CHECK(T) (!T.has_opaque_atom)
#define AO_TURF_CHECK(T) (!T.has_opaque_atom || !T.permit_ao)
#else
#define AO_TURF_CHECK(T) (!T.density || !T.opacity)
#define AO_TURF_CHECK(T) (!T.density || !T.opacity || !T.permit_ao)
#endif
/turf
@@ -31,7 +31,9 @@
"toggles",
"asfx_togs",
"lastmotd" = "motd_hash",
"lastmemo" = "memo_hash"
"lastmemo" = "memo_hash",
"parallax_toggles" = "parallax_togs",
"parallax_speed"
),
"args" = list("ckey")
)
@@ -64,7 +64,7 @@ var/list/gear_datums = list()
continue
if(G.whitelisted && preference_mob)
for(var/species in G.whitelisted)
if(is_alien_whitelisted(preference_mob, species))
if(is_alien_whitelisted(preference_mob, global.all_species[species]))
. += gear_name
break
else
+27 -5
View File
@@ -206,7 +206,7 @@ All custom items with worn sprites must follow the contained sprite system: http
contained_sprite = TRUE
gender = NEUTER
body_parts_covered = null
fingerprint_chance = 50
/obj/structure/bed/chair/wheelchair/fluff/nomak_scooter //Mobility Scooter - Dubaku Nomak - demonofthefall
name = "mobility scooter"
@@ -491,7 +491,7 @@ All custom items with worn sprites must follow the contained sprite system: http
species_restricted = null
gender = NEUTER
body_parts_covered = null
fingerprint_chance = 100
/obj/item/clothing/under/dress/fluff/sayyidah_dress //Traditional Jumper Dress - Sayyidah Al-Kateb - alberyk
name = "traditional jumper dress"
@@ -1403,15 +1403,15 @@ All custom items with worn sprites must follow the contained sprite system: http
if (use_check(usr)) return
var/style = input("You change the shirt to;","Change the shirt style") as null|anything in list("Eiffel Tower Diner","Pyramids of Giza Café","Phoenixport","New Parthenon")
var/style = input("You change the shirt to;","Change the shirt style") as null|anything in list("Eiffel Tower Diner","Pyramids of Giza Café","Phoenixport","New Parthenon")
switch(style)
if("Eiffel Tower Diner")
item_state = "harley_uniform"
desc = "A white t-shirt with the writing \"Eiffel Tower Diner\" on it in a small font, below a recreation of the famous monument in question, the Eiffel Tower."
if("Pyramids of Giza Café")
if("Pyramids of Giza Café")
item_state = "harley_uniform_1"
desc = "A white t-shirt with \"GIZA CAFÉ\" written in large, retro font, with a small background. It looks slightly well-worn."
desc = "A white t-shirt with \"GIZA CAFÉ\" written in large, retro font, with a small background. It looks slightly well-worn."
if("Phoenixport")
item_state = "harley_uniform_2"
@@ -1424,3 +1424,25 @@ All custom items with worn sprites must follow the contained sprite system: http
usr.update_inv_w_uniform()
usr.visible_message("<span class='notice'>[user] fumbles with \the [src], changing the shirt..</span>",
"<span class='notice'>You change \the [src]'s style to be '[style]'.</span>")
/obj/item/clothing/gloves/watch/fluff/rex_watch //Engraved Wristwatch - Rex Winters - tailson
name = "engraved wristwatch"
desc = " A fine gold watch. On the inside is an engraving that reads \"Happy birthday dad, thinking of you always\"."
icon = 'icons/obj/custom_items/rex_watch.dmi'
icon_state = "rex_watch"
/obj/item/device/camera/fluff/hadley_camera //Hadley's Camera - Hadley Dawson - fekkor
name = "customized camera"
desc = "A early 2450's Sunny camera with an adjustable lens, this one has a sticker with the name \"Hadley\" on the back."
icon = 'icons/obj/custom_items/hadley_camera.dmi'
icon_state = "hadley_camera"
icon_on = "hadley_camera"
icon_off = "hadley_camera_off"
/obj/item/clothing/accessory/medal/silver/fluff/kalren_medal //Silver Star of Merit - Kalren Halstere - brutishcrab51
name = "silver star of merit"
desc = "The Biesel Silver Star of Merit, rewarded for bravery and professionalism in the line of duty."
icon_state = "silver_sword"
+1 -1
View File
@@ -50,7 +50,7 @@ var/list/ghost_traps
/datum/ghosttrap/proc/request_player(var/mob/target, var/request_string, var/request_timeout)
if(request_timeout)
request_timeouts[target] = world.time + request_timeout
target.OnDestroy(CALLBACK(src, .proc/target_destroyed))
destroyed_event.register(target, src, /datum/ghosttrap/proc/target_destroyed)
else
request_timeouts -= target
@@ -91,7 +91,8 @@
for(var/i = 1 to outputs.len)
set_pin_data(IC_OUTPUT, i, i == output_index ? output : null)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/transfer/demultiplexer/medium
@@ -166,6 +166,7 @@
else
set_pin_data(IC_OUTPUT, 1, null)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/adjacent_locator
@@ -185,6 +186,7 @@
var/atom/A = get_pin_data_as_type(IC_INPUT, 1, /atom)
if(!A)
set_pin_data(IC_OUTPUT, 1, null)
push_data()
return
var/desired_type = A.type
@@ -197,6 +199,7 @@
if(valid_things.len)
set_pin_data(IC_OUTPUT, 1, pick(valid_things))
push_data()
/obj/item/integrated_circuit/input/signaler
name = "integrated signaler"
@@ -170,14 +170,14 @@
// These procs do not relocate the grenade, that's the callers responsibility
/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/weapon/grenade/G)
attached_grenade = G
attached_grenade.OnDestroy(CALLBACK(src, .proc/detach_grenade))
destroyed_event.register(attached_grenade, src, .proc/detach_grenade)
size += G.w_class
desc += " \An [attached_grenade] is attached to it!"
/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade()
if(!attached_grenade)
return
attached_grenade.UnregisterOnDestroy(src)
destroyed_event.unregister(attached_grenade, src)
attached_grenade = null
size = initial(size)
desc = initial(desc)
@@ -41,7 +41,7 @@
for(var/i = 1 to inputs.len)
var/data = get_pin_data(IC_INPUT, i)
set_pin_data(IC_OUTPUT, i, data)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/memory/storage/medium
@@ -85,6 +85,7 @@
/obj/item/integrated_circuit/memory/constant/do_work()
set_pin_data(IC_OUTPUT, 1, data)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/memory/constant/attack_self(mob/user)
@@ -272,6 +272,7 @@
if(camera)
set_camera_status(0)
set_pin_data(IC_INPUT, 2, FALSE)
push_data()
/obj/item/integrated_circuit/output/led
name = "light-emitting diode"
@@ -292,6 +293,7 @@
/obj/item/integrated_circuit/output/led/power_fail()
set_pin_data(IC_INPUT, 1, FALSE)
push_data()
/obj/item/integrated_circuit/output/led/any_examine(mob/user)
var/text_output = list()
@@ -20,11 +20,14 @@
set_pin_data(IC_OUTPUT, 1, null)
if(!isweakref(I.data))
push_data()
return
var/atom/A = I.data.resolve()
if(!A)
push_data()
return
if(!(A in view(get_turf(src))))
push_data()
return // Can't see the target.
var/desired_dir = get_dir(get_turf(src), A)
+4 -4
View File
@@ -357,8 +357,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
stop_following()
following = target
following.OnMove(CALLBACK(src, /atom/movable/.proc/move_to_destination))
following.OnDestroy(CALLBACK(src, .proc/stop_following))
moved_event.register(following, src, /atom/movable/proc/move_to_destination)
destroyed_event.register(following, src, /mob/dead/observer/proc/stop_following)
src << "<span class='notice'>Now following \the [following]</span>"
move_to_destination(following, following.loc, following.loc)
@@ -366,8 +366,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/proc/stop_following()
if(following)
src << "<span class='notice'>No longer following \the [following]</span>"
following.UnregisterOnMove(src)
following.UnregisterOnDestroy(src)
moved_event.unregister(following, src)
destroyed_event.unregister(following, src)
following = null
/mob/dead/observer/move_to_destination(var/atom/movable/am, var/old_loc, var/new_loc)
@@ -36,7 +36,7 @@
/mob/living/death(gibbed, deathmessage="seizes up and falls limp...")
. = ..()
if (.)
if(.)
// If true, the mob went from living to dead (assuming everyone has been overriding as they should...)
cultnet.updateVisibility(src)
@@ -205,12 +205,8 @@
asleep = 1
icon_state = "sarlacc_asleep"
sarlacc.deployed = 0
var/make_loot = loot_count
visible_message("<span class='danger'>With a contented heave, \the [src] slides into the earth and begins regurgitating several treasures before shutting tight.</span>")
while(make_loot)
for(var/turf/simulated/floor/F in orange(1,src))
new /obj/random/loot(F)
make_loot--
new/obj/random/loot(get_turf(src))
/mob/living/simple_animal/hostile/greatworm/FindTarget()
if(eating)
@@ -23,7 +23,7 @@
/mob/living/death(gibbed,deathmessage="seizes up and falls limp...")
. = ..()
if (.)
if(.)
stop_aiming(no_message=1)
/mob/living/update_canmove()
@@ -173,9 +173,9 @@ obj/aiming_overlay/proc/update_aiming_deferred()
locked = 0
update_icon()
lock_time = world.time + 35
owner.OnMove(CALLBACK(src, .proc/update_aiming))
aiming_at.OnMove(CALLBACK(src, .proc/target_moved))
aiming_at.OnDestroy(CALLBACK(src, .proc/cancel_aiming))
moved_event.register(owner, src, /obj/aiming_overlay/proc/update_aiming)
moved_event.register(aiming_at, src, /obj/aiming_overlay/proc/target_moved)
destroyed_event.register(aiming_at, src, /obj/aiming_overlay/proc/cancel_aiming)
/obj/aiming_overlay/proc/aim_cooldown(var/seconds)
aimcooldown = world.time + seconds SECONDS
@@ -213,10 +213,10 @@ obj/aiming_overlay/proc/update_aiming_deferred()
if(!no_message)
owner.visible_message("<span class='notice'>\The [owner] lowers \the [aiming_with].</span>")
owner.UnregisterOnMove(src)
moved_event.unregister(owner, src)
if(aiming_at)
aiming_at.UnregisterOnMove(src)
aiming_at.UnregisterOnDestroy(src)
moved_event.unregister(aiming_at, src)
destroyed_event.unregister(aiming_at, src)
aiming_at.aimed -= src
aiming_at = null
+13 -13
View File
@@ -1,5 +1,5 @@
/proc/is_listening_to_movement(var/atom/movable/listening_to, var/listener)
return !!(listening_to.move_listeners && listening_to.move_listeners[listener])
return moved_event.is_listening(listening_to, listener)
datum/unit_test/observation
name = "OBSERVATION template"
@@ -19,8 +19,8 @@ datum/unit_test/observation/moved_observer_shall_register_on_follow/start_test()
else
fail("The observer is not following the mob.")
qdel(H)
qdel(O)
QDEL_IN(H, 10 SECONDS)
QDEL_IN(O, 10 SECONDS)
return 1
datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow
@@ -38,8 +38,8 @@ datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow/start_te
else
fail("The observer is still following the mob.")
qdel(H)
qdel(O)
QDEL_IN(H, 10 SECONDS)
QDEL_IN(O, 10 SECONDS)
return 1
datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners
@@ -56,8 +56,8 @@ datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners/
else
fail("The mob has registered to the closet's moved event.")
qdel(C)
qdel(H)
QDEL_IN(C, 10 SECONDS)
QDEL_IN(H, 10 SECONDS)
return 1
datum/unit_test/observation/moved_shall_registers_recursively_on_new_listener
@@ -78,9 +78,9 @@ datum/unit_test/observation/moved_shall_registers_recursively_on_new_listener/st
else
fail("Recursive moved registration failed. Human listening to closet: [listening_to_closet] - Observer listening to human: [listening_to_human]")
qdel(C)
qdel(H)
qdel(O)
QDEL_IN(C, 10 SECONDS)
QDEL_IN(H, 10 SECONDS)
QDEL_IN(O, 10 SECONDS)
return 1
datum/unit_test/observation/moved_shall_registers_recursively_with_existing_listener
@@ -101,8 +101,8 @@ datum/unit_test/observation/moved_shall_registers_recursively_with_existing_list
else
fail("Recursive moved registration failed. Human listening to closet: [listening_to_closet] - Observer listening to human: [listening_to_human]")
qdel(C)
qdel(H)
qdel(O)
QDEL_IN(C, 10 SECONDS)
QDEL_IN(H, 10 SECONDS)
QDEL_IN(O, 10 SECONDS)
return 1
+16 -3
View File
@@ -107,12 +107,25 @@ var/list/world_api_rate_limit = list()
/world/Topic(T, addr, master, key)
var/list/response[] = list()
var/list/queryparams[] = json_decode(T)
var/list/queryparams[]
try
queryparams = json_decode(T)
catch()
queryparams = list()
log_debug("API: Request Received - from:[addr], master:[master], key:[key]")
diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key], auth:[queryparams["auth"] ? queryparams["auth"] : "null"] [log_end]"
if (!queryparams.len)
log_debug("API - Bad Request - Invalid/no JSON data sent.")
response["statuscode"] = 400
response["response"] = "Bad Request - Invalid/no JSON data sent."
return json_encode(response)
queryparams["addr"] = addr //Add the IP to the queryparams that are passed to the api functions
var/query = queryparams["query"]
var/auth = queryparams["auth"]
log_debug("API: Request Received - from:[addr], master:[master], key:[key]")
diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key], auth:[auth] [log_end]"
/*if (!SSticker) //If the game is not started most API Requests would not work because of the throtteling
response["statuscode"] = 500
+13
View File
@@ -56,6 +56,19 @@
-->
<div class="commit sansserif">
<h2 class="date">20 October 2017</h2>
<h3 class="author">Lohikar updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Parallax preferences now actually get loaded, because apparently that's important or something.</li>
<li class="bugfix">Shuttles should now longer get mysterious square shadows.</li>
</ul>
<h3 class="author">MoondancerPony updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Memory chips will no longer automatically overwrite themselves to whatever their outputs are connected to, and will now output properly. An engineer seems to have installed the chip backwards inside the casing. NanoTrasen apologises for this lapse in service.</li>
<li class="bugfix">Locators and other scanning devices now properly push data to other devices.</li>
<li class="bugfix">Basic pathfinders will now stop moving if they cannot see their target, instead of jamming.</li>
</ul>
<h2 class="date">15 October 2017</h2>
<h3 class="author">AgentWhatever updated:</h3>
<ul class="changes bgimages16">
+13
View File
@@ -4738,3 +4738,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
booze-o-mat)
- rscadd: Added Champagne to the booze dispenser.
- rscadd: Added 11 new (moderately thought out) cocktails.
2017-10-20:
Lohikar:
- bugfix: Parallax preferences now actually get loaded, because apparently that's
important or something.
- bugfix: Shuttles should now longer get mysterious square shadows.
MoondancerPony:
- bugfix: Memory chips will no longer automatically overwrite themselves to whatever
their outputs are connected to, and will now output properly. An engineer seems
to have installed the chip backwards inside the casing. NanoTrasen apologises
for this lapse in service.
- bugfix: Locators and other scanning devices now properly push data to other devices.
- bugfix: Basic pathfinders will now stop moving if they cannot see their target,
instead of jamming.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

-1
View File
@@ -15,7 +15,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdafx.h"
#include <curl\curl.h>
#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
+1 -2
View File
@@ -19,7 +19,6 @@
#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
#include "stdafx.h"
#include <fstream>
#include "boost/asio.hpp"
@@ -67,4 +66,4 @@ EXTERN_DLL_EXPORT const char *send_udp_data(int argc, char *argv[])
myfile.close();
return ex.what();
}
}
}
+43 -55
View File
@@ -6456,17 +6456,15 @@
},
/area/turret_protected/ai)
"mM" = (
/obj/machinery/light/small{
base_state = "bulb-broken";
dir = 4;
icon_state = "bulb-broken"
},
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/window/reinforced{
dir = 1
},
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/bluegrid{
name = "cooled mainframe floor";
temperature = 278
@@ -7252,11 +7250,6 @@
c_tag = "AI Core - Alpha Core";
dir = 8
},
/obj/machinery/light/small{
base_state = "bulb-broken";
dir = 4;
icon_state = "bulb-broken"
},
/obj/structure/window/reinforced{
dir = 8
},
@@ -7265,6 +7258,9 @@
d2 = 2;
icon_state = "0-2"
},
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/bluegrid{
name = "cooled mainframe floor";
temperature = 278
@@ -8909,8 +8905,7 @@
},
/obj/machinery/light/small/emergency,
/obj/machinery/camera/network/command{
c_tag = "Command - Telecomms Main Level Relay";
dir = 1
c_tag = "Command - Vault Access"
},
/turf/simulated/floor/tiled/dark,
/area/security/nuke_storage)
@@ -18684,13 +18679,6 @@
/turf/simulated/floor/tiled/white,
/area/rnd/xenobiology)
"GS" = (
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
id = "xenobio3";
name = "Containment Blast Doors";
opacity = 0
},
/obj/machinery/door/window/westright{
name = "Containment Pen";
req_access = list(47)
@@ -43774,7 +43762,7 @@ As
Bf
Cg
Db
SW
SQ
Ex
Ff
vt
@@ -44031,7 +44019,7 @@ At
Bg
Ch
Dc
SX
SQ
vb
uD
uD
@@ -44802,7 +44790,7 @@ Av
Bj
Ck
De
SY
SQ
Ey
vx
FQ
@@ -45059,7 +45047,7 @@ Aw
Bk
Cl
Df
SZ
SQ
Ez
vv
vT
@@ -45316,7 +45304,7 @@ Ax
Bl
Cm
Dg
Ta
SQ
vb
Fg
vT
@@ -45573,7 +45561,7 @@ SQ
Bm
Cn
Dh
Tb
SQ
EA
Fh
vT
@@ -45826,10 +45814,10 @@ xy
xy
xy
zQ
SR
ST
SU
SV
SQ
SQ
SQ
SQ
Tc
EB
Fi
@@ -46087,7 +46075,7 @@ vt
Bn
Co
Di
Td
Tc
EC
Fh
FR
@@ -46581,10 +46569,10 @@ aa
ac
rO
SC
SE
SH
SC
SC
tR
SK
SC
rO
vc
vv
@@ -46601,7 +46589,7 @@ uU
uE
wm
Dk
Te
Tc
vb
Fk
FT
@@ -46802,7 +46790,7 @@ gi
gU
hD
Sp
Sr
Sp
cg
cg
cg
@@ -46825,7 +46813,7 @@ jB
jB
jB
pD
Sw
Sv
jB
aa
aa
@@ -47116,8 +47104,8 @@ Bo
Cq
Dl
jB
Tf
Th
Sv
Sv
FV
jB
jB
@@ -48144,8 +48132,8 @@ Br
Ct
Do
jB
Tg
Ti
Sv
Sv
FZ
jB
Dw
@@ -48343,8 +48331,8 @@ fJ
gn
ha
hH
Sq
Ss
Sp
Sp
cg
cg
cg
@@ -48894,7 +48882,7 @@ rv
rH
rP
sp
SG
SF
ts
ua
uB
@@ -49925,7 +49913,7 @@ aa
sS
SI
ue
SL
SI
uV
uV
vD
@@ -51223,7 +51211,7 @@ aa
jB
zx
Ac
SS
Sv
BA
jB
Du
@@ -65089,10 +65077,10 @@ tc
tc
uk
kz
SM
SN
SO
SP
Sv
Sv
Sv
Sv
wF
jB
xu
@@ -76390,7 +76378,7 @@ rh
rh
rm
ry
Sz
Sx
rW
sB
tg
@@ -76647,7 +76635,7 @@ ri
ri
rn
rz
SA
Sx
rX
rC
rC
@@ -77160,13 +77148,13 @@ kj
rh
rh
Sx
Sy
SB
Sx
Sx
rZ
SD
Sx
ti
tL
SJ
Sx
uO
rh
rh
+5 -9
View File
@@ -52495,7 +52495,7 @@
/obj/item/weapon/pen,
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/item/weapon/nullrod,
/obj/item/weapon/nullrod/itembox,
/turf/simulated/floor/carpet,
/area/chapel/office)
"bMC" = (
@@ -57541,10 +57541,6 @@
/obj/machinery/atm{
pixel_y = -32
},
/obj/machinery/disposal,
/obj/structure/disposalpipe/trunk{
dir = 1
},
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"bWw" = (
@@ -96722,7 +96718,7 @@ bRk
bRk
bVr
bRH
ckb
bWa
bWv
bRi
bVN
@@ -98520,7 +98516,7 @@ bUl
bRH
bRH
bRi
cjY
cjX
bJp
bNO
bML
@@ -98777,7 +98773,7 @@ bUm
bUI
bVd
bRi
cjZ
cjX
bWd
bML
bML
@@ -99034,7 +99030,7 @@ bRi
bRi
bRi
bRi
cka
cjX
bML
bJp
bNo
+4 -9
View File
@@ -3262,11 +3262,6 @@
/turf/simulated/floor/tiled/white,
/area/derelict/hallway/southeast)
"kr" = (
/obj/machinery/light/small{
icon_state = "bulb-broken";
dir = 8;
base_state = "bulb-broken"
},
/obj/structure/table/standard,
/obj/item/weapon/scalpel,
/obj/item/device/mass_spectrometer,
@@ -5147,7 +5142,7 @@
"pB" = (
/obj/structure/table/glass,
/obj/item/device/radio{
anchored = 1;
anchored = 0;
broadcasting = 0;
canhear_range = 4;
desc = "Are you going to make the call?";
@@ -37130,7 +37125,7 @@ aa
ac
df
iu
up
ac
iX
uR
ir
@@ -38897,7 +38892,7 @@ ac
aa
aa
aa
nB
aa
aA
ac
ac
@@ -46596,7 +46591,7 @@ aa
ac
ir
iq
jB
jz
jz
jz
jz