From 8d0b1e201a22231a364421b8767b9c7a58de6351 Mon Sep 17 00:00:00 2001 From: Monty Date: Sat, 27 Mar 2021 23:02:20 +0100 Subject: [PATCH] decay display for groups and overhead bars --- .../voxygen/element/skillbar/decayed_bg.png | Bin 4317 -> 306 bytes voxygen/src/hud/group.rs | 21 ++++++- voxygen/src/hud/overhead.rs | 54 ++++++++++++++---- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/assets/voxygen/element/skillbar/decayed_bg.png b/assets/voxygen/element/skillbar/decayed_bg.png index f791ba3b78a753a06336f2e449a1fc8cc5793e87..68f12fbc13d331fbefd6456617e84d40159f2f91 100644 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0y~yV0-{%3vsXk$>yKD#z2a*z$3Dlfq`2Xgc%uT&5-~K zKJj#M45_&F_NpOYi-7>k!P&nz#y?VT=8#oNm=KWr=#17^w%PZ4ji29H_s{Sc2RjHH zzb-r7aN3cBAW(R(@HFE#6+RH?E9NV-0E4&!7a54qKIKORVDLp&u)P@sk_~0fKknPF zS_l@_2`)S`38Lv&U&mpvnHS4(>t6i6!$JlOYTb`Kd;kJ3td;n{?sC5`2(^D#-&2Ne fs9~1-j=!0x@otJ4bLeBBe;GVo{an^LB{Ts5@#=F} literal 4317 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 Ac>n+a diff --git a/voxygen/src/hud/group.rs b/voxygen/src/hud/group.rs index d1891b2e5d..f731600eb6 100644 --- a/voxygen/src/hud/group.rs +++ b/voxygen/src/hud/group.rs @@ -2,7 +2,8 @@ use super::{ cr_color, img_ids::{Imgs, ImgsRot}, Show, BLACK, BUFF_COLOR, DEBUFF_COLOR, ERROR_COLOR, GROUP_COLOR, HP_COLOR, KILL_COLOR, - LOW_HP_COLOR, STAMINA_COLOR, TEXT_COLOR, TEXT_COLOR_GREY, UI_HIGHLIGHT_0, UI_MAIN, + LOW_HP_COLOR, QUALITY_EPIC, STAMINA_COLOR, TEXT_COLOR, TEXT_COLOR_GREY, UI_HIGHLIGHT_0, + UI_MAIN, }; use crate::{ @@ -51,6 +52,7 @@ widget_ids! { member_panels_txt_bg[], member_panels_txt[], member_health[], + member_health_decay[], member_stam[], buffs[], buff_timers[], @@ -287,6 +289,13 @@ impl<'a> Widget for Group<'a> { .resize(group_size, &mut ui.widget_id_generator()); }) }; + if state.ids.member_health_decay.len() < group_size { + state.update(|s| { + s.ids + .member_health_decay + .resize(group_size, &mut ui.widget_id_generator()); + }) + }; if state.ids.member_stam.len() < group_size { state.update(|s| { s.ids @@ -395,6 +404,16 @@ impl<'a> Widget for Group<'a> { .color(Some(health_col)) .top_left_with_margins_on(state.ids.member_panels_bg[i], 2.0, 2.0) .set(state.ids.member_health[i], ui); + // Health Decay + let decayed_health = 1.0 - health.maximum() as f64 / health.base_max() as f64; + if decayed_health > 0.0 { + let decay_bar_len = 148.0 * decayed_health * 0.5; + Image::new(self.imgs.bar_content) + .w_h(decay_bar_len, 22.0) + .color(Some(QUALITY_EPIC)) + .top_right_with_margins_on(state.ids.member_panels_bg[i], 2.0, 2.0) + .set(state.ids.member_health_decay[i], ui); + } if health.is_dead { // Death Text Text::new(&self.localized_strings.get("hud.group.dead")) diff --git a/voxygen/src/hud/overhead.rs b/voxygen/src/hud/overhead.rs index cfeced24ee..4c2a2bd5e6 100644 --- a/voxygen/src/hud/overhead.rs +++ b/voxygen/src/hud/overhead.rs @@ -1,7 +1,7 @@ use super::{ cr_color, img_ids::Imgs, DEFAULT_NPC, ENEMY_HP_COLOR, FACTION_COLOR, GROUP_COLOR, GROUP_MEMBER, - HP_COLOR, LOW_HP_COLOR, REGION_COLOR, SAY_COLOR, STAMINA_COLOR, TELL_COLOR, TEXT_BG, - TEXT_COLOR, + HP_COLOR, LOW_HP_COLOR, QUALITY_EPIC, REGION_COLOR, SAY_COLOR, STAMINA_COLOR, TELL_COLOR, + TEXT_BG, TEXT_COLOR, }; use crate::{ hud::{get_buff_image, get_buff_info}, @@ -16,6 +16,7 @@ use conrod_core::{ widget::{self, Image, Rectangle, Text}, widget_ids, Color, Colorable, Positionable, Sizeable, Widget, WidgetCommon, }; +use inline_tweak::*; const MAX_BUBBLE_WIDTH: f64 = 250.0; widget_ids! { struct Ids { @@ -42,6 +43,7 @@ widget_ids! { level, level_skull, health_bar, + decay_bar, health_bar_bg, health_txt, mana_bar, @@ -67,7 +69,10 @@ pub struct Info<'a> { pub fn should_show_healthbar(health: &Health) -> bool { health.current() != health.maximum() || health.current() < health.base_max() } - +/// Determines if there is decayed health being applied +pub fn decayed_health_displayed(health: &Health) -> bool { + (1.0 - health.maximum() as f64 / health.base_max() as f64) > 0.0 +} /// ui widget containing everything that goes over a character's head /// (Speech bubble, Name, Level, HP/energy bars, etc.) #[derive(WidgetCommon)] @@ -147,6 +152,11 @@ impl<'a> Ingameable for Overhead<'a> { } else { 0 } + + if info.health.map_or(false, |h| decayed_health_displayed(h)) { + 1 + } else { + 0 + } }) + if self.bubble.is_some() { 13 } else { 0 } } } @@ -300,18 +310,20 @@ impl<'a> Widget for Overhead<'a> { .set(state.ids.name, ui); match health { - Some(health) if should_show_healthbar(health) => { + Some(health) + if should_show_healthbar(health) || decayed_health_displayed(health) => + { // Show HP Bar let hp_ani = (self.pulse * 4.0/* speed factor */).cos() * 0.5 + 1.0; //Animation timer let crit_hp_color: Color = Color::Rgba(0.93, 0.59, 0.03, hp_ani); - + let decayed_health = 1.0 - health.maximum() as f64 / health.base_max() as f64; // Background Image::new(if self.in_group {self.imgs.health_bar_group_bg} else {self.imgs.enemy_health_bg}) - .w_h(84.0 * BARSIZE, 10.0 * BARSIZE) - .x_y(0.0, MANA_BAR_Y + 6.5) //-25.5) - .color(Some(Color::Rgba(0.1, 0.1, 0.1, 0.8))) - .parent(id) - .set(state.ids.health_bar_bg, ui); + .w_h(84.0 * BARSIZE, 10.0 * BARSIZE) + .x_y(0.0, MANA_BAR_Y + 6.5) //-25.5) + .color(Some(Color::Rgba(0.1, 0.1, 0.1, 0.8))) + .parent(id) + .set(state.ids.health_bar_bg, ui); // % HP Filling let size_factor = (hp_percentage / 100.0) * BARSIZE; @@ -341,6 +353,26 @@ impl<'a> Widget for Overhead<'a> { }) .parent(id) .set(state.ids.health_bar, ui); + + if decayed_health > 0.0 { + let x_decayed = if self.in_group { + (tweak!(0.0) + (decayed_health / 100.0 * tweak!(41.0) - tweak!(41.0))) + * BARSIZE + } else { + (tweak!(-4.5) + + (decayed_health / 100.0 * tweak!(36.45) - tweak!(36.45))) + * BARSIZE + }; + + let decay_bar_len = + decayed_health * 0.5 * if self.in_group { 82.0 } else { 73.0 }; + Image::new(self.imgs.enemy_bar) + .w_h(decay_bar_len, h) + .x_y(x_decayed * tweak!(-1.0), MANA_BAR_Y + 8.0) + .color(Some(QUALITY_EPIC)) + .parent(id) + .set(state.ids.decay_bar, ui); + } let mut txt = format!("{}/{}", health_cur_txt, health_max_txt); if health.is_dead { txt = self.i18n.get("hud.group.dead").to_string() @@ -411,7 +443,7 @@ impl<'a> Widget for Overhead<'a> { .parent(id) .set(state.ids.level, ui); } - }, + } _ => {}, } }