diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index 4b81996fd7a..cd75412aec5 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -23,7 +23,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
list("Ageusia", "Vegetarian", "Deviant Tastes", "Gamer"),
list("Ananas Affinity", "Ananas Aversion", "Gamer"),
list("Alcohol Tolerance", "Light Drinker"),
- list("Clown Enjoyer", "Mime Fan"),
+ list("Clown Enjoyer", "Mime Fan", "Pride Pin"),
list("Bad Touch", "Friendly"),
list("Extrovert", "Introvert"),
list("Prosthetic Limb", "Quadruple Amputee", "Body Purist"),
diff --git a/code/datums/quirks/neutral_quirks.dm b/code/datums/quirks/neutral_quirks.dm
index d9337e6c04f..eab5d5e53d1 100644
--- a/code/datums/quirks/neutral_quirks.dm
+++ b/code/datums/quirks/neutral_quirks.dm
@@ -497,3 +497,24 @@
human_holder.add_mood_event("gamer_withdrawal", /datum/mood_event/gamer_withdrawal)
#undef GAMING_WITHDRAWAL_TIME
+
+
+/datum/quirk/item_quirk/pride_pin
+ name = "Pride Pin"
+ desc = "Show off your pride with this changing pride pin!"
+ icon = "rainbow"
+ value = 0
+ gain_text = "You feel fruity."
+ lose_text = "You feel only slightly less fruity than before."
+ medical_record_text = "Patient appears to be fruity."
+
+/datum/quirk/item_quirk/pride_pin/add_unique()
+ var/obj/item/clothing/accessory/pride/pin = new(get_turf(quirk_holder))
+
+ var/pride_choice = quirk_holder.client?.prefs?.read_preference(/datum/preference/choiced/pride_pin) || assoc_to_keys(GLOB.pride_pin_reskins)[1]
+ var/pride_reskin = GLOB.pride_pin_reskins[pride_choice]
+
+ pin.current_skin = pride_choice
+ pin.icon_state = pride_reskin
+
+ give_item_to_holder(pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index b542a59514b..ffaf7fa6c1b 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -17,6 +17,8 @@
var/current_skin //Has the item been reskinned?
var/list/unique_reskin //List of options to reskin.
+ ///If set to true, we can reskin this item as much as we want.
+ var/infinite_reskin = FALSE
// Access levels, used in modules\jobs\access.dm
var/list/req_access
@@ -293,12 +295,12 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag)
. = ..()
if(obj_flags & UNIQUE_RENAME)
. += span_notice("Use a pen on it to rename it or change its description.")
- if(unique_reskin && !current_skin)
+ if(unique_reskin && (!current_skin || infinite_reskin))
. += span_notice("Alt-click it to reskin it.")
/obj/AltClick(mob/user)
. = ..()
- if(unique_reskin && !current_skin && user.canUseTopic(src, be_close = TRUE, no_dexterity = TRUE))
+ if(unique_reskin && (!current_skin || infinite_reskin) && user.canUseTopic(src, be_close = TRUE, no_dexterity = TRUE))
reskin_obj(user)
/**
@@ -335,7 +337,7 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag)
/obj/proc/check_reskin_menu(mob/user)
if(QDELETED(src))
return FALSE
- if(current_skin)
+ if(!infinite_reskin && current_skin)
return FALSE
if(!istype(user))
return FALSE
diff --git a/code/modules/client/preferences/pride_pin.dm b/code/modules/client/preferences/pride_pin.dm
new file mode 100644
index 00000000000..326dad69979
--- /dev/null
+++ b/code/modules/client/preferences/pride_pin.dm
@@ -0,0 +1,16 @@
+/datum/preference/choiced/pride_pin
+ category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ savefile_key = "pride_pin"
+ savefile_identifier = PREFERENCE_CHARACTER
+
+/datum/preference/choiced/pride_pin/init_possible_values()
+ return assoc_to_keys(GLOB.pride_pin_reskins)
+
+/datum/preference/choiced/pride_pin/is_accessible(datum/preferences/preferences)
+ if (!..(preferences))
+ return FALSE
+
+ return "Pride Pin" in preferences.all_quirks
+
+/datum/preference/choiced/pride_pin/apply_to_human(mob/living/carbon/human/target, value)
+ return
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 304ec876468..9453152d7c0 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -463,20 +463,29 @@
SIGNAL_HANDLER
examine_list += "The dogtag has a listing of allergies : [display]"
+
+/// Reskins for the pride pin accessory, mapped by display name to icon state
+GLOBAL_LIST_INIT(pride_pin_reskins, list(
+ "Rainbow Pride" = "pride",
+ "Bisexual Pride" = "pride_bi",
+ "Pansexual Pride" = "pride_pan",
+ "Asexual Pride" = "pride_ace",
+ "Non-binary Pride" = "pride_enby",
+ "Transgender Pride" = "pride_trans",
+ "Intersex Pride" = "pride_intersex",
+ "Lesbian Pride" = "pride_lesbian",
+))
+
/obj/item/clothing/accessory/pride
name = "pride pin"
- desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your sexuality, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!"
+ desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!"
icon_state = "pride"
obj_flags = UNIQUE_RENAME
- unique_reskin = list("Rainbow Pride" = "pride",
- "Bisexual Pride" = "pride_bi",
- "Pansexual Pride" = "pride_pan",
- "Asexual Pride" = "pride_ace",
- "Non-binary Pride" = "pride_enby",
- "Transgender Pride" = "pride_trans",
- "Intersex Pride" = "pride_intersex",
- "Lesbian Pride" = "pride_lesbian",
- )
+ infinite_reskin = TRUE
+
+/obj/item/clothing/accessory/pride/Initialize(mapload)
+ . = ..()
+ unique_reskin = GLOB.pride_pin_reskins
/obj/item/clothing/accessory/deaf_pin
name = "deaf personnel pin"
diff --git a/tgstation.dme b/tgstation.dme
index 44872f5a35f..7934b0ad15f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2890,6 +2890,7 @@
#include "code\modules\client\preferences\pixel_size.dm"
#include "code\modules\client\preferences\playtime_reward_cloak.dm"
#include "code\modules\client\preferences\preferred_map.dm"
+#include "code\modules\client\preferences\pride_pin.dm"
#include "code\modules\client\preferences\prisoner_crime.dm"
#include "code\modules\client\preferences\random.dm"
#include "code\modules\client\preferences\runechat.dm"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/pride_pin.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/pride_pin.tsx
new file mode 100644
index 00000000000..b0fae6092a1
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/pride_pin.tsx
@@ -0,0 +1,6 @@
+import { FeatureChoiced, FeatureDropdownInput } from '../base';
+
+export const pride_pin: FeatureChoiced = {
+ name: 'Pride Pin',
+ component: FeatureDropdownInput,
+};