diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 73cdc5f6884..e8c7725bb7b 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -51,7 +51,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/storage/box/swabs,
/obj/item/weapon/storage/box/swabs,
/obj/item/weapon/storage/box/slides,
- /obj/item/weapon/reagent_containers/spray/luminol)
+ /obj/item/weapon/reagent_containers/spray/luminol,
+ /obj/item/device/uv_light)
cost = 30
containertype = /obj/structure/closet/crate
containername = "Auxiliary forensic tools"
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
index 046da249b1d..6f3b6119776 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
@@ -92,32 +92,89 @@
if(!ability_prechecks(user, price))
return
- var/title = input("Select message title: ")
- var/text = input("Select message text: ")
- if(!title || !text || !ability_pay(user, price))
- user << "Hack Aborted"
- return
+ var/reporttitle
+ var/reportbody
+ var/reporttype = input(usr, "Choose whether to use a template or custom report.", "Create Command Report") in list("Template", "Custom", "Cancel")
+ switch(reporttype)
+ if("Template")
+ establish_db_connection(dbcon)
+ if (!dbcon.IsConnected())
+ src << "Unable to connect to the database."
+ return
+ var/DBQuery/query = dbcon.NewQuery("SELECT title, message FROM ss13_ccia_general_notice_list WHERE deleted_at IS NULL")
+ query.Execute()
- log_ability_use(user, "advanced encryption hack")
+ var/list/template_names = list()
+ var/list/templates = list()
- if(prob(50) && user.hack_can_fail)
- user << "Hack Failed."
- if(prob(5))
- user.hack_fails ++
- announce_hack_failure(user, "quantum message relay")
- log_ability_use(user, "elite encryption hack (CRITFAIL - title: [title])")
+ while (query.NextRow())
+ template_names += query.item[1]
+ templates[query.item[1]] = query.item[2]
+
+ // Catch empty list
+ if (!templates.len)
+ src << "There are no templates in the database."
+ return
+
+ reporttitle = input(usr, "Please select a command report template.", "Create Command Report") in template_names
+ reportbody = templates[reporttitle]
+
+ if("Custom")
+ reporttitle = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null)
+ if(!reporttitle)
+ reporttitle = "NanoTrasen Update"
+ reportbody = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "Body", "") as message|null, extra = 0)
+ if(!reportbody)
+ return
+ else
return
- log_ability_use(user, "elite encryption hack (FAIL - title: [title])")
- return
- log_ability_use(user, "elite encryption hack (SUCCESS - title: [title])")
- command_announcement.Announce(text, title)
- for (var/obj/machinery/computer/communications/C in machines)
- if(! (C.stat & (BROKEN|NOPOWER) ) )
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
- P.name = "[command_name()] Update"
- P.info = replacetext(text, "\n", "
")
- P.update_space(P.info)
- P.update_icon()
+
+ if (reporttype == "Template")
+ sanitizeSafe(alert(usr, "Would you like it to appear as if CCIAMS made the report?",,"Yes","No"))
+ if ("Yes")
+ reportbody += "\n\n- CCIAMS, [commstation_name()]"
+ else
+
+ switch(alert("Should this be announced to the general population?",,"Yes","No"))
+ if("Yes")
+ if(!reporttitle || !reportbody || !ability_pay(user, price))
+ user << "Hack Aborted due to no title, no body message, or you do not have enough CPU for this action."
+ return
+
+ log_ability_use(user, "advanced encryption hack")
+
+ if(prob(50) && user.hack_can_fail)
+ user << "Hack Failed."
+ if(prob(5))
+ user.hack_fails ++
+ announce_hack_failure(user, "quantum message relay")
+ log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])")
+ command_announcement.Announce("[reportbody]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1);
+
+ if("No")
+ if(!reporttitle || !reportbody || !ability_pay(user, price))
+ user << "Hack Aborted due to no title, no body message, or you do not have enough CPU for this action."
+ return
+
+ log_ability_use(user, "advanced encryption hack")
+
+ if(prob(50) && user.hack_can_fail)
+ user << "Hack Failed."
+ if(prob(5))
+ user.hack_fails ++
+ announce_hack_failure(user, "quantum message relay")
+ log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])")
+ world << "\red New [company_name] Update available at all communication consoles."
+ world << sound('sound/AI/commandreport.ogg')
+ post_comm_message(reporttitle, reportbody)
/datum/game_mode/malfunction/verb/elite_encryption_hack()
set category = "Software"
@@ -219,4 +276,4 @@
user.verbs += new/datum/game_mode/malfunction/verb/ai_destroy_station()
-// END ABILITY VERBS
\ No newline at end of file
+// END ABILITY VERBS
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 341d2ba8e1d..387520d100d 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -680,7 +680,7 @@
T.mind.vampire.master = src
vampire.thralls += T
T << "You have been forced into a blood bond by [T.mind.vampire.master], and are thus their thrall. While a thrall may feel a myriad of emotions towards their master, ranging from fear, to hate, to love; the supernatural bond between them still forces the thrall to obey their master, and to listen to the master's commands.
You must obey your master's orders, you must protect them, you cannot harm them."
-
+ src << "You have completed the thralling process. They are now your slave and will obey your commands."
admin_attack_log(src, T, "enthralled [key_name(T)]", "was enthralled by [key_name(src)]", "successfully enthralled")
vampire.use_blood(150)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 77c6dc7ec8d..576dd761297 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -62,7 +62,7 @@
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
- minimal_player_age = 5
+ minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -106,7 +106,7 @@
economic_modifier = 5
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
- minimal_player_age = 3
+ minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
@@ -153,7 +153,7 @@
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
- minimal_player_age = 3
+ minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index 5d15df1d997..bd2560047be 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -241,8 +241,12 @@
if(target_mob != H)
H << "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name]."
- target_mob << "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected."
- target_mob.reagents.add_reagent(charge.display_name, chems_to_use)
+
+ if(target_mob.is_physically_disabled())
+ target_mob.reagents.add_reagent(charge.display_name, chems_to_use)
+ else
+ target_mob << "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected."
+ target_mob.reagents.add_reagent(charge.display_name, chems_to_use)
charge.charges -= chems_to_use
if(charge.charges < 0) charge.charges = 0
diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm
index 91b435a0c8c..a64b2eed527 100644
--- a/code/modules/events/viral_infection.dm
+++ b/code/modules/events/viral_infection.dm
@@ -21,16 +21,9 @@ datum/event/viral_infection/setup()
viruses += D
datum/event/viral_infection/announce()
- var/level
- if (severity == EVENT_LEVEL_MUNDANE)
- return
- else if (severity == EVENT_LEVEL_MODERATE)
- level = pick("one", "two", "three", "four")
- else
- level = "five"
if (severity == EVENT_LEVEL_MAJOR || prob(60))
- command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
+ command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
datum/event/viral_infection/start()
if(!viruses.len) return
diff --git a/html/changelogs/Printer16-BugFixes.yml b/html/changelogs/Printer16-BugFixes.yml
new file mode 100644
index 00000000000..0cafefd39c4
--- /dev/null
+++ b/html/changelogs/Printer16-BugFixes.yml
@@ -0,0 +1,38 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Printer16
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - bugfix: "Vampires now know when they finished enthralling someone."
+ - bugfix: "The Auxilliary Forensics Tools crate now spawns with a UV light."
+ - bugfix: "A Malf AI's advanced encryption hack has been given a lot more space to work with."
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 7b6112c3e68..733cf136a21 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -4941,7 +4941,7 @@
"bRa" = (/obj/item/weapon/aicard,/obj/item/weapon/aiModule/reset,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech)
"bRb" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/pandemic{pixel_x = -3; pixel_y = 3},/obj/item/weapon/circuitboard/rdconsole,/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe,/obj/item/weapon/circuitboard/rdserver{pixel_x = 3; pixel_y = -3},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tech)
"bRc" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/security/mining,/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/tech)
-"bRd" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/arcade,/obj/item/weapon/circuitboard/message_monitor{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
+"bRd" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/message_monitor{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
"bRe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bRf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing)
"bRg" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access = list(7)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing)