diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 7a78e1d001..73d3e69ac4 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -114,7 +114,7 @@ // BYOND Bug #2563917 // Construct text var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g") - var/complete_text = "[text]" + var/complete_text = "[owner.say_emphasis(text)]" var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(replacetext(complete_text, html_metachars, "m"), null, CHAT_MESSAGE_WIDTH)) approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index edd657e6ce..e3f4829d3d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -872,6 +872,14 @@ /atom/proc/GenerateTag() return +/** + * Called after a shuttle is loaded **from map template initially**. + * + * @params + * * port - Mobile port/shuttle + * * dock - Stationary dock the shuttle's at + * * idnum - ID number of the shuttle + */ /atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) return diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 2a166c2cdc..70a59230b2 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -35,11 +35,6 @@ M.unset_machine() //to properly reset the view of the users if the console is deleted. return ..() -/obj/machinery/computer/security/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) - for(var/i in network) - network -= i - network += "[idnum][i]" - /obj/machinery/computer/security/can_interact(mob/user) if((!hasSiliconAccessInArea(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src)) return FALSE @@ -262,3 +257,12 @@ name = "AI upload monitor" desc = "A telescreen that connects to the AI upload's camera network." network = list("aiupload") + +// Subtype that connects to shuttles. +/obj/machinery/computer/security/shuttle + circuit = /obj/item/circuitboard/computer/security/shuttle + +/obj/machinery/computer/security/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) + for(var/i in network) + network -= i + network += "[idnum][i]" diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm index bdc16c565b..1b2ce686d2 100644 --- a/code/game/machinery/shuttle/shuttle_engine.dm +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -57,7 +57,16 @@ . = ..() check_setup() +/obj/machinery/shuttle/engine/Destroy() + attached_heater = FALSE + thruster_active = FALSE + return ..() + /obj/machinery/shuttle/engine/proc/check_setup() + if(!anchored) + attached_heater = null + update_engine() + return var/heater_turf switch(dir) if(NORTH) @@ -124,15 +133,6 @@ env.temperature += deltaTemperature air_update_turf() -/obj/machinery/shuttle/engine/attackby(obj/item/I, mob/living/user, params) - check_setup() - if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I)) - return - if(default_pry_open(I)) - return - if(panel_open) - if(default_change_direction_wrench(user, I)) - return - if(default_deconstruction_crowbar(I)) - return - return ..() +/obj/machinery/shuttle/engine/default_change_direction_wrench(mob/user, obj/item/I) + . = ..() + update_engine() diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index ae579054b1..f94c8f3513 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -14,6 +14,10 @@ name = "Security Cameras (Computer Board)" build_path = /obj/machinery/computer/security +/obj/item/circuitboard/computer/security/shuttle + name = "Shuttlelinking Security Cameras (Computer Board)" + build_path = /obj/machinery/computer/security/shuttle + /obj/item/circuitboard/computer/xenobiology name = "circuit board (Xenobiology Console)" build_path = /obj/machinery/computer/camera_advanced/xenobio diff --git a/code/game/say.dm b/code/game/say.dm index 187994f432..35a1b1d072 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/endspanpart = "" //Message - var/messagepart = " " + var/messagepart = " " var/languageicon = "" var/datum/language/D = GLOB.language_datum_instances[message_language] @@ -96,6 +96,18 @@ GLOBAL_LIST_INIT(freqtospan, list( return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]" // Citadel edit [spanned ? ", \"[spanned]\"" : ""]" +#define ENCODE_HTML_EPHASIS(input, char, html, varname) \ + var/static/regex/##varname = regex("[char]{2}(.+?)[char]{2}", "g");\ + input = varname.Replace_char(input, "<[html]>$1[html]>") + +/atom/movable/proc/say_emphasis(input) + ENCODE_HTML_EPHASIS(input, "\\|", "i", italics) + ENCODE_HTML_EPHASIS(input, "\\+", "b", bold) + ENCODE_HTML_EPHASIS(input, "_", "u", underline) + return input + +#undef ENCODE_HTML_EPHASIS + /// Quirky citadel proc for our custom sayverbs to strip the verb out. Snowflakey as hell, say rewrite 3.0 when? /atom/movable/proc/quoteless_say_quote(input, list/spans = list(speech_span), message_mode) var/pos = findtext(input, "*") diff --git a/code/game/world.dm b/code/game/world.dm index 1c6f3bceba..999480062f 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -39,6 +39,9 @@ GLOBAL_LIST(topic_status_cache) #ifndef USE_CUSTOM_ERROR_HANDLER world.log = file("[GLOB.log_directory]/dd.log") +#else + if (TgsAvailable()) + world.log = file("[GLOB.log_directory]/dd.log") //not all runtimes trigger world/Error, so this is the only way to ensure we can see all of them. #endif load_admins() @@ -67,10 +70,6 @@ GLOBAL_LIST(topic_status_cache) /world/proc/InitTgs() TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED) GLOB.revdata.load_tgs_info() -#ifdef USE_CUSTOM_ERROR_HANDLER - if (TgsAvailable()) - world.log = file("[GLOB.log_directory]/dd.log") //not all runtimes trigger world/Error, so this is the only way to ensure we can see all of them. -#endif GLOB.tgs_initialized = TRUE /world/proc/HandleTestRun() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 111054c383..7d0a701e8f 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -457,6 +457,7 @@ message = params if(type_override) emote_type = type_override + message = user.say_emphasis(message) . = ..() message = null emote_type = EMOTE_VISIBLE diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index e2b3aee35d..a403845ee2 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -113,7 +113,7 @@ if(name != real_name) alt_name = " (died as [real_name])" - var/spanned = say_quote(message) + var/spanned = say_quote(say_emphasis(message)) message = emoji_parse(message) var/rendered = "DEAD: [name][alt_name] " log_talk(message, LOG_SAY, tag="DEAD") diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 44dc3e2a05..5ed24af726 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -60,7 +60,7 @@ proc/get_top_level_mob(var/mob/S) return FALSE user.log_message(message, LOG_EMOTE) - message = "[user] " + "[message]" + message = "[user] " + "[user.say_emphasis(message)]" for(var/mob/M in GLOB.dead_mob_list) if(!M.client || isnewplayer(M)) @@ -121,7 +121,7 @@ proc/get_top_level_mob(var/mob/S) return FALSE user.log_message(message, LOG_SUBTLER) - message = "[user] " + "[message]" + message = "[user] " + "[user.say_emphasis(message)]" if(emote_type == EMOTE_AUDIBLE) user.audible_message(message=message,hearing_distance=1, ignored_mobs = GLOB.dead_mob_list) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 600ee4ad14..cadd9ba04f 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -138,6 +138,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) var/turf/T = get_step(src, movedir) if(length(T.contents) > 150) return + affecting.len = min(affecting.len, 150 - length(T.contents)) for(var/atom/movable/A in affecting) if((A.loc == loc) && A.has_gravity()) A.ConveyorMove(movedir) diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm index 0e93481f66..914e9ec225 100644 --- a/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm +++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm @@ -10,6 +10,14 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SECURITY +/datum/design/board/shuttleseccamera + name = "Computer Design (Shuttle-Linked Security Camera)" + desc = "Same as a regular security camera console, but when linked to a shuttle, will specifically access cameras on that shuttle." + id = "shuttleseccamera" + build_path = /obj/item/circuitboard/computer/security/shuttle + category = list("Computer Boards") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/board/secdata name = "Computer Design (Security Records Console)" desc = "Allows for the construction of circuit boards used to build a security records console." diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 77fb37b65c..b782eccfcc 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -183,7 +183,7 @@ name = "dock[SSshuttle.stationary.len]" if(!area_type) var/area/place = get_area(src) - area_type = place?.type // We might be created in nullspace + area_type = place?.type || SHUTTLE_DEFAULT_UNDERLYING_AREA // We might be created in nullspace if(mapload) for(var/turf/T in return_turfs()) @@ -218,6 +218,9 @@ if(!roundstart_template) CRASH("Invalid path ([roundstart_template]) passed to docking port.") + if(roundstart_template) + SSshuttle.manipulator.action_load(roundstart_template, src) + //returns first-found touching shuttleport /obj/docking_port/stationary/get_docked() . = locate(/obj/docking_port/mobile) in loc @@ -704,7 +707,7 @@ if(timeleft > 1 HOURS) return "--:--" else if(timeleft > 0) - return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, " ")]" + return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]" else return "00:00" diff --git a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm index b014b7bbf8..6b67eec5b8 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm @@ -4,9 +4,9 @@ icon = 'icons/obj/module.dmi' icon_state = "shuttledisk" force = 0 - throwforce = 8 - throw_speed = 3 - throw_range = 5 + throwforce = 0 + throw_speed = 1 + throw_range = 7 density = FALSE anchored = FALSE item_flags = NOBLUDGEON diff --git a/html/changelog.html b/html/changelog.html index 11dd52b5bb..248425b507 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -59,10 +59,18 @@