diff --git a/code/controllers/subsystem/persistent_paintings.dm b/code/controllers/subsystem/persistent_paintings.dm index 8b97fc3f50a..4eb77bd21be 100644 --- a/code/controllers/subsystem/persistent_paintings.dm +++ b/code/controllers/subsystem/persistent_paintings.dm @@ -1,4 +1,4 @@ -#define PAINTINGS_DATA_FORMAT_VERSION 2 +#define PAINTINGS_DATA_FORMAT_VERSION 3 // Patronage thresholds for paintings. Different cosmetic frames become available as more credits are spent on the patronage. #define PATRONAGE_OK_FRAME (PAYCHECK_CREW * 3) // 150 credits, as of march 2022 @@ -196,6 +196,11 @@ SUBSYSTEM_DEF(persistent_paintings) current_data = migrate_to_version_1(current_data) if(version < 2) //Makes sure old paintings get a cosmetic frame type from their patronage tiers. current_data = migrate_to_version_2(current_data) + if(version < 3) //Reduces the allowed length of titles from 1000 characters circa to 42. + current_data["version"] = 3 + var/old_title = current_data["title"] + var/new_title = reject_bad_name(old_title, allow_numbers = TRUE, ascii_only = FALSE, strict = TRUE, cap_after_symbols = FALSE) + current_data["title"] = new_title || "Illegibly Titled Artwork" return current_data diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 0a5c6d3a49a..f21b9ac8934 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -1505,92 +1505,103 @@ return TRUE /obj/item/card/id/advanced/chameleon/attack_self(mob/user) - if(isliving(user) && user.mind) - var/popup_input = tgui_input_list(user, "Choose Action", "Agent ID", list("Show", "Forge/Reset", "Change Account ID")) - if(user.incapacitated()) - return - if(!user.is_holding(src)) - return - if(popup_input == "Forge/Reset") - if(!forged) - var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) - input_name = sanitize_name(input_name, allow_numbers = TRUE) - if(!input_name) - // Invalid/blank names give a randomly generated one. - if(user.gender == MALE) - input_name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" - else if(user.gender == FEMALE) - input_name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" - else - input_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]" - - registered_name = input_name - - var/change_trim = tgui_alert(user, "Adjust the appearance of your card's trim?", "Modify Trim", list("Yes", "No")) - if(change_trim == "Yes") - var/list/blacklist = typecacheof(list( - type, - /obj/item/card/id/advanced/simple_bot, - )) - var/list/trim_list = list() - for(var/trim_path in typesof(/datum/id_trim)) - if(blacklist[trim_path]) - continue - - var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[trim_path] - - if(trim && trim.trim_state && trim.assignment) - var/fake_trim_name = "[trim.assignment] ([trim.trim_state])" - trim_list[fake_trim_name] = trim_path - - var/selected_trim_path = tgui_input_list(user, "Select trim to apply to your card.\nNote: This will not grant any trim accesses.", "Forge Trim", sort_list(trim_list, GLOBAL_PROC_REF(cmp_typepaths_asc))) - if(selected_trim_path) - SSid_access.apply_trim_to_chameleon_card(src, trim_list[selected_trim_path]) - - var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant") - if(target_occupation) - assignment = target_occupation - - var/new_age = tgui_input_number(user, "Choose the ID's age", "Agent card age", AGE_MIN, AGE_MAX, AGE_MIN) - if(QDELETED(user) || QDELETED(src) || !user.can_perform_action(user, NEED_DEXTERITY| FORBID_TELEKINESIS_REACH)) - return - if(new_age) - registered_age = new_age - - if(tgui_alert(user, "Activate wallet ID spoofing, allowing this card to force itself to occupy the visible ID slot in wallets?", "Wallet ID Spoofing", list("Yes", "No")) == "Yes") - ADD_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) - - update_label() - update_icon() - forged = TRUE - to_chat(user, span_notice("You successfully forge the ID card.")) - user.log_message("forged \the [initial(name)] with name \"[registered_name]\", occupation \"[assignment]\" and trim \"[trim?.assignment]\".", LOG_GAME) - - if(!registered_account) - if(ishuman(user)) - var/mob/living/carbon/human/accountowner = user - - var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[accountowner.account_id]"] - if(account) - account.bank_cards += src - registered_account = account - to_chat(user, span_notice("Your account number has been automatically assigned.")) - return - if(forged) - registered_name = initial(registered_name) - assignment = initial(assignment) - SSid_access.remove_trim_from_chameleon_card(src) - REMOVE_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) - user.log_message("reset \the [initial(name)] named \"[src]\" to default.", LOG_GAME) - update_label() - update_icon() - forged = FALSE - to_chat(user, span_notice("You successfully reset the ID card.")) - return - if (popup_input == "Change Account ID") + if(!user.can_perform_action(user, NEED_DEXTERITY| FORBID_TELEKINESIS_REACH)) + return ..() + var/popup_input = tgui_input_list(user, "Choose Action", "Agent ID", list("Show", "Forge/Reset", "Change Account ID")) + if(!popup_input || !after_input_check(user)) + return TRUE + switch(popup_input) + if ("Change Account ID") set_new_account(user) return - return ..() + if("Show") + return ..() + + ///"Forge/Reset", kept outside the switch() statement to reduce indentation. + if(forged) //reset the ID if forged + registered_name = initial(registered_name) + assignment = initial(assignment) + SSid_access.remove_trim_from_chameleon_card(src) + REMOVE_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) + user.log_message("reset \the [initial(name)] named \"[src]\" to default.", LOG_GAME) + update_label() + update_icon() + forged = FALSE + to_chat(user, span_notice("You successfully reset the ID card.")) + return + + ///forge the ID if not forged. + var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) + if(!after_input_check(user)) + return TRUE + if(input_name) + input_name = sanitize_name(input_name, allow_numbers = TRUE) + if(!input_name) + // Invalid/blank names give a randomly generated one. + if(user.gender == MALE) + input_name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" + else if(user.gender == FEMALE) + input_name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" + else + input_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]" + + var/change_trim = tgui_alert(user, "Adjust the appearance of your card's trim?", "Modify Trim", list("Yes", "No")) + if(!after_input_check(user)) + return TRUE + var/selected_trim_path + var/static/list/trim_list + if(change_trim == "Yes") + trim_list = list() + for(var/trim_path in typesof(/datum/id_trim)) + var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[trim_path] + if(trim && trim.trim_state && trim.assignment) + var/fake_trim_name = "[trim.assignment] ([trim.trim_state])" + trim_list[fake_trim_name] = trim_path + selected_trim_path = tgui_input_list(user, "Select trim to apply to your card.\nNote: This will not grant any trim accesses.", "Forge Trim", sort_list(trim_list, GLOBAL_PROC_REF(cmp_typepaths_asc))) + if(!after_input_check(user)) + return TRUE + + var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant", MAX_NAME_LEN) + if(!after_input_check(user)) + return TRUE + + var/new_age = tgui_input_number(user, "Choose the ID's age", "Agent card age", AGE_MIN, AGE_MAX, AGE_MIN) + if(!after_input_check(user)) + return TRUE + + var/wallet_spoofing = tgui_alert(user, "Activate wallet ID spoofing, allowing this card to force itself to occupy the visible ID slot in wallets?", "Wallet ID Spoofing", list("Yes", "No")) + if(!after_input_check(user)) + return + + registered_name = input_name + if(selected_trim_path) + SSid_access.apply_trim_to_chameleon_card(src, trim_list[selected_trim_path]) + if(target_occupation) + assignment = sanitize(target_occupation) + if(new_age) + registered_age = new_age + if(wallet_spoofing == "Yes") + ADD_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) + + update_label() + update_icon() + forged = TRUE + to_chat(user, span_notice("You successfully forge the ID card.")) + user.log_message("forged \the [initial(name)] with name \"[registered_name]\", occupation \"[assignment]\" and trim \"[trim?.assignment]\".", LOG_GAME) + + if(!registered_account && ishuman(user)) + var/mob/living/carbon/human/accountowner = user + + var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[accountowner.account_id]"] + if(account) + account.bank_cards += src + registered_account = account + to_chat(user, span_notice("Your account number has been automatically assigned.")) + +/obj/item/card/id/advanced/chameleon/proc/after_input_check(mob/user) + if(QDELETED(user) || QDELETED(src) || !user.client || !user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH)) + return FALSE + return TRUE /obj/item/card/id/advanced/chameleon/add_item_context(obj/item/source, list/context, atom/target, mob/living/user,) . = ..() @@ -1722,7 +1733,7 @@ var/input_assignment = tgui_input_text(user, "What assignment would you like to put on this card?", "Cardboard card job ssignment", scribbled_assignment || "Assistant", MAX_NAME_LEN) if(!after_input_check(user, item, input_assignment, scribbled_assignment)) return - scribbled_assignment = input_assignment + scribbled_assignment = sanitize(input_assignment) var/list/details = item.get_writing_implement_details() details_colors[INDEX_ASSIGNMENT_COLOR] = details["color"] || "#000000" if("Trim") diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index ca2bd1bdfed..e2448c1aacc 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -354,7 +354,8 @@ /obj/item/canvas/proc/try_rename(mob/user) if(painting_metadata.loaded_from_json) // No renaming old paintings return TRUE - var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece") + var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece", null, MAX_NAME_LEN) + new_name = reject_bad_name(new_name, allow_numbers = TRUE, ascii_only = FALSE, strict = TRUE, cap_after_symbols = FALSE) if(isnull(new_name)) return FALSE if(new_name != painting_metadata.title && user.can_perform_action(src)) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index c25ea65628d..815ef740f18 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -206,7 +206,7 @@ if("PRG_assign") if(!computer || !authenticated_card || !inserted_auth_card) return TRUE - var/new_asignment = sanitize(params["assignment"]) + var/new_asignment = trim(sanitize(params["assignment"]), MAX_NAME_LEN) inserted_auth_card.assignment = new_asignment playsound(computer, SFX_TERMINAL_TYPE, 50, FALSE) inserted_auth_card.update_label()