From 986c05621a878663b9effb15651df4afc32f40b3 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 5 Jan 2021 01:03:25 -0500 Subject: [PATCH] Wired up skill UI to check for prerequisites being met and sufficient skill points. available SP check in general HUD, more skill icons Trimmed 2000 lines from a file. UI tweaks --- .../element/buttons/arrow_down_gold.png | 3 + .../element/icons/skilltree/leap_cost.png | 3 + .../element/icons/skilltree/leap_damage.png | 3 + .../element/icons/skilltree/leap_distance.png | 3 + .../icons/skilltree/leap_knockback.png | 3 + .../element/icons/skilltree/leap_radius.png | 3 + .../element/icons/skilltree/spin_amount.png | 3 + .../element/icons/skilltree/spin_cost.png | 3 + .../element/icons/skilltree/spin_damage.png | 3 + .../icons/skilltree/spin_helicopter.png | 3 + .../element/icons/skilltree/spin_infinite.png | 3 + .../element/icons/skilltree/spin_speed.png | 3 + .../element/icons/skilltree/unlock_bow.png | 4 +- assets/voxygen/i18n/en.ron | 8 +- assets/voxygen/i18n/en/hud/misc.ron | 3 + common/src/comp/skills.rs | 59 +- voxygen/src/hud/buttons.rs | 78 +- voxygen/src/hud/diary.rs | 3739 ++++++++--------- voxygen/src/hud/hotbar.rs | 52 +- voxygen/src/hud/img_ids.rs | 2 + voxygen/src/hud/mod.rs | 1 + voxygen/src/menu/char_selection/ui/mod.rs | 4 +- 22 files changed, 1844 insertions(+), 2142 deletions(-) create mode 100644 assets/voxygen/element/buttons/arrow_down_gold.png create mode 100644 assets/voxygen/element/icons/skilltree/leap_cost.png create mode 100644 assets/voxygen/element/icons/skilltree/leap_damage.png create mode 100644 assets/voxygen/element/icons/skilltree/leap_distance.png create mode 100644 assets/voxygen/element/icons/skilltree/leap_knockback.png create mode 100644 assets/voxygen/element/icons/skilltree/leap_radius.png create mode 100644 assets/voxygen/element/icons/skilltree/spin_amount.png create mode 100644 assets/voxygen/element/icons/skilltree/spin_cost.png create mode 100644 assets/voxygen/element/icons/skilltree/spin_damage.png create mode 100644 assets/voxygen/element/icons/skilltree/spin_helicopter.png create mode 100644 assets/voxygen/element/icons/skilltree/spin_infinite.png create mode 100644 assets/voxygen/element/icons/skilltree/spin_speed.png diff --git a/assets/voxygen/element/buttons/arrow_down_gold.png b/assets/voxygen/element/buttons/arrow_down_gold.png new file mode 100644 index 0000000000..8c1a6bac23 --- /dev/null +++ b/assets/voxygen/element/buttons/arrow_down_gold.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97206dc6bbd81aa8a918e01f4de044e254e0046f801d9cc6e2a02f3be4083ff4 +size 2057 diff --git a/assets/voxygen/element/icons/skilltree/leap_cost.png b/assets/voxygen/element/icons/skilltree/leap_cost.png new file mode 100644 index 0000000000..920755fab8 --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/leap_cost.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca23a8c5d4fa849b9c7ab92b19cb60b1d87aaf7b52413113024fb05473d3938d +size 809 diff --git a/assets/voxygen/element/icons/skilltree/leap_damage.png b/assets/voxygen/element/icons/skilltree/leap_damage.png new file mode 100644 index 0000000000..feadf20c0f --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/leap_damage.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61670df28e327ac7a38d38aa0bfca068952783a533a536606e19018817bac06e +size 799 diff --git a/assets/voxygen/element/icons/skilltree/leap_distance.png b/assets/voxygen/element/icons/skilltree/leap_distance.png new file mode 100644 index 0000000000..5337c23b1f --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/leap_distance.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2f5fce74cbedd15c7afbb1d77c880ee57cd78dd79791d6ab8c9d1ebeef43f8b +size 433 diff --git a/assets/voxygen/element/icons/skilltree/leap_knockback.png b/assets/voxygen/element/icons/skilltree/leap_knockback.png new file mode 100644 index 0000000000..b24ec61511 --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/leap_knockback.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:320c1022eb23fd83a8b6df0eee53cf13a74d7ef5dce3b3b1c1f3c736002d3b1f +size 425 diff --git a/assets/voxygen/element/icons/skilltree/leap_radius.png b/assets/voxygen/element/icons/skilltree/leap_radius.png new file mode 100644 index 0000000000..d88baebaab --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/leap_radius.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dcdd362958e1701b59a44944fbcd10b93ab319b0036321996de674e7c0ae7ed +size 451 diff --git a/assets/voxygen/element/icons/skilltree/spin_amount.png b/assets/voxygen/element/icons/skilltree/spin_amount.png new file mode 100644 index 0000000000..99c8447ab5 --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/spin_amount.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8304d36d48b4462874ed57047dace068b5a438f8c40a10f51c53474f85bb4abd +size 371 diff --git a/assets/voxygen/element/icons/skilltree/spin_cost.png b/assets/voxygen/element/icons/skilltree/spin_cost.png new file mode 100644 index 0000000000..2430903f0e --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/spin_cost.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:579632e333ff576c782228d34f729582c07ac1da1bc9017931827c8b0f334ae0 +size 358 diff --git a/assets/voxygen/element/icons/skilltree/spin_damage.png b/assets/voxygen/element/icons/skilltree/spin_damage.png new file mode 100644 index 0000000000..e3b8455330 --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/spin_damage.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae3f6725a84f04bfbd35c7eacd024a0c079afd9ee44cd173fada35d9b119c5b7 +size 355 diff --git a/assets/voxygen/element/icons/skilltree/spin_helicopter.png b/assets/voxygen/element/icons/skilltree/spin_helicopter.png new file mode 100644 index 0000000000..3e146736f5 --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/spin_helicopter.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:864b8f2ff0a07eee28ab688b21276a35a9da00df56e4663b663925a3def0c42c +size 359 diff --git a/assets/voxygen/element/icons/skilltree/spin_infinite.png b/assets/voxygen/element/icons/skilltree/spin_infinite.png new file mode 100644 index 0000000000..83e73cb431 --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/spin_infinite.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a600bd081a4e6147d6d2174a0e93fd9139f368293ebddfcfba607c01fa6a350 +size 360 diff --git a/assets/voxygen/element/icons/skilltree/spin_speed.png b/assets/voxygen/element/icons/skilltree/spin_speed.png new file mode 100644 index 0000000000..b443c6a4aa --- /dev/null +++ b/assets/voxygen/element/icons/skilltree/spin_speed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f790af04f3cbbbb196fc0357377aa8f88152a8a7d8e5d3df049703ea542fb68 +size 354 diff --git a/assets/voxygen/element/icons/skilltree/unlock_bow.png b/assets/voxygen/element/icons/skilltree/unlock_bow.png index a93d1f2b1f..213b37e274 100644 --- a/assets/voxygen/element/icons/skilltree/unlock_bow.png +++ b/assets/voxygen/element/icons/skilltree/unlock_bow.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:421099f69c426edbdc04acd5066a403061c08e991a72f2946a478f3d1e8d37c4 -size 367 +oid sha256:12c5b4b08af529f54524902dcdcb46d2beeb4bfde5e18561f6956abc2deaa5f6 +size 1580 diff --git a/assets/voxygen/i18n/en.ron b/assets/voxygen/i18n/en.ron index 17a53e38a3..7066b63efe 100644 --- a/assets/voxygen/i18n/en.ron +++ b/assets/voxygen/i18n/en.ron @@ -280,11 +280,7 @@ magically infused items?"#, "hud.bag.feet": "Feet", "hud.bag.mainhand": "Mainhand", "hud.bag.offhand": "Offhand", - - // Diary - "hud.diary": "Diary", - - + // Map and Questlog "hud.map.map_title": "Map", "hud.map.qlog_title": "Quests", @@ -397,7 +393,7 @@ magically infused items?"#, "hud.crafting.recipes": "Recipes", "hud.crafting.ingredients": "Ingredients:", "hud.crafting.craft": "Craft", - "hud.crafting.tool_cata": "Requires:", + "hud.crafting.tool_cata": "Requires:", "hud.group": "Group", "hud.group.invite_to_join": "{name} invited you to their group!", diff --git a/assets/voxygen/i18n/en/hud/misc.ron b/assets/voxygen/i18n/en/hud/misc.ron index bdc675c119..12d93a9317 100644 --- a/assets/voxygen/i18n/en/hud/misc.ron +++ b/assets/voxygen/i18n/en/hud/misc.ron @@ -8,6 +8,7 @@ "hud.quests": "Quests", "hud.you_died": "You Died", "hud.waypoint_saved": "Waypoint Saved", + "hud.sp_arrow_txt": "SP", "hud.press_key_to_show_keybindings_fmt": "[{key}] Keybindings", "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lantern", @@ -64,6 +65,8 @@ Maybe you can even obtain one of their magically infused items?"#, "hud.spell": "Spells", + // Diary + "hud.diary": "Diary", "hud.free_look_indicator": "Free look active. Press {key} to disable.", "hud.auto_walk_indicator": "Auto walk active", diff --git a/common/src/comp/skills.rs b/common/src/comp/skills.rs index 41f32ac140..d2b97f81c2 100644 --- a/common/src/comp/skills.rs +++ b/common/src/comp/skills.rs @@ -6,7 +6,7 @@ use hashbrown::{HashMap, HashSet}; use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use std::hash::Hash; -use tracing::warn; +use tracing::{trace, warn}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct SkillTreeMap(HashMap>); @@ -338,8 +338,8 @@ impl SkillSet { } else { skill.get_max_level().map(|_| 1) }; - let prerequisites_met = self.prerequisites_met(skill, next_level); - if !matches!(self.skills.get(&skill), Some(&None)) { + let prerequisites_met = self.prerequisites_met(skill); + if !matches!(self.skills.get(&skill), Some(level) if *level == skill.get_max_level()) { if let Some(mut skill_group) = self .skill_groups .iter_mut() @@ -359,16 +359,16 @@ impl SkillSet { } self.skills.insert(skill, next_level); } else { - warn!("Tried to unlock skill for skill group with insufficient SP"); + trace!("Tried to unlock skill for skill group with insufficient SP"); } } else { - warn!("Tried to unlock skill without meeting prerequisite skills"); + trace!("Tried to unlock skill without meeting prerequisite skills"); } } else { - warn!("Tried to unlock skill for a skill group that player does not have"); + trace!("Tried to unlock skill for a skill group that player does not have"); } } else { - warn!("Tried to unlock skill the player already has") + trace!("Tried to unlock skill the player already has") } } else { warn!( @@ -488,8 +488,13 @@ impl SkillSet { /// Checks that the skill set contains all prerequisite skills for a /// particular skill - pub fn prerequisites_met(&self, skill: Skill, level: Level) -> bool { - skill.prerequisite_skills(level).iter().all(|(s, l)| { + pub fn prerequisites_met(&self, skill: Skill) -> bool { + let next_level = if self.skills.contains_key(&skill) { + self.skills.get(&skill).copied().flatten().map(|l| l + 1) + } else { + skill.get_max_level().map(|_| 1) + }; + skill.prerequisite_skills(next_level).iter().all(|(s, l)| { self.skills.contains_key(s) && self.skills.get(s).map_or(false, |l_b| l_b >= l) }) } @@ -520,6 +525,37 @@ impl SkillSet { .filter(|s_g| s_g.skill_group_type == skill_group); skill_groups.next().map_or(0, |s_g| s_g.exp) } + + /// Checks if player has sufficient skill points to purchase a skill + pub fn sufficient_skill_points(&self, skill: Skill) -> bool { + if let Some(skill_group_type) = SkillSet::get_skill_group_type_for_skill(&skill) { + if let Some(skill_group) = self + .skill_groups + .iter() + .find(|x| x.skill_group_type == skill_group_type) + { + let next_level = if self.skills.contains_key(&skill) { + self.skills.get(&skill).copied().flatten().map(|l| l + 1) + } else { + skill.get_max_level().map(|_| 1) + }; + let needed_sp = skill.skill_cost(next_level); + skill_group.available_sp > needed_sp + } else { + false + } + } else { + false + } + } + + /// Checks if the player has available SP to spend + pub fn has_available_sp(&self) -> bool { + self.skill_groups.iter().any(|sg| { + sg.available_sp > 0 + && (sg.earned_sp - sg.available_sp) < sg.skill_group_type.get_max_skill_points() + }) + } } impl Skill { @@ -528,10 +564,7 @@ impl Skill { pub fn prerequisite_skills(self, level: Level) -> HashMap { let mut prerequisites = HashMap::new(); if let Some(level) = level { - if level > self.get_max_level().unwrap_or(0) { - // Sets a prerequisite of itself for skills beyond the max level - prerequisites.insert(self, Some(level)); - } else if level > 1 { + if level > 1 { // For skills above level 1, sets prerequisite of skill of lower level prerequisites.insert(self, Some(level - 1)); } diff --git a/voxygen/src/hud/buttons.rs b/voxygen/src/hud/buttons.rs index c2b6795dee..2fa94cfd9f 100644 --- a/voxygen/src/hud/buttons.rs +++ b/voxygen/src/hud/buttons.rs @@ -1,6 +1,6 @@ use super::{ img_ids::{Imgs, ImgsRot}, - BLACK, CRITICAL_HP_COLOR, LOW_HP_COLOR, TEXT_COLOR, + BLACK, CRITICAL_HP_COLOR, LOW_HP_COLOR, QUALITY_LEGENDARY, TEXT_COLOR, }; use crate::{ i18n::Localization, @@ -11,10 +11,10 @@ use crate::{ use client::Client; use common::comp::Stats; use conrod_core::{ - widget::{self, Button, Text}, + widget::{self, Button, Image, Text}, widget_ids, Color, Colorable, Positionable, Sizeable, Widget, WidgetCommon, }; - +use inline_tweak::*; widget_ids! { struct Ids { bag, @@ -42,6 +42,9 @@ widget_ids! { crafting_text, crafting_text_bg, group_button, + sp_arrow, + sp_arrow_txt_bg, + sp_arrow_txt, } } #[derive(WidgetCommon)] @@ -57,6 +60,7 @@ pub struct Buttons<'a> { tooltip_manager: &'a mut TooltipManager, localized_strings: &'a Localization, stats: &'a Stats, + pulse: f32, } impl<'a> Buttons<'a> { @@ -71,6 +75,7 @@ impl<'a> Buttons<'a> { tooltip_manager: &'a mut TooltipManager, localized_strings: &'a Localization, stats: &'a Stats, + pulse: f32, ) -> Self { Self { client, @@ -83,6 +88,7 @@ impl<'a> Buttons<'a> { tooltip_manager, localized_strings, stats, + pulse, } } } @@ -122,6 +128,9 @@ impl<'a> Widget for Buttons<'a> { None => return None, }; let localized_strings = self.localized_strings; + let arrow_ani = + (self.pulse * tweak!(4.0)/* speed factor */).cos() * tweak!(0.5) + tweak!(0.8); //Animation timer + let button_tooltip = Tooltip::new({ // Edge images [t, b, r, l] // Corner images [tr, tl, br, bl] @@ -326,22 +335,26 @@ impl<'a> Widget for Buttons<'a> { .color(TEXT_COLOR) .set(state.ids.map_text, ui); } - - // Spellbook - if Button::image(self.imgs.spellbook_button) - .w_h(28.0, 25.0) - .left_from(state.ids.map_button, 10.0) - .hover_image(self.imgs.spellbook_hover) - .press_image(self.imgs.spellbook_press) - .with_tooltip( - self.tooltip_manager, - &localized_strings.get("hud.diary"), - "", - &button_tooltip, - TEXT_COLOR, - ) - .set(state.ids.spellbook_button, ui) - .was_clicked() + // Diary + let unspent_sp = self.stats.skill_set.has_available_sp(); + if Button::image(if !unspent_sp { + self.imgs.spellbook_button + } else { + self.imgs.spellbook_hover + }) + .w_h(28.0, 25.0) + .left_from(state.ids.map_button, 10.0) + .hover_image(self.imgs.spellbook_hover) + .press_image(self.imgs.spellbook_press) + .with_tooltip( + self.tooltip_manager, + &localized_strings.get("hud.diary"), + "", + &button_tooltip, + TEXT_COLOR, + ) + .set(state.ids.spellbook_button, ui) + .was_clicked() { return Some(Event::ToggleSpell); } @@ -364,7 +377,32 @@ impl<'a> Widget for Buttons<'a> { .color(TEXT_COLOR) .set(state.ids.spellbook_text, ui); } - + // Unspent SP indicator + if unspent_sp { + Image::new(self.imgs.sp_indicator_arrow) + .w_h(20.0, 11.0) + .graphics_for(state.ids.spellbook_button) + .mid_top_with_margin_on( + state.ids.spellbook_button, + tweak!(-12.0) + arrow_ani as f64, + ) + .color(Some(QUALITY_LEGENDARY)) + .set(state.ids.sp_arrow, ui); + Text::new(&localized_strings.get("hud.sp_arrow_txt")) + .mid_top_with_margin_on(state.ids.sp_arrow, tweak!(-18.0)) + .graphics_for(state.ids.spellbook_button) + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(tweak!(14))) + .color(BLACK) + .set(state.ids.sp_arrow_txt_bg, ui); + Text::new(&localized_strings.get("hud.sp_arrow_txt")) + .graphics_for(state.ids.spellbook_button) + .bottom_right_with_margins_on(state.ids.sp_arrow_txt_bg, 1.0, 1.0) + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(tweak!(14))) + .color(QUALITY_LEGENDARY) + .set(state.ids.sp_arrow_txt, ui); + } // Crafting if Button::image(self.imgs.crafting_icon) .w_h(25.0, 25.0) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index d4a1be2397..aa1f1d2a2b 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -9,7 +9,8 @@ use crate::{ }; use conrod_core::{ color, - widget::{self, Button, Image, Rectangle, Text}, + image::Id, + widget::{self, button, Button, Image, Rectangle, Text}, widget_ids, Color, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon, }; @@ -368,8 +369,16 @@ impl<'a> Widget for Diary<'a> { } // Weapon icons let available_pts = skill_tree_from_str(i.1) - .map_or(false, |st| self.stats.skill_set.get_available_sp(st) > 0); - self.stats.skill_set.get_available_sp(*sel_tab); + .map(|st| { + ( + st, + self.stats.skill_set.get_available_sp(st), + self.stats.skill_set.get_earned_sp(st), + ) + }) + .map_or(false, |(st, a_pts, e_pts)| { + a_pts > 0 && (e_pts - a_pts) < st.get_max_skill_points() + }); if Button::image( if skill_tree_from_str(i.1).map_or(false, |st| st == *sel_tab || available_pts) { self.imgs.wpn_icon_border_pressed @@ -632,7 +641,6 @@ impl<'a> Widget for Diary<'a> { // Skill-Icons and Functionality // Art dimensions let art_size = [tweak!(320.0), tweak!(320.0)]; - let skills = &self.stats.skill_set.skills; match sel_tab { SelectedSkillTree::General => { use skills::{GeneralSkill::*, RollSkill::*, SkillGroupType::*}; @@ -659,316 +667,256 @@ impl<'a> Widget for Diary<'a> { // 3 0 4 // 8 2 7 let skill = Skill::General(HealthIncrease); - if Button::image(self.imgs.health_plus_skill) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Increase Health", - "Increases health", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_stat_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.health_plus_skill, + state.skills_top_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Increase Health", + "Increases health", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_stat_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::General(EnergyIncrease); - if Button::image(self.imgs.stamina_plus_skill) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Increase Energy", - "Increases energy", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_stat_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.stamina_plus_skill, + state.skills_top_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Increase Energy", + "Increases energy", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_stat_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Top right skills let skill = Skill::UnlockGroup(Weapon(Sword)); - if Button::image(self.imgs.unlock_sword_skill) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Sword", - "Unlocks sword skill tree", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_tree_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.unlock_sword_skill, + state.skills_top_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Sword", + "Unlocks sword skill tree", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_tree_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::UnlockGroup(Weapon(Axe)); - if Button::image(self.imgs.unlock_axe_skill) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Axe", - "Unlocks axe skill tree", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_tree_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.unlock_axe_skill, + state.skills_top_r[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Axe", + "Unlocks axe skill tree", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_tree_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::UnlockGroup(Weapon(Hammer)); - if Button::image(self.imgs.unlock_hammer_skill) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Hammer", - "Unlocks hammer skill tree", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_tree_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.unlock_hammer_skill, + state.skills_top_r[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Hammer", + "Unlocks hammer skill tree", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_tree_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::UnlockGroup(Weapon(Bow)); - if Button::image(self.imgs.unlock_bow_skill) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Bow", - "Unlocks bow skill tree", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_tree_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.unlock_bow_skill, + state.skills_top_r[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Bow", + "Unlocks bow skill tree", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_tree_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::UnlockGroup(Weapon(Staff)); - if Button::image(self.imgs.unlock_staff_skill0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Staff", - "Unlocks staff skill tree", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_tree_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.unlock_staff_skill0, + state.skills_top_r[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Staff", + "Unlocks staff skill tree", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_tree_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::UnlockGroup(Weapon(Sceptre)); - if Button::image(self.imgs.unlock_sceptre_skill) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[5]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Sceptre", - "Unlocks sceptre skill tree", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_tree_5, ui) - .was_clicked() + if create_skill_button( + self.imgs.unlock_sceptre_skill, + state.skills_top_r[5], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Sceptre", + "Unlocks sceptre skill tree", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_tree_5, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom left skills let skill = Skill::Roll(ImmuneMelee); - if Button::image(self.imgs.swords_crossed) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Dodge", - "Ground-yeeting dodges melee attacks", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_roll_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.swords_crossed, + state.skills_bot_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Dodge", + "Ground-yeeting dodges melee attacks", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_roll_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Roll(Cost); - if Button::image(self.imgs.swords_crossed) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Cost", - "Decreases cost of ground-yeeting yourself", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_roll_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.swords_crossed, + state.skills_bot_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Cost", + "Decreases cost of ground-yeeting yourself", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_roll_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Roll(Strength); - if Button::image(self.imgs.swords_crossed) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Strength", - "Increases how far you ground-yeet yourself", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_roll_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.swords_crossed, + state.skills_bot_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Strength", + "Increases how far you ground-yeet yourself", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_roll_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Roll(Duration); - if Button::image(self.imgs.swords_crossed) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Duration", - "Increases for how long you ground-yeet yourself", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_general_roll_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.swords_crossed, + state.skills_bot_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Duration", + "Increases for how long you ground-yeet yourself", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_general_roll_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; @@ -989,433 +937,341 @@ impl<'a> Widget for Diary<'a> { // 3 0 4 // 8 2 7 let skill = Skill::Sword(TsCombo); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Triple Strike Combo", - "Unlocks combo scaling on triple strike", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_combo_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Triple Strike Combo", + "Unlocks combo scaling on triple strike", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_combo_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(TsDamage); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Triple Strike Damage", - "Increases damage scaling on triple strike", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_combo_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Triple Strike Damage", + "Increases damage scaling on triple strike", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_combo_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(TsSpeed); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Triple Strike Speed", - "Increases attack speed scaling on triple strike", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_combo_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Triple Strike Speed", + "Increases attack speed scaling on triple strike", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_combo_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(TsRegen); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Triple Strike Regen", - "Increases enery regen scaling on triple strike", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_combo_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Triple Strike Regen", + "Increases enery regen scaling on triple strike", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_combo_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Top right skills let skill = Skill::Sword(DDamage); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Dash Damage", - "Increases initial damage of the dash", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_dash_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Dash Damage", + "Increases initial damage of the dash", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_dash_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(DDrain); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Dash Drain", - "Decreases the rate energy is drained while dashing", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_dash_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_r[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Dash Drain", + "Decreases the rate energy is drained while dashing", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_dash_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(DCost); - let prereqs_met = tweak!(true); - let suff_pts = tweak!(false); - let label_txt = &format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - ); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[2]) - .label(if prereqs_met { &label_txt } else { "" }) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(if suff_pts { - HP_COLOR - } else { - CRITICAL_HP_COLOR - }) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .image_color(if prereqs_met { - TEXT_COLOR - } else { - Color::Rgba(0.41, 0.41, 0.41, tweak!(0.7)) - }) - .with_tooltip( - self.tooltip_manager, - "Dash Cost", - "Decreases the initial cost of the dash", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_dash_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_r[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Dash Cost", + "Decreases the initial cost of the dash", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_dash_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(DSpeed); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Dash Speed", - "Increases how fast you go while dashing", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_dash_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_r[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Dash Speed", + "Increases how fast you go while dashing", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_dash_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(DInfinite); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Dash Infinite", - "Allows you to dash for as long as you have energy", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_dash_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_r[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Dash Infinite", + "Allows you to dash for as long as you have energy", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_dash_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(DScaling); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[5]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Dash Scaling", - "Increases how much the damage scales by over the course of the dash", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_dash_5, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_top_r[5], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Dash Scaling", + "Increases how much the damage scales by over the course of the dash", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_dash_5, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom left skills let skill = Skill::Sword(SUnlockSpin); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Unlock", - "Unlocks the sword spin", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_spin_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_bot_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Unlock", + "Unlocks the sword spin", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_spin_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(SDamage); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Damage", - "Increases the damage done", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_spin_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_bot_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Damage", + "Increases the damage done", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_spin_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(SSpeed); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Speed", - "Increase the speed at which you spin", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_spin_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_bot_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Speed", + "Increase the speed at which you spin", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_spin_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(SCost); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Cost", - "Decreases the energy cost of each spin", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_spin_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_bot_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Cost", + "Decreases the energy cost of each spin", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_spin_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sword(SSpins); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Spins", - "Increases the number of times you can spin", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_spin_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_bot_l[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Spins", + "Increases the number of times you can spin", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_spin_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom right skills let skill = Skill::Sword(InterruptingAttacks); - if Button::image(self.imgs.sword_whirlwind) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Interrupting Attacks", - "Allows you to immediately cancel an attack with another attack", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sword_passive_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.sword_whirlwind, + state.skills_bot_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Interrupting Attacks", + "Allows you to immediately cancel an attack with another attack", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sword_passive_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; @@ -1436,368 +1292,298 @@ impl<'a> Widget for Diary<'a> { // 3 0 4 // 8 2 7 let skill = Skill::Axe(DsCombo); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Double Strike Combo", - "Unlocks a second strike", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_combo_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Double Strike Combo", + "Unlocks a second strike", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_combo_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(DsDamage); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Double Strike Damage", - "Increases damage scaling in combo", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_combo_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Double Strike Damage", + "Increases damage scaling in combo", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_combo_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(DsSpeed); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Double Strike Speed", - "Increases speed scaling in combo", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_combo_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Double Strike Speed", + "Increases speed scaling in combo", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_combo_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(DsRegen); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Double Strike Regen", - "Increases energy regen scaling in combo", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_combo_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Double Strike Regen", + "Increases energy regen scaling in combo", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_combo_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Top right skills let skill = Skill::Axe(SInfinite); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Infinite Axe Spin", - "Spin for as long as you have energy", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_spin_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Infinite Axe Spin", + "Spin for as long as you have energy", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_spin_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(SDamage); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Damage", - "Increases the daamge each spin does", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_spin_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_r[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Damage", + "Increases the daamge each spin does", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_spin_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(SHelicopter); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Helicopter", - "You fall a little slower while spinning", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_spin_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_r[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Helicopter", + "You fall a little slower while spinning", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_spin_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(SSpeed); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Speed", - "Increases your spins per minute", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_spin_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_r[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Speed", + "Increases your spins per minute", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_spin_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(SCost); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Spin Cost", - "Increases your spin per energy efficiency", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_spin_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_top_r[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Spin Cost", + "Increases your spin per energy efficiency", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_spin_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom left skills let skill = Skill::Axe(LUnlockLeap); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Leap", - "Unlocks a leap spin", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_leap_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_bot_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Leap", + "Unlocks a leap spin", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_leap_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(LDamage); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Damage", - "Increases damage of leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_leap_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_bot_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Damage", + "Increases damage of leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_leap_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(LKnockback); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Knockback", - "Increases knockback from leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_leap_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_bot_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Knockback", + "Increases knockback from leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_leap_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(LCost); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Cost", - "Decreases cost of leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_leap_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_bot_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Cost", + "Decreases cost of leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_leap_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Axe(LDistance); - if Button::image(self.imgs.axespin) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Distance", - "Increases distance of leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_axe_leap_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.axespin, + state.skills_bot_l[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Distance", + "Increases distance of leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_axe_leap_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; @@ -1818,368 +1604,298 @@ impl<'a> Widget for Diary<'a> { // 3 0 4 // 8 2 7 let skill = Skill::Hammer(SsKnockback); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Single Strike Knockback", - "Increaes yeet potential of swings", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_combo_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Single Strike Knockback", + "Increaes yeet potential of swings", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_combo_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(SsDamage); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Single Strike Damage", - "Increases damage scaling in combo", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_combo_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Single Strike Damage", + "Increases damage scaling in combo", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_combo_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(SsSpeed); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Single Strike Speed", - "Increases speed scaling in combo", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_combo_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Single Strike Speed", + "Increases speed scaling in combo", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_combo_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(SsRegen); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Single Strike Regen", - "Increases energy regen scaling in combo", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_combo_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Single Strike Regen", + "Increases energy regen scaling in combo", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_combo_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Top right skills let skill = Skill::Hammer(CKnockback); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Melee Knockback", - "Massively increases yeet potential of swing", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_charged_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Melee Knockback", + "Massively increases yeet potential of swing", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_charged_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(CDamage); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Melee Damage", - "Increases the daamge of the charged swing", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_charged_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_r[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Melee Damage", + "Increases the daamge of the charged swing", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_charged_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(CDrain); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Melee Energy Drain", - "Decreases the rate energy drains when charging", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_charged_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_r[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Melee Energy Drain", + "Decreases the rate energy drains when charging", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_charged_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(CSpeed); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charge Rate", - "Increases the rate that you charge the swing", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_charged_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_top_r[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charge Rate", + "Increases the rate that you charge the swing", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_charged_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom left skills let skill = Skill::Hammer(LUnlockLeap); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Unlock Leap", - "Unlocks a leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_leap_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_bot_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Unlock Leap", + "Unlocks a leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_leap_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(LDamage); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Damage", - "Increases damage of leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_leap_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_bot_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Damage", + "Increases damage of leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_leap_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(LKnockback); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Knockback", - "Increases knockback from leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_leap_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_bot_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Knockback", + "Increases knockback from leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_leap_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(LCost); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Cost", - "Decreases cost of leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_leap_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_bot_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Cost", + "Decreases cost of leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_leap_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(LDistance); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Distance", - "Increases distance of leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_leap_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_bot_l[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Distance", + "Increases distance of leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_leap_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Hammer(LRange); - if Button::image(self.imgs.hammergolf) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[5]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Leap Radius", - "Increases attack radius on ground slam", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_hammer_leap_5, ui) - .was_clicked() + if create_skill_button( + self.imgs.hammergolf, + state.skills_bot_l[5], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Leap Radius", + "Increases attack radius on ground slam", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_hammer_leap_5, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; @@ -2199,369 +1915,299 @@ impl<'a> Widget for Diary<'a> { // 3 0 4 // 8 2 7 let skill = Skill::Bow(BDamage); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Damage", - "Increases damage", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_basic_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Damage", + "Increases damage", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_basic_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(BRegen); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Energy Regen", - "Increases energy regen", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_basic_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Energy Regen", + "Increases energy regen", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_basic_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Top right skills let skill = Skill::Bow(CDamage); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Damage", - "Increases how much damage scales by as it is charged", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_charged_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Damage", + "Increases how much damage scales by as it is charged", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_charged_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(CDrain); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Drain", - "Decreases the rate energy is drained while charging", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_charged_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_r[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Drain", + "Decreases the rate energy is drained while charging", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_charged_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(CProjSpeed); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Projectile Speed", - "Increases yeet potential applied to arrow while charging", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_charged_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_r[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Projectile Speed", + "Increases yeet potential applied to arrow while charging", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_charged_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(CSpeed); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Speed", - "Increases the rate that you charge the attack", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_charged_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_r[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Speed", + "Increases the rate that you charge the attack", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_charged_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(CMove); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Move Speed", - "Increases how fast you can shuffle while charging the attack", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_charged_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_r[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Move Speed", + "Increases how fast you can shuffle while charging the attack", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_charged_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(CKnockback); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[5]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Charged Knockback", - "Yeet enemies further", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_charged_5, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_top_r[5], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Charged Knockback", + "Yeet enemies further", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_charged_5, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom left skills let skill = Skill::Bow(UnlockRepeater); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Repeater Unlock", - "Unlocks the ability to leap in the arrow", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_repeater_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_bot_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Repeater Unlock", + "Unlocks the ability to leap in the arrow", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_repeater_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(RDamage); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Repeater Damage", - "Increases the damage done", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_repeater_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_bot_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Repeater Damage", + "Increases the damage done", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_repeater_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(RGlide); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Repeater Glide", - "Glide further while repeatering", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_repeater_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_bot_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Repeater Glide", + "Glide further while repeatering", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_repeater_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(RCost); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Repeater Cost", - "Decreases the energy cost to become a gliding repeater", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_repeater_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_bot_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Repeater Cost", + "Decreases the energy cost to become a gliding repeater", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_repeater_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Bow(RArrows); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Arrow Count", - "Yeet more arrows when you leap", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_repeater_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_bot_l[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Arrow Count", + "Yeet more arrows when you leap", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_repeater_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom right skills let skill = Skill::Bow(ProjSpeed); - if Button::image(self.imgs.bow_m1) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Projectile Speed", - "Allows you to yeet arrows further, faster", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_bow_passive_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.bow_m1, + state.skills_bot_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Projectile Speed", + "Allows you to yeet arrows further, faster", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_bow_passive_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; @@ -2582,342 +2228,277 @@ impl<'a> Widget for Diary<'a> { // 3 0 4 // 8 2 7 let skill = Skill::Staff(BExplosion); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Explosion", - "When fire just isn't enough", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_basic_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Explosion", + "When fire just isn't enough", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_basic_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(BDamage); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Damage", - "Increases damage", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_basic_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Damage", + "Increases damage", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_basic_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(BRegen); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Energy Regen", - "Increases energy regen", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_basic_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Energy Regen", + "Increases energy regen", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_basic_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(BRadius); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Explosion Radius", - "Bigger is better", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_basic_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Explosion Radius", + "Bigger is better", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_basic_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Top right skills let skill = Skill::Staff(FDamage); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Flamethrower Damage", - "Increases damage", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_beam_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Flamethrower Damage", + "Increases damage", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_beam_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(FDrain); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Energy Drain", - "Decreases the rate energy is drained", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_beam_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_r[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Energy Drain", + "Decreases the rate energy is drained", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_beam_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(FRange); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Flamethrower Range", - "For when the flames just won't reach", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_beam_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_r[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Flamethrower Range", + "For when the flames just won't reach", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_beam_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(FVelocity); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Flame Velocity", - "Gets the fire there faster", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_beam_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_top_r[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Flame Velocity", + "Gets the fire there faster", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_beam_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Bottom left skills let skill = Skill::Staff(UnlockShockwave); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Shockwave Unlock", - "Unlocks the ability to yeet enemies away using fire", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_shockwave_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_bot_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Shockwave Unlock", + "Unlocks the ability to yeet enemies away using fire", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_shockwave_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(SDamage); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Shockwave Damage", - "Increases the damage done", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_shockwave_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_bot_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Shockwave Damage", + "Increases the damage done", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_shockwave_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(SKnockback); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Shockwave Knockback", - "Increases yeet potential", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_shockwave_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_bot_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Shockwave Knockback", + "Increases yeet potential", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_shockwave_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(SCost); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Shockwave Cost", - "Decreases the energy cost to yeet helpless villagers", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_shockwave_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_bot_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Shockwave Cost", + "Decreases the energy cost to yeet helpless villagers", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_shockwave_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Staff(SRange); - if Button::image(self.imgs.fireball) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_bot_l[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Shockwave Range", - "Yeet things that used to be out of reach", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_staff_shockwave_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.fireball, + state.skills_bot_l[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Shockwave Range", + "Yeet things that used to be out of reach", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_staff_shockwave_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; @@ -2938,289 +2519,234 @@ impl<'a> Widget for Diary<'a> { // 3 0 4 // 8 2 7 let skill = Skill::Sceptre(BHeal); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Beam Heal", - "Increased healing from the beam", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_beam_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_l[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Beam Heal", + "Increased healing from the beam", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_beam_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(BDamage); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Damage", - "Increases damage", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_beam_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_l[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Damage", + "Increases damage", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_beam_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(BRegen); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Energy Regen", - "Increases energy regen from damage", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_beam_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_l[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Energy Regen", + "Increases energy regen from damage", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_beam_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(BRange); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Range", - "Longer beam", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_beam_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_l[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Range", + "Longer beam", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_beam_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(BLifesteal); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Lifesteal Efficiency", - "Thieve more health", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_beam_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_l[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Lifesteal Efficiency", + "Thieve more health", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_beam_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(BCost); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_l[5]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Heal Cost", - "Use less energy when healing", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_beam_5, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_l[5], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Heal Cost", + "Use less energy when healing", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_beam_5, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; // Top right skills let skill = Skill::Sceptre(PHeal); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[0]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Heal", - "Increases healing", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_bomb_0, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_r[0], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Heal", + "Increases healing", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_bomb_0, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(PDamage); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[1]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Damage", - "Increases damage", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_bomb_1, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_r[1], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Damage", + "Increases damage", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_bomb_1, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(PRadius); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[2]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Radius", - "Increases radius", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_bomb_2, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_r[2], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Radius", + "Increases radius", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_bomb_2, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(PCost); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[3]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Energy Cost", - "Decreases energy cost of bomb", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_bomb_3, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_r[3], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Energy Cost", + "Decreases energy cost of bomb", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_bomb_3, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; let skill = Skill::Sceptre(PProjSpeed); - if Button::image(self.imgs.heal_0) - .w_h(tweak!(74.0), tweak!(74.0)) - .middle_of(state.skills_top_r[4]) - .label(&format!( - "{}/{}", - skills.get(&skill).copied().map_or(0, |l| l.unwrap_or(1)), - skill.get_max_level().unwrap_or(1) - )) - .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) - .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(tweak!(16))) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( - self.tooltip_manager, - "Projectile Speed", - "Yeets it faster", - &diary_tooltip, - TEXT_COLOR, - ) - .set(state.skill_sceptre_bomb_4, ui) - .was_clicked() + if create_skill_button( + self.imgs.heal_0, + state.skills_top_r[4], + &self.stats.skill_set, + skill, + self.fonts, + &get_skill_label(skill, &self.stats.skill_set), + ) + .with_tooltip( + self.tooltip_manager, + "Projectile Speed", + "Yeets it faster", + &diary_tooltip, + TEXT_COLOR, + ) + .set(state.skill_sceptre_bomb_4, ui) + .was_clicked() { events.push(Event::UnlockSkill(skill)); }; @@ -3232,6 +2758,51 @@ 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(tweak!(74.0), tweak!(74.0)) + .middle_of(state) + .label(label) + .label_y(conrod_core::position::Relative::Scalar(tweak!(-28.0))) + .label_x(conrod_core::position::Relative::Scalar(tweak!(32.0))) + .label_color(if skill_set.sufficient_skill_points(skill) { + HP_COLOR + } else { + CRITICAL_HP_COLOR + }) + .label_color(TEXT_COLOR) + .label_font_size(fonts.cyri.scale(tweak!(16))) + .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, tweak!(0.7)) + }) +} + +fn get_skill_label(skill: Skill, skill_set: &skills::SkillSet) -> String { + if skill_set.prerequisites_met(skill) { + format!( + "{}/{}", + skill_set + .skills + .get(&skill) + .copied() + .map_or(0, |l| l.unwrap_or(1)), + skill.get_max_level().unwrap_or(1) + ) + } else { + "".to_string() + } +} + fn skill_tree_from_str(string: &str) -> Option { match string { "General Combat" => Some(SelectedSkillTree::General), diff --git a/voxygen/src/hud/hotbar.rs b/voxygen/src/hud/hotbar.rs index 1e29e25559..9f3f61a2ca 100644 --- a/voxygen/src/hud/hotbar.rs +++ b/voxygen/src/hud/hotbar.rs @@ -71,27 +71,47 @@ impl State { use specs::WorldExt; let inventories = client.state().ecs().read_storage::(); let inventory = inventories.get(client.entity()); - let should_be_present = if let Some(inventory) = inventory { + let stats = client.state().ecs().read_storage::(); + let stat = stats.get(client.entity()); + let should_be_present = if let (Some(inventory), Some(stat)) = (inventory, stat) { inventory .equipped(EquipSlot::Mainhand) .map(|i| i.kind()) .filter(|kind| { - use common::comp::item::{ - tool::{ToolKind, UniqueKind}, - ItemKind, + use common::comp::{ + item::{ + tool::{ToolKind, UniqueKind}, + ItemKind, + }, + skills::{self, Skill}, }; - if let ItemKind::Tool(kind) = kind { - matches!( - &kind.kind, - ToolKind::Staff - | ToolKind::Debug - | ToolKind::Sword - | ToolKind::Hammer - | ToolKind::Axe - | ToolKind::Bow - | ToolKind::Unique(UniqueKind::QuadMedQuick) - | ToolKind::Unique(UniqueKind::QuadLowBreathe) - ) + if let ItemKind::Tool(tool) = kind { + match tool.kind { + ToolKind::Sword => stat + .skill_set + .skills + .contains_key(&Skill::Sword(skills::SwordSkill::SUnlockSpin)), + ToolKind::Axe => stat + .skill_set + .skills + .contains_key(&Skill::Axe(skills::AxeSkill::LUnlockLeap)), + ToolKind::Hammer => stat + .skill_set + .skills + .contains_key(&Skill::Hammer(skills::HammerSkill::LUnlockLeap)), + ToolKind::Bow => stat + .skill_set + .skills + .contains_key(&Skill::Bow(skills::BowSkill::UnlockRepeater)), + ToolKind::Staff => stat + .skill_set + .skills + .contains_key(&Skill::Staff(skills::StaffSkill::UnlockShockwave)), + ToolKind::Debug + | ToolKind::Unique(UniqueKind::QuadMedQuick) + | ToolKind::Unique(UniqueKind::QuadLowBreathe) => true, + _ => false, + } } else { false } diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 0dc0070fb6..1ceae3c14f 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -147,6 +147,8 @@ image_ids! { group_icon_hover: "voxygen.element.buttons.group_hover", group_icon_press: "voxygen.element.buttons.group_press", + sp_indicator_arrow: "voxygen.element.buttons.arrow_down_gold", + // Skill Icons twohsword_m1: "voxygen.element.icons.2hsword_m1", twohsword_m2: "voxygen.element.icons.2hsword_m2", diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 6d17cca5f2..f27f8d51c4 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -1895,6 +1895,7 @@ impl Hud { tooltip_manager, i18n, &player_stats, + self.pulse, ) .set(self.ids.buttons, ui_widgets) { diff --git a/voxygen/src/menu/char_selection/ui/mod.rs b/voxygen/src/menu/char_selection/ui/mod.rs index b0e4a0d575..6871785bde 100644 --- a/voxygen/src/menu/char_selection/ui/mod.rs +++ b/voxygen/src/menu/char_selection/ui/mod.rs @@ -37,6 +37,8 @@ use iced::{ }; use vek::Rgba; +use inline_tweak::*; + pub const TEXT_COLOR: iced::Color = iced::Color::from_rgb(1.0, 1.0, 1.0); pub const DISABLED_TEXT_COLOR: iced::Color = iced::Color::from_rgba(1.0, 1.0, 1.0, 0.2); pub const TOOLTIP_BACK_COLOR: Rgba = Rgba::new(20, 18, 10, 255); @@ -444,7 +446,7 @@ impl Controls { select_button, Column::with_children(vec![ Text::new(&character.character.alias) - .size(fonts.cyri.scale(30)) + .size(fonts.cyri.scale(tweak!(26))) .into(), // TODO: only construct string once when characters // are