diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index da61e4829c2..1df551e53e7 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -45,19 +45,19 @@
#define R_HOST 65535
-#define ADMIN_QUE(user) "(?)"
-#define ADMIN_FLW(user) "(FLW)"
-#define ADMIN_PP(user) "(PP)"
-#define ADMIN_VV(atom) "(VV)"
-#define ADMIN_SM(user) "(SM)"
-#define ADMIN_TP(user) "(TP)"
-#define ADMIN_BSA(user) "(BSA)"
-#define ADMIN_CENTCOM_REPLY(user) "(RPLY)"
-#define ADMIN_SYNDICATE_REPLY(user) "(RPLY)"
-#define ADMIN_SC(user) "(SC)"
-#define ADMIN_LOOKUP(user) "[key_name_admin(user)][ADMIN_QUE(user)]"
-#define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]"
-#define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)]"
+#define ADMIN_QUE(user,display) "[display]"
+#define ADMIN_FLW(user,display) "[display]"
+#define ADMIN_PP(user,display) "[display]"
+#define ADMIN_VV(atom,display) "[display]"
+#define ADMIN_SM(user,display) "[display]"
+#define ADMIN_TP(user,display) "[display]"
+#define ADMIN_BSA(user,display) "[display]"
+#define ADMIN_CENTCOM_REPLY(user,display) "[display]"
+#define ADMIN_SYNDICATE_REPLY(user,display) "[display]"
+#define ADMIN_SC(user,display) "[display]"
+#define ADMIN_LOOKUP(user) "[key_name_admin(user)]([ADMIN_QUE(user,"?")])"
+#define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")])"
+#define ADMIN_FULLMONTY(user) "[key_name_admin(user)] ([ADMIN_QUE(user,"?")]) ([ADMIN_PP(user,"PP")]) ([ADMIN_VV(user,"VV")]) ([ADMIN_SM(user,"SM")]) ([ADMIN_FLW(user,"FLW")]) ([ADMIN_TP(user,"TP")])"
#define ADMIN_JMP(src) "(JMP)"
#define COORD(src) "[src ? "([src.x],[src.y],[src.z])" : "nonexistent location"]"
#define AREACOORD(src) "[src ? "[get_area_name(src, TRUE)] [COORD(src)]" : "nonexistent location" ]"
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index b85677ff777..5ade3b0baef 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -18,8 +18,6 @@
//In most cases you want a subsystem instead
#define TIMER_LOOP 32
-#define TIMER_NO_INVOKE_WARNING 600 //number of byond ticks that are allowed to pass before the timer subsystem thinks it hung on something
-
#define TIMER_ID_NULL -1
//For servers that can't do with any additional lag, set this to none in flightpacks.dm in subsystem/processing.
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index c30b2a3ef0d..1ca1fe01036 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -444,7 +444,7 @@ This is always put in the attack log.
to_chat(user, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];")
to_chat(user, "Location = [location_description];")
to_chat(user, "[special_role_description]")
- to_chat(user, "(PM) (PP) (VV) (SM) (FLW) (CA)")
+ to_chat(user, "(PM) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) (CA)")
// Gets the first mob contained in an atom, and warns the user if there's not exactly one
/proc/get_mob_in_atom_with_warning(atom/A, mob/user = usr)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 4dd3c56d12f..6ce486bdc05 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1150,6 +1150,11 @@ var/global/list/common_tools = list(
return 1
return 0
+/proc/ispowertool(O)//used to check if a tool can force powered doors
+ if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw))
+ return TRUE
+ return FALSE
+
/proc/iswire(O)
if(istype(O, /obj/item/stack/cable_coil))
return 1
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index c6b63b77271..436970567a0 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -18,7 +18,7 @@
#define MAX_PAPER_MESSAGE_LEN 3072
#define MAX_PAPER_FIELDS 50
#define MAX_BOOK_MESSAGE_LEN 9216
-#define MAX_NAME_LEN 26
+#define MAX_NAME_LEN 50 //diona names can get loooooooong
// Version check, terminates compilation if someone is using a version of BYOND that's too old
#if DM_VERSION < 510
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 006f350873b..8ce2177751c 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -236,6 +236,8 @@
Makes the mob face the direction of the clicked thing
*/
/mob/proc/MiddleShiftClickOn(atom/A)
+ if(incapacitated())
+ return
var/face_dir = get_cardinal_dir(src, A)
if(forced_look == face_dir)
forced_look = null
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index e2539ebdf06..4bbc44c218a 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -10,7 +10,7 @@ SUBSYSTEM_DEF(timer)
flags = SS_TICKER|SS_NO_INIT
- var/list/second_queue = list() //awe, yes, you've had first queue, but what about second queue? Contains: /datum/timedevent
+ var/list/second_queue = list() //awe, yes, you've had first queue, but what about second queue?
var/list/hashes = list()
var/head_offset = 0 //world.time of the first entry in the the bucket.
@@ -38,15 +38,15 @@ SUBSYSTEM_DEF(timer)
/datum/controller/subsystem/timer/fire(resumed = FALSE)
var/lit = last_invoke_tick
- var/last_check = world.time - TIMER_NO_INVOKE_WARNING
+ var/last_check = world.time - TICKS2DS(BUCKET_LEN*1.5)
var/list/bucket_list = src.bucket_list
if(!bucket_count)
last_invoke_tick = world.time
- if(lit && lit < last_check && last_invoke_warning < last_check)
+ if(lit && lit < last_check && head_offset < last_check && last_invoke_warning < last_check)
last_invoke_warning = world.time
- var/msg = "No regular timers processed in the last [TIMER_NO_INVOKE_WARNING] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!"
+ var/msg = "No regular timers processed in the last [BUCKET_LEN*1.5] ticks[bucket_auto_reset ? ", resetting buckets" : ""]!"
message_admins(msg)
WARNING(msg)
if(bucket_auto_reset)
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index e3e50ba468f..c3095a69e08 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -24,35 +24,31 @@ Bonus
level = 5
severity = 0
-/datum/symptom/sensory_restoration/proc/check_and_add(reagent, check, add, mob/living/M)
- if(M.reagents.get_reagent_amount(reagent) < check)
- M.reagents.add_reagent(reagent, add)
- return 1
-
/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 3))
var/mob/living/M = A.affected_mob
+ var/datum/reagents/RD = M.reagents
switch(A.stage)
if(2)
- if(check_and_add("oculine", 10, 10, M))
+ if(RD.check_and_add("oculine", 10, 10))
to_chat(M, "Your hearing feels clearer and crisp.")
if(3)
- if(check_and_add("antihol", 10, 10, M))
+ if(RD.check_and_add("antihol", 10, 10))
to_chat(M, "You feel sober.")
- check_and_add("oculine", 10, 10, M)
+ RD.check_and_add("oculine", 10, 10)
if(4)
- if(check_and_add("synaphydramine", 10, 5, M))
+ if(RD.check_and_add("synaphydramine", 10, 5))
to_chat(M, "You feel focused.")
- check_and_add("antihol", 10, 10, M)
- check_and_add("oculine", 10, 10, M)
+ RD.check_and_add("antihol", 10, 10)
+ RD.check_and_add("oculine", 10, 10)
if(5)
- if(check_and_add("mannitol", 10, 10, M))
+ if(RD.check_and_add("mannitol", 10, 10))
to_chat(M, "Your mind feels relaxed.")
- check_and_add("synaphydramine", 10, 5, M)
- check_and_add("antihol", 10, 10, M)
- check_and_add("oculine", 10, 10, M)
+ RD.check_and_add("synaphydramine", 10, 5)
+ RD.check_and_add("antihol", 10, 10)
+ RD.check_and_add("oculine", 10, 10)
return
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 1a78f8be2ca..653cc0020bc 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -261,9 +261,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(istype(target,/mob/living) && message)
to_chat(target, text("[message]"))
if(sparks_spread)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread()
- sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is
- sparks.start()
+ do_sparks(sparks_amt, 0, location)
if(smoke_spread)
if(smoke_spread == 1)
var/datum/effect_system/smoke_spread/smoke = new
@@ -328,10 +326,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr)
var/list/targets = list()
-
+
switch(max_targets)
if(0) //unlimited
-
+
if(!humans_only)
for(var/mob/living/target in view_or_range(range, user, selection_type))
targets += target
@@ -344,7 +342,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
targets += user
else
var/possible_targets = list()
-
+
if(!humans_only)
for(var/mob/living/M in view_or_range(range, user, selection_type))
if(!include_user && user == M)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index ef439049611..766203f5330 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -220,7 +220,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 5
job = list("Chief Medical Officer", "Medical Doctor", "Geneticist", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist")
-/datum/uplink_item/dangerous/cat_grenade
+/datum/uplink_item/jobspecific/cat_grenade
name = "Feral Cat Delivery Grenade"
desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight."
item = /obj/item/grenade/spawnergrenade/feral_cats
@@ -960,6 +960,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
surplus = 20
+/datum/uplink_item/stealthy_tools/clownkit
+ name = "Honk Brand Infiltration Kit"
+ desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack."
+ reference = "HBIK"
+ item = /obj/item/storage/backpack/clown/syndie
+ cost = 6
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
// DEVICE AND TOOLS
/datum/uplink_item/device_tools
diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm
index d661e320dd8..b7036f9fbdc 100644
--- a/code/defines/procs/admin.dm
+++ b/code/defines/procs/admin.dm
@@ -46,7 +46,7 @@
. += "Administrator"
else
if(include_link && C)
- . += ""
+ . += ""
. += key
if(include_link)
@@ -68,8 +68,10 @@
return .
/proc/key_name_admin(whom)
- var/message = "[key_name(whom, 1)](?)[isAntag(whom) ? "(A)" : ""][isLivingSSD(whom) ? "(SSD!)" : ""] ([admin_jump_link(whom)])"
- return message
+ if(whom)
+ var/datum/whom_datum = whom //As long as it's not null, will be close enough/has the proc UID() that is all that's needed
+ var/message = "[key_name(whom, 1)]([ADMIN_QUE(whom_datum,"?")])[isAntag(whom) ? "(A)" : ""][isLivingSSD(whom) ? "(SSD!)" : ""] ([admin_jump_link(whom)])"
+ return message
/proc/key_name_mentor(whom)
// Same as key_name_admin, but does not include (?) or (A) for antags.
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index fa6a1a93405..9993388afec 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -52,7 +52,8 @@
IO.rejuvenate()
IO.trace_chemicals.Cut()
H.remove_all_embedded_objects()
- user.updatehealth()
+ user.status_flags &= ~(FAKEDEATH)
+ user.updatehealth("revive sting")
user.update_blind_effects()
user.update_blurry_effects()
@@ -60,7 +61,6 @@
user.regenerate_icons()
- user.status_flags &= ~(FAKEDEATH)
user.update_revive() //Handle waking up the changeling after the regenerative stasis has completed.
user.mind.changeling.purchasedpowers -= src
user.med_hud_set_status()
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 2a1d9166370..8bd5fc3cc4f 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -34,6 +34,6 @@
if(iscultist(M))
to_chat(M, my_message)
else if(M in GLOB.dead_mob_list)
- to_chat(M, " (F) [my_message] ")
+ to_chat(M, " (F) [my_message] ")
- log_say("(CULT) [message]", user)
\ No newline at end of file
+ log_say("(CULT) [message]", user)
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 8cde8a9d3d1..05a29a5f3f4 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -561,9 +561,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/restraints/handcuffs/energy/used/dropped(mob/user)
user.visible_message("[user]'s [src] break in a discharge of energy!", \
"[user]'s [src] break in a discharge of energy!")
- var/datum/effect_system/spark_spread/S = new
- S.set_up(4,0,user.loc)
- S.start()
+ do_sparks(4, 0, user.loc)
. = ..()
/obj/item/abductor_baton/examine(mob/user)
@@ -736,6 +734,8 @@ Congratulations! You are now trained for invasive xenobiology research!"}
icon_state = "bed"
no_icon_updates = 1 //no icon updates for this; it's static.
injected_reagents = list("corazone","spaceacillin")
+ reagent_target_amount = 31 //the patient needs at least 30u of spaceacillin to prevent necrotization.
+ inject_amount = 10
/obj/structure/closet/abductor
name = "alien locker"
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
index ce30708a76f..f7ff2864608 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
@@ -46,7 +46,5 @@
duration = 80
/obj/effect/temp_visual/teleport_abductor/New()
- var/datum/effect_system/spark_spread/S = new
- S.set_up(10,0,loc)
- S.start()
+ do_sparks(10, 0, loc)
..()
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index 5543a54caa6..6cdfdc736d9 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -91,6 +91,7 @@
)
var/talk_inside_host = FALSE // So that borers don't accidentally give themselves away on a botched message
var/used_dominate
+ var/attempting_to_dominate = FALSE // To prevent people from spam opening the Dominate Victim input
var/chemicals = 10 // Chemicals used for reproduction and chemical injection.
var/max_chems = 250
var/mob/living/carbon/human/host // Human host for the brain worm.
@@ -325,6 +326,9 @@
to_chat(src, "You cannot infest someone who is already infested!")
return
+ if(incapacitated())
+ return
+
to_chat(src, "You slither up [M] and begin probing at [M.p_their()] ear canal...")
if(!do_after(src, 50, target = M))
@@ -471,7 +475,7 @@
set category = "Borer"
set name = "Dominate Victim"
set desc = "Freeze the limbs of a potential host with supernatural fear."
-
+
if(world.time - used_dominate < 150)
to_chat(src, "You cannot use that ability again so soon.")
return
@@ -483,23 +487,43 @@
if(stat)
to_chat(src, "You cannot do that in your current state.")
return
-
+
+ if(attempting_to_dominate)
+ to_chat(src, "You're already targeting someone!")
+ return
+
var/list/choices = list()
for(var/mob/living/carbon/C in view(3,src))
if(C.stat != DEAD)
choices += C
-
+
if(world.time - used_dominate < 300)
to_chat(src, "You cannot use that ability again so soon.")
return
-
+
+ attempting_to_dominate = TRUE
+
var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
- if(!M || !src)
+ if(!M)
+ attempting_to_dominate = FALSE
+ return
+
+ if(!src) //different statement to avoid a runtime since if the source is deleted then attempting_to_dominate would also be deleted
return
if(M.has_brain_worms())
to_chat(src, "You cannot dominate someone who is already infested!")
+ attempting_to_dominate = FALSE
+ return
+
+ if(incapacitated())
+ attempting_to_dominate = FALSE
+ return
+
+ if(get_dist(src, M) > 7) //to avoid people remotely doing from across the map etc, 7 is the default view range
+ to_chat(src, "You're too far away!")
+ attempting_to_dominate = FALSE
return
to_chat(src, "You focus your psychic lance on [M] and freeze [M.p_their()] limbs with a wave of terrible dread.")
@@ -507,6 +531,7 @@
M.Weaken(3)
used_dominate = world.time
+ attempting_to_dominate = FALSE
/mob/living/simple_animal/borer/verb/release_host()
set category = "Borer"
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index d75a1bd6d52..afae458a58d 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -102,7 +102,7 @@
if(istype(M, /mob/living/simple_animal/revenant))
to_chat(M, rendered)
if(isobserver(M))
- to_chat(M, "(F) [rendered]")
+ to_chat(M, "(F) [rendered]")
return
/mob/living/simple_animal/revenant/Stat()
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 5a7825c0cfe..c201b1bc45d 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -209,9 +209,7 @@
if(!L.on)
return
L.visible_message("\The [L] suddenly flares brightly and begins to spark!")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread/
- s.set_up(4, 0, L)
- s.start()
+ do_sparks(4, 0, L)
new/obj/effect/temp_visual/revenant(L.loc)
sleep(20)
if(!L.on) //wait, wait, don't shock me
@@ -222,9 +220,7 @@
return
M.Beam(L,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5)
M.electrocute_act(shock_damage, "[L.name]", safety=1)
- var/datum/effect_system/spark_spread/z = new /datum/effect_system/spark_spread/
- z.set_up(4, 0, M)
- z.start()
+ do_sparks(4, 0, M)
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
//Defile: Corrupts nearby stuff, unblesses floor tiles.
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 257126e8586..11baf813890 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -267,7 +267,7 @@
if(beingborged)
to_chat(rev_mind.current, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing[remove_head ? "." : " but the name of the one who flashed you."]")
- message_admins("[key_name_admin(rev_mind.current)] ? (FLW) has been borged while being a [remove_head ? "leader" : " member"] of the revolution.")
+ message_admins("[key_name_admin(rev_mind.current)] [ADMIN_QUE(rev_mind.current,"?")] ([ADMIN_FLW(rev_mind.current,"FLW")]) has been borged while being a [remove_head ? "leader" : " member"] of the revolution.")
else
rev_mind.current.Paralyse(5)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 63e37911224..d2c3cc2c72e 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -540,9 +540,7 @@
to_chat(S, "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#")
S << 'sound/misc/interference.ogg'
playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
- var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread
- sp.set_up(5, 1, S)
- sp.start()
+ do_sparks(5, 1, S)
S.Weaken(6)
for(var/obj/structure/window/W in T.contents)
W.take_damage(rand(80, 100))
diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm
index 260f809334c..c6992f99b98 100644
--- a/code/game/gamemodes/wizard/godhand.dm
+++ b/code/game/gamemodes/wizard/godhand.dm
@@ -48,9 +48,7 @@
if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad
return
var/mob/M = target
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(4, 0, M.loc) //no idea what the 0 is
- sparks.start()
+ do_sparks(4, 0, M.loc) //no idea what the 0 is
M.gib()
..()
@@ -84,9 +82,7 @@
/obj/item/melee/touch_attack/fake_disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //not exploding after touching yourself would be bad
return
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(4, 0, target.loc) //no idea what the 0 is
- sparks.start()
+ do_sparks(4, 0, target.loc)
playsound(target.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
..()
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 70afe02762a..2ee1e93683d 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -15,6 +15,8 @@
buckle_lying = 90
var/no_icon_updates = 0 //set this to 1 if you don't want the icons ever changing
var/list/injected_reagents = list()
+ var/reagent_target_amount = 1
+ var/inject_amount = 1
/obj/machinery/optable/New()
..()
@@ -106,9 +108,9 @@
check_victim()
if(LAZYLEN(injected_reagents))
for(var/mob/living/carbon/C in get_turf(src))
+ var/datum/reagents/R = C.reagents
for(var/chemical in injected_reagents)
- if(C.reagents.get_reagent_amount(chemical) < 1)
- C.reagents.add_reagent(chemical, 1)
+ R.check_and_add(chemical,reagent_target_amount,inject_amount)
/obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user as mob)
if(C == user)
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 5d5e6bd9511..604ac3f02f3 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -217,9 +217,7 @@
for(var/turf/T in linkedholodeck)
if(prob(30))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, T)
- s.start()
+ do_sparks(2, 1, T)
T.ex_act(3)
T.hotspot_expose(1000,500,1)
@@ -257,9 +255,7 @@
if(L.name=="Atmospheric Test Start")
spawn(20)
var/turf/T = get_turf(L)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, T)
- s.start()
+ do_sparks(2, 1, T)
if(T)
T.temperature = 5000
T.hotspot_expose(50000,50000,1)*/
@@ -306,9 +302,7 @@
/* if(L.name=="Atmospheric Test Start")
spawn(20)
var/turf/T = get_turf(L)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, T)
- s.start()
+ do_sparks(2, 1, T)
if(T)
T.temperature = 5000
T.hotspot_expose(50000,50000,1)*/
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 4f2d3801526..9d7310c1c66 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -502,11 +502,11 @@
if(SSshuttle.cancelEvac(user))
log_game("[key_name(user)] has recalled the shuttle.")
- message_admins("[key_name_admin(user)] has recalled the shuttle - [ADMIN_FLW(user)].", 1)
+ message_admins("[key_name_admin(user)] has recalled the shuttle - ([ADMIN_FLW(user,"FLW")]).", 1)
else
to_chat(user, "Central Command has refused the recall request!")
log_game("[key_name(user)] has tried and failed to recall the shuttle.")
- message_admins("[key_name_admin(user)] has tried and failed to recall the shuttle - [ADMIN_FLW(user)].", 1)
+ message_admins("[key_name_admin(user)] has tried and failed to recall the shuttle - ([ADMIN_FLW(user,"FLW")]).", 1)
/proc/post_status(command, data1, data2, mob/user = null)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index bcbe7a07e5d..87d35c2d7b4 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -14,8 +14,6 @@
circuit = /obj/item/circuitboard/message_monitor
//Server linked to.
var/obj/machinery/message_server/linkedServer = null
- //Sparks effect - For emag
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
//Messages - Saves me time if I want to change something.
var/noserver = "ALERT: No server detected."
var/incorrectkey = "ALERT: Incorrect decryption key!"
@@ -56,8 +54,7 @@
icon_screen = hack_icon // An error screen I made in the computers.dmi
emag = 1
screen = 2
- spark_system.set_up(5, 0, src)
- src.spark_system.start()
+ do_sparks(5, 0, src)
var/obj/item/paper/monitorkey/MK = new/obj/item/paper/monitorkey
MK.loc = src.loc
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 90ce57e880f..c6755d1dbdd 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -1,5 +1,6 @@
/obj/machinery/atmospherics/unary/cryo_cell
name = "cryo cell"
+ desc = "Lowers the body temperature so certain medications may take effect."
icon = 'icons/obj/cryogenics.dmi'
icon_state = "pod0"
density = 1
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index af63a92e2ff..b6a02aacfd0 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -149,9 +149,7 @@
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
visible_message("The console sparks, and some items fall out!")
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(5, 1, src)
- sparks.start()
+ do_sparks(5, 1, src)
for(var/obj/item/I in objective_items)
dispense_item(I)
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index c3d25d3cdb9..e0fb65787cd 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -188,9 +188,7 @@ for reference:
to_chat(user, "Barrier lock toggled off.")
return
else
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
+ do_sparks(2, 1, src)
visible_message("BZZzZZzZZzZT")
return
return
@@ -223,16 +221,12 @@ for reference:
emagged = 1
req_access = null
to_chat(user, "You break the ID authentication lock on the [src].")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
+ do_sparks(2, 1, src)
visible_message("BZZzZZzZZzZT")
else if(src.emagged == 1)
src.emagged = 2
to_chat(user, "You short out the anchoring mechanism on the [src].")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
+ do_sparks(2, 1, src)
visible_message("BZZzZZzZZzZT")
/obj/machinery/deployable/barrier/ex_act(severity)
@@ -275,9 +269,7 @@ for reference:
/* var/obj/item/stack/rods/ =*/
new /obj/item/stack/rods(Tsec)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, 1, src)
explosion(src.loc,-1,-1,0)
if(src)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 0fd3d27d3d4..8d9b17ef7c2 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -627,9 +627,7 @@ About the new airlock wires panel:
if(isElectrified() && density && istype(mover, /obj/item))
var/obj/item/I = mover
if(I.flags & CONDUCT)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
return ..()
/obj/machinery/door/airlock/attack_hand(mob/user)
@@ -1024,7 +1022,7 @@ About the new airlock wires panel:
else if(locked)
to_chat(user, "The airlock's bolts prevent it from being forced!")
else if(!welded && !operating)
- if(!beingcrowbarred) //being fireaxe'd
+ if(istype(I, /obj/item/twohanded/fireaxe)) //let's make this more specific
var/obj/item/twohanded/fireaxe/F = I
if(F.wielded)
spawn(0)
@@ -1041,7 +1039,7 @@ About the new airlock wires panel:
else
close(1)
- if(istype(I, /obj/item/crowbar/power))
+ if(ispowertool(I)) //jaws of life and rescue claw
if(isElectrified())
shock(user, 100)//it's like sticking a forck in a power socket
return
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 706b1a82ce0..6f838319040 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -76,8 +76,7 @@
if(autoclose_timer)
deltimer(autoclose_timer)
autoclose_timer = 0
- if(spark_system)
- QDEL_NULL(spark_system)
+ QDEL_NULL(spark_system)
return ..()
/obj/machinery/door/Bumped(atom/AM)
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index 013be887cce..e9836eb0ca6 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -15,7 +15,7 @@
/obj/machinery/floodlight/Initialize()
. = ..()
- src.cell = new(src)
+ cell = new(src)
mapVarInit()
/obj/machinery/floodlight/Destroy()
@@ -26,13 +26,18 @@
icon_state = "flood[open ? "o" : ""][open && cell ? "b" : ""]0[on]"
/obj/machinery/floodlight/process()
+ if(!cell && on)
+ on = FALSE
+ visible_message("[src] shuts down due to lack of power!")
+ update_icon()
+ set_light(0)
if(on)
cell.charge -= use
if(cell.charge <= 0)
on = FALSE
updateicon()
set_light(0)
- src.visible_message("[src] shuts down due to lack of power!")
+ visible_message("[src] shuts down due to lack of power!")
/obj/machinery/floodlight/attack_ai()
return
@@ -48,8 +53,12 @@
cell.add_fingerprint(user)
cell.update_icon()
- src.cell = null
+ cell = null
to_chat(user, "You remove the power cell.")
+ if(on)
+ on = FALSE
+ visible_message("[src] shuts down due to lack of power!")
+ set_light(0)
updateicon()
return
@@ -80,14 +89,14 @@
/obj/machinery/floodlight/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, W.usesound, 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters.", \
"You hear ratchet.")
anchored = TRUE
else if(anchored)
- playsound(src.loc, W.usesound, 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters.", \
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 87ec7974711..3c36edb1685 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -101,9 +101,7 @@
flick("[base_state]-spark", src)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
+ do_sparks(2, 1, src)
src.last_spark = world.time
use_power(1000)
var/turf/location = src.loc
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 1d33a1ae795..05eaae1a9d9 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -587,9 +587,7 @@ Class Procs:
return 0
if((TK in user.mutations) && !Adjacent(user))
return 0
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
if(electrocute_mob(user, get_area(src), src, 0.7))
if(user.stunned)
return 1
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 491cb93018e..a712e033afd 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -241,8 +241,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
data["censored"] = viewing_channel.censored
var/list/messages = list()
data["messages"] = messages
+ var/message_number = 0
for(var/datum/feed_message/M in viewing_channel.messages)
- messages[++messages.len] = list("title" = M.title, "body" = M.body, "img" = M.img ? icon2base64(M.img) : null, "message_type" = M.message_type, "author" = M.author, "view_count" = M.view_count)
+ if(M.img)
+ user << browse_rsc(M.img, "tmp_photo[message_number].png")
+ messages[++messages.len] = list("title" = M.title, "body" = M.body, "img" = M.img ? M.img : null, "message_type" = M.message_type, "author" = M.author, "view_count" = M.view_count, "message_number" = message_number)
+ message_number += 1
if(8, 9)
data["channel_name"] = viewing_channel.channel_name
data["ref"] = "\ref[viewing_channel]"
@@ -273,7 +277,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
data["author"] = news_network.wanted_issue.backup_author
data["criminal"] = news_network.wanted_issue.author
data["description"] = news_network.wanted_issue.body
- data["photo"] = news_network.wanted_issue.img ? icon2base64(news_network.wanted_issue.img) : 0
+ if(news_network.wanted_issue.img)
+ user << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
+ data["photo"] = news_network.wanted_issue.img ? news_network.wanted_issue.img : 0
if(12)
var/list/jobs = list()
data["jobs"] = jobs
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index b58e9d12c84..e5a43c523f5 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -94,9 +94,7 @@
doteleport(user)
/obj/machinery/quantumpad/proc/sparks()
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, get_turf(src))
- s.start()
+ do_sparks(5, 1, get_turf(src))
/obj/machinery/quantumpad/attack_ghost(mob/dead/observer/ghost)
if(linked_pad)
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index a8e854467a2..9dc6c8e6f11 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -519,3 +519,50 @@
for(var/reagent in processed_reagents)
reagents.add_reagent(reagent,amount)
chassis.use_power(energy_drain)
+
+/obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw
+ name = "rescue jaw"
+ desc = "Emergency rescue jaws, designed to help first responders reach their patients. Opens doors and removes obstacles."
+ icon_state = "mecha_clamp" //can work, might use a blue resprite later but I think it works for now
+ origin_tech = "materials=2;engineering=2" //kind of sad, but identical to jaws of life
+ equip_cooldown = 15
+ energy_drain = 10
+ var/dam_force = 20
+
+
+/obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw/action(atom/target)
+ if(!action_checks(target))
+ return
+ if(istype(target, /obj))
+ if(!istype(target, /obj/machinery/door))//early return if we're not trying to open a door
+ return
+ var/obj/machinery/door/D = target //the door we want to open
+ D.try_to_crowbar(src, chassis.occupant)//use the door's crowbar function
+ if(isliving(target)) //interact with living beings
+ var/mob/living/M = target
+ if(chassis.occupant.a_intent == INTENT_HARM)//the patented, medical rescue claw is incapable of doing harm. Worry not.
+ target.visible_message("[chassis] gently boops [target] on the nose, its hydraulics hissing as safety overrides slow a brutal punch down at the last second.", \
+ "")
+ else
+ push_aside(chassis, M)//out of the way, I have people to save!
+ occupant_message("You gently push [target] out of the way.")
+ chassis.visible_message("[chassis] gently pushes [target] out of the way.")
+
+/obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw/proc/push_aside(obj/mecha/M, mob/living/L)
+ switch(get_dir(M, L))
+ if(NORTH, SOUTH)
+ if(prob(50))
+ step(L, WEST)
+ else
+ step(L, EAST)
+ if(WEST, EAST)
+ if(prob(50))
+ step(L, NORTH)
+ else
+ step(L, SOUTH)
+
+/obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw/can_attach(obj/mecha/M)
+ if(istype(M, /obj/mecha/medical) || istype(M, /obj/mecha/working/ripley/firefighter)) //Odys or firefighters
+ if(M.equipment.len < M.max_equip)
+ return TRUE
+ return FALSE
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index 501b41be4cb..a42e76015c1 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -69,7 +69,7 @@
P.failchance = 0
P.icon_state = "anom"
P.name = "wormhole"
- message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](?) (FLW) used a Wormhole Generator in ([loc.x],[loc.y],[loc.z] - JMP)",0,1)
+ message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)]([ADMIN_QUE(chassis.occupant,"?")]) ([ADMIN_FLW(chassis.occupant,"FLW")]) used a Wormhole Generator in ([loc.x],[loc.y],[loc.z] - JMP)",0,1)
log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([loc.x],[loc.y],[loc.z])")
src = null
spawn(rand(150,300))
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index b63bb4fc40c..d119469d55a 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -63,8 +63,8 @@
start_cooldown()
else
step_away(M,chassis)
- occupant_message("You push [target] out of the way.")
- chassis.visible_message("[chassis] pushes [target] out of the way.")
+ occupant_message("You push [target] out of the way.")
+ chassis.visible_message("[chassis] pushes [target] out of the way.")
return 1
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 41f60361831..d4650aa1bbb 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -41,7 +41,7 @@
var/datum/effect_system/spark_spread/spark_system = new
var/lights = 0
var/lights_power = 6
- var/emagged = 0
+ var/emagged = FALSE
//inner atmos
var/use_internal_tank = 0
@@ -851,14 +851,8 @@
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
-/obj/mecha/emag_act(user as mob)
- if(istype(src, /obj/mecha/working/ripley) && emagged == 0)
- emagged = 1
- to_chat(usr, "You slide the card through the [src]'s ID slot.")
- playsound(loc, "sparks", 100, 1)
- desc += "The mech's equipment slots spark dangerously!"
- else
- to_chat(usr, "The [src]'s ID slot rejects the card.")
+/obj/mecha/emag_act(mob/user)
+ to_chat(user, "[src]'s ID slot rejects the card.")
return
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index 333c05fdd5d..d0fcb0f99be 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -42,5 +42,4 @@
A.remove_hud_from(H)
builtin_hud_user = 0
- . = ..()
-
+ . = ..()
\ No newline at end of file
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index d29bf2ae460..407c9cd63dc 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -180,4 +180,13 @@
else
step_in = 5
for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment)
- drill.equip_cooldown = initial(drill.equip_cooldown)
\ No newline at end of file
+ drill.equip_cooldown = initial(drill.equip_cooldown)
+
+/obj/mecha/working/ripley/emag_act(mob/user)
+ if(!emagged)
+ emagged = TRUE
+ to_chat(user, "You slide the card through [src]'s ID slot.")
+ playsound(loc, "sparks", 100, 1)
+ desc += "The mech's equipment slots spark dangerously!"
+ else
+ to_chat(user, "[src]'s ID slot rejects the card.")
diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm
index 16a9bf5a711..1c8ad706dc8 100644
--- a/code/game/objects/effects/decals/Cleanable/robots.dm
+++ b/code/game/objects/effects/decals/Cleanable/robots.dm
@@ -29,9 +29,7 @@
var/obj/effect/decal/cleanable/blood/oil/streak = new(src.loc)
streak.update_icon()
else if(prob(10))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, 1, src)
if(step_to(src, get_step(src, direction), 0))
break
diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm
index b97b149991b..77a51b4d975 100644
--- a/code/game/objects/effects/decals/remains.dm
+++ b/code/game/objects/effects/decals/remains.dm
@@ -22,12 +22,6 @@
icon_state = "remainsrobot"
anchored = TRUE
-/obj/effect/decal/remains/robot/New()
- ..()
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
-
/obj/effect/decal/remains/slime
name = "You shouldn't see this"
desc = "Noooooooooooooooooooooo"
diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index d71e7631565..1231c8136fa 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -8,8 +8,9 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/particle_effect
name = "particle effect"
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- unacidable = 1//So effects are not targeted by alien acid.
+ unacidable = TRUE //So effects are not targeted by alien acid.
pass_flags = PASSTABLE | PASSGRILLE
+ anchored = TRUE
/obj/effect/particle_effect/New()
..()
@@ -28,6 +29,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
var/atom/holder
var/effect_type
var/total_effects = 0
+ var/autocleanup = FALSE //will delete itself after use
/datum/effect_system/Destroy()
holder = null
@@ -71,3 +73,5 @@ would spawn and follow the beaker, even if it is carried or thrown.
/datum/effect_system/proc/decrement_total_effect()
total_effects--
+ if(autocleanup && total_effects <= 0)
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm
index ef9ed8ac11a..194a37c860f 100644
--- a/code/game/objects/effects/effect_system/effects_other.dm
+++ b/code/game/objects/effects/effect_system/effects_other.dm
@@ -155,9 +155,7 @@
/datum/effect_system/reagents_explosion/start()
if(amount <= 2)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, location)
- s.start()
+ do_sparks(2, 1, location)
for(var/mob/M in viewers(5, location))
to_chat(M, "The solution violently explodes.")
diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm
index 77925b3170a..f59f44ca1db 100644
--- a/code/game/objects/effects/effect_system/effects_sparks.dm
+++ b/code/game/objects/effects/effect_system/effects_sparks.dm
@@ -5,15 +5,26 @@
// will always spawn at the items location.
/////////////////////////////////////////////
+/proc/do_sparks(n, c, source)
+ // n - number of sparks
+ // c - cardinals, bool, do the sparks only move in cardinal directions?
+ // source - source of the sparks.
+
+ var/datum/effect_system/spark_spread/sparks = new
+ sparks.set_up(n, c, source)
+ sparks.autocleanup = TRUE
+ sparks.start()
+
/obj/effect/particle_effect/sparks
name = "sparks"
desc = "it's a spark what do you need to know?"
icon_state = "sparks"
- anchored = 1
+ anchored = TRUE
var/hotspottemp = 1000
/obj/effect/particle_effect/sparks/New()
..()
+ flick("sparks", src) // replay the animation
playsound(loc, "sparks", 100, 1)
var/turf/T = loc
if(isturf(T))
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index a5cd1b8b6b1..9248134b0a7 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -30,9 +30,7 @@
var/obj/effect/decal/cleanable/blood/gibs/gib = null
if(sparks)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, location)
- s.start()
+ do_sparks(2, 1, location)
for(var/i = 1, i<= gibtypes.len, i++)
if(gibamounts[i])
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 8323641c899..1b619faa41b 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -25,9 +25,7 @@
if(triggered)
return
visible_message("[victim] sets off [bicon(src)] [src]!")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, 1, src)
mineEffect(victim)
triggered = 1
qdel(src)
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index e190988392d..793d7265c27 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -57,9 +57,7 @@
/obj/effect/portal/proc/invalid_teleport()
visible_message("[src] flickers and fails due to bluespace interference!")
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, loc)
- spark_system.start()
+ do_sparks(5, 0, loc)
qdel(src)
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index b587c650c4c..7a25f4ece1b 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -67,10 +67,7 @@
/obj/item/chameleon/proc/disrupt(var/delete_dummy = 1)
if(active_dummy)
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
- spark_system.start()
+ do_sparks(5, 0, src)
eject_all()
if(delete_dummy)
qdel(active_dummy)
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 175ca0886ad..8b53e3d8ed7 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -35,7 +35,7 @@
return
if(H.mind)
span = H.mind.speech_span
- if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice))
+ if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice) || istype(H.get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown))
span = "sans"
if(spamcheck)
to_chat(user, "\The [src] needs to recharge!")
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 9aa30053983..71fc397a2c4 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -87,9 +87,7 @@
if(M)
M.moved_recently = 0
to_chat(M, "You feel a sharp shock!")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, M)
- s.start()
+ do_sparks(3, 1, M)
M.Weaken(5)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 4064bf63adb..017dade9ac4 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -166,7 +166,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \
/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/W, mob/user, params)
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma sheets ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
+ message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - JMP)",0,1)
log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])")
investigate_log("was ignited by [key_name(user)]","atmos")
fire_act()
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index bd06be3282b..3c33d8f66a0 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -54,7 +54,7 @@
to_chat(user, "There are [amount] [singular_name]\s in the stack.")
else
to_chat(user, "There are [amount] [name]\s in the stack.")
- to_chat(user,"Alt-click to take a custom amount.")
+ to_chat(user,"Ctrl-Shift-click to take a custom amount.")
/obj/item/stack/proc/add(newamount)
amount += newamount
@@ -269,7 +269,7 @@
else
..()
-/obj/item/stack/AltClick(mob/living/user)
+/obj/item/stack/CtrlShiftClick(mob/living/user)
if(!istype(user) || user.incapacitated())
to_chat(user, "You can't do that right now!")
return
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index c1b88897bfd..e672ff14b10 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -250,9 +250,7 @@
/obj/item/toy/snappop/virus/throw_impact(atom/hit_atom)
..()
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, 1, src)
new /obj/effect/decal/cleanable/ash(src.loc)
visible_message("The [name] explodes!","You hear a bang!")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
@@ -270,9 +268,7 @@
var/ash_type = /obj/effect/decal/cleanable/ash
/obj/item/toy/snappop/proc/pop_burst(var/n=3, var/c=1)
- var/datum/effect_system/spark_spread/s = new()
- s.set_up(n, c, src)
- s.start()
+ do_sparks(n, c, src)
new ash_type(loc)
visible_message("[src] explodes!",
"You hear a snap!")
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index daaa5c3e4c4..38051dde621 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -774,9 +774,9 @@
// Decals
/obj/item/id_decal
name = "identification card decal"
- desc = "A modification kit to make your ID cards look snazzy.."
- icon = 'icons/obj/device.dmi'
- icon_state = "batterer"
+ desc = "A nano-cellophane wrap that molds to an ID card to make it look snazzy."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "id_decal"
var/decal_name = "identification card"
var/decal_desc = "A card used to provide ID and determine access across the station."
var/decal_icon_state = "id"
@@ -784,30 +784,40 @@
var/override_name = 0
/obj/item/id_decal/gold
- name = "gold ID card card decal"
+ name = "gold ID card decal"
+ icon_state = "id_decal_gold"
+ desc = "Make your ID look like the Captain's or a self-centered HOP's. Applies to any ID."
decal_desc = "A golden card which shows power and might."
decal_icon_state = "gold"
decal_item_state = "gold_id"
/obj/item/id_decal/silver
name = "silver ID card decal"
+ icon_state = "id_decal_silver"
+ desc = "Make your ID look like HOP's because they wouldn't change it officially. Applies to any ID."
decal_desc = "A silver card which shows honour and dedication."
decal_icon_state = "silver"
decal_item_state = "silver_id"
/obj/item/id_decal/prisoner
name = "prisoner ID card decal"
+ icon_state = "id_decal_prisoner"
+ desc = "All the cool kids have an ID that's this color. Applies to any ID."
decal_desc = "You are a number, you are not a free man."
decal_icon_state = "prisoner"
decal_item_state = "orange-id"
/obj/item/id_decal/centcom
name = "centcom ID card decal"
+ icon_state = "id_decal_centcom"
+ desc = "All the prestige without the responsibility or the access. Applies to any ID."
decal_desc = "An ID straight from Cent. Com."
decal_icon_state = "centcom"
/obj/item/id_decal/emag
name = "cryptographic sequencer ID card decal"
+ icon_state = "id_decal_emag"
+ desc = "A bundle of wires that you can tape to your ID to look very suspect. Applies to any ID."
decal_name = "cryptographic sequencer"
decal_desc = "It's a card with a magnetic strip attached to some circuitry."
decal_icon_state = "emag"
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 26639543426..34877ac8788 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -79,7 +79,7 @@
src.target = AM
loc = null
- message_admins("[key_name_admin(user)](?) (FLW) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [det_time] second fuse",0,1)
+ message_admins("[key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [det_time] second fuse",0,1)
log_game("[key_name(user)] planted [name] on [target.name] at ([target.x],[target.y],[target.z]) with [det_time] second fuse")
target.overlays += image_overlay
@@ -88,7 +88,7 @@
addtimer(CALLBACK(src, .proc/prime), det_time*10)
/obj/item/grenade/plastic/suicide_act(mob/user)
- message_admins("[key_name_admin(user)](?) (FLW) suicided with [src.name] at ([user.x],[user.y],[user.z] - JMP)",0,1)
+ message_admins("[key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) suicided with [src.name] at ([user.x],[user.y],[user.z] - JMP)",0,1)
log_game("[key_name(user)] suicided with [name] at ([user.x],[user.y],[user.z])")
user.visible_message("[user] activates the [name] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!")
var/message_say = "FOR NO RAISIN!"
diff --git a/code/game/objects/items/weapons/fireworks.dm b/code/game/objects/items/weapons/fireworks.dm
index 138cb24ff40..d2e523cf953 100644
--- a/code/game/objects/items/weapons/fireworks.dm
+++ b/code/game/objects/items/weapons/fireworks.dm
@@ -25,7 +25,7 @@ obj/item/sparkler
icon = 'icons/obj/fireworks.dmi'
icon_state = "sparkler_0"
var/litzor = 0
- var/datum/effect_system/spark_spread/S
+
obj/item/sparkler/attackby(obj/item/W,mob/user, params)
if(litzor)
return
@@ -36,11 +36,7 @@ obj/item/sparkler/attackby(obj/item/W,mob/user, params)
icon_state = "sparkler_1"
var/b = rand(5,9)
for(var/xy, xy<=b, xy++)
- S = new()
- S.set_up(1,0,src.loc)
- if(ismob(src.loc) || isobj(src.loc))
- S.attach(src.loc)
- S.start()
+ do_sparks(1, 0, loc)
sleep(10)
qdel(src)
/obj/crate/fireworks
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 3de4fc4cf8d..8419f0b7537 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -289,7 +289,7 @@
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
- message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) ([admin_jump_link(M)]) and last touched by [key_name_admin(last)](?) ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP). [contained]")
+ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([admin_jump_link(M)]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP). [contained]")
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z]) [contained]")
update_mob()
@@ -419,7 +419,7 @@
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
- message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).")
+ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([ADMIN_FLW(M,"FLW")]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([ADMIN_FLW(last,"FLW")]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).")
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
else
addtimer(CALLBACK(src, .proc/prime), det_time)
diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm
index c705374f7a9..3391687f20a 100644
--- a/code/game/objects/items/weapons/legcuffs.dm
+++ b/code/game/objects/items/weapons/legcuffs.dm
@@ -136,9 +136,7 @@
/obj/item/restraints/legcuffs/beartrap/energy/proc/dissipate()
if(!ismob(loc))
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
+ do_sparks(1, 1, src)
qdel(src)
/obj/item/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 2dcbef5b1a5..8ad283a77da 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -215,16 +215,8 @@
throw_speed = 3
throw_range = 1
w_class = WEIGHT_CLASS_BULKY //So you can't hide it in your pocket or some such.
- var/datum/effect_system/spark_spread/spark_system
sharp = 1
-//Most of the other special functions are handled in their own files. aka special snowflake code so kewl
-/obj/item/melee/energy/blade/New()
- ..()
- spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
-
/obj/item/melee/energy/blade/attack_self(mob/user)
return
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 5395f2e8395..6d45e5b7add 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -89,6 +89,24 @@
icon_state = "clownpack"
item_state = "clownpack"
+/obj/item/storage/backpack/clown/syndie
+
+/obj/item/storage/backpack/clown/syndie/New()
+ ..()
+ new /obj/item/clothing/under/rank/clown(src)
+ new /obj/item/clothing/shoes/magboots/clown(src)
+ new /obj/item/clothing/mask/gas/voice/clown(src)
+ new /obj/item/radio/headset/headset_service(src)
+ new /obj/item/pda/clown(src)
+ new /obj/item/reagent_containers/food/snacks/grown/banana(src)
+ new /obj/item/stamp/clown(src)
+ new /obj/item/toy/crayon/rainbow(src)
+ new /obj/item/storage/fancy/crayons(src)
+ new /obj/item/reagent_containers/spray/waterflower(src)
+ new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src)
+ new /obj/item/instrument/bikehorn(src)
+ new /obj/item/bikehorn(src)
+
/obj/item/storage/backpack/mime
name = "Parcel Parceaux"
desc = "A silent backpack made for those silent workers. Silence Co."
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index bb78ba208ec..0a256136d2e 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -74,9 +74,7 @@
overlays += image('icons/obj/storage.dmi', icon_locking)
locked = 0
if(istype(weapon, /obj/item/melee/energy/blade))
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, src.loc)
- spark_system.start()
+ do_sparks(5, 0, loc)
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(loc, "sparks", 50, 1)
to_chat(user, "You slice through the lock on [src].")
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 4defb3b4aae..be803058ea7 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -100,6 +100,8 @@
return L
/obj/item/storage/proc/show_to(mob/user as mob)
+ if(!user.client)
+ return
if(user.s_active != src)
for(var/obj/item/I in src)
if(I.on_found(user))
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 56bf5538b02..b9d383b9308 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -139,12 +139,15 @@
/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user)
+ if(!ismob(L)) //because this was being called on turfs for some reason
+ return
+
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/Genhit.ogg', 50, 1)
return
-
+
L.Stun(stunforce)
L.Weaken(stunforce)
L.apply_effect(STUTTER, stunforce)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 08a6a3e168c..b30d932eed2 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -120,7 +120,7 @@
name = "screwdriver"
desc = "You can be totally screwy with this."
icon = 'icons/obj/tools.dmi'
- icon_state = null
+ icon_state = "screwdriver_map"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5
@@ -133,6 +133,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
usesound = 'sound/items/Screwdriver.ogg'
toolspeed = 1
+ var/random_color = TRUE //if the screwdriver uses random coloring
/obj/item/screwdriver/nuke
name = "screwdriver"
@@ -146,7 +147,7 @@
/obj/item/screwdriver/New(loc, var/param_color = null)
..()
- if(!icon_state)
+ if(random_color)
if(!param_color)
param_color = pick("red","blue","pink","brown","green","cyan","yellow")
icon_state = "screwdriver_[param_color]"
@@ -168,6 +169,7 @@
desc = "A screwdriver made of brass. The handle feels freezing cold."
icon_state = "screwdriver_brass"
toolspeed = 0.5
+ random_color = FALSE
/obj/item/screwdriver/abductor
name = "alien screwdriver"
@@ -176,6 +178,7 @@
icon_state = "screwdriver"
usesound = 'sound/items/PSHOOM.ogg'
toolspeed = 0.1
+ random_color = FALSE
/obj/item/screwdriver/power
name = "hand drill"
@@ -192,6 +195,7 @@
hitsound = 'sound/items/drill_hit.ogg'
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.25
+ random_color = FALSE
/obj/item/screwdriver/power/suicide_act(mob/user)
user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!")
@@ -215,7 +219,7 @@
name = "wirecutters"
desc = "This cuts wires."
icon = 'icons/obj/tools.dmi'
- icon_state = null
+ icon_state = "cutters"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 6
@@ -229,10 +233,11 @@
usesound = 'sound/items/Wirecutter.ogg'
sharp = 1
toolspeed = 1
+ var/random_color = TRUE
/obj/item/wirecutters/New(loc, param_color = null)
..()
- if(!icon_state)
+ if(random_color)
if(!param_color)
param_color = pick("yellow", "red")
icon_state = "cutters_[param_color]"
@@ -258,6 +263,7 @@
desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
icon_state = "cutters_brass"
toolspeed = 0.5
+ random_color = FALSE
/obj/item/wirecutters/abductor
name = "alien wirecutters"
@@ -266,6 +272,7 @@
icon_state = "cutters"
toolspeed = 0.1
origin_tech = "materials=5;engineering=4;abductor=3"
+ random_color = FALSE
/obj/item/wirecutters/cyborg
name = "wirecutters"
@@ -281,6 +288,7 @@
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
usesound = 'sound/items/jaws_cut.ogg'
toolspeed = 0.25
+ random_color = FALSE
/obj/item/wirecutters/power/suicide_act(mob/user)
user.visible_message("[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!")
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 9b50956f1af..9418df86368 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -614,9 +614,7 @@
origin_tech = "combat=4;powerstorage=7"
/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
- s.set_up(5, 1, target.loc)
- s.start()
+ do_sparks(5, 1, target.loc)
target.visible_message("[target.name] was shocked by the [name]!", \
"You feel a powerful shock course through your body sending you flying!", \
"You hear a heavy electrical crack!")
@@ -739,9 +737,7 @@
Z.take_organ_damage(0, 30)
user.visible_message("[user] slams the charged axe into [Z.name] with all [user.p_their()] might!")
playsound(loc, 'sound/magic/lightningbolt.ogg', 5, 1)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
+ do_sparks(1, 1, src)
if(A && wielded && (istype(A, /obj/structure/window) || istype(A, /obj/structure/grille)))
if(istype(A, /obj/structure/window))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 2f681c79d76..8e328c9400e 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -206,9 +206,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
do_teleport(src, E.pad, 0)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
@@ -233,9 +231,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
do_teleport(src, L)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 2a5639eb081..b5b29e8caac 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -253,6 +253,7 @@
new /obj/item/clothing/accessory/holster(src)
new /obj/item/clothing/accessory/blue(src)
new /obj/item/clothing/shoes/jackboots/jacksandals(src)
+ new /obj/item/clothing/under/rank/centcom/blueshield(src)
/obj/structure/closet/secure_closet/ntrep
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 648f3c95622..87cae2fb993 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -38,15 +38,13 @@
if(isliving(usr))
var/mob/living/L = usr
if(L.electrocute_act(17, src))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
return 2
playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
for(var/obj/O in src) //Objects
- O.forceMove(loc)
- for(var/mob/M in src) //Mobs
+ O.forceMove(loc)
+ for(var/mob/M in src) //Mobs
M.forceMove(loc)
icon_state = icon_opened
src.opened = 1
@@ -115,9 +113,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
do_teleport(src, E.pad, 0)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
@@ -139,9 +135,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
do_teleport(src, L)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
@@ -217,9 +211,7 @@
if(isliving(user))
var/mob/living/L = user
if(L.electrocute_act(17, src))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, 1, src)
return
src.add_fingerprint(user)
src.toggle(user)
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index 348c6fde265..dcbc7c017bb 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -69,9 +69,7 @@
A.updateicon()
flick("echair_shock", src)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(12, 1, src)
- s.start()
+ do_sparks(12, 1, src)
visible_message("The electric chair went off!", "You hear a deep sharp shock!")
if(buckled_mob)
buckled_mob.electrocute_act(110, src, 1)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 6b8f5544428..22b796c4c20 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -254,9 +254,7 @@
var/obj/structure/cable/C = T.get_cable_node()
if(C)
if(electrocute_mob(user, C, src))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, 1, src)
return 1
else
return 0
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index 44c9da74b20..7cee3769888 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -6,29 +6,44 @@ FLOOR SAFES
//SAFES
/obj/structure/safe
- name = "safe"
+ name = "\improper Safe"
desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
icon = 'icons/obj/structures.dmi'
icon_state = "safe"
anchored = 1
density = 1
- var/open = 0 //is the safe open?
+ var/open = FALSE //is the safe open?
+ var/unlocked = FALSE
var/tumbler_1_pos //the tumbler position- from 0 to 72
var/tumbler_1_open //the tumbler position to open at- 0 to 72
var/tumbler_2_pos
var/tumbler_2_open
+ var/open_pos
var/dial = 0 //where is the dial pointing?
var/space = 0 //the combined w_class of everything in the safe
var/maxspace = 24 //the maximum combined w_class of stuff in the safe
+ var/combo_to_open //so admins know the code
/obj/structure/safe/New()
- tumbler_1_pos = rand(0, 71)
- tumbler_1_open = rand(0, 71)
+ tumbler_2_pos = rand(0, 99) // first value in the combination set first
+ tumbler_2_open = rand(0, 99)
- tumbler_2_pos = rand(0, 71)
- tumbler_2_open = rand(0, 71)
+ tumbler_1_pos = rand(0, 99)
+ do
+ tumbler_1_open = rand(0, 99)
+ while(tumbler_1_open > Wrap(tumbler_2_open +48, 0, 100) && tumbler_1_open < Wrap(tumbler_2_open + 53, 0, 100)) // prevents a combination that wont open
+ do
+ open_pos = rand(0,99)
+ while(open_pos > Wrap(tumbler_1_open - 2, 0, 100) && open_pos < Wrap(tumbler_1_open + 2, 0, 100)) // prevents a combination that wont open
+ var/num1 = tumbler_2_open + 54
+ if(num1 > 99)
+ num1 = num1 - 100
+ var/num2 = tumbler_1_open + 98
+ if(num2 > 99)
+ num2 = num2 - 100
+ combo_to_open = "Go right past [num1] twice then stop at [num1]. Go left past [num2] once then stop at [num2]. Turn right till it stops and its open."
/obj/structure/safe/Initialize()
..()
@@ -40,31 +55,28 @@ FLOOR SAFES
I.loc = src
-/obj/structure/safe/proc/check_unlocked(mob/user, canhear)
+/obj/structure/safe/proc/check_unlocked()
+ if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open && dial == open_pos)
+ unlocked = TRUE
+ return TRUE
+ unlocked = FALSE
+ return FALSE
+
+/obj/structure/safe/proc/make_noise(turns, turns_total, tum1 = 0, tum2 = 0, mob/user, canhear)
if(user && canhear)
- if(tumbler_1_pos == tumbler_1_open)
+ if(turns == 2)
+ to_chat(user, "The sounds from [src] are too fast and blend together.")
+ if(tum1 && (turns_total == 1 || prob(10))) // So multi turns dont super spam the chat
+ to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].")
+ if(tum2 && (turns_total == 1 || prob(10))) // So multi turns dont super spam the chat
+ to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].")
+ if(tumbler_1_pos == tumbler_1_open && turns_total == 1) // You cant hear tumblers if you spin fast!
to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].")
- if(tumbler_2_pos == tumbler_2_open)
+ if(tumbler_2_pos == tumbler_2_open && turns_total == 1 ) // You cant hear tumblers if you spin fast!
to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].")
- if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
- if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!")
- return 1
- return 0
-
-
-/obj/structure/safe/proc/decrement(num)
- num -= 1
- if(num < 0)
- num = 71
- return num
-
-
-/obj/structure/safe/proc/increment(num)
- num += 1
- if(num > 71)
- num = 0
- return num
-
+ if(unlocked)
+ if(user)
+ visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!")
/obj/structure/safe/update_icon()
if(open)
@@ -72,75 +84,112 @@ FLOOR SAFES
else
icon_state = initial(icon_state)
-
/obj/structure/safe/attack_hand(mob/user)
- user.set_machine(src)
- var/dat = ""
- for(var/i = contents.len, i>=1, i--)
- var/obj/item/P = contents[i]
- dat += "
"
- dat += "[P.name]
\[ "
body += "VV - "
- body += "TP - "
- body += "PM - "
- body += "SM - "
+ body += "[ADMIN_TP(M,"TP")] - "
+ body += "PM - "
+ body += "[ADMIN_SM(M,"SM")] - "
if(ishuman(M) && M.mind)
body += "HM -"
body += "[admin_jump_link(M)]\]
"
@@ -70,45 +70,45 @@ var/global/nologevent = 0
if(M.client.related_accounts_ip.len)
body += "Related accounts by IP: [jointext(M.client.related_accounts_ip, " - ")]
"
- body += "Kick | "
+ body += "Kick | "
body += "Warn | "
- body += "Ban | "
- body += "Jobban | "
- body += "Appearance Ban | "
+ body += "Ban | "
+ body += "Jobban | "
+ body += "Appearance Ban | "
body += "Notes | "
if(M.client)
if(M.client.check_watchlist(M.client.ckey))
body += "Remove from Watchlist | "
body += "Edit Watchlist Reason "
else
- body += "Add to Watchlist "
+ body += "Add to Watchlist "
if(M.client)
- body += "| Prison | "
- body += "\ Send back to Lobby | "
+ body += "| Prison | "
+ body += "\ Send back to Lobby | "
var/muted = M.client.prefs.muted
body += {"
Mute:
- \[IC |
- OOC |
- PRAY |
- ADMINHELP |
- DEADCHAT\]
- (toggle all)
+ \[IC |
+ OOC |
+ PRAY |
+ ADMINHELP |
+ DEADCHAT\]
+ (toggle all)
"}
var/jumptoeye = ""
if(isAI(M))
var/mob/living/silicon/ai/A = M
if(A.client && A.eyeobj) // No point following clientless AI eyes
- jumptoeye = " (Eye)"
+ jumptoeye = " (Eye)"
body += {"
- Jump to[jumptoeye] |
- Get |
- Send To
+ Jump to[jumptoeye] |
+ Get |
+ Send To
- [check_rights(R_ADMIN,0) ? "Traitor panel | " : "" ]
- Narrate to |
- Subtle message
+ [check_rights(R_ADMIN,0) ? "[ADMIN_TP(M,"Traitor panel")] | " : "" ]
+ Narrate to |
+ [ADMIN_SM(M,"Subtle message")]
"}
if(check_rights(R_EVENT, 0))
@@ -128,39 +128,39 @@ var/global/nologevent = 0
if(issmall(M))
body += "Monkeyized | "
else
- body += "Monkeyize | "
+ body += "Monkeyize | "
//Corgi
if(iscorgi(M))
body += "Corgized | "
else
- body += "Corgize | "
+ body += "Corgize | "
//AI / Cyborg
if(isAI(M))
body += "Is an AI "
else if(ishuman(M))
- body += {"Make AI |
- Make Mask |
- Make Robot |
- Make Alien |
- Make Slime |
- Make Superhero
+ body += {"Make AI |
+ Make Mask |
+ Make Robot |
+ Make Alien |
+ Make Slime |
+ Make Superhero
"}
//Simple Animals
if(isanimal(M))
- body += "Re-Animalize | "
+ body += "Re-Animalize | "
else
- body += "Animalize | "
+ body += "Animalize | "
if(istype(M, /mob/dead/observer))
- body += "Re-incarnate | "
+ body += "Re-incarnate | "
if(ispAI(M))
body += "Is a pAI "
else
- body += "Make pAI | "
+ body += "Make pAI | "
// DNA2 - Admin Hax
if(M.dna && iscarbon(M))
@@ -175,7 +175,7 @@ var/global/nologevent = 0
if(bname)
var/bstate=M.dna.GetSEState(block)
var/bcolor="[(bstate)?"#006600":"#ff0000"]"
- body += "[bname][block]"
+ body += "[bname][block]"
else
body += "[block]"
body+=""
@@ -183,39 +183,39 @@ var/global/nologevent = 0
body += {"
Rudimentary transformation:
These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.
- Observer |
- \[ Alien: Drone,
- Hunter,
- Queen,
- Sentinel,
- Larva \]
- Human
- \[ slime: Baby,
- Adult \]
- Monkey |
- Cyborg |
- Cat |
- Runtime |
- Corgi |
- Ian |
- Crab |
- Coffee |
- \[ Construct: Armoured ,
- Builder ,
- Wraith \]
- Shade
+ Observer |
+ \[ Alien: Drone,
+ Hunter,
+ Queen,
+ Sentinel,
+ Larva \]
+ Human
+ \[ slime: Baby,
+ Adult \]
+ Monkey |
+ Cyborg |
+ Cat |
+ Runtime |
+ Corgi |
+ Ian |
+ Crab |
+ Coffee |
+ \[ Construct: Armoured ,
+ Builder ,
+ Wraith \]
+ Shade
"}
if(M.client)
body += {"
Other actions:
- Forcesay |
- Admin Room |
- Thunderdome 1 |
- Thunderdome 2 |
- Thunderdome Admin |
- Thunderdome Observer |
+ Forcesay |
+ Admin Room |
+ Thunderdome 1 |
+ Thunderdome 2 |
+ Thunderdome Admin |
+ Thunderdome Observer |
"}
body += {"
@@ -953,7 +953,7 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space
return "[A.name] - [loc.x],[loc.y],[loc.z]"
/proc/formatPlayerPanel(var/mob/U,var/text="PP")
- return "[text]"
+ return "[ADMIN_PP(U,"[text]")]"
//Kicks all the clients currently in the lobby. The second parameter (kick_only_afk) determins if an is_afk() check is ran, or if all clients are kicked
//defaults to kicking everyone (afk + non afk clients in the lobby)
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 9a39c51d971..8c83961d8ad 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -61,7 +61,7 @@
}
- function expand(id,job,name,real_name,image,key,ip,antagonist,ref,eyeref){
+ function expand(id,job,name,real_name,image,key,ip,antagonist,UID,eyeUID){
clearAll();
@@ -75,15 +75,15 @@
body += "