diff --git a/code/__defines/chat.dm b/code/__defines/chat.dm index 70ac35bada..34df707e74 100644 --- a/code/__defines/chat.dm +++ b/code/__defines/chat.dm @@ -10,6 +10,7 @@ #define MESSAGE_TYPE_SYSTEM "system" #define MESSAGE_TYPE_LOCALCHAT "localchat" +#define MESSAGE_TYPE_NPCEMOTE "npcemote" #define MESSAGE_TYPE_PLOCALCHAT "plocalchat" #define MESSAGE_TYPE_RADIO "radio" #define MESSAGE_TYPE_NIF "nif" @@ -22,6 +23,7 @@ #define MESSAGE_TYPE_ADMINPM "adminpm" #define MESSAGE_TYPE_MENTORPM "mentorpm" #define MESSAGE_TYPE_COMBAT "combat" +#define MESSAGE_TYPE_CHATPRINT "chatexport" #define MESSAGE_TYPE_ADMINCHAT "adminchat" #define MESSAGE_TYPE_PRAYER "prayer" #define MESSAGE_TYPE_MODCHAT "modchat" diff --git a/code/_global_vars/_regexes.dm b/code/_global_vars/_regexes.dm index 7e9ea99d1f..46e78a28fa 100644 --- a/code/_global_vars/_regexes.dm +++ b/code/_global_vars/_regexes.dm @@ -1,2 +1,4 @@ //These are a bunch of regex datums for use /((any|every|no|some|head|foot)where(wolf)?\sand\s)+(\.[\.\s]+\s?where\?)?/i GLOBAL_DATUM_INIT(is_http_protocol, /regex, regex("^https?://")) + +GLOBAL_DATUM_INIT(is_valid_url, /regex, regex("((?:https://)\[-a-zA-Z0-9@:%._+~#=]{1,256}.\[-a-zA-Z0-9@:%._+~#=]{1,256}\\b(?:\[-a-zA-Z0-9@():%_+.,~#?&/=]*\[^.,!?:; ()<>{}\\[]\n\"'ยด`]))", "gm")) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 07a2bfaceb..b532846245 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -255,6 +255,10 @@ /proc/capitalize(var/t as text) return uppertext(copytext(t, 1, 2)) + copytext(t, 2) +//Returns a unicode string with the first element of the string capitalized. +/proc/capitalize_utf(var/t as text) + return uppertext(copytext_char(t, 1, 2)) + copytext_char(t, 2) + //This proc strips html properly, remove < > and all text between //for complete text sanitizing should be used sanitize() /proc/strip_html_properly(var/input) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 15750828dd..2c689d9cdd 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -117,7 +117,7 @@ L.stop_pulling() P.forceMove(T) L.forceMove(T) - L.start_pulling(P) + L.continue_pulling(P) else L.forceMove(T) else @@ -285,4 +285,3 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop /obj/effect/step_trigger/warning/train_edge warningmessage = "The wind billowing alongside the train is extremely strong here! Any movement could easily pull you down beneath the carriages, return to the train immediately!" - diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index 788ee12ba2..a3c040d4aa 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -85,7 +85,8 @@ prob(5);/obj/machinery/vending/sovietvend, prob(5);/obj/machinery/vending/radren, prob(3);/obj/machinery/vending/altevian, - prob(5);/obj/machinery/vending/desatti) //VOREStation Edit End + prob(5);/obj/machinery/vending/desatti, + prob(5);/obj/machinery/vending/nukie) //VOREStation Edit End /obj/random/vendorfood //Random food vendors for station use name = "random snack vending machine" @@ -114,7 +115,8 @@ /obj/machinery/vending/cola/soft, /obj/machinery/vending/bepis, /obj/machinery/vending/sovietsoda, - /obj/machinery/vending/radren) + /obj/machinery/vending/radren, + /obj/machinery/vending/nukie) //VOREStation Edit End /obj/random/obstruction //Large objects to block things off in maintenance diff --git a/code/game/turfs/weird_turfs_vr.dm b/code/game/turfs/weird_turfs_vr.dm index b1ef1fa4fb..9a6bad3973 100644 --- a/code/game/turfs/weird_turfs_vr.dm +++ b/code/game/turfs/weird_turfs_vr.dm @@ -43,10 +43,6 @@ i.plane = PLANE_LIGHTING_ABOVE add_overlay(i) -/turf/simulated/floor/weird_things/dark/ChangeTurf() - . = ..() - cut_overlays() - /turf/unsimulated/wall/dark name = "dark" desc = "It's a strange, impenetrable darkness." @@ -64,11 +60,6 @@ i.plane = PLANE_LIGHTING_ABOVE add_overlay(i) -/turf/unsimulated/wall/dark/ChangeTurf() - . = ..() - cut_overlays() - - /turf/unsimulated/floor/dark name = "dark" desc = "It's a strange, impenetrable darkness." @@ -79,7 +70,7 @@ . = ..() if(prob(5)) add_glow() - + /turf/unsimulated/floor/dark/Crossed(O) . = ..() if(!isliving(O)) @@ -111,7 +102,7 @@ var/choiceb if(flip == 1) choice = "overlay-[rand(1,6)]" - if(flip == 2) + if(flip == 2) choice = "overlay-[rand(7,12)]" var/image/i = image('icons/turf/flooring/weird_vr.dmi', choice) i.plane = PLANE_LIGHTING_ABOVE @@ -122,10 +113,4 @@ if(flip == 2) choiceb = "overlay-[rand(1,6)]" var/image/ii = image('icons/turf/flooring/weird_vr.dmi', choiceb) - add_overlay(ii) - - - -/turf/unsimulated/floor/dark/ChangeTurf() - . = ..() - cut_overlays() \ No newline at end of file + add_overlay(ii) \ No newline at end of file diff --git a/code/modules/awaymissions/redgate.dm b/code/modules/awaymissions/redgate.dm index bd91569ff1..c2de8cf370 100644 --- a/code/modules/awaymissions/redgate.dm +++ b/code/modules/awaymissions/redgate.dm @@ -31,12 +31,12 @@ /obj/structure/redgate/proc/teleport(var/mob/M as mob) var/keycheck = TRUE if (!istype(M,/mob/living)) //We only want mob/living, no bullets or mechs or AI eyes or items - if(M.type in exceptions) + if(is_type_in_list(M, exceptions)) keycheck = FALSE //we'll allow it else return - if(M.type in restrictions) //Some stuff we don't want to bring EVEN IF it has a key. + if(is_type_in_list(M, restrictions)) //Some stuff we don't want to bring EVEN IF it has a key. return for(var/obj/O in M.contents) @@ -54,9 +54,22 @@ var/turf/ourturf = find_our_turf(M) //Find the turf on the opposite side of the target if(!ourturf.check_density(TRUE,TRUE)) //Make sure there isn't a wall there M.unbuckle_all_mobs(TRUE) - M.stop_pulling() - playsound(src,'sound/effects/ominous-hum-2.ogg', 100,1) - M.forceMove(ourturf) //Let's just do forcemove, I don't really want people teleporting to weird places if they have bluespace stuff + if(istype(M,/mob/living) && M.pulling) + var/atom/movable/pulled = M.pulling + M.stop_pulling() + playsound(src,'sound/effects/ominous-hum-2.ogg', 100,1) + M.forceMove(ourturf) + if(is_type_in_list(pulled, exceptions)) + for(var/mob/living/buckled_on in pulled.buckled_mobs) + if(!buckled_on.key || is_type_in_list(M, restrictions)) + pulled.unbuckle_mob(buckled_on, TRUE) + pulled.forceMove(ourturf) + M.continue_pulling(pulled) + else + to_chat(M, "The redgate refused your pulled item.") + else + playsound(src,'sound/effects/ominous-hum-2.ogg', 100,1) + M.forceMove(ourturf) //Let's just do forcemove, I don't really want people teleporting to weird places if they have bluespace stuff else to_chat(M, "Something blocks your way.") diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index f9423f088a..dc4202f912 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -220,12 +220,16 @@ if(new_metadata && CanUseTopic(user)) pref.metadata = new_metadata else if(href_list["edit_ooc_note_likes"]) - var/new_metadata = strip_html_simple(tgui_input_text(usr, "Enter any information you'd like others to see relating to your LIKED roleplay preferences. This will not be saved permanently unless you click save in the Character Setup panel!", "Game Preference" , html_decode(pref.metadata_likes), multiline = TRUE, prevent_enter = TRUE)) + var/new_metadata = strip_html_simple(tgui_input_text(usr, "Enter any information you'd like others to see relating to your LIKED roleplay preferences. This will not be saved permanently unless you click save in the Character Setup panel! Type \"!clear\" to empty.", "Game Preference" , html_decode(pref.metadata_likes), multiline = TRUE, prevent_enter = TRUE)) if(new_metadata && CanUseTopic(user)) + if(new_metadata == "!clear") + new_metadata = "" pref.metadata_likes = new_metadata else if(href_list["edit_ooc_note_dislikes"]) - var/new_metadata = strip_html_simple(tgui_input_text(usr, "Enter any information you'd like others to see relating to your DISLIKED roleplay preferences. This will not be saved permanently unless you click save in the Character Setup panel!", "Game Preference" , html_decode(pref.metadata_dislikes), multiline = TRUE, prevent_enter = TRUE)) + var/new_metadata = strip_html_simple(tgui_input_text(usr, "Enter any information you'd like others to see relating to your DISLIKED roleplay preferences. This will not be saved permanently unless you click save in the Character Setup panel! Type \"!clear\" to empty.", "Game Preference" , html_decode(pref.metadata_dislikes), multiline = TRUE, prevent_enter = TRUE)) if(new_metadata && CanUseTopic(user)) + if(new_metadata == "!clear") + new_metadata = "" pref.metadata_dislikes = new_metadata return ..() diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index e9abe1280a..134b9a439b 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -63,6 +63,7 @@ if(holder.rights & R_ADMIN && holder.rights & R_BAN) //Admins ooc_style = "admin" + msg = GLOB.is_valid_url.Replace(msg,"$1") for(var/client/target in GLOB.clients) if(target.is_preference_enabled(/datum/client_preference/show_ooc)) @@ -170,6 +171,8 @@ if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc)) r_receivers |= admin + msg = GLOB.is_valid_url.Replace(msg,"$1") + // Send a message for(var/client/target in receivers) var/admin_stuff = "" diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index 05da4f8f3b..8ea556781a 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -3570,3 +3570,31 @@ /obj/item/weapon/reagent_containers/food/snacks/packaged/scotchegg = 10, /obj/item/weapon/reagent_containers/food/snacks/packaged/porkpie = 10 ) + +/obj/machinery/vending/nukie + name = "Nukies Energy Drinks" + desc = "A vending machine stocked full of the most potent energy drinks on the market." + icon = 'icons/obj/vending_vr.dmi' + icon_state = "nukie" + product_slogans = "Contains one gram of caffeine!;Keep going, go on forever!;It'll blow you away!;Nukies is not responsible for any deaths occurred in a period of 24 hours after consuming our products!" + product_ads = "Get your peach blasted!;Pop your cherry here!;Dare you swallow the bursting banana?;Try our limited edition flavour!" + products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_peach = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_pear = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_cherry = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_melon = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_banana = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_rose = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_lemon = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_fruit = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_special = 1) + + prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_peach = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_pear = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_cherry = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_melon = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_banana = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_rose = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_lemon = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_fruit = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_special = 100 + ) diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index 6643e677d6..949afd4a6f 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -112,7 +112,7 @@ var/list/results = A.examine(src) if(!results || !results.len) results = list("You were unable to examine that. Tell a developer!") - to_chat(src, "[jointext(results, "
")]
") + to_chat(src, "[jointext(results, "
")]
") update_examine_panel(A) /mob/proc/update_examine_panel(var/atom/A) diff --git a/code/modules/food/food/cans.dm b/code/modules/food/food/cans.dm index fa25fc7f60..7e52a15d5c 100644 --- a/code/modules/food/food/cans.dm +++ b/code/modules/food/food/cans.dm @@ -448,3 +448,104 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/alecan/Initialize() . = ..() reagents.add_reagent("ale", 30) + +/////////////////////////ENERGY DRINKS///////////////////////// + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_peach + name = "\improper Nukies - Peach Blaster" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_peach" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_peach/Initialize() + . = ..() + reagents.add_reagent("nukie_peach", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_pear + name = "\improper Nukies - Great Pear" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_pear" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_pear/Initialize() + . = ..() + reagents.add_reagent("nukie_pear", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_cherry + name = "\improper Nukies - Popping Cherry" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_cherry" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_cherry/Initialize() + . = ..() + reagents.add_reagent("nukie_cherry", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_melon + name = "\improper Nukies - Melon Squirter" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_melon" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_melon/Initialize() + . = ..() + reagents.add_reagent("nukie_melon", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_banana + name = "\improper Nukies - Bursting Banana" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_banana" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_banana/Initialize() + . = ..() + reagents.add_reagent("nukie_banana", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_rose + name = "\improper Nukies - Insatiable Rose" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_rose" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_rose/Initialize() + . = ..() + reagents.add_reagent("nukie_rose", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_lemon + name = "\improper Nukies - Citrus Got Real" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_lemon" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_lemon/Initialize() + . = ..() + reagents.add_reagent("nukie_lemon", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_fruit + name = "\improper Nukies - Swelling Fruit" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_fruit" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_fruit/Initialize() + . = ..() + reagents.add_reagent("nukie_fruit", 60) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_special + name = "\improper Nukies - Limited Edition" + desc = "Harness the power of the atom with this over-caffinated energy drink." + icon_state = "nukie_special" + center_of_mass = list("x"=16, "y"=8) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/cans/nukie_special/Initialize() + . = ..() + reagents.add_reagent("nukie_special", 60) diff --git a/code/modules/food/food/lunch.dm b/code/modules/food/food/lunch.dm index 5879a8e95a..3a2527af23 100644 --- a/code/modules/food/food/lunch.dm +++ b/code/modules/food/food/lunch.dm @@ -25,7 +25,11 @@ var/list/lunchables_lunches_ = list(/obj/item/weapon/reagent_containers/food/sna /obj/item/weapon/reagent_containers/food/snacks/locust_cooked, /obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun, /obj/item/weapon/reagent_containers/food/snacks/quicheslice/filled, - /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose) + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, + /obj/item/weapon/reagent_containers/food/snacks/packaged/sausageroll, + /obj/item/weapon/reagent_containers/food/snacks/packaged/pasty, + /obj/item/weapon/reagent_containers/food/snacks/packaged/scotchegg, + /obj/item/weapon/reagent_containers/food/snacks/packaged/porkpie) var/list/lunchables_snacks_ = list(/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly, /obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly, @@ -74,7 +78,11 @@ var/list/lunchables_snacks_ = list(/obj/item/weapon/reagent_containers/food/snac /obj/item/weapon/reagent_containers/food/snacks/packaged/lunacake, /obj/item/weapon/reagent_containers/food/snacks/packaged/darklunacake, /obj/item/weapon/reagent_containers/food/snacks/packaged/mochicake, - /obj/item/weapon/reagent_containers/food/snacks/packaged/spacetwinkie + /obj/item/weapon/reagent_containers/food/snacks/packaged/spacetwinkie, + /obj/item/weapon/storage/box/jaffacake, + /obj/item/weapon/storage/box/winegum, + /obj/item/weapon/storage/box/custardcream, + /obj/item/weapon/storage/box/bourbon ) var/list/lunchables_drinks_ = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola, @@ -96,7 +104,15 @@ var/list/lunchables_drinks_ = list(/obj/item/weapon/reagent_containers/food/drin /obj/item/weapon/reagent_containers/food/drinks/cans/sarsaparilla, /obj/item/weapon/reagent_containers/food/drinks/cans/straw_cola, /obj/item/weapon/reagent_containers/food/drinks/cans/apple_cola, - /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_cola + /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_cola, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_peach, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_pear, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_cherry, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_melon, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_banana, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_rose, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_lemon, + /obj/item/weapon/reagent_containers/food/drinks/cans/nukie_fruit ) // This default list is a bit different, it contains items we don't want diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 5317d03b92..4488a07701 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -300,11 +300,15 @@ if (W.w_class >= src.w_class || is_robot_module(W) || istype(W, /obj/item/weapon/holder)) return - to_chat(user, "You slip \the [W] inside \the [src].") - user.drop_from_inventory(W, src) - add_fingerprint(user) - contents += W - return + if(tgui_alert(user,"You can't slice \the [src] here. Would you like to hide \the [W] inside it instead?","No Cutting Surface!",list("Yes","No")) == "No") + to_chat(user, "You cannot slice \the [src] here! You need a table or at least a tray to do it.") + return + else + to_chat(user, "You slip \the [W] inside \the [src].") + user.drop_from_inventory(W, src) + add_fingerprint(user) + contents += W + return if (has_edge(W)) if (!can_slice_here) diff --git a/code/modules/food/kitchen/cooking_machines/container.dm b/code/modules/food/kitchen/cooking_machines/container.dm index fa6a5fea62..ca5a9dd120 100644 --- a/code/modules/food/kitchen/cooking_machines/container.dm +++ b/code/modules/food/kitchen/cooking_machines/container.dm @@ -193,7 +193,6 @@ // We add to the insertable list specifically for the oven trays, to allow specialty cakes. insertable += list( - /obj/item/clothing/head/cakehat, // This is because we want to allow birthday cakes to be makeable. /obj/item/organ/internal/brain // As before, needed for braincake ) @@ -208,3 +207,15 @@ shortname = "rack" desc = "Put ingredients 'in'/on this; designed for use with a grill. Warranty void if used incorrectly. Alt click to remove contents." icon_state = "grillrack" + +/obj/item/weapon/reagent_containers/cooking_container/grill/Initialize() + . = ..() + + // Needed for the special recipes of the grill + insertable += list( + /obj/item/organ/internal/brain, + /obj/item/robot_parts/head, + /obj/item/weapon/ectoplasm, + /obj/item/weapon/holder/mouse, + /obj/item/stack/rods + ) diff --git a/code/modules/food/kitchen/gibber.dm b/code/modules/food/kitchen/gibber.dm index 329cba2edf..c636978625 100644 --- a/code/modules/food/kitchen/gibber.dm +++ b/code/modules/food/kitchen/gibber.dm @@ -205,8 +205,7 @@ slab_nutrition *= 0.5 slab_nutrition /= slab_count - while(slab_count) - slab_count-- + for(var/i=1 to slab_count) var/obj/item/weapon/reagent_containers/food/snacks/meat/new_meat = new slab_type(src, rand(3,8)) if(istype(new_meat)) new_meat.name = "[slab_name] [new_meat.name]" diff --git a/code/modules/materials/materials/metals/metals.dm b/code/modules/materials/materials/metals/metals.dm index fae037a620..dbf1e502ac 100644 --- a/code/modules/materials/materials/metals/metals.dm +++ b/code/modules/materials/materials/metals/metals.dm @@ -151,6 +151,7 @@ stack_type = /obj/item/stack/material/graphite flags = MATERIAL_BRITTLE icon_base = "solid" + table_icon_base = "stone" icon_reinf = "reinf_mesh" icon_colour = "#333333" hardness = 75 diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 6d59392cf7..10d2b91aaf 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -22,7 +22,7 @@ return if(iteration_count == 1) - piece = capitalize(piece) + piece = capitalize_utf(piece) if(always_stars) piece = stars(piece) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 4651baecb4..7ed2ff1aa1 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -400,8 +400,8 @@ if(R.fields["name"] == perpname) criminal = R.fields["criminal"] - msg += "Criminal status: \[[criminal]\]" - msg += "Security records: \[View\] \[Add comment\]" + msg += "Criminal status: \[[criminal]\]" + msg += "Security records: \[View\] \[Add comment\]" if(hasHUD(user,"medical")) var/perpname = name @@ -419,11 +419,11 @@ if (R.fields["name"] == perpname) medical = R.fields["p_stat"] - msg += "Physical status: \[[medical]\]" - msg += "Medical records: \[View\] \[Add comment\]" + msg += "Physical status: \[[medical]\]" + msg += "Medical records: \[View\] \[Add comment\]" if(hasHUD(user,"best")) - msg += "Employment records: \[View\] \[Add comment\]" + msg += "Employment records: \[View\] \[Add comment\]" var/flavor_text = print_flavor_text() @@ -432,11 +432,11 @@ // VOREStation Start if(custom_link) - msg += "Custom link: [custom_link]" + msg += "Custom link: [custom_link]" if(ooc_notes) - msg += "OOC Notes: \[View\] - \[Print\]" - msg += "\[Mechanical Vore Preferences\]" + msg += "OOC Notes: \[View\] - \[Print\]" + msg += "\[Mechanical Vore Preferences\]" // VOREStation End msg += "*---------*" if(applying_pressure) diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index f43f9c86ab..43575d3e0c 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -54,7 +54,7 @@ if(usr != src) return var/new_metadata = strip_html_simple(tgui_input_text(usr, "Enter any information you'd like others to see relating to your LIKED roleplay preferences. This will not be saved permanently unless you click save in the OOC notes panel!", "Game Preference" , html_decode(ooc_notes_likes), multiline = TRUE, prevent_enter = TRUE)) - if(new_metadata && CanUseTopic(usr)) + if(CanUseTopic(usr)) ooc_notes_likes = new_metadata client.prefs.metadata_likes = new_metadata to_chat(usr, "OOC note likes have been updated. Don't forget to save!") @@ -66,7 +66,7 @@ if(usr != src) return var/new_metadata = strip_html_simple(tgui_input_text(usr, "Enter any information you'd like others to see relating to your DISLIKED roleplay preferences. This will not be saved permanently unless you click save in the OOC notes panel!", "Game Preference" , html_decode(ooc_notes_dislikes), multiline = TRUE, prevent_enter = TRUE)) - if(new_metadata && CanUseTopic(usr)) + if(CanUseTopic(usr)) ooc_notes_dislikes = new_metadata client.prefs.metadata_dislikes = new_metadata to_chat(usr, "OOC note dislikes have been updated. Don't forget to save!") @@ -91,7 +91,7 @@ msg += "

LIKES

[ooc_notes_likes]" if(ooc_notes_dislikes) msg += "

DISLIKES

[ooc_notes_dislikes]" - to_chat(usr, "[src]'s Metainfo:
[msg]
") + to_chat(usr, "[src]'s Metainfo:
[msg]
") /mob/living/verb/set_custom_link() set name = "Set Custom Link" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm index a6c4683567..540aaaa156 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm @@ -362,7 +362,7 @@ db.ooc_notes_likes = M.ooc_notes_likes db.ooc_notes_dislikes = M.ooc_notes_dislikes db.prey_ooc_likes = M.ooc_notes_likes - db.prey_ooc_likes = M.ooc_notes_dislikes + db.prey_ooc_dislikes = M.ooc_notes_dislikes db.verbs |= /mob/living/dominated_brain/proc/cease_this_foolishness absorb_langs() diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 9ee7d56dec..eedd207194 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -29,6 +29,7 @@ var/obj/effect/lobby_image = new /obj/effect/lobby_image /mob/new_player/Login() update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying if(join_motd) + join_motd = GLOB.is_valid_url.Replace(join_motd,"$1") to_chat(src, "
[join_motd]
") if(has_respawned) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 564ed2a831..16b5bf9377 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -33,9 +33,14 @@ /mob/new_player/proc/new_player_panel_proc() var/output = "
" - output += "Current Map:
" - output += "[using_map.full_name]" - output +="
" + output += "Map: [using_map.full_name]
" + output += "Station Time: [stationtime2text()]
" + + if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) + output += "Server Initializing!" + else + output += "Round Duration: [roundduration2text()]
" + output += "
" output += "

Character Setup

" @@ -150,7 +155,7 @@ new_player_panel_proc() if(href_list["observe"]) - if(tgui_alert(src,"Are you sure you wish to observe? If you do, make sure to not use any knowledge gained from observing if you decide to join later.","Player Setup",list("Yes","No")) == "Yes") + if(tgui_alert(src,"Are you sure you wish to observe? If you do, make sure to not use any knowledge gained from observing if you decide to join later.","Observe Round?",list("Yes","No")) == "Yes") if(!client) return 1 //Make a new mannequin quickly, and allow the observer to take the appearance diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm index 59e6374895..ee6ad2e0ab 100644 --- a/code/modules/multiz/stairs.dm +++ b/code/modules/multiz/stairs.dm @@ -220,7 +220,7 @@ if(L.pulling && !L.pulling.anchored) var/atom/movable/P = L.pulling P.forceMove(get_turf(top)) - L.start_pulling(P) + L.continue_pulling(P) for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) G.affecting.forceMove(get_turf(top)) @@ -479,7 +479,7 @@ // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. if(P) P.forceMove(get_turf(bottom)) - L.start_pulling(P) + L.continue_pulling(P) for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) G.affecting.forceMove(get_turf(bottom)) diff --git a/code/modules/player_tips_vr/player_tips_controller_vr.dm b/code/modules/player_tips_vr/player_tips_controller_vr.dm index 90a542838a..e23994be92 100644 --- a/code/modules/player_tips_vr/player_tips_controller_vr.dm +++ b/code/modules/player_tips_vr/player_tips_controller_vr.dm @@ -31,6 +31,7 @@ Controlled by the player_tips subsystem under code/controllers/subsystems/player if(!M.key && !(M.key in HasReceived)) to_chat(M, SPAN_WARNING("You have periodic player tips enabled. You may turn them off at any time with the Toggle Receiving Player Tips verb in Preferences, or in character set up under the OOC tab!\n Player tips appear every 45-75 minutes.")) HasReceived.Add(M.key) + tip = GLOB.is_valid_url.Replace(tip,"$1") to_chat(M, SPAN_NOTICE("[tip]")) @@ -46,4 +47,4 @@ Controlled by the player_tips subsystem under code/controllers/subsystems/player if(choice == "cancel") return var/static/datum/player_tips/player_tips = new - to_chat(src, SPAN_NOTICE("[player_tips.pick_tip(choice)]")) + to_chat(src, SPAN_NOTICE("[GLOB.is_valid_url.Replace(player_tips.pick_tip(choice),"$1")]")) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 0f24618623..abe3964e3b 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -233,30 +233,17 @@ return /obj/item/weapon/cell/proc/get_electrocute_damage() - switch (charge) -/* if (9000 to INFINITY) - return min(rand(90,150),rand(90,150)) - if (2500 to 9000-1) - return min(rand(70,145),rand(70,145)) - if (1750 to 2500-1) - return min(rand(35,110),rand(35,110)) - if (1500 to 1750-1) - return min(rand(30,100),rand(30,100)) - if (750 to 1500-1) - return min(rand(25,90),rand(25,90)) - if (250 to 750-1) - return min(rand(20,80),rand(20,80)) - if (100 to 250-1) - return min(rand(20,65),rand(20,65))*/ - if (1000000 to INFINITY) - return min(rand(50,160),rand(50,160)) - if (200000 to 1000000-1) - return min(rand(25,80),rand(25,80)) - if (100000 to 200000-1)//Ave powernet - return min(rand(20,60),rand(20,60)) - if (50000 to 100000-1) - return min(rand(15,40),rand(15,40)) - if (1000 to 50000-1) - return min(rand(10,20),rand(10,20)) - else - return 0 \ No newline at end of file + //1kW = 5 + //10kW = 24 + //100kW = 45 + //250kW = 53 + //1MW = 66 + //10MW = 88 + //100MW = 110 + //1GW = 132 + if(charge >= 1000) + var/damage = log(1.1,charge) + damage = damage - (log(1.1,damage)*1.5) + return round(damage) + else + return 0 diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 1747842df9..b16aa12549 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -159,19 +159,20 @@ return between(0, (load / avail) * 100, 100) /datum/powernet/proc/get_electrocute_damage() - switch(avail) - if (1000000 to INFINITY) - return min(rand(50,160),rand(50,160)) - if (200000 to 1000000) - return min(rand(25,80),rand(25,80)) - if (100000 to 200000)//Ave powernet - return min(rand(20,60),rand(20,60)) - if (50000 to 100000) - return min(rand(15,40),rand(15,40)) - if (1000 to 50000) - return min(rand(10,20),rand(10,20)) - else - return 0 + //1kW = 5 + //10kW = 24 + //100kW = 45 + //250kW = 53 + //1MW = 66 + //10MW = 88 + //100MW = 110 + //1GW = 132 + if(avail >= 1000) + var/damage = log(1.1,avail) + damage = damage - (log(1.1,damage)*1.5) + return round(damage) + else + return 0 //////////////////////////////////////////////// // Misc. diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm index 985a223d94..8b83c192d8 100644 --- a/code/modules/reagents/reagents/food_drinks_vr.dm +++ b/code/modules/reagents/reagents/food_drinks_vr.dm @@ -697,3 +697,76 @@ taste_description = "spicy, sour tofu" color = "#5f1b06" allergen_type = ALLERGEN_BEANS|ALLERGEN_VEGETABLE|ALLERGEN_FUNGI //tofu is soy-based, ergo, beans. base recipe also uses cabbage and mushroom. + +/////////Energy Drinks///////// + +/datum/reagent/drink/coffee/nukie + + name = "Nukie" + id = "nukie" + description = "An extremely concentrated caffinated drink." + color = "#102838" + adj_temp = 0 + adj_dizzy = 0 + adj_drowsy = -5 + adj_sleepy = -10 + + glass_name = "nukie" + glass_desc = "A drink to perk you up and refresh you!" + overdose = 30 + + taste_description = "flavourless energy" + +/datum/reagent/drink/coffee/nukie/peach + name = "Nukie Peach" + id = "nukie_peach" + color = "#ffc76e" + taste_description = "battery acid with a hint of artificial peach" + +/datum/reagent/drink/coffee/nukie/pear + name = "Nukie Pear" + id = "nukie_pear" + color = "#d4c03d" + taste_description = "electrostimulation with a hint of artificial pear" + +/datum/reagent/drink/coffee/nukie/cherry + name = "Nukie Cherry" + id = "nukie_cherry" + color = "#b00707" + taste_description = "the rapid acceleration of tooth decay with a hint of artificial cherry" + +/datum/reagent/drink/coffee/nukie/melon + name = "Nukie Melon" + id = "nukie_melon" + color = "#00bf06" + taste_description = "something is crawling under your skin with a hint of artificial melon" + +/datum/reagent/drink/coffee/nukie/banana + name = "Nukie Banana" + id = "nukie_banana" + color = "#ffee00" + taste_description = "imminent cardiac arrest with a hint of something that doesn't really taste like banana at all but is clearly intending to be banana" + +/datum/reagent/drink/coffee/nukie/rose + name = "Nukie Rose" + id = "nukie_rose" + color = "#ff7df4" + taste_description = "paint stripper, space cleaner and some sort of cheap perfume" + +/datum/reagent/drink/coffee/nukie/lemon + name = "Nukie Lemon" + id = "nukie_lemon" + color = "#c3ff00" + taste_description = "something that once resembled lemon mixed thoroughly with literal toxic waste" + +/datum/reagent/drink/coffee/nukie/fruit + name = "Nukie Fruit" + id = "nukie_fruit" + color = "#b300ff" + taste_description = "the colour purple" + +/datum/reagent/drink/coffee/nukie/special + name = "Nukie Limited Edition" + id = "nukie_special" + color = "#ffffff" + taste_description = "sitting in your college dorm one week before your exams start, staring at a screen without anything particularly interesting on, knowing that you should really be studying, but you can put it off for another day right? Plus your friends are gonna be getting on soon and there's an event starting that you need to prep for" diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index e0154da613..76e20daf0e 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -1521,7 +1521,7 @@ //absorb resists if(escapable || owner.stat) //If the stomach has escapable enabled or the owner is dead/unconscious - if(prob(escapechance) || owner.stat) //Let's have it check to see if the prey's escape attempt starts. + if(prob(escapechance_absorbed) || owner.stat) //Let's have it check to see if the prey's escape attempt starts. var/living_count = 0 diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 36bb6be2f7..d1ebb0e4c7 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -1020,10 +1020,10 @@ /mob/living/examine(mob/user, infix, suffix) . = ..() if(custom_link) - . += "Custom link: [custom_link]" + . += "Custom link: [custom_link]" if(ooc_notes) - . += "OOC Notes: \[View\] - \[Print\]" - . += "\[Mechanical Vore Preferences\]" + . += "OOC Notes: \[View\] - \[Print\]" + . += "\[Mechanical Vore Preferences\]" /mob/living/Topic(href, href_list) //Can't find any instances of Topic() being overridden by /mob/living in polaris' base code, even though /mob/living/carbon/human's Topic() has a ..() call @@ -1116,126 +1116,126 @@ for(var/belly in vore_organs) if(isbelly(belly)) var/obj/belly/B = belly - to_chat(src, "Belly name: [B.name]") - to_chat(src, "Belly desc: [B.desc]") - to_chat(src, "Belly absorbed desc: [B.absorbed_desc]") - to_chat(src, "Vore verb: [B.vore_verb]") - to_chat(src, "Struggle messages (outside):") + to_chat(src, "Belly name: [B.name]") + to_chat(src, "Belly desc: [B.desc]") + to_chat(src, "Belly absorbed desc: [B.absorbed_desc]") + to_chat(src, "Vore verb: [B.vore_verb]") + to_chat(src, "Struggle messages (outside):") for(var/msg in B.struggle_messages_outside) - to_chat(src, "[msg]") - to_chat(src, "Struggle messages (inside):") + to_chat(src, "[msg]") + to_chat(src, "Struggle messages (inside):") for(var/msg in B.struggle_messages_inside) - to_chat(src, "[msg]") - to_chat(src, "Absorbed struggle messages (outside):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed struggle messages (outside):") for(var/msg in B.absorbed_struggle_messages_outside) - to_chat(src, "[msg]") - to_chat(src, "Absorbed struggle messages (inside):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed struggle messages (inside):") for(var/msg in B.absorbed_struggle_messages_inside) - to_chat(src, "[msg]") - to_chat(src, "Escape attempt messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Escape attempt messages (owner):") for(var/msg in B.escape_attempt_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Escape attempt messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Escape attempt messages (prey):") for(var/msg in B.escape_attempt_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Escape messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Escape messages (owner):") for(var/msg in B.escape_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Escape messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Escape messages (prey):") for(var/msg in B.escape_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Escape messages (outside):") + to_chat(src, "[msg]") + to_chat(src, "Escape messages (outside):") for(var/msg in B.escape_messages_outside) - to_chat(src, "[msg]") - to_chat(src, "Escape item messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Escape item messages (owner):") for(var/msg in B.escape_item_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Escape item messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Escape item messages (prey):") for(var/msg in B.escape_item_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Escape item messages (outside):") + to_chat(src, "[msg]") + to_chat(src, "Escape item messages (outside):") for(var/msg in B.escape_item_messages_outside) - to_chat(src, "[msg]") - to_chat(src, "Escape fail messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Escape fail messages (owner):") for(var/msg in B.escape_fail_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Escape fail messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Escape fail messages (prey):") for(var/msg in B.escape_fail_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Absorbed escape attempt messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape attempt messages (owner):") for(var/msg in B.escape_attempt_absorbed_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Absorbed escape attempt messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape attempt messages (prey):") for(var/msg in B.escape_attempt_absorbed_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Absorbed escape messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape messages (owner):") for(var/msg in B.escape_absorbed_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Absorbed escape messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape messages (prey):") for(var/msg in B.escape_absorbed_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Absorbed escape messages (outside):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape messages (outside):") for(var/msg in B.escape_absorbed_messages_outside) - to_chat(src, "[msg]") - to_chat(src, "Absorbed escape fail messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape fail messages (owner):") for(var/msg in B.escape_fail_absorbed_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Absorbed escape fail messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape fail messages (prey):") for(var/msg in B.escape_fail_absorbed_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Primary transfer messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Primary transfer messages (owner):") for(var/msg in B.primary_transfer_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Primary transfer messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Primary transfer messages (prey):") for(var/msg in B.primary_transfer_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Secondary transfer messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Secondary transfer messages (owner):") for(var/msg in B.secondary_transfer_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Secondary transfer messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Secondary transfer messages (prey):") for(var/msg in B.secondary_transfer_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Digest chance messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Digest chance messages (owner):") for(var/msg in B.digest_chance_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Digest chance messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Digest chance messages (prey):") for(var/msg in B.digest_chance_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Absorb chance messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Absorb chance messages (owner):") for(var/msg in B.absorb_chance_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Absorb chance messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Absorb chance messages (prey):") for(var/msg in B.absorb_chance_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Digest messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Digest messages (owner):") for(var/msg in B.digest_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Digest messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Digest messages (prey):") for(var/msg in B.digest_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Absorb messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Absorb messages (owner):") for(var/msg in B.absorb_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Absorb messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Absorb messages (prey):") for(var/msg in B.absorb_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Unabsorb messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Unabsorb messages (owner):") for(var/msg in B.unabsorb_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Unabsorb messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Unabsorb messages (prey):") for(var/msg in B.unabsorb_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Examine messages (when full):") + to_chat(src, "[msg]") + to_chat(src, "Examine messages (when full):") for(var/msg in B.examine_messages) - to_chat(src, "[msg]") - to_chat(src, "Examine messages (with absorbed victims):") + to_chat(src, "[msg]") + to_chat(src, "Examine messages (with absorbed victims):") for(var/msg in B.examine_messages_absorbed) - to_chat(src, "[msg]") - to_chat(src, "Emote lists:") + to_chat(src, "[msg]") + to_chat(src, "Emote lists:") for(var/EL in B.emote_lists) - to_chat(src, "[EL]:") + to_chat(src, "[EL]:") for(var/msg in B.emote_lists[EL]) - to_chat(src, "[msg]") + to_chat(src, "[msg]") /** * Small helper component to manage the vore panel HUD icon diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index be1c3a8172..b93b37da2f 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/vending_vr.dmi b/icons/obj/vending_vr.dmi index 961483a8d2..62dbd8d72f 100644 Binary files a/icons/obj/vending_vr.dmi and b/icons/obj/vending_vr.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 3c3ea5f3fb..53b0689fb1 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,7 +1,7 @@ macro "borghotkeymode" elem name = "TAB" - command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5\"" + command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true\"" elem name = "Shift" command = "KeyDown Shift" @@ -790,7 +790,7 @@ macro "hotkeymode" macro "borgmacro" elem name = "TAB" - command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" + command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true\"" elem name = "Shift" command = "KeyDown Shift" diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm index 7fc97778d1..83d5469ab2 100644 --- a/maps/tether/tether-02-surface2.dmm +++ b/maps/tether/tether-02-surface2.dmm @@ -11275,7 +11275,7 @@ /turf/simulated/floor/plating, /area/tether/surfacebase/outside/outside2) "asy" = ( -/obj/structure/table/rack/holorack, +/obj/structure/table/rack, /obj/random/maintenance/clean, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -13254,7 +13254,7 @@ /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/bar) "avQ" = ( -/obj/structure/table/rack/holorack, +/obj/structure/table/rack, /obj/effect/floor_decal/rust, /obj/random/maintenance/clean, /obj/random/tech_supply, @@ -23572,7 +23572,7 @@ /turf/simulated/floor/plating, /area/maintenance/lower/public_garden_maintenence/upper) "aRh" = ( -/obj/structure/table/rack/holorack, +/obj/structure/table/rack, /obj/random/maintenance/clean, /obj/random/maintenance/clean, /turf/simulated/floor/plating, diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index ac28f44553..41089c2585 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -165,12 +165,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/glass, -/obj/item/device/healthanalyzer/guide, -/obj/effect/floor_decal/borderfloorwhite, -/obj/effect/floor_decal/corner/paleblue/border, -/obj/effect/floor_decal/borderfloorwhite/corner2, -/obj/effect/floor_decal/corner/paleblue/bordercorner2, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "aaq" = ( @@ -407,7 +401,6 @@ dir = 6 }, /obj/machinery/camera/network/medbay, -/obj/structure/medical_stand, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "aaJ" = ( @@ -938,12 +931,15 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "abw" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table/glass, -/obj/machinery/computer/med_data/laptop{ - dir = 4; - pixel_x = 4; - pixel_y = 4 +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/obj/effect/floor_decal/steeldecal/steel_decals4{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals4{ + dir = 9 }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) @@ -2295,39 +2291,12 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "adA" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 30 - }, -/obj/effect/floor_decal/borderfloorwhite{ - dir = 5 - }, -/obj/effect/floor_decal/corner/paleblue/border{ - dir = 5 - }, -/obj/effect/floor_decal/borderfloorwhite/corner2{ - dir = 4 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 4 - }, -/obj/machinery/power/apc{ - dir = 4; - name = "east bump"; - pixel_x = 28 - }, +/obj/effect/floor_decal/techfloor, /obj/structure/cable/green{ - icon_state = "0-8" + icon_state = "1-8" }, -/obj/structure/table/glass, -/obj/machinery/recharger, -/obj/effect/floor_decal/borderfloorwhite/corner2{ - dir = 5 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 5 - }, -/turf/simulated/floor/tiled/white, -/area/tether/surfacebase/medical/lobby) +/turf/simulated/floor/tiled/techfloor/grid, +/area/maintenance/lower/medsec_maintenance) "adB" = ( /obj/effect/floor_decal/steeldecal/steel_decals4, /obj/effect/floor_decal/steeldecal/steel_decals4{ @@ -2354,23 +2323,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/computer/crew{ + dir = 8 + }, /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/table/glass, -/obj/item/weapon/backup_implanter{ - pixel_y = -12 - }, -/obj/item/weapon/backup_implanter{ - pixel_y = -5 - }, -/obj/item/weapon/backup_implanter{ - pixel_y = 2 - }, -/obj/item/weapon/backup_implanter{ - pixel_y = 9 - }, -/obj/structure/window/reinforced, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "adF" = ( @@ -2608,6 +2566,7 @@ /area/tether/surfacebase/security/briefingroom) "adZ" = ( /obj/machinery/light_switch{ + dir = 8; pixel_x = 25 }, /turf/simulated/floor/plating, @@ -3129,11 +3088,6 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/admin) "aeN" = ( -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 24 - }, /obj/effect/floor_decal/borderfloorwhite{ dir = 4 }, @@ -3146,6 +3100,16 @@ /obj/effect/floor_decal/corner/paleblue/bordercorner2{ dir = 6 }, +/obj/machinery/power/apc{ + dir = 4; + name = "east bump"; + pixel_x = 28 + }, +/obj/structure/cable/green{ + icon_state = "0-8" + }, +/obj/structure/table/glass, +/obj/machinery/recharger, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "aeO" = ( @@ -3644,6 +3608,10 @@ /area/tether/surfacebase/medical/surgery1) "afz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/table/glass, +/obj/machinery/door/window/southright{ + req_access = list(5) + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "afA" = ( @@ -3726,21 +3694,11 @@ /area/tether/surfacebase/medical/triage) "afF" = ( /obj/structure/table/glass, -/obj/item/device/flashlight/lamp/green{ - pixel_x = 10; - pixel_y = 14 - }, -/obj/item/weapon/paper_bin{ - pixel_x = -1; +/obj/machinery/computer/med_data/laptop{ + dir = 8; + pixel_x = -4; pixel_y = 4 }, -/obj/item/weapon/folder/white, -/obj/item/weapon/storage/box/body_record_disk{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/weapon/pen, -/obj/structure/window/reinforced, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "afG" = ( @@ -4090,8 +4048,6 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/table/glass, -/obj/item/weapon/storage/box/cups, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "agl" = ( @@ -4417,31 +4373,25 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/lower/medsec_maintenance) "agL" = ( +/obj/effect/floor_decal/techfloor{ + dir = 6 + }, /obj/structure/closet, -/obj/random/maintenance/medical, -/obj/random/maintenance/medical, -/obj/random/maintenance/medical, /obj/random/maintenance/clean, -/turf/simulated/floor/plating, +/obj/random/maintenance/medical, +/obj/random/maintenance/medical, +/obj/random/maintenance/medical, +/turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/lower/medsec_maintenance) "agM" = ( -/obj/machinery/alarm{ - pixel_y = 32 - }, -/obj/machinery/disposal/wall{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/floor_decal/borderfloorwhite{ - dir = 9 - }, -/obj/effect/floor_decal/corner/paleblue/border{ - dir = 9 - }, +/obj/effect/floor_decal/borderfloorwhite, +/obj/effect/floor_decal/corner/paleblue/border, +/obj/effect/floor_decal/borderfloorwhite/corner2, +/obj/effect/floor_decal/corner/paleblue/bordercorner2, +/obj/structure/table/glass, +/obj/item/device/healthanalyzer/guide, /turf/simulated/floor/tiled/white, -/area/tether/surfacebase/medical/lobby) +/area/tether/surfacebase/medical/triage) "agN" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -5243,8 +5193,11 @@ icon_state = "pipe-c" }, /obj/structure/table/glass, -/obj/structure/window/reinforced, -/obj/item/device/sleevemate, +/obj/machinery/computer/med_data/laptop{ + dir = 4; + pixel_x = 4; + pixel_y = 4 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "ahX" = ( @@ -5274,11 +5227,11 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/table/glass, -/obj/machinery/door/window/southright{ - req_access = list(5) +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/structure/bed/chair/office/light, +/obj/effect/landmark/start{ + name = "Medical Doctor" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "ahZ" = ( @@ -5333,16 +5286,19 @@ /obj/machinery/camera/network/medbay{ dir = 4 }, -/obj/structure/table/glass, -/obj/structure/window/reinforced, /obj/effect/floor_decal/borderfloorwhite{ dir = 8 }, /obj/effect/floor_decal/corner/paleblue/border{ dir = 8 }, -/obj/machinery/photocopier/faxmachine{ - department = "Medical Front Desk" +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24; + pixel_y = -8 }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) @@ -5458,26 +5414,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/glass, -/obj/item/device/healthanalyzer/guide, /obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - name = "south bump"; - nightshift_setting = 2; - pixel_y = -24 - }, -/obj/machinery/camera/network/medbay{ - dir = 1 - }, -/obj/effect/floor_decal/borderfloorwhite, -/obj/effect/floor_decal/corner/paleblue/border, -/obj/effect/floor_decal/borderfloorwhite/corner2{ - dir = 9 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 9 + icon_state = "2-4" }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) @@ -5633,17 +5571,6 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/effect/floor_decal/steeldecal/steel_decals6{ - dir = 8 - }, -/obj/machinery/button/remote/airlock{ - desc = "A remote control switch for the medbay foyer."; - dir = 1; - id = "MedbayFoyer"; - name = "Medbay Doors Control"; - pixel_x = -25; - pixel_y = -30 - }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "aiC" = ( @@ -6048,7 +5975,6 @@ /obj/structure/cable/green{ icon_state = "2-8" }, -/obj/effect/floor_decal/steeldecal/steel_decals6, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "ajh" = ( @@ -6592,13 +6518,27 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/admin) "akb" = ( -/obj/structure/grille, -/obj/machinery/door/firedoor, -/obj/structure/window/reinforced/polarized/full{ - id = "medbayfoyer" +/obj/effect/floor_decal/borderfloorwhite{ + dir = 10 }, -/turf/simulated/floor/plating, -/area/tether/surfacebase/medical/lobby) +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 10 + }, +/obj/effect/floor_decal/borderfloorwhite/corner2{ + dir = 9 + }, +/obj/effect/floor_decal/borderfloorwhite/corner2{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 9 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 8 + }, +/obj/structure/medical_stand, +/turf/simulated/floor/tiled/white, +/area/tether/surfacebase/medical/triage) "akc" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -6638,7 +6578,7 @@ /obj/structure/cable/green{ icon_state = "1-2" }, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/chemistry) "akf" = ( /turf/simulated/floor/tiled/techfloor, @@ -6821,18 +6761,19 @@ "akw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock/multi_tile/glass/polarized{ - id_tag = "MedbayFoyer"; - id_tint = "medbayfoyer"; - name = "Medbay Airlock"; - req_one_access = list(5) +/obj/machinery/button/remote/airlock{ + desc = "A remote control switch for the medbay foyer."; + dir = 1; + id = "MedbayFoyer"; + name = "Medbay Doors Control"; + pixel_x = -25; + pixel_y = -30 }, -/obj/machinery/door/firedoor/multi_tile, -/obj/structure/sign/department/medbay{ - pixel_x = -32 +/obj/effect/floor_decal/steeldecal/steel_decals6{ + dir = 8 }, /turf/simulated/floor/tiled/white, -/area/tether/surfacebase/medical/lobby) +/area/tether/surfacebase/medical/triage) "akx" = ( /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/lightgrey/border, @@ -6854,20 +6795,27 @@ /turf/simulated/floor/plating, /area/maintenance/lower/medsec_maintenance) "akz" = ( -/obj/machinery/status_display{ - pixel_y = 30 +/obj/machinery/power/apc{ + name = "south bump"; + nightshift_setting = 2; + pixel_y = -24 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/floor_decal/borderfloorwhite, +/obj/effect/floor_decal/corner/paleblue/border, +/obj/effect/floor_decal/borderfloorwhite/corner2{ + dir = 9 }, -/obj/effect/floor_decal/borderfloorwhite{ - dir = 1 - }, -/obj/effect/floor_decal/corner/paleblue/border{ +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 9 + }, +/obj/structure/table/glass, +/obj/item/device/healthanalyzer/guide, +/obj/machinery/camera/network/medbay{ dir = 1 }, +/obj/structure/cable/green, /turf/simulated/floor/tiled/white, -/area/tether/surfacebase/medical/lobby) +/area/tether/surfacebase/medical/triage) "akA" = ( /obj/structure/grille, /obj/structure/window/reinforced/full, @@ -14931,32 +14879,6 @@ /obj/machinery/camera/network/civilian, /turf/simulated/floor/lino, /area/crew_quarters/bar) -"azu" = ( -/obj/machinery/button/remote/airlock{ - desc = "A remote control switch for the medbay foyer."; - dir = 1; - id = "MedbayFoyer"; - name = "Medbay Doors Control"; - pixel_x = -10; - pixel_y = 28 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/floor_decal/borderfloorwhite{ - dir = 1 - }, -/obj/effect/floor_decal/corner/paleblue/border{ - dir = 1 - }, -/obj/effect/floor_decal/borderfloorwhite/corner2{ - dir = 1 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/tether/surfacebase/medical/lobby) "azv" = ( /obj/effect/floor_decal/corner/lightgrey{ dir = 9 @@ -17272,16 +17194,8 @@ /turf/simulated/floor/tiled/dark, /area/rnd/outpost/xenobiology/outpost_south_airlock) "aDp" = ( -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 9 - }, -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, +/obj/machinery/door/airlock/medical, +/obj/machinery/door/firedoor/glass, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "aDq" = ( @@ -18532,19 +18446,12 @@ /turf/simulated/floor/tiled, /area/tether/surfacebase/botanystorage) "aFC" = ( -/obj/effect/floor_decal/borderfloorwhite{ - dir = 1 +/obj/structure/grille, +/obj/machinery/door/firedoor, +/obj/structure/window/reinforced/polarized/full{ + id = "medbayfoyer" }, -/obj/effect/floor_decal/corner/paleblue/border{ - dir = 1 - }, -/obj/effect/floor_decal/borderfloorwhite/corner2{ - dir = 4 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, +/turf/simulated/floor/plating, /area/tether/surfacebase/medical/lobby) "aFD" = ( /obj/structure/cable/green{ @@ -18992,23 +18899,12 @@ /turf/simulated/floor/tiled/dark, /area/rnd/research/testingrange) "aGm" = ( -/obj/machinery/light{ - dir = 1 +/obj/structure/cable/green{ + icon_state = "1-2" }, -/obj/machinery/door/window/eastleft{ - req_access = list(5) - }, -/obj/effect/floor_decal/borderfloorwhite{ - dir = 1 - }, -/obj/effect/floor_decal/corner/paleblue/border{ - dir = 1 - }, -/obj/effect/floor_decal/borderfloorwhite/corner2{ - dir = 1 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 1 +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/steeldecal/steel_decals6{ + dir = 4 }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) @@ -20006,16 +19902,25 @@ /turf/simulated/floor/tiled, /area/hallway/lower/third_south) "aHS" = ( -/obj/machinery/alarm{ - alarm_id = "anomaly_testing"; - breach_detection = 0; - dir = 8; - pixel_x = 22; - pixel_y = -7; - report_danger_level = 0 +/obj/machinery/button/windowtint/multitint{ + id = "medbayfoyer"; + pixel_x = -8; + pixel_y = -24 }, -/turf/simulated/wall, -/area/tether/surfacebase/medical/lobby) +/obj/effect/floor_decal/borderfloorwhite{ + dir = 6 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 6 + }, +/obj/effect/floor_decal/borderfloorwhite/corner2, +/obj/effect/floor_decal/corner/paleblue/bordercorner2, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 25 + }, +/turf/simulated/floor/tiled/white, +/area/tether/surfacebase/medical/triage) "aHT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -23676,6 +23581,9 @@ /obj/structure/cable/green{ icon_state = "1-2" }, +/obj/structure/cable/green{ + icon_state = "2-4" + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "aOY" = ( @@ -25516,11 +25424,28 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/storage) "aSM" = ( -/obj/structure/table/glass, -/obj/machinery/computer/med_data/laptop{ - dir = 8; - pixel_x = -4; - pixel_y = 4 +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/borderfloorwhite{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/effect/floor_decal/borderfloorwhite/corner2{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 1 + }, +/obj/machinery/button/remote/airlock{ + desc = "A remote control switch for the medbay foyer."; + dir = 1; + id = "MedbayFoyer"; + name = "Medbay Doors Control"; + pixel_x = -10; + pixel_y = 28 }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) @@ -26693,7 +26618,23 @@ /turf/simulated/floor/plating, /area/tether/surfacebase/medical/lobby) "aUV" = ( -/obj/machinery/hologram/holopad, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/weapon/backup_implanter{ + pixel_y = 9 + }, +/obj/item/weapon/backup_implanter{ + pixel_y = 2 + }, +/obj/item/weapon/backup_implanter{ + pixel_y = -5 + }, +/obj/item/weapon/backup_implanter{ + pixel_y = -12 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "aUW" = ( @@ -26908,6 +26849,11 @@ dir = 4 }, /obj/structure/table/glass, +/obj/item/device/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 24 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "aVm" = ( @@ -27302,11 +27248,11 @@ /turf/simulated/floor/tiled, /area/crew_quarters/heads/hop) "aVW" = ( -/obj/structure/bed/chair{ - dir = 1 - }, /obj/effect/floor_decal/borderfloorwhite, /obj/effect/floor_decal/corner/paleblue/border, +/obj/structure/reagent_dispensers/water_cooler/full{ + dir = 1 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "aVX" = ( @@ -35373,7 +35319,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/effect/floor_decal/techfloor/corner, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/lower/medsec_maintenance) "blV" = ( @@ -35500,9 +35445,6 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "bmo" = ( -/obj/machinery/light_switch{ - pixel_y = 25 - }, /obj/random/junk, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -35513,7 +35455,14 @@ /obj/effect/floor_decal/techfloor{ dir = 1 }, -/obj/effect/floor_decal/techfloor, +/obj/machinery/power/apc{ + dir = 1; + name = "north bump"; + pixel_y = 28 + }, +/obj/structure/cable/green{ + icon_state = "0-2" + }, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/lower/medsec_maintenance) "bmp" = ( @@ -35529,7 +35478,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/floor_decal/techfloor, +/obj/machinery/light_switch{ + pixel_y = 25 + }, +/obj/effect/floor_decal/techfloor/corner, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/lower/medsec_maintenance) "bmq" = ( @@ -35735,17 +35687,11 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "bmU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 8 - }, -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) @@ -35827,18 +35773,11 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/button/windowtint/multitint{ - id = "medbayfoyer"; - pixel_x = -8; - pixel_y = -24 - }, -/obj/effect/floor_decal/borderfloorwhite, -/obj/effect/floor_decal/corner/paleblue/border, -/obj/effect/floor_decal/borderfloorwhite/corner2, -/obj/effect/floor_decal/corner/paleblue/bordercorner2, /obj/structure/cable/green{ icon_state = "4-8" }, +/obj/effect/floor_decal/borderfloorwhite/corner, +/obj/effect/floor_decal/corner/paleblue/bordercorner, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "bnk" = ( @@ -35862,10 +35801,14 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/triage) "bnn" = ( -/obj/machinery/door/airlock/medical, -/obj/machinery/door/firedoor/glass, +/obj/effect/floor_decal/steeldecal/steel_decals4{ + dir = 8 + }, +/obj/effect/floor_decal/steeldecal/steel_decals4{ + dir = 5 + }, /turf/simulated/floor/tiled/white, -/area/tether/surfacebase/medical/lobby) +/area/tether/surfacebase/medical/triage) "bno" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -35921,11 +35864,18 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/barrestroom) "bnF" = ( -/obj/effect/floor_decal/steeldecal/steel_decals6{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/sign/department/medbay{ + pixel_x = -32 + }, +/obj/machinery/door/airlock/multi_tile/glass/polarized{ + id_tag = "MedbayFoyer"; + id_tint = "medbayfoyer"; + name = "Medbay Airlock"; + req_one_access = list(5) + }, +/obj/machinery/door/firedoor/multi_tile, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "bnG" = ( @@ -35933,29 +35883,25 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/effect/floor_decal/steeldecal/steel_decals6{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "2-4" - }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "bnI" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24; - pixel_y = -8 +/obj/machinery/disposal/wall{ + dir = 4 }, -/obj/machinery/computer/crew{ +/obj/structure/disposalpipe/trunk{ dir = 4 }, /obj/effect/floor_decal/borderfloorwhite{ - dir = 8 + dir = 9 }, /obj/effect/floor_decal/corner/paleblue/border{ - dir = 8 + dir = 9 }, +/obj/machinery/alarm{ + pixel_y = 32 + }, +/obj/structure/table/glass, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "bnJ" = ( @@ -36135,14 +36081,22 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/hologram/holopad, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "bod" = ( -/obj/structure/bed/chair/office/light, -/obj/effect/landmark/start{ - name = "Medical Doctor" +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/borderfloorwhite{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/machinery/status_display{ + pixel_y = 30 }, -/obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "boe" = ( @@ -36280,6 +36234,9 @@ "bop" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/steeldecal/steel_decals6{ + dir = 1 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "bou" = ( @@ -36470,6 +36427,9 @@ /obj/effect/floor_decal/steeldecal/steel_decals4{ dir = 10 }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "bJF" = ( @@ -37273,6 +37233,25 @@ }, /turf/simulated/floor/tiled, /area/rnd/research/researchdivision) +"dKH" = ( +/obj/structure/table/glass, +/obj/item/weapon/paper_bin{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/device/flashlight/lamp/green{ + pixel_x = 10; + pixel_y = 14 + }, +/obj/item/weapon/folder/white, +/obj/item/weapon/storage/box/body_record_disk{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/weapon/pen, +/obj/structure/window/reinforced, +/turf/simulated/floor/tiled/white, +/area/tether/surfacebase/medical/lobby) "dQY" = ( /obj/structure/table/bench/sifwooden/padded, /turf/simulated/floor/wood, @@ -38727,11 +38706,11 @@ /turf/simulated/floor/wood, /area/tether/surfacebase/cafeteria) "ieo" = ( -/obj/structure/table/glass, -/obj/machinery/door/window/southleft{ - req_access = list(5) +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/bed/chair/office/light, +/obj/effect/landmark/start{ + name = "Medical Doctor" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "ieE" = ( @@ -39961,11 +39940,18 @@ /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/iaa/officea) "lqJ" = ( -/obj/structure/bed/chair/office/light, -/obj/effect/landmark/start{ - name = "Medical Doctor" +/obj/effect/floor_decal/borderfloorwhite{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/effect/floor_decal/borderfloorwhite/corner2{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 4 }, -/obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "lqX" = ( @@ -40311,6 +40297,14 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/briefingroom) +"myX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/table/glass, +/obj/machinery/door/window/southleft{ + req_access = list(5) + }, +/turf/simulated/floor/tiled/white, +/area/tether/surfacebase/medical/lobby) "myZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/borderfloor{ @@ -40883,16 +40877,9 @@ /turf/simulated/floor/reinforced, /area/tether/surfacebase/shuttle_pad) "orc" = ( -/obj/effect/floor_decal/techfloor{ - dir = 4 - }, -/obj/machinery/power/apc{ - dir = 4; - name = "east bump"; - pixel_x = 28 - }, +/obj/effect/floor_decal/techfloor/corner, /obj/structure/cable/green{ - icon_state = "0-2" + icon_state = "2-4" }, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/lower/medsec_maintenance) @@ -40987,6 +40974,12 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/surface_three_hall/nwest) +"oHH" = ( +/obj/structure/table/glass, +/obj/item/device/sleevemate, +/obj/structure/window/reinforced, +/turf/simulated/floor/tiled/white, +/area/tether/surfacebase/medical/lobby) "oII" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/structure/disposalpipe/segment{ @@ -41556,9 +41549,6 @@ /area/tether/surfacebase/shuttle_pad) "qda" = ( /obj/effect/floor_decal/borderfloorwhite, -/obj/structure/bed/chair{ - dir = 1 - }, /obj/machinery/computer/guestpass{ dir = 1; pixel_y = -28 @@ -41567,6 +41557,8 @@ dir = 1 }, /obj/effect/floor_decal/corner/paleblue/border, +/obj/structure/table/glass, +/obj/item/weapon/storage/box/cups, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) "qem" = ( @@ -42531,8 +42523,10 @@ name = "Medical RC"; pixel_x = -30 }, -/obj/structure/reagent_dispensers/water_cooler/full{ - dir = 4 +/obj/structure/window/reinforced, +/obj/structure/table/glass, +/obj/machinery/photocopier/faxmachine{ + department = "Medical Front Desk" }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) @@ -43010,8 +43004,9 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/steeldecal/steel_decals6, /turf/simulated/floor/tiled/white, -/area/tether/surfacebase/medical/lobby) +/area/tether/surfacebase/medical/triage) "uBR" = ( /obj/structure/bed/chair/wood{ dir = 4 @@ -43744,11 +43739,23 @@ /turf/simulated/floor/tiled, /area/tether/surfacebase/shuttle_pad) "wKZ" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/machinery/door/window/eastleft{ + req_access = list(5) }, -/obj/machinery/computer/crew{ - dir = 8 +/obj/effect/floor_decal/borderfloorwhite{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/effect/floor_decal/borderfloorwhite/corner2{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/lobby) @@ -55947,7 +55954,7 @@ aaE abk abP acv -agL +abR abe aaE aeD @@ -56235,7 +56242,7 @@ abR abS aaE bmo -aeG +adA aeG aeG aeG @@ -56377,8 +56384,8 @@ adZ abR aaE bmp +agL aeG -agM bnI aif sWs @@ -56519,11 +56526,11 @@ aah aah aah bmN +aah aeG -akz bod ieo -lXo +myX agl lXo qda @@ -56662,10 +56669,10 @@ afE adw ady akb -azu +aFC aSM afF -agX +dKH bno agX aVW @@ -56807,7 +56814,7 @@ bnn aDp abw ahW -agX +oHH bno afC aVn @@ -56945,7 +56952,7 @@ blx bmH acR aap -akb +agM aFC lqJ ahY @@ -57087,8 +57094,8 @@ blA bmI eDc aim +akz aeG -aGm wKZ adE aUV @@ -57373,7 +57380,7 @@ acR ajg uAI bnG -uAI +aGm aOX gtn jYk @@ -57514,7 +57521,7 @@ bmP bmX bnj aHS -adA +aeG bGJ aeN aUW diff --git a/tgui/package.json b/tgui/package.json index 3aa94299c4..a3bdcb4d90 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -28,7 +28,7 @@ "@babel/preset-typescript": "^7.17.12", "@types/jest": "^27.5.1", "@types/jsdom": "^16.2.14", - "@types/node": "^17.0.35", + "@types/node": "^14.x", "@types/webpack": "^5.28.0", "@types/webpack-env": "^1.17.0", "@typescript-eslint/parser": "^5.25.0", diff --git a/tgui/packages/common/redux.ts b/tgui/packages/common/redux.ts index 4e618bddaf..1635853c6b 100644 --- a/tgui/packages/common/redux.ts +++ b/tgui/packages/common/redux.ts @@ -201,12 +201,16 @@ export const createAction = ( export const useDispatch = (context: { store: Store; }): Dispatch => { - return context.store.dispatch; + return context?.store?.dispatch; }; export const useSelector = ( context: { store: Store }, selector: (state: State) => Selected ): Selected => { - return selector(context.store.getState()); + if (!context) { + return {} as Selected; + } + + return selector(context?.store?.getState()); }; diff --git a/tgui/packages/tgui-panel/Notifications.jsx b/tgui/packages/tgui-panel/Notifications.tsx similarity index 100% rename from tgui/packages/tgui-panel/Notifications.jsx rename to tgui/packages/tgui-panel/Notifications.tsx diff --git a/tgui/packages/tgui-panel/Panel.jsx b/tgui/packages/tgui-panel/Panel.tsx similarity index 79% rename from tgui/packages/tgui-panel/Panel.jsx rename to tgui/packages/tgui-panel/Panel.tsx index 83150ab6ef..c7a3d51e82 100644 --- a/tgui/packages/tgui-panel/Panel.jsx +++ b/tgui/packages/tgui-panel/Panel.tsx @@ -15,10 +15,6 @@ import { ReconnectButton } from './reconnect'; import { SettingsPanel, useSettings } from './settings'; export const Panel = (props, context) => { - // IE8-10: Needs special treatment due to missing Flex support - if (Byond.IS_LTE_IE10) { - return ; - } const audio = useAudio(context); const settings = useSettings(context); const game = useGame(context); @@ -29,6 +25,7 @@ export const Panel = (props, context) => { return ; } } + return ( @@ -83,13 +80,13 @@ export const Panel = (props, context) => { - {game.connectionLostAt && ( + {settings.showReconnectWarning && game.connectionLostAt && ( }> You are either AFK, experiencing lag or the connection has closed. )} - {game.roundRestartedAt && ( + {settings.showReconnectWarning && game.roundRestartedAt && ( The connection has been closed because the server is restarting. Please wait while you automatically reconnect. @@ -102,27 +99,3 @@ export const Panel = (props, context) => { ); }; - -const HoboPanel = (props, context) => { - const settings = useSettings(context); - return ( - - - - {(settings.visible && ) || ( - - )} - - - ); -}; diff --git a/tgui/packages/tgui-panel/audio/hooks.js b/tgui/packages/tgui-panel/audio/hooks.ts similarity index 100% rename from tgui/packages/tgui-panel/audio/hooks.js rename to tgui/packages/tgui-panel/audio/hooks.ts diff --git a/tgui/packages/tgui-panel/audio/player.js b/tgui/packages/tgui-panel/audio/player.js index f9dfa41cef..50eccee16b 100644 --- a/tgui/packages/tgui-panel/audio/player.js +++ b/tgui/packages/tgui-panel/audio/player.js @@ -10,10 +10,6 @@ const logger = createLogger('AudioPlayer'); export class AudioPlayer { constructor() { - // Doesn't support HTMLAudioElement - if (Byond.IS_LTE_IE9) { - return; - } // Set up the HTMLAudioElement node this.node = document.createElement('audio'); this.node.style.setProperty('display', 'none'); diff --git a/tgui/packages/tgui-panel/audio/reducer.js b/tgui/packages/tgui-panel/audio/reducer.ts similarity index 100% rename from tgui/packages/tgui-panel/audio/reducer.js rename to tgui/packages/tgui-panel/audio/reducer.ts diff --git a/tgui/packages/tgui-panel/audio/selectors.js b/tgui/packages/tgui-panel/audio/selectors.ts similarity index 100% rename from tgui/packages/tgui-panel/audio/selectors.js rename to tgui/packages/tgui-panel/audio/selectors.ts diff --git a/tgui/packages/tgui-panel/chat/constants.ts b/tgui/packages/tgui-panel/chat/constants.ts index 1b5060df13..bfb3c61cb2 100644 --- a/tgui/packages/tgui-panel/chat/constants.ts +++ b/tgui/packages/tgui-panel/chat/constants.ts @@ -36,6 +36,7 @@ export const MESSAGE_TYPE_LOOC = 'looc'; export const MESSAGE_TYPE_ADMINPM = 'adminpm'; export const MESSAGE_TYPE_MENTORPM = 'mentorpm'; export const MESSAGE_TYPE_COMBAT = 'combat'; +export const MESSAGE_TYPE_CHATPRINT = 'chatprint'; export const MESSAGE_TYPE_ADMINCHAT = 'adminchat'; export const MESSAGE_TYPE_MODCHAT = 'modchat'; export const MESSAGE_TYPE_RLOOC = 'rlooc'; @@ -144,6 +145,12 @@ export const MESSAGE_TYPES = [ description: 'Urist McTraitor has stabbed you with a knife!', selector: '.danger', }, + { + type: MESSAGE_TYPE_CHATPRINT, + name: 'Chat prints', + description: 'Chat outputs of ooc notes or vorebelly exports', + selector: '.chatexport', + }, { type: MESSAGE_TYPE_UNKNOWN, name: 'Unsorted', diff --git a/tgui/packages/tgui-panel/chat/middleware.js b/tgui/packages/tgui-panel/chat/middleware.js index ffcc40a6e7..9d54c9d802 100644 --- a/tgui/packages/tgui-panel/chat/middleware.js +++ b/tgui/packages/tgui-panel/chat/middleware.js @@ -66,6 +66,31 @@ const loadChatFromStorage = async (store) => { } if (archivedMessages) { chatRenderer.archivedMessages = archivedMessages; + + /* FIXME Implement this later on + const settings = selectSettings(store.getState()); + const filteredMessages = []; + + // Checks if the setting is actually set or set to -1 (infinite) + // Otherwise make it grow infinitely + if (settings.logRetainDays || settings.logRetainDays === -1) { + const limit = new Date(); + limit.setDate(limit.getMinutes() - settings.logRetainDays); + + for (let message of archivedMessages) { + const timestamp = new Date(message.createdAt); + timestamp.setDate(timestamp.getMinutes() - settings.logRetainDays); + + if (timestamp.getDate() < limit.getDate()) { + filteredMessages.push(message); + } + } + + archivedMessages.length = 0; + } + + chatRenderer.archivedMessages = filteredMessages; + */ } store.dispatch(loadChat(state)); }; @@ -179,7 +204,8 @@ export const chatMiddleware = (store) => { return next(action); } if (type === saveChatToDisk.type) { - chatRenderer.saveToDisk(); + const settings = selectSettings(store.getState()); + chatRenderer.saveToDisk(settings.logLineCount); return; } if (type === purgeChatMessageArchive.type) { diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.jsx similarity index 83% rename from tgui/packages/tgui-panel/chat/renderer.js rename to tgui/packages/tgui-panel/chat/renderer.jsx index def5a2aed6..212f1baf53 100644 --- a/tgui/packages/tgui-panel/chat/renderer.js +++ b/tgui/packages/tgui-panel/chat/renderer.jsx @@ -189,7 +189,9 @@ class ChatRenderer { highlightSettings.map((id) => { const setting = highlightSettingById[id]; const text = setting.highlightText; + const blacklist = setting.blacklistText; const highlightColor = setting.highlightColor; + const highlightBlacklist = setting.highlightBlacklist; const highlightWholeMessage = setting.highlightWholeMessage; const matchWord = setting.matchWord; const matchCase = setting.matchCase; @@ -214,6 +216,55 @@ class ChatRenderer { if (lines.length === 0) { return; } + const blacklistLines = String(blacklist) + .split(',') + .map((str) => str.trim()) + .filter( + (str) => + // Must be longer than one character + str && + str.length > 1 && + // Must be alphanumeric (with some punctuation) + allowedRegex.test(str) && + // Reset lastIndex so it does not mess up the next word + ((allowedRegex.lastIndex = 0) || true) + ); + let blacklistWords; + let blacklistregex; + if (highlightBlacklist && blacklistLines.length > 0) { + let blacklistRegexExpressions = []; + for (let line of blacklistLines) { + // Regex expression syntax is /[exp]/ + if (line.charAt(0) === '/' && line.charAt(line.length - 1) === '/') { + const expr = line.substring(1, line.length - 1); + // Check if this is more than one character + if (/^(\[.*\]|\\.|.)$/.test(expr)) { + continue; + } + blacklistRegexExpressions.push(expr); + } else { + // Lazy init + if (!blacklistWords) { + blacklistWords = []; + } + // We're not going to let regex characters fuck up our RegEx operation. + line = line.replace(regexEscapeCharacters, '\\$&'); + + blacklistWords.push('^\\s*' + line); + blacklistWords.push('^\\[\\d+:\\d+\\]\\s*' + line); + } + } + const regexStrBL = blacklistWords.join('|'); + const flagsBL = 'i'; + // We wrap this in a try-catch to ensure that broken regex doesn't break + // the entire chat. + try { + blacklistregex = new RegExp('(' + regexStrBL + ')', flagsBL); + } catch { + // We just reset it if it's invalid. + blacklistregex = null; + } + } let regexExpressions = []; // Organize each highlight entry into regex expressions and words for (let line of lines) { @@ -263,6 +314,8 @@ class ChatRenderer { highlightRegex, highlightColor, highlightWholeMessage, + highlightBlacklist, + blacklistregex, }); }); } @@ -306,15 +359,14 @@ class ChatRenderer { const to = Math.max(0, len - COMBINE_MAX_MESSAGES); for (let i = from; i >= to; i--) { const message = this.visibleMessages[i]; - // prettier-ignore - const matches = ( + + const matches = // Is not an internal message - !message.type.startsWith(MESSAGE_TYPE_INTERNAL) + !message.type.startsWith(MESSAGE_TYPE_INTERNAL) && // Text payload must fully match - && isSameMessage(message, predicate) + isSameMessage(message, predicate) && // Must land within the specified time window - && now < message.createdAt + COMBINE_MAX_TIME_WINDOW - ); + now < message.createdAt + COMBINE_MAX_TIME_WINDOW; if (matches) { return message; } @@ -415,14 +467,22 @@ class ChatRenderer { // Highlight text if (!message.avoidHighlighting && this.highlightParsers) { this.highlightParsers.map((parser) => { - const highlighted = highlightNode( - node, - parser.highlightRegex, - parser.highlightWords, - (text) => createHighlightNode(text, parser.highlightColor) - ); - if (highlighted && parser.highlightWholeMessage) { - node.className += ' ChatMessage--highlighted'; + if ( + !( + parser.highlightBlacklist && + parser.blacklistregex && + parser.blacklistregex.test(node.textContent) + ) + ) { + const highlighted = highlightNode( + node, + parser.highlightRegex, + parser.highlightWords, + (text) => createHighlightNode(text, parser.highlightColor) + ); + if (highlighted && parser.highlightWholeMessage) { + node.className += ' ChatMessage--highlighted'; + } } }); } @@ -446,11 +506,13 @@ class ChatRenderer { if (!message.type) { // IE8: Does not support querySelector on elements that // are not yet in the document. - // prettier-ignore - const typeDef = !Byond.IS_LTE_IE8 && MESSAGE_TYPES - .find(typeDef => ( - typeDef.selector && node.querySelector(typeDef.selector) - )); + + const typeDef = + !Byond.IS_LTE_IE8 && + MESSAGE_TYPES.find( + (typeDef) => + typeDef.selector && node.querySelector(typeDef.selector) + ); message.type = typeDef?.type || MESSAGE_TYPE_UNKNOWN; } updateMessageBadge(message); @@ -508,10 +570,10 @@ class ChatRenderer { message.node = 'pruned'; } // Remove pruned messages from the message array - // prettier-ignore - this.messages = this.messages.filter(message => ( - message.node !== 'pruned' - )); + + this.messages = this.messages.filter( + (message) => message.node !== 'pruned' + ); logger.log(`pruned ${fromIndex} visible messages`); } } @@ -552,7 +614,7 @@ class ChatRenderer { }); } - saveToDisk() { + saveToDisk(logLineCount) { // Allow only on IE11 if (Byond.IS_LTE_IE10) { return; @@ -572,27 +634,38 @@ class ChatRenderer { cssText += 'body, html { background-color: #141414 }\n'; // Compile chat log as HTML text let messagesHtml = ''; + + let tmpMsgArray = []; + if (logLineCount > 0) { + tmpMsgArray = this.archivedMessages.slice(-logLineCount); + } else { + tmpMsgArray = this.archivedMessages; + } + // for (let message of this.visibleMessages) { // TODO: Actually having a better message archiving maybe for exports? - for (let message of this.archivedMessages) { + for (let message of tmpMsgArray) { // if (message.node) { // messagesHtml += message.node.outerHTML + '\n'; // } messagesHtml += message.html + '\n'; } // Create a page - // prettier-ignore - const pageHtml = '\n' - + '\n' - + '\n' - + 'SS13 Chat Log\n' - + '\n' - + '\n' - + '\n' - + '
\n' - + messagesHtml - + '
\n' - + '\n' - + '\n'; + + const pageHtml = + '\n' + + '\n' + + '\n' + + 'SS13 Chat Log\n' + + '\n' + + '\n' + + '\n' + + '
\n' + + messagesHtml + + '
\n' + + '\n' + + '\n'; // Create and send a nice blob const blob = new Blob([pageHtml]); const timestamp = new Date() diff --git a/tgui/packages/tgui-panel/chat/replaceInTextNode.js b/tgui/packages/tgui-panel/chat/replaceInTextNode.js index 753997b3b8..5c345e90a1 100644 --- a/tgui/packages/tgui-panel/chat/replaceInTextNode.js +++ b/tgui/packages/tgui-panel/chat/replaceInTextNode.js @@ -171,8 +171,8 @@ export const highlightNode = ( // Linkify // -------------------------------------------------------- -// prettier-ignore -const URL_REGEX = /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+&@#/%?=~_|$!:,.;(){}]+/ig; +const URL_REGEX = + /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+&@#/%?=~_|$!:,.;(){}]+/gi; /** * Highlights the text in the node based on the provided regular expression. diff --git a/tgui/packages/tgui-panel/chat/selectors.js b/tgui/packages/tgui-panel/chat/selectors.ts similarity index 85% rename from tgui/packages/tgui-panel/chat/selectors.js rename to tgui/packages/tgui-panel/chat/selectors.ts index 6352b7cddf..2908f66126 100644 --- a/tgui/packages/tgui-panel/chat/selectors.js +++ b/tgui/packages/tgui-panel/chat/selectors.ts @@ -9,7 +9,7 @@ import { map } from 'common/collections'; export const selectChat = (state) => state.chat; export const selectChatPages = (state) => - map((id) => state.chat.pageById[id])(state.chat.pages); + map((id: string) => state.chat.pageById[id])(state.chat.pages); export const selectCurrentChatPage = (state) => state.chat.pageById[state.chat.currentPageId]; diff --git a/tgui/packages/tgui-panel/game/actions.js b/tgui/packages/tgui-panel/game/actions.ts similarity index 100% rename from tgui/packages/tgui-panel/game/actions.js rename to tgui/packages/tgui-panel/game/actions.ts diff --git a/tgui/packages/tgui-panel/game/hooks.js b/tgui/packages/tgui-panel/game/hooks.ts similarity index 100% rename from tgui/packages/tgui-panel/game/hooks.js rename to tgui/packages/tgui-panel/game/hooks.ts diff --git a/tgui/packages/tgui-panel/game/reducer.js b/tgui/packages/tgui-panel/game/reducer.ts similarity index 94% rename from tgui/packages/tgui-panel/game/reducer.js rename to tgui/packages/tgui-panel/game/reducer.ts index 97535524c5..c446db8f02 100644 --- a/tgui/packages/tgui-panel/game/reducer.js +++ b/tgui/packages/tgui-panel/game/reducer.ts @@ -16,7 +16,7 @@ const initialState = { }; export const gameReducer = (state = initialState, action) => { - const { type, payload, meta } = action; + const { type, meta } = action; if (type === 'roundrestart') { return { ...state, diff --git a/tgui/packages/tgui-panel/game/selectors.js b/tgui/packages/tgui-panel/game/selectors.ts similarity index 100% rename from tgui/packages/tgui-panel/game/selectors.js rename to tgui/packages/tgui-panel/game/selectors.ts diff --git a/tgui/packages/tgui-panel/index.js b/tgui/packages/tgui-panel/index.tsx similarity index 86% rename from tgui/packages/tgui-panel/index.js rename to tgui/packages/tgui-panel/index.tsx index adf5749001..2c5ef175a8 100644 --- a/tgui/packages/tgui-panel/index.js +++ b/tgui/packages/tgui-panel/index.tsx @@ -23,6 +23,7 @@ import { setupPanelFocusHacks } from './panelFocus'; import { pingMiddleware, pingReducer } from './ping'; import { settingsMiddleware, settingsReducer } from './settings'; import { telemetryMiddleware } from './telemetry'; +import { setGlobalStore } from 'tgui/backend'; perf.mark('inception', window.performance?.timing?.navigationStart); perf.mark('init'); @@ -48,6 +49,8 @@ const store = configureStore({ }); const renderApp = createRenderer(() => { + setGlobalStore(store); + const { Panel } = require('./Panel'); return ( @@ -87,7 +90,7 @@ const setupApp = () => { }); // Resize the panel to match the non-browser output - Byond.winget('output').then((output) => { + Byond.winget('output').then((output: { size: string }) => { Byond.winset('browseroutput', { 'size': output.size, }); @@ -96,19 +99,22 @@ const setupApp = () => { // Enable hot module reloading if (module.hot) { setupHotReloading(); - // prettier-ignore - module.hot.accept([ - './audio', - './chat', - './game', - './Notifications', - './Panel', - './ping', - './settings', - './telemetry', - ], () => { - renderApp(); - }); + + module.hot.accept( + [ + './audio', + './chat', + './game', + './Notifications', + './Panel', + './ping', + './settings', + './telemetry', + ], + () => { + renderApp(); + } + ); } }; diff --git a/tgui/packages/tgui-panel/package.json b/tgui/packages/tgui-panel/package.json index d60ccaaa9b..7aab57e169 100644 --- a/tgui/packages/tgui-panel/package.json +++ b/tgui/packages/tgui-panel/package.json @@ -1,8 +1,10 @@ { "private": true, "name": "tgui-panel", - "version": "4.3.1", + "version": "5.0.0", "dependencies": { + "@types/node": "^14.x", + "@types/react": "^18.2.42", "common": "workspace:*", "dompurify": "^2.3.1", "inferno": "^7.4.8", diff --git a/tgui/packages/tgui-panel/ping/actions.js b/tgui/packages/tgui-panel/ping/actions.ts similarity index 100% rename from tgui/packages/tgui-panel/ping/actions.js rename to tgui/packages/tgui-panel/ping/actions.ts diff --git a/tgui/packages/tgui-panel/ping/reducer.js b/tgui/packages/tgui-panel/ping/reducer.ts similarity index 82% rename from tgui/packages/tgui-panel/ping/reducer.js rename to tgui/packages/tgui-panel/ping/reducer.ts index b1e3d679cb..fcab775548 100644 --- a/tgui/packages/tgui-panel/ping/reducer.js +++ b/tgui/packages/tgui-panel/ping/reducer.ts @@ -8,7 +8,14 @@ import { clamp01, scale } from 'common/math'; import { pingFail, pingSuccess } from './actions'; import { PING_MAX_FAILS, PING_ROUNDTRIP_BEST, PING_ROUNDTRIP_WORST } from './constants'; -export const pingReducer = (state = {}, action) => { +type PingState = { + roundtrip: number | undefined; + roundtripAvg: number | undefined; + failCount: number; + networkQuality: number; +}; + +export const pingReducer = (state = {} as PingState, action) => { const { type, payload } = action; if (type === pingSuccess.type) { @@ -30,7 +37,7 @@ export const pingReducer = (state = {}, action) => { const networkQuality = clamp01( state.networkQuality - failCount / PING_MAX_FAILS ); - const nextState = { + const nextState: PingState = { ...state, failCount: failCount + 1, networkQuality, diff --git a/tgui/packages/tgui-panel/ping/selectors.js b/tgui/packages/tgui-panel/ping/selectors.ts similarity index 100% rename from tgui/packages/tgui-panel/ping/selectors.js rename to tgui/packages/tgui-panel/ping/selectors.ts diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx b/tgui/packages/tgui-panel/settings/SettingsPanel.jsx index c52d36e102..25b1b963f6 100644 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx +++ b/tgui/packages/tgui-panel/settings/SettingsPanel.jsx @@ -42,6 +42,7 @@ export const SettingsPanel = (props, context) => { {activeTab === 'general' && } + {activeTab === 'export' && } {activeTab === 'chatPage' && } {activeTab === 'textHighlight' && } @@ -50,17 +51,10 @@ export const SettingsPanel = (props, context) => { }; export const SettingsGeneral = (props, context) => { - const { theme, fontFamily, fontSize, lineHeight } = useSelector( - context, - selectSettings - ); + const { theme, fontFamily, fontSize, lineHeight, showReconnectWarning } = + useSelector(context, selectSettings); const dispatch = useDispatch(context); const [freeFont, setFreeFont] = useLocalState(context, 'freeFont', false); - const [purgeConfirm, setPurgeConfirm] = useLocalState( - context, - 'purgeConfirm', - 0 - ); return (
@@ -155,6 +149,67 @@ export const SettingsGeneral = (props, context) => { } /> + + + dispatch( + updateSettings({ + showReconnectWarning: !showReconnectWarning, + }) + ) + } + /> + + +
+ ); +}; + +export const ExportTab = (props, context) => { + const dispatch = useDispatch(context); + const { logRetainDays, logLineCount } = useSelector(context, selectSettings); + const [purgeConfirm, setPurgeConfirm] = useLocalState( + context, + 'purgeConfirm', + 0 + ); + return ( +
+ + {/* FIXME: Implement this later on + + + dispatch( + updateSettings({ + logRetainDays: value, + }) + ) + } + /> + + */} + + + dispatch( + updateSettings({ + logLineCount: value, + }) + ) + } + /> +