diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm
index afb9e856a6..ab2efd68c4 100644
--- a/code/defines/obj/storage.dm
+++ b/code/defines/obj/storage.dm
@@ -54,6 +54,10 @@
/obj/item/weapon/storage/box/engineer
+/obj/item/weapon/storage/box/medic
+ name = "anesthetic box"
+ desc = "Full of masks and emergency anesthetic tanks."
+
/obj/item/weapon/storage/box/syndicate
/obj/item/weapon/storage/pillbottlebox
@@ -98,6 +102,53 @@
desc = "A tough backpack for the daily grind"
icon_state = "engiepack"
+/obj/item/weapon/storage/backpack/industrial/full
+ name = "loaded industrial backpack"
+ desc = "A tough backpack for the daily grind, full of gear"
+ icon_state = "engiepack"
+
+//Spawns with 2 glass, 2 metal, 1 steel, and 2 special boxes.
+ New()
+ ..()
+ for(var/i = 1, i <=2, i++)
+ var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src)
+ G.amount = 50
+ G.loc = src
+ for(var/i = 1, i <=2, i++)
+ var/obj/item/stack/sheet/metal/G = new /obj/item/stack/sheet/metal(src)
+ G.amount = 50
+ G.loc = src
+ var/obj/item/stack/sheet/r_metal/R = new /obj/item/stack/sheet/r_metal(src)
+ R.amount = 50
+ R.loc = src
+ var/obj/item/weapon/storage/box/B1 = new /obj/item/weapon/storage/box(src)
+ B1.name = "power and airlock circuit box"
+ B1.desc = "Bursting with repair gear"
+ B1.w_class = 2
+ for(var/i = 1, i <= 7, i++)
+ if(i < 4)
+ var/obj/item/weapon/module/power_control/P = new /obj/item/weapon/module/power_control(B1)
+ P.loc = B1
+ if(i >= 4)
+ var/obj/item/weapon/airlock_electronics/P = new /obj/item/weapon/airlock_electronics(B1)
+ P.loc = B1
+ var/obj/item/weapon/storage/box/B2 = new /obj/item/weapon/storage/box(src)
+ B2.name = "power cells and wire box"
+ B2.desc = "Bursting with repair gear"
+ B2.w_class = 2
+ var/color = pick("red","yellow","green","blue")
+ for(var/i = 1, i <= 7, i++)
+ if(i < 4)
+ var/obj/item/weapon/cable_coil/P = new /obj/item/weapon/cable_coil(B2,30,color)
+ P.loc = B2
+ if(i >= 4)
+ var/obj/item/weapon/cell/P = new /obj/item/weapon/cell(B2)
+ P.maxcharge = 15000
+ P.charge = 15000
+ P.updateicon()
+ P.loc = B2
+ return
+
/obj/item/weapon/storage/briefcase
name = "briefcase"
desc = "Used by the lawyer in the court room."
@@ -223,6 +274,22 @@
icon_state = "implant"
item_state = "syringe_kit"
+/obj/item/weapon/storage/deathalarm_kit
+ name = "Death Alarm Kit"
+ desc = "Box of stuff used to implant death alarms."
+ icon_state = "implant"
+ item_state = "syringe_kit"
+
+ New()
+ ..()
+ new /obj/item/weapon/implanter(src)
+ new /obj/item/weapon/implantcase/death_alarm(src)
+ new /obj/item/weapon/implantcase/death_alarm(src)
+ new /obj/item/weapon/implantcase/death_alarm(src)
+ new /obj/item/weapon/implantcase/death_alarm(src)
+ new /obj/item/weapon/implantcase/death_alarm(src)
+ new /obj/item/weapon/implantcase/death_alarm(src)
+
/obj/item/weapon/storage/toolbox
name = "toolbox"
desc = "Danger. Very heavy."
diff --git a/code/game/communications.dm b/code/game/communications.dm
index bba3fa7a92..6a7faf5812 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -104,13 +104,13 @@ var/list/radiochannels = list(
"Medical" = 1355,
"Engineering" = 1357,
"Security" = 1359,
- "Deathsquad" = 1441,
+ "ResponseTeam" = 1439,
"Syndicate" = 1213,
"Mining" = 1349,
"Cargo" = 1347,
)
//depenging helpers
-var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213,1441,1349,1347)
+var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213,1439,1349,1347)
var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/SYND_FREQ = 1213
var/NUKE_FREQ = 1200 //Randomised on nuke rounds.
diff --git a/code/game/events/EventsMain.dm b/code/game/events/EventsMain.dm
index bf32893d95..64ec941423 100644
--- a/code/game/events/EventsMain.dm
+++ b/code/game/events/EventsMain.dm
@@ -6,18 +6,22 @@
*/
-var/list/DisallowedEvents = list(/datum/event/spaceninja, /datum/event/prisonbreak, /datum/event/immovablerod, /datum/event/gravitationalanomaly)
+var/list/DisallowedEvents = list(/datum/event/spaceninja, /datum/event/prisonbreak, /datum/event/immovablerod, /datum/event/gravitationalanomaly, /datum/event/alieninfestation)
var/list/EventTypes = typesof(/datum/event) - /datum/event - DisallowedEvents
+var/list/OneTimeEvents = list(/datum/event/spacecarp, /datum/event/miniblob)
var/datum/event/ActiveEvent = null
var/datum/event/LongTermEvent = null
+var/is_ninjad_yet = 0
/proc/SpawnEvent()
if(!EventsOn || ActiveEvent)
return
- if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)
+ if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station && !is_ninjad_yet)
EventTypes |= /datum/event/spaceninja
+ is_ninjad_yet = 1
var/Type = pick(EventTypes)
- EventTypes -= Type
+ if(Type in OneTimeEvents)
+ EventTypes -= Type
ActiveEvent = new Type()
ActiveEvent.Announce()
if (!ActiveEvent)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 6452fc3f49..4a0ccefa6d 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -84,7 +84,7 @@
H.equip_if_possible(new /obj/item/device/pda/quartermaster(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses)
- H.equip_if_possible(new /obj/item/weapon/clipboard(H), H.slot_l_hand)
+ H.equip_if_possible(new /obj/item/weapon/clipboard(H), H.slot_r_store)
return 1
@@ -224,7 +224,7 @@
if(!H) return 0
H.equip_if_possible(new /obj/item/clothing/under/suit_jacket/red(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
- H.equip_if_possible(new /obj/item/weapon/barcodescanner(H), H.slot_l_hand)
+ H.equip_if_possible(new /obj/item/weapon/barcodescanner(H), H.slot_l_store)
return 1
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 1168627544..f1e442ffbf 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -12,10 +12,10 @@
H.equip_if_possible(new /obj/item/device/radio/headset/heads/ce(H), H.slot_ears)
H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/chief_engineer(H), H.slot_w_uniform)
- H.equip_if_possible(new /obj/item/device/pda/heads/ce(H), H.slot_belt)
+ H.equip_if_possible(new /obj/item/device/pda/heads/ce(H), H.slot_l_store)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/clothing/head/helmet/hardhat/white(H), H.slot_head)
- H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/full(H), H.slot_l_hand)
+ H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/full(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves)
return 1
@@ -36,9 +36,9 @@
H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/engineer(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/orange(H), H.slot_shoes)
- H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_belt)
+ H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_l_store)
H.equip_if_possible(new /obj/item/clothing/head/helmet/hardhat(H), H.slot_head)
- H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/full(H), H.slot_l_hand)
+ H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/full(H), H.slot_belt)
H.equip_if_possible(new /obj/item/device/t_scanner(H), H.slot_r_store)
return 1
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 9549c1536b..62d1373310 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -14,7 +14,7 @@
H.equip_if_possible(new /obj/item/clothing/under/rank/research_director(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/pda/heads/rd(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/suit/storage/labcoat(H), H.slot_wear_suit)
- H.equip_if_possible(new /obj/item/weapon/clipboard(H), H.slot_r_hand)
+ H.equip_if_possible(new /obj/item/weapon/clipboard(H), H.slot_l_store)
return 1
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 8c0e405f0c..dcd631c9ee 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -254,10 +254,11 @@ var/global/datum/controller/occupations/job_master
C.name = "[C.registered]'s ID Card ([C.assignment])"
C.access = get_access(C.assignment)
H.equip_if_possible(C, H.slot_wear_id)
- H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_r_store)
+ if(!H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_r_store))
+ H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_ears)
H.equip_if_possible(new /obj/item/device/pda(H), H.slot_belt)
- if(istype(H.belt, /obj/item/device/pda))//I bet this could just use locate
- var/obj/item/device/pda/pda = H.belt
+ if(locate(/obj/item/device/pda,H))//I bet this could just use locate
+ var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
pda.owner = H.real_name
pda.ownjob = H.wear_id.assignment
pda.name = "PDA-[H.real_name] ([pda.ownjob])"
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index b1e837c519..d95784d41d 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -8,7 +8,7 @@
use_power = 1
idle_power_usage = 1
active_power_usage = 5
- var/mob/living/carbon/human/victim = null
+ var/mob/living/carbon/victim = null
var/strapped = 0.0
var/obj/machinery/computer/operating/computer = null
@@ -95,8 +95,8 @@
return
/obj/machinery/optable/proc/check_victim()
- if(locate(/mob/living/carbon/human, src.loc))
- var/mob/M = locate(/mob/living/carbon/human, src.loc)
+ if(locate(/mob/living/carbon, src.loc))
+ var/mob/M = locate(/mob/living/carbon, src.loc)
if(M.resting)
src.victim = M
icon_state = "table2-active"
@@ -130,4 +130,78 @@
user.drop_item()
if(W && W.loc)
W.loc = src.loc
- return
\ No newline at end of file
+ return
+
+/obj/machinery/optable/portable
+ name = "mobile operating Table"
+ desc = "Used for advanced medical procedures. Seems to be movable, neat."
+ icon = 'rollerbed.dmi'
+ icon_state = "up"
+ density = 1
+ anchored = 0
+
+ New()
+ ..()
+ processing_objects.Remove(src)
+
+ MouseDrop_T(obj/O as obj, mob/user as mob)
+ if ((!( istype(O, /obj/item/weapon) ) || user.equipped() != O))
+ return
+ user.drop_item()
+ if (O.loc != src.loc)
+ step(O, get_dir(O, src))
+ return
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(!anchored)
+ return
+ if (istype(W, /obj/item/weapon/grab))
+ if(ismob(W:affecting))
+ var/mob/M = W:affecting
+ if (M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.resting = 1
+ M.loc = src.loc
+ for (var/mob/C in viewers(src))
+ C.show_message("\red [M] has been laid on the operating table by [user].", 3)
+ for(var/obj/O in src)
+ O.loc = src.loc
+ src.add_fingerprint(user)
+ src.victim = M
+ processing_objects.Add(src)
+ del(W)
+ return
+ user.drop_item()
+ if(W && W.loc)
+ W.loc = src.loc
+ return
+
+ check_victim()
+ if(locate(/mob/living/carbon/human, src.loc))
+ var/mob/M = locate(/mob/living/carbon/human, src.loc)
+ if(M.resting)
+ src.victim = M
+ return 1
+ src.victim = null
+ processing_objects.Remove(src)
+ return 0
+
+ verb/make_deployable()
+ set category = "Object"
+ set name = "Deploy Table"
+ set src in oview(1)
+
+ if(anchored)
+ if(victim)
+ usr << "You can't do that with someone on the table!"
+ else
+ anchored = 0
+ for(var/mob/M in orange(5,src))
+ M.show_message("\blue [usr] releases the locks on the table's casters!")
+ icon_state = "up"
+ else
+ anchored = 1
+ for(var/mob/M in orange(5,src))
+ M.show_message("\blue [usr] locks the table's casters in place!")
+ icon_state = "down"
\ No newline at end of file
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 8e9066b5a1..306e8d5587 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -182,9 +182,8 @@
outputAmount = 1
if (!busy)
if(href_list["make"])
- makeDir = get_dir(src,usr)
makeNew:
- var/turf/T = get_step(src.loc, makeDir)
+ var/turf/T = src.loc
var/obj/template = locate(href_list["make"])
var/multiplier = text2num(href_list["multiplier"])
if (!multiplier) multiplier = 1
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index a0cb853177..fcfa830ebe 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -62,6 +62,7 @@
machinetype = 6
heatgen = 0
var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel
+ var/syndi = 1 //If 1, it goes to syndicate frequency. Else, goes to deathsquad
receive_signal(datum/signal/signal)
@@ -87,19 +88,31 @@
var/datum/radio_frequency/connection = signal.data["connection"]
- if(connection.frequency == NUKE_FREQ) // if syndicate broadcast, just
+ if(connection.frequency == NUKE_FREQ && syndi) // if syndicate broadcast, just
Broadcast_Message(signal.data["connection"], signal.data["mob"],
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"],, signal.data["compression"])
- else
- if(intercept)
+ else if(connection.frequency == 1439 && !syndi)
+ Broadcast_Message(signal.data["connection"], signal.data["mob"],
+ signal.data["vmask"], signal.data["vmessage"],
+ signal.data["radio"], signal.data["message"],
+ signal.data["name"], signal.data["job"],
+ signal.data["realname"], signal.data["vname"],, signal.data["compression"])
+ else if (intercept)
+ if(syndi)
Broadcast_Message(signal.data["connection"], signal.data["mob"],
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"], 3, signal.data["compression"])
+ else
+ Broadcast_Message(signal.data["connection"], signal.data["mob"],
+ signal.data["vmask"], signal.data["vmessage"],
+ signal.data["radio"], signal.data["message"],
+ signal.data["name"], signal.data["job"],
+ signal.data["realname"], signal.data["vname"], 4, signal.data["compression"])
@@ -195,6 +208,15 @@
receive |= R.send_hear(NUKE_FREQ)
+ // --- Broadcast to response team radio! ---
+
+ else if(data == 3)
+ var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(1439)
+
+ for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"])
+
+ receive |= R.send_hear(1439)
+
// --- Broadcast to ALL radio devices ---
else
@@ -250,6 +272,9 @@
else
heard_garbled += R
+ for(var/obj/item/weapon/implant/imp in R)
+ imp.hear(message,M)
+
/* ###### Begin formatting and sending the message ###### */
if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
@@ -277,6 +302,8 @@
freq_text = "Mining"
if(1347)
freq_text = "Cargo"
+ if(1439)
+ freq_text = "Response Team"
if(connection.frequency == NUKE_FREQ)
freq_text = "Agent"
@@ -308,7 +335,9 @@
// --- Filter the message; place it in quotes apply a verb ---
- var/quotedmsg = M.say_quote(message)
+ var/quotedmsg = "\"" + message + "\""
+ if(M)
+ quotedmsg = M.say_quote(message)
// --- This following recording is intended for research and feedback in the use of department radio channels ---
@@ -385,7 +414,10 @@
// Displays garbled message (ie "f*c* **u, **i*er!")
if (length(heard_garbled))
- quotedmsg = M.say_quote(stars(message))
+ if(M)
+ quotedmsg = M.say_quote(stars(message))
+ else
+ quotedmsg = "\"" + stars(message) + "\""
var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_garbled)
@@ -398,7 +430,10 @@
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if (length(heard_gibberish))
- quotedmsg = M.say_quote(Gibberish(message, compression + 50))
+ if(M)
+ quotedmsg = M.say_quote(Gibberish(message, compression + 50))
+ else
+ quotedmsg = "\"" + Gibberish(message, compression + 50) + "\""
var/rendered = "[part_a][Gibberish(M.real_name, compression + 50)][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_gibberish)
diff --git a/code/game/machinery/telecomms/telecommunications.dm b/code/game/machinery/telecomms/telecommunications.dm
index b7c7fcd0ca..e1a8bab184 100644
--- a/code/game/machinery/telecomms/telecommunications.dm
+++ b/code/game/machinery/telecomms/telecommunications.dm
@@ -382,7 +382,10 @@
log.parameters["message"] = signal.data["message"]
log.parameters["name"] = signal.data["name"]
log.parameters["realname"] = signal.data["realname"]
- log.parameters["uspeech"] = M.universal_speak
+ if(M)
+ log.parameters["uspeech"] = M.universal_speak
+ else
+ log.parameters["uspeech"] = 0
// If the signal is still compressed, make the log entry gibberish
if(signal.data["compression"] > 0)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index b52cde554a..8029addbfe 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -10,6 +10,7 @@
activate()
implanted(source as mob)
get_data()
+ hear(message, source as mob)
trigger(emote, source as mob)
@@ -27,6 +28,9 @@
get_data()
return "No information available"
+ hear(message, source as mob)
+ return
+
/obj/item/weapon/implant/uplink
@@ -236,7 +240,11 @@ the implant may become unstable and either pre-maturely inject the subject or si
Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
return dat
- hear_talk(M as mob, var/msg)
+ hear_talk(mob/M as mob, msg)
+ hear(msg)
+ return
+
+ hear(var/msg)
if(findtext(msg,phrase))
if(istype(loc, /mob/))
var/mob/T = loc
@@ -250,4 +258,41 @@ the implant may become unstable and either pre-maturely inject the subject or si
implanted(mob/source as mob)
phrase = input("Choose activation phrase:") as text
usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate.", 0, 0)
- usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate."
\ No newline at end of file
+ usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate."
+
+/obj/item/weapon/implant/death_alarm
+ name = "death alarm"
+ desc = "Danger Will Robinson!"
+ var/mobname = "Will Robinson"
+
+ get_data()
+ var/dat = {"
+Implant Specifications:
+Name: NanoTrasen \"Profit Margin\" Class Employee Lifesign Sensor
+Life: Activates upon death.
+Important Notes: Alerts crew to crewmember death.
+