Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit114
@@ -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
|
||||
},
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='warning'>Your [src] is already occupied.</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is carefully inserting [target.name] into their [src].</span>", "<span class='notice'>You start placing [target] into your [src]...</span>")
|
||||
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))
|
||||
|
||||
@@ -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,"<span class='userdanger'> You are no longer the [special_role]! </span>")
|
||||
@@ -244,14 +244,16 @@
|
||||
return
|
||||
var/mob/traitor_mob=owner.current
|
||||
|
||||
to_chat(traitor_mob, "<U><B>The Syndicate provided you with the following information on how to identify their agents:</B></U>")
|
||||
to_chat(traitor_mob, "<B>Code Phrase</B>: <span class='danger'>[GLOB.syndicate_code_phrase]</span>")
|
||||
to_chat(traitor_mob, "<B>Code Response</B>: <span class='danger'>[GLOB.syndicate_code_response]</span>")
|
||||
var/phrases = jointext(GLOB.syndicate_code_phrase, ", ")
|
||||
var/responses = jointext(GLOB.syndicate_code_response, ", ")
|
||||
|
||||
antag_memory += "<b>Code Phrase</b>: [GLOB.syndicate_code_phrase]<br>"
|
||||
antag_memory += "<b>Code Response</b>: [GLOB.syndicate_code_response]<br>"
|
||||
var/dat = "<U><B>The Syndicate have provided you with the following codewords to identify fellow agents:</B></U>\n"
|
||||
dat += "<B>Code Phrase</B>: <span class='blue'>[phrases]</span>\n"
|
||||
dat += "<B>Code Response</B>: <span class='red'>[responses]</span>"
|
||||
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 += "<b>Code Phrase</b>: <span class='blue'>[phrases]</span><br>"
|
||||
antag_memory += "<b>Code Response</b>: <span class='red'>[responses]</span><br>"
|
||||
|
||||
/datum/antagonist/traitor/proc/add_law_zero()
|
||||
var/mob/living/silicon/ai/killer = owner.current
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -322,6 +322,7 @@ h1.alert, h2.alert {color: #99aab5;}
|
||||
.unconscious {color: #a4bad6; font-weight: bold;}
|
||||
.suicide {color: #ff5050; font-style: italic;}
|
||||
.red {color: #FF0000}
|
||||
.pink {color: #ff70c1;}
|
||||
.blue {color: #215cff}
|
||||
.green {color: #059223;}
|
||||
.nicegreen {color: #059223;}
|
||||
|
||||
@@ -319,6 +319,7 @@ h1.alert, h2.alert {color: #000000;}
|
||||
.suicide {color: #ff5050; font-style: italic;}
|
||||
.green {color: #03ff39;}
|
||||
.red {color: #FF0000}
|
||||
.pink {color: #FF69Bf;}
|
||||
.blue {color: #0000FF}
|
||||
.nicegreen {color: #14a833;}
|
||||
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
|
||||
|
||||
@@ -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)
|
||||
@@ -39,10 +39,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)
|
||||
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, "<span class='blue'>$1</span>")
|
||||
|
||||
for (var/codeword in GLOB.syndicate_code_response)
|
||||
var/regex/codeword_match = new("([codeword])", "ig")
|
||||
message = codeword_match.Replace(message, "<span class='red'>$1</span>")
|
||||
|
||||
return message
|
||||
|
||||
@@ -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
|
||||
@@ -389,8 +394,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)
|
||||
|
||||
@@ -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("<span class='notice'>[user] wedges [I] into the crevice separating [S] from [src]'s chassis, and begins to pry...</span>", "<span class='notice'>You wedge [I] into the crevice separating [S] from [src]'s chassis, and begin to pry...</span>")
|
||||
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"
|
||||
|
||||
@@ -438,6 +438,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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Arturlang"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Traitor codewords are now highlighted for traitors."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Linzolle"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "supply display are now properly on the wall"
|
||||
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
@@ -3,7 +3,7 @@
|
||||
set category = "Mentor"
|
||||
set name = "Mentor PM"
|
||||
if(!is_mentor())
|
||||
to_chat(src, "<font color='red'>Error: Mentor-PM-Panel: Only Mentors and Admins may use this command.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Mentor-PM-Panel: Only Mentors and Admins may use this command.</span>")
|
||||
return
|
||||
var/list/client/targets[0]
|
||||
for(var/client/T)
|
||||
@@ -27,24 +27,24 @@
|
||||
else if(istype(whom,/client))
|
||||
C = whom
|
||||
if(!C)
|
||||
if(is_mentor()) to_chat(src, "<font color='red'>Error: Mentor-PM: Client not found.</font>")
|
||||
if(is_mentor()) to_chat(src, "<span class='danger'>Error: Mentor-PM: Client not found.</span>")
|
||||
else mentorhelp(msg) //Mentor we are replying to left. Mentorhelp instead(check below)
|
||||
return
|
||||
|
||||
if(is_mentor(whom))
|
||||
to_chat(GLOB.admins | GLOB.mentors, "<font color='purple'>[src] has started replying to [whom]'s mhelp.</font color>")
|
||||
to_chat(GLOB.admins | GLOB.mentors, "<font color='purple'>[src] has started replying to [whom]'s mhelp.</font>")
|
||||
|
||||
//get message text, limit it's length.and clean/escape html
|
||||
if(!msg)
|
||||
msg = input(src,"Message:", "Private message") as text|null
|
||||
|
||||
|
||||
if(!msg && is_mentor(whom))
|
||||
to_chat(GLOB.admins | GLOB.mentors, "<font color='purple'>[src] has stopped their reply to [whom]'s mhelp.</font color>")
|
||||
to_chat(GLOB.admins | GLOB.mentors, "<span class='purple'>[src] has stopped their reply to [whom]'s mhelp.</span>")
|
||||
return
|
||||
|
||||
if(!C)
|
||||
if(is_mentor())
|
||||
to_chat(src, "<font color='red'>Error: Mentor-PM: Client not found.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Mentor-PM: Client not found.</span>")
|
||||
else
|
||||
mentorhelp(msg) //Mentor we are replying to has vanished, Mentorhelp instead (how the fuck does this work?let's hope it works,shrug)
|
||||
return
|
||||
@@ -54,8 +54,8 @@
|
||||
return
|
||||
|
||||
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
|
||||
if(!msg && is_mentor(whom))
|
||||
to_chat(GLOB.admins | GLOB.mentors, "<font color='purple'>[src] has stopped their reply to [whom]'s mhelp.</font color>")
|
||||
if(!msg && is_mentor(whom))
|
||||
to_chat(GLOB.admins | GLOB.mentors, "<span class='purple'>[src] has stopped their reply to [whom]'s mhelp.</span>")
|
||||
return
|
||||
|
||||
log_mentor("Mentor PM: [key_name(src)]->[key_name(C)]: [msg]")
|
||||
@@ -65,21 +65,21 @@
|
||||
var/show_char = CONFIG_GET(flag/mentors_mobname_only)
|
||||
if(C.is_mentor())
|
||||
if(is_mentor())//both are mentors
|
||||
to_chat(C, "<font color='purple'>Mentor PM from-<b>[key_name_mentor(src, C, 1, 0, 0)]</b>: [msg]</font>")
|
||||
to_chat(src, "<font color='green'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, 0)]</b>: [msg]</font>")
|
||||
to_chat(C, "<span class='purple'>Mentor PM from-<b>[key_name_mentor(src, C, 1, 0, 0)]</b>: [msg]</span>")
|
||||
to_chat(src, "<span class='green'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, 0)]</b>: [msg]</font>")
|
||||
|
||||
else //recipient is an mentor but sender is not
|
||||
to_chat(C, "<font color='purple'>Reply PM from-<b>[key_name_mentor(src, C, 1, 0, show_char)]</b>: [msg]</font>")
|
||||
to_chat(src, "<font color='brown'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, 0)]</b>: [msg]</font>")
|
||||
else //recipient is a mentor but sender is not
|
||||
to_chat(C, "<span class='purple'>Reply PM from-<b>[key_name_mentor(src, C, 1, 0, show_char)]</b>: [msg]</span>")
|
||||
to_chat(src, "<span class='pink'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, 0)]</b>: [msg]</span>")
|
||||
|
||||
else
|
||||
if(is_mentor()) //sender is an mentor but recipient is not.
|
||||
to_chat(C, "<font color='purple'>Mentor PM from-<b>[key_name_mentor(src, C, 1, 0, 0)]</b>: [msg]</font>")
|
||||
to_chat(src, "<font color='brown'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, show_char)]</b>: [msg]</font>")
|
||||
if(is_mentor()) //sender is a mentor but recipient is not.
|
||||
to_chat(C, "<span class='purple'>Mentor PM from-<b>[key_name_mentor(src, C, 1, 0, 0)]</b>: [msg]</span>")
|
||||
to_chat(src, "<span class='pink'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, show_char)]</b>: [msg]</span>")
|
||||
|
||||
//we don't use message_Mentors here because the sender/receiver might get it too
|
||||
var/show_char_sender = !is_mentor() && CONFIG_GET(flag/mentors_mobname_only)
|
||||
var/show_char_recip = !C.is_mentor() && CONFIG_GET(flag/mentors_mobname_only)
|
||||
for(var/client/X in GLOB.mentors | GLOB.admins)
|
||||
if(X.key!=key && X.key!=C.key) //check client/X is an Mentor and isn't the sender or recipient
|
||||
to_chat(X, "<B><font color='brown'>Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]:</B> <font color ='blue'> [msg]</font>") //inform X
|
||||
to_chat(X, "<B><span class='pink'>Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]:</span></B> <span class='blue'>[msg]</span>") //inform X
|
||||
|
||||
@@ -1720,6 +1720,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"
|
||||
|
||||