Merge branch 'master' into mirror-38933
This commit is contained in:
@@ -167,3 +167,16 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
|
||||
if(isrevenant(M) || iseminence(M) || iswizard(M))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
datum/atom_hud/alternate_appearance/basic/onePerson
|
||||
var/mob/seer
|
||||
|
||||
/datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M)
|
||||
if(M == seer)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/atom_hud/alternate_appearance/basic/onePerson/New(key, image/I, mob/living/M)
|
||||
..(key, I, FALSE)
|
||||
seer = M
|
||||
add_hud_to(seer)
|
||||
|
||||
@@ -53,7 +53,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
icon_state = "start"
|
||||
requires_power = FALSE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
|
||||
|
||||
//EXTRA
|
||||
@@ -62,7 +62,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Asteroid"
|
||||
icon_state = "asteroid"
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
blob_allowed = FALSE //Nope, no winning on the asteroid as a blob. Gotta eat the station.
|
||||
valid_territory = FALSE
|
||||
ambientsounds = MINING
|
||||
|
||||
+59
-70
@@ -18,17 +18,14 @@
|
||||
var/clockwork_warp_allowed = TRUE // Can servants warp into this area from Reebe?
|
||||
var/clockwork_warp_fail = "The structure there is too dense for warping to pierce. (This is normal in high-security areas.)"
|
||||
|
||||
var/eject = null
|
||||
|
||||
var/fire = null
|
||||
var/atmos = TRUE
|
||||
var/atmosalm = FALSE
|
||||
var/poweralm = TRUE
|
||||
var/party = null
|
||||
var/lightswitch = TRUE
|
||||
|
||||
var/requires_power = TRUE
|
||||
var/always_unpowered = FALSE // This gets overriden to 1 for space in area/Initialize().
|
||||
var/always_unpowered = FALSE // This gets overridden to 1 for space in area/Initialize().
|
||||
|
||||
var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
|
||||
|
||||
@@ -47,7 +44,7 @@
|
||||
var/static_light = 0
|
||||
var/static_environ
|
||||
|
||||
var/has_gravity = FALSE
|
||||
var/has_gravity = 0
|
||||
var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
|
||||
var/hidden = FALSE //Hides area from player Teleport function.
|
||||
var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
|
||||
@@ -256,9 +253,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
|
||||
/area/proc/firereset(obj/source)
|
||||
if (fire)
|
||||
fire = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
updateicon()
|
||||
unset_fire_alarm_effects()
|
||||
ModifyFiredoors(TRUE)
|
||||
for(var/item in firealarms)
|
||||
var/obj/machinery/firealarm/F = item
|
||||
@@ -290,7 +285,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
DOOR.lock()
|
||||
|
||||
/area/proc/burglaralert(obj/trigger)
|
||||
if(always_unpowered == 1) //no burglar alarms in space/asteroid
|
||||
if(always_unpowered) //no burglar alarms in space/asteroid
|
||||
return
|
||||
|
||||
//Trigger alarm effect
|
||||
@@ -306,61 +301,32 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
addtimer(CALLBACK(SILICON, /mob/living/silicon.proc/cancelAlarm,"Burglar",src,trigger), 600)
|
||||
|
||||
/area/proc/set_fire_alarm_effect()
|
||||
fire = 1
|
||||
updateicon()
|
||||
fire = TRUE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
for(var/alarm in firealarms)
|
||||
var/obj/machinery/firealarm/F = alarm
|
||||
F.update_fire_light(fire)
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.update()
|
||||
|
||||
/area/proc/readyalert()
|
||||
if(name == "Space")
|
||||
return
|
||||
if(!eject)
|
||||
eject = 1
|
||||
updateicon()
|
||||
|
||||
/area/proc/readyreset()
|
||||
if(eject)
|
||||
eject = 0
|
||||
updateicon()
|
||||
|
||||
/area/proc/partyalert()
|
||||
if(src.name == "Space") //no parties in space!!!
|
||||
return
|
||||
if (!( src.party ))
|
||||
src.party = 1
|
||||
src.updateicon()
|
||||
src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/area/proc/partyreset()
|
||||
if (src.party)
|
||||
src.party = 0
|
||||
src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
src.updateicon()
|
||||
for(var/obj/machinery/door/firedoor/D in src)
|
||||
if(!D.welded)
|
||||
if(D.operating)
|
||||
D.nextstate = OPEN
|
||||
else if(D.density)
|
||||
INVOKE_ASYNC(D, /obj/machinery/door/firedoor.proc/open)
|
||||
/area/proc/unset_fire_alarm_effects()
|
||||
fire = FALSE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
for(var/alarm in firealarms)
|
||||
var/obj/machinery/firealarm/F = alarm
|
||||
F.update_fire_light(fire)
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.update()
|
||||
|
||||
/area/proc/updateicon()
|
||||
if ((fire || eject || party) && (!requires_power||power_environ))//If it doesn't require power, can still activate this proc.
|
||||
if(fire && !eject && !party)
|
||||
icon_state = "blue"
|
||||
else if(!fire && eject && !party)
|
||||
icon_state = "red"
|
||||
else if(party && !fire && !eject)
|
||||
icon_state = "party"
|
||||
else
|
||||
icon_state = "blue-red"
|
||||
else
|
||||
var/weather_icon
|
||||
for(var/V in SSweather.processing)
|
||||
var/datum/weather/W = V
|
||||
if(W.stage != END_STAGE && (src in W.impacted_areas))
|
||||
W.update_areas()
|
||||
weather_icon = TRUE
|
||||
if(!weather_icon)
|
||||
icon_state = null
|
||||
var/weather_icon
|
||||
for(var/V in SSweather.processing)
|
||||
var/datum/weather/W = V
|
||||
if(W.stage != END_STAGE && (src in W.impacted_areas))
|
||||
W.update_areas()
|
||||
weather_icon = TRUE
|
||||
if(!weather_icon)
|
||||
icon_state = null
|
||||
|
||||
/area/space/updateicon()
|
||||
icon_state = null
|
||||
@@ -443,8 +409,8 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
|
||||
/area/Entered(atom/movable/M)
|
||||
set waitfor = FALSE
|
||||
SendSignal(COMSIG_AREA_ENTERED, M)
|
||||
M.SendSignal(COMSIG_ENTER_AREA, src) //The atom that enters the area
|
||||
SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M)
|
||||
SEND_SIGNAL(M, COMSIG_ENTER_AREA, src) //The atom that enters the area
|
||||
if(!isliving(M))
|
||||
return
|
||||
|
||||
@@ -469,8 +435,8 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
|
||||
|
||||
/area/Exited(atom/movable/M)
|
||||
SendSignal(COMSIG_AREA_EXITED, M)
|
||||
M.SendSignal(COMSIG_EXIT_AREA, src) //The atom that exits the area
|
||||
SEND_SIGNAL(src, COMSIG_AREA_EXITED, M)
|
||||
SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area
|
||||
|
||||
/client/proc/ResetAmbiencePlayed()
|
||||
played = FALSE
|
||||
@@ -478,16 +444,39 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
/atom/proc/has_gravity(turf/T)
|
||||
if(!T || !isturf(T))
|
||||
T = get_turf(src)
|
||||
|
||||
if(!T)
|
||||
return 0
|
||||
|
||||
//Gravity forced on the atom
|
||||
var/datum/component/forced_gravity/FG = GetComponent(/datum/component/forced_gravity)
|
||||
if(FG)
|
||||
if(!FG.ignore_space && isspaceturf(T))
|
||||
return 0
|
||||
else
|
||||
return FG.gravity
|
||||
|
||||
//Gravity forced on the turf
|
||||
FG = T.GetComponent(/datum/component/forced_gravity)
|
||||
if(FG)
|
||||
if(!FG.ignore_space && isspaceturf(T))
|
||||
return 0
|
||||
else
|
||||
return FG.gravity
|
||||
|
||||
var/area/A = get_area(T)
|
||||
if(isspaceturf(T)) // Turf never has gravity
|
||||
return FALSE
|
||||
else if(A && A.has_gravity) // Areas which always has gravity
|
||||
return TRUE
|
||||
return 0
|
||||
else if(A.has_gravity) // Areas which always has gravity
|
||||
return A.has_gravity
|
||||
else
|
||||
// There's a gravity generator on our z level
|
||||
if(T && GLOB.gravity_generators["[T.z]"] && length(GLOB.gravity_generators["[T.z]"]))
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(GLOB.gravity_generators["[T.z]"])
|
||||
var/max_grav = 0
|
||||
for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"])
|
||||
max_grav = max(G.setting,max_grav)
|
||||
return max_grav
|
||||
return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY)
|
||||
|
||||
/area/proc/setup(a_name)
|
||||
name = a_name
|
||||
|
||||
@@ -7,7 +7,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30"
|
||||
/area/awaymission
|
||||
name = "Strange Location"
|
||||
icon_state = "away"
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
ambientsounds = AWAY_MISSION
|
||||
|
||||
/area/awaymission/beach
|
||||
@@ -15,10 +15,14 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30"
|
||||
icon_state = "away"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg')
|
||||
|
||||
/area/awaymission/errorroom
|
||||
name = "Super Secret Room"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
|
||||
/area/awaymission/vr
|
||||
name = "Virtual Reality"
|
||||
icon_state = "awaycontent1"
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "centcom"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
noteleport = TRUE
|
||||
blob_allowed = FALSE //Should go without saying, no blobs should take over centcom as a win condition.
|
||||
flags_1 = NONE
|
||||
@@ -36,7 +36,7 @@
|
||||
icon_state = "yellow"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
flags_1 = NONE
|
||||
|
||||
/area/tdome/arena
|
||||
@@ -74,7 +74,7 @@
|
||||
icon_state = "yellow"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
noteleport = TRUE
|
||||
flags_1 = NONE
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
icon_state = "yellow"
|
||||
requires_power = FALSE
|
||||
noteleport = TRUE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
flags_1 = NONE
|
||||
|
||||
//Syndicates
|
||||
@@ -92,7 +92,7 @@
|
||||
name = "Syndicate Mothership"
|
||||
icon_state = "syndie-ship"
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
noteleport = TRUE
|
||||
blob_allowed = FALSE //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win.
|
||||
flags_1 = NONE
|
||||
@@ -107,7 +107,12 @@
|
||||
name = "Syndicate Elite Squad"
|
||||
icon_state = "syndie-elite"
|
||||
|
||||
|
||||
/area/fabric_of_reality
|
||||
name = "Tear in the Fabric of Reality"
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
noteleport = TRUE
|
||||
blob_allowed = FALSE
|
||||
|
||||
//CAPTURE THE FLAG
|
||||
|
||||
@@ -115,8 +120,7 @@
|
||||
name = "Capture the Flag"
|
||||
icon_state = "yellow"
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
flags_1 = NO_DEATHRATTLE_1
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
|
||||
/area/ctf/control_room
|
||||
name = "Control Room A"
|
||||
@@ -151,7 +155,7 @@
|
||||
name = "Reebe"
|
||||
icon_state = "yellow"
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
noteleport = TRUE
|
||||
hidden = TRUE
|
||||
ambientsounds = REEBE
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/area/mine
|
||||
icon_state = "mining"
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
|
||||
/area/mine/explored
|
||||
name = "Mine"
|
||||
@@ -80,7 +80,7 @@
|
||||
|
||||
/area/lavaland
|
||||
icon_state = "mining"
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
flags_1 = NONE
|
||||
|
||||
/area/lavaland/surface
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/area/ruin
|
||||
name = "\improper Unexplored Location"
|
||||
icon_state = "away"
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
hidden = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
ambientsounds = RUINS
|
||||
|
||||
@@ -70,6 +70,9 @@
|
||||
/area/ruin/unpowered/syndicate_lava_base/telecomms
|
||||
name = "Syndicate Lavaland Telecommunications"
|
||||
|
||||
/area/ruin/unpowered/syndicate_lava_base/circuits
|
||||
name = "Syndicate Lavaland Circuit Lab"
|
||||
|
||||
|
||||
//Xeno Nest
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
blob_allowed = FALSE //Nope, no winning in space as a blob. Gotta eat the station.
|
||||
|
||||
/area/ruin/space/has_grav
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
|
||||
/area/ruin/space/has_grav/powered
|
||||
requires_power = FALSE
|
||||
@@ -413,13 +413,13 @@
|
||||
/area/ruin/space/djstation
|
||||
name = "Ruskie DJ Station"
|
||||
icon_state = "DJ"
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station.
|
||||
|
||||
/area/ruin/space/djstation/solars
|
||||
name = "DJ Station Solars"
|
||||
icon_state = "DJ"
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
|
||||
|
||||
//ABANDONED TELEPORTER
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
name = "Shuttle"
|
||||
requires_power = FALSE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
has_gravity = TRUE
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
always_unpowered = FALSE
|
||||
valid_territory = FALSE
|
||||
icon_state = "shuttle"
|
||||
@@ -67,6 +67,7 @@
|
||||
/area/shuttle/transit
|
||||
name = "Hyperspace"
|
||||
desc = "Weeeeee"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
|
||||
/area/shuttle/custom
|
||||
name = "Custom player shuttle"
|
||||
|
||||
+61
-45
@@ -2,11 +2,11 @@
|
||||
layer = TURF_LAYER
|
||||
plane = GAME_PLANE
|
||||
var/level = 2
|
||||
var/article // If non-null, overrides a/an/some in all cases
|
||||
|
||||
var/flags_1 = NONE
|
||||
var/interaction_flags_atom = NONE
|
||||
var/container_type = NONE
|
||||
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
|
||||
var/datum/reagents/reagents = null
|
||||
|
||||
//This atom's HUD (med/sec, etc) images. Associative list.
|
||||
@@ -19,15 +19,17 @@
|
||||
|
||||
var/list/atom_colours //used to store the different colors on an atom
|
||||
//its inherent color, the colored paint applied on it, special color effect etc...
|
||||
var/initialized = FALSE
|
||||
|
||||
var/list/our_overlays //our local copy of (non-priority) overlays without byond magic. Use procs in SSoverlays to manipulate
|
||||
var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4.
|
||||
var/list/remove_overlays // a very temporary list of overlays to remove
|
||||
var/list/add_overlays // a very temporary list of overlays to add
|
||||
|
||||
var/datum/proximity_monitor/proximity_monitor
|
||||
var/buckle_message_cooldown = 0
|
||||
var/fingerprintslast
|
||||
|
||||
var/list/filter_data //For handling persistent filters
|
||||
|
||||
/atom/New(loc, ...)
|
||||
//atom creation method that preloads variables at creation
|
||||
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
|
||||
@@ -59,9 +61,9 @@
|
||||
// /turf/open/space/Initialize
|
||||
|
||||
/atom/proc/Initialize(mapload, ...)
|
||||
if(initialized)
|
||||
if(flags_1 & INITIALIZED_1)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
initialized = TRUE
|
||||
flags_1 |= INITIALIZED_1
|
||||
|
||||
//atom color stuff
|
||||
if(color)
|
||||
@@ -113,7 +115,7 @@
|
||||
if(!T)
|
||||
return FALSE
|
||||
|
||||
if(is_transit_level(T.z))
|
||||
if(is_reserved_level(T.z))
|
||||
for(var/A in SSshuttle.mobile)
|
||||
var/obj/docking_port/mobile/M = A
|
||||
if(M.launch_status == ENDGAME_TRANSIT)
|
||||
@@ -152,7 +154,7 @@
|
||||
return FALSE
|
||||
|
||||
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
|
||||
SendSignal(COMSIG_ATOM_HULK_ATTACK, user)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
|
||||
if(does_attack_animation)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
add_logs(user, src, "punched", "hulk powers")
|
||||
@@ -221,12 +223,13 @@
|
||||
return
|
||||
|
||||
/atom/proc/emp_act(severity)
|
||||
SendSignal(COMSIG_ATOM_EMP_ACT, severity)
|
||||
if(istype(wires) && !(flags_1 & NO_EMP_WIRES_1))
|
||||
var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity)
|
||||
if(!(protection & EMP_PROTECT_WIRES) && istype(wires))
|
||||
wires.emp_pulse()
|
||||
return protection // Pass the protection value collected here upwards
|
||||
|
||||
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
|
||||
SendSignal(COMSIG_ATOM_BULLET_ACT, P, def_zone)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
|
||||
. = P.on_hit(src, 0, def_zone)
|
||||
|
||||
/atom/proc/in_contents_of(container)//can take class or object instance as argument
|
||||
@@ -239,8 +242,11 @@
|
||||
|
||||
/atom/proc/get_examine_name(mob/user)
|
||||
. = "\a [src]"
|
||||
var/list/override = list(gender == PLURAL? "some" : "a" , " ", "[name]")
|
||||
if(SendSignal(COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
|
||||
var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]")
|
||||
if(article)
|
||||
. = "[article] [src]"
|
||||
override[EXAMINE_POSITION_ARTICLE] = article
|
||||
if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
|
||||
. = override.Join("")
|
||||
|
||||
/atom/proc/get_examine_string(mob/user, thats = FALSE)
|
||||
@@ -272,7 +278,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='danger'>It's empty.</span>")
|
||||
|
||||
SendSignal(COMSIG_PARENT_EXAMINE, user)
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user)
|
||||
|
||||
/atom/proc/relaymove(mob/user)
|
||||
if(buckle_message_cooldown <= world.time)
|
||||
@@ -286,14 +292,14 @@
|
||||
/atom/proc/ex_act(severity, target)
|
||||
set waitfor = FALSE
|
||||
contents_explosion(severity, target)
|
||||
SendSignal(COMSIG_ATOM_EX_ACT, severity, target)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
|
||||
|
||||
/atom/proc/blob_act(obj/structure/blob/B)
|
||||
SendSignal(COMSIG_ATOM_BLOB_ACT, B)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
|
||||
return
|
||||
|
||||
/atom/proc/fire_act(exposed_temperature, exposed_volume)
|
||||
SendSignal(COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
|
||||
return
|
||||
|
||||
/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
|
||||
@@ -361,28 +367,28 @@
|
||||
return
|
||||
|
||||
/atom/proc/singularity_pull(obj/singularity/S, current_size)
|
||||
SendSignal(COMSIG_ATOM_SING_PULL, S, current_size)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size)
|
||||
|
||||
/atom/proc/acid_act(acidpwr, acid_volume)
|
||||
SendSignal(COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
|
||||
|
||||
/atom/proc/emag_act()
|
||||
SendSignal(COMSIG_ATOM_EMAG_ACT)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
|
||||
/atom/proc/rad_act(strength)
|
||||
SendSignal(COMSIG_ATOM_RAD_ACT, strength)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength)
|
||||
|
||||
/atom/proc/narsie_act()
|
||||
SendSignal(COMSIG_ATOM_NARSIE_ACT)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT)
|
||||
|
||||
/atom/proc/ratvar_act()
|
||||
SendSignal(COMSIG_ATOM_RATVAR_ACT)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT)
|
||||
|
||||
/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
SendSignal(COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
|
||||
@@ -410,7 +416,7 @@
|
||||
|
||||
//This proc is called on the location of an atom when the atom is Destroy()'d
|
||||
/atom/proc/handle_atom_del(atom/A)
|
||||
SendSignal(COMSIG_ATOM_CONTENTS_DEL, A)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A)
|
||||
|
||||
//called when the turf the atom resides on is ChangeTurfed
|
||||
/atom/proc/HandleTurfChange(turf/T)
|
||||
@@ -426,27 +432,10 @@
|
||||
/atom/proc/update_remote_sight(mob/living/user)
|
||||
return
|
||||
|
||||
/atom/proc/add_vomit_floor(mob/living/carbon/M, toxvomit = 0)
|
||||
if(isturf(src))
|
||||
var/obj/effect/decal/cleanable/vomit/V = new /obj/effect/decal/cleanable/vomit(src, M.get_static_viruses())
|
||||
// Make toxins vomit look different
|
||||
if(toxvomit)
|
||||
V.icon_state = "vomittox_[pick(1,4)]"
|
||||
if(M.reagents)
|
||||
clear_reagents_to_vomit_pool(M,V)
|
||||
|
||||
/atom/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V)
|
||||
M.reagents.trans_to(V, M.reagents.total_volume / 10)
|
||||
for(var/datum/reagent/R in M.reagents.reagent_list) //clears the stomach of anything that might be digested as food
|
||||
if(istype(R, /datum/reagent/consumable))
|
||||
var/datum/reagent/consumable/nutri_check = R
|
||||
if(nutri_check.nutriment_factor >0)
|
||||
M.reagents.remove_reagent(R.id,R.volume)
|
||||
|
||||
|
||||
//Hook for running code when a dir change occurs
|
||||
/atom/proc/setDir(newdir)
|
||||
SendSignal(COMSIG_ATOM_DIR_CHANGE, dir, newdir)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
|
||||
dir = newdir
|
||||
|
||||
/atom/proc/mech_melee_attack(obj/mecha/M)
|
||||
@@ -517,7 +506,7 @@
|
||||
|
||||
/atom/vv_edit_var(var_name, var_value)
|
||||
if(!GLOB.Debug2)
|
||||
admin_spawned = TRUE
|
||||
flags_1 |= ADMIN_SPAWNED_1
|
||||
. = ..()
|
||||
switch(var_name)
|
||||
if("color")
|
||||
@@ -541,10 +530,15 @@
|
||||
return L.AllowDrop() ? L : get_turf(L)
|
||||
|
||||
/atom/Entered(atom/movable/AM, atom/oldLoc)
|
||||
SendSignal(COMSIG_ATOM_ENTERED, AM, oldLoc)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc)
|
||||
|
||||
/atom/Exit(atom/movable/AM, atom/newLoc)
|
||||
. = ..()
|
||||
if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT)
|
||||
return FALSE
|
||||
|
||||
/atom/Exited(atom/movable/AM, atom/newLoc)
|
||||
SendSignal(COMSIG_ATOM_EXITED, AM, newLoc)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc)
|
||||
|
||||
/atom/proc/return_temperature()
|
||||
return
|
||||
@@ -593,3 +587,25 @@
|
||||
|
||||
/atom/proc/GenerateTag()
|
||||
return
|
||||
|
||||
// Filter stuff
|
||||
/atom/movable/proc/add_filter(name,priority,list/params)
|
||||
if(!filter_data)
|
||||
filter_data = list()
|
||||
var/list/p = params.Copy()
|
||||
p["priority"] = priority
|
||||
filter_data[name] = p
|
||||
update_filters()
|
||||
|
||||
/atom/movable/proc/update_filters()
|
||||
filters = null
|
||||
sortTim(filter_data,associative = TRUE)
|
||||
for(var/f in filter_data)
|
||||
var/list/data = filter_data[f]
|
||||
var/list/arguments = data.Copy()
|
||||
arguments -= "priority"
|
||||
filters += filter(arglist(arguments))
|
||||
|
||||
/atom/movable/proc/get_filter(name)
|
||||
if(filter_data && filter_data[name])
|
||||
return filters[filter_data.Find(name)]
|
||||
+33
-30
@@ -29,6 +29,7 @@
|
||||
var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
|
||||
var/atom/movable/pulling
|
||||
var/grab_state = 0
|
||||
var/throwforce = 0
|
||||
|
||||
/atom/movable/vv_edit_var(var_name, var_value)
|
||||
var/static/list/banned_edits = list("step_x", "step_y", "step_size")
|
||||
@@ -161,41 +162,45 @@
|
||||
else //Diagonal move, split it into cardinal moves
|
||||
moving_diagonally = FIRST_DIAG_STEP
|
||||
var/first_step_dir
|
||||
// The `&& moving_diagonally` checks are so that a forceMove taking
|
||||
// place due to a Crossed, Collided, etc. call will interrupt
|
||||
// the second half of the diagonal movement, or the second attempt
|
||||
// at a first half if step() fails because we hit something.
|
||||
if (direct & NORTH)
|
||||
if (direct & EAST)
|
||||
if (step(src, NORTH))
|
||||
if (step(src, NORTH) && moving_diagonally)
|
||||
first_step_dir = NORTH
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, EAST)
|
||||
else if (step(src, EAST))
|
||||
else if (moving_diagonally && step(src, EAST))
|
||||
first_step_dir = EAST
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, NORTH)
|
||||
else if (direct & WEST)
|
||||
if (step(src, NORTH))
|
||||
if (step(src, NORTH) && moving_diagonally)
|
||||
first_step_dir = NORTH
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, WEST)
|
||||
else if (step(src, WEST))
|
||||
else if (moving_diagonally && step(src, WEST))
|
||||
first_step_dir = WEST
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, NORTH)
|
||||
else if (direct & SOUTH)
|
||||
if (direct & EAST)
|
||||
if (step(src, SOUTH))
|
||||
if (step(src, SOUTH) && moving_diagonally)
|
||||
first_step_dir = SOUTH
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, EAST)
|
||||
else if (step(src, EAST))
|
||||
else if (moving_diagonally && step(src, EAST))
|
||||
first_step_dir = EAST
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, SOUTH)
|
||||
else if (direct & WEST)
|
||||
if (step(src, SOUTH))
|
||||
if (step(src, SOUTH) && moving_diagonally)
|
||||
first_step_dir = SOUTH
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, WEST)
|
||||
else if (step(src, WEST))
|
||||
else if (moving_diagonally && step(src, WEST))
|
||||
first_step_dir = WEST
|
||||
moving_diagonally = SECOND_DIAG_STEP
|
||||
. = step(src, SOUTH)
|
||||
@@ -217,14 +222,15 @@
|
||||
if(. && pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move.
|
||||
if(pulling.anchored)
|
||||
stop_pulling()
|
||||
return
|
||||
var/pull_dir = get_dir(src, pulling)
|
||||
if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) //puller and pullee more than one tile away or in diagonal position
|
||||
pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position
|
||||
if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up
|
||||
stop_pulling()
|
||||
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
|
||||
pulledby.stop_pulling()
|
||||
else
|
||||
var/pull_dir = get_dir(src, pulling)
|
||||
//puller and pullee more than one tile away or in diagonal position
|
||||
if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir)))
|
||||
pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position
|
||||
if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up
|
||||
stop_pulling()
|
||||
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
|
||||
pulledby.stop_pulling()
|
||||
|
||||
|
||||
last_move = direct
|
||||
@@ -234,7 +240,7 @@
|
||||
|
||||
//Called after a successful Move(). By this point, we've already moved
|
||||
/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE)
|
||||
SendSignal(COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced)
|
||||
if (!inertia_moving)
|
||||
inertia_next_move = world.time + inertia_move_delay
|
||||
newtonian_move(Dir)
|
||||
@@ -248,10 +254,6 @@
|
||||
if (orbiting)
|
||||
orbiting.Check()
|
||||
|
||||
var/datum/proximity_monitor/proximity_monitor = src.proximity_monitor
|
||||
if(proximity_monitor)
|
||||
proximity_monitor.HandleMove()
|
||||
|
||||
return 1
|
||||
|
||||
/atom/movable/Destroy(force)
|
||||
@@ -276,16 +278,16 @@
|
||||
// This is automatically called when something enters your square
|
||||
//oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called!
|
||||
/atom/movable/Crossed(atom/movable/AM, oldloc)
|
||||
SendSignal(COMSIG_MOVABLE_CROSSED, AM)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
|
||||
|
||||
/atom/movable/Uncrossed(atom/movable/AM)
|
||||
SendSignal(COMSIG_MOVABLE_UNCROSSED, AM)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_UNCROSSED, AM)
|
||||
|
||||
//This is tg's equivalent to the byond bump, it used to be called bump with a second arg
|
||||
//to differentiate it, naturally everyone forgot about this immediately and so some things
|
||||
//would bump twice, so now it's called Collide
|
||||
/atom/movable/proc/Collide(atom/A)
|
||||
SendSignal(COMSIG_MOVABLE_COLLIDE, A)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_COLLIDE, A)
|
||||
if(A)
|
||||
if(throwing)
|
||||
throwing.hit_atom(A)
|
||||
@@ -314,8 +316,8 @@
|
||||
var/area/old_area = get_area(oldloc)
|
||||
var/area/destarea = get_area(destination)
|
||||
|
||||
|
||||
loc = destination
|
||||
moving_diagonally = 0
|
||||
|
||||
if(!same_loc)
|
||||
if(oldloc)
|
||||
@@ -352,7 +354,7 @@
|
||||
loc = null
|
||||
|
||||
/atom/movable/proc/onTransitZ(old_z,new_z)
|
||||
SendSignal(COMSIG_MOVABLE_Z_CHANGED, old_z, new_z)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_z, new_z)
|
||||
for (var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care.
|
||||
var/atom/movable/AM = item
|
||||
AM.onTransitZ(old_z,new_z)
|
||||
@@ -395,7 +397,7 @@
|
||||
|
||||
/atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
set waitfor = 0
|
||||
SendSignal(COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
|
||||
return hit_atom.hitby(src)
|
||||
|
||||
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked)
|
||||
@@ -408,7 +410,7 @@
|
||||
|
||||
/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) //If this returns FALSE then callback will not be called.
|
||||
. = FALSE
|
||||
if (!target || (flags_1 & NODROP_1) || speed <= 0)
|
||||
if (!target || speed <= 0)
|
||||
return
|
||||
|
||||
if (pulledby)
|
||||
@@ -480,7 +482,7 @@
|
||||
if(spin)
|
||||
SpinAnimation(5, 1)
|
||||
|
||||
SendSignal(COMSIG_MOVABLE_THROW, TT, spin)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_THROW, TT, spin)
|
||||
SSthrowing.processing[src] = TT
|
||||
if (SSthrowing.state == SS_PAUSED && length(SSthrowing.currentrun))
|
||||
SSthrowing.currentrun[src] = TT
|
||||
@@ -562,7 +564,8 @@
|
||||
if(visual_effect_icon)
|
||||
I = image('icons/effects/effects.dmi', A, visual_effect_icon, A.layer + 0.1)
|
||||
else if(used_item)
|
||||
I = image(used_item.icon, A, used_item.icon_state, A.layer + 0.1)
|
||||
I = image(icon = used_item, loc = A, layer = A.layer + 0.1)
|
||||
I.plane = GAME_PLANE
|
||||
|
||||
// Scale the icon.
|
||||
I.transform *= 0.75
|
||||
|
||||
@@ -175,6 +175,11 @@
|
||||
if(has_trait(TRAIT_XENO_HOST))
|
||||
holder.icon_state = "hudxeno"
|
||||
else if(stat == DEAD || (has_trait(TRAIT_FAKEDEATH)))
|
||||
if(tod)
|
||||
var/tdelta = round(world.time - timeofdeath)
|
||||
if(tdelta < (DEFIB_TIME_LIMIT * 10))
|
||||
holder.icon_state = "huddefib"
|
||||
return
|
||||
holder.icon_state = "huddead"
|
||||
else
|
||||
switch(virus_threat)
|
||||
@@ -248,7 +253,7 @@
|
||||
if("Incarcerated")
|
||||
holder.icon_state = "hudincarcerated"
|
||||
return
|
||||
if("Parolled")
|
||||
if("Paroled")
|
||||
holder.icon_state = "hudparolled"
|
||||
return
|
||||
if("Discharged")
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
team.add_member(bro)
|
||||
bro.special_role = "brother"
|
||||
bro.restricted_roles = restricted_jobs
|
||||
log_game("[bro.key] (ckey) has been selected as a Brother")
|
||||
log_game("[key_name(bro)] has been selected as a Brother")
|
||||
pre_brother_teams += team
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
antag_flag = ROLE_CHANGELING
|
||||
false_report_weight = 10
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist
|
||||
required_players = 15
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
@@ -52,6 +52,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
changeling.restricted_roles = restricted_jobs
|
||||
return 1
|
||||
else
|
||||
setup_error = "Not enough changeling candidates"
|
||||
return 0
|
||||
|
||||
/datum/game_mode/changeling/post_setup()
|
||||
@@ -69,7 +70,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
GLOB.changeling_team_objective_type = pick(possible_team_objectives)
|
||||
|
||||
for(var/datum/mind/changeling in changelings)
|
||||
log_game("[changeling.key] (ckey) has been selected as a changeling")
|
||||
log_game("[key_name(changeling)] has been selected as a changeling")
|
||||
var/datum/antagonist/changeling/new_antag = new()
|
||||
new_antag.team_mode = TRUE
|
||||
changeling.add_antag_datum(new_antag)
|
||||
@@ -82,10 +83,10 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
return
|
||||
if(changelings.len <= (changelingcap - 2) || prob(100 - (csc * 2)))
|
||||
if(ROLE_CHANGELING in character.client.prefs.be_special)
|
||||
if(!jobban_isbanned(character, ROLE_CHANGELING) && !jobban_isbanned(character, ROLE_SYNDICATE))
|
||||
if(!jobban_isbanned(character, ROLE_CHANGELING) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character))
|
||||
if(age_check(character.client))
|
||||
if(!(character.job in restricted_jobs))
|
||||
character.mind.make_Changling()
|
||||
character.mind.make_Changeling()
|
||||
changelings += character.mind
|
||||
|
||||
/datum/game_mode/changeling/generate_report()
|
||||
|
||||
@@ -69,11 +69,13 @@
|
||||
return
|
||||
if(changelings.len <= (changelingcap - 2) || prob(100 / (csc * 4)))
|
||||
if(ROLE_CHANGELING in character.client.prefs.be_special)
|
||||
if(!jobban_isbanned(character, ROLE_CHANGELING) && !jobban_isbanned(character, ROLE_SYNDICATE))
|
||||
if(!jobban_isbanned(character, ROLE_CHANGELING) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character))
|
||||
if(age_check(character.client))
|
||||
if(!(character.job in restricted_jobs))
|
||||
character.mind.make_Changling()
|
||||
character.mind.make_Changeling()
|
||||
changelings += character.mind
|
||||
if(QDELETED(character))
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/game_mode/traitor/changeling/generate_report()
|
||||
|
||||
@@ -143,6 +143,12 @@ Credit where due:
|
||||
var/datum/team/clockcult/main_clockcult
|
||||
|
||||
/datum/game_mode/clockwork_cult/pre_setup()
|
||||
var/list/errorList = list()
|
||||
SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
|
||||
if(errorList.len) // reebe failed to load
|
||||
message_admins("Reebe failed to load!")
|
||||
log_game("Reebe failed to load!")
|
||||
return FALSE
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
@@ -168,7 +174,7 @@ Credit where due:
|
||||
/datum/game_mode/clockwork_cult/post_setup()
|
||||
for(var/S in servants_to_serve)
|
||||
var/datum/mind/servant = S
|
||||
log_game("[servant.key] was made an initial servant of Ratvar")
|
||||
log_game("[key_name(servant)] was made an initial servant of Ratvar")
|
||||
var/mob/living/L = servant.current
|
||||
var/turf/T = pick(GLOB.servant_spawns)
|
||||
L.forceMove(T)
|
||||
|
||||
@@ -42,17 +42,17 @@
|
||||
var/obj/item/clothing/C
|
||||
if(!H.w_uniform || H.dropItemToGround(H.w_uniform))
|
||||
C = new /obj/item/clothing/under/rank/clown(H)
|
||||
C.flags_1 |= NODROP_1 //mwahaha
|
||||
C.item_flags |= NODROP //mwahaha
|
||||
H.equip_to_slot_or_del(C, SLOT_W_UNIFORM)
|
||||
|
||||
if(!H.shoes || H.dropItemToGround(H.shoes))
|
||||
C = new /obj/item/clothing/shoes/clown_shoes(H)
|
||||
C.flags_1 |= NODROP_1
|
||||
C.item_flags |= NODROP
|
||||
H.equip_to_slot_or_del(C, SLOT_SHOES)
|
||||
|
||||
if(!H.wear_mask || H.dropItemToGround(H.wear_mask))
|
||||
C = new /obj/item/clothing/mask/gas/clown_hat(H)
|
||||
C.flags_1 |= NODROP_1
|
||||
C.item_flags |= NODROP
|
||||
H.equip_to_slot_or_del(C, SLOT_WEAR_MASK)
|
||||
|
||||
H.dna.add_mutation(CLOWNMUT)
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
/obj/item/reagent_containers/spray/waterflower/lube)
|
||||
implants = list(/obj/item/implant/sad_trombone)
|
||||
|
||||
uplink_type = /obj/item/radio/uplink/clownop
|
||||
uplink_type = /obj/item/uplink/clownop
|
||||
|
||||
/datum/outfit/syndicate/clownop/no_crystals
|
||||
tc = 0
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
list_reagents = list("lube" = 30)
|
||||
|
||||
//COMBAT CLOWN SHOES
|
||||
//Clown shoes with combat stats and noslip. Of course they still squeek.
|
||||
//Clown shoes with combat stats and noslip. Of course they still squeak.
|
||||
/obj/item/clothing/shoes/clown_shoes/combat
|
||||
name = "combat clown shoes"
|
||||
desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeek at 100% capacity."
|
||||
desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity."
|
||||
clothing_flags = NOSLIP
|
||||
slowdown = SHOES_SLOWDOWN
|
||||
armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50)
|
||||
@@ -216,11 +216,11 @@
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/sticky/Initialize()
|
||||
. = ..()
|
||||
flags_1 |= NODROP_1
|
||||
item_flags |= NODROP
|
||||
addtimer(CALLBACK(src, .proc/unstick), unstick_time)
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick()
|
||||
flags_1 &= ~NODROP_1
|
||||
item_flags &= ~NODROP
|
||||
|
||||
//DARK H.O.N.K. AND CLOWN MECH WEAPONS
|
||||
|
||||
|
||||
@@ -79,10 +79,13 @@
|
||||
cultists_to_cult += cultist
|
||||
cultist.special_role = ROLE_CULTIST
|
||||
cultist.restricted_roles = restricted_jobs
|
||||
log_game("[cultist.key] (ckey) has been selected as a cultist")
|
||||
log_game("[key_name(cultist)] has been selected as a cultist")
|
||||
|
||||
|
||||
return (cultists_to_cult.len>=required_enemies)
|
||||
if(cultists_to_cult.len>=required_enemies)
|
||||
return TRUE
|
||||
else
|
||||
setup_error = "Not enough cultist candidates"
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/game_mode/cult/post_setup()
|
||||
|
||||
@@ -41,10 +41,11 @@
|
||||
devil.special_role = traitor_name
|
||||
devil.restricted_roles = restricted_jobs
|
||||
|
||||
log_game("[devil.key] (ckey) has been selected as a [traitor_name]")
|
||||
log_game("[key_name(devil)] has been selected as a [traitor_name]")
|
||||
antag_candidates.Remove(devil)
|
||||
|
||||
if(devils.len < required_enemies)
|
||||
setup_error = "Not enough devil candidates"
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
var/gamemode_ready = FALSE //Is the gamemode all set up and ready to start checking for ending conditions.
|
||||
|
||||
var/flipseclevel = FALSE //CIT CHANGE - adds a 10% chance for the alert level to be the opposite of what the gamemode is supposed to have
|
||||
var/setup_error //What stopepd setting up the mode.
|
||||
|
||||
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
|
||||
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
|
||||
@@ -98,6 +99,7 @@
|
||||
if(sql)
|
||||
var/datum/DBQuery/query_round_game_mode = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET [sql] WHERE id = [GLOB.round_id]")
|
||||
query_round_game_mode.Execute()
|
||||
qdel(query_round_game_mode)
|
||||
if(report)
|
||||
addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h))
|
||||
generate_station_goals()
|
||||
@@ -364,7 +366,7 @@
|
||||
for(var/mob/dead/new_player/player in players)
|
||||
if(player.client && player.ready == PLAYER_READY_TO_PLAY)
|
||||
if(role in player.client.prefs.be_special)
|
||||
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
|
||||
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !QDELETED(player) && !jobban_isbanned(player, role) && !QDELETED(player)) //Nodrak/Carn: Antag Job-bans
|
||||
if(age_check(player.client)) //Must be older than the minimum age
|
||||
candidates += player.mind // Get a list of all the people who want to be the antagonist for this round
|
||||
|
||||
@@ -378,7 +380,7 @@
|
||||
for(var/mob/dead/new_player/player in players)
|
||||
if(player.client && player.ready == PLAYER_READY_TO_PLAY)
|
||||
if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one
|
||||
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
|
||||
if(!jobban_isbanned(player, ROLE_SYNDICATE) && !QDELETED(player) && !jobban_isbanned(player, role) && !QDELETED(player) ) //Nodrak/Carn: Antag Job-bans
|
||||
drafted += player.mind
|
||||
|
||||
if(restricted_jobs)
|
||||
|
||||
@@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
return
|
||||
|
||||
/obj/effect/meteor/examine(mob/user)
|
||||
if(!admin_spawned && isliving(user))
|
||||
if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user))
|
||||
SSmedals.UnlockMedal(MEDAL_METEOR, user.client)
|
||||
..()
|
||||
|
||||
|
||||
@@ -36,10 +36,11 @@
|
||||
carriers += carrier
|
||||
carrier.special_role = "Monkey Leader"
|
||||
carrier.restricted_roles = restricted_jobs
|
||||
log_game("[carrier.key] (ckey) has been selected as a Jungle Fever carrier")
|
||||
log_game("[key_name(carrier)] has been selected as a Jungle Fever carrier")
|
||||
antag_candidates -= carrier
|
||||
|
||||
if(!carriers.len)
|
||||
setup_error = "No monkey candidates"
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -30,9 +30,10 @@
|
||||
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")
|
||||
log_game("[key_name(new_op)] has been selected as a nuclear operative")
|
||||
return TRUE
|
||||
else
|
||||
setup_error = "Not enough nuke op candidates"
|
||||
return FALSE
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -134,7 +135,7 @@
|
||||
|
||||
var/tc = 25
|
||||
var/command_radio = FALSE
|
||||
var/uplink_type = /obj/item/radio/uplink/nuclear
|
||||
var/uplink_type = /obj/item/uplink/nuclear
|
||||
|
||||
|
||||
/datum/outfit/syndicate/leader
|
||||
@@ -154,7 +155,7 @@
|
||||
R.command = TRUE
|
||||
|
||||
if(tc)
|
||||
var/obj/item/radio/uplink/U = new uplink_type(H, H.key, tc)
|
||||
var/obj/item/U = new uplink_type(H, H.key, tc)
|
||||
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
|
||||
|
||||
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
|
||||
|
||||
@@ -279,7 +279,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
||||
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
|
||||
return TRUE
|
||||
for(var/mob/living/player in GLOB.player_list)
|
||||
if(get_area(player) in SSshuttle.emergency.shuttle_areas && player.mind && player.stat != DEAD && ishuman(player))
|
||||
if((get_area(player) in SSshuttle.emergency.shuttle_areas) && player.mind && player.stat != DEAD && ishuman(player))
|
||||
var/mob/living/carbon/human/H = player
|
||||
if(H.dna.species.id != "human")
|
||||
return FALSE
|
||||
@@ -621,7 +621,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
absorbedcount += changeling.absorbedcount
|
||||
|
||||
for(var/datum/antagonist/changeling/changeling2 in GLOB.antagonists)
|
||||
if(!changeling2.owner || !changeling2.stored_profiles || changeling2.absorbedcount < absorbedcount)
|
||||
if(!changeling2.owner || changeling2.owner == owner || !changeling2.stored_profiles || changeling2.absorbedcount < absorbedcount)
|
||||
continue
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
lenin.restricted_roles = restricted_jobs
|
||||
|
||||
if(headrev_candidates.len < required_enemies)
|
||||
setup_error = "Not enough headrev candidates"
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
@@ -96,7 +97,7 @@
|
||||
revolution = new()
|
||||
|
||||
for(var/datum/mind/rev_mind in headrev_candidates)
|
||||
log_game("[rev_mind.key] (ckey) has been selected as a head rev")
|
||||
log_game("[key_name(rev_mind)] has been selected as a head rev")
|
||||
var/datum/antagonist/rev/head/new_head = new()
|
||||
new_head.give_flash = TRUE
|
||||
new_head.give_hud = TRUE
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
antag_flag = ROLE_TRAITOR
|
||||
false_report_weight = 20 //Reports of traitors are pretty common.
|
||||
restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
@@ -53,10 +53,16 @@
|
||||
pre_traitors += traitor
|
||||
traitor.special_role = traitor_name
|
||||
traitor.restricted_roles = restricted_jobs
|
||||
log_game("[traitor.key] (ckey) has been selected as a [traitor_name]")
|
||||
log_game("[key_name(traitor)] has been selected as a [traitor_name]")
|
||||
antag_candidates.Remove(traitor)
|
||||
|
||||
return !traitors_required || pre_traitors.len > 0
|
||||
var/enough_tators = !traitors_required || pre_traitors.len > 0
|
||||
|
||||
if(!enough_tators)
|
||||
setup_error = "Not enough traitor candidates"
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/game_mode/traitor/post_setup()
|
||||
@@ -79,7 +85,7 @@
|
||||
return
|
||||
if((SSticker.mode.traitors.len + pre_traitors.len) <= (traitorcap - 2) || prob(100 / (tsc * 2)))
|
||||
if(ROLE_TRAITOR in character.client.prefs.be_special)
|
||||
if(!jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, ROLE_SYNDICATE))
|
||||
if(!jobban_isbanned(character, ROLE_TRAITOR) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character))
|
||||
if(age_check(character.client))
|
||||
if(!(character.job in restricted_jobs))
|
||||
add_latejoin_traitor(character.mind)
|
||||
@@ -90,14 +96,4 @@
|
||||
|
||||
/datum/game_mode/traitor/generate_report()
|
||||
return "Although more specific threats are commonplace, you should always remain vigilant for Syndicate agents aboard your station. Syndicate communications have implied that many \
|
||||
Nanotrasen employees are Syndicate agents with hidden memories that may be activated at a moment's notice, so it's possible that these agents might not even know their positions."
|
||||
|
||||
/datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind)
|
||||
var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR]
|
||||
traitorhud.join_hud(traitor_mind.current)
|
||||
set_antag_hud(traitor_mind.current, "traitor")
|
||||
|
||||
/datum/game_mode/proc/update_traitor_icons_removed(datum/mind/traitor_mind)
|
||||
var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR]
|
||||
traitorhud.leave_hud(traitor_mind.current)
|
||||
set_antag_hud(traitor_mind.current, null)
|
||||
Nanotrasen employees are Syndicate agents with hidden memories that may be activated at a moment's notice, so it's possible that these agents might not even know their positions."
|
||||
@@ -23,13 +23,13 @@
|
||||
wizards += wizard
|
||||
wizard.assigned_role = ROLE_WIZARD
|
||||
wizard.special_role = ROLE_WIZARD
|
||||
log_game("[wizard.key] (ckey) has been selected as a Wizard") //TODO: Move these to base antag datum
|
||||
log_game("[key_name(wizard)] has been selected as a Wizard") //TODO: Move these to base antag datum
|
||||
if(GLOB.wizardstart.len == 0)
|
||||
to_chat(wizard.current, "<span class='boldannounce'>A starting location for you could not be found, please report this bug!</span>")
|
||||
return 0
|
||||
setup_error = "No wizard starting location found"
|
||||
return FALSE
|
||||
for(var/datum/mind/wiz in wizards)
|
||||
wiz.current.forceMove(pick(GLOB.wizardstart))
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/game_mode/wizard/post_setup()
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
desc = "A device that draws power from bluespace and creates a permanent tracking beacon."
|
||||
level = 1 // underfloor
|
||||
layer = LOW_OBJ_LAYER
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 0
|
||||
var/obj/item/beacon/Beacon
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "pdapainter"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
max_integrity = 200
|
||||
var/obj/item/pda/storedpda = null
|
||||
var/list/colorlist = list()
|
||||
max_integrity = 200
|
||||
|
||||
|
||||
/obj/machinery/pdapainter/update_icon()
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "console"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
|
||||
/obj/machinery/sleeper
|
||||
name = "sleeper"
|
||||
@@ -11,7 +10,6 @@
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
state_open = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/sleeper
|
||||
var/efficiency = 1
|
||||
@@ -78,9 +76,11 @@
|
||||
to_chat(occupant, "[enter_message]")
|
||||
|
||||
/obj/machinery/sleeper/emp_act(severity)
|
||||
. = ..()
|
||||
if (. & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(is_operational() && occupant)
|
||||
open_machine()
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
|
||||
@@ -170,7 +170,7 @@
|
||||
return
|
||||
if(mob_occupant.health < min_health && chem != "epinephrine")
|
||||
return
|
||||
if(inject_chem(chem))
|
||||
if(inject_chem(chem, usr))
|
||||
. = TRUE
|
||||
if(scrambled_chems && prob(5))
|
||||
to_chat(usr, "<span class='warning'>Chem System Re-route detected, results may not be as expected!</span>")
|
||||
@@ -179,9 +179,11 @@
|
||||
scramble_chem_buttons()
|
||||
to_chat(user, "<span class='warning'>You scramble the sleeper's user interface!</span>")
|
||||
|
||||
/obj/machinery/sleeper/proc/inject_chem(chem)
|
||||
/obj/machinery/sleeper/proc/inject_chem(chem, mob/user)
|
||||
if((chem in available_chems) && chem_allowed(chem))
|
||||
occupant.reagents.add_reagent(chem_buttons[chem], 10) //emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU
|
||||
if(user)
|
||||
add_logs(user, occupant, "injected [chem] into", addition = "via [src]")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/sleeper/proc/chem_allowed(chem)
|
||||
|
||||
@@ -92,6 +92,7 @@ Class Procs:
|
||||
pressure_resistance = 15
|
||||
max_integrity = 200
|
||||
|
||||
anchored = TRUE
|
||||
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
|
||||
|
||||
var/stat = 0
|
||||
@@ -153,10 +154,10 @@ Class Procs:
|
||||
return PROCESS_KILL
|
||||
|
||||
/obj/machinery/emp_act(severity)
|
||||
if(use_power && !stat)
|
||||
. = ..()
|
||||
if(use_power && !stat && !(. & EMP_PROTECT_SELF))
|
||||
use_power(7500/severity)
|
||||
new /obj/effect/temp_visual/emp(loc)
|
||||
..()
|
||||
|
||||
/obj/machinery/proc/open_machine(drop = TRUE)
|
||||
state_open = TRUE
|
||||
@@ -180,7 +181,7 @@ Class Procs:
|
||||
density = TRUE
|
||||
if(!target)
|
||||
for(var/am in loc)
|
||||
if(!is_type_in_typecache(am, (occupant_typecache || GLOB.typecache_living)))
|
||||
if (!(occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am)))
|
||||
continue
|
||||
var/atom/movable/AM = am
|
||||
if(AM.has_buckled_mobs())
|
||||
@@ -310,7 +311,7 @@ Class Procs:
|
||||
/obj/machinery/proc/spawn_frame(disassembled)
|
||||
var/obj/structure/frame/machine/M = new /obj/structure/frame/machine(loc)
|
||||
. = M
|
||||
M.anchored = anchored
|
||||
M.setAnchored(anchored)
|
||||
if(!disassembled)
|
||||
M.obj_integrity = M.max_integrity * 0.5 //the frame is already half broken
|
||||
transfer_fingerprints_to(M)
|
||||
@@ -371,7 +372,7 @@ Class Procs:
|
||||
//as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state
|
||||
if(I.use_tool(src, user, time, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user)))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [src].</span>")
|
||||
anchored = !anchored
|
||||
setAnchored(!anchored)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
return FAILED_UNFASTEN
|
||||
@@ -413,12 +414,12 @@ Class Procs:
|
||||
var/obj/item/stack/SN = new SB.merge_type(null,used_amt)
|
||||
component_parts += SN
|
||||
else
|
||||
if(W.SendSignal(COMSIG_TRY_STORAGE_TAKE, B, src))
|
||||
if(SEND_SIGNAL(W, COMSIG_TRY_STORAGE_TAKE, B, src))
|
||||
component_parts += B
|
||||
B.moveToNullspace()
|
||||
W.SendSignal(COMSIG_TRY_STORAGE_INSERT, A, null, null, TRUE)
|
||||
SEND_SIGNAL(W, COMSIG_TRY_STORAGE_INSERT, A, null, null, TRUE)
|
||||
component_parts -= A
|
||||
to_chat(user, "<span class='notice'>[A.name] replaced with [B.name].</span>")
|
||||
to_chat(user, "<span class='notice'>[capitalize(A.name)] replaced with [B.name].</span>")
|
||||
shouldplaysound = 1 //Only play the sound when parts are actually replaced!
|
||||
break
|
||||
RefreshParts()
|
||||
@@ -463,15 +464,14 @@ Class Procs:
|
||||
/obj/machinery/proc/can_be_overridden()
|
||||
. = 1
|
||||
|
||||
|
||||
/obj/machinery/tesla_act(power, explosive = FALSE)
|
||||
/obj/machinery/tesla_act(power, tesla_flags, shocked_objects)
|
||||
..()
|
||||
if(prob(85) && explosive)
|
||||
explosion(src.loc, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE)
|
||||
else if(prob(50))
|
||||
emp_act(EMP_LIGHT)
|
||||
else
|
||||
ex_act(EXPLODE_HEAVY)
|
||||
if(prob(85) && (tesla_flags & TESLA_MACHINE_EXPLOSIVE))
|
||||
explosion(src, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE)
|
||||
if(tesla_flags & TESLA_OBJ_DAMAGE)
|
||||
take_damage(power/2000, BURN, "energy")
|
||||
if(prob(40))
|
||||
emp_act(EMP_LIGHT)
|
||||
|
||||
/obj/machinery/Exited(atom/movable/AM, atom/newloc)
|
||||
. = ..()
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
icon_state = "ai-slipper0"
|
||||
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
anchored = TRUE
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
|
||||
|
||||
|
||||
@@ -1,154 +1,164 @@
|
||||
#define AIRLOCK_CONTROL_RANGE 5
|
||||
|
||||
// This code allows for airlocks to be controlled externally by setting an id_tag and comm frequency (disables ID access)
|
||||
/obj/machinery/door/airlock
|
||||
var/id_tag
|
||||
var/frequency
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/receive_signal(datum/signal/signal)
|
||||
if(!signal)
|
||||
return
|
||||
|
||||
if(id_tag != signal.data["tag"] || !signal.data["command"])
|
||||
return
|
||||
|
||||
switch(signal.data["command"])
|
||||
if("open")
|
||||
open(1)
|
||||
|
||||
if("close")
|
||||
close(1)
|
||||
|
||||
if("unlock")
|
||||
locked = FALSE
|
||||
update_icon()
|
||||
|
||||
if("lock")
|
||||
locked = TRUE
|
||||
update_icon()
|
||||
|
||||
if("secure_open")
|
||||
locked = FALSE
|
||||
update_icon()
|
||||
|
||||
sleep(2)
|
||||
open(1)
|
||||
|
||||
locked = TRUE
|
||||
update_icon()
|
||||
|
||||
if("secure_close")
|
||||
locked = FALSE
|
||||
close(1)
|
||||
|
||||
locked = TRUE
|
||||
sleep(2)
|
||||
update_icon()
|
||||
|
||||
send_status()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/proc/send_status()
|
||||
if(radio_connection)
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = id_tag,
|
||||
"timestamp" = world.time,
|
||||
"door_status" = density ? "closed" : "open",
|
||||
"lock_status" = locked ? "locked" : "unlocked"
|
||||
))
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/open(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send)
|
||||
send_status()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/close(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send)
|
||||
send_status()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
if(new_frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
/obj/machinery/door/airlock/Destroy()
|
||||
if(frequency)
|
||||
SSradio.remove_object(src,frequency)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/airlock_sensor
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_sensor_off"
|
||||
name = "airlock sensor"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
|
||||
anchored = TRUE
|
||||
power_channel = ENVIRON
|
||||
|
||||
var/id_tag
|
||||
var/master_tag
|
||||
var/frequency = FREQ_AIRLOCK_CONTROL
|
||||
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/on = TRUE
|
||||
var/alert = FALSE
|
||||
|
||||
|
||||
/obj/machinery/airlock_sensor/update_icon()
|
||||
if(on)
|
||||
if(alert)
|
||||
icon_state = "airlock_sensor_alert"
|
||||
else
|
||||
icon_state = "airlock_sensor_standby"
|
||||
else
|
||||
icon_state = "airlock_sensor_off"
|
||||
|
||||
/obj/machinery/airlock_sensor/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = master_tag,
|
||||
"command" = "cycle"
|
||||
))
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("airlock_sensor_cycle", src)
|
||||
|
||||
/obj/machinery/airlock_sensor/process()
|
||||
if(on)
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
var/pressure = round(air_sample.return_pressure(),0.1)
|
||||
alert = (pressure < ONE_ATMOSPHERE*0.8)
|
||||
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = id_tag,
|
||||
"timestamp" = world.time,
|
||||
"pressure" = num2text(pressure)
|
||||
))
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
/obj/machinery/airlock_sensor/Initialize()
|
||||
. = ..()
|
||||
set_frequency(frequency)
|
||||
|
||||
/obj/machinery/airlock_sensor/Destroy()
|
||||
SSradio.remove_object(src,frequency)
|
||||
#define AIRLOCK_CONTROL_RANGE 5
|
||||
|
||||
// This code allows for airlocks to be controlled externally by setting an id_tag and comm frequency (disables ID access)
|
||||
/obj/machinery/door/airlock
|
||||
var/id_tag
|
||||
var/frequency
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/receive_signal(datum/signal/signal)
|
||||
if(!signal)
|
||||
return
|
||||
|
||||
if(id_tag != signal.data["tag"] || !signal.data["command"])
|
||||
return
|
||||
|
||||
switch(signal.data["command"])
|
||||
if("open")
|
||||
open(1)
|
||||
|
||||
if("close")
|
||||
close(1)
|
||||
|
||||
if("unlock")
|
||||
locked = FALSE
|
||||
update_icon()
|
||||
|
||||
if("lock")
|
||||
locked = TRUE
|
||||
update_icon()
|
||||
|
||||
if("secure_open")
|
||||
locked = FALSE
|
||||
update_icon()
|
||||
|
||||
sleep(2)
|
||||
open(1)
|
||||
|
||||
locked = TRUE
|
||||
update_icon()
|
||||
|
||||
if("secure_close")
|
||||
locked = FALSE
|
||||
close(1)
|
||||
|
||||
locked = TRUE
|
||||
sleep(2)
|
||||
update_icon()
|
||||
|
||||
send_status()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/proc/send_status()
|
||||
if(radio_connection)
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = id_tag,
|
||||
"timestamp" = world.time,
|
||||
"door_status" = density ? "closed" : "open",
|
||||
"lock_status" = locked ? "locked" : "unlocked"
|
||||
))
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/open(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send)
|
||||
send_status()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/close(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send)
|
||||
send_status()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
if(new_frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
/obj/machinery/door/airlock/Destroy()
|
||||
if(frequency)
|
||||
SSradio.remove_object(src,frequency)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/airlock_sensor
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_sensor_off"
|
||||
name = "airlock sensor"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
|
||||
power_channel = ENVIRON
|
||||
|
||||
var/id_tag
|
||||
var/master_tag
|
||||
var/frequency = FREQ_AIRLOCK_CONTROL
|
||||
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/on = TRUE
|
||||
var/alert = FALSE
|
||||
|
||||
/obj/machinery/airlock_sensor/incinerator_toxmix
|
||||
id_tag = INCINERATOR_TOXMIX_AIRLOCK_SENSOR
|
||||
master_tag = INCINERATOR_TOXMIX_AIRLOCK_CONTROLLER
|
||||
|
||||
/obj/machinery/airlock_sensor/incinerator_atmos
|
||||
id_tag = INCINERATOR_ATMOS_AIRLOCK_SENSOR
|
||||
master_tag = INCINERATOR_ATMOS_AIRLOCK_CONTROLLER
|
||||
|
||||
/obj/machinery/airlock_sensor/incinerator_syndicatelava
|
||||
id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_SENSOR
|
||||
master_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER
|
||||
|
||||
/obj/machinery/airlock_sensor/update_icon()
|
||||
if(on)
|
||||
if(alert)
|
||||
icon_state = "airlock_sensor_alert"
|
||||
else
|
||||
icon_state = "airlock_sensor_standby"
|
||||
else
|
||||
icon_state = "airlock_sensor_off"
|
||||
|
||||
/obj/machinery/airlock_sensor/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = master_tag,
|
||||
"command" = "cycle"
|
||||
))
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("airlock_sensor_cycle", src)
|
||||
|
||||
/obj/machinery/airlock_sensor/process()
|
||||
if(on)
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
var/pressure = round(air_sample.return_pressure(),0.1)
|
||||
alert = (pressure < ONE_ATMOSPHERE*0.8)
|
||||
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = id_tag,
|
||||
"timestamp" = world.time,
|
||||
"pressure" = num2text(pressure)
|
||||
))
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
/obj/machinery/airlock_sensor/Initialize()
|
||||
. = ..()
|
||||
set_frequency(frequency)
|
||||
|
||||
/obj/machinery/airlock_sensor/Destroy()
|
||||
SSradio.remove_object(src,frequency)
|
||||
return ..()
|
||||
@@ -2,7 +2,6 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
|
||||
/obj/machinery/announcement_system
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
name = "\improper Automated Announcement System"
|
||||
desc = "An automated announcement system that handles minor announcements over the radio."
|
||||
icon = 'icons/obj/machines/telecomms.dmi'
|
||||
@@ -173,9 +172,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.")
|
||||
|
||||
/obj/machinery/announcement_system/emp_act(severity)
|
||||
if(!(stat & (NOPOWER|BROKEN)))
|
||||
. = ..()
|
||||
if(!(stat & (NOPOWER|BROKEN)) && !(. & EMP_PROTECT_SELF))
|
||||
act_up()
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/announcement_system/emag_act()
|
||||
if(obj_flags & EMAGGED)
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "pdapainter"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
obj_integrity = 200
|
||||
max_integrity = 200
|
||||
var/obj/item/bodypart/storedpart
|
||||
|
||||
@@ -7,13 +7,12 @@
|
||||
desc = "It produces items using metal and glass."
|
||||
icon_state = "autolathe"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
circuit = /obj/item/circuitboard/machine/autolathe
|
||||
layer = BELOW_OBJ_LAYER
|
||||
|
||||
|
||||
var/operating = FALSE
|
||||
var/list/L = list()
|
||||
var/list/LL = list()
|
||||
@@ -47,7 +46,7 @@
|
||||
)
|
||||
|
||||
/obj/machinery/autolathe/Initialize()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), 0, FALSE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
. = ..()
|
||||
|
||||
wires = new /datum/wires/autolathe(src)
|
||||
@@ -155,6 +154,7 @@
|
||||
|
||||
var/multiplier = text2num(href_list["multiplier"])
|
||||
var/is_stack = ispath(being_built.build_path, /obj/item/stack)
|
||||
multiplier = CLAMP(multiplier,1,50)
|
||||
|
||||
/////////////////
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
var/id = null
|
||||
var/initialized_button = 0
|
||||
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70)
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 2
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
@@ -96,7 +95,7 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(user.a_intent != INTENT_HARM && !(W.flags_1 & NOBLUDGEON_1))
|
||||
if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON))
|
||||
return attack_hand(user)
|
||||
else
|
||||
return ..()
|
||||
@@ -190,6 +189,31 @@
|
||||
device = new /obj/item/assembly/control(src)
|
||||
..()
|
||||
|
||||
/obj/machinery/button/door/incinerator_vent_toxmix
|
||||
name = "combustion chamber vent control"
|
||||
id = INCINERATOR_TOXMIX_VENT
|
||||
req_access = list(ACCESS_TOX)
|
||||
|
||||
/obj/machinery/button/door/incinerator_vent_atmos_main
|
||||
name = "turbine vent control"
|
||||
id = INCINERATOR_ATMOS_MAINVENT
|
||||
req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS)
|
||||
|
||||
/obj/machinery/button/door/incinerator_vent_atmos_aux
|
||||
name = "combustion chamber vent control"
|
||||
id = INCINERATOR_ATMOS_AUXVENT
|
||||
req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS)
|
||||
|
||||
/obj/machinery/button/door/incinerator_vent_syndicatelava_main
|
||||
name = "turbine vent control"
|
||||
id = INCINERATOR_SYNDICATELAVA_MAINVENT
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
|
||||
/obj/machinery/button/door/incinerator_vent_syndicatelava_aux
|
||||
name = "combustion chamber vent control"
|
||||
id = INCINERATOR_SYNDICATELAVA_AUXVENT
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
|
||||
/obj/machinery/button/massdriver
|
||||
name = "mass driver button"
|
||||
desc = "A remote control switch for a mass driver."
|
||||
@@ -204,6 +228,19 @@
|
||||
skin = "launcher"
|
||||
device_type = /obj/item/assembly/control/igniter
|
||||
|
||||
/obj/machinery/button/ignition/incinerator
|
||||
name = "combustion chamber ignition switch"
|
||||
desc = "A remote control switch for the combustion chamber's igniter."
|
||||
|
||||
/obj/machinery/button/ignition/incinerator/toxmix
|
||||
id = INCINERATOR_TOXMIX_IGNITER
|
||||
|
||||
/obj/machinery/button/ignition/incinerator/atmos
|
||||
id = INCINERATOR_ATMOS_IGNITER
|
||||
|
||||
/obj/machinery/button/ignition/incinerator/syndicatelava
|
||||
id = INCINERATOR_SYNDICATELAVA_IGNITER
|
||||
|
||||
/obj/machinery/button/flasher
|
||||
name = "flasher button"
|
||||
desc = "A remote control switch for a mounted flasher."
|
||||
|
||||
@@ -19,9 +19,7 @@
|
||||
integrity_failure = 50
|
||||
var/list/network = list("ss13")
|
||||
var/c_tag = null
|
||||
var/c_tag_order = 999
|
||||
var/status = TRUE
|
||||
anchored = TRUE
|
||||
var/start_active = FALSE //If it ignores the random chance to start broken on round start
|
||||
var/invuln = null
|
||||
var/obj/item/camera_bug/bug = null
|
||||
@@ -36,12 +34,23 @@
|
||||
var/alarm_on = FALSE
|
||||
var/busy = FALSE
|
||||
var/emped = FALSE //Number of consecutive EMP's on this camera
|
||||
var/in_use_lights = 0
|
||||
|
||||
// Upgrades bitflag
|
||||
var/upgrades = 0
|
||||
|
||||
var/internal_light = TRUE //Whether it can light up when an AI views it
|
||||
|
||||
/obj/machinery/camera/preset/toxins //Bomb test site in space
|
||||
name = "Hardened Bomb-Test Camera"
|
||||
desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."
|
||||
c_tag = "Bomb Testing Site"
|
||||
network = list("rd","toxins")
|
||||
use_power = NO_POWER_USE //Test site is an unpowered area
|
||||
invuln = TRUE
|
||||
light_range = 10
|
||||
start_active = TRUE
|
||||
|
||||
/obj/machinery/camera/Initialize(mapload, obj/structure/camera_assembly/CA)
|
||||
. = ..()
|
||||
for(var/i in network)
|
||||
@@ -77,9 +86,10 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/camera/emp_act(severity)
|
||||
. = ..()
|
||||
if(!status)
|
||||
return
|
||||
if(!isEmpProof())
|
||||
if(!(. & EMP_PROTECT_SELF))
|
||||
if(prob(150/severity))
|
||||
update_icon()
|
||||
var/list/previous_network = network
|
||||
@@ -107,13 +117,6 @@
|
||||
M.unset_machine()
|
||||
M.reset_perspective(null)
|
||||
to_chat(M, "The screen bursts into static.")
|
||||
..()
|
||||
|
||||
/obj/machinery/camera/tesla_act(var/power)//EMP proof upgrade also makes it tesla immune
|
||||
if(isEmpProof())
|
||||
return
|
||||
..()
|
||||
qdel(src)//to prevent bomb testing camera from exploding over and over forever
|
||||
|
||||
/obj/machinery/camera/ex_act(severity, target)
|
||||
if(invuln)
|
||||
@@ -291,7 +294,7 @@
|
||||
else if (stat & EMPED)
|
||||
icon_state = "[initial(icon_state)]emp"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]"
|
||||
icon_state = "[initial(icon_state)][in_use_lights ? "_in_use" : ""]"
|
||||
|
||||
/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1)
|
||||
status = !status
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
icon = 'icons/obj/machines/camera.dmi'
|
||||
icon_state = "camera1"
|
||||
max_integrity = 150
|
||||
// Motion, EMP-Proof, X-Ray
|
||||
// Motion, EMP-Proof, X-ray
|
||||
var/static/list/possible_upgrades = typecacheof(list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer))
|
||||
var/list/upgrades
|
||||
var/state = 1
|
||||
@@ -42,7 +42,7 @@
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
if(weld(W, user))
|
||||
to_chat(user, "<span class='notice'>You weld the assembly securely into place.</span>")
|
||||
anchored = TRUE
|
||||
setAnchored(TRUE)
|
||||
state = 2
|
||||
return
|
||||
if(2)
|
||||
@@ -62,7 +62,7 @@
|
||||
if(weld(W, user))
|
||||
to_chat(user, "<span class='notice'>You unweld the assembly from its place.</span>")
|
||||
state = 1
|
||||
anchored = TRUE
|
||||
setAnchored(TRUE)
|
||||
return
|
||||
|
||||
// Upgrades!
|
||||
@@ -80,7 +80,7 @@
|
||||
return FALSE
|
||||
var/obj/U = locate(/obj) in upgrades
|
||||
if(U)
|
||||
to_chat(user, "<span class='notice'>You unattach an upgrade from the assembly.</span>")
|
||||
to_chat(user, "<span class='notice'>You detach an upgrade from the assembly.</span>")
|
||||
tool.play_tool_sound(src)
|
||||
U.forceMove(drop_location())
|
||||
upgrades -= U
|
||||
@@ -126,7 +126,7 @@
|
||||
if(state != 1)
|
||||
return FALSE
|
||||
I.play_tool_sound(src)
|
||||
to_chat(user, "<span class='notice'>You unattach the assembly from its place.</span>")
|
||||
to_chat(user, "<span class='notice'>You detach the assembly from its place.</span>")
|
||||
new /obj/item/wallframe/camera(drop_location())
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
if(!isMotion())
|
||||
. = PROCESS_KILL
|
||||
return
|
||||
if(stat & EMPED)
|
||||
return
|
||||
if (detectTime > 0)
|
||||
var/elapsed = world.time - detectTime
|
||||
if (elapsed > alarm_delay)
|
||||
@@ -63,6 +65,7 @@
|
||||
for (var/mob/living/silicon/aiPlayer in GLOB.player_list)
|
||||
if (status)
|
||||
aiPlayer.triggerAlarm("Motion", get_area(src), list(src), src)
|
||||
visible_message("<span class='warning'>A red light flashes on the [src]!</span>")
|
||||
detectTime = -1
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
// EMP
|
||||
/obj/machinery/camera/emp_proof
|
||||
start_active = 1
|
||||
start_active = TRUE
|
||||
|
||||
/obj/machinery/camera/emp_proof/Initialize()
|
||||
. = ..()
|
||||
upgradeEmpProof()
|
||||
|
||||
// X-RAY
|
||||
// X-ray
|
||||
|
||||
/obj/machinery/camera/xray
|
||||
start_active = 1
|
||||
start_active = TRUE
|
||||
icon_state = "xraycam" // Thanks to Krutchen for the icons.
|
||||
|
||||
/obj/machinery/camera/xray/Initialize()
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
// MOTION
|
||||
/obj/machinery/camera/motion
|
||||
start_active = 1
|
||||
start_active = TRUE
|
||||
name = "motion-sensitive security camera"
|
||||
|
||||
/obj/machinery/camera/motion/Initialize()
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
// ALL UPGRADES
|
||||
/obj/machinery/camera/all
|
||||
start_active = 1
|
||||
start_active = TRUE
|
||||
|
||||
/obj/machinery/camera/all/Initialize()
|
||||
. = ..()
|
||||
@@ -75,6 +75,7 @@
|
||||
// UPGRADE PROCS
|
||||
|
||||
/obj/machinery/camera/proc/upgradeEmpProof()
|
||||
AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS)
|
||||
assembly.upgrades.Add(new /obj/item/stack/sheet/mineral/plasma(assembly))
|
||||
upgrades |= CAMERA_UPGRADE_EMP_PROOF
|
||||
|
||||
|
||||
@@ -146,10 +146,6 @@
|
||||
for (var/j = 1 to i - 1)
|
||||
a = L[j]
|
||||
b = L[j + 1]
|
||||
if (a.c_tag_order != b.c_tag_order)
|
||||
if (a.c_tag_order > b.c_tag_order)
|
||||
L.Swap(j, j + 1)
|
||||
else
|
||||
if (sorttext(a.c_tag, b.c_tag) < 0)
|
||||
L.Swap(j, j + 1)
|
||||
if (sorttext(a.c_tag, b.c_tag) < 0)
|
||||
L.Swap(j, j + 1)
|
||||
return L
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "It charges power cells."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "ccharger"
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 60
|
||||
@@ -54,7 +53,7 @@
|
||||
user.visible_message("[user] inserts a cell into [src].", "<span class='notice'>You insert a cell into [src].</span>")
|
||||
chargelevel = -1
|
||||
updateicon()
|
||||
else
|
||||
else
|
||||
if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W))
|
||||
return
|
||||
if(default_deconstruction_crowbar(W))
|
||||
@@ -105,14 +104,14 @@
|
||||
return
|
||||
|
||||
/obj/machinery/cell_charger/emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
. = ..()
|
||||
|
||||
if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_CONTENTS)
|
||||
return
|
||||
|
||||
if(charging)
|
||||
charging.emp_act(severity)
|
||||
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/cell_charger/RefreshParts()
|
||||
charge_rate = 500
|
||||
for(var/obj/item/stock_parts/capacitor/C in component_parts)
|
||||
@@ -128,4 +127,3 @@
|
||||
charging.give(charge_rate) //this is 2558, efficient batteries exist
|
||||
|
||||
updateicon()
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#define SPEAK(message) radio.talk_into(src, message, radio_channel, get_spans(), get_default_language())
|
||||
|
||||
/obj/machinery/clonepod
|
||||
anchored = TRUE
|
||||
name = "cloning pod"
|
||||
desc = "An electronically-lockable pod for growing organic tissue."
|
||||
density = TRUE
|
||||
@@ -134,7 +133,7 @@
|
||||
clonemind = locate(mindref) in SSticker.minds
|
||||
if(!istype(clonemind)) //not a mind
|
||||
return FALSE
|
||||
if(clonemind.current)
|
||||
if(!QDELETED(clonemind.current))
|
||||
if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
|
||||
return FALSE
|
||||
if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding.
|
||||
@@ -204,7 +203,8 @@
|
||||
H.faction |= factions
|
||||
|
||||
for(var/V in quirks)
|
||||
new V(H)
|
||||
var/datum/quirk/Q = new V(H)
|
||||
Q.on_clone(quirks[V])
|
||||
|
||||
H.set_cloned_appearance()
|
||||
|
||||
@@ -406,13 +406,14 @@
|
||||
go_out()
|
||||
|
||||
/obj/machinery/clonepod/emp_act(severity)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant && prob(100/(severity*efficiency)))
|
||||
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
|
||||
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
|
||||
go_out()
|
||||
mob_occupant.apply_vore_prefs()
|
||||
..()
|
||||
. = ..()
|
||||
if (!(. & EMP_PROTECT_SELF))
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant && prob(100/(severity*efficiency)))
|
||||
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
|
||||
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
|
||||
mob_occupant.apply_vore_prefs()
|
||||
go_out()
|
||||
|
||||
/obj/machinery/clonepod/ex_act(severity, target)
|
||||
..()
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "computer"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 300
|
||||
active_power_usage = 300
|
||||
@@ -95,14 +94,15 @@
|
||||
set_light(0)
|
||||
|
||||
/obj/machinery/computer/emp_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
if(prob(50))
|
||||
obj_break("energy")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
obj_break("energy")
|
||||
..()
|
||||
. = ..()
|
||||
if (!(. & EMP_PROTECT_SELF))
|
||||
switch(severity)
|
||||
if(1)
|
||||
if(prob(50))
|
||||
obj_break("energy")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
obj_break("energy")
|
||||
|
||||
/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
|
||||
on_deconstruction()
|
||||
@@ -111,7 +111,7 @@
|
||||
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
|
||||
A.dir = dir
|
||||
A.circuit = circuit
|
||||
A.anchored = TRUE
|
||||
A.setAnchored(TRUE)
|
||||
if(stat & BROKEN)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>The broken glass falls out.</span>")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/machinery/computer/aifixer
|
||||
name = "\improper AI system integrity restorer"
|
||||
desc = "Used with intelliCards containing nonfunctioning AIs to restore them to working order."
|
||||
desc = "Used with intelliCards containing nonfunctional AIs to restore them to working order."
|
||||
req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_HEADS)
|
||||
var/mob/living/silicon/ai/occupier = null
|
||||
var/active = 0
|
||||
|
||||
@@ -122,12 +122,12 @@
|
||||
active_apc.locked = TRUE
|
||||
active_apc.update_icon()
|
||||
active_apc = null
|
||||
to_chat(usr, "<span class='robot notice'>[icon2html(src, usr)] Connected to APC in [APC.area]. Interface request sent.</span>")
|
||||
log_activity("remotely accessed APC in [APC.area]")
|
||||
to_chat(usr, "<span class='robot notice'>[icon2html(src, usr)] Connected to APC in [get_area_name(APC.area, TRUE)]. Interface request sent.</span>")
|
||||
log_activity("remotely accessed APC in [get_area_name(APC.area, TRUE)]")
|
||||
APC.ui_interact(usr, state = GLOB.not_incapacitated_state)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
message_admins("[key_name_admin(usr)] remotely accessed [APC] from [src] at [get_area(src)].")
|
||||
log_game("[key_name(usr)] remotely accessed [APC] from [src] at [get_area(src)].")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] remotely accessed [APC] from [src] at [AREACOORD(src)].")
|
||||
log_game("[key_name(usr)] remotely accessed [APC] from [src] at [AREACOORD(src)].")
|
||||
if(APC.locked)
|
||||
APC.say("Remote access detected. Interface unlocked.")
|
||||
playsound(APC, 'sound/machines/boltsup.ogg', 25, 0)
|
||||
@@ -137,7 +137,7 @@
|
||||
active_apc = APC
|
||||
if(href_list["name_filter"])
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
var/new_filter = stripped_input(usr, "What name are you looking for?", name) as null|text
|
||||
var/new_filter = stripped_input(usr, "What name are you looking for?", name)
|
||||
if(!src || !usr || !usr.canUseTopic(src) || stat || QDELETED(src))
|
||||
return
|
||||
log_activity("changed name filter to \"[new_filter]\"")
|
||||
@@ -188,7 +188,7 @@
|
||||
log_activity("logged in")
|
||||
else if(!(obj_flags & EMAGGED))
|
||||
user.visible_message("<span class='warning'>You emag [src], disabling precise logging and allowing you to clear logs.</span>")
|
||||
log_game("[key_name(user)] emagged [src] at [get_area(src)], disabling operator tracking.")
|
||||
log_game("[key_name(user)] emagged [src] at [AREACOORD(src)], disabling operator tracking.")
|
||||
obj_flags |= EMAGGED
|
||||
playsound(src, "sparks", 50, 1)
|
||||
|
||||
|
||||
@@ -51,7 +51,9 @@
|
||||
/obj/item/hot_potato/harmless/toy = 1,
|
||||
/obj/item/card/emagfake = 1,
|
||||
/obj/item/clothing/shoes/wheelys = 2,
|
||||
/obj/item/clothing/shoes/kindleKicks = 2)
|
||||
/obj/item/clothing/shoes/kindleKicks = 2,
|
||||
/obj/item/storage/belt/military/snack = 2
|
||||
)
|
||||
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
|
||||
@@ -70,7 +72,7 @@
|
||||
Reset()
|
||||
|
||||
/obj/machinery/computer/arcade/proc/prizevend(mob/user)
|
||||
user.SendSignal(COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
|
||||
if(prob(0.0001)) //1 in a million
|
||||
new /obj/item/gun/energy/pulse/prize(src)
|
||||
SSmedals.UnlockMedal(MEDAL_PULSE, usr.client)
|
||||
@@ -85,9 +87,9 @@
|
||||
prize.forceMove(get_turf(src))
|
||||
|
||||
/obj/machinery/computer/arcade/emp_act(severity)
|
||||
..(severity)
|
||||
. = ..()
|
||||
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
var/empprize = null
|
||||
@@ -111,7 +113,7 @@
|
||||
desc = "Does not support Pinball."
|
||||
icon_state = "arcade"
|
||||
circuit = /obj/item/circuitboard/computer/arcade/battle
|
||||
var/enemy_name = "Space Villian"
|
||||
var/enemy_name = "Space Villain"
|
||||
var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc
|
||||
var/player_hp = 30 //Player health/attack points
|
||||
var/player_mp = 10
|
||||
@@ -150,7 +152,7 @@
|
||||
dat += "<a href='byond://?src=[REF(src)];charge=1'>Recharge Power</a>"
|
||||
|
||||
dat += "</b></center>"
|
||||
var/datum/browser/popup = new(user, "arcade", "Space Villian 2000")
|
||||
var/datum/browser/popup = new(user, "arcade", "Space Villain 2000")
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
|
||||
popup.open()
|
||||
@@ -233,7 +235,7 @@
|
||||
if(obj_flags & EMAGGED)
|
||||
new /obj/effect/spawner/newbomb/timer/syndicate(loc)
|
||||
new /obj/item/clothing/head/collectable/petehat(loc)
|
||||
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] has outbombed Cuban Pete and been awarded a bomb.")
|
||||
log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.")
|
||||
Reset()
|
||||
obj_flags &= ~EMAGGED
|
||||
@@ -1028,7 +1030,7 @@
|
||||
say("Congratulations, you made it to Orion!")
|
||||
if(obj_flags & EMAGGED)
|
||||
new /obj/item/orion_ship(loc)
|
||||
message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
|
||||
log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
|
||||
else
|
||||
prizevend(user)
|
||||
@@ -1073,8 +1075,8 @@
|
||||
if(active)
|
||||
return
|
||||
|
||||
message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.")
|
||||
log_game("[key_name(usr)] primed an explosive Orion ship for detonation.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] primed an explosive Orion ship for detonation at [AREACOORD(usr)].")
|
||||
log_game("[key_name(usr)] primed an explosive Orion ship for detonation at [AREACOORD(usr)].")
|
||||
|
||||
to_chat(user, "<span class='warning'>You flip the switch on the underside of [src].</span>")
|
||||
active = 1
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
name = "gas sensor"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "gsensor1"
|
||||
anchored = TRUE
|
||||
|
||||
var/on = TRUE
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
to_chat(user, "<span class='notice'>You start wrenching the frame into place...</span>")
|
||||
if(P.use_tool(src, user, 20, volume=50))
|
||||
to_chat(user, "<span class='notice'>You wrench the frame into place.</span>")
|
||||
anchored = TRUE
|
||||
setAnchored(TRUE)
|
||||
state = 1
|
||||
return
|
||||
if(istype(P, /obj/item/weldingtool))
|
||||
@@ -30,7 +30,7 @@
|
||||
to_chat(user, "<span class='notice'>You start to unfasten the frame...</span>")
|
||||
if(P.use_tool(src, user, 20, volume=50))
|
||||
to_chat(user, "<span class='notice'>You unfasten the frame.</span>")
|
||||
anchored = FALSE
|
||||
setAnchored(FALSE)
|
||||
state = 0
|
||||
return
|
||||
if(istype(P, /obj/item/circuitboard/computer) && !circuit)
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
circuit = /obj/item/circuitboard/computer/security
|
||||
var/last_pic = 1
|
||||
var/list/network = list("ss13")
|
||||
var/mapping = 0//For the overview file, interesting bit of code.
|
||||
var/list/watchers = list() //who's using the console, associated with the camera they're on.
|
||||
|
||||
light_color = LIGHT_COLOR_RED
|
||||
@@ -133,7 +132,7 @@
|
||||
/obj/machinery/computer/security/proc/get_available_cameras()
|
||||
var/list/L = list()
|
||||
for (var/obj/machinery/camera/C in GLOB.cameranet.cameras)
|
||||
if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only recieve feed from same z_level cameras
|
||||
if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras
|
||||
continue
|
||||
L.Add(C)
|
||||
|
||||
@@ -153,6 +152,50 @@
|
||||
D["[C.c_tag][(C.status ? null : " (Deactivated)")]"] = C
|
||||
return D
|
||||
|
||||
// SECURITY MONITORS
|
||||
|
||||
/obj/machinery/computer/security/wooden_tv
|
||||
name = "security camera monitor"
|
||||
desc = "An old TV hooked into the station's camera network."
|
||||
icon_state = "television"
|
||||
icon_keyboard = null
|
||||
icon_screen = "detective_tv"
|
||||
clockwork = TRUE //it'd look weird
|
||||
|
||||
/obj/machinery/computer/security/mining
|
||||
name = "outpost camera console"
|
||||
desc = "Used to access the various cameras on the outpost."
|
||||
icon_screen = "mining"
|
||||
icon_keyboard = "mining_key"
|
||||
network = list("mine", "auxbase")
|
||||
circuit = /obj/item/circuitboard/computer/mining
|
||||
|
||||
/obj/machinery/computer/security/research
|
||||
name = "research camera console"
|
||||
desc = "Used to access the various cameras in science."
|
||||
network = list("rd")
|
||||
circuit = /obj/item/circuitboard/computer/research
|
||||
|
||||
/obj/machinery/computer/security/hos
|
||||
name = "Head of Security's camera console"
|
||||
desc = "A custom security console with added access to the labor camp network."
|
||||
network = list("ss13", "labor")
|
||||
circuit = null
|
||||
|
||||
/obj/machinery/computer/security/labor
|
||||
name = "labor camp monitoring"
|
||||
desc = "Used to access the various cameras on the labor camp."
|
||||
network = list("labor")
|
||||
circuit = null
|
||||
|
||||
/obj/machinery/computer/security/qm
|
||||
name = "Quartermaster's camera console"
|
||||
desc = "A console with access to the mining, auxillary base and vault camera networks."
|
||||
network = list("mine", "auxbase", "vault")
|
||||
circuit = null
|
||||
|
||||
// TELESCREENS
|
||||
|
||||
/obj/machinery/computer/security/telescreen
|
||||
name = "\improper Telescreen"
|
||||
desc = "Used for watching an empty arena."
|
||||
@@ -162,7 +205,6 @@
|
||||
density = FALSE
|
||||
circuit = null
|
||||
clockwork = TRUE //it'd look very weird
|
||||
|
||||
light_power = 0
|
||||
|
||||
/obj/machinery/computer/security/telescreen/update_icon()
|
||||
@@ -177,28 +219,68 @@
|
||||
icon = 'icons/obj/status_display.dmi'
|
||||
icon_state = "entertainment"
|
||||
network = list("thunder")
|
||||
density = FALSE
|
||||
circuit = null
|
||||
|
||||
/obj/machinery/computer/security/wooden_tv
|
||||
name = "security camera monitor"
|
||||
desc = "An old TV hooked into the stations camera network."
|
||||
icon_state = "television"
|
||||
icon_keyboard = null
|
||||
icon_screen = "detective_tv"
|
||||
clockwork = TRUE //it'd look weird
|
||||
/obj/machinery/computer/security/telescreen/rd
|
||||
name = "Research Director's telescreen"
|
||||
desc = "Used for watching the AI and the RD's goons from the safety of his office."
|
||||
network = list("rd", "aicore", "aiupload", "minisat", "xeno", "test")
|
||||
|
||||
|
||||
/obj/machinery/computer/security/mining
|
||||
name = "outpost camera console"
|
||||
desc = "Used to access the various cameras on the outpost."
|
||||
icon_screen = "mining"
|
||||
icon_keyboard = "mining_key"
|
||||
network = list("mine")
|
||||
circuit = /obj/item/circuitboard/computer/mining
|
||||
|
||||
/obj/machinery/computer/security/research
|
||||
name = "research camera console"
|
||||
desc = "Used to access the various cameras in science."
|
||||
/obj/machinery/computer/security/telescreen/circuitry
|
||||
name = "circuitry telescreen"
|
||||
desc = "Used for watching the other eggheads from the safety of the circuitry lab."
|
||||
network = list("rd")
|
||||
circuit = /obj/item/circuitboard/computer/research
|
||||
|
||||
/obj/machinery/computer/security/telescreen/ce
|
||||
name = "Chief Engineer's telescreen"
|
||||
desc = "Used for watching the engine, telecommunications and the minisat."
|
||||
network = list("engine", "singularity", "tcomms", "minisat")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/cmo
|
||||
name = "Chief Medical Officer's telescreen"
|
||||
desc = "A telescreen with access to the medbay's camera network."
|
||||
network = list("medbay")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/vault
|
||||
name = "Vault monitor"
|
||||
desc = "A telescreen that connects to the vault's camera network."
|
||||
network = list("vault")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/toxins
|
||||
name = "Bomb test site monitor"
|
||||
desc = "A telescreen that connects to the bomb test site's camera."
|
||||
network = list("toxin")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/engine
|
||||
name = "engine monitor"
|
||||
desc = "A telescreen that connects to the engine's camera network."
|
||||
network = list("engine")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/turbine
|
||||
name = "turbine monitor"
|
||||
desc = "A telescreen that connects to the turbine's camera."
|
||||
network = list("turbine")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/interrogation
|
||||
name = "interrogation room monitor"
|
||||
desc = "A telescreen that connects to the interrogation room's camera."
|
||||
network = list("interrogation")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/prison
|
||||
name = "prison monitor"
|
||||
desc = "A telescreen that connects to the permabrig's camera network."
|
||||
network = list("prison")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/auxbase
|
||||
name = "auxillary base monitor"
|
||||
desc = "A telescreen that connects to the auxillary base's camera."
|
||||
network = list("auxbase")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/minisat
|
||||
name = "minisat monitor"
|
||||
desc = "A telescreen that connects to the minisat's camera network."
|
||||
network = list("minisat")
|
||||
|
||||
/obj/machinery/computer/security/telescreen/aiupload
|
||||
name = "AI upload monitor"
|
||||
desc = "A telescreen that connects to the AI upload's camera network."
|
||||
network = list("aiupload")
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
|
||||
/mob/camera/aiEye/remote/update_remote_sight(mob/living/user)
|
||||
user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras
|
||||
user.sight = 0
|
||||
user.sight = SEE_TURFS | SEE_BLACKNESS
|
||||
user.see_in_dark = 2
|
||||
return 1
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
else
|
||||
moveToNullspace()
|
||||
if(use_static)
|
||||
GLOB.cameranet.visibility(src)
|
||||
GLOB.cameranet.visibility(src, GetViewerClient())
|
||||
if(visible_icon)
|
||||
if(eye_user.client)
|
||||
eye_user.client.images -= user_image
|
||||
|
||||
@@ -348,6 +348,12 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
|
||||
/obj/machinery/computer/card/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(!usr.canUseTopic(src, !issilicon(usr)) || !is_operational())
|
||||
usr.unset_machine()
|
||||
usr << browse(null, "window=id_com")
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
switch(href_list["choice"])
|
||||
if ("modify")
|
||||
@@ -532,11 +538,12 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/computer/card/AltClick(mob/user)
|
||||
if(user.canUseTopic(src))
|
||||
if(scan)
|
||||
eject_id_scan(user)
|
||||
if(modify)
|
||||
eject_id_modify(user)
|
||||
if(!user.canUseTopic(src, !issilicon(user)) || !is_operational())
|
||||
return
|
||||
if(scan)
|
||||
eject_id_scan(user)
|
||||
if(modify)
|
||||
eject_id_modify(user)
|
||||
|
||||
/obj/machinery/computer/card/proc/eject_id_scan(mob/user)
|
||||
if(scan)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define AUTOCLONING_MINIMAL_LEVEL 3
|
||||
|
||||
/obj/machinery/computer/cloning
|
||||
name = "cloning console"
|
||||
desc = "Used to clone people and manage DNA."
|
||||
@@ -79,6 +81,10 @@
|
||||
src.scanner = findscanner()
|
||||
if(findfirstcloner && !LAZYLEN(pods))
|
||||
findcloner()
|
||||
if(!autoprocess)
|
||||
STOP_PROCESSING(SSmachines, src)
|
||||
else
|
||||
START_PROCESSING(SSmachines, src)
|
||||
|
||||
/obj/machinery/computer/cloning/proc/findscanner()
|
||||
var/obj/machinery/dna_scannernew/scannerf = null
|
||||
@@ -151,7 +157,7 @@
|
||||
var/dat = ""
|
||||
dat += "<a href='byond://?src=[REF(src)];refresh=1'>Refresh</a>"
|
||||
|
||||
if(scanner && HasEfficientPod() && scanner.scan_level > 2)
|
||||
if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
|
||||
if(!autoprocess)
|
||||
dat += "<a href='byond://?src=[REF(src)];task=autoprocess'>Autoprocess</a>"
|
||||
else
|
||||
@@ -276,10 +282,13 @@
|
||||
if(href_list["task"])
|
||||
switch(href_list["task"])
|
||||
if("autoprocess")
|
||||
autoprocess = 1
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
|
||||
autoprocess = TRUE
|
||||
START_PROCESSING(SSmachines, src)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
if("stopautoprocess")
|
||||
autoprocess = 0
|
||||
autoprocess = FALSE
|
||||
STOP_PROCESSING(SSmachines, src)
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
|
||||
else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational())
|
||||
@@ -476,7 +485,7 @@
|
||||
R.fields["quirks"] = list()
|
||||
for(var/V in mob_occupant.roundstart_quirks)
|
||||
var/datum/quirk/T = V
|
||||
R.fields["quirks"] += T.type
|
||||
R.fields["quirks"][T.type] = T.clone_data()
|
||||
|
||||
if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning.
|
||||
R.fields["mind"] = "[REF(mob_occupant.mind)]"
|
||||
|
||||
@@ -45,19 +45,18 @@
|
||||
|
||||
/obj/machinery/computer/communications/process()
|
||||
if(..())
|
||||
if(state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE)
|
||||
updateDialog()
|
||||
var/ai_autoupdate = aistate != STATE_STATUSDISPLAY && aistate != STATE_CALLSHUTTLE && aistate != STATE_PURCHASE && aistate != STATE_VIEWMESSAGE
|
||||
var/machine_user_autoupdate = state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE
|
||||
updateDialog(machine_user_autoupdate,ai_autoupdate)
|
||||
|
||||
/obj/machinery/computer/communications/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if(!is_station_level(z) && !is_centcom_level(z)) //Can only use on centcom and SS13
|
||||
if(!is_station_level(z) && !is_reserved_level(z)) //Can only use in transit and on SS13
|
||||
to_chat(usr, "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!")
|
||||
return
|
||||
usr.set_machine(src)
|
||||
|
||||
var/area/A = get_area(usr)
|
||||
var/area_name = A.name
|
||||
|
||||
if(!href_list["operation"])
|
||||
return
|
||||
@@ -84,7 +83,7 @@
|
||||
if(obj_flags & EMAGGED)
|
||||
authenticated = 2
|
||||
auth_id = "Unknown"
|
||||
to_chat(M, "<span class='warning'>[src] lets out a quiet alarm as its login is overriden.</span>")
|
||||
to_chat(M, "<span class='warning'>[src] lets out a quiet alarm as its login is overridden.</span>")
|
||||
playsound(src, 'sound/machines/terminal_on.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0)
|
||||
if(prob(25))
|
||||
@@ -115,9 +114,9 @@
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
//Only notify people if an actual change happened
|
||||
var/security_level = get_security_level()
|
||||
log_game("[key_name(usr)] has changed the security level to [security_level].")
|
||||
message_admins("[key_name_admin(usr)] has changed the security level to [security_level].")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has changed the security level to [security_level] at <span class='name'>[area_name]</span>.</span>", usr)
|
||||
log_game("[key_name(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has changed the security level to [security_level] with [src] at <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", usr)
|
||||
tmp_alertlevel = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You are not authorized to do this!</span>")
|
||||
@@ -146,7 +145,7 @@
|
||||
send2otherserver("[station_name()]", input,"Comms_Console")
|
||||
minor_announce(input, title = "Outgoing message to allied station")
|
||||
log_talk(usr,"[key_name(usr)] has sent a message to the other server: [input]",LOGSAY)
|
||||
message_admins("[key_name_admin(usr)] has sent a message to the other server.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server.")
|
||||
deadchat_broadcast("<span class='deadsay bold'>[usr.real_name] has sent an outgoing message to the other station(s).</span>", usr)
|
||||
CM.lastTimeUsed = world.time
|
||||
|
||||
@@ -176,7 +175,7 @@
|
||||
M.action_load(S)
|
||||
SSshuttle.points -= S.credit_cost
|
||||
minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
|
||||
message_admins("[key_name_admin(usr)] purchased [S.name].")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].")
|
||||
SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]")
|
||||
else
|
||||
to_chat(usr, "Something went wrong! The shuttle exchange system seems to be down.")
|
||||
@@ -249,14 +248,14 @@
|
||||
if("enableemergency")
|
||||
make_maint_all_access()
|
||||
log_game("[key_name(usr)] enabled emergency maintenance access.")
|
||||
message_admins("[key_name_admin(usr)] enabled emergency maintenance access.")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> enabled emergency maintenance access at <span class='name'>[area_name]</span>.</span>", usr)
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> enabled emergency maintenance access at <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", usr)
|
||||
state = STATE_DEFAULT
|
||||
if("disableemergency")
|
||||
revoke_maint_all_access()
|
||||
log_game("[key_name(usr)] disabled emergency maintenance access.")
|
||||
message_admins("[key_name_admin(usr)] disabled emergency maintenance access.")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> disabled emergency maintenance access at <span class='name'>[area_name]</span>.</span>", usr)
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> disabled emergency maintenance access at <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", usr)
|
||||
state = STATE_DEFAULT
|
||||
|
||||
// Status display stuff
|
||||
@@ -290,7 +289,7 @@
|
||||
CentCom_announce(input, usr)
|
||||
to_chat(usr, "<span class='notice'>Message transmitted to Central Command.</span>")
|
||||
log_talk(usr,"[key_name(usr)] has made a CentCom announcement: [input]",LOGSAY)
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has messaged CentCom, \"[input]\" at <span class='name'>[area_name]</span>.</span>", usr)
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has messaged CentCom, \"[input]\" at <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", usr)
|
||||
CM.lastTimeUsed = world.time
|
||||
|
||||
// OMG SYNDICATE ...LETTERHEAD
|
||||
@@ -307,7 +306,7 @@
|
||||
Syndicate_announce(input, usr)
|
||||
to_chat(usr, "<span class='danger'>SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.</span>")
|
||||
log_talk(usr,"[key_name(usr)] has made a Syndicate announcement: [input]",LOGSAY)
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has messaged the Syndicate, \"[input]\" at <span class='name'>[area_name]</span>.</span>", usr)
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has messaged the Syndicate, \"[input]\" at <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", usr)
|
||||
CM.lastTimeUsed = world.time
|
||||
|
||||
if("RestoreBackup")
|
||||
@@ -388,9 +387,9 @@
|
||||
if(GLOB.security_level != old_level)
|
||||
//Only notify people if an actual change happened
|
||||
var/security_level = get_security_level()
|
||||
log_game("[key_name(usr)] has changed the security level to [security_level].")
|
||||
message_admins("[key_name_admin(usr)] has changed the security level to [security_level].")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has changed the security level to [security_level].</span>", usr)
|
||||
log_game("[key_name(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].")
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has changed the security level to [security_level] from [src] at [get_area_name(usr, TRUE)].</span>", usr)
|
||||
tmp_alertlevel = 0
|
||||
aistate = STATE_DEFAULT
|
||||
if("ai-changeseclevel")
|
||||
@@ -400,13 +399,13 @@
|
||||
if("ai-enableemergency")
|
||||
make_maint_all_access()
|
||||
log_game("[key_name(usr)] enabled emergency maintenance access.")
|
||||
message_admins("[key_name_admin(usr)] enabled emergency maintenance access.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.")
|
||||
deadchat_broadcast("<span class='deadsay bold'>[usr.real_name] enabled emergency maintenance access.</span>", usr)
|
||||
aistate = STATE_DEFAULT
|
||||
if("ai-disableemergency")
|
||||
revoke_maint_all_access()
|
||||
log_game("[key_name(usr)] disabled emergency maintenance access.")
|
||||
message_admins("[key_name_admin(usr)] disabled emergency maintenance access.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.")
|
||||
deadchat_broadcast("<span class='deadsay bold'>[usr.real_name] disabled emergency maintenance access.</span>", usr)
|
||||
aistate = STATE_DEFAULT
|
||||
|
||||
@@ -556,6 +555,9 @@
|
||||
|
||||
if(STATE_PURCHASE)
|
||||
dat += "Budget: [SSshuttle.points] Credits.<BR>"
|
||||
dat += "<BR>"
|
||||
dat += "<b>Caution: Purchasing dangerous shuttles may lead to mutiny and/or death.</b><br>"
|
||||
dat += "<BR>"
|
||||
for(var/shuttle_id in SSmapping.shuttle_templates)
|
||||
var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id]
|
||||
if(S.can_be_bought && S.credit_cost < INFINITY)
|
||||
@@ -700,8 +702,7 @@
|
||||
if(!input || !user.canUseTopic(src))
|
||||
return
|
||||
SScommunications.make_announcement(user, is_silicon, input)
|
||||
var/area/A = get_area(user)
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[user.real_name]</span> made an priority announcement at <span class='name'>[A.name]</span>.</span>", user)
|
||||
deadchat_broadcast("<span class='deadsay'><span class='name'>[user.real_name]</span> made an priority announcement from <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", user)
|
||||
|
||||
/obj/machinery/computer/communications/proc/post_status(command, data1, data2)
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#define RADIATION_DURATION_MAX 30
|
||||
#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate
|
||||
|
||||
#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject recieves
|
||||
#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives
|
||||
|
||||
#define SCANNER_ACTION_SE 1
|
||||
#define SCANNER_ACTION_UI 2
|
||||
@@ -33,7 +33,6 @@
|
||||
var/obj/machinery/dna_scannernew/connected = null
|
||||
var/obj/item/disk/data/diskette = null
|
||||
var/list/delayed_action = null
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 400
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
id_goal_not_set = TRUE
|
||||
id.goal = default_goal
|
||||
say("[id]'s ID card goal defaulting to [id.goal] points.")
|
||||
log_game("[user]([user.ckey] teleported [prisoner]([prisoner.ckey]) to the Labor Camp ([beacon.x], [beacon.y], [beacon.z]) for [id_goal_not_set ? "default goal of ":""][id.goal] points.")
|
||||
log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][id.goal] points.")
|
||||
teleporter.handle_prisoner(id, temporary_record)
|
||||
playsound(src, 'sound/weapons/emitter.ogg', 50, 1)
|
||||
prisoner.forceMove(get_turf(beacon))
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
pad.x_offset = 0
|
||||
|
||||
if(href_list["change_name"])
|
||||
var/new_name = stripped_input(usr, "What do you wish to name the launchpad?", "Launchpad", pad.display_name, 15) as text|null
|
||||
var/new_name = stripped_input(usr, "What do you wish to name the launchpad?", "Launchpad", pad.display_name, 15)
|
||||
if(!new_name)
|
||||
return
|
||||
pad.display_name = new_name
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
src.temp = "Are you sure you wish to delete all records?<br>\n\t<A href='?src=[REF(src)];temp=1;del_all2=1'>Yes</A><br>\n\t<A href='?src=[REF(src)];temp=1'>No</A><br>"
|
||||
|
||||
else if(href_list["del_all2"])
|
||||
investigate_log("[usr.name] ([usr.key]) has deleted all medical records.", INVESTIGATE_RECORDS)
|
||||
investigate_log("[key_name(usr)] has deleted all medical records.", INVESTIGATE_RECORDS)
|
||||
GLOB.data_core.medical.Cut()
|
||||
src.temp = "All records deleted."
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
src.active2.fields["mi_dis_d"] = t1
|
||||
if("ma_dis")
|
||||
if(active2)
|
||||
var/t1 = stripped_input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null)
|
||||
var/t1 = stripped_input("Please input major disabilities list:", "Med. records", src.active2.fields["ma_dis"], null)
|
||||
if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
|
||||
return
|
||||
src.active2.fields["ma_dis"] = t1
|
||||
@@ -449,7 +449,7 @@
|
||||
src.temp = "Are you sure you wish to delete the record (Medical Portion Only)?<br>\n\t<A href='?src=[REF(src)];temp=1;del_r2=1'>Yes</A><br>\n\t<A href='?src=[REF(src)];temp=1'>No</A><br>"
|
||||
|
||||
else if(href_list["del_r2"])
|
||||
investigate_log("[usr.name] ([usr.key]) has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
|
||||
investigate_log("[key_name(usr)] has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
|
||||
if(active2)
|
||||
qdel(active2)
|
||||
active2 = null
|
||||
@@ -553,7 +553,8 @@
|
||||
return
|
||||
|
||||
/obj/machinery/computer/med_data/emp_act(severity)
|
||||
if(!(stat & (BROKEN|NOPOWER)))
|
||||
. = ..()
|
||||
if(!(stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF))
|
||||
for(var/datum/data/record/R in GLOB.data_core.medical)
|
||||
if(prob(10/severity))
|
||||
switch(rand(1,6))
|
||||
@@ -577,7 +578,6 @@
|
||||
else if(prob(1))
|
||||
qdel(R)
|
||||
continue
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/med_data/proc/canUseMedicalRecordsConsole(mob/user, message = 1, record1, record2)
|
||||
if(user)
|
||||
|
||||
@@ -130,4 +130,4 @@
|
||||
|
||||
/obj/machinery/computer/pod/old/swf
|
||||
name = "\improper Magix System IV"
|
||||
desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition."
|
||||
desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorcerer's Edition."
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
|
||||
if(choice == "Confirm" && can_control(usr, R) && !..())
|
||||
var/turf/T = get_turf(R)
|
||||
message_admins("<span class='notice'>[ADMIN_LOOKUPFLW(usr)] detonated [key_name(R, R.client)][ADMIN_JMP(T)]!</span>")
|
||||
message_admins("<span class='notice'>[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(R, R.client)] at [ADMIN_VERBOSEJMP(T)]!</span>")
|
||||
log_game("\<span class='notice'>[key_name(usr)] detonated [key_name(R)]!</span>")
|
||||
if(R.connected_ai)
|
||||
to_chat(R.connected_ai, "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>")
|
||||
@@ -133,16 +133,16 @@
|
||||
if((istype(S) && S.hack_software) || IsAdminGhost(usr))
|
||||
var/mob/living/silicon/robot/R = locate(href_list["magbot"]) in GLOB.silicon_mobs
|
||||
if(istype(R) && !R.emagged && (R.connected_ai == usr || IsAdminGhost(usr)) && !R.scrambledcodes && can_control(usr, R))
|
||||
log_game("[key_name(usr)] emagged [R.name] using robotic console!")
|
||||
message_admins("[key_name_admin(usr)] emagged cyborg [key_name_admin(R)] using robotic console!")
|
||||
log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] emagged cyborg [key_name_admin(R)] using robotic console!")
|
||||
R.SetEmagged(1)
|
||||
|
||||
else if(href_list["convert"])
|
||||
if(isAI(usr) && is_servant_of_ratvar(usr))
|
||||
var/mob/living/silicon/robot/R = locate(href_list["convert"]) in GLOB.silicon_mobs
|
||||
if(istype(R) && !is_servant_of_ratvar(R) && R.connected_ai == usr)
|
||||
log_game("[key_name(usr)] converted [R.name] using robotic console!")
|
||||
message_admins("[key_name_admin(usr)] converted cyborg [key_name_admin(R)] using robotic console!")
|
||||
log_game("[key_name(usr)] converted [key_name(R)] using robotic console!")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] converted cyborg [key_name_admin(R)] using robotic console!")
|
||||
add_servant_of_ratvar(R)
|
||||
|
||||
else if (href_list["killdrone"])
|
||||
@@ -152,7 +152,7 @@
|
||||
to_chat(usr, "<span class='danger'>ERROR: [D] is not responding to external commands.</span>")
|
||||
else
|
||||
var/turf/T = get_turf(D)
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(D)][ADMIN_JMP(T)]!")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(D)] at [ADMIN_VERBOSEJMP(T)]!")
|
||||
log_game("[key_name(usr)] detonated [key_name(D)]!")
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, D)
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
background = "'background-color:#990000;'"
|
||||
if("Incarcerated")
|
||||
background = "'background-color:#CD6500;'"
|
||||
if("Parolled")
|
||||
if("Paroled")
|
||||
background = "'background-color:#CD6500;'"
|
||||
if("Discharged")
|
||||
background = "'background-color:#006699;'"
|
||||
@@ -457,7 +457,7 @@ What a mess.*/
|
||||
temp += "<a href='?src=[REF(src)];choice=Clear Screen'>No</a>"
|
||||
|
||||
if("Purge All Records")
|
||||
investigate_log("[usr.name] ([usr.key]) has purged all the security records.", INVESTIGATE_RECORDS)
|
||||
investigate_log("[key_name(usr)] has purged all the security records.", INVESTIGATE_RECORDS)
|
||||
for(var/datum/data/record/R in GLOB.data_core.security)
|
||||
qdel(R)
|
||||
GLOB.data_core.security.Cut()
|
||||
@@ -653,6 +653,7 @@ What a mess.*/
|
||||
return
|
||||
var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, station_time_timestamp())
|
||||
GLOB.data_core.addMinorCrime(active1.fields["id"], crime)
|
||||
investigate_log("New Minor Crime: <strong>[t1]</strong>: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS)
|
||||
if("mi_crim_delete")
|
||||
if(istype(active1, /datum/data/record))
|
||||
if(href_list["cdataid"])
|
||||
@@ -667,6 +668,7 @@ What a mess.*/
|
||||
return
|
||||
var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, station_time_timestamp())
|
||||
GLOB.data_core.addMajorCrime(active1.fields["id"], crime)
|
||||
investigate_log("New Major Crime: <strong>[t1]</strong>: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS)
|
||||
if("ma_crim_delete")
|
||||
if(istype(active1, /datum/data/record))
|
||||
if(href_list["cdataid"])
|
||||
@@ -686,7 +688,7 @@ What a mess.*/
|
||||
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=none'>None</a></li>"
|
||||
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=arrest'>*Arrest*</a></li>"
|
||||
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=incarcerated'>Incarcerated</a></li>"
|
||||
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=parolled'>Parolled</a></li>"
|
||||
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=paroled'>Paroled</a></li>"
|
||||
temp += "<li><a href='?src=[REF(src)];choice=Change Criminal Status;criminal2=released'>Discharged</a></li>"
|
||||
temp += "</ul>"
|
||||
if("rank")
|
||||
@@ -720,22 +722,22 @@ What a mess.*/
|
||||
active2.fields["criminal"] = "*Arrest*"
|
||||
if("incarcerated")
|
||||
active2.fields["criminal"] = "Incarcerated"
|
||||
if("parolled")
|
||||
active2.fields["criminal"] = "Parolled"
|
||||
if("paroled")
|
||||
active2.fields["criminal"] = "Paroled"
|
||||
if("released")
|
||||
active2.fields["criminal"] = "Discharged"
|
||||
investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [usr.name] ([usr.key]).", INVESTIGATE_RECORDS)
|
||||
investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [key_name(usr)].", INVESTIGATE_RECORDS)
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
|
||||
H.sec_hud_set_security_status()
|
||||
if("Delete Record (Security) Execute")
|
||||
investigate_log("[usr.name] ([usr.key]) has deleted the security records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
|
||||
investigate_log("[key_name(usr)] has deleted the security records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
|
||||
if(active2)
|
||||
qdel(active2)
|
||||
active2 = null
|
||||
|
||||
if("Delete Record (ALL) Execute")
|
||||
if(active1)
|
||||
investigate_log("[usr.name] ([usr.key]) has deleted all records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
|
||||
investigate_log("[key_name(usr)] has deleted all records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
|
||||
for(var/datum/data/record/R in GLOB.data_core.medical)
|
||||
if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
|
||||
qdel(R)
|
||||
@@ -783,8 +785,9 @@ What a mess.*/
|
||||
printing = FALSE
|
||||
|
||||
/obj/machinery/computer/secure_data/emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
..(severity)
|
||||
. = ..()
|
||||
|
||||
if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
for(var/datum/data/record/R in GLOB.data_core.security)
|
||||
@@ -800,7 +803,7 @@ What a mess.*/
|
||||
if(3)
|
||||
R.fields["age"] = rand(5, 85)
|
||||
if(4)
|
||||
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged")
|
||||
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged")
|
||||
if(5)
|
||||
R.fields["p_stat"] = pick("*Unconscious*", "Active", "Physically Unfit")
|
||||
if(6)
|
||||
@@ -817,8 +820,6 @@ What a mess.*/
|
||||
qdel(R)
|
||||
continue
|
||||
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2)
|
||||
if(user)
|
||||
if(authenticated)
|
||||
|
||||
@@ -5,13 +5,11 @@
|
||||
icon_keyboard = "teleport_key"
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
circuit = /obj/item/circuitboard/computer/teleporter
|
||||
var/obj/item/gps/locked
|
||||
var/regime_set = "Teleporter"
|
||||
var/id
|
||||
var/obj/machinery/teleport/station/power_station
|
||||
var/calibrating
|
||||
var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.)
|
||||
//Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location.
|
||||
var/turf/target
|
||||
|
||||
/obj/machinery/computer/teleporter/Initialize()
|
||||
. = ..()
|
||||
@@ -33,18 +31,6 @@
|
||||
break
|
||||
return power_station
|
||||
|
||||
/obj/machinery/computer/teleporter/attackby(obj/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/gps))
|
||||
var/obj/item/gps/L = I
|
||||
if(L.locked_location && !(stat & (NOPOWER|BROKEN)))
|
||||
if(!user.transferItemToLoc(L, src))
|
||||
to_chat(user, "<span class='warning'>\the [I] is stuck to your hand, you cannot put it in \the [src]!</span>")
|
||||
return
|
||||
locked = L
|
||||
to_chat(user, "<span class='caution'>You insert the GPS device into the [name]'s slot.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/teleporter/ui_interact(mob/user)
|
||||
. = ..()
|
||||
var/data = "<h3>Teleporter Status</h3>"
|
||||
@@ -65,12 +51,6 @@
|
||||
|
||||
data += "<A href='?src=[REF(src)];regimeset=1'>Change regime</A><BR>"
|
||||
data += "<A href='?src=[REF(src)];settarget=1'>Set target</A><BR>"
|
||||
if(locked)
|
||||
data += "<BR><A href='?src=[REF(src)];locked=1'>Get target from memory</A><BR>"
|
||||
data += "<A href='?src=[REF(src)];eject=1'>Eject GPS device</A><BR>"
|
||||
else
|
||||
data += "<BR><span class='linkOff'>Get target from memory</span><BR>"
|
||||
data += "<span class='linkOff'>Eject GPS device</span><BR>"
|
||||
|
||||
data += "<BR><A href='?src=[REF(src)];calibrate=1'>Calibrate Hub</A>"
|
||||
|
||||
@@ -82,11 +62,6 @@
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["eject"])
|
||||
eject()
|
||||
updateDialog()
|
||||
return
|
||||
|
||||
if(!check_hub_connection())
|
||||
say("Error: Unable to detect hub.")
|
||||
return
|
||||
@@ -104,11 +79,6 @@
|
||||
power_station.teleporter_hub.update_icon()
|
||||
power_station.teleporter_hub.calibrated = 0
|
||||
set_target(usr)
|
||||
if(href_list["locked"])
|
||||
power_station.engaged = 0
|
||||
power_station.teleporter_hub.update_icon()
|
||||
power_station.teleporter_hub.calibrated = 0
|
||||
target = get_turf(locked.locked_location)
|
||||
if(href_list["calibrate"])
|
||||
if(!target)
|
||||
say("Error: No target set to calibrate to.")
|
||||
@@ -144,11 +114,6 @@
|
||||
else
|
||||
regime_set = "Teleporter"
|
||||
|
||||
/obj/machinery/computer/teleporter/proc/eject()
|
||||
if(locked)
|
||||
locked.forceMove(get_turf(src))
|
||||
locked = null
|
||||
|
||||
/obj/machinery/computer/teleporter/proc/set_target(mob/user)
|
||||
var/list/L = list()
|
||||
var/list/areaindex = list()
|
||||
@@ -171,6 +136,8 @@
|
||||
|
||||
var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L
|
||||
target = L[desc]
|
||||
var/turf/T = get_turf(target)
|
||||
log_game("[key_name(user)] has set the teleporter target to [target] at [AREACOORD(T)]")
|
||||
|
||||
else
|
||||
var/list/S = power_station.linked_stations
|
||||
@@ -185,6 +152,8 @@
|
||||
var/obj/machinery/teleport/station/target_station = L[desc]
|
||||
if(!target_station || !target_station.teleporter_hub)
|
||||
return
|
||||
var/turf/T = get_turf(target_station)
|
||||
log_game("[key_name(user)] has set the teleporter target to [target_station] at [AREACOORD(T)]")
|
||||
target = target_station.teleporter_hub
|
||||
target_station.linked_stations |= power_station
|
||||
target_station.stat &= ~NOPOWER
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
if(P.use_tool(src, user, 40, volume=75))
|
||||
if(state == 1)
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
anchored = !anchored
|
||||
setAnchored(!anchored)
|
||||
return
|
||||
|
||||
if(2)
|
||||
@@ -114,7 +114,7 @@
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
if(P.use_tool(src, user, 40, volume=75))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
anchored = !anchored
|
||||
setAnchored(!anchored)
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/circuitboard/machine))
|
||||
@@ -169,7 +169,7 @@
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
if(P.use_tool(src, user, 40, volume=75))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
anchored = !anchored
|
||||
setAnchored(!anchored)
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/screwdriver))
|
||||
@@ -180,8 +180,8 @@
|
||||
break
|
||||
if(component_check)
|
||||
P.play_tool_sound(src)
|
||||
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1)
|
||||
new_machine.anchored = anchored
|
||||
var/obj/machinery/new_machine = new circuit.build_path(loc, 1)
|
||||
new_machine.setAnchored(anchored)
|
||||
new_machine.on_construction()
|
||||
for(var/obj/O in new_machine.component_parts)
|
||||
qdel(O)
|
||||
@@ -219,7 +219,7 @@
|
||||
req_components[path] -= used_amt
|
||||
else
|
||||
added_components[part] = path
|
||||
if(replacer.SendSignal(COMSIG_TRY_STORAGE_TAKE, part, src))
|
||||
if(SEND_SIGNAL(replacer, COMSIG_TRY_STORAGE_TAKE, part, src))
|
||||
req_components[path]--
|
||||
|
||||
for(var/obj/item/part in added_components)
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "A classic music player."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "jukebox"
|
||||
anchored = TRUE
|
||||
verb_say = "states"
|
||||
density = TRUE
|
||||
req_access = list(ACCESS_BAR)
|
||||
@@ -67,10 +66,10 @@
|
||||
if(istype(O, /obj/item/wrench))
|
||||
if(!anchored && !isinspace())
|
||||
to_chat(user,"<span class='notice'>You secure [src] to the floor.</span>")
|
||||
anchored = TRUE
|
||||
setAnchored(TRUE)
|
||||
else if(anchored)
|
||||
to_chat(user,"<span class='notice'>You unsecure and disconnect [src].</span>")
|
||||
anchored = FALSE
|
||||
setAnchored(FALSE)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
return
|
||||
return ..()
|
||||
@@ -376,10 +375,10 @@
|
||||
sleep(speed)
|
||||
for(var/i in 1 to speed)
|
||||
M.setDir(pick(GLOB.cardinals))
|
||||
// update resting manually to avoid chat spam
|
||||
for(var/mob/living/carbon/NS in rangers)
|
||||
NS.resting = !NS.resting
|
||||
NS.update_canmove()
|
||||
// update resting manually to avoid chat spam CITADEL EDIT - NO MORE RESTSPAM
|
||||
//for(var/mob/living/carbon/NS in rangers)
|
||||
// NS.resting = !NS.resting
|
||||
// NS.update_canmove()
|
||||
time--
|
||||
|
||||
/obj/machinery/jukebox/disco/proc/dance5(var/mob/living/M)
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
icon = 'icons/obj/machines/defib_mount.dmi'
|
||||
icon_state = "defibrillator_mount"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 1
|
||||
power_channel = EQUIP
|
||||
@@ -38,7 +37,7 @@
|
||||
use_power(200)
|
||||
defib.cell.give(180) //90% efficiency, slightly better than the cell charger's 87.5%
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/defibrillator_mount/update_icon()
|
||||
cut_overlays()
|
||||
if(defib)
|
||||
@@ -70,7 +69,7 @@
|
||||
if(defib)
|
||||
to_chat(user, "<span class='warning'>There's already a defibrillator in [src]!</span>")
|
||||
return
|
||||
if(I.flags_1 & NODROP_1 || !user.transferItemToLoc(I, src))
|
||||
if(I.item_flags & NODROP || !user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] hooks up [I] to [src]!</span>", \
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
icon_state = "synthesizer"
|
||||
idle_power_usage = 8 //5 with default parts
|
||||
active_power_usage = 13 //10 with default parts
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
circuit = /obj/item/circuitboard/machine/dish_drive
|
||||
var/static/list/item_types = list(/obj/item/trash/waffles,
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
icon = 'icons/obj/machines/cloning.dmi'
|
||||
icon_state = "scanner"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 300
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
limit--
|
||||
while(!FoundDoor && limit)
|
||||
if (!FoundDoor)
|
||||
log_world("### MAP WARNING, [src] at [get_area_name(src, TRUE)] [COORD(src)] failed to find a valid airlock to cyclelink with!")
|
||||
log_world("### MAP WARNING, [src] at [AREACOORD(src)] failed to find a valid airlock to cyclelink with!")
|
||||
return
|
||||
FoundDoor.cyclelinkedairlock = src
|
||||
cyclelinkedairlock = FoundDoor
|
||||
@@ -192,7 +192,7 @@
|
||||
/obj/machinery/door/airlock/check_access_ntnet(datum/netdata/data)
|
||||
return !requiresID() || ..()
|
||||
|
||||
/obj/machinery/door/airlock/ntnet_recieve(datum/netdata/data)
|
||||
/obj/machinery/door/airlock/ntnet_receive(datum/netdata/data)
|
||||
// Check if the airlock is powered and can accept control packets.
|
||||
if(!hasPower() || !canAIControl())
|
||||
return
|
||||
@@ -201,7 +201,7 @@
|
||||
if(!check_access_ntnet(data))
|
||||
return
|
||||
|
||||
// Handle recieved packet.
|
||||
// Handle received packet.
|
||||
var/command = lowertext(data.data["data"])
|
||||
var/command_value = lowertext(data.data["data_secondary"])
|
||||
switch(command)
|
||||
@@ -414,7 +414,7 @@
|
||||
if(!prob(prb))
|
||||
return FALSE //you lucked out, no shock for you
|
||||
do_sparks(5, TRUE, src)
|
||||
var/tmp/check_range = TRUE
|
||||
var/check_range = TRUE
|
||||
if(electrocute_mob(user, get_area(src), src, 1, check_range))
|
||||
shockCooldown = world.time + 10
|
||||
return TRUE
|
||||
@@ -1321,7 +1321,7 @@
|
||||
A = new /obj/structure/door_assembly(loc)
|
||||
//If you come across a null assemblytype, it will produce the default assembly instead of disintegrating.
|
||||
A.heat_proof_finished = src.heat_proof //tracks whether there's rglass in
|
||||
A.anchored = TRUE
|
||||
A.setAnchored(TRUE)
|
||||
A.glass = src.glass
|
||||
A.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
|
||||
A.created_name = name
|
||||
@@ -1509,7 +1509,7 @@
|
||||
else if (safe)
|
||||
safe = FALSE
|
||||
else
|
||||
to_chat(usr, "Firmware reports safeties already overriden.")
|
||||
to_chat(usr, "Firmware reports safeties already overridden.")
|
||||
. = TRUE
|
||||
if("speed-on")
|
||||
if(wires.is_cut(WIRE_TIMING))
|
||||
|
||||
@@ -79,6 +79,20 @@
|
||||
opacity = 0
|
||||
glass = TRUE
|
||||
|
||||
/obj/machinery/door/airlock/glass/incinerator
|
||||
autoclose = FALSE
|
||||
frequency = FREQ_AIRLOCK_CONTROL
|
||||
heat_proof = TRUE
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
|
||||
/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior
|
||||
name = "Turbine Interior Airlock"
|
||||
id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR
|
||||
|
||||
/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior
|
||||
name = "Turbine Exterior Airlock"
|
||||
id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR
|
||||
|
||||
/obj/machinery/door/airlock/command/glass
|
||||
opacity = 0
|
||||
glass = TRUE
|
||||
@@ -107,6 +121,20 @@
|
||||
opacity = 0
|
||||
glass = TRUE
|
||||
|
||||
/obj/machinery/door/airlock/research/glass/incinerator
|
||||
autoclose = FALSE
|
||||
frequency = FREQ_AIRLOCK_CONTROL
|
||||
heat_proof = TRUE
|
||||
req_access = list(ACCESS_TOX)
|
||||
|
||||
/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior
|
||||
name = "Mixing Room Interior Airlock"
|
||||
id_tag = INCINERATOR_TOXMIX_AIRLOCK_INTERIOR
|
||||
|
||||
/obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior
|
||||
name = "Mixing Room Exterior Airlock"
|
||||
id_tag = INCINERATOR_TOXMIX_AIRLOCK_EXTERIOR
|
||||
|
||||
/obj/machinery/door/airlock/mining/glass
|
||||
opacity = 0
|
||||
glass = TRUE
|
||||
@@ -222,8 +250,8 @@
|
||||
|
||||
/obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params)
|
||||
if(C.is_hot() > 300)//If the temperature of the object is over 300, then ignite
|
||||
message_admins("Plasma airlock ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]")
|
||||
log_game("Plasma airlock ignited by [key_name(user)] in [COORD(src)]")
|
||||
message_admins("Plasma airlock ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(src)]")
|
||||
log_game("Plasma airlock ignited by [key_name(user)] in [AREACOORD(src)]")
|
||||
ignite(C.is_hot())
|
||||
else
|
||||
return ..()
|
||||
@@ -287,6 +315,20 @@
|
||||
opacity = 0
|
||||
glass = TRUE
|
||||
|
||||
/obj/machinery/door/airlock/public/glass/incinerator
|
||||
autoclose = FALSE
|
||||
frequency = FREQ_AIRLOCK_CONTROL
|
||||
heat_proof = TRUE
|
||||
req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS)
|
||||
|
||||
/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior
|
||||
name = "Turbine Interior Airlock"
|
||||
id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR
|
||||
|
||||
/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior
|
||||
name = "Turbine Exterior Airlock"
|
||||
id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR
|
||||
|
||||
//////////////////////////////////
|
||||
/*
|
||||
External Airlocks
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
icon_state = "frame"
|
||||
desc = "A remote control for a door."
|
||||
req_access = list(ACCESS_SECURITY)
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
var/id = null // id of linked machinery/lockers
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "It opens and closes."
|
||||
icon = 'icons/obj/doors/Doorint.dmi'
|
||||
icon_state = "door1"
|
||||
anchored = TRUE
|
||||
opacity = 1
|
||||
density = TRUE
|
||||
layer = OPEN_DOOR_LAYER
|
||||
@@ -179,7 +178,7 @@
|
||||
else if(istype(I, /obj/item/weldingtool))
|
||||
try_to_weld(I, user)
|
||||
return 1
|
||||
else if(!(I.flags_1 & NOBLUDGEON_1) && user.a_intent != INTENT_HARM)
|
||||
else if(!(I.item_flags & NOBLUDGEON) && user.a_intent != INTENT_HARM)
|
||||
try_to_activate_door(user)
|
||||
return 1
|
||||
return ..()
|
||||
@@ -208,6 +207,9 @@
|
||||
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
|
||||
|
||||
/obj/machinery/door/emp_act(severity)
|
||||
. = ..()
|
||||
if (. & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
|
||||
INVOKE_ASYNC(src, .proc/open)
|
||||
if(prob(severity*10 - 20))
|
||||
@@ -215,7 +217,6 @@
|
||||
secondsElectrified = -1
|
||||
LAZYADD(shockedby, "\[[time_stamp()]\]EM Pulse")
|
||||
addtimer(CALLBACK(src, .proc/unelectrify), 300)
|
||||
..()
|
||||
|
||||
/obj/machinery/door/proc/unelectrify()
|
||||
secondsElectrified = 0
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
resistance_flags = FIRE_PROOF
|
||||
heat_proof = TRUE
|
||||
glass = TRUE
|
||||
var/nextstate = null
|
||||
sub_door = TRUE
|
||||
explosion_block = 1
|
||||
safe = FALSE
|
||||
@@ -24,6 +23,7 @@
|
||||
assemblytype = /obj/structure/firelock_frame
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70)
|
||||
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
|
||||
var/nextstate = null
|
||||
var/boltslocked = TRUE
|
||||
var/list/affecting_areas
|
||||
|
||||
|
||||
@@ -36,6 +36,26 @@
|
||||
else
|
||||
INVOKE_ASYNC(src, .proc/close)
|
||||
|
||||
/obj/machinery/door/poddoor/incinerator_toxmix
|
||||
name = "combustion chamber vent"
|
||||
id = INCINERATOR_TOXMIX_VENT
|
||||
|
||||
/obj/machinery/door/poddoor/incinerator_atmos_main
|
||||
name = "turbine vent"
|
||||
id = INCINERATOR_ATMOS_MAINVENT
|
||||
|
||||
/obj/machinery/door/poddoor/incinerator_atmos_aux
|
||||
name = "combustion chamber vent"
|
||||
id = INCINERATOR_ATMOS_AUXVENT
|
||||
|
||||
/obj/machinery/door/poddoor/incinerator_syndicatelava_main
|
||||
name = "turbine vent"
|
||||
id = INCINERATOR_SYNDICATELAVA_MAINVENT
|
||||
|
||||
/obj/machinery/door/poddoor/incinerator_syndicatelava_aux
|
||||
name = "combustion chamber vent"
|
||||
id = INCINERATOR_SYNDICATELAVA_AUXVENT
|
||||
|
||||
/obj/machinery/door/poddoor/CollidedWith(atom/movable/AM)
|
||||
if(density)
|
||||
return 0
|
||||
|
||||
@@ -38,8 +38,7 @@
|
||||
|
||||
/obj/machinery/door/window/Destroy()
|
||||
density = FALSE
|
||||
for(var/I in debris)
|
||||
qdel(I)
|
||||
QDEL_LIST(debris)
|
||||
if(obj_integrity == 0)
|
||||
playsound(src, "shatter", 70, 1)
|
||||
electronics = null
|
||||
@@ -247,7 +246,7 @@
|
||||
if("rightsecure")
|
||||
WA.facing = "r"
|
||||
WA.secure = TRUE
|
||||
WA.anchored = TRUE
|
||||
WA.setAnchored(TRUE)
|
||||
WA.state= "02"
|
||||
WA.setDir(src.dir)
|
||||
WA.ini_dir = src.dir
|
||||
|
||||
@@ -6,7 +6,6 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
icon = 'icons/obj/machines/research.dmi'
|
||||
icon_state = "tdoppler"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/integrated = FALSE
|
||||
var/max_dist = 150
|
||||
verb_say = "states coldly"
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
icon = 'icons/obj/machines/droneDispenser.dmi'
|
||||
icon_state = "on"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
|
||||
max_integrity = 250
|
||||
@@ -174,7 +173,7 @@
|
||||
use_power(power_used)
|
||||
|
||||
var/atom/A = new dispense_type(loc)
|
||||
A.admin_spawned = admin_spawned
|
||||
A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1)
|
||||
|
||||
if(create_sound)
|
||||
playsound(src, create_sound, 50, 1)
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
/obj/machinery/doorButtons
|
||||
power_channel = ENVIRON
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 2
|
||||
active_power_usage = 4
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
/datum/computer/file/embedded_program/airlock_controller
|
||||
var/id_tag
|
||||
var/exterior_door_tag
|
||||
var/interior_door_tag
|
||||
var/airpump_tag
|
||||
var/sensor_tag
|
||||
var/sanitize_external
|
||||
var/exterior_door_tag //Burn chamber facing door
|
||||
var/interior_door_tag //Station facing door
|
||||
var/airpump_tag //See: dp_vent_pump.dm
|
||||
var/sensor_tag //See: /obj/machinery/airlock_sensor
|
||||
var/sanitize_external //Before the interior airlock opens, do we first drain all gases inside the chamber and then repressurize?
|
||||
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
var/target_state = AIRLOCK_STATE_CLOSED
|
||||
@@ -97,7 +97,7 @@
|
||||
"sigtype" = "command"
|
||||
))
|
||||
if(memory["pump_status"] == "siphon")
|
||||
signal.data["stabalize"] = 1
|
||||
signal.data["stabilize"] = 1
|
||||
else if(memory["pump_status"] != "release")
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
@@ -211,6 +211,33 @@
|
||||
var/sensor_tag
|
||||
var/sanitize_external
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix
|
||||
name = "Incinerator Access Console"
|
||||
airpump_tag = INCINERATOR_TOXMIX_DP_VENTPUMP
|
||||
exterior_door_tag = INCINERATOR_TOXMIX_AIRLOCK_EXTERIOR
|
||||
id_tag = INCINERATOR_TOXMIX_AIRLOCK_CONTROLLER
|
||||
interior_door_tag = INCINERATOR_TOXMIX_AIRLOCK_INTERIOR
|
||||
sanitize_external = TRUE
|
||||
sensor_tag = INCINERATOR_TOXMIX_AIRLOCK_SENSOR
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos
|
||||
name = "Incinerator Access Console"
|
||||
airpump_tag = INCINERATOR_ATMOS_DP_VENTPUMP
|
||||
exterior_door_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR
|
||||
id_tag = INCINERATOR_ATMOS_AIRLOCK_CONTROLLER
|
||||
interior_door_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR
|
||||
sanitize_external = TRUE
|
||||
sensor_tag = INCINERATOR_ATMOS_AIRLOCK_SENSOR
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_syndicatelava
|
||||
name = "Incinerator Access Console"
|
||||
airpump_tag = INCINERATOR_SYNDICATELAVA_DP_VENTPUMP
|
||||
exterior_door_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR
|
||||
id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER
|
||||
interior_door_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR
|
||||
sanitize_external = TRUE
|
||||
sensor_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_SENSOR
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock_controller/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
|
||||
@@ -1,88 +1,87 @@
|
||||
/datum/computer/file/embedded_program
|
||||
var/list/memory = list()
|
||||
var/state
|
||||
var/obj/machinery/embedded_controller/master
|
||||
|
||||
/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line)
|
||||
if(master)
|
||||
master.post_signal(signal, comm_line)
|
||||
else
|
||||
qdel(signal)
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_user_command(command)
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal)
|
||||
return null
|
||||
|
||||
/datum/computer/file/embedded_program/process()
|
||||
return 0
|
||||
|
||||
/obj/machinery/embedded_controller
|
||||
var/datum/computer/file/embedded_program/program
|
||||
|
||||
name = "embedded controller"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
|
||||
var/on = TRUE
|
||||
|
||||
/obj/machinery/embedded_controller/ui_interact(mob/user)
|
||||
. = ..()
|
||||
user.set_machine(src)
|
||||
var/datum/browser/popup = new(user, "computer", name) // Set up the popup browser window
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.set_content(return_text())
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/embedded_controller/update_icon()
|
||||
|
||||
/obj/machinery/embedded_controller/proc/return_text()
|
||||
|
||||
/obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line)
|
||||
return 0
|
||||
|
||||
/obj/machinery/embedded_controller/receive_signal(datum/signal/signal)
|
||||
if(istype(signal) && program)
|
||||
program.receive_signal(signal)
|
||||
|
||||
/obj/machinery/embedded_controller/Topic(href, href_list)
|
||||
if(..())
|
||||
return 0
|
||||
|
||||
if(program)
|
||||
program.receive_user_command(href_list["command"])
|
||||
addtimer(CALLBACK(program, /datum/computer/file/embedded_program.proc/process), 5)
|
||||
|
||||
usr.set_machine(src)
|
||||
addtimer(CALLBACK(src, .proc/updateDialog), 5)
|
||||
|
||||
/obj/machinery/embedded_controller/process()
|
||||
if(program)
|
||||
program.process()
|
||||
|
||||
update_icon()
|
||||
src.updateDialog()
|
||||
|
||||
/obj/machinery/embedded_controller/radio
|
||||
var/frequency
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
/obj/machinery/embedded_controller/radio/Destroy()
|
||||
SSradio.remove_object(src,frequency)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/embedded_controller/radio/Initialize()
|
||||
. = ..()
|
||||
set_frequency(frequency)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal)
|
||||
signal.transmission_method = TRANSMISSION_RADIO
|
||||
if(radio_connection)
|
||||
return radio_connection.post_signal(src, signal)
|
||||
else
|
||||
signal = null
|
||||
|
||||
/obj/machinery/embedded_controller/radio/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency)
|
||||
/datum/computer/file/embedded_program
|
||||
var/list/memory = list()
|
||||
var/state
|
||||
var/obj/machinery/embedded_controller/master
|
||||
|
||||
/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line)
|
||||
if(master)
|
||||
master.post_signal(signal, comm_line)
|
||||
else
|
||||
qdel(signal)
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_user_command(command)
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal)
|
||||
return null
|
||||
|
||||
/datum/computer/file/embedded_program/process()
|
||||
return 0
|
||||
|
||||
/obj/machinery/embedded_controller
|
||||
var/datum/computer/file/embedded_program/program
|
||||
|
||||
name = "embedded controller"
|
||||
density = FALSE
|
||||
|
||||
var/on = TRUE
|
||||
|
||||
/obj/machinery/embedded_controller/ui_interact(mob/user)
|
||||
. = ..()
|
||||
user.set_machine(src)
|
||||
var/datum/browser/popup = new(user, "computer", name) // Set up the popup browser window
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.set_content(return_text())
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/embedded_controller/update_icon()
|
||||
|
||||
/obj/machinery/embedded_controller/proc/return_text()
|
||||
|
||||
/obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line)
|
||||
return 0
|
||||
|
||||
/obj/machinery/embedded_controller/receive_signal(datum/signal/signal)
|
||||
if(istype(signal) && program)
|
||||
program.receive_signal(signal)
|
||||
|
||||
/obj/machinery/embedded_controller/Topic(href, href_list)
|
||||
if(..())
|
||||
return 0
|
||||
|
||||
if(program)
|
||||
program.receive_user_command(href_list["command"])
|
||||
addtimer(CALLBACK(program, /datum/computer/file/embedded_program.proc/process), 5)
|
||||
|
||||
usr.set_machine(src)
|
||||
addtimer(CALLBACK(src, .proc/updateDialog), 5)
|
||||
|
||||
/obj/machinery/embedded_controller/process()
|
||||
if(program)
|
||||
program.process()
|
||||
|
||||
update_icon()
|
||||
src.updateDialog()
|
||||
|
||||
/obj/machinery/embedded_controller/radio
|
||||
var/frequency
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
/obj/machinery/embedded_controller/radio/Destroy()
|
||||
SSradio.remove_object(src,frequency)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/embedded_controller/radio/Initialize()
|
||||
. = ..()
|
||||
set_frequency(frequency)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal)
|
||||
signal.transmission_method = TRANSMISSION_RADIO
|
||||
if(radio_connection)
|
||||
return radio_connection.post_signal(src, signal)
|
||||
else
|
||||
signal = null
|
||||
|
||||
/obj/machinery/embedded_controller/radio/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype" = "command",
|
||||
"stabalize" = 1,
|
||||
"stabilize" = 1,
|
||||
"power" = 1
|
||||
)))
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
desc = "<i>\"Pull this in case of emergency\"</i>. Thus, keep pulling it forever."
|
||||
icon = 'icons/obj/monitors.dmi'
|
||||
icon_state = "fire0"
|
||||
anchored = TRUE
|
||||
max_integrity = 250
|
||||
integrity_failure = 100
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
|
||||
@@ -24,9 +23,14 @@
|
||||
idle_power_usage = 2
|
||||
active_power_usage = 6
|
||||
power_channel = ENVIRON
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
light_power = 0
|
||||
light_range = 7
|
||||
light_color = "#ff3232"
|
||||
|
||||
var/detecting = 1
|
||||
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
|
||||
resistance_flags = FIRE_PROOF
|
||||
var/last_alarm = 0
|
||||
var/area/myarea = null
|
||||
|
||||
@@ -81,9 +85,13 @@
|
||||
add_overlay("overlay_fire")
|
||||
|
||||
/obj/machinery/firealarm/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
if (. & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
if(prob(50 / severity))
|
||||
alarm()
|
||||
..()
|
||||
|
||||
/obj/machinery/firealarm/emag_act(mob/user)
|
||||
if(obj_flags & EMAGGED)
|
||||
@@ -270,35 +278,10 @@
|
||||
new /obj/item/stack/cable_coil(loc, 3)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/*
|
||||
* Party button
|
||||
*/
|
||||
|
||||
/obj/machinery/firealarm/partyalarm
|
||||
name = "\improper PARTY BUTTON"
|
||||
desc = "Cuban Pete is in the house!"
|
||||
|
||||
|
||||
/obj/machinery/firealarm/partyalarm/reset()
|
||||
if (stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
var/area/A = src.loc
|
||||
A = A.loc
|
||||
if (!( istype(A, /area) ))
|
||||
return
|
||||
A.partyreset()
|
||||
|
||||
/obj/machinery/firealarm/partyalarm/alarm()
|
||||
if (stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
var/area/A = src.loc
|
||||
A = A.loc
|
||||
if (!( istype(A, /area) ))
|
||||
return
|
||||
A.partyalert()
|
||||
|
||||
/obj/machinery/firealarm/partyalarm/ui_data(mob/user)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
.["alarm"] = A.party
|
||||
/obj/machinery/firealarm/proc/update_fire_light(fire)
|
||||
if(fire == !!light_power)
|
||||
return // do nothing if we're already active
|
||||
if(fire)
|
||||
set_light(l_power = 0.8)
|
||||
else
|
||||
set_light(l_power = 0)
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
icon_state = "mflash1"
|
||||
max_integrity = 250
|
||||
integrity_failure = 100
|
||||
anchored = TRUE
|
||||
var/obj/item/assembly/flash/handheld/bulb
|
||||
var/id = null
|
||||
var/range = 2 //this is roughly the size of brig cell
|
||||
@@ -119,12 +118,12 @@
|
||||
|
||||
|
||||
/obj/machinery/flasher/emp_act(severity)
|
||||
if(!(stat & (BROKEN|NOPOWER)))
|
||||
. = ..()
|
||||
if(!(stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF))
|
||||
if(bulb && prob(75/severity))
|
||||
flash()
|
||||
bulb.burn_out()
|
||||
power_change()
|
||||
..()
|
||||
|
||||
/obj/machinery/flasher/obj_break(damage_flag)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
@@ -168,13 +167,13 @@
|
||||
if (!anchored && !isinspace())
|
||||
to_chat(user, "<span class='notice'>[src] is now secured.</span>")
|
||||
add_overlay("[base_state]-s")
|
||||
anchored = TRUE
|
||||
setAnchored(TRUE)
|
||||
power_change()
|
||||
proximity_monitor.SetRange(range)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] can now be moved.</span>")
|
||||
cut_overlays()
|
||||
anchored = FALSE
|
||||
setAnchored(FALSE)
|
||||
power_change()
|
||||
proximity_monitor.SetRange(0)
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
icon_state = "dorm_taken"
|
||||
req_access = list(ACCESS_SECURITY) //REQACCESS TO ACCESS ALL STORED ITEMS
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 100
|
||||
active_power_usage = 2500
|
||||
|
||||
@@ -13,7 +13,6 @@ The console is located at computer/gulag_teleporter.dm
|
||||
icon_state = "implantchair"
|
||||
state_open = FALSE
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 200
|
||||
active_power_usage = 5000
|
||||
@@ -174,7 +173,7 @@ The console is located at computer/gulag_teleporter.dm
|
||||
/* beacon that receives the teleported prisoner */
|
||||
/obj/structure/gulag_beacon
|
||||
name = "labor camp bluespace beacon"
|
||||
desc = "A recieving beacon for bluespace teleportations."
|
||||
desc = "A receiving beacon for bluespace teleportations."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "light_on-w"
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
|
||||
@@ -34,7 +34,6 @@ Possible to do for anyone motivated enough:
|
||||
layer = LOW_OBJ_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
flags_1 = HEAR_1
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 100
|
||||
@@ -394,7 +393,7 @@ Possible to do for anyone motivated enough:
|
||||
Hologram.copy_known_languages_from(user,replace = TRUE)
|
||||
Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it.
|
||||
Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
|
||||
Hologram.anchored = TRUE//So space wind cannot drag it.
|
||||
Hologram.setAnchored(TRUE)//So space wind cannot drag it.
|
||||
Hologram.name = "[user.name] (Hologram)"//If someone decides to right click.
|
||||
Hologram.set_light(2) //hologram lighting
|
||||
move_hologram()
|
||||
@@ -480,6 +479,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
continue
|
||||
if(another.validate_location(T))
|
||||
unset_holo(holo_owner)
|
||||
if(another.masters && another.masters[holo_owner])
|
||||
another.clear_holo(holo_owner)
|
||||
another.set_holo(holo_owner, h)
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -550,7 +551,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
holder.selected_default_language = record.language
|
||||
Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it.
|
||||
Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
|
||||
Hologram.anchored = TRUE//So space wind cannot drag it.
|
||||
Hologram.setAnchored(TRUE)//So space wind cannot drag it.
|
||||
Hologram.name = "[record.caller_name] (Hologram)"//If someone decides to right click.
|
||||
Hologram.set_light(2) //hologram lighting
|
||||
visible_message("<span class='notice'>A holographic image of [record.caller_name] flickers to life before your eyes!</span>")
|
||||
@@ -667,7 +668,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
|
||||
/obj/effect/overlay/holo_pad_hologram/Destroy()
|
||||
Impersonation = null
|
||||
if(HC)
|
||||
if(!QDELETED(HC))
|
||||
HC.Disconnect(HC.calling_holopad)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -4,15 +4,23 @@
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "igniter0"
|
||||
plane = FLOOR_PLANE
|
||||
var/id = null
|
||||
var/on = FALSE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 2
|
||||
active_power_usage = 4
|
||||
max_integrity = 300
|
||||
armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
|
||||
resistance_flags = FIRE_PROOF
|
||||
var/id = null
|
||||
var/on = FALSE
|
||||
|
||||
/obj/machinery/igniter/incinerator_toxmix
|
||||
id = INCINERATOR_TOXMIX_IGNITER
|
||||
|
||||
/obj/machinery/igniter/incinerator_atmos
|
||||
id = INCINERATOR_ATMOS_IGNITER
|
||||
|
||||
/obj/machinery/igniter/incinerator_syndicatelava
|
||||
id = INCINERATOR_SYNDICATELAVA_IGNITER
|
||||
|
||||
/obj/machinery/igniter/on
|
||||
on = TRUE
|
||||
@@ -32,7 +40,7 @@
|
||||
if (src.on && !(stat & NOPOWER) )
|
||||
var/turf/location = src.loc
|
||||
if (isturf(location))
|
||||
location.hotspot_expose(1000,500,1)
|
||||
location.hotspot_expose(700,10,1)
|
||||
return 1
|
||||
|
||||
/obj/machinery/igniter/Initialize()
|
||||
@@ -52,13 +60,15 @@
|
||||
desc = "A wall-mounted ignition device."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "migniter"
|
||||
resistance_flags = FIRE_PROOF
|
||||
var/id = null
|
||||
var/disable = 0
|
||||
var/last_spark = 0
|
||||
var/base_state = "migniter"
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
anchored = TRUE
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/machinery/sparker/toxmix
|
||||
id = INCINERATOR_TOXMIX_IGNITER
|
||||
|
||||
/obj/machinery/sparker/Initialize()
|
||||
. = ..()
|
||||
@@ -116,10 +126,12 @@
|
||||
use_power(1000)
|
||||
var/turf/location = src.loc
|
||||
if (isturf(location))
|
||||
location.hotspot_expose(1000,500,1)
|
||||
location.hotspot_expose(1000,100,1)
|
||||
return 1
|
||||
|
||||
/obj/machinery/sparker/emp_act(severity)
|
||||
. = ..()
|
||||
if (. & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(!(stat & (BROKEN|NOPOWER)))
|
||||
ignite()
|
||||
..()
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
/obj/machinery/iv_drip
|
||||
name = "\improper IV drip"
|
||||
desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate."
|
||||
icon = 'icons/obj/iv_drip.dmi'
|
||||
icon_state = "iv_drip"
|
||||
anchored = FALSE
|
||||
@@ -166,7 +167,7 @@
|
||||
else
|
||||
toggle_mode()
|
||||
|
||||
/obj/machinery/iv_drip/verb/eject_beaker(mob/user)
|
||||
/obj/machinery/iv_drip/verb/eject_beaker()
|
||||
set category = "Object"
|
||||
set name = "Remove IV Container"
|
||||
set src in view(1)
|
||||
|
||||
@@ -3,12 +3,11 @@
|
||||
desc = "A bluespace pad able to thrust matter through bluespace, teleporting it to or from nearby locations."
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "lpad-idle"
|
||||
var/icon_teleport = "lpad-beam"
|
||||
anchored = TRUE
|
||||
use_power = TRUE
|
||||
idle_power_usage = 200
|
||||
active_power_usage = 2500
|
||||
circuit = /obj/item/circuitboard/machine/launchpad
|
||||
var/icon_teleport = "lpad-beam"
|
||||
var/stationary = TRUE //to prevent briefcase pad deconstruction and such
|
||||
var/display_name = "Launchpad"
|
||||
var/teleport_speed = 35
|
||||
@@ -53,7 +52,7 @@
|
||||
if(teleporting)
|
||||
to_chat(user, "<span class='warning'>ERROR: Launchpad busy.</span>")
|
||||
return
|
||||
|
||||
|
||||
var/turf/dest = get_turf(src)
|
||||
|
||||
if(dest && is_centcom_level(dest.z))
|
||||
@@ -89,10 +88,12 @@
|
||||
dest = target
|
||||
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1)
|
||||
var/first = TRUE
|
||||
for(var/atom/movable/ROI in source)
|
||||
if(ROI == src)
|
||||
continue
|
||||
// if it's anchored, don't teleport
|
||||
var/on_chair = ""
|
||||
if(ROI.anchored)
|
||||
if(isliving(ROI))
|
||||
var/mob/living/L = ROI
|
||||
@@ -101,35 +102,36 @@
|
||||
if(L.buckled.anchored)
|
||||
continue
|
||||
|
||||
log_msg += "[key_name(L)] (on a chair), "
|
||||
on_chair = " (on a chair)"
|
||||
else
|
||||
continue
|
||||
else if(!isobserver(ROI))
|
||||
continue
|
||||
if(!first)
|
||||
log_msg += ", "
|
||||
if(ismob(ROI))
|
||||
var/mob/T = ROI
|
||||
log_msg += "[key_name(T)], "
|
||||
log_msg += "[key_name(T)][on_chair]"
|
||||
else
|
||||
log_msg += "[ROI.name]"
|
||||
if (istype(ROI, /obj/structure/closet))
|
||||
var/obj/structure/closet/C = ROI
|
||||
log_msg += " ("
|
||||
for(var/atom/movable/Q as mob|obj in C)
|
||||
var/first_inner = TRUE
|
||||
for(var/atom/movable/Q as mob|obj in ROI)
|
||||
if(!first_inner)
|
||||
log_msg += ", "
|
||||
first_inner = FALSE
|
||||
if(ismob(Q))
|
||||
log_msg += "[key_name(Q)], "
|
||||
log_msg += "[key_name(Q)]"
|
||||
else
|
||||
log_msg += "[Q.name], "
|
||||
if (dd_hassuffix(log_msg, "("))
|
||||
log_msg += "empty)"
|
||||
else
|
||||
log_msg = dd_limittext(log_msg, length(log_msg) - 2)
|
||||
log_msg += ")"
|
||||
log_msg += ", "
|
||||
do_teleport(ROI, dest)
|
||||
log_msg += "[Q.name]"
|
||||
if(first_inner)
|
||||
log_msg += "empty"
|
||||
log_msg += ")"
|
||||
do_teleport(ROI, dest, no_effects = !first)
|
||||
first = FALSE
|
||||
|
||||
if (dd_hassuffix(log_msg, ", "))
|
||||
log_msg = dd_limittext(log_msg, length(log_msg) - 2)
|
||||
else
|
||||
if (first)
|
||||
log_msg += "nothing"
|
||||
log_msg += " [sending ? "to" : "from"] [target_x], [target_y], [z] ([A ? A.name : "null area"])"
|
||||
investigate_log(log_msg.Join(), INVESTIGATE_TELESCI)
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
name = "light switch"
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "light1"
|
||||
anchored = TRUE
|
||||
desc = "Make dark."
|
||||
var/on = TRUE
|
||||
var/area/area = null
|
||||
@@ -61,6 +60,8 @@
|
||||
updateicon()
|
||||
|
||||
/obj/machinery/light_switch/emp_act(severity)
|
||||
. = ..()
|
||||
if (. & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(!(stat & (BROKEN|NOPOWER)))
|
||||
power_change()
|
||||
..()
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
icon_state = "limbgrower_idleoff"
|
||||
density = TRUE
|
||||
container_type = OPENCONTAINER
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
desc = "A device that uses station power to create points of magnetic energy."
|
||||
level = 1 // underfloor
|
||||
layer = LOW_OBJ_LAYER
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 50
|
||||
|
||||
@@ -195,7 +194,6 @@
|
||||
icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING!
|
||||
icon_state = "airlock_control_standby"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 45
|
||||
var/frequency = FREQ_MAGNETS
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "The finest in spring-loaded piston toy technology, now on a space station near you."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "mass_driver"
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 2
|
||||
active_power_usage = 50
|
||||
@@ -31,7 +30,9 @@
|
||||
|
||||
|
||||
/obj/machinery/mass_driver/emp_act(severity)
|
||||
. = ..()
|
||||
if (. & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
drive()
|
||||
..(severity)
|
||||
@@ -9,7 +9,6 @@
|
||||
desc = "A radio beacon used for bot navigation."
|
||||
level = 1 // underfloor
|
||||
layer = LOW_OBJ_LAYER
|
||||
anchored = TRUE
|
||||
max_integrity = 500
|
||||
armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
|
||||
|
||||
@@ -38,10 +37,18 @@
|
||||
GLOB.deliverybeacontags += location
|
||||
|
||||
/obj/machinery/navbeacon/Destroy()
|
||||
GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one.
|
||||
if (GLOB.navbeacons["[z]"])
|
||||
GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one.
|
||||
GLOB.deliverybeacons -= src
|
||||
return ..()
|
||||
|
||||
/obj/machinery/navbeacon/onTransitZ(old_z, new_z)
|
||||
if (GLOB.navbeacons["[old_z]"])
|
||||
GLOB.navbeacons["[old_z]"] -= src
|
||||
if (GLOB.navbeacons["[new_z]"])
|
||||
GLOB.navbeacons["[new_z]"] += src
|
||||
..()
|
||||
|
||||
// set the transponder codes assoc list from codes_txt
|
||||
/obj/machinery/navbeacon/proc/set_codes()
|
||||
if(!codes_txt)
|
||||
@@ -204,4 +211,4 @@ Transponder Codes:<UL>"}
|
||||
|
||||
codes[newkey] = newval
|
||||
|
||||
updateDialog()
|
||||
updateDialog()
|
||||
|
||||
@@ -202,7 +202,6 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
var/c_locked=0
|
||||
var/datum/newscaster/feed_channel/viewing_channel = null
|
||||
var/allow_comments = 1
|
||||
anchored = TRUE
|
||||
|
||||
/obj/machinery/newscaster/security_unit
|
||||
name = "security newscaster"
|
||||
@@ -875,7 +874,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
say("Breaking news from [channel]!")
|
||||
alert = TRUE
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src,.proc/remove_alert),alert_delay,TIMER_OVERRIDE)
|
||||
addtimer(CALLBACK(src,.proc/remove_alert),alert_delay,TIMER_UNIQUE|TIMER_OVERRIDE)
|
||||
playsound(loc, 'sound/machines/twobeep.ogg', 75, 1)
|
||||
else
|
||||
say("Attention! Wanted issue distributed!")
|
||||
|
||||
@@ -1,332 +0,0 @@
|
||||
//#define AMAP
|
||||
|
||||
/obj/machinery/computer/security/verb/station_map()
|
||||
set name = ".map"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
usr.set_machine(src)
|
||||
if(!mapping)
|
||||
return
|
||||
|
||||
log_game("[usr]([usr.key]) used station map L[z] in [src.loc.loc]")
|
||||
|
||||
src.drawmap(usr)
|
||||
|
||||
/obj/machinery/computer/security/proc/drawmap(mob/user)
|
||||
|
||||
var/icx = round(world.maxx/16) + 1
|
||||
var/icy = round(world.maxy/16) + 1
|
||||
|
||||
var/xoff = round( (icx*16-world.maxx)-2)
|
||||
var/yoff = round( (icy*16-world.maxy)-2)
|
||||
|
||||
var/icount = icx * icy
|
||||
|
||||
|
||||
var/list/imap = list()
|
||||
|
||||
#ifdef AMAP
|
||||
|
||||
for(var/i = 0; i<icount; i++)
|
||||
imap += icon('icons/misc/imap.dmi', "blank")
|
||||
imap += icon('icons/misc/imap.dmi', "blank")
|
||||
|
||||
|
||||
for(var/wx = 1 ; wx <= world.maxx; wx++)
|
||||
|
||||
for(var/wy = 1; wy <= world.maxy; wy++)
|
||||
|
||||
var/turf/T = locate(wx, wy, z)
|
||||
|
||||
var/colour
|
||||
var/colour2
|
||||
|
||||
|
||||
|
||||
if(!T)
|
||||
colour = rgb(0,0,0)
|
||||
|
||||
else
|
||||
var/sense = 1
|
||||
switch("[T.type]")
|
||||
if("/turf/open/space")
|
||||
colour = rgb(10,10,10)
|
||||
sense = 0
|
||||
|
||||
if("/turf/open/floor")
|
||||
colour = rgb(150,150,150)
|
||||
var/turf/open/floor/TF = T
|
||||
if(TF.burnt == 1)
|
||||
sense = 0
|
||||
colour = rgb(130,130,130)
|
||||
|
||||
if("/turf/open/floor/engine")
|
||||
colour = rgb(128,128,128)
|
||||
|
||||
if("/turf/closed/wall")
|
||||
colour = rgb(96,96,96)
|
||||
|
||||
if("/turf/closed/wall/r_wall")
|
||||
colour = rgb(128,96,96)
|
||||
|
||||
else
|
||||
colour = rgb(0,40,0)
|
||||
|
||||
|
||||
|
||||
|
||||
if(sense)
|
||||
|
||||
for(var/atom/AM in T.contents)
|
||||
|
||||
if(istype(AM, /obj/machinery/door) && !istype(AM, /obj/machinery/door/window))
|
||||
if(AM.density)
|
||||
colour = rgb(96,96,192)
|
||||
colour2 = colour
|
||||
else
|
||||
colour = rgb(128,192,128)
|
||||
|
||||
if(istype(AM, /obj/machinery/airalarm))
|
||||
colour = rgb(0,255,0)
|
||||
colour2 = colour
|
||||
if(AM.icon_state=="alarm:1")
|
||||
colour = rgb(255,255,0)
|
||||
colour2 = rgb(255,128,0)
|
||||
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(M.client)
|
||||
colour = rgb(255,0,0)
|
||||
else
|
||||
colour = rgb(255,128,128)
|
||||
|
||||
colour2 = rgb(192,0,0)
|
||||
|
||||
var/area/A = T.loc
|
||||
|
||||
if(A.fire)
|
||||
|
||||
var/red = getr(colour)
|
||||
var/green = getg(colour)
|
||||
var/blue = getb(colour)
|
||||
|
||||
|
||||
green = min(255, green+40)
|
||||
blue = min(255, blue+40)
|
||||
|
||||
colour = rgb(red, green, blue)
|
||||
|
||||
if(!colour2 && !T.density)
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
var/turf_total = environment.total_moles()
|
||||
|
||||
|
||||
var/t1 = turf_total / MOLES_CELLSTANDARD * 150
|
||||
|
||||
|
||||
if(t1<=100)
|
||||
colour2 = rgb(t1*2.55,0,0)
|
||||
else
|
||||
t1 = min(100, t1-100)
|
||||
colour2 = rgb(255, t1*2.55, t1*2.55)
|
||||
|
||||
if(!colour2)
|
||||
colour2 = colour
|
||||
|
||||
var/ix = round((wx*2+xoff)/32)
|
||||
var/iy = round((wy*2+yoff)/32)
|
||||
|
||||
var/rx = ((wx*2+xoff)%32) + 1
|
||||
var/ry = ((wy*2+yoff)%32) + 1
|
||||
|
||||
var/icon/I = imap[1+(ix + icx*iy)*2]
|
||||
var/icon/I2 = imap[2+(ix + icx*iy)*2]
|
||||
|
||||
|
||||
I.DrawBox(colour, rx, ry, rx+1, ry+1)
|
||||
|
||||
I2.DrawBox(colour2, rx, ry, rx+1, ry+1)
|
||||
|
||||
|
||||
user.clearmap()
|
||||
|
||||
user.mapobjs = list()
|
||||
|
||||
|
||||
for(var/i=0; i<icount;i++)
|
||||
var/obj/screen/H = new /obj/screen()
|
||||
|
||||
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
|
||||
|
||||
H.name = (i==0)?"maprefresh":"map"
|
||||
|
||||
var/icon/HI = new/icon
|
||||
|
||||
var/icon/I = imap[i*2+1]
|
||||
var/icon/J = imap[i*2+2]
|
||||
|
||||
HI.Insert(I, frame=1, delay = 5)
|
||||
HI.Insert(J, frame=2, delay = 5)
|
||||
|
||||
qdel(I)
|
||||
qdel(J)
|
||||
H.icon = HI
|
||||
H.layer = ABOVE_HUD_LAYER
|
||||
H.plane = ABOVE_HUD_PLANE
|
||||
usr.mapobjs += H
|
||||
#else
|
||||
|
||||
for(var/i = 0; i<icount; i++)
|
||||
imap += icon('icons/misc/imap.dmi', "blank")
|
||||
|
||||
for(var/wx = 1 ; wx <= world.maxx; wx++)
|
||||
|
||||
for(var/wy = 1; wy <= world.maxy; wy++)
|
||||
|
||||
var/turf/T = locate(wx, wy, z)
|
||||
|
||||
var/colour
|
||||
|
||||
if(!T)
|
||||
colour = rgb(0,0,0)
|
||||
|
||||
else
|
||||
var/sense = 1
|
||||
switch("[T.type]")
|
||||
if("/turf/open/space")
|
||||
colour = rgb(10,10,10)
|
||||
sense = 0
|
||||
|
||||
if("/turf/open/floor", "/turf/open/floor/engine")
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
var/turf_total = environment.total_moles()
|
||||
var/t1 = turf_total / MOLES_CELLSTANDARD * 175
|
||||
|
||||
if(t1<=100)
|
||||
colour = rgb(0,0,t1*2.55)
|
||||
else
|
||||
t1 = min(100, t1-100)
|
||||
colour = rgb( t1*2.55, t1*2.55, 255)
|
||||
|
||||
if("/turf/closed/wall")
|
||||
colour = rgb(96,96,96)
|
||||
|
||||
if("/turf/closed/wall/r_wall")
|
||||
colour = rgb(128,96,96)
|
||||
|
||||
else
|
||||
colour = rgb(0,40,0)
|
||||
|
||||
|
||||
if(sense)
|
||||
|
||||
for(var/atom/AM in T.contents)
|
||||
|
||||
if(istype(AM, /obj/machinery/door) && !istype(AM, /obj/machinery/door/window))
|
||||
if(AM.density)
|
||||
colour = rgb(0,96,192)
|
||||
else
|
||||
colour = rgb(96,192,128)
|
||||
|
||||
if(istype(AM, /obj/machinery/airalarm))
|
||||
colour = rgb(0,255,0)
|
||||
|
||||
if(AM.icon_state=="alarm:1")
|
||||
colour = rgb(255,255,0)
|
||||
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(M.client)
|
||||
colour = rgb(255,0,0)
|
||||
else
|
||||
colour = rgb(255,128,128)
|
||||
|
||||
var/area/A = T.loc
|
||||
|
||||
if(A.fire)
|
||||
|
||||
var/red = getr(colour)
|
||||
var/green = getg(colour)
|
||||
var/blue = getb(colour)
|
||||
|
||||
|
||||
green = min(255, green+40)
|
||||
blue = min(255, blue+40)
|
||||
|
||||
colour = rgb(red, green, blue)
|
||||
|
||||
var/ix = round((wx*2+xoff)/32)
|
||||
var/iy = round((wy*2+yoff)/32)
|
||||
|
||||
var/rx = ((wx*2+xoff)%32) + 1
|
||||
var/ry = ((wy*2+yoff)%32) + 1
|
||||
|
||||
var/icon/I = imap[1+(ix + icx*iy)]
|
||||
|
||||
I.DrawBox(colour, rx, ry, rx, ry)
|
||||
|
||||
|
||||
user.clearmap()
|
||||
|
||||
user.mapobjs = list()
|
||||
|
||||
|
||||
for(var/i=0; i<icount;i++)
|
||||
var/obj/screen/H = new /obj/screen()
|
||||
|
||||
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
|
||||
|
||||
H.name = (i==0)?"maprefresh":"map"
|
||||
|
||||
var/icon/I = imap[i+1]
|
||||
|
||||
H.icon = I
|
||||
qdel(I)
|
||||
H.layer = ABOVE_HUD_LAYER
|
||||
H.plane = ABOVE_HUD_PLANE
|
||||
usr.mapobjs += H
|
||||
|
||||
#endif
|
||||
|
||||
user.client.screen += user.mapobjs
|
||||
|
||||
src.close(user)
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/security/proc/close(mob/user)
|
||||
spawn(20)
|
||||
var/using = null
|
||||
if(user.mapobjs)
|
||||
for(var/obj/machinery/computer/security/seccomp in oview(1,user))
|
||||
if(seccomp == src)
|
||||
using = 1
|
||||
break
|
||||
if(using)
|
||||
close(user)
|
||||
else
|
||||
user.clearmap()
|
||||
|
||||
|
||||
return
|
||||
|
||||
/proc/getr(col)
|
||||
return hex2num( copytext(col, 2,4))
|
||||
|
||||
/proc/getg(col)
|
||||
return hex2num( copytext(col, 4,6))
|
||||
|
||||
/proc/getb(col)
|
||||
return hex2num( copytext(col, 6))
|
||||
|
||||
|
||||
/mob/proc/clearmap()
|
||||
src.client.screen -= src.mapobjs
|
||||
for(var/obj/screen/O in mapobjs)
|
||||
qdel(O)
|
||||
|
||||
mapobjs = null
|
||||
src.unset_machine()
|
||||
|
||||
@@ -165,6 +165,11 @@ Buildable meters
|
||||
|
||||
if(pipename)
|
||||
A.name = pipename
|
||||
if(A.on)
|
||||
// Certain pre-mapped subtypes are on by default, we want to preserve
|
||||
// every other aspect of these subtypes (name, pre-set filters, etc.)
|
||||
// but they shouldn't turn on automatically when wrenched.
|
||||
A.on = FALSE
|
||||
|
||||
/obj/item/pipe/trinary/flippable/build_pipe(obj/machinery/atmospherics/components/trinary/T)
|
||||
..()
|
||||
@@ -191,7 +196,7 @@ Buildable meters
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
var/piping_layer = PIPING_LAYER_DEFAULT
|
||||
|
||||
obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/wrench/W)
|
||||
/obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/wrench/W)
|
||||
|
||||
var/obj/machinery/atmospherics/pipe/pipe
|
||||
for(var/obj/machinery/atmospherics/pipe/P in loc)
|
||||
@@ -206,7 +211,7 @@ obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/wrench/W)
|
||||
to_chat(user, "<span class='notice'>You fasten the meter to the pipe.</span>")
|
||||
qdel(src)
|
||||
|
||||
obj/item/pipe_meter/screwdriver_act(mob/living/user, obj/item/S)
|
||||
/obj/item/pipe_meter/screwdriver_act(mob/living/user, obj/item/S)
|
||||
if(!isturf(loc))
|
||||
to_chat(user, "<span class='warning'>You need to fasten it to the floor!</span>")
|
||||
return TRUE
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user