+
+ [totalmaps > 1 ? "
Layer [i]
" : ""]
-
+ [totalmaps <= 1 ? "
" : ""]
"}
datas += json_encode(M.color_area_names);
+ buttonfield += "
Layer [i] "
+
+ if(totalmaps > 1)
+ info += "
"
+
+ //This is a hacky workaround; the status display is extremely buggy when multiple z-levels are present. We couldn't figure out how to fix this after 7 hours of banging our head against the wall
+ //We're coder
+ var/mousemove_bit = {"
+ canvas.onmousemove = function(e){
+ var rect = canvas.getBoundingClientRect();
+ var x = Math.floor(e.offsetX * img.width / rect.width);
+ var y = Math.floor(e.offsetY * img.height / rect.height);
+
+ var color_idx = x * 4 + (y * 4 * imagedata.width);
+ var color = "#" + hexify(imagedata.data\[color_idx]) + hexify(imagedata.data\[color_idx+1]) + hexify(imagedata.data\[color_idx+2]);
+
+ label.textContent = data\[color];
+ canvas.title = data\[color];
+ }
+ canvas.onmouseout = function(e){
+ label.textContent = " ";
+ canvas.title = "";
+ }
+ "}
info = info.Join()
//this is bad. Too bad!
@@ -133,6 +181,14 @@
}
return num;
}
+ function switchmap(mapid) {
+ var targetblock = document.getElementById(mapid);
+ for(var i = 0; i < [length(minimaps)]; i++) {
+ var currentblock = document.getElementById("layer-" + (i + 1));
+ currentblock.style.display = 'none';
+ }
+ targetblock.style.display = '';
+ }
window.onload = function() {
if(!window.HTMLCanvasElement) {
var label = document.getElementById("label-1");
@@ -150,6 +206,7 @@
var canvas = document.createElement("canvas");
canvas.width = img.width * 2;
canvas.height = img.height * 2;
+ canvas.id = "canvas-" + (i+1);
var ctx = canvas.getContext('2d');
ctx.msImageSmoothingEnabled = false;
@@ -158,31 +215,23 @@
ctx = document.createElement("canvas").getContext('2d');
ctx.canvas.width = img.width;
ctx.canvas.height = img.height;
+ ctx.id = "ctx-" + (i+1);
ctx.drawImage(document.getElementById("map-" + (i+1) + "-meta"), 0, 0);
var imagedata = ctx.getImageData(0, 0, img.width, img.height);
- canvas.onmousemove = function(e){
- var rect = canvas.getBoundingClientRect();
- var x = Math.floor(e.offsetX * img.width / rect.width);
- var y = Math.floor(e.offsetY * img.height / rect.height);
-
- var color_idx = x * 4 + (y * 4 * imagedata.width);
- var color = "#" + hexify(imagedata.data\[color_idx]) + hexify(imagedata.data\[color_idx+1]) + hexify(imagedata.data\[color_idx+2]);
- var label = document.getElementById("label-" + (i+1)); //label-String(n)
-
- label.textContent = data\[color];
- canvas.title = data\[color];
- }
- canvas.onmouseout = function(e){
- canvas.title = "";
- }
+ var label = document.getElementById("label-" + (i+1)); //label-String(n);
+ [totalmaps <= 1 ? mousemove_bit : ""]
}
}
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index a9233938ab..378313311e 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -24,6 +24,9 @@
var/rando_race = pick(GLOB.roundstart_races)
pref_species = new rando_race()
features = random_features(pref_species?.id, gender)
+ bark_id = pick(GLOB.bark_random_list)
+ bark_pitch = BARK_PITCH_RAND(gender)
+ bark_variance = BARK_VARIANCE_RAND
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon(current_tab)
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 9f85b94d03..2ef3aa36a6 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -157,11 +157,11 @@
. += ""
. += "
[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]."
- SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
-
- if(length(.) > 1)
+ if(LAZYLEN(.) > 1)
.[1] += "
"
+ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
+
/mob/living/carbon/examine_more(mob/user)
if(!all_scars)
return ..()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 5a9a2ebf62..edb5de8188 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -516,10 +516,10 @@
else if(isobserver(user) && traitstring)
. += "
Traits: [traitstring]"
- SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now
+ if(LAZYLEN(.) > 2) //Want this to appear after species text
+ .[2] += "
"
- if(length(.) > 1)
- .[1] += "
"
+ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
var/list/dat = list()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index e79a887dad..3f5b8819be 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -597,18 +597,18 @@
var/no_damage
if(status == "OK" || status == "no damage")
no_damage = TRUE
- to_send += "\t
Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n"
+ to_send += "
Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n"
for(var/thing in LB.wounds)
var/datum/wound/W = thing
var/msg
switch(W.severity)
if(WOUND_SEVERITY_TRIVIAL)
- msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]."
+ msg = "
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]."
if(WOUND_SEVERITY_MODERATE)
- msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
+ msg = "
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
if(WOUND_SEVERITY_SEVERE)
- msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
+ msg = "
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
if(WOUND_SEVERITY_CRITICAL)
msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!!"
to_send += "\n[msg]"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index f9fcb35377..735f271133 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -308,8 +308,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
AM.Hear(rendered, src, message_language, message, null, spans, message_mode, source)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message)
- if(client && !eavesdrop_range && say_test(message) == "2") // Yell hook
- process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source)
+ var/is_yell = (say_test(message) == "2")
+ if(client && !eavesdrop_range && is_yell) // Yell hook
+ listening |= process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source)
//speech bubble
var/list/speech_bubble_recipients = list()
@@ -320,6 +321,22 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30)
+ //Listening gets trimmed here if a vocal bark's present. If anyone ever makes this proc return listening, make sure to instead initialize a copy of listening in here to avoid wonkiness
+ if(vocal_bark || vocal_bark_id)
+ for(var/mob/M in listening)
+ if(!M.client)
+ continue
+ if(!(M.client.prefs.toggles & SOUND_BARK))
+ listening -= M
+ var/barks = min(round((LAZYLEN(message) / vocal_speed)) + 1, BARK_MAX_BARKS)
+ var/total_delay
+ for(var/i in 1 to barks)
+ if(total_delay > BARK_MAX_TIME)
+ break
+ addtimer(CALLBACK(src, /atom/movable/proc/bark, listening, (message_range * (is_yell ? 4 : 1)), (vocal_volume * (is_yell ? 1.5 : 1)), BARK_DO_VARY(vocal_pitch, vocal_pitch_range)), total_delay)
+ total_delay += rand(DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1)), DS2TICKS(vocal_speed / BARK_SPEED_BASELINE) + DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1))) TICKS
+
+
/atom/movable/proc/process_yelling(list/already_heard, rendered, atom/movable/speaker, datum/language/message_language, message, list/spans, message_mode, obj/source)
if(last_yell > (world.time - 10))
to_chat(src, "
Your voice doesn't project as far as you try to yell in such quick succession.") // yeah no, no spamming an expensive floodfill.
@@ -344,6 +361,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/atom/movable/AM = _AM
AM.Hear(rendered, speaker, message_language, message, null, spans, message_mode, source)
+ return overhearing
+
/mob/proc/binarycheck()
return FALSE
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index 2a68668889..cb32b5c893 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -18,7 +18,7 @@
else if (!shunted && !client)
. += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..."
if(length(.) > 1)
- .[1] += "\n
"
+ .[1] += "
"
. += ""
diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm
index 7de281de5f..0840ea1191 100644
--- a/code/modules/mob/living/silicon/examine.dm
+++ b/code/modules/mob/living/silicon/examine.dm
@@ -1,5 +1,4 @@
/mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts
- . = ..()
if(laws && isobserver(user))
. += "
[src] has the following laws:"
for(var/law in laws.get_law_list(include_zeroth = TRUE))
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index f8c3dd37e9..2aa9194dc8 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -49,10 +49,13 @@
if(DEAD)
. += "
It looks like its system is corrupted and requires a reset."
+ if(LAZYLEN(.) > 1)
+ .[2] = "
[.[2]]"
+
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .)
if(length(.) > 1)
- .[1] += "\n
"
+ .[1] += "
"
. += ""
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 13f1bea1e4..3b89413271 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -49,6 +49,9 @@
typing_indicator_state = /obj/effect/overlay/typing_indicator/machine
+ vocal_bark_id = "synth"
+ vocal_pitch_range = 0.1
+
/mob/living/silicon/Initialize(mapload)
. = ..()
GLOB.silicon_mobs += src
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index c1897c3c05..a7bd8ca921 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -35,6 +35,9 @@
collar_type = "cat"
var/held_icon = "cat2"
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "mutedc4"
+ vocal_pitch = 1.4
+ vocal_pitch_range = 0.4
/mob/living/simple_animal/pet/cat/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 748a182ba3..fb8c937ea8 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -20,6 +20,9 @@
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "bullet"
+ vocal_speed = 6
+
/mob/living/simple_animal/pet/dog/ComponentInitialize()
. = ..()
AddElement(/datum/element/wuv, "yaps happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "growls!", EMOTE_AUDIBLE)
@@ -639,6 +642,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
mob_size = MOB_SIZE_SMALL
collar_type = "puppy"
+ vocal_pitch = 1.6
+
//puppies cannot wear anything.
/mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list)
if(href_list["remove_inv"] || href_list["add_inv"])
@@ -660,6 +665,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
maxbodytemp = T0C + 40
held_icon = "void_puppy"
+ vocal_pitch = 0.6
+
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
return 1 //Void puppies can navigate space.
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 0ec687c3e3..ca827c29e5 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -36,6 +36,7 @@
var/datum/reagent/milk_reagent = /datum/reagent/consumable/milk
footstep_type = FOOTSTEP_MOB_SHOE
+ vocal_bark_id = "banjoc3"
/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload, /datum/reagent/milk_reagent)
udder = new (null, milk_reagent)
@@ -144,6 +145,8 @@
blood_volume = BLOOD_VOLUME_NORMAL
footstep_type = FOOTSTEP_MOB_SHOE
+ vocal_bark_id = "mutedc2"
+ vocal_pitch = 1.2
/mob/living/simple_animal/cow/Initialize(mapload)
udder = new(null, milk_reagent)
@@ -248,6 +251,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/chick/Initialize(mapload)
. = ..()
@@ -310,6 +315,9 @@
var/static/chicken_count = 0
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "synthgrunt"
+ vocal_pitch = 1.4
+ vocal_pitch_range = 0.4
/mob/living/simple_animal/chicken/Initialize(mapload)
. = ..()
@@ -404,6 +412,8 @@
var/static/kiwi_count = 0
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/kiwi/Destroy()
--kiwi_count
@@ -482,6 +492,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/babyKiwi/Initialize(mapload)
. = ..()
@@ -558,3 +570,4 @@
maxHealth = 75
blood_volume = BLOOD_VOLUME_NORMAL
footstep_type = FOOTSTEP_MOB_SHOE
+ vocal_bark_id = "mutedc4"
diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm
index 4e4fd7ccfc..475b50d44a 100644
--- a/code/modules/mob/living/simple_animal/friendly/fox.dm
+++ b/code/modules/mob/living/simple_animal/friendly/fox.dm
@@ -23,6 +23,11 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "bullet"
+ vocal_speed = 2
+ vocal_pitch = 1.6
+ vocal_pitch_range = 0.4
+
/mob/living/simple_animal/pet/fox/ComponentInitialize()
. = ..()
AddElement(/datum/element/mob_holder, "fox")
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index d49eb1251d..f67c5dcb97 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -29,6 +29,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
var/chew_probability = 1
faction = list("rat")
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/mouse/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/plushie.dm b/code/modules/mob/living/simple_animal/friendly/plushie.dm
index ff95e8fe86..4821695f45 100644
--- a/code/modules/mob/living/simple_animal/friendly/plushie.dm
+++ b/code/modules/mob/living/simple_animal/friendly/plushie.dm
@@ -29,6 +29,8 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
pressure_resistance = 200
+ vocal_bark_id = "squeak"
+ vocal_pitch_range = 0.4
/mob/living/simple_animal/pet/plushie/ComponentInitialize()
. = ..()
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index fad48b4854..27fb30a459 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -5,6 +5,7 @@
desc = "A solar panel. Generates electricity when in contact with sunlight."
icon = 'goon/icons/obj/power.dmi'
icon_state = "sp_base"
+ minimap_override_color = "#02026a"
density = TRUE
use_power = NO_POWER_USE
idle_power_usage = 0
diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm
index d542694236..dc07a5a184 100644
--- a/code/modules/research/techweb/_techweb.dm
+++ b/code/modules/research/techweb/_techweb.dm
@@ -17,7 +17,7 @@
var/list/obj/machinery/computer/rdconsole/consoles_accessing = list()
var/id = "generic"
var/list/research_logs = list() //IC logs.
- var/largest_bomb_value = 0
+ var/largest_values = list()
var/organization = "Third-Party" //Organization name, used for display.
var/list/next_income = list() //To be applied on the next passive techweb income
var/list/last_bitcoins = list() //Current per-second production, used for display only.
diff --git a/code/modules/vehicles/mecha/combat/five_stars.dm b/code/modules/vehicles/mecha/combat/five_stars.dm
index 6a73c3adde..def8e94cc8 100644
--- a/code/modules/vehicles/mecha/combat/five_stars.dm
+++ b/code/modules/vehicles/mecha/combat/five_stars.dm
@@ -4,7 +4,6 @@
icon = 'icons/mecha/mecha_96x96.dmi'
icon_state = "five_stars"
armor = list(MELEE = 100, BULLET = 50, LASER = 35, ENERGY = 35, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
- step_in = 4
dir_in = 1 //Facing North.
max_integrity = 800
pixel_x = -32
diff --git a/html/changelogs/archive/2022-06.yml b/html/changelogs/archive/2022-06.yml
index c66a629e83..bbeeed3d82 100644
--- a/html/changelogs/archive/2022-06.yml
+++ b/html/changelogs/archive/2022-06.yml
@@ -206,3 +206,51 @@
- rscadd: Debug Omnitool (Admin-only, sorry)
- tweak: Enforcer Voidsuit now has armor equivalent to Security Winter Jackets
- tweak: Gave Detectives badges, too!
+2022-06-11:
+ Bhijn & Myr:
+ - rscadd: The station minimap now features higher detail! Instead of just windows
+ and grilles being outlined, all dense+anchored structures and machinery are
+ shown on the minimap.
+ - rscadd: The station minimap now supports obfuscating entire areas, via the minimap_show_walls
+ var.
+ - rscadd: 'The station minimap now supports defining two area colors, allowing for
+ a checkerboard pattern! tweak: Hallways and maint have been given white and
+ gray colors, respectively, for ease of readability. tweak: Ruins are now obfuscated
+ on the minimap, and have been given a subtle, yet distinct, color pattern!'
+ - bugfix: The station minimap no longer errors when you mouse over it
+ - rscadd: 'The station minimap now supports multiz! (However, due to bugginess,
+ multiz minimaps won''t display area tooltips.) tweak: The station minimap now
+ features pixel-perfect scaling.'
+ - code_imp: The station minimap can now support managing data for up to 16,581,374
+ areas without any conflicts at all! Before, BYOND's psuedorandom RNG meant that
+ it was somewhat common for areas to collide with each others' data.
+ - rscadd: Talking is now accompanied with fully-customizable sounds! You can modify
+ your character's speech under the speech tab in chargen, and you can toggle
+ these sounds via the "Hear/Silence Vocal Barks" verb under the preferences tab!
+ This also fully supports genetics.
+ - bugfix: Admittedly an unatomized change, but Cit's DNA blocks can now properly
+ be updated through genetics. Before, these required a complete genetics reset
+ to apply.
+ - rscadd: 'The chat now supports blockquotes! tweak: Examining, medical scanners,
+ self-checking, and mood checkups, have all been converted to make use of blockquotes.'
+ Bhijn & Myr (+ UI work and cleanup by Sandpoot!):
+ - rscadd: 'Colormates now have HSV coloration! tweak: Colormates have had their
+ "please use white clothing" message removed, as that recommendation''s now mostly
+ pointless tweak: The default mode for colormates is now HSV coloration tweak:
+ The temp messages in colormates have been tweaked slightly to be more user-friendly,
+ as they''re user-facing. tweak: The description for constants in the colormate
+ matrix mode has been fixed; the constant variables have nothing to do with contrast,
+ they simply add color tweak: Matrix mode has been made a lot more usable; it''s
+ now clamped between -10 and 10, and features a step of 0.01, making it much
+ easier to simply click and drag to adjust the values, rather than having to
+ punch them in manually'
+ Putnam3145:
+ - balance: QCD matter is now worth 10x as much and makes 2 research pointer per
+ mole
+ SandPoot:
+ - bugfix: Fixed items that use strip_mod and strip_silence (stripping people faster
+ or without giving them a message)
+ - rscadd: Added a search box to all vending machine uis.
+ - qol: Vending machines have candystripes for better clarity.
+ keronshb:
+ - bugfix: Families fixed from crashing
diff --git a/modular_sand/code/modules/client/preferences_savefile.dm b/modular_sand/code/modules/client/preferences_savefile.dm
index ef6a14917a..1a604182c3 100644
--- a/modular_sand/code/modules/client/preferences_savefile.dm
+++ b/modular_sand/code/modules/client/preferences_savefile.dm
@@ -6,3 +6,14 @@
else
var/tmp = language
language = list(tmp)
+
+/datum/preferences/update_preferences(current_version, savefile/S)
+ // Citadel added a new bitfield to toggles, we need to push our prefs forward starting from the last bit
+ if(current_version < 55)
+ if(CHECK_BITFIELD(toggles, VERB_CONSENT))
+ DISABLE_BITFIELD(toggles, VERB_CONSENT)
+ ENABLE_BITFIELD(toggles, LEWD_VERB_SOUNDS)
+ if(CHECK_BITFIELD(toggles, SOUND_BARK))
+ DISABLE_BITFIELD(toggles, SOUND_BARK)
+ ENABLE_BITFIELD(toggles, VERB_CONSENT)
+ . = ..()
diff --git a/tgstation.dme b/tgstation.dme
index a5fbd270e3..036b8a15cd 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -485,6 +485,7 @@
#include "code\datums\action.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\armor.dm"
+#include "code\datums\bark.dm"
#include "code\datums\beam.dm"
#include "code\datums\beepsky_fashion.dm"
#include "code\datums\browser.dm"
@@ -3737,6 +3738,7 @@
#include "code\modules\vehicles\mecha\mecha_wreckage.dm"
#include "code\modules\vehicles\mecha\combat\combat.dm"
#include "code\modules\vehicles\mecha\combat\durand.dm"
+#include "code\modules\vehicles\mecha\combat\five_stars.dm"
#include "code\modules\vehicles\mecha\combat\gygax.dm"
#include "code\modules\vehicles\mecha\combat\honker.dm"
#include "code\modules\vehicles\mecha\combat\marauder.dm"
diff --git a/tgui/packages/tgui-panel/styles/components/Chat.scss b/tgui/packages/tgui-panel/styles/components/Chat.scss
index b439ace8c5..a199963fd0 100644
--- a/tgui/packages/tgui-panel/styles/components/Chat.scss
+++ b/tgui/packages/tgui-panel/styles/components/Chat.scss
@@ -98,3 +98,24 @@ $color-bg-section: base.$color-bg-section !default;
pointer-events: none;
}
}
+
+blockquote {
+ background-color: rgba($text-color, 0.05);
+ border-left: 0.15em solid;
+ border-color: $text-color;
+ padding-left: 0.3em;
+ padding-right: 0.3em;
+ margin-bottom: 0.15em;
+ margin-left: 0.3em;
+ margin-right: 0em;
+}
+
+hr {
+ background-color: rgba($text-color, 0.25);
+ height: 0.15em;
+ border-style: none;
+ margin-left: 1em;
+ margin-right: 2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+}
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
index 049b7464ee..2d31efcae1 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
@@ -447,6 +447,10 @@ em {
font-style: italic;
}
+blockquote.warning {
+ border-color: #c51e1e;
+}
+
.alertwarning {
color: #FF0000;
font-weight: bold;
@@ -486,10 +490,18 @@ em {
color: #9ab0ff;
}
+blockquote.info {
+ border-color: #9ab0ff;
+}
+
.notice {
color: #6685f5;
}
+blockquote.notice {
+ border-color: #6685f5;
+}
+
.tinynotice {
color: #6685f5;
font-size: 85%;
@@ -545,18 +557,34 @@ em {
color: #059223;
}
+blockquote.green {
+ border-color: #059223;
+}
+
.red {
color: #FF0000;
}
+blockquote.red {
+ border-color: #FF0000;
+}
+
.blue {
color: #215cff;
}
+blockquote.blue {
+ border-color: #215cff;
+}
+
.nicegreen {
color: #059223;
}
+blockquote.nicegreen {
+ border-color: #059223;
+}
+
/* hornichems */
.userlove {
color: #ff42a6;
@@ -579,6 +607,10 @@ em {
color: #973e3b;
}
+blockquote.cult {
+ border-color: #973e3b;
+}
+
.cultitalic {
color: #973e3b;
font-style: italic;
@@ -634,6 +666,10 @@ em {
color: #9956d3;
}
+blockquote.purple {
+ border-color: #9956d3;
+}
+
.holoparasite {
color: #88809c;
}
@@ -697,6 +733,10 @@ em {
color: #BE8700;
}
+blockquote.brass {
+ border-color: #BE8700;
+}
+
.heavy_brass {
color: #BE8700;
font-weight: bold;
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
index 54646e7f4a..69db6e9026 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
@@ -484,6 +484,10 @@ h1.alert, h2.alert {
font-style: italic;
}
+blockquote.warning {
+ border-color: #ff0000;
+}
+
.alertwarning {
color: #FF0000;
font-weight: bold;
@@ -522,11 +526,18 @@ h1.alert, h2.alert {
.info {
color: #0000CC;
}
+blockquote.info {
+ border-color: #0000CC;
+}
.notice {
color: #000099;
}
+blockquote.notice {
+ border-color: #000099;
+}
+
.tinynotice {
color: #000099;
font-size: 85%;
@@ -582,18 +593,33 @@ h1.alert, h2.alert {
color: #03ff39;
}
+blockquote.green {
+ border-color: #03ff39;
+}
+
.red {
color: #FF0000;
}
+blockquote.red {
+ border-color: #FF0000;
+}
.blue {
color: #0000FF;
}
+blockquote.blue {
+ border-color: #0000FF;
+}
+
.nicegreen {
color: #14a833;
}
+blockquote.nicegreen {
+ border-color: #14a833;
+}
+
/* hornichems */
.userlove {
color: #FF1493;
@@ -616,6 +642,10 @@ h1.alert, h2.alert {
color: #973e3b;
}
+blockquote.cult {
+ border-color: #973e3b;
+}
+
.cultitalic {
color: #973e3b;
font-style: italic;
@@ -671,6 +701,10 @@ h1.alert, h2.alert {
color: #5e2d79;
}
+blockquote.purple {
+ border-color: #5e2d79;
+}
+
.holoparasite {
color: #35333a;
}
@@ -735,6 +769,10 @@ h1.alert, h2.alert {
color: #BE8700;
}
+blockquote.brass {
+ border-color: #BE8700;
+}
+
.heavy_brass {
color: #BE8700;
font-weight: bold;
diff --git a/tgui/packages/tgui/interfaces/Colormate.js b/tgui/packages/tgui/interfaces/Colormate.js
index f376547102..02810f2943 100644
--- a/tgui/packages/tgui/interfaces/Colormate.js
+++ b/tgui/packages/tgui/interfaces/Colormate.js
@@ -1,115 +1,120 @@
import { useBackend } from '../backend';
-import { Button, Flex, Icon, NoticeBox, NumberInput, Section, Tabs } from '../components';
+import { Button, Icon, NoticeBox, NumberInput, Section, Table, Tabs, Slider } from '../components';
import { Window } from '../layouts';
export const Colormate = (props, context) => {
const { act, data } = useBackend(context);
- const { matrixactive, temp } = data;
+ const { activemode, temp } = data;
const item = data.item || [];
return (
- {temp ? (
- {temp}
- ) : (null)}
- {Object.keys(item).length ? (
- <>
-
-
- Item:
-
-
-
- Preview:
-
-
-
-
+
+ {temp ? (
+ {temp}
+ ) : (null)}
+ {Object.keys(item).length ? (
+ <>
+
+
+
+ Item:
+
+
+
+
+
+ Preview:
+
+
+
+
act('switch_modes', {
- mode: "0",
+ mode: 1,
})} >
- Regular coloring
+ Tint coloring (Simple)
act('switch_modes', {
- mode: "1",
+ mode: 2,
})} >
- Matrixed coloring
+ HSV coloring (Normal)
+
+ act('switch_modes', {
+ mode: 3,
+ })} >
+ Matrix coloring (Advanced)
- {matrixactive ? (
- <>
- Coloring: {item.name}
-
- >
- ) : (
- <>
- Coloring: {item.name}
-
- >
- )}
-
- >
- ) : (
-
+ Coloring: {item.name}
+
+
+
+
+ {activemode === 1 ? (
+
+ ) : activemode === 2 ? (
+
+ ) : (
+
+ )}
+
+
+ >
+ ) : (
No item inserted.
-
- )}
+ )}
+
);
};
-export const ColormateNoMatrix = (props, context) => {
+export const ColormateTint = (props, context) => {
const { act, data } = useBackend(context);
return (
-
-
-
- act('paint')} />
- act('clear')} />
- act('drop')} />
-
-
- act('choose_color')} />
-
-
-
+
act('choose_color')}
+ />
);
};
@@ -117,170 +122,211 @@ export const ColormateMatrix = (props, context) => {
const { act, data } = useBackend(context);
const matrixcolors = data.matrixcolors || [];
return (
-
-
-
- act('matrix_paint')} />
- act('clear')} />
- act('drop')} />
-
-
-
- RR: act('set_matrix_color', {
- color: 1,
- value,
- })} />
-
-
- GR: act('set_matrix_color', {
- color: 4,
- value,
- })} />
-
-
- BR: act('set_matrix_color', {
- color: 7,
- value,
- })} />
-
-
-
-
- RG: act('set_matrix_color', {
- color: 2,
- value,
- })} />
-
-
- GG: act('set_matrix_color', {
- color: 5,
- value,
- })} />
-
-
- BG: act('set_matrix_color', {
- color: 8,
- value,
- })} />
-
-
-
-
- RB: act('set_matrix_color', {
- color: 3,
- value,
- })} />
-
-
- GB: act('set_matrix_color', {
- color: 6,
- value,
- })} />
-
-
- BB: act('set_matrix_color', {
- color: 9,
- value,
- })} />
-
-
-
-
- CR: act('set_matrix_color', {
- color: 10,
- value,
- })} />
-
-
- CG: act('set_matrix_color', {
- color: 11,
- value,
- })} />
-
-
- CB: act('set_matrix_color', {
- color: 12,
- value,
- })} />
-
-
-
- RG means red will become this much green.
- CR means that red will have this much constrast applied to it.
-
-
-
+
+
+
+ RR: act('set_matrix_color', {
+ color: 1,
+ value,
+ })} />
+
+
+ GR: act('set_matrix_color', {
+ color: 4,
+ value,
+ })} />
+
+
+ BR: act('set_matrix_color', {
+ color: 7,
+ value,
+ })} />
+
+
+
+
+ RG: act('set_matrix_color', {
+ color: 2,
+ value,
+ })} />
+
+
+ GG: act('set_matrix_color', {
+ color: 5,
+ value,
+ })} />
+
+
+ BG: act('set_matrix_color', {
+ color: 8,
+ value,
+ })} />
+
+
+
+
+ RB: act('set_matrix_color', {
+ color: 3,
+ value,
+ })} />
+
+
+ GB: act('set_matrix_color', {
+ color: 6,
+ value,
+ })} />
+
+
+ BB: act('set_matrix_color', {
+ color: 9,
+ value,
+ })} />
+
+
+
+
+ CR: act('set_matrix_color', {
+ color: 10,
+ value,
+ })} />
+
+
+ CG: act('set_matrix_color', {
+ color: 11,
+ value,
+ })} />
+
+
+ CB: act('set_matrix_color', {
+ color: 12,
+ value,
+ })} />
+
+
+
+ RG means red will become this much green.
+ CR means this much red will be added.
+
+
+ );
+};
+
+export const ColormateHSV = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { buildhue, buildsat, buildval } = data;
+ return (
+
+
+ Hue:
+
+ act('set_hue', {
+ buildhue: value,
+ })} />
+
+
+
+ Saturation:
+
+ act('set_sat', {
+ buildsat: value,
+ })} />
+
+
+
+ Value:
+
+ act('set_val', {
+ buildval: value,
+ })} />
+
+
+
);
};
diff --git a/tgui/packages/tgui/interfaces/Vending.tsx b/tgui/packages/tgui/interfaces/Vending.tsx
index 78025ebc54..53a6e77f40 100644
--- a/tgui/packages/tgui/interfaces/Vending.tsx
+++ b/tgui/packages/tgui/interfaces/Vending.tsx
@@ -1,6 +1,9 @@
+import { filter } from 'common/collections';
+import { flow } from 'common/fp';
import { classes } from 'common/react';
-import { useBackend } from '../backend';
-import { Box, Button, Section, Table } from '../components';
+import { createSearch } from 'common/string';
+import { useBackend, useLocalState } from '../backend';
+import { Box, Button, Icon, Input, Section, Table } from '../components';
import { Window } from '../layouts';
type VendingData = {
@@ -23,6 +26,7 @@ type ProductRecord = {
price: number;
max_amount: number;
ref: string;
+ amount: number;
}
type CoinRecord = {
@@ -83,7 +87,7 @@ const VendingRow = (props, context) => {
);
return (
-
+
{product.img && (
{
hidden_records = [],
stock,
} = data;
+ const [
+ searchText,
+ setSearchText,
+ ] = useLocalState(context, 'searchText', '');
let inventory;
let custom = false;
if (data.vending_machine_input) {
@@ -194,6 +202,8 @@ export const Vending = (props, context) => {
}
// Just in case we still have undefined values in the list
inventory = inventory.filter(item => !!item);
+ // Filter by search text
+ inventory = prepareSearch(inventory, searchText);
return (
{
)}
+
{inventory.map(product => (
{
);
};
+
+/**
+ * Search box
+ */
+export const prepareSearch = (products, searchText = '') => {
+ const testSearch = createSearch(searchText,
+ product => product.name);
+ return flow([
+ // Optional search term
+ searchText && filter(testSearch),
+ ])(products);
+};