diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 8dec5eb9d32..c5fbb88f889 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -314,8 +314,8 @@ // This only works on 511 because it relies on 511's `var/something = foo = bar` syntax. #define WEAKREF(D) (istype(D, /datum) && !D:gcDestroyed ? (D:weakref || (D:weakref = new/datum/weakref(D))) : null) -#define ADD_VERB_IN(the_atom,time,verb) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(add_verb), verb), time, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_NO_HASH_WAIT) -#define ADD_VERB_IN_IF(the_atom,time,verb,callback) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(add_verb), verb, callback), time, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_NO_HASH_WAIT) +#define ADD_VERB_IN(the_atom,time,verb) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(add_verb), the_atom, verb), time, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_NO_HASH_WAIT) +#define ADD_VERB_IN_IF(the_atom,time,verb,callback) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(add_verb), the_atom, verb, callback), time, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_NO_HASH_WAIT) // Maploader bounds indices #define MAP_MINX 1 diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e2c9b339d59..9eb0f9cbf9c 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -105,8 +105,8 @@ return ..() -/mob/living/silicon/ai/AltClickOn(var/atom/A) - if(!control_disabled && A.AIAltClick(src)) +/mob/living/silicon/ai/AltClickOn(var/mob/living/silicon/user) + if(!control_disabled && user.AIAltClick(src)) return /mob/living/silicon/ai/MiddleClickOn(var/atom/A) @@ -122,64 +122,55 @@ /atom/proc/AICtrlShiftClick() return -/atom/proc/AIShiftClick() +/atom/proc/AIShiftClick(var/mob/user) return -/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! - if(density) - Topic(src, list("command"="open", "activate" = "1")) - else - Topic(src, list("command"="open", "activate" = "0")) - return 1 +/obj/machinery/door/airlock/AIShiftClick(var/mob/user) // Opens and closes doors! + open_interact(user, density) + return TRUE /atom/proc/AICtrlClick(mob/user) return /obj/machinery/door/airlock/AICtrlClick(mob/user) // Bolts doors - var/command = player_is_antag(user.mind) ? "bolts_override" : "bolts" - if(locked) - Topic(src, list("command"=command, "activate" = "0")) + if(player_is_antag(user.mind)) + bolts_override(user, !locked, FALSE, player_is_antag(user.mind)) else - Topic(src, list("command"=command, "activate" = "1")) - return 1 + bolts_interact(user, !locked, FALSE, player_is_antag(user.mind)) + return TRUE /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. - Topic(src, list("breaker"="1")) - return 1 + toggle_breaker() + return TRUE /obj/machinery/turretid/AICtrlClick() //turns off/on Turrets - Topic(src, list("turret_ref" = "this", "command"="enable", "value"="[!enabled]")) - return 1 + enabled = !enabled + updateTurrets() + return TRUE -/atom/proc/AIAltClick(var/atom/A) - return AltClick(A) +/atom/proc/AIAltClick(var/mob/living/silicon/user) + return AltClick(user) -/obj/machinery/door/airlock/AIAltClick() // Electrifies doors. - if(!electrified_until) - // permanent shock - Topic(src, list("command"="electrify_permanently", "activate" = "1")) +/obj/machinery/door/airlock/AIAltClick(var/mob/living/silicon/user) // Electrifies doors. + var/antag = player_is_antag(user.mind) + if(!antag && (electrified_until == 0)) + to_chat(user, SPAN_WARNING("Your programming prevents you from electrifying the door.")) + return FALSE else - // disable/6 is not in Topic; disable/5 disables both temporary and permanent shock - Topic(src, list("command"="electrify_permanently", "activate" = "0")) - return 1 + if(!electrified_until) + // permanent shock + electrify(-1, 1) + else + electrify(0) + return TRUE -/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets - Topic(src, list("turret_ref" = "this", "command"="lethal", "value"="[!lethal]")) - return 1 +/obj/machinery/turretid/AIAltClick(var/mob/living/silicon/user) //toggles lethal on turrets + lethal = !lethal + updateTurrets() + return TRUE /atom/proc/AIMiddleClick(var/mob/living/silicon/user) - return 0 - -/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. - if(..()) - return - - if(!src.lights) - Topic(src, list("command"="lights", "activate" = "1")) - else - Topic(src, list("command"="lights", "activate" = "0")) - return 1 - + return FALSE // // Override AdjacentQuick for AltClicking // diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 644230c481e..5028af39eee 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -111,42 +111,39 @@ if (doClickAction) A.BorgAltClick(src) - - /atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlShiftClick(user) -/obj/machinery/door/airlock/BorgCtrlShiftClick() - AICtrlShiftClick() +/obj/machinery/door/airlock/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) + AICtrlShiftClick(user) /atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden ShiftClick(user) -/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code. - AIShiftClick() - +/obj/machinery/door/airlock/BorgShiftClick(var/mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. + AIShiftClick(user) /atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlClick(user) -/obj/machinery/door/airlock/BorgCtrlClick(mob/user) // Bolts doors. Forwards to AI code. +/obj/machinery/door/airlock/BorgCtrlClick(var/mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. AICtrlClick(user) -/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code. - AICtrlClick() +/obj/machinery/power/apc/BorgCtrlClick(var/mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. + AICtrlClick(user) -/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code. - AICtrlClick() +/obj/machinery/turretid/BorgCtrlClick(var/mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. + AICtrlClick(user) /atom/proc/BorgAltClick(var/mob/living/silicon/robot/user) AltClick(user) return -/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code. - AIAltClick() +/obj/machinery/door/airlock/BorgAltClick(var/mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. + AIAltClick(user) -/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code. - AIAltClick() +/obj/machinery/turretid/BorgAltClick(var/mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. + AIAltClick(user) /* As with AI, these are not used in click code, @@ -163,4 +160,4 @@ /atom/proc/attack_robot(mob/user) attack_ai(user) - return \ No newline at end of file + return diff --git a/code/datums/late_choices.dm b/code/datums/late_choices.dm index 759fc79b561..575f1bf8eef 100755 --- a/code/datums/late_choices.dm +++ b/code/datums/late_choices.dm @@ -46,7 +46,7 @@ our_ui = null /datum/late_choices/proc/update_character_icon() - if(our_ui.status < UI_INTERACTIVE) + if(our_ui && our_ui.status < UI_INTERACTIVE) do_update_character_icon() else update_icon_on_next_open = TRUE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index eb20e1de320..b44ed3b496b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -930,45 +930,9 @@ About the new airlock wires panel: if(!backup_power_lost_until) src.loseBackupPower() if("bolts") - if(isrobot(usr) && !Adjacent(usr)) - to_chat(usr, SPAN_WARNING("Your frame does not allow long distance wireless bolt control, you will need be adjacent the door.")) - return - if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) // cut wire is noop - to_chat(usr, SPAN_WARNING("The door bolt control wire is cut - Door bolts permanently dropped.")) - else if(isAdmin || issilicon(usr)) // controls for silicons, "stealthy" antag silicons and "stealthy" admins - if(!src.arePowerSystemsOn()) // cannot queue actions or "speak" from unpowered doors - to_chat(usr, SPAN_WARNING("The door is unpowered - Cannot [activate ? "drop" : "raise"] bolts.")) - else if(!aiBolting) - to_chat(usr, SPAN_WARNING("The door is configured not to allow remote bolt operation.")) - else if(!isnull(src.aiActionTimer)) - to_chat(usr, SPAN_WARNING("An action is already queued. Please wait for it to complete.")) - else if(activate) - to_chat(usr, SPAN_NOTICE("The door bolts should drop in [src.aiBoltingDelay] seconds.")) - src.audible_message("[icon2html(src.icon, viewers(get_turf(src)))] [src] announces, \"Bolts set to drop in [src.aiBoltingDelay] seconds.\"") - src.aiActionTimer = addtimer(CALLBACK(src, PROC_REF(lock)), src.aiBoltingDelay SECONDS, TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_STOPPABLE) - else - to_chat(usr, SPAN_NOTICE("The door bolts should raise in [src.aiUnBoltingDelay] seconds.")) - src.audible_message("[icon2html(src.icon, viewers(get_turf(src)))] [src] announces, \"Bolts set to raise in [src.aiUnBoltingDelay] seconds.\"") - src.aiActionTimer = addtimer(CALLBACK(src, PROC_REF(unlock)), src.aiUnBoltingDelay SECONDS, TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_STOPPABLE) - else // everyone else - if(activate) - if(src.lock()) - to_chat(usr, SPAN_NOTICE("The door bolts have been dropped.")) - else - if(src.unlock()) - to_chat(usr, SPAN_NOTICE("The door bolts have been raised.")) + bolts_interact(usr, activate, isAdmin, antag) if("bolts_override") - if(isAdmin || (issilicon(usr) && antag)) // admin and silicon antag can override - if(!isAdmin && src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) // cut wire is noop, except for admins - to_chat(usr, SPAN_WARNING("The door bolt control wire is cut - Door bolts permanently dropped.")) - else if(!isAdmin && !src.arePowerSystemsOn()) // door must be powered - display friendly message if not (admins can magically skip this) - to_chat(usr, SPAN_WARNING("The door is unpowered - Cannot [activate ? "drop" : "raise"] bolts.")) - else if(activate) - if(src.lock()) - to_chat(usr, SPAN_NOTICE("The door bolts have been dropped.")) - else - if(src.unlock()) - to_chat(usr, SPAN_NOTICE("The door bolts have been raised.")) + bolts_override(usr, activate, antag) if("electrify_temporary") if(!isAdmin && issilicon(usr) && !antag) to_chat(usr, SPAN_WARNING("Your programming prevents you from electrifying the door.")) @@ -980,18 +944,7 @@ About the new airlock wires panel: else electrify(-1 * activate, 1) if("open") - if(src.welded) - to_chat(usr, SPAN_WARNING("The airlock has been welded shut!")) - else if(src.locked) - to_chat(usr, SPAN_WARNING("The door bolts are down!")) - else if(!src.arePowerSystemsOn() && issilicon(usr)) // AIs get a nice notice that the door is unpowered - to_chat(usr, SPAN_WARNING("The door is unpowered, its motors do not respond to your commands.")) - else if(activate && density) - open() - if (isAI(usr)) - SSfeedback.IncrementSimpleStat("AI_DOOR") - else if(!activate && !density) - close() + open_interact(usr, activate) if("safeties") if(!isAdmin && safe && issilicon(usr) && !antag) to_chat(usr, SPAN_WARNING("Your programming prevents you from disabling the door safeties.")) @@ -1018,6 +971,62 @@ About the new airlock wires panel: update_icon() return TRUE +/obj/machinery/door/airlock/proc/bolts_interact(var/mob/user, var/activate, var/isAdmin, var/antag) + if(isrobot(user) && !Adjacent(user)) + to_chat(user, SPAN_WARNING("Your frame does not allow long distance wireless bolt control, you will need be adjacent the door.")) + return + if(isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) // cut wire is noop + to_chat(user, SPAN_WARNING("The door bolt control wire is cut - Door bolts permanently dropped.")) + else if(isAdmin || issilicon(user)) // controls for silicons, "stealthy" antag silicons and "stealthy" admins + if(!arePowerSystemsOn()) // cannot queue actions or "speak" from unpowered doors + to_chat(user, SPAN_WARNING("The door is unpowered - Cannot [activate ? "drop" : "raise"] bolts.")) + else if(!aiBolting) + to_chat(user, SPAN_WARNING("The door is configured not to allow remote bolt operation.")) + else if(!isnull(aiActionTimer)) + to_chat(user, SPAN_WARNING("An action is already queued. Please wait for it to complete.")) + else if(activate) + to_chat(user, SPAN_NOTICE("The door bolts should drop in [aiBoltingDelay] seconds.")) + audible_message("[icon2html(icon, viewers(get_turf(src)))] [src] announces, \"Bolts set to drop in [aiBoltingDelay] seconds.\"") + aiActionTimer = addtimer(CALLBACK(src, PROC_REF(lock)), aiBoltingDelay SECONDS, TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_STOPPABLE) + else + to_chat(user, SPAN_NOTICE("The door bolts should raise in [aiUnBoltingDelay] seconds.")) + audible_message("[icon2html(icon, viewers(get_turf(src)))] [src] announces, \"Bolts set to raise in [aiUnBoltingDelay] seconds.\"") + aiActionTimer = addtimer(CALLBACK(src, PROC_REF(unlock)), aiUnBoltingDelay SECONDS, TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_STOPPABLE) + else // everyone else + if(activate) + if(lock()) + to_chat(user, SPAN_NOTICE("The door bolts have been dropped.")) + else + if(unlock()) + to_chat(user, SPAN_NOTICE("The door bolts have been raised.")) + +/obj/machinery/door/airlock/proc/bolts_override(var/mob/user, var/activate, var/isAdmin, var/antag) + if(isAdmin || (issilicon(user) && antag)) // admin and silicon antag can override + if(!isAdmin && src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) // cut wire is noop, except for admins + to_chat(user, SPAN_WARNING("The door bolt control wire is cut - Door bolts permanently dropped.")) + else if(!isAdmin && !arePowerSystemsOn()) // door must be powered - display friendly message if not (admins can magically skip this) + to_chat(user, SPAN_WARNING("The door is unpowered - Cannot [activate ? "drop" : "raise"] bolts.")) + else if(activate) + if(lock()) + to_chat(user, SPAN_NOTICE("The door bolts have been dropped.")) + else + if(unlock()) + to_chat(user, SPAN_NOTICE("The door bolts have been raised.")) + +/obj/machinery/door/airlock/proc/open_interact(var/mob/user, var/activate) + if(welded) + to_chat(usr, SPAN_WARNING("The airlock has been welded shut!")) + else if(locked) + to_chat(usr, SPAN_WARNING("The door bolts are down!")) + else if(!arePowerSystemsOn() && issilicon(usr)) // AIs get a nice notice that the door is unpowered + to_chat(usr, SPAN_WARNING("The door is unpowered, its motors do not respond to your commands.")) + else if(activate && density) + open() + if (isAI(usr)) + SSfeedback.IncrementSimpleStat("AI_DOOR") + else if(!activate && !density) + close() + /obj/machinery/door/airlock/proc/hack(mob/user as mob) if(src.aiHacking==0) src.aiHacking=1 diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 169f7f83c7b..d14b81b7ebf 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -132,7 +132,7 @@ /obj/machinery/turretid/ui_data(mob/user) var/list/data = list() data["turrets"] = list() - data["locked"] = locked + data["locked"] = isAI(user) ? FALSE : locked data["enabled"] = enabled data["is_lethal"] = TRUE data["lethal"] = lethal diff --git a/code/modules/mob/living/carbon/human/diona_gestalt.dm b/code/modules/mob/living/carbon/human/diona_gestalt.dm index a7e30318ae0..6904ef6e26b 100644 --- a/code/modules/mob/living/carbon/human/diona_gestalt.dm +++ b/code/modules/mob/living/carbon/human/diona_gestalt.dm @@ -253,7 +253,7 @@ M.gestalt = src add_verb(M, /mob/living/carbon/alien/diona/proc/merge_back_to_gestalt) add_verb(M, /mob/living/carbon/alien/diona/proc/switch_to_gestalt) - add_verb(src, /mob/living/carbon/human/proc/switch_to_nymph) + add_verb(M, /mob/living/carbon/human/proc/switch_to_nymph) M.detached = TRUE M.update_verbs(TRUE) M.languages = languages.Copy() diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm index f6c9c3abc0e..49cedff0fa6 100644 --- a/code/modules/mob/living/default_language.dm +++ b/code/modules/mob/living/default_language.dm @@ -1,10 +1,11 @@ /mob/living var/datum/language/default_language -/mob/living/verb/set_default_language(language as null|anything in languages) +/mob/living/verb/set_default_language() set name = "Set Default Language" set category = "IC" + var/datum/language/language = input(src, "Choose a language.", "Set Default Language") as null|anything in languages if(language) to_chat(src, "You will now speak [language] if you do not specify a language when speaking.") else diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 3329488d41b..de2896d87d4 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -294,13 +294,11 @@ if(next_alarm_notice && (world.time > next_alarm_notice)) next_alarm_notice = 0 - var/alarm_raised = FALSE for(var/datum/alarm_handler/AH in queued_alarms) var/list/alarms = queued_alarms[AH] var/reported = FALSE for(var/datum/alarm/A in alarms) if(alarms[A] == 1) - alarm_raised = TRUE if(!reported) reported = TRUE to_chat(src, SPAN_WARNING("--- [AH.category] Detected ---")) @@ -316,9 +314,6 @@ to_chat(src, SPAN_NOTICE("--- [AH.category] Cleared ---")) to_chat(src, "\The [A.alarm_name()].") - if(alarm_raised) - to_chat(src, "\[Show Alerts\]") - for(var/datum/alarm_handler/AH in queued_alarms) var/list/alarms = queued_alarms[AH] alarms.Cut() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 75a6e600fd2..bcdeb9523d2 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -1250,8 +1250,9 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) /mob/proc/in_neck_grab() for(var/thing in grabbed_by) var/obj/item/grab/G = thing - if(G.state >= GRAB_NECK) - return TRUE + if(istype(G)) + if(G.state >= GRAB_NECK) + return TRUE return FALSE /mob/get_cell() diff --git a/code/modules/modular_computers/computers/modular_computer/ui.dm b/code/modules/modular_computers/computers/modular_computer/ui.dm index 7bd1d0927e2..a3fcdf60b34 100644 --- a/code/modules/modular_computers/computers/modular_computer/ui.dm +++ b/code/modules/modular_computers/computers/modular_computer/ui.dm @@ -78,13 +78,14 @@ for(var/datum/computer_file/program/P in hard_drive.stored_files) if(P.program_hidden()) continue - data["programs"] += list(list( - "filename" = P.filename, - "desc" = P.filedesc, - "autorun" = istype(autorun) && (autorun.stored_data == P.filename), - "running" = (P in idle_threads) - )) - if(P.program_type & PROGRAM_SERVICE) + if(!istype(P, /datum/computer_file/program/scanner)) + data["programs"] += list(list( + "filename" = P.filename, + "desc" = P.filedesc, + "autorun" = istype(autorun) && (autorun.stored_data == P.filename), + "running" = (P in idle_threads) + )) + else data["services"] += list(list( "filename" = P.filename, "desc" = P.filedesc, diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index 72fc21ea247..8d0f8260b01 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -143,11 +143,11 @@ "focused" = (focused_conv == channel) ) if(can_interact) - our_channel["msg"] = channel.messages our_channel["users"] = list() for(var/datum/ntnet_user/U in channel.users) var/uref = text_ref(U) our_channel["users"] += list(list("ref" = uref, "username" = U.username)) + data["msg"] = channel.messages data["channels"] += list(our_channel) data["users"] = list() diff --git a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm index a14a8449e3d..fd7277d2dfc 100644 --- a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm +++ b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm @@ -36,6 +36,7 @@ "wtype" = W.wtype )) data["allwarrants"] = allwarrants + data["active_warrant"] = null return data /datum/computer_file/program/digitalwarrant/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/modules/nano/modules/ghost_menu.dm b/code/modules/nano/modules/ghost_menu.dm index d2aff5f1040..5b02a3bf556 100644 --- a/code/modules/nano/modules/ghost_menu.dm +++ b/code/modules/nano/modules/ghost_menu.dm @@ -59,6 +59,8 @@ if(!category) category = "Alive" var/special_char = is_special_character(M) + if(!name) + continue ghosts += list(list("name" = name, "ref" = ref(M), "category" = category, "special_character" = special_char)) categories |= category diff --git a/html/changelogs/mattatlas-tsukuyomi.yml b/html/changelogs/mattatlas-tsukuyomi.yml new file mode 100644 index 00000000000..a8d15eb221f --- /dev/null +++ b/html/changelogs/mattatlas-tsukuyomi.yml @@ -0,0 +1,51 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Chat client now updates properly." + - bugfix: "Synth altclick/shiftclick to interact with machines like APCs and doors works properly." + - bugfix: "Vampire verbs now return to the user properly." + - bugfix: "Fixed not being able to vote for crew transfer for real." + - bugfix: "Photocopiers now allow you to remove items." + - bugfix: "Fixed services like the med analyzer not working." + - bugfix: "Ghost spawner filters now work properly. They didn't work at all before..." + - bugfix: "You can now print all account data from the account database." + - bugfix: "Set default language verb now actually works." + - bugfix: "Fixed warrant assistant UI not updating when going back." + - bugfix: "Fixed Dionae not getting a switch to nymph verb when detaching one." diff --git a/tgui/packages/tgui/interfaces/AccountDatabase.tsx b/tgui/packages/tgui/interfaces/AccountDatabase.tsx index 353a9254ba5..62f34bf4247 100644 --- a/tgui/packages/tgui/interfaces/AccountDatabase.tsx +++ b/tgui/packages/tgui/interfaces/AccountDatabase.tsx @@ -74,7 +74,15 @@ export const AccountWindow = (props, context) => { const [new_funds, setNewFunds] = useLocalState(context, 'new_funds', 0); return ( -
+
act('print')} + /> + }> {active ? ( setTab('All Accounts')}> diff --git a/tgui/packages/tgui/interfaces/ChatClient.tsx b/tgui/packages/tgui/interfaces/ChatClient.tsx index 8e7e9ad9013..79eefce4a02 100644 --- a/tgui/packages/tgui/interfaces/ChatClient.tsx +++ b/tgui/packages/tgui/interfaces/ChatClient.tsx @@ -12,6 +12,7 @@ export type ChatData = { can_netadmin_mode: BooleanLike; message_mute: BooleanLike; + msg: string[]; channels: Channel[]; users: User[]; }; @@ -24,7 +25,6 @@ type Channel = { can_interact: BooleanLike; can_manage: BooleanLike; focused: BooleanLike; - msg: string[]; users: User[]; }; @@ -91,7 +91,7 @@ export const ChatClient = (props, context) => { )} }> - {data.users.length ? : 'There are no users.'} + {data.users && data.users.length ? : 'There are no users.'} {!active ? : ''}
@@ -270,7 +270,8 @@ export const Chat = (props, context) => { }> {active && - active.msg.map((message) => ( + data.msg && + data.msg.map((message) => ( { content="Change Alert Level" icon="lightbulb" selected={choosingAlert} - disabled={data.isAI || !data.net_comms || !data.net_syscont} + disabled={!data.net_comms || !data.net_syscont} onClick={() => setChoosingAlert(!choosingAlert)} /> {choosingAlert ? ( diff --git a/tgui/packages/tgui/interfaces/FollowMenu.tsx b/tgui/packages/tgui/interfaces/FollowMenu.tsx index 6d34320834d..8d9358b53ce 100644 --- a/tgui/packages/tgui/interfaces/FollowMenu.tsx +++ b/tgui/packages/tgui/interfaces/FollowMenu.tsx @@ -45,30 +45,32 @@ export const FollowMenu = (props, context) => { {data.categories.sort().map((category) => (
- {data.ghosts - .filter( - (ghost) => - ghost.name - .toLowerCase() - .indexOf(searchTerm.toLowerCase()) > -1 && - category === ghost.category - ) - .map((ghost) => ( -
))} diff --git a/tgui/packages/tgui/interfaces/GhostSpawner.tsx b/tgui/packages/tgui/interfaces/GhostSpawner.tsx index 3afaa86a5de..ee66fda295e 100644 --- a/tgui/packages/tgui/interfaces/GhostSpawner.tsx +++ b/tgui/packages/tgui/interfaces/GhostSpawner.tsx @@ -78,7 +78,7 @@ export const GhostSpawner = (props, context) => { ) .map( (spawner) => - (spawner.tags.indexOf(tab) || tab === 'All') && ( + (spawner.tags.indexOf(tab) > -1 || tab === 'All') && ( {spawner.name} {spawner.desc} diff --git a/tgui/packages/tgui/interfaces/NTOSMain.tsx b/tgui/packages/tgui/interfaces/NTOSMain.tsx index 227410e19d8..620980b9df1 100644 --- a/tgui/packages/tgui/interfaces/NTOSMain.tsx +++ b/tgui/packages/tgui/interfaces/NTOSMain.tsx @@ -70,7 +70,11 @@ export const NTOSMain = (props, context) => { content={service.desc} color="transparent" selected={service.running} - onClick={() => act('PC_toggleservice', service)} + onClick={() => + act('PC_toggleservice', { + service_to_toggle: service.filename, + }) + } /> @@ -80,7 +84,11 @@ export const NTOSMain = (props, context) => { icon="times" tooltip="Disable Service" tooltipPosition="left" - onClick={() => act('PC_toggleservice', service)} + onClick={() => + act('PC_toggleservice', { + service_to_toggle: service.filename, + }) + } /> )} diff --git a/tgui/packages/tgui/interfaces/Photocopier.tsx b/tgui/packages/tgui/interfaces/Photocopier.tsx index 040ac99750d..3cb8aaf658a 100644 --- a/tgui/packages/tgui/interfaces/Photocopier.tsx +++ b/tgui/packages/tgui/interfaces/Photocopier.tsx @@ -24,7 +24,20 @@ export const Photocopier = (props, context) => {
No toner cartridge inserted.
)}
-
+
act('remove')} + /> + ) : ( + '' + ) + }> {data.gotitem ? ( ) : ( diff --git a/tgui/packages/tgui/interfaces/Voting.tsx b/tgui/packages/tgui/interfaces/Voting.tsx index d7e0ce66a7e..b94fa22ca63 100644 --- a/tgui/packages/tgui/interfaces/Voting.tsx +++ b/tgui/packages/tgui/interfaces/Voting.tsx @@ -82,7 +82,7 @@ export const StartVoteWindow = (props, context) => {