From 61f0c6edec3ca3412f0ab75fc991d3898c4e6351 Mon Sep 17 00:00:00 2001 From: Geeves Date: Sun, 27 Sep 2020 14:12:29 +0200 Subject: [PATCH] Ports Bay/Europa UI Icons (#10065) Ported a modified human UI from Bay/Europa with minor edits. Ported from Baystation12/Baystation12#25763 I made the "condition nominal" icons invisible to fit with our old UI style, but I left the transparent icons in the .dmi, if someone wanted to use it for something. --- code/_onclick/hud/_defines.dm | 4 +- code/_onclick/hud/human.dm | 114 ++++++++++++++++--- code/modules/mob/living/carbon/human/life.dm | 2 +- html/changelogs/geeves-human_ui_makeover.yml | 6 + icons/mob/status_hunger.dmi | Bin 0 -> 2367 bytes icons/mob/status_indicators.dmi | Bin 0 -> 4769 bytes 6 files changed, 107 insertions(+), 19 deletions(-) create mode 100644 html/changelogs/geeves-human_ui_makeover.yml create mode 100644 icons/mob/status_hunger.dmi create mode 100644 icons/mob/status_indicators.dmi diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 948c07ef0ae..3e092948dce 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -80,8 +80,8 @@ #define ui_alien_oxygen "EAST-1:28,NORTH-4:25" //Middle right (status indicators) -#define ui_nutrition "EAST-0:4,CENTER-2:11" -#define ui_hydration "EAST-1:20,CENTER-2:11" +#define ui_nutrition "EAST-1:28,CENTER-2:11" +#define ui_nutrition_small "EAST:4,CENTER-2:24" #define ui_temp "EAST-1:28,CENTER-1:13" #define ui_health "EAST-1:28,CENTER:15" #define ui_internal "EAST-1:28,CENTER+1:17" diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 913eaccfc86..5be75f85710 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -254,18 +254,18 @@ mymob.internals.icon_state = "internal1" if(hud_data.has_warnings) - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style + mymob.oxygen = new /obj/screen/oxygen() + mymob.oxygen.icon = 'icons/mob/status_indicators.dmi' mymob.oxygen.icon_state = "oxy0" mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen + mymob.oxygen.screen_loc = ui_temp hud_elements |= mymob.oxygen - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style + mymob.toxin = new /obj/screen/toxins() + mymob.toxin.icon = 'icons/mob/status_indicators.dmi' mymob.toxin.icon_state = "tox0" mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin + mymob.toxin.screen_loc = ui_temp hud_elements |= mymob.toxin mymob.fire = new /obj/screen() @@ -283,35 +283,36 @@ hud_elements |= mymob.healths if(hud_data.has_pressure) - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style + mymob.pressure = new /obj/screen/pressure() + mymob.pressure.icon = 'icons/mob/status_indicators.dmi' mymob.pressure.icon_state = "pressure0" mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure + mymob.pressure.screen_loc = ui_temp hud_elements |= mymob.pressure if(hud_data.has_bodytemp) - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style + mymob.bodytemp = new /obj/screen/bodytemp() + mymob.bodytemp.icon = 'icons/mob/status_indicators.dmi' mymob.bodytemp.icon_state = "temp1" mymob.bodytemp.name = "body temperature" mymob.bodytemp.screen_loc = ui_temp hud_elements |= mymob.bodytemp if(hud_data.has_nutrition) - mymob.nutrition_icon = new /obj/screen() - mymob.nutrition_icon.icon = ui_style + mymob.nutrition_icon = new /obj/screen/food() + mymob.nutrition_icon.icon = 'icons/mob/status_hunger.dmi' + mymob.nutrition_icon.pixel_w = 8 mymob.nutrition_icon.icon_state = "nutrition0" mymob.nutrition_icon.name = "nutrition" mymob.nutrition_icon.screen_loc = ui_nutrition hud_elements |= mymob.nutrition_icon if(hud_data.has_hydration) - mymob.hydration_icon = new /obj/screen() - mymob.hydration_icon.icon = ui_style + mymob.hydration_icon = new /obj/screen/thirst() + mymob.hydration_icon.icon = 'icons/mob/status_hunger.dmi' mymob.hydration_icon.icon_state = "thirst0" mymob.hydration_icon.name = "thirst" - mymob.hydration_icon.screen_loc = ui_hydration + mymob.hydration_icon.screen_loc = ui_nutrition hud_elements |= mymob.hydration_icon if(hud_data.has_up_hint) @@ -415,3 +416,84 @@ h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") all_underwear.Cut() regenerate_icons() + +// Yes, these use icon state. Yes, these are terrible. The alternative is duplicating +// a bunch of fairly blobby logic for every click override on these objects. + +/obj/screen/food/Click(var/location, var/control, var/params) + if(istype(usr) && usr.nutrition_icon == src) + switch(icon_state) + if("nutrition0") + to_chat(usr, SPAN_WARNING("You are completely stuffed.")) + if("nutrition1") + to_chat(usr, SPAN_NOTICE("You are not hungry.")) + if("nutrition2") + to_chat(usr, SPAN_NOTICE("You are a bit peckish.")) + if("nutrition3") + to_chat(usr, SPAN_WARNING("You are quite hungry.")) + if("nutrition4") + to_chat(usr, SPAN_DANGER("You are starving!")) + +/obj/screen/thirst/Click(var/location, var/control, var/params) + if(istype(usr) && usr.hydration_icon == src) + switch(icon_state) + if("thirst0") + to_chat(usr, SPAN_WARNING("You are completely hydrated.")) + if("thirst1") + to_chat(usr, SPAN_NOTICE("You are not thirsty")) + if("thirst2") + to_chat(usr, SPAN_NOTICE("You are a bit thirsty.")) + if("thirst3") + to_chat(usr, SPAN_WARNING("You are quite thirsty.")) + if("thirst4") + to_chat(usr, SPAN_DANGER("Your are entirely dehydrated!")) + +/obj/screen/bodytemp/Click(var/location, var/control, var/params) + if(istype(usr) && usr.bodytemp == src) + switch(icon_state) + if("temp4") + to_chat(usr, SPAN_DANGER("You are being cooked alive!")) + if("temp3") + to_chat(usr, SPAN_DANGER("Your body is burning up!")) + if("temp2") + to_chat(usr, SPAN_DANGER("You are overheating.")) + if("temp1") + to_chat(usr, SPAN_WARNING("You are uncomfortably hot.")) + if("temp-4") + to_chat(usr, SPAN_DANGER("You are being frozen solid!")) + if("temp-3") + to_chat(usr, SPAN_DANGER("You are freezing cold!")) + if("temp-2") + to_chat(usr, SPAN_WARNING("You are dangerously chilled")) + if("temp-1") + to_chat(usr, SPAN_NOTICE("You are uncomfortably cold.")) + else + to_chat(usr, SPAN_NOTICE("Your body is at a comfortable temperature.")) + +/obj/screen/pressure/Click(var/location, var/control, var/params) + if(istype(usr) && usr.pressure == src) + switch(icon_state) + if("pressure2") + to_chat(usr, SPAN_DANGER("The air pressure here is crushing!")) + if("pressure1") + to_chat(usr, SPAN_WARNING("The air pressure here is dangerously high.")) + if("pressure-1") + to_chat(usr, SPAN_WARNING("The air pressure here is dangerously low.")) + if("pressure-2") + to_chat(usr, SPAN_DANGER("There is nearly no air pressure here!")) + else + to_chat(usr, SPAN_NOTICE("The local air pressure is comfortable.")) + +/obj/screen/toxins/Click(var/location, var/control, var/params) + if(istype(usr) && usr.toxin == src) + if(icon_state == "tox0") + to_chat(usr, SPAN_NOTICE("The air is clear of toxins.")) + else + to_chat(usr, SPAN_DANGER("The air is eating away at your skin!")) + +/obj/screen/oxygen/Click(var/location, var/control, var/params) + if(istype(usr) && usr.oxygen == src) + if(icon_state == "oxy0") + to_chat(usr, SPAN_NOTICE("You are breathing easy.")) + else + to_chat(usr, SPAN_DANGER("You cannot breathe!")) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 48dfda63836..ba8d95a0a4d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -905,7 +905,7 @@ if (nutrition_icon.icon_state != new_val) nutrition_icon.icon_state = new_val if(hydration_icon) - var/hyd_factor = max(0,min(hydration / max_hydration,1)) + var/hyd_factor = max_hydration ? Clamp(hydration / max_hydration, 0, 1) : 1 var/hyd_icon = 5 if(hyd_factor >= CREW_HYDRATION_OVERHYDRATED) hyd_icon = 0 diff --git a/html/changelogs/geeves-human_ui_makeover.yml b/html/changelogs/geeves-human_ui_makeover.yml new file mode 100644 index 00000000000..2e051c56c20 --- /dev/null +++ b/html/changelogs/geeves-human_ui_makeover.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Ported a modified human UI from Bay/Europa with minor edits." \ No newline at end of file diff --git a/icons/mob/status_hunger.dmi b/icons/mob/status_hunger.dmi new file mode 100644 index 0000000000000000000000000000000000000000..04e97852b0141a1cd9c2e352bd2cf59dbd5ebad0 GIT binary patch literal 2367 zcma)8`#;nF7k|$+mzmN+kFzG5FX_wBp>gMK*Y`8els&g1cVyw3CaI42cz-VrRVBnNO zQHXIu!|sz1`Y{5*NeEShOYY%zzG2t#0iodmxDWt{D$f06E%(|$R-ADLmOS>eDmLiw zX!VCrULgBGH5Fvmb;h==4?=6v&zTOLt>IV=`Ssm4T*V&?fK=VKFfE^@raGp_NPe(v z``Zb9P)E-6^0(6{+h~7n4D_~Lx^9)ubi4D0{w>HSQX`n-Gbw&LGh&{qUx~;|)6B>& zJMn5)&ijsk(!=-qWDgn(y9?s9U?7>n_AbrFUX9xxOisV^JD~|V4 zCqd8J_Dt%uXWp{REuEr^$ya_Jpd>;M4sB=7@OvVwBRI(=(S|TI6P+EjY-OBdH7t2A zxYTJUCW=`^N0r)iX=_a8t{yf%)*YoxPon`x9=CaK+Mh?o)yv z{_##b_Xmdo!GvW+L#F~c#C%pCD`|a)zx#JRiag}kT0qat%v8Nu7l0FV&9;}8w$nD1 z6%;U{1$`^+G81I6jLx9DNHi@W@Wm8IqtQG3ue?Qib+wV{xf-4-8~ttjKWPPpq~-6^ zW=AzYx~8WEPm3j0OOjC<`_mniTkoAeUNjVv<$JX055$Fo2TAr-)zYr6S;&)W15Iz# zLO6n{*x^Z|*Fh)t^|uSFul8}|qv``YLXcN<4pggzx|n0gq%!2mMjRamz#n7E9SVwy zu7`-&HuLCVErWIqiw!`uebi%&762F(%EmNkNi&&DtGfGc%c>G_Gm_4apAN+FtXH?5 zwz2M2T*v}Dy-8*p_O+OSUWbU~ef8fFa7g0gFQ5*cCRvz7XC1Y7dzx@-ERyxQR>5w`ze9nah7Ug-z3YFVcGw7x_emF>g%ce ze8&fbqgWAKsdIn;T8Bx4+&7$%!P@lC{@rbR&8_7{$sWHW3iy32kj{tMt0wXwlMA9h z@Mo-*(oYmp`M@d9p7zK+>F1+z4+mUWR1)r|yhyQ+x2x;BCX^*(mhq1~yR%vV!}=4Vy?vw%YYuvRx#n{UJVc@P1Yj6{)JTpI zxnphubZ>+j2t$02lbZqi^EvN(iQ*BvigG+rAK>GDm)91Kig95{px=c@Oi2rqGdBv! ztKY*;p*53G8CSSvMXQ$u3wZ95tLKP`e|8duVt7SmRLWF$O|+KK!S88ap_s>e3QBXg zUv1EWRTYFku-7f4&sb@0rv6do%wE*(rom#SH5ebH<`g@Quv9}G#LWXL1g^anDl`e% z-r@_#Q^;EnADuj2h#FBBHXxo}d{2SRbR14UsXalHvEYgqAwv<{`Ei2T{r^Lfg~A2b zfPmPE;@8m166dy4cNMCTj3@~MeP@_kT?4u-W`^L5wReee$4Q;@o5MM(+2A$JBKvgb zbGHIwwMP@WnUbql1(&l-z#DdMpVh0rULwZnXii-E?!fIzqw-@Dk~Ew)=U3I&_i4uu zLKv+yDDshmfQI3}?SDkoFxUd^{(A@dXEvaCq|5xp)WVcW{{hfzHY11__s%qyJHz0! zZdDDU=UB0NUq}LeR?e?Lm?OFk$IrRJqm&!hQ`Zu?yFhTNhiIPC!|10g8lBI_;^hSJ z#G7$^&>OLnN>L@MST(bctd&1k`a@E2@A;4h z%DWVY&d2;*bD)Fuh|=7&5IYWYLcKi9jbQrq4P z0@W9VqtR#`U{dfJN@+#N-X$}Z-dWcN;$p|F`^ z^){mNX?_3r4!G(^(p7|-g?OQSo>+-+QQ}=Igy+O2Xq88?Utj_v2eEB?%aXWXwFgq> z7D{D%=dH=S2zaJZa7=l`hTNjQzPeAv!lmak-JNUm^6at!$XImq&)w91O5jk;`reLX zM@czdZyN<>j78R@r_|Om(r`=5PliVUX6Hu76rrT?KL2$nwq&1WOcLYajIotd3b+Fn?!`@-|@A60hLYRI=LQ1TZ QgclLuWPjeS-WHqif4EzF2LJ#7 literal 0 HcmV?d00001 diff --git a/icons/mob/status_indicators.dmi b/icons/mob/status_indicators.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f6df160448228113b8d82783f01a2fd649221b1f GIT binary patch literal 4769 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