diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm
index f816c0317f4c..14f0c8829dd9 100644
--- a/code/__DEFINES/chat.dm
+++ b/code/__DEFINES/chat.dm
@@ -36,4 +36,8 @@
/// Used for debug messages to the server
#define debug2_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]")
/// Adds a generic box around whatever message you're sending in chat. Really makes things stand out.
-#define examine_block(str) ("
" + str + "
")
+#define boxed_message(str) ("
" + str + "
")
+/// Adds a box around whatever message you're sending in chat. Can apply color and/or additional classes. Available colors: red, green, blue, purple. Use it like red_box
+#define custom_boxed_message(classes, str) ("
" + str + "
")
+/// Makes a fieldset with a neaty styled name. Can apply additional classes.
+#define fieldset_block(title, content, classes) ("")
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 2b3ac0619c5a..3961a854cf15 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -351,7 +351,7 @@ SUBSYSTEM_DEF(ticker)
m = pick(memetips)
if(m)
- to_chat(world, span_purple(examine_block("Tip of the round: [html_encode(m)]")))
+ to_chat(world, span_purple(boxed_message("Tip of the round: [html_encode(m)]")))
/datum/controller/subsystem/ticker/proc/check_queue()
if(!queued_players.len)
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 03c244ae05d2..476d9fcc9dce 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -87,7 +87,7 @@ SUBSYSTEM_DEF(vote)
var/log_string = replacetext(to_display, "\n", "\\n") // 'keep' the newlines, but dont actually print them as newlines
log_vote(log_string)
- to_chat(world, span_infoplain(vote_font("\n[to_display]")))
+ to_chat(world, span_infoplain(vote_font("[to_display]")))
// Finally, doing any effects on vote completion
if (final_winner) // if no one voted, or the vote cannot be won, final_winner will be null
@@ -209,9 +209,9 @@ SUBSYSTEM_DEF(vote)
var/to_display = current_vote.initiate_vote(vote_initiator_name, duration)
log_vote(to_display)
- to_chat(world, span_infoplain(vote_font("\n[span_bold(to_display)]\n\
+ to_chat(world, custom_boxed_message("purple_box center", span_infoplain(vote_font("[span_bold(to_display)] \
Type vote or click here to place your votes.\n\
- You have [DisplayTimeText(duration)] to vote.")))
+ You have [DisplayTimeText(duration)] to vote."))))
// And now that it's going, give everyone a voter action
for(var/client/new_voter as anything in GLOB.clients)
@@ -344,6 +344,7 @@ SUBSYSTEM_DEF(vote)
/datum/action/vote
name = "Vote!"
button_icon_state = "vote"
+ background_icon_state = "bg_blink"
/datum/action/vote/IsAvailable()
return TRUE // Democracy is always available to the free people
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index a37fd00c3b5b..130cf3572ebc 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -92,7 +92,7 @@
msg += "[event.description]\n" // now we dont have to put \n in every moodlet description
else
msg += "I don't have much of a reaction to anything right now.\n"
- to_chat(user, examine_block(msg))
+ to_chat(user, boxed_message(msg))
///Called after moodevent/s have been added/removed.
/datum/component/mood/proc/update_mood()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index ea9f6918706b..1b0d456ebacd 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -247,7 +247,7 @@
var/datum/skill/the_skill = i
msg += "[initial(the_skill.name)] - [get_skill_level_name(the_skill)]\n"
msg += ""
- to_chat(user, examine_block(msg))
+ to_chat(user, boxed_message(msg))
/datum/mind/proc/set_death_time()
SIGNAL_HANDLER
diff --git a/code/datums/votes/_vote_datum.dm b/code/datums/votes/_vote_datum.dm
index 7118695bf1bb..e387e7fba48e 100644
--- a/code/datums/votes/_vote_datum.dm
+++ b/code/datums/votes/_vote_datum.dm
@@ -169,13 +169,14 @@
* Return a formatted string of text to be displayed to everyone.
*/
/datum/vote/proc/get_result_text(list/all_winners, real_winner, list/non_voters)
+ var/title_text = ""
var/returned_text = ""
if(override_question)
- returned_text += span_bold(override_question)
+ title_text += span_bold(override_question)
else
- returned_text += span_bold("[capitalize(name)] Vote")
+ title_text += span_bold("[capitalize(name)] Vote")
- returned_text += "\nWinner Selection: "
+ returned_text += "Winner Selection: "
switch(winner_method)
if(VOTE_WINNER_METHOD_NONE)
returned_text += "None"
@@ -215,7 +216,7 @@
returned_text += "\n"
returned_text += get_winner_text(all_winners, real_winner, non_voters)
- return returned_text
+ return fieldset_block(title_text, returned_text, "boxed_message purple_box")
/**
* Gets the text that displays the winning options within the result text.
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 9bad37507a35..4b3c7a8eae08 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -450,7 +450,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/retro, 17)
wakeupmessage += " A sickly feeling along with the pangs of hunger greet you upon your awakening."
sleepyhead.set_nutrition(100)
sleepyhead.apply_effect(rand(3,10), EFFECT_DROWSY)
- to_chat(sleepyhead, span_danger(examine_block(wakeupmessage)))
+ to_chat(sleepyhead, span_danger(boxed_message(wakeupmessage)))
/obj/machinery/cryopod/syndicate
icon_state = "sleeper_s-open"
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
index c00938077751..91459a55c772 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
@@ -52,3 +52,7 @@
/obj/effect/projectile/impact/pgf/rifle
name = "beam impact"
icon_state = "impact_pgf_rifle"
+
+/obj/effect/projectile/impact/gauss
+ name = "gauss impact"
+ icon_state = "hc_gauss"
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
index b850681c713f..97646ae50e32 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -41,3 +41,6 @@
/obj/effect/projectile/muzzle/pgf/rifle
icon_state = "muzzle_pgf_rifle"
+
+/obj/effect/projectile/muzzle/gauss
+ icon_state = "muzzle_gauss_rifle"
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
index d7e867ed03ac..f0ab5580e2bc 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -79,3 +79,6 @@
/obj/effect/projectile/tracer/pgf/rifle
icon_state = "beam_pgf_rifle"
+
+/obj/effect/projectile/tracer/gauss
+ icon_state = "hc_gauss"
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 4df753123bba..a981d08fb05f 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -381,7 +381,7 @@ GENE SCANNER
SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE)
// we handled the last so we don't need handholding
- to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
+ to_chat(user, boxed_message(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
/proc/chemscan(mob/living/user, mob/living/M)
if(istype(M) && M.reagents)
@@ -399,7 +399,7 @@ GENE SCANNER
else
render_list += "Subject is not addicted to any reagents.\n"
// we handled the last so we don't need handholding
- to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
+ to_chat(user, boxed_message(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
/obj/item/healthanalyzer/verb/toggle_mode()
set name = "Switch Verbosity"
@@ -612,7 +612,7 @@ GENE SCANNER
\nInstability of the last fusion reaction: [round(cached_scan_results["fusion"], 0.01)]."
// we let the join apply newlines so we do need handholding
- to_chat(user, examine_block(jointext(render_list, "\n")), type = MESSAGE_TYPE_INFO)
+ to_chat(user, boxed_message(jointext(render_list, "\n")), type = MESSAGE_TYPE_INFO)
return TRUE
/obj/item/nanite_scanner
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 61d8b2757836..2406d7d51564 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -692,7 +692,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/datum/asset/fuckywucky = get_asset_datum(/datum/asset/simple/fuckywucky)
fuckywucky.send(m)
SEND_SOUND(m, 'sound/misc/fuckywucky.ogg')
- to_chat(m, span_purple(examine_block("")))
+ to_chat(m, span_purple(boxed_message("")))
addtimer(CALLBACK(src, PROC_REF(restore_fucky_wucky)), 600)
diff --git a/code/modules/buildmode/submodes/advanced.dm b/code/modules/buildmode/submodes/advanced.dm
index 4fd6f30ca52b..f9eb00250c46 100644
--- a/code/modules/buildmode/submodes/advanced.dm
+++ b/code/modules/buildmode/submodes/advanced.dm
@@ -6,7 +6,7 @@
// of the currently selected path
/datum/buildmode_mode/advanced/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Set object type")] -> Right Mouse Button on buildmode button\n\
[span_bold("Copy object type")] -> Left Mouse Button + Alt on turf/obj\n\
[span_bold("Place objects")] -> Left Mouse Button on turf/obj\n\
diff --git a/code/modules/buildmode/submodes/area_edit.dm b/code/modules/buildmode/submodes/area_edit.dm
index b0d8925c0c85..c16744213e86 100644
--- a/code/modules/buildmode/submodes/area_edit.dm
+++ b/code/modules/buildmode/submodes/area_edit.dm
@@ -22,7 +22,7 @@
return ..()
/datum/buildmode_mode/area_edit/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Select corner")] -> Left Mouse Button on obj/turf/mob\n\
[span_bold("Paint area")] -> Left Mouse Button + Alt on turf/obj/mob\n\
[span_bold("Select area to paint")] -> Right Mouse Button on obj/turf/mob\n\
diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm
index 180331e94ba8..b35a0b240ad1 100644
--- a/code/modules/buildmode/submodes/basic.dm
+++ b/code/modules/buildmode/submodes/basic.dm
@@ -2,7 +2,7 @@
key = "basic"
/datum/buildmode_mode/basic/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Construct / Upgrade")] -> Left Mouse Button\n\
[span_bold("Deconstruct / Delete / Downgrade")] -> Right Mouse Button\n\
[span_bold("R-Window")] -> Left Mouse Button + Ctrl\n\
diff --git a/code/modules/buildmode/submodes/boom.dm b/code/modules/buildmode/submodes/boom.dm
index f0837735c641..a2ba9cadeaf0 100644
--- a/code/modules/buildmode/submodes/boom.dm
+++ b/code/modules/buildmode/submodes/boom.dm
@@ -8,7 +8,7 @@
var/flames = -1
/datum/buildmode_mode/boom/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Set explosion destructiveness")] -> Right Mouse Button on buildmode button\n\
[span_bold("Kaboom")] -> Mouse Button on obj\n\n\
[span_warning("NOTE:")] Using the \"Config/Launch Supplypod\" verb allows you to do this in an IC way (i.e., making a cruise missile come down from the sky and explode wherever you click!)"))
diff --git a/code/modules/buildmode/submodes/copy.dm b/code/modules/buildmode/submodes/copy.dm
index 4ac7f9ec4796..6f555e9dc84c 100644
--- a/code/modules/buildmode/submodes/copy.dm
+++ b/code/modules/buildmode/submodes/copy.dm
@@ -7,7 +7,7 @@
return ..()
/datum/buildmode_mode/copy/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Spawn a copy of selected target")] -> Left Mouse Button on obj/turf/mob\n\
[span_bold("Select target to copy")] -> Right Mouse Button on obj/mob"))
)
diff --git a/code/modules/buildmode/submodes/delete.dm b/code/modules/buildmode/submodes/delete.dm
index 4ef4fe37156c..9d35dba3d779 100644
--- a/code/modules/buildmode/submodes/delete.dm
+++ b/code/modules/buildmode/submodes/delete.dm
@@ -2,7 +2,7 @@
key = "delete"
/datum/buildmode_mode/delete/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Delete an object")] -> Left Mouse Button on obj/turf/mob\n\
[span_bold("Delete all objects of a type")] -> Right Mouse Button on obj/turf/mob"))
)
diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm
index 75f4f2d221b7..20428738d7d6 100644
--- a/code/modules/buildmode/submodes/fill.dm
+++ b/code/modules/buildmode/submodes/fill.dm
@@ -7,7 +7,7 @@
var/atom/objholder = null
/datum/buildmode_mode/fill/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Select corner")] -> Left Mouse Button on turf/obj/mob\n\
[span_bold("Delete region")] -> Left Mouse Button + Alt on turf/obj/mob\n\
[span_bold("Select object type")] -> Right Mouse Button on buildmode button"))
diff --git a/code/modules/buildmode/submodes/lightmaker.dm b/code/modules/buildmode/submodes/lightmaker.dm
index 2b50343c641a..3b83ee64e4f9 100644
--- a/code/modules/buildmode/submodes/lightmaker.dm
+++ b/code/modules/buildmode/submodes/lightmaker.dm
@@ -6,7 +6,7 @@
var/light_color = COLOR_WHITE
/datum/buildmode_mode/lightmaker/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Left Click")] -> Create light\n\
[span_bold("Right Click")] -> Delete light\n\
[span_bold("Right Click on Build Mode Button")] -> Change light properties"))
diff --git a/code/modules/buildmode/submodes/outfit.dm b/code/modules/buildmode/submodes/outfit.dm
index 56faf5d507cc..d1bb144357a3 100644
--- a/code/modules/buildmode/submodes/outfit.dm
+++ b/code/modules/buildmode/submodes/outfit.dm
@@ -7,7 +7,7 @@
return ..()
/datum/buildmode_mode/outfit/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Select outfit to equip")] -> Right Mouse Button on buildmode button\n\
[span_bold("Equip the selected outfit")] -> Left Mouse Button on mob/living/carbon/human\n\
[span_bold("Strip and delete current outfit")] -> Right Mouse Button on mob/living/carbon/human"))
diff --git a/code/modules/buildmode/submodes/proccall.dm b/code/modules/buildmode/submodes/proccall.dm
index 47e7130aa386..996e5736aef0 100644
--- a/code/modules/buildmode/submodes/proccall.dm
+++ b/code/modules/buildmode/submodes/proccall.dm
@@ -6,7 +6,7 @@
var/list/proc_args = null
/datum/buildmode_mode/proccall/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Choose procedure and arguments")] -> Right Mouse Button on buildmode button\n\
[span_bold("Apply procedure on object")] -> Left Mouse Button on machinery"))
)
diff --git a/code/modules/buildmode/submodes/relocate_to.dm b/code/modules/buildmode/submodes/relocate_to.dm
index 3a2d52bc5d17..4d9f94ba21a8 100644
--- a/code/modules/buildmode/submodes/relocate_to.dm
+++ b/code/modules/buildmode/submodes/relocate_to.dm
@@ -8,7 +8,7 @@
return ..()
/datum/buildmode_mode/relocate_to/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Select")] -> Left Mouse Button on obj/mob\n\
[span_bold("Relocate")] -> Right Mouse Button on turf/obj/mob"))
)
diff --git a/code/modules/buildmode/submodes/throwing.dm b/code/modules/buildmode/submodes/throwing.dm
index 0539d2ec4f9f..14d843d1005b 100644
--- a/code/modules/buildmode/submodes/throwing.dm
+++ b/code/modules/buildmode/submodes/throwing.dm
@@ -8,7 +8,7 @@
return ..()
/datum/buildmode_mode/throwing/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Select")] -> Left Mouse Button on turf/obj/mob\n\
[span_bold("Throw")] -> Right Mouse Button on turf/obj/mob"))
)
diff --git a/code/modules/buildmode/submodes/tweakcomps.dm b/code/modules/buildmode/submodes/tweakcomps.dm
index 4072f8dd8f2f..cab04143707a 100644
--- a/code/modules/buildmode/submodes/tweakcomps.dm
+++ b/code/modules/buildmode/submodes/tweakcomps.dm
@@ -4,7 +4,7 @@
var/rating = null
/datum/buildmode_mode/tweakcomps/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Choose the rating of the components")] -> Right Mouse Button on buildmode button\n\
[span_bold("Sets the chosen rating of the components on the machinery")] -> Left Mouse Button on machinery"))
)
diff --git a/code/modules/buildmode/submodes/variable_edit.dm b/code/modules/buildmode/submodes/variable_edit.dm
index 728c909860b5..25c0ab8d394a 100644
--- a/code/modules/buildmode/submodes/variable_edit.dm
+++ b/code/modules/buildmode/submodes/variable_edit.dm
@@ -10,7 +10,7 @@
return ..()
/datum/buildmode_mode/varedit/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
+ to_chat(target_client, span_purple(boxed_message(
"[span_bold("Select var(type) & value")] -> Right Mouse Button on buildmode button\n\
[span_bold("Set var(type) & value")] -> Left Mouse Button on turf/obj/mob\n\
[span_bold("Reset var's value")] -> Right Mouse Button on turf/obj/mob"))
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index 077d5f49a683..54a555997568 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -424,6 +424,12 @@
contains = list(/obj/item/storage/box/ammo/ferropellet)
cost = 250
+/datum/supply_pack/ammo/hcpellets
+ name = "High Conductivity Pellet Box Crate"
+ desc = "Contains a 48-round high conductivity pellet ammo box for gauss guns such as the Claris."
+ contains = list(/obj/item/storage/box/ammo/ferropellet/hc)
+ cost = 500
+
/* ferroslugs */
/datum/supply_pack/ammo/ferroslugboxcrate
@@ -432,6 +438,12 @@
contains = list(/obj/item/storage/box/ammo/ferroslug)
cost = 250
+/datum/supply_pack/ammo/hcslugs
+ name = "High Conductivity Slug Box Crate"
+ desc = "Contains a twenty-round high conductivity slug for gauss guns such as the Model-H."
+ contains = list(/obj/item/storage/box/ammo/ferroslug/hc)
+ cost = 500
+
/* ferro lances */
/datum/supply_pack/ammo/ferrolanceboxcrate
@@ -439,3 +451,9 @@
desc = "Contains a 48-round box for high-powered gauss guns such as the GAR assault rifle."
contains = list(/obj/item/storage/box/ammo/ferrolance)
cost = 250
+
+/datum/supply_pack/ammo/ferrolanceboxcrate
+ name = "High Conductivity Lance Box Crate"
+ desc = "Contains a 48-round box for high-powered gauss guns such as the GAR assault rifle."
+ contains = list(/obj/item/storage/box/ammo/ferrolance/hc)
+ cost = 500
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 4f2b2420ee55..482a8aae3c89 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -81,7 +81,7 @@
if(reag_txt)
msg += reag_txt
- to_chat(user, examine_block(msg))
+ to_chat(user, boxed_message(msg))
else
if(seed)
for(var/datum/plant_gene/trait/T in seed.genes)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 8ab59cc6f658..58a317319774 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -40,7 +40,7 @@
var/msg = "This is \a [src]\n"
if(seed)
msg += seed.get_analyzer_text()
- to_chat(usr, examine_block(msg))
+ to_chat(usr, boxed_message(msg))
return
/obj/item/grown/proc/add_juice()
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 13faaf5f15a5..ca857e88dcca 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -570,7 +570,7 @@
msg += "Toxicity level: [span_notice("[toxic] / [HYDRO_MAX_TOXIC]")]\n"
msg += "Water level: [span_notice("[waterlevel] / [maxwater]")]\n"
msg += "Nutrition level: [span_notice("[reagents.total_volume] / [maxnutri]")]\n"
- to_chat(user, examine_block(msg))
+ to_chat(user, boxed_message(msg))
return
else if(istype(O, /obj/item/cultivator))
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 65f47357899a..e02c3f197394 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -444,7 +444,7 @@
for(var/datum/plant_gene/reagent/Gene in genes)
msg += "\n- [Gene.get_name()] -"
msg += "\n*---------*"
- to_chat(user, examine_block(msg))
+ to_chat(user, boxed_message(msg))
return
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 081c94f4a8f9..4f3857841d7a 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -861,7 +861,7 @@
if(roundstart_quirks.len)
combined_msg += "You have these quirks: [get_trait_string()]."
- to_chat(src, examine_block(combined_msg.Join("\n")))
+ to_chat(src, boxed_message(combined_msg.Join("\n")))
/mob/living/carbon/human/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone)
if(damage_type != BRUTE && damage_type != BURN)
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index aad4a7a63f86..c452810e9892 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -261,20 +261,18 @@
mode = BOT_IDLE
return
- if(target && (!path || path.len == 0) && (get_dist(src,target) > 1))
+ if(!path || path.len == 0) //No path, need a new one
+ //Try to produce a path to the target, and ignore airlocks to which it has access.
path = get_path_to(src, target, 30, id=access_card)
- mode = BOT_MOVING
- if(!path.len) //try to get closer if you can't reach the target directly
- path = get_path_to(src, target, 30, id=access_card)
- if(!path.len) //Do not chase a target we cannot reach.
- add_to_ignore(target)
- target = null
- path = list()
-
- if(path.len > 0 && target)
- if(!bot_move(path[path.len]))
+ if(!bot_move(target))
+ add_to_ignore(target)
target = null
- mode = BOT_IDLE
+ path = list()
+ return
+ mode = BOT_MOVING
+ else if(!bot_move(target))
+ target = null
+ mode = BOT_IDLE
return
oldloc = loc
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index eb3ee07a322b..c0af36bc9f33 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -512,7 +512,7 @@
for(var/i in 1 to (length(result) - 1))
result[i] += "\n"
- to_chat(src, examine_block("[result.Join()]"))
+ to_chat(src, boxed_message("[result.Join()]"))
SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, examinify)
diff --git a/code/modules/projectiles/ammunition/special/gauss.dm b/code/modules/projectiles/ammunition/special/gauss.dm
index 0370d95051c4..04eb57fd4b73 100644
--- a/code/modules/projectiles/ammunition/special/gauss.dm
+++ b/code/modules/projectiles/ammunition/special/gauss.dm
@@ -8,6 +8,16 @@
firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/gauss
var/energy_cost = 100
+/obj/item/ammo_casing/caseless/gauss/hc
+ name = "high conductivity pellet"
+ desc = "A small crystal-metal pellet."
+ caliber = "pellet"
+ icon_state = "hc-pellet"
+ projectile_type = /obj/projectile/bullet/gauss/hc
+ auto_rotate = FALSE
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/gauss
+ energy_cost = 200
+
/obj/item/ammo_casing/caseless/gauss/lance
name = "ferromagnetic lance"
desc = "A sharp metal rod."
@@ -17,6 +27,16 @@
auto_rotate = TRUE
energy_cost = 166
+/obj/item/ammo_casing/caseless/gauss/lance/hc
+ name = "high conductivity lance"
+ desc = "A sharp crystal-metal lance."
+ caliber = "lance"
+ icon_state = "hc-lance"
+ projectile_type = /obj/projectile/bullet/gauss/lance/hc
+ auto_rotate = FALSE
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/gauss
+ energy_cost = 332
+
/obj/item/ammo_casing/caseless/gauss/slug
name = "ferromagnetic slug"
desc = "A large metal slug."
@@ -25,3 +45,13 @@
projectile_type = /obj/projectile/bullet/gauss/slug
auto_rotate = TRUE
energy_cost = 700
+
+/obj/item/ammo_casing/caseless/gauss/slug/hc
+ name = "high conductivity lance"
+ desc = "A large crystal-metal slug."
+ caliber = "slug"
+ icon_state = "hc-slug"
+ projectile_type = /obj/projectile/bullet/gauss/slug/hc
+ auto_rotate = FALSE
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/gauss
+ energy_cost = 1400
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm
index a64e075dfa84..b7a2dfc86299 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm
@@ -11,6 +11,19 @@
/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet = 4)
generate_items_inside(items_inside,src)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet/hc
+ ammo_type = /obj/item/ammo_casing/caseless/gauss/hc
+
+/obj/item/storage/box/ammo/ferropellet/hc
+ name = "box of high conductivity pellets"
+ desc = "A box of high conductivity pellets for gauss firearms."
+ icon_state = "ferropelletsbox"
+
+/obj/item/storage/box/ammo/ferropellet/hc/PopulateContents()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet/hc = 4)
+ generate_items_inside(items_inside,src)
+
/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug
ammo_type = /obj/item/ammo_casing/caseless/gauss/slug
@@ -24,6 +37,19 @@
/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug = 4)
generate_items_inside(items_inside,src)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug/hc
+ ammo_type = /obj/item/ammo_casing/caseless/gauss/slug/hc
+
+/obj/item/storage/box/ammo/ferroslug/hc
+ name = "box of high conductivity slugs"
+ desc = "A box of high conductivity slugs for gauss firearms."
+ icon_state = "ferroslugsbox"
+
+/obj/item/storage/box/ammo/ferroslug/hc/PopulateContents()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug/hc = 4)
+ generate_items_inside(items_inside,src)
+
/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance
ammo_type = /obj/item/ammo_casing/caseless/gauss/lance
@@ -36,3 +62,16 @@
var/static/items_inside = list(
/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance = 4)
generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance/hc
+ ammo_type = /obj/item/ammo_casing/caseless/gauss/lance/hc
+
+/obj/item/storage/box/ammo/ferrolance/hc
+ name = "box of high conductivity lances"
+ desc = "A box of high conductivity lances for gauss firearms."
+ icon_state = "ferrolancesbox"
+
+/obj/item/storage/box/ammo/ferrolance/hc/PopulateContents()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance/hc = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/projectile/bullets/gauss.dm b/code/modules/projectiles/projectile/bullets/gauss.dm
index 6011adb61c88..4d17e6256cfb 100644
--- a/code/modules/projectiles/projectile/bullets/gauss.dm
+++ b/code/modules/projectiles/projectile/bullets/gauss.dm
@@ -9,6 +9,16 @@
light_color = MOVABLE_LIGHT
light_range = 3
+/obj/projectile/bullet/gauss/hc
+ name = "ferromagnetic pellet"
+ damage = 10
+ armour_penetration = 60
+ range = 35
+ hitscan = TRUE
+ muzzle_type = /obj/effect/projectile/muzzle/gauss
+ tracer_type = /obj/effect/projectile/tracer/gauss
+ impact_type = /obj/effect/projectile/impact/gauss
+
// Ferromagnetic Lance (GAR AR)
/obj/projectile/bullet/gauss/lance
@@ -17,6 +27,16 @@
damage = 30
armour_penetration = 20
+/obj/projectile/bullet/gauss/lance/hc
+ name = "ferromagnetic lance"
+ damage = 15
+ armour_penetration = 80
+ range = 35
+ hitscan = TRUE
+ muzzle_type = /obj/effect/projectile/muzzle/gauss
+ tracer_type = /obj/effect/projectile/tracer/gauss
+ impact_type = /obj/effect/projectile/impact/gauss
+
// Ferromagnetic Slug (Model H)
/obj/projectile/bullet/gauss/slug
@@ -25,3 +45,13 @@
damage = 50
armour_penetration = -60
speed = 0.8
+
+/obj/projectile/bullet/gauss/slug/hc
+ name = "ferromagnetic lance"
+ damage = 25
+ armour_penetration = 0
+ range = 35
+ hitscan = TRUE
+ muzzle_type = /obj/effect/projectile/muzzle/gauss
+ tracer_type = /obj/effect/projectile/tracer/gauss
+ impact_type = /obj/effect/projectile/impact/gauss
diff --git a/html/changelogs/AutoChangeLog-pr-3994.yml b/html/changelogs/AutoChangeLog-pr-3994.yml
new file mode 100644
index 000000000000..f0a6e3cdf5b5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3994.yml
@@ -0,0 +1,7 @@
+author: Aylong
+changes:
+ - {rscadd: Added a blinking background icon to vote action buttons}
+ - {rscadd: Added boxed message blocks and fieldset message blocks}
+ - {rscadd: Added a boxed message block for votes and a fieldset message block for
+ vote results}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-4028.yml b/html/changelogs/AutoChangeLog-pr-4028.yml
new file mode 100644
index 000000000000..897a2f04de12
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4028.yml
@@ -0,0 +1,4 @@
+author: Erikafox
+changes:
+ - {rscadd: You can now purchase high conductivity gauss rounds from the outpost.}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-4052.yml b/html/changelogs/AutoChangeLog-pr-4052.yml
new file mode 100644
index 000000000000..a15c210dcc0b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4052.yml
@@ -0,0 +1,5 @@
+author: FalloutFalcon
+changes:
+ - {refactor: lightly refactors the get path section of the cleanbot ai. Has the
+ byproduct of stoping the linter fail.}
+delete-after: true
diff --git a/icons/obj/ammunition/ammo_bullets.dmi b/icons/obj/ammunition/ammo_bullets.dmi
index 6ac65ff5bb66..9a35253de3bc 100644
Binary files a/icons/obj/ammunition/ammo_bullets.dmi and b/icons/obj/ammunition/ammo_bullets.dmi differ
diff --git a/icons/obj/projectiles_impact.dmi b/icons/obj/projectiles_impact.dmi
index 543aea109b41..575a5e1c5699 100644
Binary files a/icons/obj/projectiles_impact.dmi and b/icons/obj/projectiles_impact.dmi differ
diff --git a/icons/obj/projectiles_muzzle.dmi b/icons/obj/projectiles_muzzle.dmi
index b8f311e2dea4..afce0784edf2 100644
Binary files a/icons/obj/projectiles_muzzle.dmi and b/icons/obj/projectiles_muzzle.dmi differ
diff --git a/icons/obj/projectiles_tracer.dmi b/icons/obj/projectiles_tracer.dmi
index 167e456e1573..d7d0147747f8 100644
Binary files a/icons/obj/projectiles_tracer.dmi and b/icons/obj/projectiles_tracer.dmi differ
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index 1acd0cf0094c..3c94228d5757 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -39,6 +39,10 @@ a.popt {
text-decoration: none;
}
+.center {
+ text-align: center;
+}
+
/* POPUPS */
.popup {
@@ -703,6 +707,10 @@ em {
font-size: 60%;
}
+.smallish {
+ font-size: 80%;
+}
+
.big {
font-size: 185%;
}
@@ -895,14 +903,68 @@ em {
margin-left: 3em;
}
-.examine_block {
- background: #1b1c1e;
- border: 1px solid #a4bad6;
- margin: 0.5em;
- padding: 0.5em 0.75em;
-}
-
.tooltip {
font-style: italic;
border-bottom: 1px dashed #fff;
}
+
+.fieldset_legend {
+ position: relative;
+ max-width: 95%;
+ font-size: 120%;
+ padding: 0.2em 0.5em;
+ background: #151515; // Chat background color
+ border: 1px solid;
+ border-color: inherit;
+ border-radius: 0.33em;
+ z-index: 1;
+
+ // "Mask" a half of the border
+ // It very rough but it only possible way i see with IE compat
+ // Replace it with normal mask-image when 516 got stable
+ &:before {
+ content: '';
+ position: absolute;
+ left: 0;
+ height: 1.15em;
+ width: 100%;
+ background: #151515; // Chat background color
+ transform: translateY(-50%) scaleX(1.05);
+ z-index: -1;
+ }
+}
+
+.boxed_message {
+ background: hsl(220, 10%, 10%);
+ border: 2px solid;
+ border-left: 5px solid;
+ border-color: hsla(220, 40%, 75%, 0.25);
+ margin: 0.5em 0;
+ padding: 0.5em 0.75em;
+ border-radius: 0.33em;
+
+ &.red_box {
+ background: hsl(0, 20%, 10%);
+ border-color: hsla(0, 100%, 50%, 0.5);
+ }
+
+ &.green_box {
+ background: hsl(140, 20%, 10%);
+ border-color: hsla(120, 100%, 50%, 0.5);
+ }
+
+ &.blue_box {
+ background: hsl(220, 20%, 10%);
+ border-color: hsla(225, 90%, 65%, 0.5);
+ }
+
+ &.purple_box {
+ background: hsl(260, 25%, 12.5%);
+ border-color: hsla(260, 100%, 75%, 0.5);
+ }
+
+ hr {
+ margin: 0.5em -0.75em;
+ border-color: inherit;
+ }
+}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index 49ccc958d5cf..219a0ebc853a 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -942,14 +942,40 @@ h2.alert {
margin-left: 3em;
}
-.examine_block {
- background: #f2f7fa;
- border: 1px solid #111a27;
- margin: 0.5em;
- padding: 0.5em 0.75em;
-}
-
.tooltip {
font-style: italic;
border-bottom: 1px dashed #000;
}
+
+.fieldset_legend {
+ background: #ffffff; // Chat background color
+
+ &:before {
+ background: #ffffff; // Chat background color
+ }
+}
+
+.boxed_message {
+ background: hsl(220, 100%, 97.5%);
+ border-color: hsla(220, 75%, 25%, 0.5);
+
+ &.red_box {
+ background: hsl(0, 100%, 97.5%);
+ border-color: hsla(0, 100%, 50%, 0.5);
+ }
+
+ &.green_box {
+ background: hsl(140, 100%, 97.5%);
+ border-color: hsl(120, 100%, 33%, 0.5);
+ }
+
+ &.blue_box {
+ background: hsl(220, 100%, 97.5%);
+ border-color: hsla(225, 100%, 50%, 0.5);
+ }
+
+ &.purple_box {
+ background: hsl(260, 100%, 97.5%);
+ border-color: hsla(260, 100%, 50%, 0.5);
+ }
+}