diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 60c91e51bb..485666a8ff 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -1688,8 +1688,7 @@
/obj/machinery/button/door{
id = "hos";
name = "HoS Office Shutters";
- pixel_y = -25;
-
+ pixel_y = -25
},
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
@@ -26228,9 +26227,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/office)
"bkx" = (
-/obj/machinery/status_display/supply{
- pixel_y = 2
- },
+/obj/machinery/status_display/supply,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -31345,7 +31342,9 @@
id = "QMLoad"
},
/obj/machinery/light,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = -32
+ },
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -33612,7 +33611,9 @@
name = "Station Intercom (General)";
pixel_y = -35
},
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = -32
+ },
/obj/machinery/computer/security/qm{
dir = 4
},
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 1bcb5c20a8..efd4d0f56e 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -17692,7 +17692,9 @@
pixel_x = -28;
pixel_y = 23
},
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = 32
+ },
/obj/machinery/conveyor{
dir = 5;
id = "QMLoad2"
@@ -21617,7 +21619,9 @@
/obj/structure/table,
/obj/item/clipboard,
/obj/item/stamp/qm,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = 32
+ },
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"aQu" = (
@@ -27037,7 +27041,9 @@
/area/hallway/primary/port)
"baA" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = 32
+ },
/obj/structure/table,
/obj/item/folder/yellow,
/obj/effect/turf_decal/tile/brown{
@@ -27920,7 +27926,9 @@
/area/quartermaster/office)
"bbS" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = 32
+ },
/obj/effect/turf_decal/tile/brown{
dir = 1
},
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index dbb26f8808..cef0aefc50 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -2833,7 +2833,9 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hop)
"aeP" = (
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = -32
+ },
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 7935a2a3f9..9efbb28e2b 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -21743,7 +21743,9 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aZj" = (
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = -32
+ },
/obj/machinery/computer/bounty{
dir = 4
},
@@ -36058,7 +36060,9 @@
/obj/item/folder/white,
/obj/item/pen,
/obj/item/stamp/rd,
-/obj/machinery/status_display/ai,
+/obj/machinery/status_display/ai{
+ pixel_y = -32
+ },
/obj/machinery/camera{
c_tag = "Research Director's Office";
dir = 1;
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 4a3143da79..74f9ad0382 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -126,9 +126,9 @@ SUBSYSTEM_DEF(ticker)
if(!GLOB.syndicate_code_phrase)
- GLOB.syndicate_code_phrase = generate_code_phrase()
+ GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE)
if(!GLOB.syndicate_code_response)
- GLOB.syndicate_code_response = generate_code_phrase()
+ GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE)
start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10)
if(CONFIG_GET(flag/randomize_shift_time))
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 127413262c..4283d7f78f 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -195,7 +195,7 @@
/obj/item/clothing/gloves/krav_maga/combatglovesplus
name = "combat gloves plus"
desc = "These tactical gloves are fireproof and shock resistant, and using nanochip technology it teaches you the powers of krav maga."
- icon_state = "black"
+ icon_state = "combat"
item_state = "blackglovesplus"
siemens_coefficient = 0
permeability_coefficient = 0.05
diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm
index 9163fb0849..7f3c7f3bfc 100644
--- a/code/game/objects/items/devices/dogborg_sleeper.dm
+++ b/code/game/objects/items/devices/dogborg_sleeper.dm
@@ -17,7 +17,7 @@
var/eject_port = "ingestion"
var/escape_in_progress = FALSE
var/message_cooldown
- var/breakout_time = 300
+ var/breakout_time = 150
var/tmp/last_hearcheck = 0
var/tmp/list/hearing_mobs
var/list/items_preserved = list()
@@ -77,7 +77,7 @@
to_chat(user, "Your [src] is already occupied.")
return
user.visible_message("[hound.name] is carefully inserting [target.name] into their [src].", "You start placing [target] into your [src]...")
- if(!patient && iscarbon(target) && !target.buckled && do_after (user, 50, target = target))
+ if(!patient && iscarbon(target) && !target.buckled && do_after (user, 100, target = target))
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
@@ -420,6 +420,7 @@
desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves."
icon = 'icons/mob/dogborg.dmi'
icon_state = "sleeper"
+ breakout_time = 30 //Medical sleepers should be designed to be as easy as possible to get out of.
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
name = "Mobile Brig"
@@ -429,6 +430,7 @@
inject_amount = 0
min_health = -100
injection_chems = null //So they don't have all the same chems as the medihound!
+ breakout_time = 300
/obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity)
if(istype(K9))
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 47823a2dc4..828e19e3f6 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -18,7 +18,7 @@
/datum/antagonist/traitor/on_gain()
if(owner.current && isAI(owner.current))
traitor_kind = TRAITOR_AI
-
+
SSticker.mode.traitors += owner
owner.special_role = special_role
if(give_objectives)
@@ -48,7 +48,7 @@
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
A.malf_picker.remove_malf_verbs(A)
qdel(A.malf_picker)
-
+
SSticker.mode.traitors -= owner
if(!silent && owner.current)
to_chat(owner.current," You are no longer the [special_role]! ")
@@ -244,14 +244,16 @@
return
var/mob/traitor_mob=owner.current
- to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:")
- to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]")
- to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]")
+ var/phrases = jointext(GLOB.syndicate_code_phrase, ", ")
+ var/responses = jointext(GLOB.syndicate_code_response, ", ")
- antag_memory += "Code Phrase: [GLOB.syndicate_code_phrase]
"
- antag_memory += "Code Response: [GLOB.syndicate_code_response]
"
+ var/dat = "The Syndicate have provided you with the following codewords to identify fellow agents:\n"
+ dat += "Code Phrase: [phrases]\n"
+ dat += "Code Response: [responses]"
+ to_chat(traitor_mob, dat)
- to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.")
+ antag_memory += "Code Phrase: [phrases]
"
+ antag_memory += "Code Response: [responses]
"
/datum/antagonist/traitor/proc/add_law_zero()
var/mob/living/silicon/ai/killer = owner.current
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index 085cf61769..31e99535d1 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -24,7 +24,8 @@
"blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"),
"cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"),
"sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"),
- "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."))
+ "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."),
+ "peanut_butter" = list("peanutbutter", "peanut butter jar", "A deliciously and sticky spread made from peanuts."))
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
/obj/item/reagent_containers/food/condiment/suicide_act(mob/living/carbon/user)
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 1b602b6759..17a710ada2 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -52,6 +52,33 @@
list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2)
foodtype = GRAIN | FRUIT
+/obj/item/reagent_containers/food/snacks/jellysandwich/pbj
+ name = "\improper PB & J sandwich"
+ desc = "A grand creation of peanut butter, jelly and bread! An all-american classic."
+ icon_state = "pbjsandwich"
+ tastes = list("bread" = 1, "jelly" = 1, "peanuts" = 1)
+
+/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry
+ bonus_reagents = list("cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ foodtype = GRAIN | FRUIT
+
+/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime
+ bonus_reagents = list("slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ foodtype = GRAIN | TOXIC
+
+/obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
+ name = "peanut butter sandwich"
+ desc = "You wish you had some jelly to go with this..."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "peanutbuttersandwich"
+ trash = /obj/item/trash/plate
+ bitesize = 3
+ bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "peanut_butter" = 5, "vitamin" = 2)
+ foodtype = GRAIN
+
/obj/item/reagent_containers/food/snacks/notasandwich
name = "not-a-sandwich"
desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache."
@@ -83,6 +110,19 @@
list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2)
foodtype = GRAIN | TOXIC | SUGAR
+/obj/item/reagent_containers/food/snacks/peanut_buttertoast
+ name = "peanut butter toast"
+ desc = "A slice of toast covered with delicious peanut butter."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "peanutbuttertoast"
+ trash = /obj/item/trash/plate
+ bitesize = 3
+ bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "peanut_butter" = 5, "vitamin" = 2)
+ tastes = list("toast" = 1, "peanuts" = 1)
+ foodtype = GRAIN
+
+
/obj/item/reagent_containers/food/snacks/twobread
name = "two bread"
desc = "This seems awfully bitter."
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 0c4e2c2e30..a6240e5b48 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -116,7 +116,7 @@
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/jelliedyoast
+/datum/crafting_recipe/food/jelliedtoast
name = "Jellied toast"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
@@ -125,6 +125,15 @@
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
subcategory = CAT_MISCFOOD
+/datum/crafting_recipe/food/peanutbuttertoast
+ name = "Peanut butter toast"
+ reqs = list(
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/peanut_buttertoast
+ subcategory = CAT_MISCFOOD
+
/datum/crafting_recipe/food/twobread
name = "Two bread"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index 133713ac75..127b2cc238 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -43,6 +43,48 @@
result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry
subcategory = CAT_SANDWICH
+/datum/crafting_recipe/food/pbj_slimesandwich
+ name = "PB&J sandwich"
+ reqs = list(
+ /datum/reagent/toxin/slimejelly = 5,
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime
+ subcategory = CAT_SANDWICH
+
+/datum/crafting_recipe/food/pbj_slimesandwich/alt
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/jelliedtoast/slime = 1,
+ /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
+ )
+
+/datum/crafting_recipe/food/pbj_sandwich
+ name = "PB&J sandwich"
+ reqs = list(
+ /datum/reagent/consumable/cherryjelly = 5,
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry
+ subcategory = CAT_SANDWICH
+
+/datum/crafting_recipe/food/pbj_sandwich/alt
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry = 1,
+ /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
+ )
+
+/datum/crafting_recipe/peanutbutter_sandwich
+ name = "Peanut butter sandwich"
+ reqs = list(
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
+ subcategory = CAT_SANDWICH
+
+
/datum/crafting_recipe/food/notasandwich
name = "Not a sandwich"
reqs = list(
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 30532e5ed3..a12e221345 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -303,6 +303,7 @@ h1.alert, h2.alert {color: #000000;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
.danger {color: #ff0000;}
.warning {color: #ff0000; font-style: italic;}
+.alertwarning {color: #FF0000; font-weight: bold}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
@@ -316,6 +317,8 @@ h1.alert, h2.alert {color: #000000;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
+.red {color: #FF0000}
+.blue {color: #215cff}
.nicegreen {color: #14a833;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
diff --git a/code/modules/hydroponics/grown/peanuts.dm b/code/modules/hydroponics/grown/peanuts.dm
new file mode 100644
index 0000000000..2423300cc4
--- /dev/null
+++ b/code/modules/hydroponics/grown/peanuts.dm
@@ -0,0 +1,30 @@
+/obj/item/seeds/peanutseed
+ name = "pack of peanut seeds"
+ desc = "These seeds grow to produce fruits botanically classified as legumes, but mundanely referred as nuts."
+ icon_state = "seed-peanut"
+ species = "peanut"
+ plantname = "Peanut Vines"
+ product = /obj/item/reagent_containers/food/snacks/grown/peanut
+ yield = 6
+ growthstages = 4
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list("vitamin" = 0.02, "nutriment" = 0.15, "cooking_oil" = 0.03)
+
+/obj/item/reagent_containers/food/snacks/grown/peanut
+ seed = /obj/item/seeds/peanutseed
+ name = "peanut"
+ desc = "Peanuts for the peanut gallery!" //get me a better description, boys.
+ icon_state = "peanut"
+ filling_color = "#C4AE7A"
+ bitesize = 100
+ foodtype = VEGETABLES
+ dried_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
+ cooked_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
+
+/obj/item/reagent_containers/food/snacks/roasted_peanuts
+ name = "roasted peanuts"
+ desc = "A handful of roasted peanuts, with or without salt."
+ icon_state = "roasted_peanuts"
+ foodtype = VEGETABLES
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+ juice_results = list("peanut_butter" = 3)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm
index 798e14db23..2711e44a98 100644
--- a/code/modules/mob/living/carbon/say.dm
+++ b/code/modules/mob/living/carbon/say.dm
@@ -40,10 +40,21 @@
else
. = initial(dt.flags) & TONGUELESS_SPEECH
-/mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
. = ..()
if(!client)
return
for(var/T in get_traumas())
var/datum/brain_trauma/trauma = T
message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
+
+ if (src.mind.has_antag_datum(/datum/antagonist/traitor))
+ for (var/codeword in GLOB.syndicate_code_phrase)
+ var/regex/codeword_match = new("([codeword])", "ig")
+ message = codeword_match.Replace(message, "$1")
+
+ for (var/codeword in GLOB.syndicate_code_response)
+ var/regex/codeword_match = new("([codeword])", "ig")
+ message = codeword_match.Replace(message, "$1")
+
+ return message
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index b0383c068f..93bc059533 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -229,9 +229,14 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// Recompose message for AI hrefs, language incomprehension.
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
+ message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
+
show_message(message, 2, deaf_message, deaf_type)
return message
+/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+ return message
+
/mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode)
var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE)
var/eavesdrop_range = 0
@@ -390,8 +395,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
else
. = ..()
-/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
- say("#[message]", bubble_type, spans, sanitize, language)
+/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
+ say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced)
/mob/living/get_language_holder(shadow=TRUE)
if(mind && shadow)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e71e269222..29fbd39e2c 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -580,6 +580,19 @@
else
return ..()
+/mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/I) //TODO: make fucking everything up there in that attackby() proc use the proper tool_act() procs. But honestly, who has time for that? 'cause I know for sure that you, the person reading this, sure as hell doesn't.
+ var/validbreakout = FALSE
+ for(var/obj/item/dogborg/sleeper/S in held_items)
+ if(!LAZYLEN(S.contents))
+ continue
+ if(!validbreakout)
+ visible_message("[user] wedges [I] into the crevice separating [S] from [src]'s chassis, and begins to pry...", "You wedge [I] into the crevice separating [S] from [src]'s chassis, and begin to pry...")
+ validbreakout = TRUE
+ S.go_out()
+ if(validbreakout)
+ return TRUE
+ return ..()
+
/mob/living/silicon/robot/verb/unlock_own_cover()
set category = "Robot Commands"
set name = "Unlock Cover"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index b2cec3cdd3..d6306148d4 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -441,6 +441,14 @@
. = 1
..()
+/datum/reagent/consumable/peanut_butter
+ name = "Peanut Butter"
+ id = "peanut_butter"
+ description = "A popular food paste made from ground dry-roasted peanuts."
+ color = "#C29261"
+ nutriment_factor = 15 * REAGENTS_METABOLISM
+ taste_description = "peanuts"
+
/datum/reagent/consumable/cornoil
name = "Corn Oil"
id = "cornoil"
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 80ecab19ec..e44437d225 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -418,7 +418,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 30
include_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/badass/rapid
+/datum/uplink_item/dangerous/rapid
name = "Gloves of the North Star"
desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk."
item = /obj/item/clothing/gloves/rapid
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index 9aa11c7bfb..4594048256 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -23,6 +23,7 @@
/obj/item/seeds/lime = 3,
/obj/item/seeds/onion = 3,
/obj/item/seeds/orange = 3,
+ /obj/item/seeds/peanutseed = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/potato = 3,
/obj/item/seeds/poppy = 3,
diff --git a/html/changelogs/AutoChangeLog-pr-8632.yml b/html/changelogs/AutoChangeLog-pr-8632.yml
new file mode 100644
index 0000000000..b2f74869c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8632.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - rscadd: "Traitor codewords are now highlighted for traitors."
diff --git a/html/changelogs/AutoChangeLog-pr-8663.yml b/html/changelogs/AutoChangeLog-pr-8663.yml
new file mode 100644
index 0000000000..3f5aeacd3c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8663.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Adding in peanuts, peanut butter, peanut butter toasts and sandwiches, and the PB&J sandwich.
+The peanuts contain a little bit of extractable cooking oil (similarly to soy beans) and can be microwaved or dried in a drying rack to make roasted peanuts, which can be mixed in a all-in-one-grinder for peanut butter, required to make those sandwiches."
diff --git a/html/changelogs/AutoChangeLog-pr-8790.yml b/html/changelogs/AutoChangeLog-pr-8790.yml
new file mode 100644
index 0000000000..0c0e6cd116
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8790.yml
@@ -0,0 +1,6 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - rscadd: "It's now possible to forcefully eject the occupants of a dogborg's sleeper by using a crowbar on them. This action is instant."
+ - tweak: "Resist values for dogborg sleepers have been adjusted. The baseline has been decreased from 30 seconds to 15 seconds. Medihound sleepers have a resist timer of 3 seconds. Sechound sleepers retain a resist timer of 30 seconds."
+ - tweak: "It now takes 10 full seconds to insert people into your sleeper. This should hopefully give people some more room to breathe and react to a dogborg attempting to sleeper someone either for no reason or in a way that violates law 2."
diff --git a/html/changelogs/AutoChangeLog-pr-8794.yml b/html/changelogs/AutoChangeLog-pr-8794.yml
new file mode 100644
index 0000000000..612a3e655b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8794.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixing the `(pointless) badassary` category appearing between the `dangerous and conspicious` and `stealthy and inconspicious` categories."
+ - bugfix: "Combat gloves plus now properly use the combat gloves sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-8805.yml b/html/changelogs/AutoChangeLog-pr-8805.yml
new file mode 100644
index 0000000000..8abefd9ce2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8805.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "supply display are now properly on the wall"
diff --git a/icons/emoji.dmi b/icons/emoji.dmi
index 128a3b243c..089c0ff3f8 100644
Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ
diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi
index c40dfaaa22..cd7fc1742b 100644
Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index ad3073a140..f64dfd4740 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 6292f7e21a..92b5203f5d 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi
index 9fc1520175..63cf069186 100644
Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 054aa47bbd..a1ab5b08e5 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 4c898aecd3..5a2088c332 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index ab03e83b44..347f1fffea 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -423,8 +423,15 @@ datum/gear/darksabresheath
path = /obj/item/clothing/under/trendy_fit
ckeywhitelist = list("midgetdragon")
+/datum/gear/singery
+ name = "Yellow Performer Outfit"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/singery
+ ckeywhitelist = list("maxlynchy")
+
/datum/gear/csheet
name = "NT Bedsheet"
category = SLOT_NECK
path = /obj/item/bedsheet/captain
- ckeywhitelist = list("tikibomb")
\ No newline at end of file
+ ckeywhitelist = list("tikibomb")
+
diff --git a/tgstation.dme b/tgstation.dme
index 301894f102..4d4a59ffb5 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1721,6 +1721,7 @@
#include "code\modules\hydroponics\grown\mushrooms.dm"
#include "code\modules\hydroponics\grown\nettle.dm"
#include "code\modules\hydroponics\grown\onion.dm"
+#include "code\modules\hydroponics\grown\peanuts.dm"
#include "code\modules\hydroponics\grown\pineapple.dm"
#include "code\modules\hydroponics\grown\potato.dm"
#include "code\modules\hydroponics\grown\pumpkin.dm"