Merge branch 'master' into mirror-38933

This commit is contained in:
kevinz000
2018-07-14 15:26:49 -07:00
committed by GitHub
1555 changed files with 162517 additions and 36374 deletions
+13
View File
@@ -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)
+2 -2
View File
@@ -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
View File
@@ -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 -3
View File
@@ -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"
+13 -9
View File
@@ -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 -2
View File
@@ -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
+1 -1
View File
@@ -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
+3
View File
@@ -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
+3 -3
View File
@@ -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
+2 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
+6 -1
View File
@@ -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")
+1 -1
View File
@@ -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 ..()
+5 -4
View File
@@ -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()
+7 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+6 -3
View File
@@ -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()
+2 -1
View File
@@ -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
+4 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
..()
+2 -1
View File
@@ -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
+4 -3
View File
@@ -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)
+2 -2
View File
@@ -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
+2 -1
View File
@@ -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 -15
View File
@@ -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."
+4 -4
View File
@@ -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()
-1
View File
@@ -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
+1 -2
View File
@@ -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()
+7 -5
View File
@@ -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)
+16 -16
View File
@@ -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)
. = ..()
-1
View File
@@ -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)
+163 -153
View File
@@ -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 -3
View File
@@ -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)
-1
View File
@@ -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
+3 -3
View File
@@ -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)
/////////////////
+39 -2
View File
@@ -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."
+14 -11
View File
@@ -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
+3
View File
@@ -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
+6 -5
View File
@@ -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
+2 -6
View File
@@ -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
+4 -6
View File
@@ -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()
+11 -10
View File
@@ -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)
..()
+10 -10
View File
@@ -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 -1
View File
@@ -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
+6 -6
View File
@@ -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)
+12 -10
View File
@@ -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)
+107 -25
View File
@@ -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
+12 -5
View File
@@ -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)
+14 -5
View File
@@ -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)]"
+25 -24
View File
@@ -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)
+1 -2
View File
@@ -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
+5 -5
View File
@@ -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)
+1 -1
View File
@@ -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."
+6 -6
View File
@@ -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)
+14 -13
View File
@@ -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 -36
View File
@@ -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
+6 -6
View File
@@ -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)
+6 -7
View File
@@ -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)
+2 -3
View File
@@ -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>", \
-1
View File
@@ -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,
-1
View File
@@ -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
+6 -6
View File
@@ -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))
+44 -2
View File
@@ -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
-1
View File
@@ -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
+4 -3
View File
@@ -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
+1 -1
View File
@@ -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
+20
View File
@@ -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
+2 -3
View File
@@ -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
-1
View File
@@ -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"
+1 -2
View File
@@ -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
)))
+18 -35
View File
@@ -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)
+4 -5
View File
@@ -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
+1 -2
View File
@@ -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
+5 -4
View File
@@ -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 ..()
+20 -8
View File
@@ -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()
..()
+2 -1
View File
@@ -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)
+21 -19
View File
@@ -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)
+3 -2
View File
@@ -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()
..()
-1
View File
@@ -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
-2
View File
@@ -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 -2
View File
@@ -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)
+10 -3
View File
@@ -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()
+1 -2
View File
@@ -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!")
-332
View File
@@ -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()
+7 -2
View File
@@ -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