Add a background to make the buff multiplicities more visible, and show the shortest timer for stackable buffs.

This commit is contained in:
Avi Weinstock 2023-01-15 19:19:02 -05:00
parent 1b00b18a7b
commit adaf8ef6f4
2 changed files with 45 additions and 19 deletions

View File

@ -562,7 +562,9 @@ impl Buffs {
pub fn iter_active(&self) -> impl Iterator<Item = impl Iterator<Item = &Buff>> + '_ { pub fn iter_active(&self) -> impl Iterator<Item = impl Iterator<Item = &Buff>> + '_ {
self.kinds.iter().map(move |(kind, ids)| { self.kinds.iter().map(move |(kind, ids)| {
if kind.stacks() { if kind.stacks() {
Either::Left(ids.iter().filter_map(|id| self.buffs.get(id))) // Iterate stackable buffs in reverse order to show the timer of the soonest one
// to expire
Either::Left(ids.iter().filter_map(|id| self.buffs.get(id)).rev())
} else { } else {
Either::Right(self.buffs.get(&ids[0]).into_iter()) Either::Right(self.buffs.get(&ids[0]).into_iter())
} }

View File

@ -16,6 +16,7 @@ use conrod_core::{
widget::{self, Button, Image, Rectangle, Text}, widget::{self, Button, Image, Rectangle, Text},
widget_ids, Color, Colorable, Positionable, Sizeable, Widget, WidgetCommon, widget_ids, Color, Colorable, Positionable, Sizeable, Widget, WidgetCommon,
}; };
widget_ids! { widget_ids! {
struct Ids { struct Ids {
align, align,
@ -89,6 +90,9 @@ pub enum Event {
RemoveBuff(BuffKind), RemoveBuff(BuffKind),
} }
const MULTIPLICITY_COLOR: Color = TEXT_COLOR;
const MULTIPLICITY_FONT_SIZE: u32 = 20;
impl<'a> Widget for BuffsBar<'a> { impl<'a> Widget for BuffsBar<'a> {
type Event = Vec<Event>; type Event = Vec<Event>;
type State = State; type State = State;
@ -184,10 +188,15 @@ impl<'a> Widget for BuffsBar<'a> {
state.update(|state| state.ids.debuff_timers.resize(debuff_count, gen)); state.update(|state| state.ids.debuff_timers.resize(debuff_count, gen));
}; };
if state.ids.buff_multiplicities.len() < buff_count { if state.ids.buff_multiplicities.len() < buff_count {
state.update(|state| state.ids.buff_multiplicities.resize(buff_count, gen)); state.update(|state| state.ids.buff_multiplicities.resize(2 * buff_count, gen));
}; };
if state.ids.debuff_multiplicities.len() < debuff_count { if state.ids.debuff_multiplicities.len() < debuff_count {
state.update(|state| state.ids.debuff_multiplicities.resize(debuff_count, gen)); state.update(|state| {
state
.ids
.debuff_multiplicities
.resize(2 * debuff_count, gen)
});
}; };
// Create Buff Widgets // Create Buff Widgets
@ -197,7 +206,7 @@ impl<'a> Widget for BuffsBar<'a> {
.iter() .iter()
.copied() .copied()
.zip(state.ids.buff_timers.iter().copied()) .zip(state.ids.buff_timers.iter().copied())
.zip(state.ids.buff_multiplicities.iter().copied()) .zip(state.ids.buff_multiplicities.chunks(2))
.zip(buff_icons.iter().filter(|info| info.is_buff)) .zip(buff_icons.iter().filter(|info| info.is_buff))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
@ -236,13 +245,18 @@ impl<'a> Widget for BuffsBar<'a> {
) )
.set(*id, ui); .set(*id, ui);
if buff.multiplicity() > 1 { if buff.multiplicity() > 1 {
Text::new(&format!("{}", buff.multiplicity())) Rectangle::fill_with([0.0, 0.0], MULTIPLICITY_COLOR.plain_contrast())
.bottom_right_with_margins_on(*id, 1.0, 1.0) .bottom_right_with_margins_on(*id, 1.0, 1.0)
.wh_of(mult_id[1])
.graphics_for(*id) .graphics_for(*id)
.font_size(self.fonts.cyri.scale(14)) .set(mult_id[0], ui);
Text::new(&format!("{}", buff.multiplicity()))
.middle_of(mult_id[0])
.graphics_for(*id)
.font_size(self.fonts.cyri.scale(MULTIPLICITY_FONT_SIZE))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(MULTIPLICITY_COLOR)
.set(*mult_id, ui); .set(mult_id[1], ui);
} }
// Create Buff tooltip // Create Buff tooltip
let (title, desc_txt) = buff.kind.title_description(localized_strings); let (title, desc_txt) = buff.kind.title_description(localized_strings);
@ -278,7 +292,7 @@ impl<'a> Widget for BuffsBar<'a> {
.iter() .iter()
.copied() .copied()
.zip(state.ids.debuff_timers.iter().copied()) .zip(state.ids.debuff_timers.iter().copied())
.zip(state.ids.debuff_multiplicities.iter().copied()) .zip(state.ids.debuff_multiplicities.chunks(2))
.zip(buff_icons.iter().filter(|info| !info.is_buff)) .zip(buff_icons.iter().filter(|info| !info.is_buff))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
@ -316,13 +330,18 @@ impl<'a> Widget for BuffsBar<'a> {
) )
.set(*id, ui); .set(*id, ui);
if debuff.multiplicity() > 1 { if debuff.multiplicity() > 1 {
Text::new(&format!("{}", debuff.multiplicity())) Rectangle::fill_with([0.0, 0.0], MULTIPLICITY_COLOR.plain_contrast())
.bottom_right_with_margins_on(*id, 1.0, 1.0) .bottom_right_with_margins_on(*id, 1.0, 1.0)
.wh_of(mult_id[1])
.graphics_for(*id) .graphics_for(*id)
.font_size(self.fonts.cyri.scale(14)) .set(mult_id[0], ui);
Text::new(&format!("{}", debuff.multiplicity()))
.middle_of(mult_id[0])
.graphics_for(*id)
.font_size(self.fonts.cyri.scale(MULTIPLICITY_FONT_SIZE))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(MULTIPLICITY_COLOR)
.set(*mult_id, ui); .set(mult_id[1], ui);
} }
// Create Debuff tooltip // Create Debuff tooltip
let (title, desc_txt) = debuff.kind.title_description(localized_strings); let (title, desc_txt) = debuff.kind.title_description(localized_strings);
@ -364,7 +383,7 @@ impl<'a> Widget for BuffsBar<'a> {
state.update(|state| state.ids.buff_txts.resize(buff_count, gen)); state.update(|state| state.ids.buff_txts.resize(buff_count, gen));
}; };
if state.ids.buff_multiplicities.len() < buff_count { if state.ids.buff_multiplicities.len() < buff_count {
state.update(|state| state.ids.buff_multiplicities.resize(buff_count, gen)); state.update(|state| state.ids.buff_multiplicities.resize(2 * buff_count, gen));
}; };
// Create Buff Widgets // Create Buff Widgets
@ -376,7 +395,7 @@ impl<'a> Widget for BuffsBar<'a> {
.copied() .copied()
.zip(state.ids.buff_timers.iter().copied()) .zip(state.ids.buff_timers.iter().copied())
.zip(state.ids.buff_txts.iter().copied()) .zip(state.ids.buff_txts.iter().copied())
.zip(state.ids.buff_multiplicities.iter().copied()) .zip(state.ids.buff_multiplicities.chunks(2))
.zip(buff_icons.iter()) .zip(buff_icons.iter())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
@ -412,13 +431,18 @@ impl<'a> Widget for BuffsBar<'a> {
) )
.set(*id, ui); .set(*id, ui);
if buff.multiplicity() > 1 { if buff.multiplicity() > 1 {
Text::new(&format!("{}", buff.multiplicity())) Rectangle::fill_with([0.0, 0.0], MULTIPLICITY_COLOR.plain_contrast())
.bottom_right_with_margins_on(*id, 1.0, 1.0) .bottom_right_with_margins_on(*id, 1.0, 1.0)
.wh_of(mult_id[1])
.graphics_for(*id) .graphics_for(*id)
.font_size(self.fonts.cyri.scale(14)) .set(mult_id[0], ui);
Text::new(&format!("{}", buff.multiplicity()))
.middle_of(mult_id[0])
.graphics_for(*id)
.font_size(self.fonts.cyri.scale(MULTIPLICITY_FONT_SIZE))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(MULTIPLICITY_COLOR)
.set(*mult_id, ui); .set(mult_id[1], ui);
} }
// Create Buff tooltip // Create Buff tooltip
let (title, desc_txt) = buff.kind.title_description(localized_strings); let (title, desc_txt) = buff.kind.title_description(localized_strings);