Diary refactoring

This commit is contained in:
juliancoffee 2021-08-22 17:22:04 +03:00
parent 54cb990d52
commit d76f65fc5a

View File

@ -231,6 +231,7 @@ impl<'a> Diary<'a> {
pub type SelectedSkillTree = skills::SkillGroupKind; pub type SelectedSkillTree = skills::SkillGroupKind;
// TODO: make it enum?
const TREES: [&str; 8] = [ const TREES: [&str; 8] = [
"General Combat", "General Combat",
"Sword", "Sword",
@ -260,9 +261,10 @@ impl<'a> Widget for Diary<'a> {
fn update(mut self, args: widget::UpdateArgs<Self>) -> Self::Event { fn update(mut self, args: widget::UpdateArgs<Self>) -> Self::Event {
common_base::prof_span!("Diary::update"); common_base::prof_span!("Diary::update");
let widget::UpdateArgs { let widget::UpdateArgs {
id: _, state, ui, .. state, ui, ..
} = args; } = args;
let mut events = Vec::new(); let mut events = Vec::new();
// Tooltips // Tooltips
let diary_tooltip = Tooltip::new({ let diary_tooltip = Tooltip::new({
// Edge images [t, b, r, l] // Edge images [t, b, r, l]
@ -281,8 +283,11 @@ impl<'a> Widget for Diary<'a> {
.desc_font_size(self.fonts.cyri.scale(12)) .desc_font_size(self.fonts.cyri.scale(12))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.desc_text_color(TEXT_COLOR); .desc_text_color(TEXT_COLOR);
let sel_tab = &self.show.skilltreetab; let sel_tab = &self.show.skilltreetab;
let frame_ani = (self.pulse * 4.0/* speed factor */).cos() * 0.5 + 0.8; //Animation timer Frame //Animation timer Frame
let frame_ani = (self.pulse * 4.0/* speed factor */).cos() * 0.5 + 0.8;
Image::new(self.imgs.diary_bg) Image::new(self.imgs.diary_bg)
.w_h(1202.0, 886.0) .w_h(1202.0, 886.0)
.mid_top_with_margin_on(ui.window, 5.0) .mid_top_with_margin_on(ui.window, 5.0)
@ -345,94 +350,110 @@ impl<'a> Widget for Diary<'a> {
s.lock_imgs s.lock_imgs
.resize(TREES.len(), &mut ui.widget_id_generator()) .resize(TREES.len(), &mut ui.widget_id_generator())
}); });
for i in TREES.iter().copied().enumerate() {
let locked = !skill_tree_from_str(i.1)
.map_or(false, |st| self.skill_set.contains_skill_group(st));
// Background weapon image // Draw skillgroup tab's icons
let img = Image::new(match i.1 { for (i, skilltree_name) in TREES.iter().copied().enumerate() {
"General Combat" => self.imgs.swords_crossed, let skill_group = match skill_tree_from_str(skilltree_name) {
"Sword" => self.imgs.sword, Some(st) => st,
"Hammer" => self.imgs.hammer, None => {
"Axe" => self.imgs.axe, tracing::warn!("unexpected tree name: {}", skilltree_name);
"Sceptre" => self.imgs.sceptre, continue;
"Bow" => self.imgs.bow, },
"Fire Staff" => self.imgs.staff, };
"Mining" => self.imgs.mining,
_ => self.imgs.nothing,
});
let img = if i.0 == 0 { // Check if we have this skill tree unlocked
img.top_left_with_margins_on(state.content_align, 10.0, 5.0) let locked = !self.skill_set.contains_skill_group(skill_group);
} else {
img.down_from(state.weapon_btns[i.0 - 1], 5.0) // Weapon button image
let btn_img = {
let img = match skilltree_name {
"General Combat" => self.imgs.swords_crossed,
"Sword" => self.imgs.sword,
"Hammer" => self.imgs.hammer,
"Axe" => self.imgs.axe,
"Sceptre" => self.imgs.sceptre,
"Bow" => self.imgs.bow,
"Fire Staff" => self.imgs.staff,
"Mining" => self.imgs.mining,
_ => self.imgs.nothing,
};
if i == 0 {
Image::new(img).top_left_with_margins_on(state.content_align, 10.0, 5.0)
} else {
Image::new(img).down_from(state.weapon_btns[i - 1], 5.0)
}
}; };
let tooltip_txt = if !locked { btn_img.w_h(50.0, 50.0).set(state.weapon_imgs[i], ui);
""
} else {
self.localized_strings.get("hud.skill.not_unlocked")
};
img.w_h(50.0, 50.0).set(state.weapon_imgs[i.0], ui);
// Lock Image // Lock Image
if locked { if locked {
Image::new(self.imgs.lock) Image::new(self.imgs.lock)
.w_h(50.0, 50.0) .w_h(50.0, 50.0)
.middle_of(state.weapon_imgs[i.0]) .middle_of(state.weapon_imgs[i])
.graphics_for(state.weapon_imgs[i.0]) .graphics_for(state.weapon_imgs[i])
.color(Some(Color::Rgba(1.0, 1.0, 1.0, 0.8))) .color(Some(Color::Rgba(1.0, 1.0, 1.0, 0.8)))
.set(state.lock_imgs[i.0], ui); .set(state.lock_imgs[i], ui);
} }
// Weapon icons // Weapon icons
let available_pts = skill_tree_from_str(i.1) let have_points = {
.map(|st| { let available = self.skill_set.available_sp(skill_group);
( let earned = self.skill_set.earned_sp(skill_group);
st, let total_cost = skill_group.total_skill_point_cost();
self.skill_set.available_sp(st),
self.skill_set.earned_sp(st), available > 0 && (earned - available) < total_cost
) };
})
.map_or(false, |(st, a_pts, e_pts)| { let border_image = if skill_group == *sel_tab || have_points {
a_pts > 0 && (e_pts - a_pts) < st.total_skill_point_cost() self.imgs.wpn_icon_border_pressed
}); } else {
if Button::image( self.imgs.wpn_icon_border
if skill_tree_from_str(i.1).map_or(false, |st| st == *sel_tab || available_pts) { };
self.imgs.wpn_icon_border_pressed
} else { let hover_image = if skill_group == *sel_tab {
self.imgs.wpn_icon_border self.imgs.wpn_icon_border_pressed
}, } else {
) self.imgs.wpn_icon_border_mo
.w_h(50.0, 50.0) };
.hover_image(match skill_tree_from_str(i.1).map(|st| st == *sel_tab) {
Some(true) => self.imgs.wpn_icon_border_pressed, let press_image = if skill_group == *sel_tab {
Some(false) => self.imgs.wpn_icon_border_mo, self.imgs.wpn_icon_border_pressed
None => self.imgs.wpn_icon_border, } else {
}) self.imgs.wpn_icon_border_press
.press_image(match skill_tree_from_str(i.1).map(|st| st == *sel_tab) { };
Some(true) => self.imgs.wpn_icon_border_pressed,
Some(false) => self.imgs.wpn_icon_border_press, let color = if skill_group != *sel_tab && have_points {
None => self.imgs.wpn_icon_border, Color::Rgba(0.92, 0.76, 0.0, frame_ani)
}) } else {
.middle_of(state.weapon_imgs[i.0]) TEXT_COLOR
.image_color( };
if skill_tree_from_str(i.1).map_or(false, |st| st != *sel_tab && available_pts) {
Color::Rgba(0.92, 0.76, 0.0, frame_ani) let tooltip_txt = if locked {
} else { self.localized_strings.get("hud.skill.not_unlocked")
TEXT_COLOR } else {
}, ""
) };
.with_tooltip(
self.tooltip_manager, let wpn_button = Button::image(border_image)
i.1, .w_h(50.0, 50.0)
tooltip_txt, .hover_image(hover_image)
&diary_tooltip, .press_image(press_image)
TEXT_COLOR, .middle_of(state.weapon_imgs[i])
) .image_color(color)
.set(state.weapon_btns[i.0], ui) .with_tooltip(
.was_clicked() self.tooltip_manager,
{ skilltree_name,
events.push(skill_tree_from_str(i.1).map_or(Event::Close, Event::ChangeSkillTree)) tooltip_txt,
&diary_tooltip,
TEXT_COLOR,
)
.set(state.weapon_btns[i], ui);
if wpn_button.was_clicked() {
events.push(Event::ChangeSkillTree(skill_group))
} }
} }
// Exp Bars and Rank Display // Exp Bars and Rank Display
let current_exp = self.skill_set.experience(*sel_tab) as f64; let current_exp = self.skill_set.experience(*sel_tab) as f64;
let max_exp = self.skill_set.skill_point_cost(*sel_tab) as f64; let max_exp = self.skill_set.skill_point_cost(*sel_tab) as f64;
@ -2058,36 +2079,6 @@ impl<'a> Widget for Diary<'a> {
} }
} }
fn create_skill_button<'a>(
image: Id,
state: widget::Id,
skill_set: &'a skills::SkillSet,
skill: Skill,
fonts: &'a Fonts,
label: &'a str,
) -> Button<'a, button::Image> {
Button::image(image)
.w_h(74.0, 74.0)
.mid_top_with_margin_on(state, 3.0)
.label(label)
.label_y(conrod_core::position::Relative::Scalar(-47.0))
.label_x(conrod_core::position::Relative::Scalar(0.0))
.label_color(if skill_set.is_at_max_level(skill) {
TEXT_COLOR
} else if skill_set.sufficient_skill_points(skill) {
HP_COLOR
} else {
CRITICAL_HP_COLOR
})
.label_font_size(fonts.cyri.scale(15))
.label_font_id(fonts.cyri.conrod_id)
.image_color(if skill_set.prerequisites_met(skill) {
TEXT_COLOR
} else {
Color::Rgba(0.41, 0.41, 0.41, 0.7)
})
}
fn get_skill_label(skill: Skill, skill_set: &skills::SkillSet) -> String { fn get_skill_label(skill: Skill, skill_set: &skills::SkillSet) -> String {
if skill_set.prerequisites_met(skill) { if skill_set.prerequisites_met(skill) {
format!( format!(
@ -2177,7 +2168,7 @@ impl<'a> Diary<'a> {
events: &mut Vec<Event>, events: &mut Vec<Event>,
diary_tooltip: &Tooltip, diary_tooltip: &Tooltip,
) { ) {
if create_skill_button( if Self::create_skill_button(
id, id,
conrod_widget_id, conrod_widget_id,
self.skill_set, self.skill_set,
@ -2205,4 +2196,35 @@ impl<'a> Diary<'a> {
events.push(Event::UnlockSkill(skill)); events.push(Event::UnlockSkill(skill));
}; };
} }
// FIXME: inline before merge
fn create_skill_button<'b>(
image: Id,
state: widget::Id,
skill_set: &'b skills::SkillSet,
skill: Skill,
fonts: &'b Fonts,
label: &'b str,
) -> Button<'b, button::Image> {
Button::image(image)
.w_h(74.0, 74.0)
.mid_top_with_margin_on(state, 3.0)
.label(label)
.label_y(conrod_core::position::Relative::Scalar(-47.0))
.label_x(conrod_core::position::Relative::Scalar(0.0))
.label_color(if skill_set.is_at_max_level(skill) {
TEXT_COLOR
} else if skill_set.sufficient_skill_points(skill) {
HP_COLOR
} else {
CRITICAL_HP_COLOR
})
.label_font_size(fonts.cyri.scale(15))
.label_font_id(fonts.cyri.conrod_id)
.image_color(if skill_set.prerequisites_met(skill) {
TEXT_COLOR
} else {
Color::Rgba(0.41, 0.41, 0.41, 0.7)
})
}
} }