From 7964478cd1d92a4c8e722cc73cfb06b78913469a Mon Sep 17 00:00:00 2001 From: Geeves Date: Sun, 2 Jul 2023 11:52:36 +0200 Subject: [PATCH] Lipstick Buff (#16584) * Lipstick Buff * cl --- code/game/objects/items/weapons/cosmetics.dm | 73 ++++++++++-------- .../loadout/loadout_cosmetics.dm | 44 ++++++++++- code/modules/client/preferences.dm | 2 + .../mob/living/carbon/human/human_defines.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 2 +- code/modules/organs/organ_icon.dm | 9 ++- code/modules/paperwork/paper.dm | 4 +- html/changelogs/geeves-lipstick_buff.yml | 6 ++ icons/mob/human_face/lips.dmi | Bin 630 -> 653 bytes icons/obj/cosmetics.dmi | Bin 3095 -> 1309 bytes 10 files changed, 102 insertions(+), 40 deletions(-) create mode 100644 html/changelogs/geeves-lipstick_buff.yml 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 5dbdc4526a6faa784672a8cad6e09867eb1b421e..7c042a144a1f7866b8fa8e9adcfb29f6ae7ce703 100644 GIT binary patch delta 603 zcmeyy(#twQTv368nSp^pIW}$+kg^Z(32{Ae-~f;rW~$F%{Qr)s)kIUR`U?S`K+%uc zR&Rkaj3q&S!3+-1ZlnP@=c+;?N?cNllZ!G7N;32F7#J$%^j<#8b;y8+{X_9@k<@!f z`(yWZD9PQiF3H{&mK}ZR+{W$OHD0)S=Knv?-y*O{;P>N~cRCI~JtN<6u|mCUQQSI< z**#uX;DDhcjh9=M<#Sn);v@mQ))XxSQfBit+&5R@WnSMis84NamYFkzq^I7hOK2VQ) zf;>zjE$rR}lfLY4jej>?)bFTg`zFi_le!_(ZU|xj369_4!}Rjjop&W50Z&&ymvv4F FO#q2S`eXnA delta 580 zcmeBW{l+puT#kW*nSp^p4x=`2^X0T26!&9z;NzHj7T zznkay2ZQ?yZ)I3#YiG{=@oh5a?NsHxf0^xtoF;ud{WUCX&yMMDIA3ht{O8Q)yYo~x zPjg&*^yLX5)?LAg+BE`<*Xn01)0rssSBhUJGmvM)Q~njb8Nb$_s@G=ml;SivW?^`x z!Ei(1>S&K=0XO(Ou30+w%c#rn-hHj8(i_$Oz`31a+LnFsS;iM_nK_*G7v>&uo!hRF zvAiQTJvY;&DdUR$)Q{Prd*c7Fx|?0vpb%{q2lS$lr;B4q#hkad4thByiqyAWjIK{j zU3&5N{_I3AD~k%Y-%a*wRmEj$rS%@Y(BWoakS)(Pllu7kK;2D`Ba96%dkpL5J^k^g z?)e!Do9XiB{`{@#(?9il=M(XgR`HUf5Bq<9k&F`nh8}~%fy1+U-ToMEhzDw4e!vbS z1_Ec+>{*y8b3KRYcj{un`g*=Mpcn#y17}W2&pK9k);nQ;j>)6-jelKWG7Ncsj}6kK zXJ|_I{)h(3syu?|U|=XXeD69?v3%p-O&2@fGyR5%8*Kj6wyZE_Gyj|EKsOj~;D<>V sYv*T39XE{!YM9soG+!Dh@j<_qd36=j<_BCy--Fb7y85}Sb4q9e0HB@keE=r0t>Q&MxQO-SydGo)dZA>Q1>KclO{CPW6qC?pl|KtjxR5eLno~O3T@N zCD~7U=4kpYc(CK9*T*FrEdmN|ct4zww@znbw=M^lmcORB)Vrx7%7tvK)|%^bnDu@$ ze=~geW&XRzJ#XG-f1N5f$A-@^ChVoZhCuO?{55UME-#2yzVG}j)+xFCToeNXi-V_& zV@SoEx3l-=-*%H|uh*KT6#PJlGv?5y#0<}9#;NT(eix29hldw5a!BopY*yUS{J$aX z?SxhZD}k9zEfe-~L|RMqHM)6=FH7U)|EQ$Yrh7{)L}G(B^P2_poV=%;vYuCJ^vCYB ztmjLQz2|E`^o3+)XLGk$*#*`zZkH8WAc2YW827zr2cqkxhL6u&xe{_A$872UZ#S4~ z?(hZcIR`0;lvF*U%Yp8CQrKHqT_Yweg6GE zAE%u$b&YbI+S=OYpN=_HsL4#*uybc;YisMoZ7myGoEA3h+-dpLoJ~n3sw+Xr#P{{< zJ~v08mW7#83>udEd4$%px|X`z+gGbSyp(tB=j2I~z6RXe_I5#l#)6=g3nFy9_6G0Z zd@k-fi@}K}sxOR(Gk`=SaAe!t1BG)AYcYlbMYMpQE)jGD-f4^4!J+&?OHlx3G$D5{WV%M90m&-l+onL<_{C=$M zwTkSLL&6|=84}SdE z@xI#H+M1!^@ZrP#*SGBFKmS?CyFf<$#oMZ?X8w|0O7k`@SkJoQL4EOicN2St-TPhZ zH~w5$KmXf<&wgF%7MUd}Hb35E@5$bKLYkuM755+{MN3CT$|9OJn zau83o>-8=J9_F7lbqOCC3q;*J}+DTV!-OvRRe>)=3B{IOOO0f10j=$e$A$ umM|MQFtsEy=U@7-a@oeg@CuX2XMIJd7kv>-_iqBrI|ffzKbLh*2~7ZL%2nO~ literal 3095 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