mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-19 20:07:05 +01:00
Merge branch 'master' into Dynamic2
This commit is contained in:
@@ -1366,3 +1366,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/xenoarch/med
|
||||
name = "Xenoarchaeology Medical"
|
||||
icon_state = "xenomed"
|
||||
|
||||
//Pool
|
||||
/area/crew_quarters/fitness/pool
|
||||
name = "Pool Area"
|
||||
icon_state = "pool"
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
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.)"
|
||||
|
||||
/// if mobs can be spawned by natural random generation
|
||||
var/mob_spawn_allowed = FALSE
|
||||
/// If megafauna can be spawned by natural random generation
|
||||
var/megafauna_spawn_allowed = FALSE
|
||||
|
||||
var/fire = null
|
||||
var/atmos = TRUE
|
||||
var/atmosalm = FALSE
|
||||
|
||||
@@ -114,9 +114,11 @@
|
||||
|
||||
/area/lavaland/surface/outdoors/unexplored //monsters and ruins spawn here
|
||||
icon_state = "unexplored"
|
||||
mob_spawn_allowed = TRUE
|
||||
|
||||
/area/lavaland/surface/outdoors/unexplored/danger //megafauna will also spawn here
|
||||
icon_state = "danger"
|
||||
megafauna_spawn_allowed = TRUE
|
||||
|
||||
/area/lavaland/surface/outdoors/explored
|
||||
name = "Lavaland Labor Camp"
|
||||
|
||||
+31
-25
@@ -165,7 +165,7 @@
|
||||
|
||||
return FALSE
|
||||
|
||||
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
|
||||
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
|
||||
if(does_attack_animation)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
@@ -254,18 +254,6 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/atom/proc/get_examine_name(mob/user)
|
||||
. = "\a [src]"
|
||||
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)
|
||||
. = "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
|
||||
|
||||
/atom/proc/update_icon_state()
|
||||
|
||||
/atom/proc/update_overlaysb()
|
||||
@@ -288,33 +276,51 @@
|
||||
managed_overlays = new_overlays
|
||||
add_overlay(new_overlays)
|
||||
|
||||
/atom/proc/get_examine_name(mob/user)
|
||||
. = "\a [src]"
|
||||
var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]")
|
||||
if(article)
|
||||
. = "[article] [src]"
|
||||
override[EXAMINE_POSITION_ARTICLE] = article
|
||||
|
||||
var/should_override = FALSE
|
||||
|
||||
if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
|
||||
should_override = TRUE
|
||||
|
||||
if(should_override)
|
||||
. = override.Join("")
|
||||
|
||||
///Generate the full examine string of this atom (including icon for goonchat)
|
||||
/atom/proc/get_examine_string(mob/user, thats = FALSE)
|
||||
return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
|
||||
|
||||
/atom/proc/examine(mob/user)
|
||||
to_chat(user, get_examine_string(user, TRUE))
|
||||
. = list("[get_examine_string(user, TRUE)].")
|
||||
|
||||
if(desc)
|
||||
to_chat(user, desc)
|
||||
. += desc
|
||||
|
||||
if(reagents)
|
||||
if(reagents.reagents_holder_flags & TRANSPARENT)
|
||||
to_chat(user, "It contains:")
|
||||
if(reagents.reagent_list.len)
|
||||
. += "It contains:"
|
||||
if(length(reagents.reagent_list))
|
||||
if(user.can_see_reagents()) //Show each individual reagent
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
to_chat(user, "[R.volume] units of [R.name]")
|
||||
. += "[R.volume] units of [R.name]"
|
||||
else //Otherwise, just show the total volume
|
||||
var/total_volume = 0
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
total_volume += R.volume
|
||||
to_chat(user, "[total_volume] units of various reagents")
|
||||
. += "[total_volume] units of various reagents"
|
||||
else
|
||||
to_chat(user, "Nothing.")
|
||||
. += "Nothing."
|
||||
else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE)
|
||||
if(reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>It has [reagents.total_volume] unit\s left.</span>")
|
||||
. += "<span class='notice'>It has [reagents.total_volume] unit\s left.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='danger'>It's empty.</span>")
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user)
|
||||
. += "<span class='danger'>It's empty.</span>"
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
|
||||
|
||||
/atom/proc/relaymove(mob/user)
|
||||
if(buckle_message_cooldown <= world.time)
|
||||
@@ -341,7 +347,7 @@
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
|
||||
return
|
||||
|
||||
/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
|
||||
/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
|
||||
if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...).
|
||||
addtimer(CALLBACK(src, .proc/hitby_react, AM), 2)
|
||||
|
||||
|
||||
+71
-31
@@ -3,6 +3,9 @@
|
||||
var/last_move = null
|
||||
var/last_move_time = 0
|
||||
var/anchored = FALSE
|
||||
var/move_resist = MOVE_RESIST_DEFAULT
|
||||
var/move_force = MOVE_FORCE_DEFAULT
|
||||
var/pull_force = PULL_FORCE_DEFAULT
|
||||
var/datum/thrownthing/throwing = null
|
||||
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
|
||||
var/throw_range = 7
|
||||
@@ -26,7 +29,7 @@
|
||||
var/list/client_mobs_in_contents // This contains all the client mobs within this container
|
||||
var/list/acted_explosions //for explosion dodging
|
||||
glide_size = 8
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE
|
||||
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
|
||||
var/floating = FALSE
|
||||
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.
|
||||
@@ -116,20 +119,20 @@
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/atom/movable/proc/start_pulling(atom/movable/AM,gs)
|
||||
/atom/movable/proc/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
|
||||
if(QDELETED(AM))
|
||||
return FALSE
|
||||
if(!(AM.can_be_pulled(src)))
|
||||
if(!(AM.can_be_pulled(src, state, force)))
|
||||
return FALSE
|
||||
|
||||
// If we're pulling something then drop what we're currently pulling and pull this instead.
|
||||
if(pulling)
|
||||
if(gs==0)
|
||||
if(state == 0)
|
||||
stop_pulling()
|
||||
return FALSE
|
||||
// Are we trying to pull something we are already pulling? Then enter grab cycle and end.
|
||||
if(AM == pulling)
|
||||
grab_state = gs
|
||||
grab_state = state
|
||||
if(istype(AM,/mob/living))
|
||||
var/mob/living/AMob = AM
|
||||
AMob.grabbedby(src)
|
||||
@@ -142,13 +145,12 @@
|
||||
|
||||
pulling = AM
|
||||
AM.pulledby = src
|
||||
grab_state = gs
|
||||
|
||||
|
||||
grab_state = state
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
log_combat(src, M, "grabbed", addition="passive grab")
|
||||
visible_message("[src] has grabbed [M] passively.</span>")
|
||||
if(!supress_message)
|
||||
visible_message("<span class='warning'>[src] has grabbed [M] passively!</span>")
|
||||
return TRUE
|
||||
|
||||
//move character into tile whos grabbing you
|
||||
@@ -189,19 +191,21 @@
|
||||
|
||||
/atom/movable/proc/Move_Pulled(atom/A)
|
||||
if(!pulling)
|
||||
return
|
||||
return FALSE
|
||||
if(pulling.anchored || !pulling.Adjacent(src))
|
||||
stop_pulling()
|
||||
return
|
||||
return FALSE
|
||||
if(isliving(pulling))
|
||||
var/mob/living/L = pulling
|
||||
if(L.buckled && L.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it
|
||||
stop_pulling()
|
||||
return
|
||||
return FALSE
|
||||
if(A == loc && pulling.density)
|
||||
return
|
||||
if(!Process_Spacemove(get_dir(pulling.loc, A)))
|
||||
return
|
||||
return FALSE
|
||||
var/move_dir = get_dir(pulling.loc, A)
|
||||
if(!Process_Spacemove(move_dir))
|
||||
return FALSE
|
||||
pulling.Move(get_step(pulling.loc, move_dir), move_dir, glide_size)
|
||||
step(pulling, get_dir(pulling.loc, A))
|
||||
|
||||
|
||||
@@ -233,7 +237,7 @@
|
||||
// Here's where we rewrite how byond handles movement except slightly different
|
||||
// To be removed on step_ conversion
|
||||
// All this work to prevent a second bump
|
||||
/atom/movable/Move(atom/newloc, direct=0)
|
||||
/atom/movable/Move(atom/newloc, direct=0, glide_size_override = 0)
|
||||
. = FALSE
|
||||
if(!newloc || newloc == loc)
|
||||
return
|
||||
@@ -276,7 +280,7 @@
|
||||
//
|
||||
////////////////////////////////////////
|
||||
|
||||
/atom/movable/Move(atom/newloc, direct)
|
||||
/atom/movable/Move(atom/newloc, direct, glide_size_override = 0)
|
||||
var/atom/movable/pullee = pulling
|
||||
var/turf/T = loc
|
||||
if(pulling)
|
||||
@@ -289,6 +293,9 @@
|
||||
if(!loc || !newloc)
|
||||
return FALSE
|
||||
var/atom/oldloc = loc
|
||||
//Early override for some cases like diagonal movement
|
||||
if(glide_size_override)
|
||||
set_glide_size(glide_size_override)
|
||||
|
||||
if(loc != newloc)
|
||||
if (!(direct & (direct - 1))) //Cardinal move
|
||||
@@ -362,19 +369,32 @@
|
||||
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
|
||||
pulling.Move(T, get_dir(pulling, T), glide_size) //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()
|
||||
|
||||
//glide_size strangely enough can change mid movement animation and update correctly while the animation is playing
|
||||
//This means that if you don't override it late like this, it will just be set back by the movement update that's called when you move turfs.
|
||||
if(glide_size_override)
|
||||
set_glide_size(glide_size_override)
|
||||
|
||||
|
||||
|
||||
last_move = direct
|
||||
setDir(direct)
|
||||
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s)
|
||||
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob(s)
|
||||
return FALSE
|
||||
|
||||
/atom/movable/proc/set_glide_size(target = 8)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target)
|
||||
glide_size = target
|
||||
|
||||
for(var/atom/movable/AM in buckled_mobs)
|
||||
AM.set_glide_size(target)
|
||||
|
||||
//Called after a successful Move(). By this point, we've already moved
|
||||
/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced)
|
||||
@@ -547,17 +567,19 @@
|
||||
/atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
set waitfor = 0
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
|
||||
return hit_atom.hitby(src)
|
||||
return hit_atom.hitby(src, throwingdatum=throwingdatum)
|
||||
|
||||
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked)
|
||||
if(!anchored && hitpush)
|
||||
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum)
|
||||
if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO))))
|
||||
step(src, AM.dir)
|
||||
..()
|
||||
|
||||
/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback)
|
||||
return throw_at(target, range, speed, thrower, spin, diagonals_first, callback)
|
||||
/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE)
|
||||
if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY))
|
||||
return
|
||||
return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, messy_throw)
|
||||
|
||||
/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.
|
||||
/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE) //If this returns FALSE then callback will not be called.
|
||||
. = FALSE
|
||||
if (!target || speed <= 0)
|
||||
return
|
||||
@@ -603,6 +625,7 @@
|
||||
TT.speed = speed
|
||||
TT.thrower = thrower
|
||||
TT.diagonals_first = diagonals_first
|
||||
TT.force = force
|
||||
TT.callback = callback
|
||||
|
||||
var/dist_x = abs(target.x - src.x)
|
||||
@@ -640,16 +663,32 @@
|
||||
SSthrowing.currentrun[src] = TT
|
||||
TT.tick()
|
||||
|
||||
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
|
||||
/atom/movable/proc/handle_buckled_mob_movement(newloc, direct, glide_size_override)
|
||||
for(var/m in buckled_mobs)
|
||||
var/mob/living/buckled_mob = m
|
||||
if(!buckled_mob.Move(newloc, direct))
|
||||
if(!buckled_mob.Move(newloc, direct, glide_size_override))
|
||||
forceMove(buckled_mob.loc)
|
||||
last_move = buckled_mob.last_move
|
||||
inertia_dir = last_move
|
||||
buckled_mob.inertia_dir = last_move
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
|
||||
return FALSE
|
||||
|
||||
/atom/movable/proc/force_push(atom/movable/AM, force = move_force, direction, silent = FALSE)
|
||||
. = AM.force_pushed(src, force, direction)
|
||||
if(!silent && .)
|
||||
visible_message("<span class='warning'>[src] forcefully pushes against [AM]!</span>", "<span class='warning'>You forcefully push against [AM]!</span>")
|
||||
|
||||
/atom/movable/proc/move_crush(atom/movable/AM, force = move_force, direction, silent = FALSE)
|
||||
. = AM.move_crushed(src, force, direction)
|
||||
if(!silent && .)
|
||||
visible_message("<span class='danger'>[src] crushes past [AM]!</span>", "<span class='danger'>You crush [AM]!</span>")
|
||||
|
||||
/atom/movable/proc/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
|
||||
return FALSE
|
||||
|
||||
/atom/movable/CanPass(atom/movable/mover, turf/target)
|
||||
if(mover in buckled_mobs)
|
||||
@@ -870,14 +909,15 @@
|
||||
/atom/movable/proc/get_cell()
|
||||
return
|
||||
|
||||
/atom/movable/proc/can_be_pulled(user)
|
||||
/atom/movable/proc/can_be_pulled(user, grab_state, force)
|
||||
if(src == user || !isturf(loc))
|
||||
return FALSE
|
||||
if(anchored || throwing)
|
||||
return FALSE
|
||||
if(force < (move_resist * MOVE_FORCE_PULL_RATIO))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/proc/do_pickup_animation(atom/target)
|
||||
set waitfor = FALSE
|
||||
if(!istype(loc, /turf))
|
||||
|
||||
@@ -145,9 +145,9 @@
|
||||
C.throw_mode_on() //so they can catch it on the return.
|
||||
return ..()
|
||||
|
||||
/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom)
|
||||
/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
if(active)
|
||||
var/caught = hit_atom.hitby(src, 0, 0)
|
||||
var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum)
|
||||
if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it
|
||||
GET_COMPONENT(slipper, /datum/component/slippery)
|
||||
slipper.Slip(hit_atom)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/list/living_antags = list()
|
||||
var/list/dead_players = list()
|
||||
var/list/list_observers = list()
|
||||
var/list/ghost_eligible = list()
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts
|
||||
weight = 0
|
||||
@@ -32,10 +33,10 @@
|
||||
// So for example you can get the list of all current dead players with var/list/dead_players = candidates[CURRENT_DEAD_PLAYERS]
|
||||
// Make sure to properly typecheck the mobs in those lists, as the dead_players list could contain ghosts, or dead players still in their bodies.
|
||||
// We're still gonna trim the obvious (mobs without clients, jobbanned players, etc)
|
||||
living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS])
|
||||
living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS])
|
||||
dead_players = trim_list(mode.current_players[CURRENT_DEAD_PLAYERS])
|
||||
list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS])
|
||||
living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS])
|
||||
living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS])
|
||||
list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS])
|
||||
ghost_eligible = trim_list(get_all_ghost_role_eligible())
|
||||
|
||||
/datum/dynamic_ruleset/midround/proc/trim_list(list/L = list())
|
||||
var/list/trimmed_list = L.Copy()
|
||||
@@ -65,6 +66,25 @@
|
||||
continue
|
||||
return trimmed_list
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/trim_list(list/L = list())
|
||||
var/list/trimmed_list = L.Copy()
|
||||
for(var/mob/M in trimmed_list)
|
||||
if (!M.client) // Are they connected?
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
if(!mode.check_age(M.client, minimum_required_age))
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
if(antag_flag_override)
|
||||
if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override))
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
else
|
||||
if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag))
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
return trimmed_list
|
||||
|
||||
// You can then for example prompt dead players in execute() to join as strike teams or whatever
|
||||
// Or autotator someone
|
||||
|
||||
@@ -85,15 +105,16 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/execute()
|
||||
var/list/possible_candidates = list()
|
||||
possible_candidates.Add(dead_players)
|
||||
possible_candidates.Add(list_observers)
|
||||
send_applications(possible_candidates)
|
||||
if(assigned.len > 0)
|
||||
return TRUE
|
||||
else
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/ready(forced = FALSE)
|
||||
if (required_candidates > ghost_eligible.len)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/execute()
|
||||
var/application_successful = send_applications(ghost_eligible)
|
||||
return assigned.len > 0 && application_successful
|
||||
|
||||
/// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset.
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/proc/send_applications(list/possible_volunteers = list())
|
||||
@@ -599,4 +620,4 @@
|
||||
|
||||
|
||||
#undef ABDUCTOR_MAX_TEAMS
|
||||
#undef REVENANT_SPAWN_THRESHOLD
|
||||
#undef REVENANT_SPAWN_THRESHOLD
|
||||
|
||||
@@ -167,7 +167,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
/obj/effect/meteor/examine(mob/user)
|
||||
if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user))
|
||||
SSmedals.UnlockMedal(MEDAL_METEOR, user.client)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/effect/meteor/attackby(obj/item/I, mob/user, params)
|
||||
if(I.tool_behaviour == TOOL_MINING)
|
||||
|
||||
@@ -416,9 +416,17 @@ GLOBAL_LIST_EMPTY(possible_items)
|
||||
for(var/datum/mind/M in owners)
|
||||
if(M.current.mind.assigned_role in possible_item.excludefromjob)
|
||||
continue check_items
|
||||
approved_targets += possible_item
|
||||
if(extraSanityCheck(possible_item.targetitem))
|
||||
approved_targets += possible_item
|
||||
return set_target(safepick(approved_targets))
|
||||
|
||||
/datum/objective/steal/proc/extraSanityCheck(objectiveitem)
|
||||
if(objectiveitem == /obj/item/aicard) //Is the item an AI card? (Steal a functional AI)
|
||||
var/list/ais = active_ais() //Check if we have active AIs.
|
||||
if(!ais.len)
|
||||
return FALSE //No AIs, returns false, disallowing the AI card objective from being added to the approved target list
|
||||
return TRUE //All checks successful, add this item to the approved target list
|
||||
|
||||
/datum/objective/steal/proc/set_target(datum/objective_item/item)
|
||||
if(item)
|
||||
targetinfo = item
|
||||
@@ -875,6 +883,3 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads
|
||||
explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead"
|
||||
command_staff_only = TRUE
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -100,6 +100,10 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/sleeper/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Alt-click [src] to [state_open ? "close" : "open"] it.</span>"
|
||||
|
||||
/obj/machinery/sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
|
||||
|
||||
|
||||
@@ -444,22 +444,22 @@ Class Procs:
|
||||
to_chat(user, "<span class='notice'>[icon2html(C, user)] \A [C].</span>")
|
||||
|
||||
/obj/machinery/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(stat & BROKEN)
|
||||
to_chat(user, "<span class='notice'>It looks broken and non-functional.</span>")
|
||||
. += "<span class='notice'>It looks broken and non-functional.</span>"
|
||||
if(!(resistance_flags & INDESTRUCTIBLE))
|
||||
if(resistance_flags & ON_FIRE)
|
||||
to_chat(user, "<span class='warning'>It's on fire!</span>")
|
||||
. += "<span class='warning'>It's on fire!</span>"
|
||||
var/healthpercent = (obj_integrity/max_integrity) * 100
|
||||
switch(healthpercent)
|
||||
if(50 to 99)
|
||||
to_chat(user, "It looks slightly damaged.")
|
||||
. += "It looks slightly damaged."
|
||||
if(25 to 50)
|
||||
to_chat(user, "It appears heavily damaged.")
|
||||
. += "It appears heavily damaged."
|
||||
if(0 to 25)
|
||||
to_chat(user, "<span class='warning'>It's falling apart!</span>")
|
||||
. += "<span class='warning'>It's falling apart!</span>"
|
||||
if(user.research_scanner && component_parts)
|
||||
display_parts(user)
|
||||
. += display_parts(user, TRUE)
|
||||
|
||||
//called on machinery construction (i.e from frame to machinery) but not on initialization
|
||||
/obj/machinery/proc/on_construction()
|
||||
@@ -493,3 +493,8 @@ Class Procs:
|
||||
. = . % 9
|
||||
AM.pixel_x = -8 + ((.%3)*8)
|
||||
AM.pixel_y = -8 + (round( . / 3)*8)
|
||||
|
||||
/obj/machinery/CanPass(atom/movable/mover, turf/target)
|
||||
. = ..()
|
||||
if(istype(mover) && (mover.pass_flags & PASSMACHINES))
|
||||
return TRUE
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
req_access = list(ACCESS_AI_UPLOAD)
|
||||
|
||||
/obj/machinery/ai_slipper/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It has <b>[uses]</b> uses of foam remaining.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>It has <b>[uses]</b> uses of foam remaining.</span>"
|
||||
|
||||
/obj/machinery/ai_slipper/power_change()
|
||||
if(stat & BROKEN)
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi')
|
||||
|
||||
/obj/machinery/aug_manipulator/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(storedpart)
|
||||
to_chat(user, "<span class='notice'>Alt-click to eject the limb.</span>")
|
||||
. += "<span class='notice'>Alt-click to eject the limb.</span>"
|
||||
|
||||
/obj/machinery/aug_manipulator/Initialize()
|
||||
initial_icon_state = initial(icon_state)
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
add_overlay("ccharger-o[newlevel]")
|
||||
|
||||
/obj/machinery/cell_charger/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
|
||||
. = ..()
|
||||
. += "There's [charging ? "a" : "no"] cell in the charger."
|
||||
if(charging)
|
||||
to_chat(user, "Current charge: [round(charging.percent(), 1)]%.")
|
||||
. += "Current charge: [round(charging.percent(), 1)]%."
|
||||
|
||||
/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/stock_parts/cell) && !panel_open)
|
||||
|
||||
@@ -95,20 +95,20 @@
|
||||
to_chat(user, "<span class='notice'>You flip the write-protect tab to [read_only ? "protected" : "unprotected"].</span>")
|
||||
|
||||
/obj/item/disk/data/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
|
||||
. = ..()
|
||||
. += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]."
|
||||
|
||||
|
||||
//Clonepod
|
||||
|
||||
/obj/machinery/clonepod/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mess)
|
||||
to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...")
|
||||
. += "It's filled with blood and viscera. You swear you can see it moving..."
|
||||
if(is_operational() && mob_occupant)
|
||||
if(mob_occupant.stat != DEAD)
|
||||
to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
|
||||
. += "Current clone cycle is [round(get_completion())]% complete."
|
||||
|
||||
/obj/machinery/clonepod/return_air()
|
||||
// We want to simulate the clone not being in contact with
|
||||
|
||||
@@ -760,13 +760,13 @@
|
||||
var/active = 0 //if the ship is on
|
||||
|
||||
/obj/item/orion_ship/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(!(in_range(user, src)))
|
||||
return
|
||||
if(!active)
|
||||
to_chat(user, "<span class='notice'>There's a little switch on the bottom. It's flipped down.</span>")
|
||||
. += "<span class='notice'>There's a little switch on the bottom. It's flipped down.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's a little switch on the bottom. It's flipped up.</span>")
|
||||
. += "<span class='notice'>There's a little switch on the bottom. It's flipped up.</span>"
|
||||
|
||||
/obj/item/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse
|
||||
if(active)
|
||||
|
||||
@@ -46,9 +46,9 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
|
||||
/obj/machinery/computer/card/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(scan || modify)
|
||||
to_chat(user, "<span class='notice'>Alt-click to eject the ID card.</span>")
|
||||
. += "<span class='notice'>Alt-click to eject the ID card.</span>"
|
||||
|
||||
/obj/machinery/computer/card/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -99,11 +99,11 @@
|
||||
stored_research = SSresearch.science_tech
|
||||
|
||||
/obj/machinery/computer/scan_consolenew/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(jokerready < world.time)
|
||||
to_chat(user, "<span class='notice'>JOKER algorithm available.</span>")
|
||||
. += "<span class='notice'>JOKER algorithm available.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>JOKER algorithm available in about [round(0.00166666667 * (jokerready - world.time))] minutes.")
|
||||
. += "<span class='notice'>JOKER algorithm available in about [round(0.00166666667 * (jokerready - world.time))] minutes."
|
||||
|
||||
/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, last_change)
|
||||
. = ..()
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
light_color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/machinery/computer/secure_data/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(scan)
|
||||
to_chat(user, "<span class='notice'>Alt-click to eject the ID card.</span>")
|
||||
. += "<span class='notice'>Alt-click to eject the ID card.</span>"
|
||||
|
||||
/obj/machinery/computer/secure_data/syndie
|
||||
icon_keyboard = "syndie_key"
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
var/state = 1
|
||||
|
||||
/obj/structure/frame/examine(user)
|
||||
..()
|
||||
. = ..()
|
||||
if(circuit)
|
||||
to_chat(user, "It has \a [circuit] installed.")
|
||||
. += "It has \a [circuit] installed."
|
||||
|
||||
|
||||
/obj/structure/frame/deconstruct(disassembled = TRUE)
|
||||
@@ -29,7 +29,7 @@
|
||||
var/list/req_component_names = null // user-friendly names of components
|
||||
|
||||
/obj/structure/frame/machine/examine(user)
|
||||
..()
|
||||
. = ..()
|
||||
if(state == 3 && req_components && req_component_names)
|
||||
var/hasContent = 0
|
||||
var/requires = "It requires"
|
||||
@@ -44,9 +44,9 @@
|
||||
hasContent = 1
|
||||
|
||||
if(hasContent)
|
||||
to_chat(user, requires + ".")
|
||||
. += requires + "."
|
||||
else
|
||||
to_chat(user, "It does not require any more components.")
|
||||
. += "It does not require any more components."
|
||||
|
||||
/obj/structure/frame/machine/proc/update_namelist()
|
||||
if(!req_components)
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/defibrillator_mount/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(defib)
|
||||
to_chat(user, "<span class='notice'>There is a defib unit hooked up. Alt-click to remove it.<span>")
|
||||
. += "<span class='notice'>There is a defib unit hooked up. Alt-click to remove it.<span>"
|
||||
if(GLOB.security_level >= SEC_LEVEL_RED)
|
||||
to_chat(user, "<span class='notice'>Due to a security situation, its locking clamps can be toggled by swiping any ID.</span>")
|
||||
. += "<span class='notice'>Due to a security situation, its locking clamps can be toggled by swiping any ID.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.</span>")
|
||||
. += "<span class='notice'>Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.</span>"
|
||||
|
||||
/obj/machinery/defibrillator_mount/process()
|
||||
if(defib && defib.cell && defib.cell.charge < defib.cell.maxcharge && is_operational())
|
||||
|
||||
@@ -148,8 +148,8 @@
|
||||
var/mode = SINGLE
|
||||
|
||||
/obj/item/grenade/barrier/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to toggle modes.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>Alt-click to toggle modes.</span>"
|
||||
|
||||
/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/dish_drive/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(user.Adjacent(src))
|
||||
to_chat(user, "<span class='notice'>Alt-click it to beam its contents to any nearby disposal bins.</span>")
|
||||
. += "<span class='notice'>Alt-click it to beam its contents to any nearby disposal bins.</span>"
|
||||
|
||||
/obj/machinery/dish_drive/attack_hand(mob/living/user)
|
||||
if(!contents.len)
|
||||
|
||||
@@ -639,47 +639,47 @@
|
||||
update_icon(AIRLOCK_CLOSED)
|
||||
|
||||
/obj/machinery/door/airlock/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<span class='warning'>Its access panel is smoking slightly.</span>")
|
||||
. += "<span class='warning'>Its access panel is smoking slightly.</span>"
|
||||
if(charge && !panel_open && in_range(user, src))
|
||||
to_chat(user, "<span class='warning'>The maintenance panel seems haphazardly fastened.</span>")
|
||||
. += "<span class='warning'>The maintenance panel seems haphazardly fastened.</span>"
|
||||
if(charge && panel_open)
|
||||
to_chat(user, "<span class='warning'>Something is wired up to the airlock's electronics!</span>")
|
||||
. += "<span class='warning'>Something is wired up to the airlock's electronics!</span>"
|
||||
if(note)
|
||||
if(!in_range(user, src))
|
||||
to_chat(user, "There's a [note.name] pinned to the front. You can't read it from here.")
|
||||
. += "There's a [note.name] pinned to the front. You can't read it from here."
|
||||
else
|
||||
to_chat(user, "There's a [note.name] pinned to the front...")
|
||||
note.examine(user)
|
||||
. += "There's a [note.name] pinned to the front..."
|
||||
. += note.examine(user)
|
||||
|
||||
if(panel_open)
|
||||
switch(security_level)
|
||||
if(AIRLOCK_SECURITY_NONE)
|
||||
to_chat(user, "Its wires are exposed!")
|
||||
. += "Its wires are exposed!"
|
||||
if(AIRLOCK_SECURITY_METAL)
|
||||
to_chat(user, "Its wires are hidden behind a welded metal cover.")
|
||||
. += "Its wires are hidden behind a welded metal cover."
|
||||
if(AIRLOCK_SECURITY_PLASTEEL_I_S)
|
||||
to_chat(user, "There is some shredded plasteel inside.")
|
||||
. += "There is some shredded plasteel inside."
|
||||
if(AIRLOCK_SECURITY_PLASTEEL_I)
|
||||
to_chat(user, "Its wires are behind an inner layer of plasteel.")
|
||||
. += "Its wires are behind an inner layer of plasteel."
|
||||
if(AIRLOCK_SECURITY_PLASTEEL_O_S)
|
||||
to_chat(user, "There is some shredded plasteel inside.")
|
||||
. += "There is some shredded plasteel inside."
|
||||
if(AIRLOCK_SECURITY_PLASTEEL_O)
|
||||
to_chat(user, "There is a welded plasteel cover hiding its wires.")
|
||||
. += "There is a welded plasteel cover hiding its wires."
|
||||
if(AIRLOCK_SECURITY_PLASTEEL)
|
||||
to_chat(user, "There is a protective grille over its panel.")
|
||||
. += "There is a protective grille over its panel."
|
||||
else if(security_level)
|
||||
if(security_level == AIRLOCK_SECURITY_METAL)
|
||||
to_chat(user, "It looks a bit stronger.")
|
||||
. += "It looks a bit stronger."
|
||||
else
|
||||
to_chat(user, "It looks very robust.")
|
||||
. += "It looks very robust."
|
||||
|
||||
if(issilicon(user) && (!stat & BROKEN))
|
||||
to_chat(user, "<span class='notice'>Shift-click [src] to [ density ? "open" : "close"] it.</span>")
|
||||
to_chat(user, "<span class='notice'>Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.</span>")
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>")
|
||||
to_chat(user, "<span class='notice'>Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access.</span>")
|
||||
. += "<span class='notice'>Shift-click [src] to [ density ? "open" : "close"] it.</span>"
|
||||
. += "<span class='notice'>Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.</span>"
|
||||
. += "<span class='notice'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>"
|
||||
. += "<span class='notice'>Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access.</span>"
|
||||
|
||||
/obj/machinery/door/airlock/attack_ai(mob/user)
|
||||
if(!src.canAIControl(user))
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
var/unres_sides = 0 //unrestricted sides, or sides of the airlock that will open regardless of access
|
||||
|
||||
/obj/item/electronics/airlock/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Has a neat <i>selection menu</i> for modifying airlock access levels.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>Has a neat <i>selection menu</i> for modifying airlock access levels.</span>"
|
||||
|
||||
/obj/item/electronics/airlock/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
|
||||
|
||||
@@ -584,14 +584,12 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/airlock/clockwork/examine(mob/user)
|
||||
..()
|
||||
var/gear_text = "The cogwheel is flickering and twisting wildly. Report this to a coder."
|
||||
. = ..()
|
||||
switch(construction_state)
|
||||
if(GEAR_SECURE)
|
||||
gear_text = "<span class='brass'>The cogwheel is solidly <b>wrenched</b> to the brass around it.</span>"
|
||||
. += "<span class='brass'>The cogwheel is solidly <b>wrenched</b> to the brass around it.</span>"
|
||||
if(GEAR_LOOSE)
|
||||
gear_text = "<span class='alloy'>The cogwheel has been <i>loosened</i>, but remains <b>connected loosely</b> to the door!</span>"
|
||||
to_chat(user, gear_text)
|
||||
. += "<span class='alloy'>The cogwheel has been <i>loosened</i>, but remains <b>connected loosely</b> to the door!</span>"
|
||||
|
||||
/obj/machinery/door/airlock/clockwork/emp_act(severity)
|
||||
if(prob(80/severity))
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon_state = "door1"
|
||||
opacity = 1
|
||||
density = TRUE
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
layer = OPEN_DOOR_LAYER
|
||||
power_channel = ENVIRON
|
||||
max_integrity = 350
|
||||
@@ -37,14 +38,14 @@
|
||||
var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access
|
||||
|
||||
/obj/machinery/door/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(red_alert_access)
|
||||
if(GLOB.security_level >= SEC_LEVEL_RED)
|
||||
to_chat(user, "<span class='notice'>Due to a security threat, its access requirements have been lifted!</span>")
|
||||
. += "<span class='notice'>Due to a security threat, its access requirements have been lifted!</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>In the event of a red alert, its access requirements will automatically lift.</span>")
|
||||
. += "<span class='notice'>In the event of a red alert, its access requirements will automatically lift.</span>"
|
||||
if(!poddoor)
|
||||
to_chat(user, "<span class='notice'>Its maintenance panel is <b>screwed</b> in place.</span>")
|
||||
. += "<span class='notice'>Its maintenance panel is <b>screwed</b> in place.</span>"
|
||||
|
||||
/obj/machinery/door/check_access_list(list/access_list)
|
||||
if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED)
|
||||
@@ -121,6 +122,8 @@
|
||||
/obj/machinery/door/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && (mover.pass_flags & PASSGLASS))
|
||||
return !opacity
|
||||
if(istype(mover) && (mover.pass_flags & PASSDOOR))
|
||||
return !opacity
|
||||
return !density
|
||||
|
||||
/obj/machinery/door/proc/bumpopen(mob/user)
|
||||
|
||||
@@ -32,15 +32,15 @@
|
||||
CalculateAffectingAreas()
|
||||
|
||||
/obj/machinery/door/firedoor/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(!density)
|
||||
to_chat(user, "<span class='notice'>It is open, but could be <b>pried</b> closed.</span>")
|
||||
. += "<span class='notice'>It is open, but could be <b>pried</b> closed.</span>"
|
||||
else if(!welded)
|
||||
to_chat(user, "<span class='notice'>It is closed, but could be <i>pried</i> open. Deconstruction would require it to be <b>welded</b> shut.</span>")
|
||||
. += "<span class='notice'>It is closed, but could be <i>pried</i> open. Deconstruction would require it to be <b>welded</b> shut.</span>"
|
||||
else if(boltslocked)
|
||||
to_chat(user, "<span class='notice'>It is <i>welded</i> shut. The floor bolts have been locked by <b>screws</b>.</span>")
|
||||
. += "<span class='notice'>It is <i>welded</i> shut. The floor bolts have been locked by <b>screws</b>.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The bolt locks have been <i>unscrewed</i>, but the bolts themselves are still <b>wrenched</b> to the floor.</span>")
|
||||
. += "<span class='notice'>The bolt locks have been <i>unscrewed</i>, but the bolts themselves are still <b>wrenched</b> to the floor.</span>"
|
||||
|
||||
/obj/machinery/door/firedoor/proc/CalculateAffectingAreas()
|
||||
remove_from_areas()
|
||||
@@ -270,18 +270,18 @@
|
||||
var/reinforced = 0
|
||||
|
||||
/obj/structure/firelock_frame/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
switch(constructionStep)
|
||||
if(CONSTRUCTION_PANEL_OPEN)
|
||||
to_chat(user, "<span class='notice'>It is <i>unbolted</i> from the floor. A small <b>loosely connected</b> metal plate is covering the wires.</span>")
|
||||
. += "<span class='notice'>It is <i>unbolted</i> from the floor. A small <b>loosely connected</b> metal plate is covering the wires.</span>"
|
||||
if(!reinforced)
|
||||
to_chat(user, "<span class='notice'>It could be reinforced with plasteel.</span>")
|
||||
. += "<span class='notice'>It could be reinforced with plasteel.</span>"
|
||||
if(CONSTRUCTION_WIRES_EXPOSED)
|
||||
to_chat(user, "<span class='notice'>The maintenance plate has been <i>pried away</i>, and <b>wires</b> are trailing.</span>")
|
||||
. += "<span class='notice'>The maintenance plate has been <i>pried away</i>, and <b>wires</b> are trailing.</span>"
|
||||
if(CONSTRUCTION_GUTTED)
|
||||
to_chat(user, "<span class='notice'>The maintenance panel is missing <i>wires</i> and the circuit board is <b>loosely connected</b>.</span>")
|
||||
. += "<span class='notice'>The maintenance panel is missing <i>wires</i> and the circuit board is <b>loosely connected</b>.</span>"
|
||||
if(CONSTRUCTION_NOCIRCUIT)
|
||||
to_chat(user, "<span class='notice'>There are no <i>firelock electronics</i> in the frame. The frame could be <b>cut</b> apart.</span>")
|
||||
. += "<span class='notice'>There are no <i>firelock electronics</i> in the frame. The frame could be <b>cut</b> apart.</span>"
|
||||
|
||||
/obj/structure/firelock_frame/update_icon()
|
||||
..()
|
||||
|
||||
@@ -1,13 +1,70 @@
|
||||
/obj/machinery/door/poddoor/shutters
|
||||
gender = PLURAL
|
||||
name = "shutters"
|
||||
desc = "Heavy duty metal shutters that open mechanically."
|
||||
desc = "Mechanical metal shutters operated by a button with a magnetic seal, keeping them airtight."
|
||||
icon = 'icons/obj/doors/shutters.dmi'
|
||||
layer = SHUTTER_LAYER
|
||||
closingLayer = SHUTTER_LAYER
|
||||
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70)
|
||||
damage_deflection = 20
|
||||
max_integrity = 100
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/preopen
|
||||
icon_state = "open"
|
||||
density = FALSE
|
||||
opacity = 0
|
||||
|
||||
// The below shutters are the original ones from the TG codebase. They are remaining as "secure" shutters. If anyone wants to improve their animation, feel free.
|
||||
// The original shutters are now shutters_old.dmi; copy the naming format of the files into new a new .dmi to add new shutters that work with the poddoor code for animating the doors.
|
||||
// Originally, the shutters were reskins of blast doors. Eighty hits with the Cap's sabre to destroy one shutter is far too powerful considering shutters cannot be deconstructed (yet).
|
||||
// If you're a mapper and want super strong shutter, use the 'old' ones.
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/old
|
||||
name = "strong shutters"
|
||||
desc = "These shutters have an armoured frame; it looks like plasteel. These shutters look robust enough to survive explosions."
|
||||
icon = 'icons/obj/doors/shutters_old.dmi'
|
||||
icon_state = "closed"
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 75, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70)
|
||||
max_integrity = 300
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/old/preopen
|
||||
icon_state = "open"
|
||||
density = FALSE
|
||||
opacity = 0
|
||||
|
||||
// End of old shutter stuff. Credit for the old shutter sprites to TG.
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/radiation
|
||||
name = "radiation shutters"
|
||||
desc = "Lead-lined shutters painted yellow with a radioactive hazard symbol on it. Blocks out most radiation"
|
||||
icon = 'icons/obj/doors/shutters_radiation.dmi'
|
||||
icon_state = "closed"
|
||||
rad_insulation = 0.2
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/radiation/preopen
|
||||
icon_state = "open"
|
||||
density = FALSE
|
||||
opacity = 0
|
||||
rad_insulation = 1
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/radiation/do_animate(animation)
|
||||
..()
|
||||
switch(animation)
|
||||
if("opening")
|
||||
rad_insulation = 1
|
||||
if("closing")
|
||||
rad_insulation = -0.5
|
||||
|
||||
// A 3x3 N2 SM setup won't irradiate you if you're behind the shutter at -0.9 insulation. If it starts to delam, it'll start irradiating you slowly. Keep the value between -0.1 to -0.9
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/window
|
||||
name = "windowed shutters"
|
||||
desc = "Mechanical shutters that have some form of plastic window in them, allowing you to see through the shutters at all times."
|
||||
icon = 'icons/obj/doors/shutters_window.dmi'
|
||||
icon_state = "closed"
|
||||
opacity = 0
|
||||
glass = 1
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/window/preopen
|
||||
icon_state = "open"
|
||||
density = FALSE
|
||||
|
||||
@@ -22,8 +22,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/doppler_array/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>"
|
||||
|
||||
/obj/machinery/doppler_array/process()
|
||||
return PROCESS_KILL
|
||||
@@ -146,4 +146,4 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
|
||||
/obj/machinery/doppler_array/research/science/Initialize()
|
||||
. = ..()
|
||||
linked_techweb = SSresearch.science_tech
|
||||
linked_techweb = SSresearch.science_tech
|
||||
|
||||
@@ -129,9 +129,9 @@
|
||||
break_message = "slowly falls dark, lights stuttering."
|
||||
|
||||
/obj/machinery/droneDispenser/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if((mode == DRONE_RECHARGING) && !stat && recharging_text)
|
||||
to_chat(user, "<span class='warning'>[recharging_text]</span>")
|
||||
. += "<span class='warning'>[recharging_text]</span>"
|
||||
|
||||
/obj/machinery/droneDispenser/power_change()
|
||||
..()
|
||||
|
||||
@@ -196,8 +196,8 @@
|
||||
var/id = null
|
||||
|
||||
/obj/item/wallframe/flasher/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Its channel ID is '[id]'.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>Its channel ID is '[id]'.</span>"
|
||||
|
||||
/obj/item/wallframe/flasher/after_attach(var/obj/O)
|
||||
..()
|
||||
|
||||
@@ -181,10 +181,10 @@
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/harvester/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
if(state_open)
|
||||
to_chat(user, "<span class='notice'>[src] must be closed before harvesting.</span>")
|
||||
. += "<span class='notice'>[src] must be closed before harvesting.</span>"
|
||||
else if(!harvesting)
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to start harvesting.</span>")
|
||||
. += "<span class='notice'>Alt-click [src] to start harvesting.</span>"
|
||||
@@ -201,21 +201,19 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/iv_drip/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(get_dist(user, src) > 2)
|
||||
return
|
||||
|
||||
to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].")
|
||||
|
||||
. += "[src] is [mode ? "injecting" : "taking blood"].\n"
|
||||
if(beaker)
|
||||
if(beaker.reagents && beaker.reagents.reagent_list.len)
|
||||
to_chat(user, "<span class='notice'>Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.</span>")
|
||||
. += "\t<span class='notice'>Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.</span>\n"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Attached is an empty [beaker.name].</span>")
|
||||
. += "\t<span class='notice'>Attached is an empty [beaker.name].</span>\n"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>No chemicals are attached.</span>")
|
||||
. += "\t<span class='notice'>No chemicals are attached.</span>\n"
|
||||
|
||||
to_chat(user, "<span class='notice'>[attached ? attached : "No one"] is attached.</span>")
|
||||
. += "\t<span class='notice'>[attached ? attached : "No one"] is attached.</span>"
|
||||
|
||||
#undef IV_TAKING
|
||||
#undef IV_INJECTING
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
icon_state = "light0"
|
||||
|
||||
/obj/machinery/light_switch/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "It is [on? "on" : "off"].")
|
||||
. = ..()
|
||||
. += "It is [on? "on" : "off"]."
|
||||
|
||||
/obj/machinery/light_switch/interact(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -815,10 +815,10 @@
|
||||
T.cp = src
|
||||
|
||||
/obj/machinery/turretid/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(issilicon(user) && (!stat & BROKEN))
|
||||
to_chat(user, "<span class='notice'>Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.</span>")
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].</span>")
|
||||
. += "<span class='notice'>Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.</span>"
|
||||
. += "<span class='notice'>Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].</span>"
|
||||
|
||||
/obj/machinery/turretid/attackby(obj/item/I, mob/user, params)
|
||||
if(stat & BROKEN)
|
||||
|
||||
@@ -8,41 +8,32 @@
|
||||
power_channel = ENVIRON
|
||||
idle_power_usage = 0
|
||||
active_power_usage = 0
|
||||
max_integrity = 150
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
anchored = FALSE
|
||||
density = FALSE
|
||||
CanAtmosPass = ATMOS_PASS_YES
|
||||
var/state = 1
|
||||
stat = 1
|
||||
var/buildstacktype = /obj/item/stack/sheet/metal
|
||||
var/buildstackamount = 10
|
||||
/*
|
||||
1 = Wrenched in place
|
||||
2 = Welded in place
|
||||
3 = Wires attached to it
|
||||
3 = Wires attached to it, this makes it change to the full thing.
|
||||
*/
|
||||
|
||||
/obj/machinery/fan_assembly/Initialize(mapload, ndir, building)
|
||||
. = ..()
|
||||
if(building)
|
||||
setDir(ndir)
|
||||
|
||||
/obj/machinery/fan_assembly/Destroy()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/fan_assembly/attackby(obj/item/W, mob/living/user, params)
|
||||
switch(state)
|
||||
switch(stat)
|
||||
if(1)
|
||||
// State 1
|
||||
// Stat 1
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
if(weld(W, user))
|
||||
to_chat(user, "<span class='notice'>You weld the fan assembly securely into place.</span>")
|
||||
setAnchored(TRUE)
|
||||
state = 2
|
||||
update_icon()
|
||||
stat = 2
|
||||
update_icon_state()
|
||||
return
|
||||
if(2)
|
||||
// State 2
|
||||
// Stat 2
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
if(!W.tool_start_check(user, amount=2))
|
||||
to_chat(user, "<span class='warning'>You need two lengths of cable to wire the fan assembly!</span>")
|
||||
@@ -50,7 +41,7 @@
|
||||
to_chat(user, "<span class='notice'>You start to add wires to the assembly...</span>")
|
||||
if(W.use_tool(src, user, 30, volume=50, amount=2))
|
||||
to_chat(user, "<span class='notice'>You add wires to the fan assembly.</span>")
|
||||
state = 3
|
||||
stat = 3
|
||||
var/obj/machinery/poweredfans/F = new(loc, src)
|
||||
forceMove(F)
|
||||
F.setDir(src.dir)
|
||||
@@ -58,14 +49,14 @@
|
||||
else if(istype(W, /obj/item/weldingtool))
|
||||
if(weld(W, user))
|
||||
to_chat(user, "<span class='notice'>You unweld the fan assembly from its place.</span>")
|
||||
state = 1
|
||||
update_icon()
|
||||
stat = 1
|
||||
update_icon_state()
|
||||
setAnchored(FALSE)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/fan_assembly/wrench_act(mob/user, obj/item/I)
|
||||
if(state != 1)
|
||||
if(stat != 1)
|
||||
return FALSE
|
||||
user.visible_message("<span class='warning'>[user] disassembles [src].</span>",
|
||||
"<span class='notice'>You start to disassemble [src]...</span>", "You hear wrenching noises.")
|
||||
@@ -76,7 +67,7 @@
|
||||
/obj/machinery/fan_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user)
|
||||
if(!W.tool_start_check(user, amount=0))
|
||||
return FALSE
|
||||
switch(state)
|
||||
switch(stat)
|
||||
if(1)
|
||||
to_chat(user, "<span class='notice'>You start to weld \the [src]...</span>")
|
||||
if(2)
|
||||
@@ -91,11 +82,8 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/fan_assembly/examine(mob/user)
|
||||
..()
|
||||
deconstruction_hints(user)
|
||||
|
||||
/obj/machinery/fan_assembly/proc/deconstruction_hints(mob/user)
|
||||
switch(state)
|
||||
. = ..()
|
||||
switch(stat)
|
||||
if(1)
|
||||
to_chat(user, "<span class='notice'>The fan assembly seems to be <b>unwelded</b> and loose.</span>")
|
||||
if(2)
|
||||
@@ -103,8 +91,9 @@
|
||||
if(3)
|
||||
to_chat(user, "<span class='notice'>The outer plating is <b>wired</b> firmly in place.</span>")
|
||||
|
||||
/obj/machinery/fan_assembly/update_icon()
|
||||
switch(state)
|
||||
/obj/machinery/fan_assembly/update_icon_state()
|
||||
. = ..()
|
||||
switch(stat)
|
||||
if(1)
|
||||
icon_state = "mfan_assembly"
|
||||
if(2)
|
||||
|
||||
@@ -4,27 +4,26 @@
|
||||
name = "micro powered fan"
|
||||
desc = "A handmade fan, releasing a thin gust of air."
|
||||
use_power = ACTIVE_POWER_USE
|
||||
power_channel = ENVIRON
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 10
|
||||
max_integrity = 150
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
CanAtmosPass = ATMOS_PASS_NO
|
||||
var/obj/machinery/fan_assembly/assembly = null
|
||||
var/obj/machinery/fan_assembly/assembly
|
||||
|
||||
/obj/machinery/poweredfans/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(disassembled)
|
||||
if(!assembly)
|
||||
assembly = new()
|
||||
assembly.forceMove(drop_location())
|
||||
assembly.state = 2
|
||||
assembly.setAnchored(TRUE)
|
||||
assembly.setDir(dir)
|
||||
assembly = null
|
||||
new /obj/item/stack/cable_coil(loc, 2)
|
||||
else
|
||||
new /obj/item/stack/cable_coil(loc, 2)
|
||||
if(!assembly)
|
||||
assembly = new()
|
||||
assembly.forceMove(drop_location())
|
||||
assembly.stat = 2
|
||||
assembly.setAnchored(TRUE)
|
||||
assembly.setDir(dir)
|
||||
assembly = null
|
||||
new /obj/item/stack/cable_coil(loc, 2)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/poweredfans/wirecutter_act(mob/living/user, obj/item/I)
|
||||
@@ -40,22 +39,18 @@
|
||||
assembly = FA
|
||||
else
|
||||
assembly = new(src)
|
||||
assembly.state = 3
|
||||
assembly.stat = 3
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/machinery/poweredfans/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/poweredfans/update_icon()
|
||||
//if(state & NOPOWER)
|
||||
if(powered())
|
||||
icon_state = "mfan_powered"
|
||||
CanAtmosPass = ATMOS_PASS_NO
|
||||
air_update_turf(1)
|
||||
return
|
||||
else
|
||||
icon_state = "mfan_unpowered"
|
||||
CanAtmosPass = ATMOS_PASS_YES
|
||||
air_update_turf(1)
|
||||
return
|
||||
update_icon_state()
|
||||
|
||||
|
||||
@@ -30,12 +30,12 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/quantumpad/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It is [ linked_pad ? "currently" : "not"] linked to another pad.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>It is [ linked_pad ? "currently" : "not"] linked to another pad.</span>"
|
||||
if(!panel_open)
|
||||
to_chat(user, "<span class='notice'>The panel is <i>screwed</i> in, obstructing the linking device.</span>")
|
||||
. += "<span class='notice'>The panel is <i>screwed</i> in, obstructing the linking device.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The <i>linking</i> device is now able to be <i>scanned<i> with a multitool.</span>")
|
||||
. += "<span class='notice'>The <i>linking</i> device is now able to be <i>scanned<i> with a multitool.</span>"
|
||||
|
||||
/obj/machinery/quantumpad/RefreshParts()
|
||||
var/E = 0
|
||||
|
||||
@@ -40,10 +40,10 @@
|
||||
butchering.bonus_modifier = amount_produced/5
|
||||
|
||||
/obj/machinery/recycler/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].")
|
||||
to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].")
|
||||
to_chat(user, "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"].")
|
||||
. = ..()
|
||||
. += "The power light is [(stat & NOPOWER) ? "off" : "on"]."
|
||||
. += "The safety-mode light is [safety_mode ? "on" : "off"]."
|
||||
. += "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]."
|
||||
|
||||
/obj/machinery/recycler/power_change()
|
||||
..()
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "shield-old"
|
||||
density = TRUE
|
||||
move_resist = INFINITY
|
||||
opacity = 0
|
||||
anchored = TRUE
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
@@ -93,6 +94,7 @@
|
||||
/obj/machinery/shieldgen/proc/shields_up()
|
||||
active = TRUE
|
||||
update_icon()
|
||||
move_resist = INFINITY
|
||||
|
||||
for(var/turf/target_tile in range(shield_range, src))
|
||||
if(isspaceturf(target_tile) && !(locate(/obj/structure/emergency_shield) in target_tile))
|
||||
@@ -101,6 +103,7 @@
|
||||
|
||||
/obj/machinery/shieldgen/proc/shields_down()
|
||||
active = FALSE
|
||||
move_resist = initial(move_resist)
|
||||
update_icon()
|
||||
QDEL_LIST(deployed_shields)
|
||||
|
||||
|
||||
@@ -46,12 +46,12 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/space_heater/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "\The [src] is [on ? "on" : "off"], and the hatch is [panel_open ? "open" : "closed"].")
|
||||
. = ..()
|
||||
. += "\The [src] is [on ? "on" : "off"], and the hatch is [panel_open ? "open" : "closed"]."
|
||||
if(cell)
|
||||
to_chat(user, "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%.")
|
||||
. += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%."
|
||||
else
|
||||
to_chat(user, "There is no power cell installed.")
|
||||
. += "There is no power cell installed."
|
||||
|
||||
/obj/machinery/space_heater/update_icon()
|
||||
if(on)
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
var/obj/effect/overlay/vis/mattress_on
|
||||
|
||||
/obj/machinery/stasis/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
var/turn_on_or_off = stasis_enabled ? "turn off" : "turn on"
|
||||
to_chat(user, "<span class='notice'>Alt-click to [turn_on_or_off] the machine.</span>")
|
||||
. += "<span class='notice'>Alt-click to [turn_on_or_off] the machine.</span>"
|
||||
|
||||
/obj/machinery/stasis/proc/play_power_sound()
|
||||
var/_running = stasis_running()
|
||||
@@ -139,4 +139,4 @@
|
||||
unbuckle_mob(occupant)
|
||||
else
|
||||
..()
|
||||
#undef STASIS_TOGGLE_COOLDOWN
|
||||
#undef STASIS_TOGGLE_COOLDOWN
|
||||
|
||||
@@ -114,12 +114,11 @@
|
||||
/obj/machinery/status_display/examine(mob/user)
|
||||
. = ..()
|
||||
if (message1 || message2)
|
||||
var/list/msg = list("The display says:")
|
||||
. += "The display says:"
|
||||
if (message1)
|
||||
msg += "<br>\t<tt>[html_encode(message1)]</tt>"
|
||||
. += "\t<tt>[html_encode(message1)]</tt>"
|
||||
if (message2)
|
||||
msg += "<br>\t<tt>[html_encode(message2)]</tt>"
|
||||
to_chat(user, msg.Join())
|
||||
. += "\t<tt>[html_encode(message2)]</tt>"
|
||||
|
||||
// Helper procs for child display types.
|
||||
/obj/machinery/status_display/proc/display_shuttle_status(obj/docking_port/mobile/shuttle)
|
||||
@@ -146,9 +145,9 @@
|
||||
modestr = "<br>\t<tt>[modestr]: [shuttle.getTimerStr()]</tt>"
|
||||
else
|
||||
modestr = "<br>\t<tt>[modestr]</tt>"
|
||||
to_chat(user, "The display says:<br>\t<tt>[shuttle.name]</tt>[modestr]")
|
||||
return "The display says:<br>\t<tt>[shuttle.name]</tt>[modestr]"
|
||||
else
|
||||
to_chat(user, "The display says:<br>\t<tt>Shuttle missing!</tt>")
|
||||
return "The display says:<br>\t<tt>Shuttle missing!</tt>"
|
||||
|
||||
|
||||
/// Evac display which shows shuttle timer or message set by Command.
|
||||
@@ -195,9 +194,9 @@
|
||||
/obj/machinery/status_display/evac/examine(mob/user)
|
||||
. = ..()
|
||||
if(mode == SD_EMERGENCY)
|
||||
examine_shuttle(user, SSshuttle.emergency)
|
||||
. += examine_shuttle(user, SSshuttle.emergency)
|
||||
else if(!message1 && !message2)
|
||||
to_chat(user, "The display is blank.")
|
||||
. += "The display is blank."
|
||||
|
||||
/obj/machinery/status_display/evac/receive_signal(datum/signal/signal)
|
||||
switch(signal.data["command"])
|
||||
@@ -257,9 +256,9 @@
|
||||
else
|
||||
shuttleMsg = "[shuttle.getModeStr()]: [shuttle.getTimerStr()]"
|
||||
if (shuttleMsg)
|
||||
to_chat(user, "The display says:<br>\t<tt>[shuttleMsg]</tt>")
|
||||
. += "The display says:<br>\t<tt>[shuttleMsg]</tt>"
|
||||
else
|
||||
to_chat(user, "The display is blank.")
|
||||
. += "The display is blank."
|
||||
|
||||
|
||||
/// General-purpose shuttle status display.
|
||||
@@ -278,9 +277,9 @@
|
||||
/obj/machinery/status_display/shuttle/examine(mob/user)
|
||||
. = ..()
|
||||
if(shuttle_id)
|
||||
examine_shuttle(user, SSshuttle.getShuttle(shuttle_id))
|
||||
. += examine_shuttle(user, SSshuttle.getShuttle(shuttle_id))
|
||||
else
|
||||
to_chat(user, "The display is blank.")
|
||||
. += "The display is blank."
|
||||
|
||||
/obj/machinery/status_display/shuttle/vv_edit_var(var_name, var_value)
|
||||
. = ..()
|
||||
|
||||
@@ -247,9 +247,25 @@
|
||||
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
|
||||
mob_occupant.radiation = 0
|
||||
playsound(src, 'sound/machines/airlockclose.ogg', 25, 1)
|
||||
for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
||||
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
|
||||
var/datum/component/radioactive/contamination = I.GetComponent(/datum/component/radioactive)
|
||||
var/list/things_to_clear = list() //Done this way since using GetAllContents on the SSU itself would include circuitry and such.
|
||||
if(suit)
|
||||
things_to_clear += suit
|
||||
things_to_clear += suit.GetAllContents()
|
||||
if(helmet)
|
||||
things_to_clear += helmet
|
||||
things_to_clear += helmet.GetAllContents()
|
||||
if(mask)
|
||||
things_to_clear += mask
|
||||
things_to_clear += mask.GetAllContents()
|
||||
if(storage)
|
||||
things_to_clear += storage
|
||||
things_to_clear += storage.GetAllContents()
|
||||
if(occupant)
|
||||
things_to_clear += occupant
|
||||
things_to_clear += occupant.GetAllContents()
|
||||
for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
||||
SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
|
||||
var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive)
|
||||
if(contamination)
|
||||
qdel(contamination)
|
||||
open_machine(FALSE)
|
||||
@@ -278,8 +294,6 @@
|
||||
open_machine()
|
||||
dump_contents()
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_BREAKOUT)
|
||||
user.last_special = world.time + CLICK_CD_BREAKOUT
|
||||
user.visible_message("<span class='notice'>You see [user] kicking against the doors of [src]!</span>", \
|
||||
"<span class='notice'>You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)</span>", \
|
||||
"<span class='italics'>You hear a thump from [src].</span>")
|
||||
@@ -309,7 +323,7 @@
|
||||
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
|
||||
if(state_open && is_operational())
|
||||
if(istype(I, /obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>You can't quite fit that while you hold it!</span>")
|
||||
to_chat(user, "<span class='warning'>You can't quite fit that in while you hold it!</span>")
|
||||
return
|
||||
if(istype(I, /obj/item/clothing/suit))
|
||||
if(suit)
|
||||
|
||||
@@ -99,8 +99,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/syndicatebomb/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "A digital display on it reads \"[seconds_remaining()]\".")
|
||||
. = ..()
|
||||
. += "A digital display on it reads \"[seconds_remaining()]\"."
|
||||
|
||||
/obj/machinery/syndicatebomb/update_icon()
|
||||
icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/machinery/transformer/examine(mob/user)
|
||||
. = ..()
|
||||
if(cooldown && (issilicon(user) || isobserver(user)))
|
||||
to_chat(user, "It will be ready in [DisplayTimeText(cooldown_timer - world.time)].")
|
||||
. += "It will be ready in [DisplayTimeText(cooldown_timer - world.time)]."
|
||||
|
||||
/obj/machinery/transformer/Destroy()
|
||||
QDEL_NULL(countdown)
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
|
||||
|
||||
/obj/machinery/washing_machine/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click it to start a wash cycle.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>Alt-click it to start a wash cycle.</span>"
|
||||
|
||||
/obj/machinery/washing_machine/AltClick(mob/user)
|
||||
if(!user.canUseTopic(src))
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
switch(mode)
|
||||
if(1)
|
||||
if(!locked)
|
||||
if(!istype(target) || target.anchored)
|
||||
if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRONG)
|
||||
occupant_message("Unable to lock on [target]")
|
||||
return
|
||||
locked = target
|
||||
@@ -110,7 +110,7 @@
|
||||
else
|
||||
atoms = orange(3, target)
|
||||
for(var/atom/movable/A in atoms)
|
||||
if(A.anchored)
|
||||
if(A.anchored || A.move_resist >= MOVE_FORCE_EXTREMELY_STRONG)
|
||||
continue
|
||||
spawn(0)
|
||||
var/iter = 5-get_dist(A,target)
|
||||
|
||||
@@ -436,7 +436,7 @@
|
||||
throwforce = 35
|
||||
icon_state = "punching_glove"
|
||||
|
||||
/obj/item/punching_glove/throw_impact(atom/hit_atom)
|
||||
/obj/item/punching_glove/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
if(!..())
|
||||
if(ismovableatom(hit_atom))
|
||||
var/atom/movable/AM = hit_atom
|
||||
|
||||
@@ -268,23 +268,23 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/mecha/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
var/integrity = obj_integrity*100/max_integrity
|
||||
switch(integrity)
|
||||
if(85 to 100)
|
||||
to_chat(user, "It's fully intact.")
|
||||
. += "It's fully intact."
|
||||
if(65 to 85)
|
||||
to_chat(user, "It's slightly damaged.")
|
||||
. += "It's slightly damaged."
|
||||
if(45 to 65)
|
||||
to_chat(user, "It's badly damaged.")
|
||||
. += "It's badly damaged."
|
||||
if(25 to 45)
|
||||
to_chat(user, "It's heavily damaged.")
|
||||
. += "It's heavily damaged."
|
||||
else
|
||||
to_chat(user, "It's falling apart.")
|
||||
. += "It's falling apart."
|
||||
if(equipment && equipment.len)
|
||||
to_chat(user, "It's equipped with:")
|
||||
. += "It's equipped with:"
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
|
||||
to_chat(user, "[icon2html(ME, user)] \A [ME].")
|
||||
. += "[icon2html(ME, user)] \A [ME]."
|
||||
if(!enclosed)
|
||||
if(silicon_pilot)
|
||||
to_chat(user, "[src] appears to be piloting itself...")
|
||||
@@ -554,10 +554,12 @@
|
||||
var/move_result = 0
|
||||
var/oldloc = loc
|
||||
if(internal_damage & MECHA_INT_CONTROL_LOST)
|
||||
set_glide_size(DELAY_TO_GLIDE_SIZE(step_in))
|
||||
move_result = mechsteprand()
|
||||
else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"]))
|
||||
move_result = mechturn(direction)
|
||||
else
|
||||
set_glide_size(DELAY_TO_GLIDE_SIZE(step_in))
|
||||
move_result = mechstep(direction)
|
||||
if(move_result || loc != oldloc)// halfway done diagonal move still returns false
|
||||
use_power(step_energy_drain)
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
/obj/mecha/attack_tk()
|
||||
return
|
||||
|
||||
/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
|
||||
log_message("Hit by [A].", color="red")
|
||||
/obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper
|
||||
log_message("Hit by [AM].", color="red")
|
||||
. = ..()
|
||||
|
||||
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
AI.remote_control = null
|
||||
|
||||
/obj/structure/mecha_wreckage/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(AI)
|
||||
to_chat(user, "<span class='notice'>The AI recovery beacon is active.</span>")
|
||||
. += "<span class='notice'>The AI recovery beacon is active.</span>"
|
||||
|
||||
/obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
buckled_mobs |= M
|
||||
M.update_canmove()
|
||||
M.throw_alert("buckled", /obj/screen/alert/restrained/buckled)
|
||||
M.set_glide_size(glide_size)
|
||||
post_buckle_mob(M)
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force)
|
||||
@@ -87,6 +88,7 @@
|
||||
buckled_mob.anchored = initial(buckled_mob.anchored)
|
||||
buckled_mob.update_canmove()
|
||||
buckled_mob.clear_alert("buckled")
|
||||
buckled_mob.set_glide_size(DELAY_TO_GLIDE_SIZE(buckled_mob.total_multiplicative_slowdown()))
|
||||
buckled_mobs -= buckled_mob
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force)
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/obj/effect/countdown/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "This countdown is displaying: [displayed_text].")
|
||||
. += "This countdown is displaying: [displayed_text]."
|
||||
|
||||
/obj/effect/countdown/proc/attach(atom/A)
|
||||
attached_to = A
|
||||
|
||||
@@ -179,9 +179,7 @@
|
||||
. += "You recognise the footprints as belonging to:\n"
|
||||
for(var/shoe in shoe_types)
|
||||
var/obj/item/clothing/shoes/S = shoe
|
||||
. += "[icon2html(initial(S.icon), user)] Some <B>[initial(S.name)]</B>.\n"
|
||||
|
||||
to_chat(user, .)
|
||||
. += "some <B>[initial(S.name)]</B> [icon2html(initial(S.icon), user)]"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C)
|
||||
if(blood_state != C.blood_state) //We only replace footprints of the same type as us
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
/obj/effect
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
|
||||
move_resist = INFINITY
|
||||
obj_flags = 0
|
||||
|
||||
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
/obj/structure/glowshroom/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "This is a [generation]\th generation [name]!")
|
||||
. += "This is a [generation]\th generation [name]!"
|
||||
|
||||
/obj/structure/glowshroom/Destroy()
|
||||
if(myseed)
|
||||
|
||||
@@ -432,3 +432,52 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
|
||||
GLOB.ruin_landmarks -= src
|
||||
ruin_template = null
|
||||
. = ..()
|
||||
|
||||
//------Station Rooms Landmarks------------//
|
||||
/obj/effect/landmark/stationroom
|
||||
var/list/templates = list()
|
||||
layer = BULLET_HOLE_LAYER
|
||||
|
||||
/obj/effect/landmark/stationroom/New()
|
||||
..()
|
||||
GLOB.stationroom_landmarks += src
|
||||
|
||||
/obj/effect/landmark/stationroom/Destroy()
|
||||
if(src in GLOB.stationroom_landmarks)
|
||||
GLOB.stationroom_landmarks -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/landmark/stationroom/proc/load(template_name)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
return FALSE
|
||||
if(!template_name)
|
||||
for(var/t in templates)
|
||||
if(!SSmapping.station_room_templates[t])
|
||||
log_world("Station room spawner placed at ([T.x], [T.y], [T.z]) has invalid ruin name of \"[t]\" in its list")
|
||||
templates -= t
|
||||
template_name = pickweight(templates)
|
||||
if(!template_name)
|
||||
GLOB.stationroom_landmarks -= src
|
||||
qdel(src)
|
||||
return FALSE
|
||||
var/datum/map_template/template = SSmapping.station_room_templates[template_name]
|
||||
if(!template)
|
||||
return FALSE
|
||||
testing("Room \"[template_name]\" placed at ([T.x], [T.y], [T.z])")
|
||||
template.load(T, centered = FALSE)
|
||||
template.loaded++
|
||||
GLOB.stationroom_landmarks -= src
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
// The landmark for the Engine on Box
|
||||
|
||||
/obj/effect/landmark/stationroom/box/engine
|
||||
templates = list("Engine SM" = 3, "Engine Singulo" = 3, "Engine Tesla" = 3)
|
||||
icon = 'icons/rooms/box/engine.dmi'
|
||||
|
||||
|
||||
/obj/effect/landmark/stationroom/box/engine/New()
|
||||
. = ..()
|
||||
templates = CONFIG_GET(keyed_list/box_random_engine)
|
||||
|
||||
+31
-18
@@ -187,14 +187,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
src.loc = T
|
||||
|
||||
/obj/item/examine(mob/user) //This might be spammy. Remove?
|
||||
..()
|
||||
var/pronoun
|
||||
if(src.gender == PLURAL)
|
||||
pronoun = "They are"
|
||||
. = ..()
|
||||
|
||||
. += "[gender == PLURAL ? "They are" : "It is"] a [weightclass2text(w_class)] item."
|
||||
|
||||
if(resistance_flags & INDESTRUCTIBLE)
|
||||
. += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!"
|
||||
else
|
||||
pronoun = "It is"
|
||||
var/size = weightclass2text(src.w_class)
|
||||
to_chat(user, "[pronoun] a [size] item." )
|
||||
if(resistance_flags & LAVA_PROOF)
|
||||
. += "[src] is made of an extremely heat-resistant material, it'd probably be able to withstand lava!"
|
||||
if(resistance_flags & (ACID_PROOF | UNACIDABLE))
|
||||
. += "[src] looks pretty robust! It'd probably be able to withstand acid!"
|
||||
if(resistance_flags & FREEZE_PROOF)
|
||||
. += "[src] is made of cold-resistant materials."
|
||||
if(resistance_flags & FIRE_PROOF)
|
||||
. += "[src] is made of fire-retardant materials."
|
||||
|
||||
if(!user.research_scanner)
|
||||
return
|
||||
@@ -229,7 +236,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
else
|
||||
research_msg += "None"
|
||||
research_msg += "."
|
||||
to_chat(user, research_msg.Join())
|
||||
. += research_msg.Join()
|
||||
|
||||
/obj/item/interact(mob/user)
|
||||
add_fingerprint(user)
|
||||
@@ -543,21 +550,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
else
|
||||
return
|
||||
|
||||
/obj/item/throw_impact(atom/A, datum/thrownthing/throwingdatum)
|
||||
if(A && !QDELETED(A))
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, A, throwingdatum)
|
||||
if(is_hot() && isliving(A))
|
||||
var/mob/living/L = A
|
||||
/obj/item/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
if(hit_atom && !QDELETED(hit_atom))
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
|
||||
if(get_temperature() && isliving(hit_atom))
|
||||
var/mob/living/L = hit_atom
|
||||
L.IgniteMob()
|
||||
var/itempush = 1
|
||||
if(w_class < 4)
|
||||
itempush = 0 //too light to push anything
|
||||
return A.hitby(src, 0, itempush)
|
||||
return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum)
|
||||
|
||||
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
|
||||
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
|
||||
thrownby = thrower
|
||||
callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
|
||||
. = ..(target, range, speed, thrower, spin, diagonals_first, callback)
|
||||
callback = CALLBACK(src, .proc/after_throw, callback, (spin && messy_throw)) //replace their callback with our own
|
||||
. = ..(target, range, speed, thrower, spin, diagonals_first, callback, force)
|
||||
|
||||
/obj/item/proc/after_throw(datum/callback/callback)
|
||||
if (callback) //call the original callback
|
||||
@@ -619,6 +626,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
/obj/item/proc/is_sharp()
|
||||
return sharpness
|
||||
|
||||
/obj/item/proc/get_temperature()
|
||||
return heat
|
||||
|
||||
/obj/item/proc/get_sharpness()
|
||||
return sharpness
|
||||
|
||||
/obj/item/proc/get_dismemberment_chance(obj/item/bodypart/affecting)
|
||||
if(affecting.can_dismember(src))
|
||||
if((sharpness || damtype == BURN) && w_class >= WEIGHT_CLASS_NORMAL && force >= 10)
|
||||
@@ -648,7 +661,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
else
|
||||
. = ""
|
||||
|
||||
/obj/item/hitby(atom/movable/AM)
|
||||
/obj/item/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
|
||||
return
|
||||
|
||||
/obj/item/attack_hulk(mob/living/carbon/human/user)
|
||||
|
||||
@@ -25,7 +25,7 @@ AI MODULES
|
||||
materials = list(MAT_GOLD=50)
|
||||
|
||||
/obj/item/aiModule/examine(var/mob/user as mob)
|
||||
..()
|
||||
. = ..()
|
||||
if(Adjacent(user))
|
||||
show_laws(user)
|
||||
|
||||
|
||||
@@ -47,11 +47,11 @@ RLD
|
||||
|
||||
/obj/item/construction/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "It currently holds [matter]/[max_matter] matter-units." )
|
||||
. += "\A [src]. It currently holds [matter]/[max_matter] matter-units."
|
||||
if(upgrade & RCD_UPGRADE_FRAMES)
|
||||
to_chat(user, "It contains the design for machine frames, computer frames and deconstruction." )
|
||||
. += "It contains the design for machine frames, computer frames and deconstruction."
|
||||
if(upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)
|
||||
to_chat(user, "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells.")
|
||||
. += "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
|
||||
|
||||
/obj/item/construction/Destroy()
|
||||
QDEL_NULL(spark_system)
|
||||
@@ -875,4 +875,4 @@ RLD
|
||||
|
||||
#undef GLOW_MODE
|
||||
#undef LIGHT_MODE
|
||||
#undef REMOVE_MODE
|
||||
#undef REMOVE_MODE
|
||||
|
||||
@@ -79,9 +79,9 @@
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/rcl/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(loaded)
|
||||
to_chat(user, "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>")
|
||||
. += "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>"
|
||||
|
||||
/obj/item/twohanded/rcl/Destroy()
|
||||
QDEL_NULL(loaded)
|
||||
|
||||
@@ -19,12 +19,14 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
|
||||
new /datum/pipe_info/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold),
|
||||
new /datum/pipe_info/pipe("Manual Valve", /obj/machinery/atmospherics/components/binary/valve),
|
||||
new /datum/pipe_info/pipe("Digital Valve", /obj/machinery/atmospherics/components/binary/valve/digital),
|
||||
new /datum/pipe_info/pipe("Relief Valve", /obj/machinery/atmospherics/components/binary/relief_valve),
|
||||
new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w),
|
||||
new /datum/pipe_info/pipe("Layer Manifold", /obj/machinery/atmospherics/pipe/layer_manifold),
|
||||
),
|
||||
"Devices" = list(
|
||||
new /datum/pipe_info/pipe("Connector", /obj/machinery/atmospherics/components/unary/portables_connector),
|
||||
new /datum/pipe_info/pipe("Unary Vent", /obj/machinery/atmospherics/components/unary/vent_pump),
|
||||
new /datum/pipe_info/pipe("Relief Valve", /obj/machinery/atmospherics/components/unary/relief_valve),
|
||||
new /datum/pipe_info/pipe("Gas Pump", /obj/machinery/atmospherics/components/binary/pump),
|
||||
new /datum/pipe_info/pipe("Passive Gate", /obj/machinery/atmospherics/components/binary/passive_gate),
|
||||
new /datum/pipe_info/pipe("Volume Pump", /obj/machinery/atmospherics/components/binary/volume_pump),
|
||||
@@ -33,6 +35,7 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
|
||||
new /datum/pipe_info/meter("Meter"),
|
||||
new /datum/pipe_info/pipe("Gas Filter", /obj/machinery/atmospherics/components/trinary/filter),
|
||||
new /datum/pipe_info/pipe("Gas Mixer", /obj/machinery/atmospherics/components/trinary/mixer),
|
||||
new /datum/pipe_info/pipe("Passive Vent", /obj/machinery/atmospherics/components/unary/passive_vent),
|
||||
),
|
||||
"Heat Exchange" = list(
|
||||
new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/heat_exchanging/simple),
|
||||
|
||||
@@ -20,8 +20,8 @@ RSF
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/rsf/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It currently holds [matter]/30 fabrication-units.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>It currently holds [matter]/30 fabrication-units.</span>"
|
||||
|
||||
/obj/item/rsf/cyborg
|
||||
matter = 30
|
||||
@@ -127,8 +127,8 @@ RSF
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/cookiesynth/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It currently holds [matter]/10 cookie-units.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>It currently holds [matter]/10 cookie-units.</span>"
|
||||
|
||||
/obj/item/cookiesynth/attackby()
|
||||
return
|
||||
|
||||
@@ -91,9 +91,9 @@
|
||||
|
||||
|
||||
/obj/item/airlock_painter/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(!ink)
|
||||
to_chat(user, "<span class='notice'>It doesn't have a toner cartridge installed.</span>")
|
||||
. += "<span class='notice'>It doesn't have a toner cartridge installed.</span>"
|
||||
return
|
||||
var/ink_level = "high"
|
||||
if(ink.charges < 1)
|
||||
@@ -102,8 +102,7 @@
|
||||
ink_level = "low"
|
||||
else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit)
|
||||
ink_level = "dangerously high"
|
||||
to_chat(user, "<span class='notice'>Its ink levels look [ink_level].</span>")
|
||||
|
||||
. += "<span class='notice'>Its ink levels look [ink_level].</span>"
|
||||
|
||||
/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/toner))
|
||||
|
||||
@@ -46,10 +46,10 @@
|
||||
|
||||
|
||||
/obj/item/bodybag/bluespace/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(contents.len)
|
||||
var/s = contents.len == 1 ? "" : "s"
|
||||
to_chat(user, "<span class='notice'>You can make out the shape[s] of [contents.len] object[s] through the fabric.</span>")
|
||||
. += "<span class='notice'>You can make out the shape[s] of [contents.len] object[s] through the fabric.</span>"
|
||||
|
||||
/obj/item/bodybag/bluespace/Destroy()
|
||||
for(var/atom/movable/A in contents)
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
user.visible_message("<span class='warning'>[src] fizzles and sparks. It seems like it's out of charges.</span>")
|
||||
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
|
||||
|
||||
/obj/item/card/emag/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>It has <b>[uses ? uses : "no"]</b> charges left.</span>"
|
||||
|
||||
/obj/item/card/emagfake
|
||||
desc = "It's a card with a magnetic strip attached to some circuitry. Closer inspection shows that this card is a poorly made replica, with a \"DonkCo\" logo stamped on the back."
|
||||
@@ -173,9 +176,9 @@
|
||||
return
|
||||
|
||||
/obj/item/card/id/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(mining_points)
|
||||
to_chat(user, "There's [mining_points] mining equipment redemption point\s loaded onto this card.")
|
||||
. += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
|
||||
|
||||
/obj/item/card/id/GetAccess()
|
||||
return access
|
||||
@@ -434,3 +437,26 @@ update_label("John Doe", "Clowny")
|
||||
name = "APC Access ID"
|
||||
desc = "A special ID card that allows access to APC terminals."
|
||||
access = list(ACCESS_ENGINE_EQUIP)
|
||||
|
||||
/obj/item/card/id/away/snowdin
|
||||
name = "a perfectly generic identification card"
|
||||
desc = "A perfectly generic identification card. Looks like it could use some flavor."
|
||||
icon_state = "centcom"
|
||||
|
||||
/obj/item/card/id/away/snowdin/eng
|
||||
name = "Arctic Station Engineer's ID card"
|
||||
desc = "A faded Arctic Station ID card. You can make out the rank \"Station Engineer\"."
|
||||
assignment = "Arctic Station Engineer"
|
||||
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_ENGINE, ACCESS_AWAY_MAINT)
|
||||
|
||||
/obj/item/card/id/away/snowdin/sci
|
||||
name = "Arctic Station Scientist's ID card"
|
||||
desc = "A faded Arctic Station ID card. You can make out the rank \"Scientist\"."
|
||||
assignment = "Arctic Station Scientist"
|
||||
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MAINT)
|
||||
|
||||
/obj/item/card/id/away/snowdin/med
|
||||
name = "Arctic Station Doctor's ID card"
|
||||
desc = "A faded Arctic Station ID card. You can make out the rank \"Doctor\"."
|
||||
assignment = "Arctic Station Doctor"
|
||||
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MED, ACCESS_AWAY_MAINT)
|
||||
|
||||
@@ -951,18 +951,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
user.show_message("<span class='notice'>You quench the flame.</span>", 1)
|
||||
|
||||
/obj/item/bong/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(!reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>The bowl is empty.</span>")
|
||||
. += "<span class='notice'>The bowl is empty.</span>"
|
||||
else if (reagents.total_volume > 80)
|
||||
to_chat(user, "<span class='notice'>The bowl is filled to the brim.</span>")
|
||||
. += "<span class='notice'>The bowl is filled to the brim.</span>"
|
||||
else if (reagents.total_volume > 40)
|
||||
to_chat(user, "<span class='notice'>The bowl has plenty weed in it.</span>")
|
||||
. += "<span class='notice'>The bowl has plenty weed in it.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The bowl has some weed in it.</span>")
|
||||
. += "<span class='notice'>The bowl has some weed in it.</span>"
|
||||
|
||||
to_chat(user, "<span class='notice'>Ctrl+Shift-click to empty.</span>")
|
||||
to_chat(user, "<span class='notice'>Alt-click to extinguish.</span>")
|
||||
. += "<span class='notice'>Ctrl+Shift-click to empty.</span>"
|
||||
. += "<span class='notice'>Alt-click to extinguish.</span>"
|
||||
|
||||
/obj/item/bong/ignition_effect(atom/A, mob/user)
|
||||
if(firecharges)
|
||||
|
||||
@@ -56,7 +56,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
|
||||
M.RefreshParts()
|
||||
|
||||
/obj/item/circuitboard/machine/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(LAZYLEN(req_components))
|
||||
var/list/nice_list = list()
|
||||
for(var/B in req_components)
|
||||
@@ -64,4 +64,4 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
|
||||
if(!ispath(A))
|
||||
continue
|
||||
nice_list += list("[req_components[A]] [initial(A.name)]")
|
||||
to_chat(user,"<span class='notice'>Required components: [english_list(nice_list)].</span>")
|
||||
. += "<span class='notice'>Required components: [english_list(nice_list)].</span>"
|
||||
|
||||
@@ -73,8 +73,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/circuitboard/computer/card/minor/examine(user)
|
||||
..()
|
||||
to_chat(user, "Currently set to \"[dept_list[target_dept]]\".")
|
||||
. = ..()
|
||||
. += "Currently set to \"[dept_list[target_dept]]\"."
|
||||
|
||||
//obj/item/circuitboard/computer/shield
|
||||
// name = "Shield Control (Computer Board)"
|
||||
|
||||
@@ -434,8 +434,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/circuitboard/machine/smartfridge/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='info'>[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it.</span>")
|
||||
. = ..()
|
||||
. += "<span class='info'>[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it.</span>"
|
||||
|
||||
/obj/item/circuitboard/machine/biogenerator
|
||||
name = "Biogenerator (Machine Board)"
|
||||
@@ -780,7 +780,7 @@
|
||||
|
||||
/obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "Cloud ID is currently set to [cloud_id].")
|
||||
. += "Cloud ID is currently set to [cloud_id]."
|
||||
|
||||
/obj/item/circuitboard/machine/nanite_program_hub
|
||||
name = "Nanite Program Hub (Machine Board)"
|
||||
@@ -941,9 +941,9 @@
|
||||
needs_anchored = FALSE
|
||||
|
||||
/obj/item/circuitboard/machine/dish_drive/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.</span>")
|
||||
to_chat(user, "<span class='notice'>Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch.</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.</span>"
|
||||
. += "<span class='notice'>Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch.</span>"
|
||||
|
||||
/obj/item/circuitboard/machine/dish_drive/attack_self(mob/living/user)
|
||||
suction = !suction
|
||||
|
||||
@@ -20,6 +20,34 @@
|
||||
/obj/item/lipstick/black
|
||||
name = "black lipstick"
|
||||
colour = "black"
|
||||
|
||||
/obj/item/lipstick/yellow
|
||||
name = "yellow lipstick"
|
||||
colour = "yellow"
|
||||
|
||||
/obj/item/lipstick/blue
|
||||
name = "blue lipstick"
|
||||
colour = "blue"
|
||||
|
||||
/obj/item/lipstick/teal
|
||||
name = "teal lipstick"
|
||||
colour = "teal"
|
||||
|
||||
/obj/item/lipstick/fuchsia
|
||||
name = "fuchsia lipstick"
|
||||
colour = "fuchsia"
|
||||
|
||||
/obj/item/lipstick/navy
|
||||
name = "navy blue lipstick"
|
||||
colour = "navy"
|
||||
|
||||
/obj/item/lipstick/aqua
|
||||
name = "cyan lipstick"
|
||||
colour = "aqua"
|
||||
|
||||
/obj/item/lipstick/white
|
||||
name = "white lipstick"
|
||||
colour = "white"
|
||||
|
||||
/obj/item/lipstick/random
|
||||
name = "lipstick"
|
||||
|
||||
@@ -667,10 +667,10 @@
|
||||
/obj/item/toy/crayon/spraycan/examine(mob/user)
|
||||
. = ..()
|
||||
if(charges_left)
|
||||
to_chat(user, "It has [charges_left] use\s left.")
|
||||
. += "It has [charges_left] use\s left."
|
||||
else
|
||||
to_chat(user, "It is empty.")
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"].</span>")
|
||||
. += "It is empty."
|
||||
. += "<span class='notice'>Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"].</span>"
|
||||
|
||||
/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity, params)
|
||||
if(!proximity)
|
||||
@@ -831,7 +831,7 @@
|
||||
/obj/item/toy/crayon/spraycan/gang/examine(mob/user)
|
||||
. = ..()
|
||||
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/gang) || isobserver(user))
|
||||
to_chat(user, "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster.")
|
||||
. += "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster."
|
||||
|
||||
/obj/item/toy/crayon/spraycan/infinite
|
||||
name = "infinite spraycan"
|
||||
|
||||
@@ -103,12 +103,11 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
|
||||
/obj/item/pda/examine(mob/user)
|
||||
. = ..()
|
||||
var/dat = id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
|
||||
. += id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
|
||||
if(inserted_item && (!isturf(loc)))
|
||||
dat += "\n<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
|
||||
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
|
||||
if(LAZYLEN(GLOB.pda_reskins))
|
||||
dat += "\n<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
|
||||
to_chat(user, dat)
|
||||
. += "<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
|
||||
|
||||
/obj/item/pda/Initialize()
|
||||
. = ..()
|
||||
@@ -1137,4 +1136,4 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
#undef PDA_OVERLAY_ID
|
||||
#undef PDA_OVERLAY_ITEM
|
||||
#undef PDA_OVERLAY_LIGHT
|
||||
#undef PDA_OVERLAY_PAI
|
||||
#undef PDA_OVERLAY_PAI
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
var/mode = 0
|
||||
|
||||
/obj/item/compressionkit/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It has [charges] charges left. Recharge with bluespace crystals.</span>")
|
||||
to_chat(user, "<span class='notice'>Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>It has [charges] charges left. Recharge with bluespace crystals.</span>"
|
||||
. += "<span class='notice'>Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).</span>"
|
||||
|
||||
/obj/item/compressionkit/attack_self(mob/user)
|
||||
if(mode == 0)
|
||||
|
||||
@@ -35,8 +35,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/doorCharge/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/traitor)) //No nuke ops because the device is excluded from nuclear
|
||||
to_chat(user, "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within.")
|
||||
. += "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within."
|
||||
else
|
||||
to_chat(user, "A small, suspicious object that feels lukewarm when held.")
|
||||
. += "A small, suspicious object that feels lukewarm when held."
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
maptext = "[circuits]"
|
||||
|
||||
/obj/item/electroadaptive_pseudocircuit/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(iscyborg(user))
|
||||
to_chat(user, "<span class='notice'>It has material for <b>[circuits]</b> circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.</span>")
|
||||
to_chat(user, "<span class='notice'>Serves as a substitute for <b>fire/air alarm</b>, <b>firelock</b>, and <b>APC</b> electronics.</span>")
|
||||
to_chat(user, "<span class='notice'>It can also be used on an APC with no power cell to <b>fabricate a low-capacity cell</b> at a high power cost.</span>")
|
||||
. += "<span class='notice'>It has material for <b>[circuits]</b> circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.</span>"
|
||||
. += "<span class='notice'>Serves as a substitute for <b>fire/air alarm</b>, <b>firelock</b>, and <b>APC</b> electronics.</span>"
|
||||
. += "<span class='notice'>It can also be used on an APC with no power cell to <b>fabricate a low-capacity cell</b> at a high power cost.</span>"
|
||||
|
||||
/obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
|
||||
if(QDELETED(R) || !istype(R))
|
||||
|
||||
@@ -52,9 +52,9 @@
|
||||
qdel(F)
|
||||
|
||||
/obj/item/forcefield_projector/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
var/percent_charge = round((shield_integrity/max_shield_integrity)*100)
|
||||
to_chat(user, "<span class='notice'>It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.</span>")
|
||||
. += "<span class='notice'>It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.</span>"
|
||||
|
||||
/obj/item/forcefield_projector/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
rad_flags = RAD_NO_CONTAMINATE
|
||||
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
|
||||
|
||||
var/grace = RAD_GRACE_PERIOD
|
||||
@@ -38,6 +39,7 @@
|
||||
|
||||
/obj/item/geiger_counter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/item/geiger_counter/process()
|
||||
@@ -63,28 +65,28 @@
|
||||
current_tick_amount = 0
|
||||
|
||||
/obj/item/geiger_counter/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(!scanning)
|
||||
return 1
|
||||
to_chat(user, "<span class='info'>Alt-click it to clear stored radiation levels.</span>")
|
||||
return
|
||||
. += "<span class='info'>Alt-click it to clear stored radiation levels.</span>"
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<span class='warning'>The display seems to be incomprehensible.</span>")
|
||||
return 1
|
||||
. += "<span class='warning'>The display seems to be incomprehensible.</span>"
|
||||
return
|
||||
switch(radiation_count)
|
||||
if(-INFINITY to RAD_LEVEL_NORMAL)
|
||||
to_chat(user, "<span class='notice'>Ambient radiation level count reports that all is well.</span>")
|
||||
. += "<span class='notice'>Ambient radiation level count reports that all is well.</span>"
|
||||
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
|
||||
to_chat(user, "<span class='disarm'>Ambient radiation levels slightly above average.</span>")
|
||||
. += "<span class='disarm'>Ambient radiation levels slightly above average.</span>"
|
||||
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
|
||||
to_chat(user, "<span class='warning'>Ambient radiation levels above average.</span>")
|
||||
. += "<span class='warning'>Ambient radiation levels above average.</span>"
|
||||
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
|
||||
to_chat(user, "<span class='danger'>Ambient radiation levels highly above average.</span>")
|
||||
. += "<span class='danger'>Ambient radiation levels highly above average.</span>"
|
||||
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
|
||||
to_chat(user, "<span class='suicide'>Ambient radiation levels nearing critical level.</span>")
|
||||
. += "<span class='suicide'>Ambient radiation levels nearing critical level.</span>"
|
||||
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
|
||||
to_chat(user, "<span class='boldannounce'>Ambient radiation levels above critical level!</span>")
|
||||
. += "<span class='boldannounce'>Ambient radiation levels above critical level!</span>"
|
||||
|
||||
to_chat(user, "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>")
|
||||
. += "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>"
|
||||
|
||||
/obj/item/geiger_counter/update_icon()
|
||||
if(!scanning)
|
||||
|
||||
@@ -14,8 +14,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
|
||||
|
||||
/obj/item/gps/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>"
|
||||
|
||||
/obj/item/gps/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -73,8 +73,8 @@
|
||||
..()
|
||||
|
||||
/obj/item/lightreplacer/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, status_string())
|
||||
. = ..()
|
||||
. += status_string()
|
||||
|
||||
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
|
||||
@@ -33,11 +33,11 @@
|
||||
var/mode = 0
|
||||
|
||||
/obj/item/multitool/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(selected_io)
|
||||
to_chat(user, "<span class='notice'>Activate [src] to detach the data wire.</span>")
|
||||
. += "<span class='notice'>Activate [src] to detach the data wire.</span>"
|
||||
if(buffer)
|
||||
to_chat(user, "<span class='notice'>Its buffer contains [buffer].</span>")
|
||||
. += "<span class='notice'>Its buffer contains [buffer].</span>"
|
||||
|
||||
/obj/item/multitool/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!</span>")
|
||||
|
||||
@@ -26,5 +26,5 @@
|
||||
paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors
|
||||
|
||||
/obj/item/pipe_painter/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It is set to [paint_color].</span>")
|
||||
. = ..()
|
||||
. += "<span class='notice'>It is set to [paint_color].</span>"
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
var/obj/machinery/quantumpad/qpad
|
||||
|
||||
/obj/item/quantum_keycard/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(qpad)
|
||||
to_chat(user, "It's currently linked to a quantum pad.")
|
||||
to_chat(user, "<span class='notice'>Alt-click to unlink the keycard.</span>")
|
||||
. += "It's currently linked to a quantum pad."
|
||||
. += "<span class='notice'>Alt-click to unlink the keycard.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Insert [src] into an active quantum pad to link it.</span>")
|
||||
. += "<span class='notice'>Insert [src] into an active quantum pad to link it.</span>"
|
||||
|
||||
/obj/item/quantum_keycard/AltClick(mob/living/user)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
for(var/i in channels)
|
||||
examine_text_list += "[GLOB.channel_tokens[i]] - [lowertext(i)]"
|
||||
|
||||
to_chat(user, "<span class='notice'>It can access the following channels; [jointext(examine_text_list, ", ")].</span>")
|
||||
. += "<span class='notice'>It can access the following channels; [jointext(examine_text_list, ", ")].</span>"
|
||||
|
||||
/obj/item/encryptionkey/syndicate
|
||||
name = "syndicate encryption key"
|
||||
|
||||
@@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/radio/headset/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
if(item_flags & IN_INVENTORY && loc == user)
|
||||
// construction of frequency description
|
||||
@@ -45,12 +45,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
avail_chans += "use [MODE_TOKEN_DEPARTMENT] or [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
|
||||
else
|
||||
avail_chans += "use [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
|
||||
to_chat(user, "<span class='notice'>A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)].")
|
||||
. += "<span class='notice'>A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)]."
|
||||
|
||||
if(command)
|
||||
to_chat(user, "<span class='info'>Alt-click to toggle the high-volume mode.</span>")
|
||||
. += "<span class='info'>Alt-click to toggle the high-volume mode.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>A small screen on the headset flashes, it's too small to read without holding or wearing the headset.</span>")
|
||||
. += "<span class='notice'>A small screen on the headset flashes, it's too small to read without holding or wearing the headset.</span>"
|
||||
|
||||
/obj/item/radio/headset/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -49,11 +49,11 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/radio/intercom/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(!unfastened)
|
||||
to_chat(user, "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>")
|
||||
. += "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>")
|
||||
. += "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>"
|
||||
|
||||
/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
|
||||
@@ -319,11 +319,11 @@
|
||||
|
||||
|
||||
/obj/item/radio/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if (unscrewed)
|
||||
to_chat(user, "<span class='notice'>It can be attached and modified.</span>")
|
||||
. += "<span class='notice'>It can be attached and modified.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>It cannot be modified or attached.</span>")
|
||||
. += "<span class='notice'>It cannot be modified or attached.</span>"
|
||||
|
||||
/obj/item/radio/attackby(obj/item/W, mob/user, params)
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -533,7 +533,7 @@ GENE SCANNER
|
||||
|
||||
/obj/item/analyzer/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to activate the barometer function.</span>")
|
||||
. += "<span class='notice'>Alt-click [src] to activate the barometer function.</span>"
|
||||
|
||||
/obj/item/analyzer/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!</span>")
|
||||
@@ -841,4 +841,4 @@ GENE SCANNER
|
||||
display += copytext(temp, 1 + i*DNA_MUTATION_BLOCKS, DNA_MUTATION_BLOCKS*(1+i) + 1)
|
||||
|
||||
|
||||
to_chat(user, "<span class='boldnotice'>- [mut_name] > [display]</span>")
|
||||
to_chat(user, "<span class='boldnotice'>- [mut_name] > [display]</span>")
|
||||
|
||||
@@ -29,9 +29,8 @@
|
||||
|
||||
|
||||
/obj/item/taperecorder/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
|
||||
|
||||
. = ..()
|
||||
. += "The wire panel is [open_panel ? "opened" : "closed"]."
|
||||
|
||||
/obj/item/taperecorder/attackby(obj/item/I, mob/user, params)
|
||||
if(!mytape && istype(I, /obj/item/tape))
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
/obj/item/dice/attack_self(mob/user)
|
||||
diceroll(user)
|
||||
|
||||
/obj/item/dice/throw_impact(atom/target)
|
||||
/obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
diceroll(thrownby)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -106,11 +106,11 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/extinguisher/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The safety is [safety ? "on" : "off"].")
|
||||
. = ..()
|
||||
. += "The safety is [safety ? "on" : "off"]."
|
||||
|
||||
if(reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>You can loose its <b>screws</b> to empty it.</span>")
|
||||
. += "<span class='notice'>You can loose its <b>screws</b> to empty it.</span>"
|
||||
|
||||
/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user)
|
||||
if(istype(target, tanktype) && target.Adjacent(user))
|
||||
|
||||
@@ -145,9 +145,9 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/flamethrower/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(ptank)
|
||||
to_chat(user, "<span class='notice'>\The [src] has \a [ptank] attached. Alt-click to remove it.</span>")
|
||||
. += "<span class='notice'>\The [src] has \a [ptank] attached. Alt-click to remove it.</span>"
|
||||
|
||||
/obj/item/flamethrower/proc/toggle_igniter(mob/user)
|
||||
if(!ptank)
|
||||
|
||||
@@ -27,19 +27,19 @@
|
||||
|
||||
/obj/item/grenade/chem_grenade/examine(mob/user)
|
||||
display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state
|
||||
..()
|
||||
. = ..()
|
||||
if(user.can_see_reagents())
|
||||
var/count = 0
|
||||
if(beakers.len)
|
||||
to_chat(user, "<span class='notice'>You scan the grenade and detect the following reagents:</span>")
|
||||
. += "<span class='notice'>You scan the grenade and detect the following reagents:</span>"
|
||||
for(var/obj/item/reagent_containers/glass/G in beakers)
|
||||
var/textcount = thtotext(++count)
|
||||
for(var/datum/reagent/R in G.reagents.reagent_list)
|
||||
to_chat(user, "<span class='notice'>[R.volume] units of [R.name] in the [textcount] beaker.</span>")
|
||||
. += "<span class='notice'>[R.volume] units of [R.name] in the [textcount] beaker.</span>"
|
||||
if(beakers.len == 1)
|
||||
to_chat(user, "<span class='notice'>You detect no second beaker in the grenade.</span>")
|
||||
. += "<span class='notice'>You detect no second beaker in the grenade.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You scan the grenade, but detect nothing.</span>")
|
||||
. += "<span class='notice'>You scan the grenade, but detect nothing.</span>"
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/attack_self(mob/user)
|
||||
|
||||
@@ -56,5 +56,5 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/iedcasing/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "You can't tell when it will explode!")
|
||||
. = ..()
|
||||
. += "You can't tell when it will explode!"
|
||||
|
||||
@@ -47,12 +47,12 @@
|
||||
|
||||
|
||||
/obj/item/grenade/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(display_timer)
|
||||
if(det_time > 1)
|
||||
to_chat(user, "The timer is set to [DisplayTimeText(det_time)].")
|
||||
. += "The timer is set to [DisplayTimeText(det_time)]."
|
||||
else
|
||||
to_chat(user, "\The [src] is set for instant detonation.")
|
||||
. += "\The [src] is set for instant detonation."
|
||||
|
||||
|
||||
/obj/item/grenade/attack_self(mob/user)
|
||||
|
||||
@@ -340,7 +340,7 @@
|
||||
return
|
||||
playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1)
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
|
||||
/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
|
||||
return//abort
|
||||
var/mob/living/carbon/C = hit_atom
|
||||
@@ -368,7 +368,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
breakouttime = 60
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
|
||||
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
if(iscarbon(hit_atom))
|
||||
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
|
||||
B.Crossed(hit_atom)
|
||||
|
||||
@@ -52,23 +52,23 @@
|
||||
return
|
||||
|
||||
/obj/item/his_grace/examine(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(awakened)
|
||||
switch(bloodthirst)
|
||||
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
|
||||
to_chat(user, "<span class='his_grace'>[src] isn't very hungry. Not yet.</span>")
|
||||
. += "<span class='his_grace'>[src] isn't very hungry. Not yet.</span>"
|
||||
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
|
||||
to_chat(user, "<span class='his_grace'>[src] would like a snack.</span>")
|
||||
. += "<span class='his_grace'>[src] would like a snack.</span>"
|
||||
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
|
||||
to_chat(user, "<span class='his_grace'>[src] is quite hungry now.</span>")
|
||||
. += "<span class='his_grace'>[src] is quite hungry now.</span>"
|
||||
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
||||
to_chat(user, "<span class='his_grace'>[src] is openly salivating at the sight of you. Be careful.</span>")
|
||||
. += "<span class='his_grace'>[src] is openly salivating at the sight of you. Be careful.</span>"
|
||||
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
||||
to_chat(user, "<span class='his_grace bold'>You walk a fine line. [src] is very close to devouring you.</span>")
|
||||
. += "<span class='his_grace bold'>You walk a fine line. [src] is very close to devouring you.</span>"
|
||||
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
||||
to_chat(user, "<span class='his_grace bold'>[src] is shaking violently and staring directly at you.</span>")
|
||||
. += "<span class='his_grace bold'>[src] is shaking violently and staring directly at you.</span>"
|
||||
else
|
||||
to_chat(user, "<span class='his_grace'>[src] is latched closed.</span>")
|
||||
. += "<span class='his_grace'>[src] is latched closed.</span>"
|
||||
|
||||
/obj/item/his_grace/relaymove(mob/living/user) //Allows changelings, etc. to climb out of Him after they revive, provided He isn't active
|
||||
if(!awakened)
|
||||
|
||||
@@ -490,10 +490,10 @@
|
||||
|
||||
possessed = TRUE
|
||||
|
||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
|
||||
var/list/mob/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
|
||||
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
var/mob/C = pick(candidates)
|
||||
var/mob/living/simple_animal/shade/S = new(src)
|
||||
S.real_name = name
|
||||
S.name = name
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user