diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index 8ec42b47ed0..f5256ecfaef 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -6,94 +6,105 @@
icon_state = "lipstick"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS
- var/colour = "red"
+ update_icon_on_init = TRUE
+ var/lipstick_color = "#DC253A"
var/open = 0
drop_sound = 'sound/items/drop/screwdriver.ogg'
pickup_sound = 'sound/items/pickup/screwdriver.ogg'
+/obj/item/lipstick/update_icon()
+ . = ..()
+ cut_overlays()
+ if(open)
+ icon_state = "[initial(icon_state)]_open"
+ var/image/stick_overlay = image('icons/obj/cosmetics.dmi', null, "[initial(icon_state)]_open_overlay")
+ stick_overlay.color = lipstick_color
+ add_overlay(stick_overlay)
+ else
+ icon_state = initial(icon_state)
+
/obj/item/lipstick/purple
name = "purple lipstick"
- colour = "purple"
+ lipstick_color = "#9471C9"
/obj/item/lipstick/jade
name = "jade lipstick"
- colour = "jade"
+ lipstick_color = "#3EB776"
/obj/item/lipstick/black
name = "black lipstick"
- colour = "black"
+ lipstick_color = "#56352F"
/obj/item/lipstick/amberred
name = "amberred lipstick"
- colour = "amberred"
+ lipstick_color = "#BA2E2A"
/obj/item/lipstick/cherry
name = "cherry lipstick"
- colour = "cherry"
+ lipstick_color = "#BD1E35"
/obj/item/lipstick/orange
name = "orange lipstick"
- colour = "orange"
+ lipstick_color = "#F75F51"
/obj/item/lipstick/gold
name = "gold lipstick"
- colour = "gold"
-
-/obj/item/lipstick/purple
- name = "purple lipstick"
- colour = "purple"
+ lipstick_color = "#DA8118"
/obj/item/lipstick/deepred
name = "deepred lipstick"
- colour = "deepred"
+ lipstick_color = "#850A1C"
/obj/item/lipstick/pink
name = "pink lipstick"
- colour = "pink"
+ lipstick_color = "#E84272"
/obj/item/lipstick/rosepink
name = "rosepink lipstick"
- colour = "rosepink"
+ lipstick_color = "#E2A4B1"
/obj/item/lipstick/nude
name = "nude lipstick"
- colour = "nude"
+ lipstick_color = "#E7A097"
/obj/item/lipstick/wine
name = "wine lipstick"
- colour = "wine"
+ lipstick_color = "#D25674"
/obj/item/lipstick/peach
name = "peach lipstick"
- colour = "peach"
+ lipstick_color = "#D05049"
/obj/item/lipstick/forestgreen
name = "forestgreen lipstick"
- colour = "forestgreen"
+ lipstick_color = "#82B33B"
/obj/item/lipstick/skyblue
name = "skyblue lipstick"
- colour = "skyblue"
+ lipstick_color = "#60C2C5"
/obj/item/lipstick/teal
name = "teal lipstick"
- colour = "teal"
+ lipstick_color = "#0A857C"
+
+/obj/item/lipstick/custom
+ name = "lipstick"
/obj/item/lipstick/random
name = "lipstick"
-/obj/item/lipstick/random/New()
- colour = pick("red","purple","jade","black","amberred","cherry","orange","gold","purple","deepred","pink","rosepink","nude","wine","peach","forestgreen","skyblue","teal")
- name = "[colour] lipstick"
+/obj/item/lipstick/random/Initialize()
+ var/list/lipstick_subtypes = subtypesof(/obj/item/lipstick) - /obj/item/lipstick/random
+ var/obj/item/lipstick/chosen_lipstick = pick(lipstick_subtypes)
+ name = initial(chosen_lipstick.name)
+ lipstick_color = initial(chosen_lipstick.lipstick_color)
+ return ..()
/obj/item/lipstick/attack_self(mob/user as mob)
to_chat(user, "You twist \the [src] [open ? "closed" : "open"].")
open = !open
- if(open)
- icon_state = "[initial(icon_state)]_[colour]"
- else
- icon_state = initial(icon_state)
+ update_icon()
/obj/item/lipstick/attack(mob/M as mob, mob/user as mob)
if(!open) return
@@ -102,13 +113,13 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.lip_style) //if they already have lipstick on
+ if(H.lipstick_color) //if they already have lipstick on
to_chat(user, "You need to wipe off the old lipstick first!")
return
if(H == user)
user.visible_message("[user] does their lips with \the [src].", \
"You take a moment to apply \the [src]. Perfect!")
- H.lip_style = colour
+ H.lipstick_color = lipstick_color
H.update_body()
else
user.visible_message("[user] begins to do [H]'s lips with \the [src].", \
@@ -116,7 +127,7 @@
if(do_after(user, 20) && do_after(H, 20, 0)) //user needs to keep their active hand, H does not.
user.visible_message("[user] does [H]'s lips with \the [src].", \
"You apply \the [src].")
- H.lip_style = colour
+ H.lipstick_color = lipstick_color
H.update_body()
else
to_chat(user, "Where are the lips on that?")
diff --git a/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm b/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm
index 20b16da45a3..03dc9cbd0a1 100644
--- a/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm
@@ -1,7 +1,8 @@
/datum/gear/cosmetic
display_name = "handheld mirror"
path = /obj/item/mirror
- sort_category = "Cosmetics"
+ sort_category = "Cosmetics"
+ slot = slot_in_backpack
/datum/gear/cosmetic/haircomb
display_name = "comb"
@@ -34,4 +35,45 @@
lipsticks["lipstick, teal"] = /obj/item/lipstick/teal
gear_tweaks += new /datum/gear_tweak/path(lipsticks)
+ gear_tweaks += list(gear_tweak_lipstick_application)
+/datum/gear/cosmetic/lipstick_colorable // not a subtype because we dont want the path gear_tweaks
+ display_name = "colorable lipstick"
+ path = /obj/item/lipstick/custom
+ flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION
+
+/datum/gear/cosmetic/lipstick_colorable/New()
+ ..()
+ gear_tweaks += list(gear_tweak_lipstick_color)
+ gear_tweaks += list(gear_tweak_lipstick_application)
+
+var/datum/gear_tweak/color/lipstick/gear_tweak_lipstick_color = new()
+
+/datum/gear_tweak/color/lipstick/get_contents(var/metadata)
+ return "Lipstick Color: ⚫"
+
+/datum/gear_tweak/color/lipstick/tweak_item(var/obj/item/lipstick/lipstick, var/metadata, var/mob/living/carbon/human/H)
+ lipstick.lipstick_color = metadata
+ lipstick.update_icon()
+
+
+var/datum/gear_tweak/lipstick_application/gear_tweak_lipstick_application = new()
+
+/datum/gear_tweak/lipstick_application/get_contents(var/metadata)
+ return "Lipstick Applied: [metadata]"
+
+/datum/gear_tweak/lipstick_application/get_default()
+ return "No"
+
+/datum/gear_tweak/lipstick_application/get_random()
+ return "No"
+
+/datum/gear_tweak/lipstick_application/get_metadata(var/user, var/metadata, var/title = "Character Preference")
+ var/selected_lipstick = input(user, "Do you want your character to start with lipstick applied?", title, metadata) as null|anything in list("Yes", "No")
+ if(selected_lipstick)
+ return selected_lipstick
+
+/datum/gear_tweak/lipstick_application/tweak_item(var/obj/item/lipstick/lipstick, var/metadata, var/mob/living/carbon/human/H)
+ if(metadata == "Yes")
+ H.lipstick_color = lipstick.lipstick_color
+ H.update_body()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ab64c2f4b83..dcfcaa18d2b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -426,6 +426,8 @@ var/list/preferences_datums = list()
character.s_tone = s_tone
+ character.lipstick_color = null
+
character.citizenship = citizenship
character.employer_faction = faction
character.religion = religion
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 33bd802d214..5a4462a3cbe 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -36,7 +36,7 @@
var/damage_multiplier = 1 //multiplies melee combat damage
var/icon_update = 1 //whether icon updating shall take place
- var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
+ var/lipstick_color = null //no lipstick by default
var/age = 30 //Player's age (pure fluff)
var/b_type = "A+" //Player's bloodtype
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 6f4b4d7f702..bce9372db3f 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -328,7 +328,7 @@ There are several things that need to be remembered:
var/datum/vampire/vampire = mind.antag_datums[MODE_VAMPIRE]
if(vampire && (vampire.status & VAMP_FRENZIED))
is_frenzied = "frenzy"
- var/icon_key = "[species.race_key][g][s_tone][r_skin][g_skin][b_skin][lip_style || "nolips"][!!husk][!!fat][!!skeleton][is_frenzied]"
+ var/icon_key = "[species.race_key][g][s_tone][r_skin][g_skin][b_skin][lipstick_color || "nolips"][!!husk][!!fat][!!skeleton][is_frenzied]"
var/obj/item/organ/internal/eyes/eyes = get_eyes()
if(eyes)
icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index f6aa17016ac..4640c54e4bd 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -84,11 +84,12 @@
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
add_overlay(eyes_icon)
- if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS)))
- var/icon/lip_icon = SSicon_cache.human_lip_cache["[owner.lip_style]"]
+ if(owner.lipstick_color && (species && (species.appearance_flags & HAS_LIPS)))
+ var/icon/lip_icon = SSicon_cache.human_lip_cache["[owner.lipstick_color]"]
if (!lip_icon)
- lip_icon = new/icon('icons/mob/human_face/lips.dmi', "[owner.lip_style]")
- SSicon_cache.human_lip_cache["[owner.lip_style]"] = lip_icon
+ lip_icon = new/icon('icons/mob/human_face/lips.dmi', "lips")
+ lip_icon.Blend(owner.lipstick_color, species.eyes_icon_blend)
+ SSicon_cache.human_lip_cache["[owner.lipstick_color]"] = lip_icon
add_overlay(lip_icon)
mob_icon.Blend(lip_icon, ICON_OVERLAY)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 86647b4f918..f31b6652a9b 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -220,7 +220,7 @@
var/mob/living/carbon/human/H = M
if(H == user)
to_chat(user, SPAN_NOTICE("You wipe off the lipstick with [src]."))
- H.lip_style = null
+ H.lipstick_color = null
H.update_body()
else
user.visible_message(SPAN_WARNING("[user] begins to wipe [H]'s lipstick off with \the [src]."), \
@@ -228,7 +228,7 @@
if(do_after(user, 10) && do_after(H, 10, 0)) //user needs to keep their active hand, H does not.
user.visible_message(SPAN_NOTICE("[user] wipes [H]'s lipstick off with \the [src]."), \
SPAN_NOTICE("You wipe off [H]'s lipstick."))
- H.lip_style = null
+ H.lipstick_color = null
H.update_body()
/obj/item/paper/proc/addtofield(var/id, var/text, var/links = 0)
diff --git a/html/changelogs/geeves-lipstick_buff.yml b/html/changelogs/geeves-lipstick_buff.yml
new file mode 100644
index 00000000000..a0236f7c566
--- /dev/null
+++ b/html/changelogs/geeves-lipstick_buff.yml
@@ -0,0 +1,6 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Added colorable lipsticks, as well as letting you apply lipstick on-spawn via the loadout."
\ No newline at end of file
diff --git a/icons/mob/human_face/lips.dmi b/icons/mob/human_face/lips.dmi
index 5dbdc4526a6..7c042a144a1 100644
Binary files a/icons/mob/human_face/lips.dmi and b/icons/mob/human_face/lips.dmi differ
diff --git a/icons/obj/cosmetics.dmi b/icons/obj/cosmetics.dmi
index a426784bce8..c3f10a03d11 100644
Binary files a/icons/obj/cosmetics.dmi and b/icons/obj/cosmetics.dmi differ