Game folder

This commit is contained in:
Poojawa
2018-09-11 04:06:45 -05:00
parent b6430559e9
commit 8b9ef1e400
270 changed files with 3120 additions and 2523 deletions
+12 -12
View File
@@ -499,18 +499,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "Theatre"
/area/library
name = "Library"
icon_state = "library"
flags_1 = NONE
name = "Library"
icon_state = "library"
flags_1 = NONE
/area/library/lounge
name = "Library Lounge"
icon_state = "library"
name = "Library Lounge"
icon_state = "library"
/area/library/abandoned
name = "Abandoned Library"
icon_state = "library"
flags_1 = NONE
name = "Abandoned Library"
icon_state = "library"
flags_1 = NONE
/area/chapel
icon_state = "chapel"
@@ -559,9 +559,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "engine"
/area/engine/atmos
name = "Atmospherics"
icon_state = "atmos"
flags_1 = NONE
name = "Atmospherics"
icon_state = "atmos"
flags_1 = NONE
/area/engine/atmospherics_engine
name = "Atmospherics Engine"
@@ -1297,7 +1297,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
clockwork_warp_allowed = FALSE
clockwork_warp_fail = "For safety reasons, warping here is disallowed; the radio and bluespace noise could cause catastrophic results."
ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\
'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg')
'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg')
/area/tcommsat/entrance
name = "Telecomms Teleporter"
+23 -25
View File
@@ -29,8 +29,6 @@
var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
var/totalbeauty = 0 //All beauty in this area combined, only includes indoor area.
var/beauty = 0 // Beauty average per open turf in the area
var/areasize = 0 //Size of the area in open turfs, only calculated for indoors areas.
var/power_equip = TRUE
@@ -48,6 +46,8 @@
var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
var/hidden = FALSE //Hides area from player Teleport function.
var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
/// If false, loading multiple maps with this area type will create multiple instances.
var/unique = TRUE
var/no_air = null
@@ -84,6 +84,12 @@ GLOBAL_LIST_EMPTY(teleportlocs)
// ===
/area/New()
// This interacts with the map loader, so it needs to be set immediately
// rather than waiting for atoms to initialize.
if (unique)
GLOB.areas_by_type[type] = src
return ..()
/area/Initialize()
icon_state = ""
@@ -135,9 +141,10 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/LateInitialize()
power_change() // all machines set to current power level, also updates icon
update_beauty()
/area/Destroy()
if(GLOB.areas_by_type[type] == src)
GLOB.areas_by_type[type] = null
STOP_PROCESSING(SSobj, src)
return ..()
@@ -448,26 +455,22 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if(!T)
return 0
//Gravity forced on the atom
var/datum/component/forced_gravity/FG = GetComponent(/datum/component/forced_gravity)
if(FG)
if(!FG.ignore_space && isspaceturf(T))
return 0
else
return FG.gravity
var/list/forced_gravity = list()
SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity)
if(!forced_gravity.len)
SEND_SIGNAL(T, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity)
if(forced_gravity.len)
var/max_grav
for(var/i in forced_gravity)
max_grav = max(max_grav, i)
if(max_grav)
return max_grav
//Gravity forced on the turf
FG = T.GetComponent(/datum/component/forced_gravity)
if(FG)
if(!FG.ignore_space && isspaceturf(T))
return 0
else
return FG.gravity
var/area/A = get_area(T)
if(isspaceturf(T)) // Turf never has gravity
return 0
else if(A.has_gravity) // Areas which always has gravity
var/area/A = get_area(T)
if(A.has_gravity) // Areas which always has gravity
return A.has_gravity
else
// There's a gravity generator on our z level
@@ -488,11 +491,6 @@ GLOBAL_LIST_EMPTY(teleportlocs)
blob_allowed = FALSE
addSorted()
/area/proc/update_beauty()
if(!areasize)
return FALSE
beauty = totalbeauty / areasize
/area/proc/update_areasize()
if(outdoors)
return FALSE
+32 -4
View File
@@ -10,6 +10,8 @@
always_unpowered = FALSE
valid_territory = FALSE
icon_state = "shuttle"
// Loading the same shuttle map at a different time will produce distinct area instances.
unique = FALSE
/area/shuttle/Initialize()
if(!canSmoothWithAreas)
@@ -62,6 +64,35 @@
name = "Pirate Shuttle Vault"
requires_power = FALSE
////////////////////////////White Ship////////////////////////////
/area/shuttle/abandoned
name = "Abandoned Ship"
blob_allowed = FALSE
requires_power = TRUE
canSmoothWithAreas = /area/shuttle/abandoned
/area/shuttle/abandoned/bridge
name = "Abandoned Ship Bridge"
/area/shuttle/abandoned/engine
name = "Abandoned Ship Engine"
/area/shuttle/abandoned/bar
name = "Abandoned Ship Bar"
/area/shuttle/abandoned/crew
name = "Abandoned Ship Crew Quarters"
/area/shuttle/abandoned/cargo
name = "Abandoned Ship Cargo Bay"
/area/shuttle/abandoned/medbay
name = "Abandoned Ship Medbay"
/area/shuttle/abandoned/pod
name = "Abandoned Ship Pod"
////////////////////////////Single-area shuttles////////////////////////////
/area/shuttle/transit
@@ -74,6 +105,7 @@
/area/shuttle/arrival
name = "Arrival Shuttle"
unique = TRUE // SSjob refers to this area for latejoiners
/area/shuttle/pod_1
name = "Escape Pod One"
@@ -125,10 +157,6 @@
name = "Steel Rain"
blob_allowed = FALSE
/area/shuttle/abandoned
name = "Abandoned Ship"
blob_allowed = FALSE
/area/shuttle/sbc_starfury
name = "SBC Starfury"
blob_allowed = FALSE
+99 -16
View File
@@ -24,6 +24,8 @@
var/list/remove_overlays // a very temporary list of overlays to remove
var/list/add_overlays // a very temporary list of overlays to add
var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays
var/datum/proximity_monitor/proximity_monitor
var/buckle_message_cooldown = 0
var/fingerprintslast
@@ -45,10 +47,6 @@
//we were deleted
return
var/list/created = SSatoms.created_atoms
if(created)
created += src
//Called after New if the map is being loaded. mapload = TRUE
//Called from base of New if the map is not being loaded. mapload = FALSE
//This base must be called or derivatives must set initialized to TRUE
@@ -157,7 +155,7 @@
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
if(does_attack_animation)
user.changeNext_move(CLICK_CD_MELEE)
add_logs(user, src, "punched", "hulk powers")
log_combat(user, src, "punched", "hulk powers")
user.do_attack_animation(src, ATTACK_EFFECT_SMASH)
/atom/proc/CheckParts(list/parts_list)
@@ -191,10 +189,8 @@
/atom/proc/check_eye(mob/user)
return
/atom/proc/CollidedWith(atom/movable/AM)
/atom/proc/Bumped(atom/movable/AM)
set waitfor = FALSE
return
// Convenience procs to see if a container is open for chemistry handling
/atom/proc/is_open_container()
@@ -571,7 +567,7 @@
return
/atom/proc/screwdriver_act(mob/living/user, obj/item/I)
return
SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I)
/atom/proc/wrench_act(mob/living/user, obj/item/I)
return
@@ -588,6 +584,99 @@
/atom/proc/GenerateTag()
return
// Generic logging helper
/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE)
if(!log_globally)
return
var/log_text = "[key_name(src)] [message] [loc_name(src)]"
switch(message_type)
if(LOG_ATTACK)
log_attack(log_text)
if(LOG_SAY)
log_say(log_text)
if(LOG_WHISPER)
log_whisper(log_text)
if(LOG_EMOTE)
log_emote(log_text)
if(LOG_SUBTLE)
log_subtle(log_text)
if(LOG_DSAY)
log_dsay(log_text)
if(LOG_PDA)
log_pda(log_text)
if(LOG_CHAT)
log_chat(log_text)
if(LOG_COMMENT)
log_comment(log_text)
if(LOG_TELECOMMS)
log_telecomms(log_text)
if(LOG_OOC)
log_ooc(log_text)
if(LOG_LOOC)
log_looc(log_text)
if(LOG_ADMIN)
log_admin(log_text)
if(LOG_ADMIN_PRIVATE)
log_admin_private(log_text)
if(LOG_ASAY)
log_adminsay(log_text)
if(LOG_OWNERSHIP)
log_game(log_text)
if(LOG_GAME)
log_game(log_text)
else
stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).")
log_game(log_text)
// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements)
/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null)
var/prefix = tag ? "([tag]) " : ""
var/suffix = forced_by ? " FORCED by [forced_by]" : ""
log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally)
// Helper for logging of messages with only one sender and receiver
/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag)
if(!tag)
stack_trace("Unspecified tag for private message")
tag = "UNKNOWN"
source.log_talk(message, message_type, tag="[tag] to [key_name(target)]")
if(source != target)
target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE)
/*
Proc for attack log creation, because really why not
1 argument is the actor performing the action
2 argument is the target of the action
3 is a verb describing the action (e.g. punched, throwed, kicked, etc.)
4 is a tool with which the action was made (usually an item)
5 is any additional text, which will be appended to the rest of the log line
*/
/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null)
var/ssource = key_name(user)
var/starget = key_name(target)
var/mob/living/living_target = target
var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : ""
var/sobject = ""
if(object)
sobject = " with [key_name(object)]"
var/saddition = ""
if(addition)
saddition = " [addition]"
var/postfix = "[sobject][saddition][hp]"
var/message = "has [what_done] [starget][postfix]"
user.log_message(message, LOG_ATTACK, color="red")
if(user != target)
var/reverse_message = "has been [what_done] by [ssource][postfix]"
target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE)
// Filter stuff
/atom/movable/proc/add_filter(name,priority,list/params)
if(!filter_data)
@@ -608,10 +697,4 @@
/atom/movable/proc/get_filter(name)
if(filter_data && filter_data[name])
return filters[filter_data.Find(name)]
/atom/movable/proc/remove_filter(name)
if(filter_data[name])
filter_data -= name
update_filters()
return TRUE
return filters[filter_data.Find(name)]
+121 -23
View File
@@ -1,6 +1,7 @@
/atom/movable
layer = OBJ_LAYER
var/last_move = null
var/last_move_time = 0
var/anchored = FALSE
var/datum/thrownthing/throwing = null
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
@@ -58,9 +59,12 @@
return TRUE
return FALSE
if("loc")
if(var_value == null || istype(var_value, /atom))
if(istype(var_value, /atom))
forceMove(var_value)
return TRUE
else if(isnull(var_value))
moveToNullspace()
return TRUE
return FALSE
return ..()
@@ -84,14 +88,14 @@
return TRUE
stop_pulling()
if(AM.pulledby)
add_logs(AM, AM.pulledby, "pulled from", src)
log_combat(AM, AM.pulledby, "pulled from", src)
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
pulling = AM
AM.pulledby = src
grab_state = gs
if(ismob(AM))
var/mob/M = AM
add_logs(src, M, "grabbed", addition="passive grab")
log_combat(src, M, "grabbed", addition="passive grab")
visible_message("<span class='warning'>[src] has grabbed [M] passively!</span>")
return TRUE
@@ -139,10 +143,54 @@
stop_pulling()
return
////////////////////////////////////////
// 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)
. = FALSE
if(!newloc || newloc == loc)
return
if(!direct)
direct = get_dir(src, newloc)
setDir(direct)
if(!loc.Exit(src, newloc))
return
/atom/movable/Move(atom/newloc, direct = 0)
if(!newloc.Enter(src, src.loc))
return
// Past this is the point of no return
var/atom/oldloc = loc
var/area/oldarea = get_area(oldloc)
var/area/newarea = get_area(newloc)
loc = newloc
. = TRUE
oldloc.Exited(src, newloc)
if(oldarea != newarea)
oldarea.Exited(src, newloc)
for(var/i in oldloc)
if(i == src) // Multi tile objects
continue
var/atom/movable/thing = i
thing.Uncrossed(src)
newloc.Entered(src, oldloc)
if(oldarea != newarea)
newarea.Entered(src, oldloc)
for(var/i in loc)
if(i == src) // Multi tile objects
continue
var/atom/movable/thing = i
thing.Crossed(src)
//
////////////////////////////////////////
/atom/movable/Move(atom/newloc, direct)
var/atom/movable/pullee = pulling
var/turf/T = loc
if(pulling)
@@ -163,7 +211,7 @@
moving_diagonally = FIRST_DIAG_STEP
var/first_step_dir
// The `&& moving_diagonally` checks are so that a forceMove taking
// place due to a Crossed, Collided, etc. call will interrupt
// place due to a Crossed, Bumped, etc. call will interrupt
// the second half of the diagonal movement, or the second attempt
// at a first half if step() fails because we hit something.
if (direct & NORTH)
@@ -257,7 +305,6 @@
return 1
/atom/movable/Destroy(force)
QDEL_NULL(proximity_monitor)
QDEL_NULL(language_holder)
@@ -265,6 +312,10 @@
. = ..()
if(loc)
//Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary)
if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc))
CanAtmosPass = ATMOS_PASS_YES
air_update_turf(TRUE)
loc.handle_atom_del(src)
for(var/atom/movable/AM in contents)
qdel(AM)
@@ -273,28 +324,38 @@
if(pulledby)
pulledby.stop_pulling()
// Make sure you know what you're doing if you call this, this is intended to only be called by byond directly.
// You probably want CanPass()
/atom/movable/Cross(atom/movable/AM)
. = TRUE
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSS, AM)
return CanPass(AM, AM.loc, TRUE)
// Previously known as HasEntered()
// This is automatically called when something enters your square
//oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called!
/atom/movable/Crossed(atom/movable/AM, oldloc)
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
/atom/movable/Uncross(atom/movable/AM, atom/newloc)
. = ..()
if(SEND_SIGNAL(src, COMSIG_MOVABLE_UNCROSS, AM) & COMPONENT_MOVABLE_BLOCK_UNCROSS)
return FALSE
if(isturf(newloc) && !CheckExit(AM, newloc))
return FALSE
/atom/movable/Uncrossed(atom/movable/AM)
SEND_SIGNAL(src, COMSIG_MOVABLE_UNCROSSED, AM)
//This is tg's equivalent to the byond bump, it used to be called bump with a second arg
//to differentiate it, naturally everyone forgot about this immediately and so some things
//would bump twice, so now it's called Collide
/atom/movable/proc/Collide(atom/A)
SEND_SIGNAL(src, COMSIG_MOVABLE_COLLIDE, A)
if(A)
if(throwing)
throwing.hit_atom(A)
. = TRUE
if(!A || QDELETED(A))
return
A.CollidedWith(src)
/atom/movable/Bump(atom/A)
if(!A)
CRASH("Bump was called with no argument.")
SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
. = ..()
if(!QDELETED(throwing))
throwing.hit_atom(A)
. = TRUE
if(QDELETED(A))
return
A.Bumped(src)
/atom/movable/proc/forceMove(atom/destination)
. = FALSE
@@ -322,8 +383,10 @@
if(!same_loc)
if(oldloc)
oldloc.Exited(src, destination)
if(old_area)
if(old_area && old_area != destarea)
old_area.Exited(src, destination)
for(var/atom/movable/AM in oldloc)
AM.Uncrossed(src)
var/turf/oldturf = get_turf(oldloc)
var/turf/destturf = get_turf(destination)
var/old_z = (oldturf ? oldturf.z : null)
@@ -413,6 +476,9 @@
if (!target || speed <= 0)
return
if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_THROW, args) & COMPONENT_CANCEL_THROW)
return
if (pulledby)
pulledby.stop_pulling()
@@ -482,12 +548,11 @@
if(spin)
SpinAnimation(5, 1)
SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_THROW, TT, spin) //CITADEL - THIS IS BORKED. PENDING SYNC.
SEND_SIGNAL(src, COMSIG_MOVABLE_POST_THROW, TT, spin)
SSthrowing.processing[src] = TT
if (SSthrowing.state == SS_PAUSED && length(SSthrowing.currentrun))
SSthrowing.currentrun[src] = TT
TT.tick()
SEND_SIGNAL(src, COMSIG_MOVABLE_POST_THROW, TT, spin)
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
for(var/m in buckled_mobs)
@@ -721,3 +786,36 @@
if(anchored || throwing)
return FALSE
return TRUE
/obj/item/proc/do_pickup_animation(atom/target)
set waitfor = FALSE
if(!istype(loc, /turf))
return
var/image/I = image(icon = src, loc = loc, layer = layer + 0.1)
I.plane = GAME_PLANE
I.transform *= 0.75
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
var/turf/T = get_turf(src)
var/direction
var/to_x = 0
var/to_y = 0
if(!QDELETED(T) && !QDELETED(target))
direction = get_dir(T, target)
if(direction & NORTH)
to_y = 32
else if(direction & SOUTH)
to_y = -32
if(direction & EAST)
to_x = 32
else if(direction & WEST)
to_x = -32
if(!direction)
to_y = 16
flick_overlay(I, GLOB.clients, 6)
var/matrix/M = new
M.Turn(pick(-30, 30))
animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING)
sleep(1)
animate(I, alpha = 0, transform = matrix(), time = 1)
+2 -2
View File
@@ -65,7 +65,7 @@
/datum/atom_hud/sentient_disease
hud_icons = list(SENTIENT_DISEASE_HUD)
/*
/datum/atom_hud/ai_detector
hud_icons = list(AI_DETECT_HUD)
@@ -74,7 +74,7 @@
if(M && (hudusers.len == 1))
for(var/V in GLOB.aiEyes)
var/mob/camera/aiEye/E = V
E.update_ai_detect_hud()*/
E.update_ai_detect_hud()
/* MED/SEC/DIAG HUD HOOKS */
+6 -4
View File
@@ -4,11 +4,11 @@ GLOBAL_VAR_INIT(servants_active, FALSE) //This var controls whether or not a lot
CLOCKWORK CULT: Based off of the failed pull requests from /vg/
While Nar-Sie is the oldest and most prominent of the elder gods, there are other forces at work in the universe.
Ratvar, the Clockwork Justiciar, a homage to Nar-Sie granted sentience by its own power, is one such other force.
While Nar'Sie is the oldest and most prominent of the elder gods, there are other forces at work in the universe.
Ratvar, the Clockwork Justiciar, a homage to Nar'Sie granted sentience by its own power, is one such other force.
Imprisoned within a massive construct known as the Celestial Derelict - or Reebe - an intense hatred of the Blood God festers.
Ratvar, unable to act in the mortal plane, seeks to return and forms covenants with mortals in order to bolster his influence.
Due to his mechanical nature, Ratvar is also capable of influencing silicon-based lifeforms, unlike Nar-Sie, who can only influence natural life.
Due to his mechanical nature, Ratvar is also capable of influencing silicon-based lifeforms, unlike Nar'Sie, who can only influence natural life.
This is a team-based gamemode, and the team's objective is shared by all cultists. Their goal is to defend an object called the Ark on a separate z-level.
@@ -148,11 +148,13 @@ Credit where due:
/datum/game_mode/clockwork_cult/pre_setup()
var/list/errorList = list()
SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
if(errorList.len) // reebe failed to load
message_admins("Reebe failed to load!")
log_game("Reebe failed to load!")
return FALSE
for(var/datum/parsed_map/PM in reebes)
PM.initTemplateBounds()
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_jobs += protected_jobs
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
@@ -74,7 +74,7 @@
. = ..()
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
GET_COMPONENT(slipper, /datum/component/slippery)
slipper.enabled = active
slipper.signal_enabled = active
/obj/item/melee/transforming/energy/sword/bananium/attack(mob/living/M, mob/living/user)
..()
@@ -99,7 +99,7 @@
/obj/item/melee/transforming/energy/sword/bananium/transform_weapon(mob/living/user, supress_message_text)
..()
GET_COMPONENT(slipper, /datum/component/slippery)
slipper.enabled = active
slipper.signal_enabled = active
/obj/item/melee/transforming/energy/sword/bananium/ignition_effect(atom/A, mob/user)
return ""
@@ -131,12 +131,12 @@
. = ..()
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
GET_COMPONENT(slipper, /datum/component/slippery)
slipper.enabled = active
slipper.signal_enabled = active
/obj/item/shield/energy/bananium/attack_self(mob/living/carbon/human/user)
..()
GET_COMPONENT(slipper, /datum/component/slippery)
slipper.enabled = active
slipper.signal_enabled = active
/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1)
if(active)
+3 -3
View File
@@ -43,8 +43,8 @@
enemy_minimum_age = 14
announce_span = "cult"
announce_text = "Some crew members are trying to start a cult to Nar-Sie!\n\
<span class='cult'>Cultists</span>: Carry out Nar-Sie's will.\n\
announce_text = "Some crew members are trying to start a cult to Nar'Sie!\n\
<span class='cult'>Cultists</span>: Carry out Nar'Sie's will.\n\
<span class='notice'>Crew</span>: Prevent the cult from expanding and drive it out."
var/finished = 0
@@ -158,7 +158,7 @@
/datum/game_mode/cult/generate_report()
return "Some stations in your sector have reported evidence of blood sacrifice and strange magic. Ties to the Wizards' Federation have been proven not to exist, and many employees \
have disappeared; even Central Command employees light-years away have felt strange presences and at times hysterical compulsions. Interrogations point towards this being the work of \
the cult of Nar-Sie. If evidence of this cult is discovered aboard your station, extreme caution and extreme vigilance must be taken going forward, and all resources should be \
the cult of Nar'Sie. If evidence of this cult is discovered aboard your station, extreme caution and extreme vigilance must be taken going forward, and all resources should be \
devoted to stopping this cult. Note that holy water seems to weaken and eventually return the minds of cultists that ingest it, and mindshield implants will prevent conversion \
altogether."
+6 -7
View File
@@ -47,9 +47,8 @@
var/allow_persistence_save = TRUE
var/gamemode_ready = FALSE //Is the gamemode all set up and ready to start checking for ending conditions.
var/flipseclevel = FALSE //CIT CHANGE - adds a 10% chance for the alert level to be the opposite of what the gamemode is supposed to have
var/setup_error //What stopepd setting up the mode.
var/flipseclevel = FALSE //CIT CHANGE - adds a 10% chance for the alert level to be the opposite of what the gamemode is supposed to have
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
@@ -87,7 +86,6 @@
if(prob(20)) //CIT CHANGE - adds a 20% chance for the security level to be the opposite of what it normally is
flipseclevel = TRUE
if(SSdbcore.Connect())
var/sql
if(SSticker.mode)
@@ -181,12 +179,13 @@
round_converted = 0
return
//somewhere between 1 and 3 minutes from now
if(!CONFIG_GET(keyed_flag_list/midround_antag)[SSticker.mode.config_tag])
if(!CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag])
round_converted = 0
return 1
for(var/mob/living/carbon/human/H in antag_candidates)
if(H.client)
replacementmode.make_antag_chance(H)
replacementmode.gamemode_ready = TRUE //Awful but we're not doing standard setup here.
round_converted = 2
message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --")
@@ -209,8 +208,8 @@
return TRUE
if(station_was_nuked)
return TRUE
var/list/continuous = CONFIG_GET(keyed_flag_list/continuous)
var/list/midround_antag = CONFIG_GET(keyed_flag_list/midround_antag)
var/list/continuous = CONFIG_GET(keyed_list/continuous)
var/list/midround_antag = CONFIG_GET(keyed_list/midround_antag)
if(!round_converted && (!continuous[config_tag] || (continuous[config_tag] && midround_antag[config_tag]))) //Non-continuous or continous with replacement antags
if(!continuous_sanity_checked) //make sure we have antags to be checking in the first place
for(var/mob/Player in GLOB.mob_list)
@@ -226,7 +225,7 @@
return 0
if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player) && (living_antag_player.mind.special_role || LAZYLEN(living_antag_player.mind.antag_datums)))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in GLOB.alive_mob_list)
+3 -3
View File
@@ -132,7 +132,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
timerid = QDEL_IN(src, lifetime)
chase_target(target)
/obj/effect/meteor/Collide(atom/A)
/obj/effect/meteor/Bump(atom/A)
if(A)
ram_turf(get_turf(A))
playsound(src.loc, meteorsound, 40, 1)
@@ -301,7 +301,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
if(!isspaceturf(T))
new /obj/effect/decal/cleanable/blood(T)
/obj/effect/meteor/meaty/Collide(atom/A)
/obj/effect/meteor/meaty/Bump(atom/A)
A.ex_act(hitpwr)
get_hit()
@@ -340,7 +340,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
..()
explosion(src.loc, 5, 10, 15, 20, 0)
/obj/effect/meteor/tunguska/Collide()
/obj/effect/meteor/tunguska/Bump()
..()
if(prob(20))
explosion(src.loc,2,4,6,8)
+6 -10
View File
@@ -64,17 +64,13 @@
return FALSE
return TRUE
/datum/game_mode/nuclear/check_finished() //to be called by SSticker
if(replacementmode && round_converted == 2)
return replacementmode.check_finished()
if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked)
return TRUE
/datum/game_mode/nuclear/check_finished()
//Keep the round going if ops are dead but bomb is ticking.
if(nuke_team.operatives_dead())
var/obj/machinery/nuclearbomb/N
pass(N) //suppress unused warning
if(N.bomb_set) //snaaaaaaaaaake! It's not over yet!
return FALSE //its a static var btw
..()
for(var/obj/machinery/nuclearbomb/N in GLOB.nuke_list)
if(N.proper_bomb && (N.timing || N.exploding))
return FALSE
return ..()
/datum/game_mode/nuclear/set_round_result()
..()
+5 -3
View File
@@ -25,12 +25,14 @@ GLOBAL_LIST_EMPTY(objectives)
/datum/objective/proc/considered_escaped(datum/mind/M)
if(!considered_alive(M))
return FALSE
if(M.force_escaped)
return TRUE
if(SSticker.force_ending || SSticker.mode.station_was_nuked) // Just let them win.
return TRUE
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
return FALSE
var/turf/location = get_turf(M.current)
if(!location || istype(location, /turf/open/floor/plasteel/shuttle/red) || istype(location, /turf/open/floor/mineral/plastitanium/brig)) // Fails if they are in the shuttle brig
if(!location || istype(location, /turf/open/floor/plasteel/shuttle/red) || istype(location, /turf/open/floor/mineral/plastitanium/red/brig)) // Fails if they are in the shuttle brig
return FALSE
return location.onCentCom() || location.onSyndieBase()
@@ -161,7 +163,7 @@ GLOBAL_LIST_EMPTY(objectives)
if(!target || !considered_alive(target) || considered_afk(target))
return TRUE
var/turf/T = get_turf(target.current)
return T && !is_station_level(T.z)
return !T || !is_station_level(T.z)
/datum/objective/mutiny/update_explanation_text()
..()
@@ -546,7 +548,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
var/captured_amount = 0
var/area/centcom/holding/A = locate() in GLOB.sortedAreas
var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
+152
View File
@@ -0,0 +1,152 @@
// This is a point based objective. You can only lose if you fail to even handle one single command personnel, else you win. But, if you win, you're given a certain number of points,
// based on the role of the head (Captain, HoP/HoS, other heads, warden, security officers) and whether you converted them, exiled or just killed (applying a modifier of 1.5, 1 and 0.5 respectively)
// because this is meant for the overthrow gamemode, which is a bloodless coup, unlike revs.
// Point system:
// Base points for each role:
// AI, Captain = 5;
// Head of Personnel, Head of Security, target = 4;
// Chief Engineer, Chief Medical Officer, Research Director = 3;
// Modifiers:
// Converting: 1.5 for the converting team, 1 for all the other ones;
// Exiling: 1;
// Killing: 0.5
#define CAPPTS 5
#define AIPTS 5
#define HOPPTS 4
#define HOSPTS 4
#define TARGETPTS 4
#define CEPTS 3
#define CMOPTS 3
#define RDPTS 3
#define CONVERTED_OURS 1.5
#define CONVERTED 1
#define EXILED 1
#define KILLED 0.5
// Parent type holding the get_points proc used for round end log.
/datum/objective/overthrow
/datum/objective/overthrow/check_completion()
return get_points() ? TRUE : FALSE
/datum/objective/overthrow/proc/get_points()
return 0 // int, not bool
/datum/objective/overthrow/proc/result_points(datum/mind/the_dude, base_points) // App
var/initial_points = base_points
if(the_dude)
var/datum/antagonist/overthrow/O = the_dude.has_antag_datum(/datum/antagonist/overthrow)
if(!the_dude.current || the_dude.current.stat == DEAD)
initial_points *= KILLED
else if(!is_station_level(the_dude.current.z) && !is_centcom_level(the_dude.current.z)) // exiled.
initial_points *= EXILED
else if(O)
initial_points *= CONVERTED
if(team == O.team)
initial_points *= CONVERTED_OURS
else
initial_points = 0
else
initial_points = 0
return initial_points
// Heads overthrow objective. This targets the heads only, assigning points based on the rank of the head, captain being the highest target.
/datum/objective/overthrow/heads
var/list/targets = list() // We want one objective for all the heads, instead of 1 objective per head like how it's done for revs, because you don't lose if you get atleast one head.
// Also, this is an associative list, target = role. Modifiers (defines) are applied on points calculation at round end.
/datum/objective/overthrow/heads/proc/find_targets()
var/list/datum/mind/owners = get_owners()
for(var/datum/mind/possible_target in get_crewmember_minds()) // i would use SSjob.get_all_heads() but jesus christ that proc's shit, i ain't using it
if(!(possible_target in owners) && ishuman(possible_target.current))
if(possible_target.assigned_role in GLOB.command_positions)
targets[possible_target] = possible_target.assigned_role
update_explanation_text()
/datum/objective/overthrow/heads/update_explanation_text()
if(targets.len)
explanation_text = "Work with your team to convert, exile or kill "
explanation_text += english_list(targets)
explanation_text += ". Converting to your team will give you more points, whereas killing will give you the least. Syndicates don't want to stir up too many troubles."
else
explanation_text = "Wait until any heads arrive. Once that happens, check your objectives again to see the updated objective. It may require around [OBJECTIVE_UPDATING_TIME] seconds to update."
/datum/objective/overthrow/heads/check_completion()
if(!targets.len)
return TRUE
. = ..()
// Amount of points = foreach head, result += head basepoints * modifier.
/datum/objective/overthrow/heads/get_points()
var/base_points = 0
for(var/i in targets)
var/datum/mind/M = i
if(M)
var/target_points
var/role = targets[M]
switch(role)
if("Captain")
target_points = CAPPTS
if("Head of Personnel")
target_points = HOPPTS
if("Head of Security")
target_points = HOSPTS
if("Chief Engineer")
target_points = CEPTS
if("Research Director")
target_points = RDPTS
if("Chief Medical Officer")
target_points = CMOPTS
base_points += result_points(M, target_points)
return base_points
// AI converting objective. The team who managed to convert the AI with the overthrow module gets the normal 1.5x boost.
/datum/objective/overthrow/AI
explanation_text = "Enslave the AIs to your team using the special AI module board in your storage implant. It is required you use said module."
/datum/objective/overthrow/AI/get_points() // If you simply kill the Ai you get nothing, you need it to overthrow the heads.
. = 0 // Support for multiple AIs. More AIs means more control over the station.
for(var/i in GLOB.ai_list)
var/mob/living/silicon/ai/AI = i
if(AI.mind)
var/datum/mind/M = AI.mind
var/datum/antagonist/overthrow/O = M.has_antag_datum(/datum/antagonist/overthrow)
if(M)
. += (O.team == team) ? AIPTS*CONVERTED_OURS : AIPTS
/datum/objective/overthrow/AI/update_explanation_text()
if(!GLOB.ai_list.len)
explanation_text = "Nothing."
else
explanation_text = "Enslave the AIs to your team using the special AI module board in your storage implant. It is required you use said module."
/datum/objective/overthrow/AI/check_completion()
if(!GLOB.ai_list.len)
return TRUE
. = ..()
// Overthrow target objective. A crewmember in particular has a certain bond with some centcom officials, and the Syndicate want you to target him in particular, even though he's not a head.
/datum/objective/overthrow/target
/datum/objective/overthrow/target/update_explanation_text()
if(target)
explanation_text = "Work with your team to convert, exile or kill [target.name], the [target.assigned_role]. Converting to your team will give you more points, whereas killing will give you the least. Syndicates don't want to stir up too many troubles."
else
explanation_text = "Nothing."
/datum/objective/overthrow/target/is_unique_objective(datum/mind/possible_target)
if(possible_target.assigned_role in GLOB.command_positions)
return FALSE
return TRUE
/datum/objective/overthrow/target/check_completion()
if(!target)
return TRUE
. = ..()
/datum/objective/overthrow/target/get_points()
return result_points(target, TARGETPTS)
@@ -0,0 +1,76 @@
// Overthrow gamemode, based on the sleeping agent antagonist.
/datum/game_mode/overthrow
name = "overthrow"
config_tag = "overthrow"
antag_flag = ROLE_OVERTHROW
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
required_players = 20 // the core idea is of a swift, bloodless coup, so it shouldn't be as chaotic as revs.
required_enemies = 2 // minimum two teams, otherwise it's just nerfed revs.
recommended_enemies = 4
announce_span = "danger"
announce_text = "There are sleeping Syndicate agents on the station who are trying to stage a coup!\n\
<span class='danger'>Agents</span>: Accomplish your objectives, convert heads and targets, take control of the AI.\n\
<span class='notice'>Crew</span>: Do not let the agents succeed!"
var/list/initial_agents = list() // Why doesn't this exist at /game_mode level? Literally every gamemode has some sort of version for this, what the fuck
/datum/game_mode/overthrow/pre_setup()
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_jobs += protected_jobs
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
restricted_jobs += "Assistant"
var/sleeping_agents = required_enemies + round(num_players()*0.05) // At 100 players, it'd be 2 + 5 = 7 teams existing.
for (var/i in 1 to sleeping_agents)
if (!antag_candidates.len)
break
var/datum/mind/sleeping_agent = antag_pick(antag_candidates)
antag_candidates -= sleeping_agent
initial_agents += sleeping_agent
sleeping_agent.restricted_roles = restricted_jobs
sleeping_agent.special_role = ROLE_OVERTHROW
if(initial_agents.len < required_enemies)
setup_error = "Not enough initial sleeping agents candidates"
return FALSE
return TRUE
/datum/game_mode/overthrow/post_setup()
for(var/i in initial_agents) // each agent will have its own team.
var/datum/mind/agent = i
var/datum/antagonist/overthrow/O = agent.add_antag_datum(/datum/antagonist/overthrow) // create_team called on_gain will create the team
O.equip_initial_overthrow_agent()
return ..()
/datum/game_mode/overthrow/generate_report()
return "Some sleeping agents have managed to get aboard. Their objective is to stage a coup and take over the station stealthly."
// Calculates points for each team and displays the winners.
/datum/game_mode/overthrow/special_report() // so many for loops, I am deeply sorry
var/list/teams = list()
for(var/datum/antagonist/overthrow/I in GLOB.antagonists)
var/datum/team/overthrow/Oteam = I.team
if(istype(Oteam)) // same
teams |= Oteam
var/max_points = 0 // the maximum amount of points reached
for(var/j in teams)
var/datum/team/T = j
var/points = 0 // Sum of points of all the objectives done
for(var/k in T.objectives)
var/datum/objective/overthrow/obj = k
if(istype(obj))
points += obj.get_points()
if(max_points < points)
max_points = points
teams[T] = points
// Now we will have a list of team=points and a max_points var. Let's fetch all the teams with points=maxpoints and display them as winner. This code allows multiple teams to win if they both achieved
// the same amount of points and they got the most points out of all the teams.
var/list/winners = list()
for(var/l in teams)
var/datum/team/Tagain = l
if(teams[Tagain] == max_points)
winners += Tagain.name
return "<span class='greentext big'>The [english_list(winners)] team[winners.len > 1 ? "s tied" : " won"] with [max_points] points!</span>"
+1 -1
View File
@@ -133,7 +133,7 @@
//Checks if the round is over//
///////////////////////////////
/datum/game_mode/revolution/check_finished()
if(CONFIG_GET(keyed_flag_list/continuous)["revolution"])
if(CONFIG_GET(keyed_list/continuous)["revolution"])
if(finished)
SSshuttle.clearHostileEnvironment(src)
return ..()
+2 -1
View File
@@ -11,6 +11,7 @@
recommended_enemies = 8
reroll_friendly = 0
traitor_name = "Nanotrasen Internal Affairs Agent"
antag_flag = ROLE_INTERNAL_AFFAIRS
traitors_possible = 10 //hard limit on traitors if scaling is turned off
num_modifier = 4 // Four additional traitors
@@ -28,7 +29,7 @@
i++
if(i + 1 > pre_traitors.len)
i = 0
target_list[traitor] = pre_traitors[i+1]
target_list[traitor] = pre_traitors[i+1]
..()
+1 -1
View File
@@ -84,7 +84,7 @@
if((SSticker.mode.traitors.len + pre_traitors.len) >= traitorcap) //Upper cap for number of latejoin antagonists
return
if((SSticker.mode.traitors.len + pre_traitors.len) <= (traitorcap - 2) || prob(100 / (tsc * 2)))
if(ROLE_TRAITOR in character.client.prefs.be_special)
if(antag_flag in character.client.prefs.be_special)
if(!jobban_isbanned(character, ROLE_TRAITOR) && !QDELETED(character) && !jobban_isbanned(character, ROLE_SYNDICATE) && !QDELETED(character))
if(age_check(character.client))
if(!(character.job in restricted_jobs))
+1 -1
View File
@@ -130,7 +130,7 @@
set category = "Object"
set src in oview(1)
if(usr.stat || usr.restrained() || !usr.canmove)
if(usr.stat || usr.restrained())
return
if(storedpda)
+15 -3
View File
@@ -28,6 +28,7 @@
/obj/machinery/sleeper/Initialize()
. = ..()
occupant_typecache = GLOB.typecache_living
update_icon()
reset_chem_buttons()
@@ -147,7 +148,7 @@
data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss()
data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss()
data["occupant"]["reagents"] = list()
if(occupant.reagents.reagent_list.len)
if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len)
for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume))
return data
@@ -183,12 +184,12 @@
if((chem in available_chems) && chem_allowed(chem))
occupant.reagents.add_reagent(chem_buttons[chem], 10) //emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU
if(user)
add_logs(user, occupant, "injected [chem] into", addition = "via [src]")
log_combat(user, occupant, "injected [chem] into", addition = "via [src]")
return TRUE
/obj/machinery/sleeper/proc/chem_allowed(chem)
var/mob/living/mob_occupant = occupant
if(!mob_occupant)
if(!mob_occupant || !mob_occupant.reagents)
return
var/amount = mob_occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency
var/occ_health = mob_occupant.health > min_health || chem == "epinephrine"
@@ -211,6 +212,17 @@
icon_state = "sleeper_s"
controls_inside = TRUE
/obj/machinery/sleeper/syndie/fullupgrade/Initialize()
. = ..()
component_parts = list()
component_parts += new /obj/item/circuitboard/machine/sleeper(null)
component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null)
component_parts += new /obj/item/stock_parts/manipulator/femto(null)
component_parts += new /obj/item/stack/sheet/glass(null)
component_parts += new /obj/item/stack/sheet/glass(null)
component_parts += new /obj/item/stack/cable_coil(null)
RefreshParts()
/obj/machinery/sleeper/clockwork
name = "soothing sleeper"
desc = "A large cryogenics unit built from brass. Its surface is pleasantly cool the touch."
+13 -11
View File
@@ -120,7 +120,7 @@ Class Procs:
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
. = ..()
GLOB.machines += src
if(ispath(circuit, /obj/item/circuitboard))
circuit = new circuit
circuit.apply_default_parts(src)
@@ -130,7 +130,7 @@ Class Procs:
else
START_PROCESSING(SSfastprocess, src)
power_change()
AddComponent(/datum/component/redirect, list(COMSIG_ENTER_AREA), CALLBACK(src, .proc/power_change))
AddComponent(/datum/component/redirect, list(COMSIG_ENTER_AREA = CALLBACK(src, .proc/power_change)))
if (occupant_typecache)
occupant_typecache = typecacheof(occupant_typecache)
@@ -218,10 +218,17 @@ Class Procs:
if(panel_open && !(interaction_flags_machine & INTERACT_MACHINE_OPEN))
if(!silicon || !(interaction_flags_machine & INTERACT_MACHINE_OPEN_SILICON))
return FALSE
if(!silicon && (interaction_flags_machine & INTERACT_MACHINE_REQUIRES_SILICON))
return FALSE
else if(silicon && !(interaction_flags_machine & INTERACT_MACHINE_ALLOW_SILICON))
return FALSE
if(silicon)
if(!(interaction_flags_machine & INTERACT_MACHINE_ALLOW_SILICON))
return FALSE
else
if(interaction_flags_machine & INTERACT_MACHINE_REQUIRES_SILICON)
return FALSE
if(!Adjacent(user))
var/mob/living/carbon/H = user
if(!(istype(H) && H.has_dna() && H.dna.check_mutation(TK)))
return FALSE
return TRUE
////////////////////////////////////////////////////////////////////////////////////////////
@@ -232,11 +239,6 @@ Class Procs:
user.set_machine(src)
. = ..()
/obj/machinery/ui_status(mob/user)
if(can_interact(user))
return ..()
return UI_CLOSE
/obj/machinery/ui_act(action, params)
add_fingerprint(usr)
return ..()
+2 -1
View File
@@ -12,7 +12,8 @@
/obj/machinery/aug_manipulator/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to eject the limb.</span>")
if(storedpart)
to_chat(user, "<span class='notice'>Alt-click to eject the limb.</span>")
/obj/machinery/aug_manipulator/Initialize()
initial_icon_state = initial(icon_state)
+3
View File
@@ -83,6 +83,7 @@
if(bug.current == src)
bug.current = null
bug = null
cancelCameraAlarm()
return ..()
/obj/machinery/camera/emp_act(severity)
@@ -139,6 +140,8 @@
// Construction/Deconstruction
/obj/machinery/camera/screwdriver_act(mob/living/user, obj/item/I)
if(..())
return TRUE
panel_open = !panel_open
to_chat(user, "<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
I.play_tool_sound(src)
@@ -87,6 +87,9 @@
return TRUE
/obj/structure/camera_assembly/screwdriver_act(mob/user, obj/item/tool)
. = ..()
if(.)
return TRUE
if(state != 3)
return FALSE
+1
View File
@@ -42,6 +42,7 @@
localMotionTargets = null
if(istype(A))
A.motioncameras -= src
cancelAlarm()
return ..()
/obj/machinery/camera/proc/lostTargetRef(datum/weakref/R)
+1
View File
@@ -8,6 +8,7 @@
active_power_usage = 60
power_channel = EQUIP
circuit = /obj/item/circuitboard/machine/cell_charger
pass_flags = PASSTABLE
var/obj/item/stock_parts/cell/charging = null
var/chargelevel = -1
var/charge_rate = 500
+40 -1
View File
@@ -1,3 +1,6 @@
#define MENU_OPERATION 1
#define MENU_SURGERIES 2
/obj/machinery/computer/operating
name = "operating computer"
desc = "Monitors patient vitals and displays surgery steps. Can be loaded with surgery disks to perform experimental procedures."
@@ -7,10 +10,13 @@
var/mob/living/carbon/human/patient
var/obj/structure/table/optable/table
var/list/advanced_surgeries = list()
var/datum/techweb/linked_techweb
var/menu = MENU_OPERATION
light_color = LIGHT_COLOR_BLUE
/obj/machinery/computer/operating/Initialize()
. = ..()
linked_techweb = SSresearch.science_tech
find_table()
/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, params)
@@ -24,6 +30,13 @@
return TRUE
return ..()
/obj/machinery/computer/operating/proc/sync_surgeries()
for(var/i in linked_techweb.researched_designs)
var/datum/design/surgery/D = linked_techweb.researched_designs[i]
if(!istype(D))
continue
advanced_surgeries |= D.surgery
/obj/machinery/computer/operating/proc/find_table()
for(var/direction in GLOB.cardinals)
table = locate(/obj/structure/table/optable, get_step(src, direction))
@@ -41,6 +54,17 @@
var/list/data = list()
data["table"] = table
if(table)
data["menu"] = menu
var/list/surgeries = list()
for(var/X in advanced_surgeries)
var/datum/surgery/S = X
var/list/surgery = list()
surgery["name"] = initial(S.name)
surgery["desc"] = initial(S.desc)
surgeries += list(surgery)
data["surgeries"] = surgeries
data["patient"] = list()
if(table.check_patient())
patient = table.patient
@@ -86,4 +110,19 @@
"alternative_step" = alternative_step,
"alt_chems_needed" = alt_chems_needed
))
return data
return data
/obj/machinery/computer/operating/ui_act(action, params)
if(..())
return
switch(action)
if("change_menu")
menu = text2num(params["menu"])
. = TRUE
if("sync")
sync_surgeries()
. = TRUE
. = TRUE
#undef MENU_OPERATION
#undef MENU_SURGERIES
+12 -5
View File
@@ -9,7 +9,7 @@
max_integrity = 200
integrity_failure = 100
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 20)
var/brightness_on = 2
var/brightness_on = 1
var/icon_keyboard = "generic_key"
var/icon_screen = "generic"
var/clockwork = FALSE
@@ -49,14 +49,19 @@
/obj/machinery/computer/update_icon()
cut_overlays()
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
if(stat & NOPOWER)
add_overlay("[icon_keyboard]_off")
return
add_overlay(icon_keyboard)
// This whole block lets screens ignore lighting and be visible even in the darkest room
// We can't do this for many things that emit light unfortunately because it layers over things that would be on top of it
var/overlay_state = icon_screen
if(stat & BROKEN)
add_overlay("[icon_state]_broken")
else
add_overlay(icon_screen)
overlay_state = "[icon_state]_broken"
SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir)
SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir, alpha=128)
/obj/machinery/computer/power_change()
..()
@@ -68,6 +73,8 @@
return
/obj/machinery/computer/screwdriver_act(mob/living/user, obj/item/I)
if(..())
return TRUE
if(circuit && !(flags_1&NODECONSTRUCT_1))
to_chat(user, "<span class='notice'>You start to disconnect the monitor...</span>")
if(I.use_tool(src, user, 20, volume=50))
@@ -109,7 +116,7 @@
if(!(flags_1 & NODECONSTRUCT_1))
if(circuit) //no circuit, no computer frame
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
A.dir = dir
A.setDir(dir)
A.circuit = circuit
A.setAnchored(TRUE)
if(stat & BROKEN)
+4 -1
View File
@@ -28,6 +28,7 @@
playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0)
active_apc.locked = TRUE
active_apc.update_icon()
active_apc.remote_control = null
active_apc = null
/obj/machinery/computer/apc_control/attack_ai(mob/user)
@@ -121,10 +122,12 @@
playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0)
active_apc.locked = TRUE
active_apc.update_icon()
active_apc.remote_control = null
active_apc = null
to_chat(usr, "<span class='robot notice'>[icon2html(src, usr)] Connected to APC in [get_area_name(APC.area, TRUE)]. Interface request sent.</span>")
log_activity("remotely accessed APC in [get_area_name(APC.area, TRUE)]")
APC.ui_interact(usr, state = GLOB.not_incapacitated_state)
APC.remote_control = src
APC.ui_interact(usr)
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
message_admins("[ADMIN_LOOKUPFLW(usr)] remotely accessed [APC] from [src] at [AREACOORD(src)].")
log_game("[key_name(usr)] remotely accessed [APC] from [src] at [AREACOORD(src)].")
+11 -2
View File
@@ -367,6 +367,15 @@
var/gameStatus = ORION_STATUS_START
var/canContinueEvent = 0
/obj/machinery/computer/arcade/orion_trail/kobayashi
name = "Kobayashi Maru control computer"
desc = "A test for cadets"
icon = 'icons/obj/machines/particle_accelerator.dmi'
icon_state = "control_boxp"
events = list("Raiders" = 3, "Interstellar Flux" = 1, "Illness" = 3, "Breakdown" = 2, "Malfunction" = 2, "Collision" = 1, "Spaceport" = 2)
prizes = list(/obj/item/paper/fluff/holodeck/trek_diploma = 1)
settlers = list("Kirk","Worf","Gene")
/obj/machinery/computer/arcade/orion_trail/Reset()
// Sets up the main trail
stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime")
@@ -704,7 +713,7 @@
say("WEEWOO! WEEWOO! Spaceport security en route!")
playsound(src, 'sound/items/weeoo1.ogg', 100, FALSE)
for(var/i, i<=3, i++)
var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src))
var/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion(get_turf(src))
O.target = usr
@@ -1047,7 +1056,7 @@
newgame()
obj_flags |= EMAGGED
/mob/living/simple_animal/hostile/syndicate/ranged/orion
/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion
name = "spaceport security"
desc = "Premier corporate security forces for all spaceports found along the Orion Trail."
faction = list("orion")
@@ -272,7 +272,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers)
/obj/machinery/computer/atmos_control/tank/ui_act(action, params)
if(..() || !radio_connection)
return
var/datum/signal/signal = new(list("sigtype" = "command"))
var/datum/signal/signal = new(list("sigtype" = "command", "user" = usr))
switch(action)
if("reconnect")
reconnect(usr)
@@ -114,7 +114,7 @@
P.play_tool_sound(src)
to_chat(user, "<span class='notice'>You connect the monitor.</span>")
var/obj/B = new circuit.build_path (loc, circuit)
B.dir = dir
B.setDir(dir)
transfer_fingerprints_to(B)
qdel(src)
return
+1
View File
@@ -161,6 +161,7 @@
icon_keyboard = null
icon_screen = "detective_tv"
clockwork = TRUE //it'd look weird
pass_flags = PASSTABLE
/obj/machinery/computer/security/mining
name = "outpost camera console"
+14 -15
View File
@@ -54,9 +54,13 @@
var/datum/action/A = V
A.Remove(user)
actions.Cut()
for(var/V in eyeobj.visibleCameraChunks)
var/datum/camerachunk/C = V
C.remove(eyeobj)
if(user.client)
user.reset_perspective(null)
eyeobj.RemoveImages()
if(eyeobj.visible_icon && user.client)
user.client.images -= eyeobj.user_image
eyeobj.eye_user = null
user.remote_control = null
@@ -105,7 +109,7 @@
if(!eyeobj.eye_initialized)
var/camera_location
var/turf/myturf = get_turf(src)
if(eyeobj.use_static)
if(eyeobj.use_static != USE_STATIC_NONE)
if((!z_lock.len || (myturf.z in z_lock)) && GLOB.cameranet.checkTurfVis(myturf))
camera_location = myturf
else
@@ -148,6 +152,7 @@
/mob/camera/aiEye/remote
name = "Inactive Camera Eye"
ai_detector_visible = FALSE
var/sprint = 10
var/cooldown = 0
var/acceleration = 1
@@ -163,17 +168,12 @@
user.see_in_dark = 2
return 1
/mob/camera/aiEye/remote/RemoveImages()
..()
if(visible_icon)
var/client/C = GetViewerClient()
if(C)
C.images -= user_image
/mob/camera/aiEye/remote/Destroy()
eye_user = null
if(origin && eye_user)
origin.remove_eye_control(eye_user)
origin = null
return ..()
. = ..()
eye_user = null
/mob/camera/aiEye/remote/GetViewerClient()
if(eye_user)
@@ -182,15 +182,14 @@
/mob/camera/aiEye/remote/setLoc(T)
if(eye_user)
if(!isturf(eye_user.loc))
return
T = get_turf(T)
if (T)
forceMove(T)
else
moveToNullspace()
if(use_static)
GLOB.cameranet.visibility(src, GetViewerClient())
update_ai_detect_hud()
if(use_static != USE_STATIC_NONE)
GLOB.cameranet.visibility(src, GetViewerClient(), null, use_static)
if(visible_icon)
if(eye_user.client)
eye_user.client.images -= user_image
+1
View File
@@ -468,6 +468,7 @@
// We store the instance rather than the path, because some
// species (abductors, slimepeople) store state in their
// species datums
dna.delete_species = FALSE
R.fields["mrace"] = dna.species
else
var/datum/species/rando_race = pick(GLOB.roundstart_races)
+23 -20
View File
@@ -52,6 +52,8 @@
/obj/machinery/computer/communications/Topic(href, href_list)
if(..())
return
if(!usr.canUseTopic(src))
return
if(!is_station_level(z) && !is_reserved_level(z)) //Can only use in transit and on SS13
to_chat(usr, "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!")
return
@@ -144,7 +146,7 @@
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
send2otherserver("[station_name()]", input,"Comms_Console")
minor_announce(input, title = "Outgoing message to allied station")
log_talk(usr,"[key_name(usr)] has sent a message to the other server: [input]",LOGSAY)
usr.log_talk(input, LOG_SAY, tag="message to the other server")
message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server.")
deadchat_broadcast("<span class='deadsay bold'>[usr.real_name] has sent an outgoing message to the other station(s).</span>", usr)
CM.lastTimeUsed = world.time
@@ -198,10 +200,7 @@
state = STATE_CANCELSHUTTLE
if("cancelshuttle2")
if(authenticated)
if(world.time > SSshuttle.auto_call)
say("Warning: Emergency shuttle recalls have been blocked by Central Command due to ongoing crew transfer procedures.")
else
SSshuttle.cancelEvac(usr)
SSshuttle.cancelEvac(usr)
state = STATE_DEFAULT
if("messagelist")
currmsg = 0
@@ -230,12 +229,14 @@
var/answer = text2num(href_list["answer"])
if(!currmsg || !answer || currmsg.possible_answers.len < answer)
state = STATE_MESSAGELIST
currmsg.answered = answer
log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]")
if(currmsg)
currmsg.answer_callback.Invoke()
state = STATE_VIEWMESSAGE
else
if(!currmsg.answered)
currmsg.answered = answer
log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]")
if(currmsg)
currmsg.answer_callback.InvokeAsync()
state = STATE_VIEWMESSAGE
updateDialog()
if("status")
state = STATE_STATUSDISPLAY
if("securitylevel")
@@ -291,7 +292,7 @@
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
CentCom_announce(input, usr)
to_chat(usr, "<span class='notice'>Message transmitted to Central Command.</span>")
log_talk(usr,"[key_name(usr)] has made a CentCom announcement: [input]",LOGSAY)
usr.log_talk(input, LOG_SAY, tag="CentCom announcement")
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has messaged CentCom, \"[input]\" at <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", usr)
CM.lastTimeUsed = world.time
@@ -308,7 +309,7 @@
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
Syndicate_announce(input, usr)
to_chat(usr, "<span class='danger'>SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.</span>")
log_talk(usr,"[key_name(usr)] has made a Syndicate announcement: [input]",LOGSAY)
usr.log_talk(input, LOG_SAY, tag="Syndicate announcement")
deadchat_broadcast("<span class='deadsay'><span class='name'>[usr.real_name]</span> has messaged the Syndicate, \"[input]\" at <span class='name'>[get_area_name(usr, TRUE)]</span>.</span>", usr)
CM.lastTimeUsed = world.time
@@ -328,7 +329,7 @@
return
Nuke_request(input, usr)
to_chat(usr, "<span class='notice'>Request sent.</span>")
log_talk(usr,"[key_name(usr)] has requested the nuclear codes from CentCom",LOGSAY)
usr.log_message("has requested the nuclear codes from CentCom", LOG_SAY)
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/ai/commandreport.ogg')
CM.lastTimeUsed = world.time
@@ -366,11 +367,13 @@
var/answer = text2num(href_list["answer"])
if(!aicurrmsg || !answer || aicurrmsg.possible_answers.len < answer)
aistate = STATE_MESSAGELIST
aicurrmsg.answered = answer
log_game("[key_name(usr)] answered [aicurrmsg.title] comm message. Answer : [aicurrmsg.answered]")
if(aicurrmsg.answer_callback)
aicurrmsg.answer_callback.Invoke()
aistate = STATE_VIEWMESSAGE
else
if(!aicurrmsg.answered)
aicurrmsg.answered = answer
log_game("[key_name(usr)] answered [aicurrmsg.title] comm message. Answer : [aicurrmsg.answered]")
if(aicurrmsg.answer_callback)
aicurrmsg.answer_callback.InvokeAsync()
aistate = STATE_VIEWMESSAGE
if("ai-status")
aistate = STATE_STATUSDISPLAY
if("ai-announce")
@@ -476,7 +479,7 @@
if (authenticated==2)
dat += "<BR><BR><B>Captain Functions</B>"
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=announce'>Make a Captain's Announcement</A> \]"
var/cross_servers_count = length(CONFIG_GET(keyed_string_list/cross_server))
var/cross_servers_count = length(CONFIG_GET(keyed_list/cross_server))
if(cross_servers_count)
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to [cross_servers_count == 1 ? "an " : ""]allied station[cross_servers_count > 1 ? "s" : ""]</A> \]"
if(SSmapping.config.allow_custom_shuttles)
+1
View File
@@ -596,3 +596,4 @@
icon_screen = "medlaptop"
icon_keyboard = "laptop_key"
clockwork = TRUE //it'd look weird
pass_flags = PASSTABLE
+1 -1
View File
@@ -136,7 +136,7 @@
if(I && istype(I) && I.imp_in)
var/mob/living/R = I.imp_in
to_chat(R, "<span class='italics'>You hear a voice in your head saying: '[warning]'</span>")
log_talk(usr,"[key_name(usr)] sent an implant message to [key_name(R)]: '[warning]'",LOGSAY)
log_directed_talk(usr, R, warning, LOG_SAY, "implant message")
src.add_fingerprint(usr)
src.updateUsrDialog()
+1
View File
@@ -38,6 +38,7 @@
icon_screen = "seclaptop"
icon_keyboard = "laptop_key"
clockwork = TRUE //it'd look weird
pass_flags = PASSTABLE
/obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/card/id))
+1 -1
View File
@@ -141,4 +141,4 @@
materials = list(MAT_METAL = 300, MAT_GLASS = 100)
w_class = WEIGHT_CLASS_BULKY
result_path = /obj/machinery/defibrillator_mount
pixel_shift = -28
pixel_shift = -28
+1
View File
@@ -9,6 +9,7 @@
active_power_usage = 13 //10 with default parts
density = FALSE
circuit = /obj/item/circuitboard/machine/dish_drive
pass_flags = PASSTABLE
var/static/list/item_types = list(/obj/item/trash/waffles,
/obj/item/trash/plate,
/obj/item/trash/tray,
+42 -6
View File
@@ -99,7 +99,7 @@
/obj/machinery/door/airlock/Initialize()
. = ..()
wires = new wiretypepath(src) //CIT CHANGE - makes it possible for airlocks to have different wire datums
wires = new /datum/wires/airlock(src)
if(frequency)
set_frequency(frequency)
@@ -147,7 +147,6 @@
welded = TRUE
if(24 to 30)
panel_open = TRUE
update_icon()
/obj/machinery/door/airlock/ComponentInitialize()
@@ -362,6 +361,7 @@
/obj/machinery/door/airlock/proc/regainMainPower()
if(src.secondsMainPowerLost > 0)
src.secondsMainPowerLost = 0
update_icon()
/obj/machinery/door/airlock/proc/handlePowerRestore()
var/cont = TRUE
@@ -382,6 +382,7 @@
cont = TRUE
spawnPowerRestoreRunning = FALSE
updateDialog()
update_icon()
/obj/machinery/door/airlock/proc/loseMainPower()
if(secondsMainPowerLost <= 0)
@@ -391,6 +392,7 @@
if(!spawnPowerRestoreRunning)
spawnPowerRestoreRunning = TRUE
INVOKE_ASYNC(src, .proc/handlePowerRestore)
update_icon()
/obj/machinery/door/airlock/proc/loseBackupPower()
if(src.secondsBackupPowerLost < 60)
@@ -398,10 +400,12 @@
if(!spawnPowerRestoreRunning)
spawnPowerRestoreRunning = TRUE
INVOKE_ASYNC(src, .proc/handlePowerRestore)
update_icon()
/obj/machinery/door/airlock/proc/regainBackupPower()
if(src.secondsBackupPowerLost > 0)
src.secondsBackupPowerLost = 0
update_icon()
// shock user with probability prb (if all connections & power are working)
// returns TRUE if shocked, FALSE otherwise
@@ -575,6 +579,7 @@
add_overlay(sparks_overlay)
add_overlay(damag_overlay)
add_overlay(note_overlay)
check_unres()
/proc/get_airlock_overlay(icon_state, icon_file)
var/obj/machinery/door/airlock/A
@@ -584,6 +589,31 @@
if((!(. = airlock_overlays[iconkey])))
. = airlock_overlays[iconkey] = mutable_appearance(icon_file, icon_state)
/obj/machinery/door/airlock/proc/check_unres() //unrestricted sides. This overlay indicates which directions the player can access even without an ID
if(hasPower() && unres_sides)
if(unres_sides & NORTH)
var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_n") //layer=src.layer+1
I.pixel_y = 32
set_light(l_range = 2, l_power = 1)
add_overlay(I)
if(unres_sides & SOUTH)
var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_s") //layer=src.layer+1
I.pixel_y = -32
set_light(l_range = 2, l_power = 1)
add_overlay(I)
if(unres_sides & EAST)
var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_e") //layer=src.layer+1
I.pixel_x = 32
set_light(l_range = 2, l_power = 1)
add_overlay(I)
if(unres_sides & WEST)
var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_w") //layer=src.layer+1
I.pixel_x = -32
set_light(l_range = 2, l_power = 1)
add_overlay(I)
else
set_light(0)
/obj/machinery/door/airlock/do_animate(animation)
switch(animation)
if("opening")
@@ -634,6 +664,12 @@
else
to_chat(user, "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>")
/obj/machinery/door/airlock/attack_ai(mob/user)
if(!src.canAIControl(user))
if(src.canAIHack())
@@ -785,7 +821,7 @@
if(do_after(user, 20, 1, target = src))
if(!panel_open || !S.use(2))
return
user.visible_message("<span class='notice'>[user] reinforce \the [src] with metal.</span>",
user.visible_message("<span class='notice'>[user] reinforces \the [src] with metal.</span>",
"<span class='notice'>You reinforce \the [src] with metal.</span>")
security_level = AIRLOCK_SECURITY_METAL
update_icon()
@@ -799,7 +835,7 @@
if(do_after(user, 20, 1, target = src))
if(!panel_open || !S.use(2))
return
user.visible_message("<span class='notice'>[user] reinforce \the [src] with plasteel.</span>",
user.visible_message("<span class='notice'>[user] reinforces \the [src] with plasteel.</span>",
"<span class='notice'>You reinforce \the [src] with plasteel.</span>")
security_level = AIRLOCK_SECURITY_PLASTEEL
modify_max_integrity(normal_integrity * AIRLOCK_INTEGRITY_MULTIPLIER)
@@ -1550,7 +1586,7 @@
to_chat(user, "The electrification wire has been cut")
else
LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(user)]")
add_logs(user, src, "electrified")
log_combat(user, src, "electrified")
set_electrified(AI_ELECTRIFY_DOOR_TIME)
/obj/machinery/door/airlock/proc/shock_perm(mob/user)
@@ -1560,7 +1596,7 @@
to_chat(user, "The electrification wire has been cut")
else
LAZYADD(shockedby, text("\[[time_stamp()]\] [key_name(user)]"))
add_logs(user, src, "electrified")
log_combat(user, src, "electrified")
set_electrified(ELECTRIFIED_PERMANENT)
/obj/machinery/door/airlock/proc/emergency_on(mob/user)
@@ -4,6 +4,7 @@
var/list/accesses = list()
var/one_access = 0
var/unres_sides = 0 //unrestricted sides, or sides of the airlock that will open regardless of access
/obj/item/electronics/airlock/examine(mob/user)
..()
@@ -34,6 +35,7 @@
regions[++regions.len] = region
data["regions"] = regions
data["oneAccess"] = one_access
data["unres_direction"] = unres_sides
return data
@@ -55,3 +57,7 @@
else
accesses -= access
. = TRUE
if("direc_set")
var/unres_direction = text2num(params["unres_direction"])
unres_sides ^= unres_direction //XOR, toggles only the bit that was clicked
. = TRUE
+11 -3
View File
@@ -34,6 +34,7 @@
var/real_explosion_block //ignore this, just use explosion_block
var/red_alert_access = FALSE //if TRUE, this door will always open on red alert
var/poddoor = FALSE
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)
..()
@@ -69,9 +70,11 @@
else
layer = initial(layer)
/obj/machinery/door/power_change()
..()
update_icon()
/obj/machinery/door/Destroy()
density = FALSE
air_update_turf(1)
update_freelook_sight()
GLOB.airlocks -= src
if(spark_system)
@@ -79,7 +82,7 @@
spark_system = null
return ..()
/obj/machinery/door/CollidedWith(atom/movable/AM)
/obj/machinery/door/Bumped(atom/movable/AM)
if(operating || (obj_flags & EMAGGED))
return
if(ismob(AM))
@@ -163,8 +166,13 @@
/obj/machinery/door/allowed(mob/M)
if(emergency)
return TRUE
if(unrestricted_side(M))
return TRUE
return ..()
/obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter)
return get_dir(src, M) & unres_sides
/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user)
return
+1 -1
View File
@@ -67,7 +67,7 @@
affecting_areas.Cut()
return ..()
/obj/machinery/door/firedoor/CollidedWith(atom/movable/AM)
/obj/machinery/door/firedoor/Bumped(atom/movable/AM)
if(panel_open || operating)
return
if(!density)
+1 -1
View File
@@ -29,7 +29,7 @@
if(findtext(raw_message,password))
open()
/obj/machinery/door/password/CollidedWith(atom/movable/AM)
/obj/machinery/door/password/Bumped(atom/movable/AM)
return !density && ..()
/obj/machinery/door/password/try_to_activate_door(mob/user)
+2 -2
View File
@@ -56,7 +56,7 @@
name = "combustion chamber vent"
id = INCINERATOR_SYNDICATELAVA_AUXVENT
/obj/machinery/door/poddoor/CollidedWith(atom/movable/AM)
/obj/machinery/door/poddoor/Bumped(atom/movable/AM)
if(density)
return 0
else
@@ -84,7 +84,7 @@
icon_state = "open"
/obj/machinery/door/poddoor/try_to_activate_door(mob/user)
return
return
/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user)
if(stat & NOPOWER)
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/machinery/door/unpowered
/obj/machinery/door/unpowered/CollidedWith(atom/movable/AM)
/obj/machinery/door/unpowered/Bumped(atom/movable/AM)
if(src.locked)
return
..()
+34 -1
View File
@@ -36,6 +36,10 @@
if(cable)
debris += new /obj/item/stack/cable_coil(src, cable)
/obj/machinery/door/window/ComponentInitialize()
. = ..()
AddComponent(/datum/component/ntnet_interface)
/obj/machinery/door/window/Destroy()
density = FALSE
QDEL_LIST(debris)
@@ -58,7 +62,7 @@
sleep(20)
close()
/obj/machinery/door/window/CollidedWith(atom/movable/AM)
/obj/machinery/door/window/Bumped(atom/movable/AM)
if( operating || !src.density )
return
if (!( ismob(AM) ))
@@ -298,6 +302,35 @@
if("deny")
flick("[src.base_state]deny", src)
/obj/machinery/door/window/check_access_ntnet(datum/netdata/data)
return !requiresID() || ..()
/obj/machinery/door/window/ntnet_receive(datum/netdata/data)
// Check if the airlock is powered.
if(!hasPower())
return
// Check packet access level.
if(!check_access_ntnet(data))
return
// Handle received packet.
var/command = lowertext(data.data["data"])
var/command_value = lowertext(data.data["data_secondary"])
switch(command)
if("open")
if(command_value == "on" && !density)
return
if(command_value == "off" && density)
return
if(density)
INVOKE_ASYNC(src, .proc/open)
else
INVOKE_ASYNC(src, .proc/close)
if("touch")
INVOKE_ASYNC(src, .proc/open_and_close)
/obj/machinery/door/window/brigdoor
name = "secure door"
+1 -1
View File
@@ -129,4 +129,4 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
linked_techweb = SSresearch.science_tech
/proc/techweb_scale_bomb(lightradius)
return lightradius ** 1.36
return (lightradius ** 0.5) * 3000
+1 -1
View File
@@ -50,7 +50,7 @@
/obj/machinery/droneDispenser/Initialize()
. = ..()
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, list(/obj/item/stack))
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/stack)
materials.insert_amount(starting_amount)
materials.precise_insertion = TRUE
using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost)
+37
View File
@@ -285,3 +285,40 @@
set_light(l_power = 0.8)
else
set_light(l_power = 0)
/*
* Return of Party button
*/
/area
var/party = FALSE
/obj/machinery/firealarm/partyalarm
name = "\improper PARTY BUTTON"
desc = "Cuban Pete is in the house!"
var/static/party_overlay
/obj/machinery/firealarm/partyalarm/reset()
if (stat & (NOPOWER|BROKEN))
return
var/area/A = get_area(src)
if (!A || !A.party)
return
A.party = FALSE
A.cut_overlay(party_overlay)
/obj/machinery/firealarm/partyalarm/alarm()
if (stat & (NOPOWER|BROKEN))
return
var/area/A = get_area(src)
if (!A || A.party || A.name == "Space")
return
A.party = TRUE
if (!party_overlay)
party_overlay = iconstate2appearance('icons/turf/areas.dmi', "party")
A.add_overlay(party_overlay)
/obj/machinery/firealarm/partyalarm/ui_data(mob/user)
. = ..()
var/area/A = get_area(src)
.["alarm"] = A && A.party
+5 -1
View File
@@ -100,19 +100,23 @@
if(!bulb.flash_recharge(30)) //Bulb can burn out if it's used too often too fast
power_change()
return
bulb.times_used ++
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
flick("[base_state]_flash", src)
last_flash = world.time
use_power(1000)
var/flashed = FALSE
for (var/mob/living/L in viewers(src, null))
if (get_dist(src, L) > range)
continue
if(L.flash_act(affect_silicon = 1))
L.Knockdown(strength)
flashed = TRUE
if(flashed)
bulb.times_used++
return 1
+184
View File
@@ -0,0 +1,184 @@
/obj/machinery/harvester
name = "organ harvester"
desc = "An advanced machine used for harvesting organs and limbs from the deceased."
density = TRUE
icon = 'icons/obj/machines/harvester.dmi'
icon_state = "harvester"
verb_say = "states"
state_open = FALSE
idle_power_usage = 50
circuit = /obj/item/circuitboard/machine/harvester
light_color = LIGHT_COLOR_BLUE
var/interval = 20
var/harvesting = FALSE
var/list/operation_order = list() //Order of wich we harvest limbs.
var/allow_clothing = FALSE
var/allow_living = FALSE
/obj/machinery/harvester/Initialize()
. = ..()
if(prob(1))
name = "auto-autopsy"
/obj/machinery/harvester/RefreshParts()
interval = 0
var/max_time = 40
for(var/obj/item/stock_parts/micro_laser/L in component_parts)
max_time -= L.rating
interval = max(max_time,1)
/obj/machinery/harvester/update_icon(warming_up)
if(warming_up)
icon_state = initial(icon_state)+"-charging"
return
if(state_open)
icon_state = initial(icon_state)+"-open"
else if(harvesting)
icon_state = initial(icon_state)+"-active"
else
icon_state = initial(icon_state)
/obj/machinery/harvester/open_machine(drop = TRUE)
if(panel_open)
return
. = ..()
harvesting = FALSE
/obj/machinery/harvester/attack_hand(mob/user)
if(state_open)
close_machine()
else if(!harvesting)
open_machine()
/obj/machinery/harvester/AltClick(mob/user)
if(harvesting || !user || !isliving(user) || state_open)
return
if(can_harvest())
start_harvest()
/obj/machinery/harvester/proc/can_harvest()
if(!powered(EQUIP) || state_open || !occupant || !iscarbon(occupant))
return
var/mob/living/carbon/C = occupant
if(!allow_clothing)
for(var/A in C.held_items + C.get_equipped_items())
if(!isitem(A))
continue
var/obj/item/I = A
if(!(I.item_flags & NODROP))
say("Subject may not have abiotic items on.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
if(!(MOB_ORGANIC in C.mob_biotypes))
say("Subject is not organic.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
if(!allow_living && !(C.stat == DEAD || C.has_trait(TRAIT_FAKEDEATH))) //I mean, the machines scanners arent advanced enough to tell you're alive
say("Subject is still alive.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
return TRUE
/obj/machinery/harvester/proc/start_harvest()
if(!occupant || !iscarbon(occupant))
return
var/mob/living/carbon/C = occupant
operation_order = reverseList(C.bodyparts) //Chest and head are first in bodyparts, so we invert it to make them suffer more
harvesting = TRUE
visible_message("<span class='notice'>The [name] begins warming up!</span>")
say("Initializing harvest protocol.")
update_icon(TRUE)
addtimer(CALLBACK(src, .proc/harvest), interval)
/obj/machinery/harvester/proc/harvest()
update_icon()
if(!harvesting || state_open || !powered(EQUIP) || !occupant || !iscarbon(occupant))
return
playsound(src, 'sound/machines/juicer.ogg', 20, 1)
var/mob/living/carbon/C = occupant
if(!LAZYLEN(operation_order)) //The list is empty, so we're done here
end_harvesting()
return
var/turf/target
for(var/adir in list(EAST,NORTH,SOUTH,WEST))
var/turf/T = get_step(src,adir)
if(!T)
continue
if(istype(T, /turf/closed))
continue
target = T
break
if(!target)
target = get_turf(src)
for(var/obj/item/bodypart/BP in operation_order) //first we do non-essential limbs
BP.drop_limb()
C.emote("scream")
if(BP.body_zone != "chest")
BP.forceMove(target) //Move the limbs right next to it, except chest, that's a weird one
BP.drop_organs()
else
for(var/obj/item/organ/O in BP.dismember())
O.forceMove(target) //Some organs, like chest ones, are different so we need to manually move them
operation_order.Remove(BP)
break
use_power(5000)
addtimer(CALLBACK(src, .proc/harvest), interval)
/obj/machinery/harvester/proc/end_harvesting()
harvesting = FALSE
open_machine()
say("Subject has been succesfuly harvested.")
playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, 0)
/obj/machinery/harvester/screwdriver_act(mob/living/user, obj/item/I)
. = ..()
if(.)
return TRUE
if(!state_open && !occupant)
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I))
return
/obj/machinery/harvester/crowbar_act(mob/living/user, obj/item/I)
if(default_pry_open(I))
return
if(default_deconstruction_crowbar(I))
return
/obj/machinery/harvester/default_pry_open(obj/item/I) //wew
. = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR //We removed is_operational() here
if(.)
I.play_tool_sound(src, 50)
visible_message("<span class='notice'>[usr] pries open \the [src].</span>", "<span class='notice'>You pry open [src].</span>")
open_machine()
/obj/machinery/harvester/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
allow_living = TRUE
to_chat(user, "<span class='warning'>You overload [src]'s lifesign scanners.</span>")
/obj/machinery/harvester/container_resist(mob/living/user)
if(!harvesting)
visible_message("<span class='notice'>[occupant] emerges from [src]!</span>",
"<span class='notice'>You climb out of [src]!</span>")
open_machine()
else
to_chat(user,"<span class='warning'>[src] is active and can't be opened!</span>") //rip
/obj/machinery/harvester/Exited(atom/movable/user)
if (!state_open && user == occupant)
container_resist(user)
/obj/machinery/harvester/relaymove(mob/user)
if (!state_open)
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>")
else if(!harvesting)
to_chat(user, "<span class='notice'>Alt-click [src] to start harvesting.</span>")
+41 -41
View File
@@ -11,7 +11,7 @@
var/stationary = TRUE //to prevent briefcase pad deconstruction and such
var/display_name = "Launchpad"
var/teleport_speed = 35
var/range = 5
var/range = 15
var/teleporting = FALSE //if it's in the process of teleporting
var/power_efficiency = 1
var/x_offset = 0
@@ -148,18 +148,17 @@
idle_power_usage = 0
active_power_usage = 0
teleport_speed = 20
range = 3
range = 8
stationary = FALSE
var/closed = TRUE
var/obj/item/briefcase_launchpad/briefcase
var/obj/item/storage/briefcase/launchpad/briefcase
/obj/machinery/launchpad/briefcase/Initialize()
. = ..()
if(istype(loc, /obj/item/briefcase_launchpad))
briefcase = loc
else
log_game("[src] has been spawned without a briefcase.")
return INITIALIZE_HINT_QDEL
/obj/machinery/launchpad/briefcase/Initialize(mapload, briefcase)
. = ..()
if(!briefcase)
log_game("[src] has been spawned without a briefcase.")
return INITIALIZE_HINT_QDEL
src.briefcase = briefcase
/obj/machinery/launchpad/briefcase/Destroy()
QDEL_NULL(briefcase)
@@ -180,47 +179,37 @@
usr.visible_message("<span class='notice'>[usr] starts closing [src]...</span>", "<span class='notice'>You start closing [src]...</span>")
if(do_after(usr, 30, target = usr))
usr.put_in_hands(briefcase)
forceMove(briefcase)
moveToNullspace() //hides it from suitcase contents
closed = TRUE
/obj/machinery/launchpad/briefcase/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/launchpad_remote))
var/obj/item/launchpad_remote/L = I
if(L.pad == src) //do not attempt to link when already linked
return ..()
L.pad = src
to_chat(user, "<span class='notice'>You link [src] to [L].</span>")
else
return ..()
//Briefcase item that contains the launchpad.
/obj/item/briefcase_launchpad
name = "briefcase"
desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
icon = 'icons/obj/storage.dmi'
icon_state = "briefcase"
lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
flags_1 = CONDUCT_1
force = 8
hitsound = "swing_hit"
throw_speed = 2
throw_range = 4
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
resistance_flags = FLAMMABLE
max_integrity = 150
/obj/item/storage/briefcase/launchpad
var/obj/machinery/launchpad/briefcase/pad
/obj/item/briefcase_launchpad/Initialize()
/obj/item/storage/briefcase/launchpad/Initialize()
pad = new(null, src) //spawns pad in nullspace to hide it from briefcase contents
. = ..()
pad = new(src)
/obj/item/briefcase_launchpad/Destroy()
/obj/item/storage/briefcase/launchpad/Destroy()
if(!QDELETED(pad))
qdel(pad)
pad = null
QDEL_NULL(pad)
return ..()
/obj/item/briefcase_launchpad/attack_self(mob/user)
/obj/item/storage/briefcase/launchpad/PopulateContents()
new /obj/item/pen(src)
new /obj/item/launchpad_remote(src, pad)
/obj/item/storage/briefcase/launchpad/attack_self(mob/user)
if(!isturf(user.loc)) //no setting up in a locker
return
add_fingerprint(user)
@@ -229,25 +218,36 @@
pad.forceMove(get_turf(src))
pad.closed = FALSE
user.transferItemToLoc(src, pad, TRUE)
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_HIDE_ALL)
/obj/item/briefcase_launchpad/attackby(obj/item/I, mob/user, params)
/obj/item/storage/briefcase/launchpad/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/launchpad_remote))
var/obj/item/launchpad_remote/L = I
if(L.pad == src.pad) //do not attempt to link when already linked
return ..()
L.pad = src.pad
to_chat(user, "<span class='notice'>You link [pad] to [L].</span>")
else
return ..()
return ..()
/obj/item/launchpad_remote
name = "\improper Launchpad Control Remote"
desc = "Used to teleport objects to and from a portable launchpad."
icon = 'icons/obj/telescience.dmi'
icon_state = "blpad-remote"
name = "folder"
desc = "A folder."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "folder"
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_BELT
var/sending = TRUE
var/obj/machinery/launchpad/briefcase/pad
/obj/item/launchpad_remote/Initialize(mapload, pad) //remote spawns linked to the briefcase pad
. = ..()
src.pad = pad
/obj/item/launchpad_remote/attack_self(mob/user)
. = ..()
ui_interact(user)
to_chat(user, "<span class='notice'>[src] projects a display onto your retina.</span>")
/obj/item/launchpad_remote/ui_interact(mob/user, ui_key = "launchpad_remote", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -340,7 +340,7 @@
if("rename")
. = TRUE
var/new_name = stripped_input(usr, "How do you want to rename the launchpad?", "Launchpad", pad.display_name, 15) as text|null
var/new_name = stripped_input(usr, "How do you want to rename the launchpad?", "Launchpad", pad.display_name, 15)
if(!new_name)
return
pad.display_name = new_name
+29 -38
View File
@@ -118,17 +118,17 @@ GLOBAL_LIST_EMPTY(allCasters)
newChannel.is_admin_channel = adminChannel
network_channels += newChannel
/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, obj/item/photo/photo, adminMessage = 0, allow_comments = 1)
/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, datum/picture/picture, adminMessage = 0, allow_comments = 1)
var/datum/newscaster/feed_message/newMsg = new /datum/newscaster/feed_message
newMsg.author = author
newMsg.body = msg
newMsg.time_stamp = "[station_time_timestamp()]"
newMsg.is_admin_message = adminMessage
newMsg.locked = !allow_comments
if(photo)
newMsg.img = photo.picture.picture_image
newMsg.caption = photo.scribble
newMsg.photo_file = save_photo(photo.picture.picture_image)
if(picture)
newMsg.img = picture.picture_image
newMsg.caption = picture.caption
newMsg.photo_file = save_photo(picture.picture_image)
for(var/datum/newscaster/feed_channel/FC in network_channels)
if(FC.channel_name == channel_name)
FC.messages += newMsg
@@ -138,15 +138,15 @@ GLOBAL_LIST_EMPTY(allCasters)
lastAction ++
newMsg.creationTime = lastAction
/datum/newscaster/feed_network/proc/submitWanted(criminal, body, scanned_user, obj/item/photo/photo, adminMsg = 0, newMessage = 0)
/datum/newscaster/feed_network/proc/submitWanted(criminal, body, scanned_user, datum/picture/picture, adminMsg = 0, newMessage = 0)
wanted_issue.active = 1
wanted_issue.criminal = criminal
wanted_issue.body = body
wanted_issue.scannedUser = scanned_user
wanted_issue.isAdminMsg = adminMsg
if(photo)
wanted_issue.img = photo.picture.picture_image
wanted_issue.photo_file = save_photo(photo.picture.picture_image)
if(picture)
wanted_issue.img = picture.picture_image
wanted_issue.photo_file = save_photo(picture.picture_image)
if(newMessage)
for(var/obj/machinery/newscaster/N in GLOB.allCasters)
N.newsAlert()
@@ -197,7 +197,7 @@ GLOBAL_LIST_EMPTY(allCasters)
var/alert = FALSE
var/scanned_user = "Unknown"
var/msg = ""
var/obj/item/photo/photo = null
var/datum/picture/picture
var/channel_name = ""
var/c_locked=0
var/datum/newscaster/feed_channel/viewing_channel = null
@@ -221,7 +221,7 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/machinery/newscaster/Destroy()
GLOB.allCasters -= src
viewing_channel = null
photo = null
picture = null
return ..()
/obj/machinery/newscaster/update_icon()
@@ -298,7 +298,7 @@ GLOBAL_LIST_EMPTY(allCasters)
if(CHANNEL.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen '><A href='?src=[REF(src)];show_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
else
dat+="<B><A href='?src=[REF(src)];show_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+="<B><A href='?src=[REF(src)];show_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR></B>"
dat+="<BR><HR><A href='?src=[REF(src)];refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=[REF(src)];setScreen=[0]'>Back</A>"
if(2)
@@ -312,7 +312,7 @@ GLOBAL_LIST_EMPTY(allCasters)
dat+="<HR><B><A href='?src=[REF(src)];set_channel_receiving=1'>Receiving Channel</A>:</B> [channel_name]<BR>"
dat+="<B>Message Author:</B> <FONT COLOR='green'>[scanned_user]</FONT><BR>"
dat+="<B><A href='?src=[REF(src)];set_new_message=1'>Message Body</A>:</B> <BR><font face=\"[PEN_FONT]\">[parsemarkdown(msg, user)]</font><BR>"
dat+="<B><A href='?src=[REF(src)];set_attachment=1'>Attach Photo</A>:</B> [(photo ? "Photo Attached" : "No Photo")]</BR>"
dat+="<B><A href='?src=[REF(src)];set_attachment=1'>Attach Photo</A>:</B> [(picture ? "Photo Attached" : "No Photo")]</BR>"
dat+="<B><A href='?src=[REF(src)];set_comment=1'>Comments [allow_comments ? "Enabled" : "Disabled"]</A></B><BR>"
dat+="<BR><A href='?src=[REF(src)];submit_new_message=1'>Submit</A><BR><BR><A href='?src=[REF(src)];setScreen=[0]'>Cancel</A><BR>"
if(4)
@@ -403,7 +403,7 @@ GLOBAL_LIST_EMPTY(allCasters)
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels)
dat+="<A href='?src=[REF(src)];pick_censor_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<A href='?src=[REF(src)];pick_censor_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
dat+="<BR><A href='?src=[REF(src)];setScreen=[0]'>Cancel</A>"
if(11)
dat+="<B>Nanotrasen D-Notice Handler</B><HR>"
@@ -414,7 +414,7 @@ GLOBAL_LIST_EMPTY(allCasters)
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels)
dat+="<A href='?src=[REF(src)];pick_d_notice=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<A href='?src=[REF(src)];pick_d_notice=[REF(CHANNEL)]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
dat+="<BR><A href='?src=[REF(src)];setScreen=[0]'>Back</A>"
if(12)
dat+="<B>[viewing_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[viewing_channel.returnAuthor(-1)]</FONT> \]</FONT><BR>"
@@ -454,7 +454,7 @@ GLOBAL_LIST_EMPTY(allCasters)
dat+="<HR>"
dat+="<A href='?src=[REF(src)];set_wanted_name=1'>Criminal Name</A>: [channel_name] <BR>"
dat+="<A href='?src=[REF(src)];set_wanted_desc=1'>Description</A>: [msg] <BR>"
dat+="<A href='?src=[REF(src)];set_attachment=1'>Attach Photo</A>: [(photo ? "Photo Attached" : "No Photo")]</BR>"
dat+="<A href='?src=[REF(src)];set_attachment=1'>Attach Photo</A>: [(picture ? "Photo Attached" : "No Photo")]</BR>"
if(wanted_already)
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'>[GLOB.news_network.wanted_issue.scannedUser]</FONT><BR>"
else
@@ -561,7 +561,7 @@ GLOBAL_LIST_EMPTY(allCasters)
if(msg =="" || msg=="\[REDACTED\]" || scanned_user == "Unknown" || channel_name == "" )
screen=6
else
GLOB.news_network.SubmitArticle("<font face=\"[PEN_FONT]\">[parsemarkdown(msg, usr)]</font>", scanned_user, channel_name, photo, 0, allow_comments)
GLOB.news_network.SubmitArticle("<font face=\"[PEN_FONT]\">[parsemarkdown(msg, usr)]</font>", scanned_user, channel_name, picture, 0, allow_comments)
SSblackbox.record_feedback("amount", "newscaster_stories", 1)
screen=4
msg = ""
@@ -612,13 +612,13 @@ GLOBAL_LIST_EMPTY(allCasters)
if(choice=="Confirm")
scan_user(usr)
if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one.
GLOB.news_network.submitWanted(channel_name, msg, scanned_user, photo, 0 , 1)
GLOB.news_network.submitWanted(channel_name, msg, scanned_user, picture, 0 , 1)
screen = 15
else
if(GLOB.news_network.wanted_issue.isAdminMsg)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
return
GLOB.news_network.submitWanted(channel_name, msg, scanned_user, photo)
GLOB.news_network.submitWanted(channel_name, msg, scanned_user, picture)
screen = 19
updateUsrDialog()
else if(href_list["cancel_wanted"])
@@ -698,14 +698,15 @@ GLOBAL_LIST_EMPTY(allCasters)
FC.body = cominput
FC.time_stamp = station_time_timestamp()
FM.comments += FC
log_talk(usr,"[key_name(usr)] as [scanned_user] commented on message [FM.returnBody(-1)] -- [FC.body]",LOGCOMMENT)
usr.log_message("(as [scanned_user]) commented on message [FM.returnBody(-1)] -- [FC.body]", LOG_COMMENT)
updateUsrDialog()
else if(href_list["del_comment"])
var/datum/newscaster/feed_comment/FC = locate(href_list["del_comment"])
var/datum/newscaster/feed_message/FM = locate(href_list["del_comment_msg"])
FM.comments -= FC
qdel(FC)
updateUsrDialog()
if(istype(FC) && istype(FM))
FM.comments -= FC
qdel(FC)
updateUsrDialog()
else if(href_list["lock_comment"])
var/datum/newscaster/feed_message/FM = locate(href_list["lock_comment"])
FM.locked ^= 1
@@ -782,17 +783,9 @@ GLOBAL_LIST_EMPTY(allCasters)
take_damage(5, BRUTE, "melee")
/obj/machinery/newscaster/proc/AttachPhoto(mob/user)
var/obj/item/photo/photo = user.is_holding_item_of_type(/obj/item/photo)
if(photo)
if(!photo.sillynewscastervar)
photo.forceMove(drop_location())
if(!issilicon(user))
user.put_in_inactive_hand(photo)
else
qdel(photo)
photo = null
photo = user.is_holding_item_of_type(/obj/item/photo)
if(photo && !user.transferItemToLoc(photo, src))
photo = null
picture = photo.picture
if(issilicon(user))
var/obj/item/camera/siliconcam/targetcam
if(isAI(user))
@@ -810,10 +803,8 @@ GLOBAL_LIST_EMPTY(allCasters)
to_chat(usr, "<span class='boldannounce'>No images saved</span>")
return
var/datum/picture/selection = targetcam.selectpicture(user)
var/obj/item/photo/P = new(null, selection)
P.sillynewscastervar = TRUE
photo = P
qdel(P)
if(selection)
picture = selection
/obj/machinery/newscaster/proc/scan_user(mob/living/user)
if(ishuman(user))
@@ -894,7 +885,7 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/item/newspaper/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is focusing intently on [src]! It looks like [user.p_theyre()] trying to commit sudoku... until [user.p_their()] eyes light up with realization!</span>")
user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF")
user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF", forced="newspaper suicide")
var/mob/living/carbon/human/H = user
var/obj/W = new /obj/item/reagent_containers/food/drinks/bottle/whiskey(H.loc)
playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), 1)
+4
View File
@@ -212,6 +212,10 @@ Buildable meters
qdel(src)
/obj/item/pipe_meter/screwdriver_act(mob/living/user, obj/item/S)
. = ..()
if(.)
return TRUE
if(!isturf(loc))
to_chat(user, "<span class='warning'>You need to fasten it to the floor!</span>")
return TRUE
@@ -548,6 +548,7 @@
//Shooting Code:
A.preparePixelProjectile(target, T)
A.firer = src
A.fire()
return A
@@ -621,7 +622,7 @@
if(!can_interact(caller))
remove_control()
return FALSE
add_logs(caller,A,"fired with manual turret control at")
log_combat(caller,A,"fired with manual turret control at")
target(A)
return TRUE
@@ -736,8 +737,8 @@
integrity_failure = 60
name = "Old Laser Turret"
desc = "A turret built with substandard parts and run down further with age. Still capable of delivering lethal lasers to the odd space carp, but not much else."
stun_projectile = /obj/item/projectile/beam/weak
lethal_projectile = /obj/item/projectile/beam/weak
stun_projectile = /obj/item/projectile/beam/weak/penetrator
lethal_projectile = /obj/item/projectile/beam/weak/penetrator
faction = list("neutral","silicon","turret")
////////////////////////
@@ -789,6 +790,12 @@
turrets |= T
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>")
/obj/machinery/turretid/attackby(obj/item/I, mob/user, params)
if(stat & BROKEN)
return
+26 -11
View File
@@ -11,7 +11,7 @@
var/teleport_cooldown = 400 //30 seconds base due to base parts
var/teleport_speed = 50
var/last_teleport //to handle the cooldown
var/teleporting = 0 //if it's in the process of teleporting
var/teleporting = FALSE //if it's in the process of teleporting
var/power_efficiency = 1
var/obj/machinery/quantumpad/linked_pad
@@ -29,6 +29,14 @@
mapped_quantum_pads -= map_pad_id
return ..()
/obj/machinery/quantumpad/examine(mob/user)
..()
to_chat(user, "<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>")
else
to_chat(user, "<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
for(var/obj/item/stock_parts/capacitor/C in component_parts)
@@ -50,14 +58,21 @@
if(istype(I, /obj/item/multitool))
var/obj/item/multitool/M = I
M.buffer = src
to_chat(user, "<span class='notice'>You save the data in [I]'s buffer.</span>")
return 1
to_chat(user, "<span class='notice'>You save the data in [I]'s buffer. It can now be saved to pads with closed panels.</span>")
return TRUE
else if(istype(I, /obj/item/multitool))
var/obj/item/multitool/M = I
if(istype(M.buffer, /obj/machinery/quantumpad))
linked_pad = M.buffer
to_chat(user, "<span class='notice'>You link [src] to the one in [I]'s buffer.</span>")
return 1
if(M.buffer == src)
to_chat(user, "<span class='warning'>You cannot link a pad to itself!</span>")
return TRUE
else
linked_pad = M.buffer
to_chat(user, "<span class='notice'>You link [src] to the one in [I]'s buffer.</span>")
return TRUE
else
to_chat(user, "<span class='warning'>There is no quantum pad data saved in [I]'s buffer!</span>")
return TRUE
if(default_deconstruction_crowbar(I))
return
@@ -105,22 +120,22 @@
/obj/machinery/quantumpad/proc/doteleport(mob/user)
if(linked_pad)
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
teleporting = 1
teleporting = TRUE
spawn(teleport_speed)
if(!src || QDELETED(src))
teleporting = 0
teleporting = FALSE
return
if(stat & NOPOWER)
to_chat(user, "<span class='warning'>[src] is unpowered!</span>")
teleporting = 0
teleporting = FALSE
return
if(!linked_pad || QDELETED(linked_pad) || linked_pad.stat & NOPOWER)
to_chat(user, "<span class='warning'>Linked pad is not responding to ping. Teleport aborted.</span>")
teleporting = 0
teleporting = FALSE
return
teleporting = 0
teleporting = FALSE
last_teleport = world.time
// use a lot of power
+18 -10
View File
@@ -7,6 +7,7 @@
idle_power_usage = 4
active_power_usage = 250
circuit = /obj/item/circuitboard/machine/recharger
pass_flags = PASSTABLE
var/obj/item/charging = null
var/recharge_coeff = 1
@@ -20,6 +21,16 @@
for(var/obj/item/stock_parts/capacitor/C in component_parts)
recharge_coeff = C.rating
/obj/machinery/recharger/proc/setCharging(new_charging)
charging = new_charging
if (new_charging)
START_PROCESSING(SSmachines, src)
use_power = ACTIVE_POWER_USE
update_icon(scan = TRUE)
else
use_power = IDLE_POWER_USE
update_icon()
/obj/machinery/recharger/attackby(obj/item/G, mob/user, params)
if(istype(G, /obj/item/wrench))
if(charging)
@@ -52,9 +63,8 @@
if(!user.transferItemToLoc(G, src))
return 1
charging = G
use_power = ACTIVE_POWER_USE
update_icon(scan = TRUE)
setCharging(G)
else
to_chat(user, "<span class='notice'>[src] isn't connected to anything!</span>")
return 1
@@ -79,21 +89,17 @@
charging.update_icon()
charging.forceMove(drop_location())
user.put_in_hands(charging)
charging = null
use_power = IDLE_POWER_USE
update_icon()
setCharging(null)
/obj/machinery/recharger/attack_tk(mob/user)
if(charging)
charging.update_icon()
charging.forceMove(drop_location())
charging = null
use_power = IDLE_POWER_USE
update_icon()
setCharging(null)
/obj/machinery/recharger/process()
if(stat & (NOPOWER|BROKEN) || !anchored)
return
return PROCESS_KILL
var/using_power = 0
if(charging)
@@ -113,6 +119,8 @@
using_power = 1
update_icon(using_power)
return
else
return PROCESS_KILL
/obj/machinery/recharger/power_change()
..()
+2 -2
View File
@@ -81,7 +81,7 @@
is_powered = FALSE
icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end
/obj/machinery/recycler/CollidedWith(atom/movable/AM)
/obj/machinery/recycler/Bumped(atom/movable/AM)
if(stat & (BROKEN|NOPOWER))
return
@@ -171,7 +171,7 @@
// By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count)
if(iscarbon(L))
if(L.stat == CONSCIOUS)
L.say("ARRRRRRRRRRRGH!!!")
L.say("ARRRRRRRRRRRGH!!!", forced="recycler grinding")
add_mob_blood(L)
if(!blood && !issilicon(L))
+1 -1
View File
@@ -302,7 +302,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
message = L.treat_message(message)
minor_announce(message, "[department] Announcement:")
GLOB.news_network.SubmitArticle(message, department, "Station Announcements", null)
log_talk(usr,"[key_name(usr)] has made a station announcement from [src] at [AREACOORD(usr)]: [message]",LOGSAY)
usr.log_talk(message, LOG_SAY, tag="station announcement from [src]")
message_admins("[ADMIN_LOOKUPFLW(usr)] has made a station announcement from [src] at [AREACOORD(usr)].")
announceAuth = FALSE
message = ""
+3 -8
View File
@@ -15,11 +15,6 @@
setDir(pick(GLOB.cardinals))
air_update_turf(1)
/obj/structure/emergency_shield/Destroy()
density = FALSE
air_update_turf(1)
return ..()
/obj/structure/emergency_shield/Move()
var/turf/T = loc
. = ..()
@@ -122,11 +117,11 @@
locked = pick(0,1)
update_icon()
/obj/machinery/shieldgen/attack_hand(mob/user)
/obj/machinery/shieldgen/interact(mob/user)
. = ..()
if(.)
return
if(locked)
if(locked && !issilicon(user))
to_chat(user, "<span class='warning'>The machine is locked, you are unable to use it!</span>")
return
if(panel_open)
@@ -363,7 +358,7 @@
add_fingerprint(user)
return ..()
/obj/machinery/shieldwallgen/attack_hand(mob/user)
/obj/machinery/shieldwallgen/interact(mob/user)
. = ..()
if(.)
return
+6 -1
View File
@@ -65,7 +65,9 @@
/obj/machinery/space_heater/process()
if(!on || !is_operational())
return
if (on) // If it's broken, turn it off too
on = FALSE
return PROCESS_KILL
if(cell && cell.charge > 0)
var/turf/L = loc
@@ -107,6 +109,7 @@
else
on = FALSE
update_icon()
return PROCESS_KILL
/obj/machinery/space_heater/RefreshParts()
var/laser = 0
@@ -201,6 +204,8 @@
mode = HEATER_MODE_STANDBY
usr.visible_message("[usr] switches [on ? "on" : "off"] \the [src].", "<span class='notice'>You switch [on ? "on" : "off"] \the [src].</span>")
update_icon()
if (on)
START_PROCESSING(SSmachines, src)
. = TRUE
if("mode")
setMode = params["mode"]
+279 -229
View File
@@ -1,159 +1,58 @@
// Status display
// (formerly Countdown timer display)
#define CHARS_PER_LINE 5
#define FONT_SIZE "5pt"
#define FONT_COLOR "#09f"
#define FONT_STYLE "Arial Black"
#define SCROLL_SPEED 2
// Status display
// (formerly Countdown timer display)
#define SD_BLANK 0 // 0 = Blank
#define SD_EMERGENCY 1 // 1 = Emergency Shuttle timer
#define SD_MESSAGE 2 // 2 = Arbitrary message(s)
#define SD_PICTURE 3 // 3 = alert picture
// Use to show shuttle ETA/ETD times
// Alert status
// And arbitrary messages set by comms computer
#define SD_AI_EMOTE 1 // 1 = AI emoticon
#define SD_AI_BSOD 2 // 2 = Blue screen of death
/// Status display which can show images and scrolling text.
/obj/machinery/status_display
name = "status display"
desc = null
icon = 'icons/obj/status_display.dmi'
icon_state = "frame"
name = "status display"
density = FALSE
use_power = IDLE_POWER_USE
idle_power_usage = 10
var/mode = 1 // 0 = Blank
// 1 = Emergency Shuttle timer
// 2 = Arbitrary message(s)
// 3 = alert picture
// 4 = Supply shuttle timer
// 5 = Generic shuttle timer
var/picture_state // icon_state of alert picture
maptext_height = 26
maptext_width = 32
var/message1 = "" // message line 1
var/message2 = "" // message line 2
var/index1 // display index for scrolling messages or 0 if non-scrolling
var/index2
var/frequency = FREQ_STATUS_DISPLAYS
var/supply_display = 0 // true if a supply shuttle display
var/shuttle_id // Id used for "generic shuttle timer" mode
/// Immediately blank the display.
/obj/machinery/status_display/proc/remove_display()
cut_overlays()
if(maptext)
maptext = ""
var/friendc = 0 // track if Friend Computer mode
maptext_height = 26
maptext_width = 32
// new display
// register for radio system
/obj/machinery/status_display/Initialize()
. = ..()
GLOB.ai_status_displays.Add(src)
SSradio.add_object(src, frequency)
/obj/machinery/status_display/Destroy()
SSradio.remove_object(src,frequency)
GLOB.ai_status_displays.Remove(src)
return ..()
// timed process
/obj/machinery/status_display/process()
if(stat & NOPOWER)
remove_display()
return
update()
/obj/machinery/status_display/emp_act(severity)
. = ..()
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
return
set_picture("ai_bsod")
// set what is displayed
/obj/machinery/status_display/proc/update()
if(friendc && mode!=4) //Makes all status displays except supply shuttle timer display the eye -- Urist
set_picture("ai_friend")
return
switch(mode)
if(0) //blank
remove_display()
if(1) //emergency shuttle timer
display_shuttle_status()
if(2) //custom messages
var/line1
var/line2
if(!index1)
line1 = message1
else
line1 = copytext(message1+"|"+message1, index1, index1+CHARS_PER_LINE)
var/message1_len = length(message1)
index1 += SCROLL_SPEED
if(index1 > message1_len)
index1 -= message1_len
if(!index2)
line2 = message2
else
line2 = copytext(message2+"|"+message2, index2, index2+CHARS_PER_LINE)
var/message2_len = length(message2)
index2 += SCROLL_SPEED
if(index2 > message2_len)
index2 -= message2_len
update_display(line1, line2)
if(4) // supply shuttle timer
var/line1
var/line2
if(SSshuttle.supply.mode == SHUTTLE_IDLE)
if(is_station_level(SSshuttle.supply.z))
line1 = "CARGO"
line2 = "Docked"
else
line1 = "CARGO"
line2 = SSshuttle.supply.getTimerStr()
if(lentext(line2) > CHARS_PER_LINE)
line2 = "Error"
update_display(line1, line2)
if(5)
display_shuttle_status()
/obj/machinery/status_display/examine(mob/user)
. = ..()
switch(mode)
if(1,5) // Emergency or generic shuttle
var/obj/docking_port/mobile/shuttle
if(mode == 1)
shuttle = SSshuttle.emergency
else
shuttle = SSshuttle.getShuttle(shuttle_id)
if (!shuttle)
to_chat(user, "The display says:<br>\t<xmp>Shuttle?</xmp>")
else if (shuttle.timer)
to_chat(user, "The display says:<br>\t<xmp>[shuttle.getModeStr()]: [shuttle.getTimerStr()]</xmp>")
if (mode == 1 && shuttle)
to_chat(user, "Current shuttle: [shuttle.name].")
if(4) // Supply shuttle
var/obj/docking_port/mobile/shuttle = SSshuttle.supply
var/shuttleMsg = null
if (shuttle.mode == SHUTTLE_IDLE)
if (is_station_level(shuttle.z))
shuttleMsg = "Docked"
else
shuttleMsg = "[shuttle.getModeStr()]: [shuttle.getTimerStr()]"
if (shuttleMsg)
to_chat(user, "The display says:<br>\t<xmp>[shuttleMsg]</xmp>")
if(2) // Custom message
if (message1 || message2)
var/msg = "The display says:"
if (message1)
msg += "<br>\t<xmp>[message1]</xmp>"
if (message2)
msg += "<br>\t<xmp>[message2]</xmp>"
to_chat(user, msg)
/// Immediately change the display to the given picture.
/obj/machinery/status_display/proc/set_picture(state)
remove_display()
add_overlay(state)
/// Immediately change the display to the given two lines.
/obj/machinery/status_display/proc/update_display(line1, line2)
var/new_text = {"<div style="font-size:[FONT_SIZE];color:[FONT_COLOR];font:'[FONT_STYLE]';text-align:center;" valign="top">[line1]<br>[line2]</div>"}
if(maptext != new_text)
maptext = new_text
/// Prepare the display to marquee the given two lines.
///
/// Call with no arguments to disable.
/obj/machinery/status_display/proc/set_message(m1, m2)
if(m1)
index1 = (length(m1) > CHARS_PER_LINE)
@@ -169,105 +68,260 @@
message2 = ""
index2 = 0
/obj/machinery/status_display/proc/set_picture(state)
picture_state = state
remove_display()
add_overlay(picture_state)
/obj/machinery/status_display/proc/update_display(line1, line2)
var/new_text = {"<div style="font-size:[FONT_SIZE];color:[FONT_COLOR];font:'[FONT_STYLE]';text-align:center;" valign="top">[line1]<br>[line2]</div>"}
if(maptext != new_text)
maptext = new_text
/obj/machinery/status_display/proc/remove_display()
cut_overlays()
if(maptext)
maptext = ""
/obj/machinery/status_display/proc/display_shuttle_status()
var/obj/docking_port/mobile/shuttle
if(mode == 1)
shuttle = SSshuttle.emergency
else
shuttle = SSshuttle.getShuttle(shuttle_id)
if(!shuttle)
update_display("shutl?","")
else if(shuttle.timer)
var/line1 = "-[shuttle.getModeStr()]-"
var/line2 = shuttle.getTimerStr()
if(length(line2) > CHARS_PER_LINE)
line2 = "Error!"
update_display(line1, line2)
else
remove_display()
/obj/machinery/status_display/receive_signal(datum/signal/signal)
if(supply_display)
mode = 4
return
switch(signal.data["command"])
if("blank")
mode = 0
if("shuttle")
mode = 1
if("message")
mode = 2
set_message(signal.data["msg1"], signal.data["msg2"])
if("alert")
mode = 3
set_picture(signal.data["picture_state"])
/obj/machinery/ai_status_display
icon = 'icons/obj/status_display.dmi'
desc = "A small screen which the AI can use to present itself."
icon_state = "frame"
name = "\improper AI display"
density = FALSE
var/mode = 0 // 0 = Blank
// 1 = AI emoticon
// 2 = Blue screen of death
var/picture_state // icon_state of ai picture
var/emotion = "Neutral"
/obj/machinery/ai_status_display/Initialize()
. = ..()
GLOB.ai_status_displays.Add(src)
/obj/machinery/ai_status_display/Destroy()
GLOB.ai_status_displays.Remove(src)
. = ..()
/obj/machinery/ai_status_display/attack_ai(mob/living/silicon/ai/user)
if(isAI(user))
user.ai_statuschange()
/obj/machinery/ai_status_display/process()
// Timed process - performs default marquee action if so needed.
/obj/machinery/status_display/process()
if(stat & NOPOWER)
cut_overlays()
return
// No power, no processing.
remove_display()
return PROCESS_KILL
var/line1 = message1
if(index1)
line1 = copytext("[message1]|[message1]", index1, index1+CHARS_PER_LINE)
var/message1_len = length(message1)
index1 += SCROLL_SPEED
if(index1 > message1_len)
index1 -= message1_len
var/line2 = message2
if(index2)
line2 = copytext("[message2]|[message2]", index2, index2+CHARS_PER_LINE)
var/message2_len = length(message2)
index2 += SCROLL_SPEED
if(index2 > message2_len)
index2 -= message2_len
update_display(line1, line2)
if (!index1 && !index2)
// No marquee, no processing.
return PROCESS_KILL
/// Update the display and, if necessary, re-enable processing.
/obj/machinery/status_display/proc/update()
if (process() != PROCESS_KILL)
START_PROCESSING(SSmachines, src)
/obj/machinery/status_display/power_change()
. = ..()
update()
/obj/machinery/ai_status_display/emp_act(severity)
/obj/machinery/status_display/emp_act(severity)
. = ..()
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
return
set_picture("ai_bsod")
/obj/machinery/ai_status_display/proc/update()
/obj/machinery/status_display/examine(mob/user)
. = ..()
if (message1 || message2)
var/list/msg = list("The display says:")
if (message1)
msg += "<br>\t<tt>[html_encode(message1)]</tt>"
if (message2)
msg += "<br>\t<tt>[html_encode(message2)]</tt>"
to_chat(user, msg.Join())
if(mode==0) //Blank
cut_overlays()
// Helper procs for child display types.
/obj/machinery/status_display/proc/display_shuttle_status(obj/docking_port/mobile/shuttle)
if(!shuttle)
// the shuttle is missing - no processing
update_display("shutl?","")
return PROCESS_KILL
else if(shuttle.timer)
var/line1 = "-[shuttle.getModeStr()]-"
var/line2 = shuttle.getTimerStr()
if(length(line2) > CHARS_PER_LINE)
line2 = "error"
update_display(line1, line2)
else
// don't kill processing, the timer might turn back on
remove_display()
/obj/machinery/status_display/proc/examine_shuttle(mob/user, obj/docking_port/mobile/shuttle)
if (shuttle)
var/modestr = shuttle.getModeStr()
if (modestr)
if (shuttle.timer)
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]")
else
to_chat(user, "The display says:<br>\t<tt>Shuttle missing!</tt>")
/// Evac display which shows shuttle timer or message set by Command.
/obj/machinery/status_display/evac
var/frequency = FREQ_STATUS_DISPLAYS
var/mode = SD_EMERGENCY
var/friendc = FALSE // track if Friend Computer mode
var/last_picture // For when Friend Computer mode is undone
/obj/machinery/status_display/evac/Initialize()
. = ..()
// register for radio system
SSradio.add_object(src, frequency)
/obj/machinery/status_display/evac/Destroy()
SSradio.remove_object(src,frequency)
return ..()
/obj/machinery/status_display/evac/process()
if(stat & NOPOWER)
// No power, no processing.
remove_display()
return PROCESS_KILL
if(friendc) //Makes all status displays except supply shuttle timer display the eye -- Urist
set_picture("ai_friend")
return PROCESS_KILL
switch(mode)
if(SD_BLANK)
remove_display()
return PROCESS_KILL
if(SD_EMERGENCY)
return display_shuttle_status(SSshuttle.emergency)
if(SD_MESSAGE)
return ..()
if(SD_PICTURE)
set_picture(last_picture)
return PROCESS_KILL
/obj/machinery/status_display/evac/examine(mob/user)
. = ..()
if(mode == SD_EMERGENCY)
examine_shuttle(user, SSshuttle.emergency)
else if(!message1 && !message2)
to_chat(user, "The display is blank.")
/obj/machinery/status_display/evac/receive_signal(datum/signal/signal)
switch(signal.data["command"])
if("blank")
mode = SD_BLANK
set_message(null, null)
if("shuttle")
mode = SD_EMERGENCY
set_message(null, null)
if("message")
mode = SD_MESSAGE
set_message(signal.data["msg1"], signal.data["msg2"])
if("alert")
mode = SD_PICTURE
last_picture = signal.data["picture_state"]
set_picture(last_picture)
if("friendcomputer")
friendc = !friendc
update()
/// Supply display which shows the status of the supply shuttle.
/obj/machinery/status_display/supply
name = "supply display"
/obj/machinery/status_display/supply/process()
if(stat & NOPOWER)
// No power, no processing.
remove_display()
return PROCESS_KILL
var/line1
var/line2
if(!SSshuttle.supply)
// Might be missing in our first update on initialize before shuttles
// have loaded. Cross our fingers that it will soon return.
line1 = "CARGO"
line2 = "shutl?"
else if(SSshuttle.supply.mode == SHUTTLE_IDLE)
if(is_station_level(SSshuttle.supply.z))
line1 = "CARGO"
line2 = "Docked"
else
line1 = "CARGO"
line2 = SSshuttle.supply.getTimerStr()
if(lentext(line2) > CHARS_PER_LINE)
line2 = "Error"
update_display(line1, line2)
/obj/machinery/status_display/supply/examine(mob/user)
. = ..()
var/obj/docking_port/mobile/shuttle = SSshuttle.supply
var/shuttleMsg = null
if (shuttle.mode == SHUTTLE_IDLE)
if (is_station_level(shuttle.z))
shuttleMsg = "Docked"
else
shuttleMsg = "[shuttle.getModeStr()]: [shuttle.getTimerStr()]"
if (shuttleMsg)
to_chat(user, "The display says:<br>\t<tt>[shuttleMsg]</tt>")
else
to_chat(user, "The display is blank.")
/// General-purpose shuttle status display.
/obj/machinery/status_display/shuttle
name = "shuttle display"
var/shuttle_id
/obj/machinery/status_display/shuttle/process()
if(!shuttle_id || (stat & NOPOWER))
// No power, no processing.
remove_display()
return PROCESS_KILL
return display_shuttle_status(SSshuttle.getShuttle(shuttle_id))
/obj/machinery/status_display/shuttle/examine(mob/user)
. = ..()
if(shuttle_id)
examine_shuttle(user, SSshuttle.getShuttle(shuttle_id))
else
to_chat(user, "The display is blank.")
/obj/machinery/status_display/shuttle/vv_edit_var(var_name, var_value)
. = ..()
if(!.)
return
switch(var_name)
if("shuttle_id")
update()
if(mode==1) // AI emoticon
/obj/machinery/status_display/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override)
if (port && (shuttle_id == initial(shuttle_id) || override))
shuttle_id = port.id
update()
/// Pictograph display which the AI can use to emote.
/obj/machinery/status_display/ai
name = "\improper AI display"
desc = "A small screen which the AI can use to present itself."
var/mode = SD_BLANK
var/emotion = "Neutral"
/obj/machinery/status_display/ai/Initialize()
. = ..()
GLOB.ai_status_displays.Add(src)
/obj/machinery/status_display/ai/Destroy()
GLOB.ai_status_displays.Remove(src)
. = ..()
/obj/machinery/status_display/ai/attack_ai(mob/living/silicon/ai/user)
if(isAI(user))
user.ai_statuschange()
/obj/machinery/status_display/ai/process()
if(mode == SD_BLANK || (stat & NOPOWER))
remove_display()
return PROCESS_KILL
if(mode == SD_AI_EMOTE)
switch(emotion)
if("Very Happy")
set_picture("ai_veryhappy")
@@ -291,6 +345,8 @@
set_picture("ai_awesome")
if("Dorfy")
set_picture("ai_urist")
if("Thinking")
set_picture("ai_thinking")
if("Facepalm")
set_picture("ai_facepalm")
if("Friend Computer")
@@ -299,19 +355,13 @@
set_picture("ai_sal")
if("Red Glow")
set_picture("ai_hal")
return PROCESS_KILL
return
if(mode==2) // BSOD
if(mode == SD_AI_BSOD)
set_picture("ai_bsod")
return
return PROCESS_KILL
/obj/machinery/ai_status_display/proc/set_picture(state)
picture_state = state
cut_overlays()
add_overlay(picture_state)
#undef CHARS_PER_LINE
#undef FONT_SIZE
#undef FONT_COLOR
+2 -1
View File
@@ -1,7 +1,7 @@
// SUIT STORAGE UNIT /////////////////
/obj/machinery/suit_storage_unit
name = "suit storage unit"
desc = "An industrial unit made to hold space suits. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit."
desc = "An industrial unit made to hold and decontaminate irradiated equipment. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit."
icon = 'icons/obj/machines/suit_storage.dmi'
icon_state = "close"
density = TRUE
@@ -340,6 +340,7 @@
if(panel_open && is_wire_tool(I))
wires.interact(user)
return
if(!state_open)
if(default_deconstruction_screwdriver(user, "panel", "close", I))
return
@@ -190,4 +190,20 @@
if(length(receive))
SSblackbox.LogBroadcast(frequency)
var/spans_part = ""
if(length(spans))
spans_part = "(spans:"
for(var/S in spans)
spans_part = "[spans_part] [S]"
spans_part = "[spans_part] ) "
var/lang_name = data["language"]
var/log_text = "\[[get_radio_name(frequency)]\] [spans_part]\"[message]\" (language: [lang_name])"
var/mob/source_mob = virt.source
if(istype(source_mob))
source_mob.log_message(log_text, LOG_TELECOMMS)
else
log_telecomms("[virt.source] [log_text] [loc_name(get_turf(virt.source))]")
QDEL_IN(virt, 50) // Make extra sure the virtualspeaker gets qdeleted
@@ -423,7 +423,7 @@
))
// this will log the signal and transmit it to the target
linkedServer.receive_information(signal, null)
log_talk(usr, "[key_name(usr)] (PDA: [name]) sent \"[custommessage]\" to [signal.format_target()]", LOGPDA)
usr.log_message("(PDA: [name]) sent \"[custommessage]\" to [signal.format_target()]", LOG_PDA)
//Request Console Logs - KEY REQUIRED
@@ -17,7 +17,7 @@
flags_1 = NODECONSTRUCT_1
/obj/machinery/telecomms/allinone/Initialize()
..()
. = ..()
if (intercept)
freq_listening = list(FREQ_SYNDICATE)
@@ -144,7 +144,7 @@
M << browse("<html><head><title>PDA Photo</title></head>" \
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
+ "<img src='pda_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' />" \
+ "</body></html>", "window=pdaphoto;size=[picture.psize_x]x[picture.psize_y]")
+ "</body></html>", "window=pdaphoto;size=[picture.psize_x]x[picture.psize_y];can-close=true")
onclose(M, "pdaphoto")
/datum/data_rc_msg
+1 -1
View File
@@ -40,7 +40,7 @@
break
return power_station
/obj/machinery/teleport/hub/CollidedWith(atom/movable/AM)
/obj/machinery/teleport/hub/Bumped(atom/movable/AM)
if(is_centcom_level(z))
to_chat(AM, "You can't use this here.")
return
+1 -1
View File
@@ -45,7 +45,7 @@
else
icon_state = initial(icon_state)
/obj/machinery/transformer/CollidedWith(atom/movable/AM)
/obj/machinery/transformer/Bumped(atom/movable/AM)
if(cooldown == 1)
return
+22 -1
View File
@@ -13,7 +13,7 @@
/obj/machinery/washing_machine/ComponentInitialize()
. = ..()
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
/obj/machinery/washing_machine/examine(mob/user)
..()
@@ -40,6 +40,24 @@
busy = TRUE
update_icon()
addtimer(CALLBACK(src, .proc/wash_cycle), 200)
START_PROCESSING(SSfastprocess, src)
/obj/machinery/washing_machine/process()
if (!busy)
animate(src, transform=matrix(), time=2)
return PROCESS_KILL
if (anchored)
if (prob(5))
var/matrix/M = new
M.Translate(rand(-1, 1), rand(0, 1))
animate(src, transform=M, time=1)
animate(transform=matrix(), time=1)
else
if (prob(1))
step(src, pick(GLOB.cardinals))
var/matrix/M = new
M.Translate(rand(-3, 3), rand(-1, 3))
animate(src, transform=M, time=2)
/obj/machinery/washing_machine/proc/clean_blood()
if(!busy)
@@ -188,6 +206,9 @@
add_overlay("wm_panel")
/obj/machinery/washing_machine/attackby(obj/item/W, mob/user, params)
if(panel_open && !busy && default_unfasten_wrench(user, W))
return
if(default_deconstruction_screwdriver(user, null, null, W))
update_icon()
return
+12
View File
@@ -99,6 +99,10 @@
<div class='header'>Sounds of HONK:</div>
<div class='links'>
<a href='?src=[REF(src)];play_sound=sadtrombone'>Sad Trombone</a>
<a href='?src=[REF(src)];play_sound=bikehorn'>Bike Horn</a>
<a href='?src=[REF(src)];play_sound=airhorn2'>Air Horn</a>
<a href='?src=[REF(src)];play_sound=carhorn'>Car Horn</a>
<a href='?src=[REF(src)];play_sound=party_horn'>Party Horn</a>
</div>
</div>
"}
@@ -133,6 +137,14 @@
switch(href_list["play_sound"])
if("sadtrombone")
playsound(src, 'sound/misc/sadtrombone.ogg', 50)
if("bikehorn")
playsound(src, 'sound/items/bikehorn.ogg', 50)
if("airhorn2")
playsound(src, 'sound/items/airhorn2.ogg', 40) //soundfile has higher than average volume
if("carhorn")
playsound(src, 'sound/items/carhorn.ogg', 80) //soundfile has lower than average volume
if("party_horn")
playsound(src, 'sound/items/party_horn.ogg', 50)
return
/proc/rand_hex_color()
+5 -3
View File
@@ -43,7 +43,7 @@
/obj/item/mecha_parts/mecha_equipment/proc/critfail()
if(chassis)
log_message("Critical failure",1)
log_message("Critical failure", color="red")
/obj/item/mecha_parts/mecha_equipment/proc/get_equip_info()
if(!chassis)
@@ -147,9 +147,11 @@
chassis.occupant_message("[icon2html(src, chassis.occupant)] [message]")
return
/obj/item/mecha_parts/mecha_equipment/proc/log_message(message)
/obj/item/mecha_parts/mecha_equipment/log_message(message, message_type=LOG_GAME, color=null)
if(chassis)
chassis.log_message("<i>[src]:</i> [message]")
chassis.log_message("([src]) [message]", message_type, color)
else
..()
return
@@ -194,7 +194,7 @@
if(to_inject && patient.reagents.get_reagent_amount(R.id) + to_inject <= inject_amount*2)
occupant_message("Injecting [patient] with [to_inject] units of [R.name].")
log_message("Injecting [patient] with [to_inject] units of [R.name].")
add_logs(chassis.occupant, patient, "injected", "[name] ([R] - [to_inject] units)")
log_combat(chassis.occupant, patient, "injected", "[name] ([R] - [to_inject] units)")
SG.reagents.trans_id_to(patient,R.id,to_inject)
update_equip_info()
return
@@ -338,7 +338,7 @@
mechsyringe.reagents.reaction(M, INJECT)
mechsyringe.reagents.trans_to(M, mechsyringe.reagents.total_volume)
M.take_bodypart_damage(2)
add_logs(originaloccupant, M, "shot", "syringegun")
log_combat(originaloccupant, M, "shot", "syringegun")
break
else if(mechsyringe.loc == trg)
mechsyringe.icon_state = initial(mechsyringe.icon_state)
@@ -111,9 +111,9 @@
/obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/user)
target.visible_message("<span class='danger'>[chassis] is drilling [target] with [src]!</span>", \
"<span class='userdanger'>[chassis] is drilling you with [src]!</span>")
add_logs(user, target, "drilled", "[name]", "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
log_combat(user, target, "drilled", "[name]", "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
if(target.stat == DEAD && target.getBruteLoss() >= 200)
add_logs(user, target, "gibbed", name)
log_combat(user, target, "gibbed", name)
if(LAZYLEN(target.butcher_results) || LAZYLEN(target.guaranteed_butcher_results))
GET_COMPONENT_FROM(butchering, /datum/component/butchering, src)
butchering.Butcher(chassis, target)
@@ -468,7 +468,7 @@
fuel_per_cycle_idle = 10
fuel_per_cycle_active = 30
power_per_cycle = 50
var/rad_per_cycle = 3
var/rad_per_cycle = 30
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/generator_init()
fuel = new /obj/item/stack/sheet/mineral/uranium(src, 0)
@@ -64,7 +64,7 @@
target.visible_message("<span class='danger'>[chassis] squeezes [target].</span>", \
"<span class='userdanger'>[chassis] squeezes [target].</span>",\
"<span class='italics'>You hear something crack.</span>")
add_logs(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
else
step_away(M,chassis)
occupant_message("You push [target] out of the way.")
@@ -124,7 +124,7 @@
M.updatehealth()
target.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury.</span>", \
"<span class='userdanger'>[chassis] destroys [target] in an unholy fury.</span>")
add_logs(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
else
target.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury.</span>", \
"<span class='userdanger'>[chassis] destroys [target] in an unholy fury.</span>")
@@ -147,7 +147,7 @@
playsound(src, get_dismember_sound(), 80, TRUE)
target.visible_message("<span class='danger'>[chassis] rips [target]'s arms off.</span>", \
"<span class='userdanger'>[chassis] rips [target]'s arms off.</span>")
add_logs(chassis.occupant, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
log_combat(chassis.occupant, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
else
target.visible_message("<span class='danger'>[chassis] rips [target]'s arms off.</span>", \
"<span class='userdanger'>[chassis] rips [target]'s arms off.</span>")
@@ -240,8 +240,8 @@
GLOB.rcd_list += src
/obj/item/mecha_parts/mecha_equipment/rcd/Destroy()
GLOB.rcd_list -= src
return ..()
GLOB.rcd_list -= src
return ..()
/obj/item/mecha_parts/mecha_equipment/rcd/action(atom/target)
if(istype(target, /turf/open/space/transit))//>implying these are ever made -Sieve
+1 -1
View File
@@ -36,7 +36,7 @@
/obj/machinery/mecha_part_fabricator/Initialize()
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
TRUE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
stored_research = new
return ..()
+5 -4
View File
@@ -411,7 +411,7 @@
for(var/mob/M in get_hearers_in_view(7,src))
if(M.client)
speech_bubble_recipients.Add(M.client)
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, image('icons/mob/talk.dmi', src, "machine[say_test(raw_message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, image('icons/mob/talk.dmi', src, "machine[say_test(raw_message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
////////////////////////////
///// Action processing ////
@@ -569,7 +569,7 @@
playsound(src,stepsound,40,1)
return result
/obj/mecha/Collide(var/atom/obstacle)
/obj/mecha/Bump(var/atom/obstacle)
if(phasing && get_charge() >= phasing_energy_drain && !throwing)
spawn()
if(can_move)
@@ -1015,9 +1015,10 @@
to_chat(occupant, "[icon2html(src, occupant)] [message]")
return
/obj/mecha/proc/log_message(message as text,red=null)
/obj/mecha/log_message(message as text, message_type=LOG_GAME, color=null)
log.len++
log[log.len] = list("time"="[station_time_timestamp()]","date","year"="[GLOB.year_integer+540]","message"="[red?"<font color='red'>":null][message][red?"</font>":null]")
log[log.len] = list("time"="[station_time_timestamp()]","date","year"="[GLOB.year_integer+540]","message"="[color?"<font color='[color]'>":null][message][color?"</font>":null]")
..()
return log.len
/obj/mecha/proc/log_append_to_last(message as text,red=null)
+1 -1
View File
@@ -265,7 +265,7 @@
if("fire")
new_damtype = "tox"
chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.")
chassis.damtype = new_damtype.
chassis.damtype = new_damtype
button_icon_state = "mech_damtype_[new_damtype]"
playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1)
UpdateButtonIcon()
+60 -60
View File
@@ -198,7 +198,7 @@
user.visible_message("[user] removes the wiring from [parent].", "<span class='notice'>You remove the wiring from [parent].</span>")
if(5)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [parent].", "<span class='notice'>You install the central computer mainboard into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] disconnects the wiring of [parent].", "<span class='notice'>You disconnect the wiring of [parent].</span>")
if(6)
@@ -208,7 +208,7 @@
user.visible_message("[user] removes the central control module from [parent].", "<span class='notice'>You remove the central computer mainboard from [parent].</span>")
if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [parent].", "<span class='notice'>You install the peripherals control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the mainboard.", "<span class='notice'>You unfasten the mainboard.</span>")
if(8)
@@ -218,7 +218,7 @@
user.visible_message("[user] removes the peripherals control module from [parent].", "<span class='notice'>You remove the peripherals control module from [parent].</span>")
if(9)
if(diff==FORWARD)
user.visible_message("[user] installs the power cell into [parent].", "<span class='notice'>You install the power cell into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
@@ -358,7 +358,7 @@
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Advanced scanner module is installed."
"desc" = "Scanner module is installed."
),
//13
@@ -366,14 +366,14 @@
"key" = /obj/item/stock_parts/capacitor,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Advanced scanner module is secured."
"desc" = "Scanner module is secured."
),
//14
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Advanced capacitor is installed."
"desc" = "Capacitor is installed."
),
//15
@@ -381,7 +381,7 @@
"key" = /obj/item/stock_parts/cell,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Advanced capacitor is secured."
"desc" = "Capacitor is secured."
),
//16
@@ -437,7 +437,7 @@
)
/datum/component/construction/mecha/gygax/action(atom/used_atom,mob/user)
/datum/component/construction/mecha/gygax/action(datum/source, atom/used_atom, mob/user)
return check_step(used_atom,user)
/datum/component/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff)
@@ -464,7 +464,7 @@
user.visible_message("[user] removes the wiring from [parent].", "<span class='notice'>You remove the wiring from [parent].</span>")
if(5)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [parent].", "<span class='notice'>You install the central computer mainboard into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] disconnects the wiring of [parent].", "<span class='notice'>You disconnect the wiring of [parent].</span>")
if(6)
@@ -474,7 +474,7 @@
user.visible_message("[user] removes the central control module from [parent].", "<span class='notice'>You remove the central computer mainboard from [parent].</span>")
if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [parent].", "<span class='notice'>You install the peripherals control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the mainboard.", "<span class='notice'>You unfasten the mainboard.</span>")
if(8)
@@ -484,7 +484,7 @@
user.visible_message("[user] removes the peripherals control module from [parent].", "<span class='notice'>You remove the peripherals control module from [parent].</span>")
if(9)
if(diff==FORWARD)
user.visible_message("[user] installs the weapon control module into [parent].", "<span class='notice'>You install the weapon control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
@@ -494,19 +494,19 @@
user.visible_message("[user] removes the weapon control module from [parent].", "<span class='notice'>You remove the weapon control module from [parent].</span>")
if(11)
if(diff==FORWARD)
user.visible_message("[user] installs scanner module to [parent].", "<span class='notice'>You install scanner module to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the weapon control module.", "<span class='notice'>You unfasten the weapon control module.</span>")
if(12)
if(diff==FORWARD)
user.visible_message("[user] secures the advanced scanner module.", "<span class='notice'>You secure the scanner module.</span>")
user.visible_message("[user] secures the scanner module.", "<span class='notice'>You secure the scanner module.</span>")
else
user.visible_message("[user] removes the advanced scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
user.visible_message("[user] removes the scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
if(13)
if(diff==FORWARD)
user.visible_message("[user] installs capacitor to [parent].", "<span class='notice'>You install capacitor to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
user.visible_message("[user] unfastens the scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
if(14)
if(diff==FORWARD)
user.visible_message("[user] secures the capacitor.", "<span class='notice'>You secure the capacitor.</span>")
@@ -514,7 +514,7 @@
user.visible_message("[user] removes the capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
if(15)
if(diff==FORWARD)
user.visible_message("[user] installs the power cell into [parent].", "<span class='notice'>You install the power cell into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the capacitor.", "<span class='notice'>You unfasten the capacitor.</span>")
if(16)
@@ -539,7 +539,7 @@
user.visible_message("[user] unfastens the internal armor layer.", "<span class='notice'>You unfasten the internal armor layer.</span>")
if(20)
if(diff==FORWARD)
user.visible_message("[user] installs Gygax Armor Plates to [parent].", "<span class='notice'>You install Gygax Armor Plates to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] cuts the internal armor layer from [parent].", "<span class='notice'>You cut the internal armor layer from [parent].</span>")
if(21)
@@ -720,7 +720,7 @@
user.visible_message("[user] removes the wiring from [parent].", "<span class='notice'>You remove the wiring from [parent].</span>")
if(5)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [parent].", "<span class='notice'>You install the central computer mainboard into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] disconnects the wiring of [parent].", "<span class='notice'>You disconnect the wiring of [parent].</span>")
if(6)
@@ -730,7 +730,7 @@
user.visible_message("[user] removes the central control module from [parent].", "<span class='notice'>You remove the central computer mainboard from [parent].</span>")
if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [parent].", "<span class='notice'>You install the peripherals control module into [parent].</span>")
user.visible_message("[user] installs [I]into [parent].", "<span class='notice'>You install [I]into [parent].</span>")
else
user.visible_message("[user] unfastens the mainboard.", "<span class='notice'>You unfasten the mainboard.</span>")
if(8)
@@ -740,7 +740,7 @@
user.visible_message("[user] removes the peripherals control module from [parent].", "<span class='notice'>You remove the peripherals control module from [parent].</span>")
if(9)
if(diff==FORWARD)
user.visible_message("[user] installs the power cell into [parent].", "<span class='notice'>You install the power cell into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
@@ -890,17 +890,17 @@
//TODO: better messages.
switch(index)
if(2)
user.visible_message("[user] installs the central control module into [parent].", "<span class='notice'>You install the central control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
if(4)
user.visible_message("[user] installs the peripherals control module into [parent].", "<span class='notice'>You install the peripherals control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
if(6)
user.visible_message("[user] installs the weapon control module into [parent].", "<span class='notice'>You install the weapon control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
if(8)
user.visible_message("[user] installs the power cell into [parent].", "<span class='notice'>You install the power cell into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
if(10)
user.visible_message("[user] puts clown wig and mask on [parent].", "<span class='notice'>You put clown wig and mask on [parent].</span>")
user.visible_message("[user] puts [I] on [parent].", "<span class='notice'>You put [I] on [parent].</span>")
if(12)
user.visible_message("[user] puts clown boots on [parent].", "<span class='notice'>You put clown boots on [parent].</span>")
user.visible_message("[user] puts [I] on [parent].", "<span class='notice'>You put [I] on [parent].</span>")
return TRUE
/datum/component/construction/unordered/mecha_chassis/durand
@@ -1003,7 +1003,7 @@
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Phasic scanner module is installed."
"desc" = "Scanner module is installed."
),
//13
@@ -1011,14 +1011,14 @@
"key" = /obj/item/stock_parts/capacitor,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Phasic scanner module is secured."
"desc" = "Scanner module is secured."
),
//14
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Super capacitor is installed."
"desc" = "Capacitor is installed."
),
//15
@@ -1026,7 +1026,7 @@
"key" = /obj/item/stock_parts/cell,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Super capacitor is secured."
"desc" = "Capacitor is secured."
),
//16
@@ -1107,7 +1107,7 @@
user.visible_message("[user] removes the wiring from [parent].", "<span class='notice'>You remove the wiring from [parent].</span>")
if(5)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [parent].", "<span class='notice'>You install the central computer mainboard into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] disconnects the wiring of [parent].", "<span class='notice'>You disconnect the wiring of [parent].</span>")
if(6)
@@ -1117,7 +1117,7 @@
user.visible_message("[user] removes the central control module from [parent].", "<span class='notice'>You remove the central computer mainboard from [parent].</span>")
if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [parent].", "<span class='notice'>You install the peripherals control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the mainboard.", "<span class='notice'>You unfasten the mainboard.</span>")
if(8)
@@ -1127,7 +1127,7 @@
user.visible_message("[user] removes the peripherals control module from [parent].", "<span class='notice'>You remove the peripherals control module from [parent].</span>")
if(9)
if(diff==FORWARD)
user.visible_message("[user] installs the weapon control module into [parent].", "<span class='notice'>You install the weapon control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
@@ -1137,7 +1137,7 @@
user.visible_message("[user] removes the weapon control module from [parent].", "<span class='notice'>You remove the weapon control module from [parent].</span>")
if(11)
if(diff==FORWARD)
user.visible_message("[user] installs scanner module to [parent].", "<span class='notice'>You install phasic scanner module to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the weapon control module.", "<span class='notice'>You unfasten the weapon control module.</span>")
if(12)
@@ -1147,17 +1147,17 @@
user.visible_message("[user] removes the scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
if(13)
if(diff==FORWARD)
user.visible_message("[user] installs capacitor to [parent].", "<span class='notice'>You install capacitor to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
if(14)
if(diff==FORWARD)
user.visible_message("[user] secures the capacitor.", "<span class='notice'>You secure the capacitor.</span>")
else
user.visible_message("[user] removes the super capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
user.visible_message("[user] removes the capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
if(15)
if(diff==FORWARD)
user.visible_message("[user] installs the power cell into [parent].", "<span class='notice'>You install the power cell into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the capacitor.", "<span class='notice'>You unfasten the capacitor.</span>")
if(16)
@@ -1182,7 +1182,7 @@
user.visible_message("[user] unfastens the internal armor layer.", "<span class='notice'>You unfasten the internal armor layer.</span>")
if(20)
if(diff==FORWARD)
user.visible_message("[user] installs Durand Armor Plates to [parent].", "<span class='notice'>You install Durand Armor Plates to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] cuts the internal armor layer from [parent].", "<span class='notice'>You cut the internal armor layer from [parent].</span>")
if(21)
@@ -1299,7 +1299,7 @@
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Phasic scanner module is installed."
"desc" = "Scanner module is installed."
),
//13
@@ -1307,14 +1307,14 @@
"key" = /obj/item/stock_parts/capacitor,
"action" = ITEM_MOVE_INSIDE,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Phasic scanner module is secured."
"desc" = "Scanner module is secured."
),
//14
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "Super capacitor is installed."
"desc" = "Capacitor is installed."
),
//15
@@ -1322,7 +1322,7 @@
"key" = /obj/item/stack/ore/bluespace_crystal,
"amount" = 1,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Super capacitor is secured."
"desc" = "Capacitor is secured."
),
//16
@@ -1443,7 +1443,7 @@
user.visible_message("[user] removes the wiring from [parent].", "<span class='notice'>You remove the wiring from [parent].</span>")
if(5)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [parent].", "<span class='notice'>You install the central computer mainboard into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] disconnects the wiring of [parent].", "<span class='notice'>You disconnect the wiring of [parent].</span>")
if(6)
@@ -1453,7 +1453,7 @@
user.visible_message("[user] removes the central control module from [parent].", "<span class='notice'>You remove the central computer mainboard from [parent].</span>")
if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [parent].", "<span class='notice'>You install the peripherals control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the mainboard.", "<span class='notice'>You unfasten the mainboard.</span>")
if(8)
@@ -1463,7 +1463,7 @@
user.visible_message("[user] removes the peripherals control module from [parent].", "<span class='notice'>You remove the peripherals control module from [parent].</span>")
if(9)
if(diff==FORWARD)
user.visible_message("[user] installs the weapon control module into [parent].", "<span class='notice'>You install the weapon control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
@@ -1473,29 +1473,29 @@
user.visible_message("[user] removes the weapon control module from [parent].", "<span class='notice'>You remove the weapon control module from [parent].</span>")
if(11)
if(diff==FORWARD)
user.visible_message("[user] installs phasic scanner module to [parent].", "<span class='notice'>You install scanner module to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the weapon control module.", "<span class='notice'>You unfasten the weapon control module.</span>")
if(12)
if(diff==FORWARD)
user.visible_message("[user] secures the phasic scanner module.", "<span class='notice'>You secure the scanner module.</span>")
user.visible_message("[user] secures the scanner module.", "<span class='notice'>You secure the scanner module.</span>")
else
user.visible_message("[user] removes the phasic scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
user.visible_message("[user] removes the scanner module from [parent].", "<span class='notice'>You remove the scanner module from [parent].</span>")
if(13)
if(diff==FORWARD)
user.visible_message("[user] installs super capacitor to [parent].", "<span class='notice'>You install capacitor to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] unfastens the phasic scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
user.visible_message("[user] unfastens the scanner module.", "<span class='notice'>You unfasten the scanner module.</span>")
if(14)
if(diff==FORWARD)
user.visible_message("[user] secures the super capacitor.", "<span class='notice'>You secure the capacitor.</span>")
user.visible_message("[user] secures [I].", "<span class='notice'>You secure [I].</span>")
else
user.visible_message("[user] removes the super capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
user.visible_message("[user] removes the capacitor from [parent].", "<span class='notice'>You remove the capacitor from [parent].</span>")
if(15)
if(diff==FORWARD)
user.visible_message("[user] installs the bluespace crystal.", "<span class='notice'>You install the bluespace crystal.</span>")
user.visible_message("[user] installs [I].", "<span class='notice'>You install [I].</span>")
else
user.visible_message("[user] unsecures the super capacitor from [parent].", "<span class='notice'>You unsecure the capacitor from [parent].</span>")
user.visible_message("[user] unsecures the capacitor from [parent].", "<span class='notice'>You unsecure the capacitor from [parent].</span>")
if(16)
if(diff==FORWARD)
user.visible_message("[user] connects the bluespace crystal.", "<span class='notice'>You connect the bluespace crystal.</span>")
@@ -1508,7 +1508,7 @@
user.visible_message("[user] disconnects the bluespace crystal from [parent].", "<span class='notice'>You disconnect the bluespace crystal from [parent].</span>")
if(18)
if(diff==FORWARD)
user.visible_message("[user] installs the power cell into [parent].", "<span class='notice'>You install the power cell into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] disengages the bluespace crystal.", "<span class='notice'>You disengage the bluespace crystal.</span>")
if(19)
@@ -1533,7 +1533,7 @@
user.visible_message("[user] unfastens the phase armor layer.", "<span class='notice'>You unfasten the phase armor layer.</span>")
if(23)
if(diff==FORWARD)
user.visible_message("[user] installs Phazon Armor Plates to [parent].", "<span class='notice'>You install Phazon Armor Plates to [parent].</span>")
user.visible_message("[user] installs [I] to [parent].", "<span class='notice'>You install [I] to [parent].</span>")
else
user.visible_message("[user] cuts phase armor layer from [parent].", "<span class='notice'>You cut the phase armor layer from [parent].</span>")
if(24)
@@ -1712,7 +1712,7 @@
user.visible_message("[user] removes the wiring from [parent].", "<span class='notice'>You remove the wiring from [parent].</span>")
if(5)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [parent].", "<span class='notice'>You install the central computer mainboard into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] disconnects the wiring of [parent].", "<span class='notice'>You disconnect the wiring of [parent].</span>")
if(6)
@@ -1722,7 +1722,7 @@
user.visible_message("[user] removes the central control module from [parent].", "<span class='notice'>You remove the central computer mainboard from [parent].</span>")
if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into [parent].", "<span class='notice'>You install the peripherals control module into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the mainboard.", "<span class='notice'>You unfasten the mainboard.</span>")
if(8)
@@ -1732,7 +1732,7 @@
user.visible_message("[user] removes the peripherals control module from [parent].", "<span class='notice'>You remove the peripherals control module from [parent].</span>")
if(9)
if(diff==FORWARD)
user.visible_message("[user] installs the power cell into [parent].", "<span class='notice'>You install the power cell into [parent].</span>")
user.visible_message("[user] installs [I] into [parent].", "<span class='notice'>You install [I] into [parent].</span>")
else
user.visible_message("[user] unfastens the peripherals control module.", "<span class='notice'>You unfasten the peripherals control module.</span>")
if(10)
+12 -12
View File
@@ -62,7 +62,7 @@
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
playsound(loc, 'sound/weapons/tap.ogg', 40, 1, -1)
user.visible_message("<span class='danger'>[user] hits [name]. Nothing happens</span>", null, null, COMBAT_MESSAGE_RANGE)
log_message("Attack by hand/paw. Attacker - [user].",1)
log_message("Attack by hand/paw. Attacker - [user].", color="red")
log_append_to_last("Armor saved.")
/obj/mecha/attack_paw(mob/user as mob)
@@ -70,12 +70,12 @@
/obj/mecha/attack_alien(mob/living/user)
log_message("Attack by alien. Attacker - [user].",1)
log_message("Attack by alien. Attacker - [user].", color="red")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
attack_generic(user, 15, BRUTE, "melee", 0)
/obj/mecha/attack_animal(mob/living/simple_animal/user)
log_message("Attack by simple animal. Attacker - [user].",1)
log_message("Attack by simple animal. Attacker - [user].", color="red")
if(!user.melee_damage_upper && !user.obj_damage)
user.emote("custom", message = "[user.friendly] [src].")
return 0
@@ -89,7 +89,7 @@
animal_damage = user.obj_damage
animal_damage = min(animal_damage, 20*user.environment_smash)
attack_generic(user, animal_damage, user.melee_damage_type, "melee", play_soundeffect)
add_logs(user, src, "attacked")
log_combat(user, src, "attacked")
return 1
@@ -99,8 +99,8 @@
/obj/mecha/attack_hulk(mob/living/carbon/human/user)
. = ..()
if(.)
log_message("Attack by hulk. Attacker - [user].",1)
add_logs(user, src, "punched", "hulk powers")
log_message("Attack by hulk. Attacker - [user].", color="red")
log_combat(user, src, "punched", "hulk powers")
/obj/mecha/blob_act(obj/structure/blob/B)
take_damage(30, BRUTE, "melee", 0, get_dir(src, B))
@@ -109,16 +109,16 @@
return
/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
log_message("Hit by [A].",1)
log_message("Hit by [A].", color="red")
. = ..()
/obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper
log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).",1)
log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).", color="red")
. = ..()
/obj/mecha/ex_act(severity, target)
log_message("Affected by explosion of severity: [severity].",1)
log_message("Affected by explosion of severity: [severity].", color="red")
if(prob(deflect_chance))
severity++
log_append_to_last("Armor saved, changing severity to [severity].")
@@ -148,12 +148,12 @@
if(get_charge())
use_power((cell.charge/3)/(severity*2))
take_damage(30 / severity, BURN, "energy", 1)
log_message("EMP detected",1)
log_message("EMP detected", color="red")
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
/obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature>max_temperature)
log_message("Exposed to dangerous temperature.",1)
log_message("Exposed to dangerous temperature.", color="red")
take_damage(5, BURN, 0, 1)
/obj/mecha/attackby(obj/item/W as obj, mob/user as mob, params)
@@ -290,7 +290,7 @@
return 0
use_power(melee_energy_drain)
if(M.damtype == BRUTE || M.damtype == BURN)
add_logs(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
. = ..()
/obj/mecha/proc/full_repair(charge_cell)
+1 -1
View File
@@ -350,5 +350,5 @@
log_message("Recalibration of coordination system finished with 0 errors.")
else
occupant_message("<span class='warning'>Recalibration failed!</span>")
log_message("Recalibration of coordination system failed with 1 error.",1)
log_message("Recalibration of coordination system failed with 1 error.", color="red")
+1 -1
View File
@@ -2,7 +2,7 @@
desc = "These exosuits are developed and produced by Vey-Med. (&copy; All rights reserved)."
name = "\improper Odysseus"
icon_state = "odysseus"
step_in = 3
step_in = 2
max_temperature = 15000
max_integrity = 120
wreckage = /obj/structure/mecha_wreckage/odysseus
+5 -5
View File
@@ -105,10 +105,10 @@
/obj/effect/anomaly/grav/Crossed(mob/A)
gravShock(A)
/obj/effect/anomaly/grav/Collide(mob/A)
/obj/effect/anomaly/grav/Bump(mob/A)
gravShock(A)
/obj/effect/anomaly/grav/CollidedWith(atom/movable/AM)
/obj/effect/anomaly/grav/Bumped(atom/movable/AM)
gravShock(AM)
/obj/effect/anomaly/grav/proc/gravShock(mob/living/A)
@@ -151,10 +151,10 @@
/obj/effect/anomaly/flux/Crossed(mob/living/M)
mobShock(M)
/obj/effect/anomaly/flux/Collide(mob/living/M)
/obj/effect/anomaly/flux/Bump(mob/living/M)
mobShock(M)
/obj/effect/anomaly/flux/CollidedWith(atom/movable/AM)
/obj/effect/anomaly/flux/Bumped(atom/movable/AM)
mobShock(AM)
/obj/effect/anomaly/flux/proc/mobShock(mob/living/M)
@@ -192,7 +192,7 @@
for(var/mob/living/M in range(1,src))
do_teleport(M, locate(M.x, M.y, M.z), 4)
/obj/effect/anomaly/bluespace/CollidedWith(atom/movable/AM)
/obj/effect/anomaly/bluespace/Bumped(atom/movable/AM)
if(isliving(AM))
do_teleport(AM, locate(AM.x, AM.y, AM.z), 8)
+1 -1
View File
@@ -26,7 +26,7 @@
/obj/effect/bump_teleporter/singularity_pull()
return
/obj/effect/bump_teleporter/CollidedWith(atom/movable/AM)
/obj/effect/bump_teleporter/Bumped(atom/movable/AM)
if(!ismob(AM))
return
if(!id_target)
-1
View File
@@ -60,7 +60,6 @@
/obj/structure/sign/poster/Initialize()
. = ..()
addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 75), 0)
if(random_basetype)
randomise(random_basetype)
if(!ruined)
+1 -1
View File
@@ -86,7 +86,7 @@
/obj/effect/countdown/clonepod
name = "cloning pod countdown"
color = "#0C479D"
color = "#18d100"
text_size = 1
/obj/effect/countdown/clonepod/get_value()
@@ -5,7 +5,6 @@
var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one?
var/beauty
/obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -26,10 +25,6 @@
if(LAZYLEN(diseases_to_add))
AddComponent(/datum/component/infective, diseases_to_add)
/obj/effect/decal/cleanable/ComponentInitialize()
. = ..()
addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, beauty), 0) //inb4 i get yelled at for using the beauty var on cleanable instead of calling this proc on every subtype which would be pedantic and actually run worse.
/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(mergeable_decal)
return TRUE
@@ -77,7 +72,7 @@
..()
if(ishuman(O))
var/mob/living/carbon/human/H = O
if(H.shoes && blood_state && bloodiness)
if(H.shoes && blood_state && bloodiness && !H.has_trait(TRAIT_LIGHT_STEP))
var/obj/item/clothing/shoes/S = H.shoes
var/add_blood = 0
if(bloodiness >= BLOOD_GAIN_PER_STEP)
@@ -6,9 +6,8 @@
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
bloodiness = MAX_SHOE_BLOODINESS
bloodiness = BLOOD_AMOUNT_PER_DECAL
blood_state = BLOOD_STATE_XENO
beauty = -75
/obj/effect/decal/cleanable/xenoblood/Initialize()
. = ..()
@@ -5,11 +5,13 @@
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
blood_state = BLOOD_STATE_HUMAN
bloodiness = MAX_SHOE_BLOODINESS
beauty = -60
bloodiness = BLOOD_AMOUNT_PER_DECAL
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
C.add_blood_DNA(return_blood_DNA())
if (bloodiness)
if (C.bloodiness < MAX_SHOE_BLOODINESS)
C.bloodiness += bloodiness
return ..()
/obj/effect/decal/cleanable/blood/old
@@ -56,6 +58,11 @@
/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
return
/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L)
if(istype(L) && has_gravity(loc))
playsound(loc, 'sound/effects/gib_step.ogg', L.has_trait(TRAIT_LIGHT_STEP) ? 20 : 50, 1)
. = ..()
/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
@@ -3,7 +3,6 @@
desc = "Someone should clean that up."
icon = 'icons/obj/objects.dmi'
icon_state = "shards"
beauty = -50
/obj/effect/decal/cleanable/ash
name = "ashes"
@@ -11,7 +10,6 @@
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
mergeable_decal = FALSE
beauty = -50
/obj/effect/decal/cleanable/ash/Initialize()
. = ..()
@@ -26,7 +24,6 @@
/obj/effect/decal/cleanable/ash/large
name = "large pile of ashes"
icon_state = "big_ash"
beauty = -100
/obj/effect/decal/cleanable/ash/large/Initialize()
. = ..()
@@ -37,7 +34,6 @@
desc = "Back to sand."
icon = 'icons/obj/shards.dmi'
icon_state = "tiny"
beauty = -60
/obj/effect/decal/cleanable/glass/Initialize()
. = ..()
@@ -50,21 +46,34 @@
name = "dirt"
desc = "Someone should clean that up."
icon_state = "dirt"
canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall)
smooth = SMOOTH_FALSE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
beauty = -50
/obj/effect/decal/cleanable/dirt/Initialize()
. = ..()
var/turf/T = get_turf(src)
if(T.tiled_dirt)
smooth = SMOOTH_MORE
icon = 'icons/effects/dirt.dmi'
icon_state = ""
queue_smooth(src)
queue_smooth_neighbors(src)
/obj/effect/decal/cleanable/dirt/Destroy()
queue_smooth_neighbors(src)
return ..()
/obj/effect/decal/cleanable/flour
name = "flour"
desc = "It's still good. Four second rule!"
icon_state = "flour"
beauty = -50
/obj/effect/decal/cleanable/greenglow
name = "glowing goo"
desc = "Jeez. I hope that's not for lunch."
light_color = LIGHT_COLOR_GREEN
icon_state = "greenglow"
beauty = -150
/obj/effect/decal/cleanable/greenglow/Initialize(mapload)
. = ..()
@@ -80,7 +89,6 @@
layer = WALL_OBJ_LAYER
icon_state = "cobweb1"
resistance_flags = FLAMMABLE
beauty = -50
/obj/effect/decal/cleanable/cobweb/cobweb2
icon_state = "cobweb2"
@@ -92,12 +100,10 @@
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
mergeable_decal = FALSE
beauty = -100
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
beauty = -250
//Vomit (sorry)
/obj/effect/decal/cleanable/vomit
@@ -106,7 +112,6 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
beauty = -200
/obj/effect/decal/cleanable/vomit/attack_hand(mob/user)
. = ..()
@@ -141,14 +146,12 @@
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
beauty = -50
/obj/effect/decal/cleanable/plant_smudge
name = "plant smudge"
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_plant")
beauty = -50
/obj/effect/decal/cleanable/egg_smudge
name = "smashed egg"
@@ -156,7 +159,6 @@
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
beauty = -50
/obj/effect/decal/cleanable/pie_smudge //honk
name = "smashed pie"
@@ -164,7 +166,6 @@
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
beauty = -50
/obj/effect/decal/cleanable/chem_pile
name = "chemical pile"
@@ -172,7 +173,6 @@
gender = NEUTER
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
beauty = -60
/obj/effect/decal/cleanable/shreds
name = "shreds"
@@ -180,7 +180,6 @@
icon_state = "shreds"
gender = PLURAL
mergeable_decal = FALSE
beauty = -75
/obj/effect/decal/cleanable/shreds/ex_act(severity, target)
if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
@@ -197,14 +196,12 @@
icon = 'icons/effects/tomatodecal.dmi'
icon_state = "salt_pile"
gender = NEUTER
beauty = -50
/obj/effect/decal/cleanable/glitter
name = "generic glitter pile"
desc = "The herpes of arts and crafts."
icon = 'icons/effects/tile_effects.dmi'
gender = NEUTER
beauty = 100
/obj/effect/decal/cleanable/glitter/pink
name = "pink glitter"
@@ -223,7 +220,6 @@
desc = "A puddle of stabilized plasma."
icon_state = "flour"
color = "#C8A5DC"
beauty = -200
/obj/effect/decal/cleanable/insectguts
name = "insect guts"
@@ -231,4 +227,3 @@
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
beauty = -300
@@ -8,9 +8,8 @@
layer = LOW_OBJ_LAYER
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
blood_state = BLOOD_STATE_OIL
bloodiness = MAX_SHOE_BLOODINESS
bloodiness = BLOOD_AMOUNT_PER_DECAL
mergeable_decal = FALSE
beauty = -100
/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions)
set waitfor = 0
@@ -46,8 +45,7 @@
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
blood_state = BLOOD_STATE_OIL
bloodiness = MAX_SHOE_BLOODINESS
beauty = -150
bloodiness = BLOOD_AMOUNT_PER_DECAL
/obj/effect/decal/cleanable/oil/Initialize()
. = ..()
+1 -1
View File
@@ -45,4 +45,4 @@
var/turf/T = loc
if(!istype(T)) //you know this will happen somehow
CRASH("Turf decal initialized in an object/nullspace")
T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_GOD, color)
T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_GOD, color, null, null, alpha)
@@ -1,212 +1,39 @@
/obj/effect/turf_decal/tile
name = "tile decal"
icon_state = "corner_white_full"
icon_state = "tile_corner"
layer = TURF_PLATING_DECAL_LAYER
/obj/effect/turf_decal/tile/black
name = "black tile decal"
color = COLOR_ALMOST_BLACK
/obj/effect/turf_decal/tile/black/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/black/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/black/corner
icon_state = "corner_white"
alpha = 110
/obj/effect/turf_decal/tile/blue
name = "blue tile decal"
color = COLOR_BLUE_GRAY
/obj/effect/turf_decal/tile/blue/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/blue/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/blue/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/paleblue
name = "pale blue tile decal"
color = COLOR_PALE_BLUE_GRAY
/obj/effect/turf_decal/tile/paleblue/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/paleblue/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/paleblue/corner
icon_state = "corner_white"
name = "blue corner"
color = "#52B4E9"
/obj/effect/turf_decal/tile/green
name = "green tile decal"
color = COLOR_GREEN_GRAY
/obj/effect/turf_decal/tile/green/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/green/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/green/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/lime
name = "lime tile decal"
color = COLOR_PALE_GREEN_GRAY
/obj/effect/turf_decal/tile/lime/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/lime/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/lime/corner
icon_state = "corner_white"
name = "green corner"
color = "#9FED58"
/obj/effect/turf_decal/tile/yellow
name = "yellow tile decal"
color = COLOR_BROWN
/obj/effect/turf_decal/tile/yellow/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/yellow/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/yellow/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/beige
name = "beige tile decal"
color = COLOR_BEIGE
/obj/effect/turf_decal/tile/beige/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/beige/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/beige/corner
icon_state = "corner_white"
name = "yellow corner"
color = "#EFB341"
/obj/effect/turf_decal/tile/red
name = "red tile decal"
color = COLOR_RED_GRAY
/obj/effect/turf_decal/tile/red/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/red/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/red/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/pink
name = "pink tile decal"
color = COLOR_PALE_RED_GRAY
/obj/effect/turf_decal/tile/pink/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/pink/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/pink/corner
icon_state = "corner_white"
name = "red corner"
color = "#DE3A3A"
/obj/effect/turf_decal/tile/bar
name = "bar corner"
color = "#791500"
alpha = 130
/obj/effect/turf_decal/tile/purple
name = "purple tile decal"
color = COLOR_PURPLE_GRAY
/obj/effect/turf_decal/tile/purple/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/purple/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/purple/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/mauve
name = "mauve tile decal"
color = COLOR_PALE_PURPLE_GRAY
/obj/effect/turf_decal/tile/mauve/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/mauve/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/mauve/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/orange
name = "orange tile decal"
color = COLOR_DARK_ORANGE
/obj/effect/turf_decal/tile/orange/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/orange/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/orange/corner
icon_state = "corner_white"
name = "purple corner"
color = "#D381C9"
/obj/effect/turf_decal/tile/brown
name = "brown tile decal"
color = COLOR_DARK_BROWN
name = "brown corner"
color = "#A46106"
/obj/effect/turf_decal/tile/brown/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/brown/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/brown/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/white
name = "white tile decal"
/obj/effect/turf_decal/tile/white/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/white/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/white/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/gray
name = "gray tile decal"
color = COLOR_FLOORTILE_GRAY
/obj/effect/turf_decal/tile/gray/diagonal
icon_state = "corner_white_diagonal"
/obj/effect/turf_decal/tile/gray/side
icon_state = "corner_white_side"
/obj/effect/turf_decal/tile/gray/corner
icon_state = "corner_white"
/obj/effect/turf_decal/tile/neutral
name = "neutral corner"
color = "#D4D4D4"
alpha = 50
@@ -274,12 +274,6 @@
. = ..()
air_update_turf(1)
/obj/structure/foamedmetal/Destroy()
density = FALSE
air_update_turf(1)
return ..()
/obj/structure/foamedmetal/Move()
var/turf/T = loc
. = ..()
@@ -81,18 +81,6 @@
/datum/effect_system/trail_follow/proc/set_dir(obj/effect/particle_effect/ion_trails/I)
I.setDir(holder.dir)
/datum/effect_system/trail_follow/ion/flight
effect_type = /obj/effect/particle_effect/ion_trails/flight
fadetype = "ion_fade_flight"
nograv_required = FALSE
auto_process = FALSE
/datum/effect_system/trail_follow/ion/flight/set_dir(obj/effect/particle_effect/ion_trails/I)
if(istype(holder, /obj/item/flightpack))
var/obj/item/flightpack/F = holder
if(istype(F.wearer))
I.setDir(F.wearer.dir)
//Reagent-based explosion effect
/datum/effect_system/reagents_explosion
@@ -156,43 +156,51 @@
/datum/effect_system/smoke_spread/freezing
effect_type = /obj/effect/particle_effect/smoke/freezing
var/blast = 0
var/temperature = 2
var/weldvents = TRUE
var/distcheck = TRUE
/datum/effect_system/smoke_spread/freezing/proc/Chilled(atom/A)
if(isopenturf(A))
var/turf/open/T = A
if(T.air)
var/datum/gas_mixture/G = T.air
if(get_dist(T, location) < 2) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air
G.temperature = 2
if(!distcheck || get_dist(T, location) < blast) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air
G.temperature = temperature
T.air_update_turf()
for(var/obj/effect/hotspot/H in T)
qdel(H)
var/list/G_gases = G.gases
if(G_gases[/datum/gas/plasma])
G.assert_gas(/datum/gas/nitrogen)
G_gases[/datum/gas/nitrogen][MOLES] += (G_gases[/datum/gas/plasma][MOLES])
G_gases[/datum/gas/plasma][MOLES] = 0
G.garbage_collect()
for(var/obj/machinery/atmospherics/components/unary/U in T)
if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
U.welded = TRUE
U.update_icon()
U.visible_message("<span class='danger'>[U] was frozen shut!</span>")
var/list/G_gases = G.gases
if(G_gases[/datum/gas/plasma])
G.assert_gas(/datum/gas/nitrogen)
G_gases[/datum/gas/nitrogen][MOLES] += (G_gases[/datum/gas/plasma][MOLES])
G_gases[/datum/gas/plasma][MOLES] = 0
G.garbage_collect()
if (weldvents)
for(var/obj/machinery/atmospherics/components/unary/U in T)
if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
U.welded = TRUE
U.update_icon()
U.visible_message("<span class='danger'>[U] was frozen shut!</span>")
for(var/mob/living/L in T)
L.ExtinguishMob()
for(var/obj/item/Item in T)
Item.extinguish()
/datum/effect_system/smoke_spread/freezing/set_up(radius = 5, loca, blasting = 0)
/datum/effect_system/smoke_spread/freezing/set_up(radius = 5, loca, blast_radius = 0)
..()
blast = blasting
blast = blast_radius
/datum/effect_system/smoke_spread/freezing/start()
if(blast)
for(var/turf/T in RANGE_TURFS(2, location))
for(var/turf/T in RANGE_TURFS(blast, location))
Chilled(T)
..()
/datum/effect_system/smoke_spread/freezing/decon
temperature = 293.15
distcheck = FALSE
weldvents = FALSE
/////////////////////////////////////////////
@@ -281,17 +289,15 @@
contained = "\[[contained]\]"
var/where = "[AREACOORD(location)]"
var/whereLink = "<A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>[where]</a>"
if(carry.my_atom.fingerprintslast)
var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
var/more = ""
if(M)
more = "[ADMIN_LOOKUPFLW(M)] "
message_admins("Smoke: ([whereLink])[contained]. Key: [more ? more : carry.my_atom.fingerprintslast].")
message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. Key: [more ? more : carry.my_atom.fingerprintslast].")
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last touched by [carry.my_atom.fingerprintslast].")
else
message_admins("Smoke: ([whereLink])[contained]. No associated key.")
message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. No associated key.")
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")

Some files were not shown because too many files have changed in this diff Show More