From 0ef1f57399b3a4fbed816b169b0a1da49fa32dc0 Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Sun, 27 Jun 2021 23:53:16 -0500 Subject: [PATCH] Adds nail polish loadout fixes --- .../loadout/loadout_cosmetics_vr.dm | 14 +++ code/modules/makeup/nailpolish.dm | 113 ++++++++++++++++++ .../mob/living/carbon/human/update_icons.dm | 5 + code/modules/organs/organ_icon.dm | 9 ++ icons/obj/nailpolish_vr.dmi | Bin 0 -> 1434 bytes vorestation.dme | 2 + 6 files changed, 143 insertions(+) create mode 100644 code/modules/client/preference_setup/loadout/loadout_cosmetics_vr.dm create mode 100644 code/modules/makeup/nailpolish.dm create mode 100644 icons/obj/nailpolish_vr.dmi diff --git a/code/modules/client/preference_setup/loadout/loadout_cosmetics_vr.dm b/code/modules/client/preference_setup/loadout/loadout_cosmetics_vr.dm new file mode 100644 index 00000000000..8a1935d3549 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_cosmetics_vr.dm @@ -0,0 +1,14 @@ +/datum/gear/cosmetic/nailpolish + display_name = "nail polish (colorable)" + path = /obj/item/weapon/nailpolish + +/datum/gear/cosmetic/nailpolish/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/cosmetic/nailpolish/spawn_item(var/location, var/metadata) + var/obj/item/weapon/nailpolish/polish = ..() + polish.set_colour(polish.color) + polish.color = null + return polish + \ No newline at end of file diff --git a/code/modules/makeup/nailpolish.dm b/code/modules/makeup/nailpolish.dm new file mode 100644 index 00000000000..95e0fd24cd1 --- /dev/null +++ b/code/modules/makeup/nailpolish.dm @@ -0,0 +1,113 @@ +/obj/item/organ/external/var/datum/nail_polish/nail_polish + +/obj/item/weapon/nailpolish + name = "nail polish" + icon = 'icons/obj/nailpolish_vr.dmi' + icon_state = "nailpolish" + var/colour = "#FF0000" + var/icon/top_underlay + var/icon/top_underlay_open + var/icon/color_underlay + var/icon/color_underlay_open + var/open = FALSE + drop_sound = 'sound/items/drop/glass.ogg' + pickup_sound = 'sound/items/pickup/glass.ogg' + +/obj/item/weapon/nailpolish/Initialize() + . = ..() + regenerate_icons() + +/obj/item/weapon/nailpolish/proc/regenerate_icons() + top_underlay = icon(icon, "top") + top_underlay_open = icon(icon, "top-open") + color_underlay = icon(icon, "color") + color_underlay.Blend(colour, ICON_MULTIPLY) + color_underlay_open = icon(icon, "color-open") + color_underlay_open.Blend(colour, ICON_MULTIPLY) + update_icon() + +/obj/item/weapon/nailpolish/proc/set_colour(var/_colour) + colour = _colour + regenerate_icons() + +/obj/item/weapon/nailpolish/attack_self(var/mob/user) + open = !open + to_chat(user, SPAN_NOTICE("You [open ? "open" : "close"] \the [src].")) + update_icon() + +/obj/item/weapon/nailpolish/update_icon() + . = ..() + underlays.Cut() + icon_state = "[initial(icon_state)][open ? "-open" : null]" + if (open) + underlays = list(color_underlay_open, top_underlay_open) + else + underlays = list(color_underlay, top_underlay) + +/obj/item/weapon/nailpolish/proc/get_polish(var/mob/living/carbon/human/target, var/bp) + var/static/forbidden_parts + if(!forbidden_parts) + forbidden_parts = BP_ALL - list(BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT) + if(!istype(target)) // humantypes only for now + return FALSE + var/obj/item/organ/external/body_part = target.get_organ(bp) + if(!body_part) + return FALSE + var/ico + var/icostate + if(length(body_part.markings)) + for(var/mark_name in body_part.markings) + var/mark_data = body_part.markings[mark_name] + var/datum/sprite_accessory/marking/mark = mark_data["datum"] + if(length(mark.body_parts & forbidden_parts)) + continue + ico = mark.icon + icostate = "[mark.icon_state]-[bp]" + break + else + ico = 'icons/obj/nailpolish_vr.dmi' + icostate = bp + if(bp in forbidden_parts) + return FALSE + return new /datum/nail_polish(ico, icostate, colour) + +/obj/item/weapon/nailpolish/attack(var/mob/user, var/mob/living/carbon/human/target) + if(!open) + return + + if(!istype(target)) + return + + var/bp = user.zone_sel.selecting + var/obj/item/organ/external/body_part = target.get_organ(bp) + if(!body_part) + to_chat(user, SPAN_WARNING("[target] is missing that limb!")) + return + if(body_part.nail_polish) + to_chat(user, SPAN_NOTICE("[target]'s [body_part.name] already has nail polish on!")) + return + var/datum/nail_polish/polish = get_polish(target, bp) + if(!polish) + to_chat(user, SPAN_NOTICE("You can't find any nails on [body_part] to paint.")) + return + if(user == target) + user.visible_message("\The [user] paints their nails with \the [src].", "You paint your nails with \the [src].") + else + if(do_after(user, 2 SECONDS, target)) + user.visible_message("\The [user] paints \the [target]'s nails with \the [src].", "You paint \the [target]'s nails with \the [src].") + else + to_chat(user, SPAN_NOTICE("Both you and [target] must stay still!")) + return + body_part.nail_polish = polish + target.update_icons_body() + +/datum/nail_polish + var/icon = 'icons/obj/nailpolish_vr.dmi' + var/icon_state + var/color + +/datum/nail_polish/New(var/_icon, var/_icon_state, var/_color) + icon = _icon + icon_state = _icon_state + color = _color + \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 7f8d44a742e..0b77148d307 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -271,6 +271,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() for(var/M in part.markings) icon_key += "[M][part.markings[M]["color"]]" + + // VOREStation Edit Start + if(part.nail_polish) + icon_key += "_[part.nail_polish.icon]_[part.nail_polish.icon_state]_[part.nail_polish.color]" + // VOREStation Edit End if(part.robotic >= ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 7216540734a..d35a5aa5165 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -131,6 +131,15 @@ var/global/list/limb_icon_cache = list() I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit limb_icon_cache[cache_key] = I mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) + + // VOREStation edit start + if(nail_polish) + var/icon/I = new(nail_polish.icon, nail_polish.icon_state) + I.Blend(nail_polish.color, ICON_MULTIPLY) + add_overlay(I) + mob_icon.Blend(I, ICON_OVERLAY) + icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]" + // VOREStation edit end if(model) icon_cache_key += "_model_[model]" diff --git a/icons/obj/nailpolish_vr.dmi b/icons/obj/nailpolish_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1adfe631970ec349adad3de9e813e727163a5ae9 GIT binary patch literal 1434 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fOR7R5N?cNllZ!G7N;32F7#J$% z^q$?wcSu2`^`YdvM@#0KhV9-YF>9IgZ>}~DQK2Vh4qv{?%DhtPQU6)=PwaZ)9I+FX zkMxBnFJ@@`SMli0+mdYpJLXt!K4zQquWw4InLx&$v#S}a`vV);qA6aSCwHoEVl@yjQ=ccu01$F5cC{u}-N=5Ch|8^`KZd^B}I}|8XvhTY-;ZW=B<`Ta0 z0`{Hd1>rIqJrnmcOX^Kfid9(4y|=l!c&bxxm&MW8Hwh$N>x;H1KY3-1_two$C^hQ+96KS@rjF$k%-#e|L!`{r2sA zdi3|I%cUI2KOeKB=|bi*1*dASUv<0f=q0sx_f{u4|9lnc&cO&%kz;ghM&9=99z(S@ zZNr+)LNIY`bjbP_(cw0`;^He~@8+4$uq)XccmC#Yfuj9;S8cav(CMG`o~gjxbCJ)i zYpyOSHgcWUDyQ83qq0aTkl&p>pk6G7LJwv9<-_N0tc52hLhp%2ex8D(E$Ji5N z$hB*N$|{a~Zke~Vm^vcO)a-+*w!BIf=Wea`GIh~Zt(+I%+Z6SDTliy>8l|3wi<-3~noK{Ee$WXSVk9){hk`%?D>@%v~QD-zeZv;l}V# z)cxQ@Nxt8vf-kezs(K1tjOxDjU*vNXU)WA9rR99nw3Q~Z6{PRKD=4_qS1(n1r_GPs zl|LV4*N29NhYN1e$(}i5J#)8<#DTeg%bvfyw*9T9hU4|KFZwPMSAg?PX=9T&b?!>8QVHpA+L(9#c3i$Fph8)$^Oe z?tiOV#P#6aKgZ`Mua*5a@jUN-{Jq(%v+UW6AD2rjO_%-$6s|7+zo5APRguxJ)X38s zS2NbFSz|IaX!3El;FWHdzny%yf+<47Y}0$Ib=+ImO>h-IkhEP*$w=Z)ZBTrDNy+6s zt6HPNUo7GTS(5(w<7QjIiNAg=Ui?~m=Z2p@ZpKaBofu!L+G*u^d6&uT`5u#22uGjR zee$#QN#(!!&vUxf8m`~nGSOKeEB5mYnb>fpSqyx?>MeiXb#0BhuC(P`_EUjr?uSlx z7Gy87=I_vUFRGkBZ?oX`J*Urp=2llup2GO%@4tT!eb3i_J(^x07V8~(v{cr2W}jCG z7`eKVMb%l$9F2*X~s{8kpEAR)AswB85)kZ z-kQ%3O2*Tg44*Xv(R-_DqUqbxcgXFDTKjF~`lxB4Cf}K>iVRbwrnwXwH@UN%S9CjY z^V~9@!$NKc{=0v8&~Nx`EfBr80ve*T>vHFdfZv}L?TY1D+b_(|zxDmnwJg*1;bl&1 zwNr}cv&U?+tN4(;j-d@GcWryo??1=h1-$0EJ9k~n1$O>zXJj3IJvg{5x;{hu`$6HI zGOWwDDp~*edOZC8{y*n_9Xyd+o*G*Jf`98ei90{jT2fy$v;WVNJ&^haNbiv4j=TG^ zYz@S6R)Z`5YC5j3WtMQN-}gwvXp48;!fT?