Make skillbar buttons account for energy cost reduction

Previously, the buttons would compare the current energy to the base
cost of the ability, so they would sometimes be grayed out while the
ability was usable. Now they ajust the ability with the character
skillset before getting the energy cost for the purposes of setting
the skillbar icon color.
This commit is contained in:
Ygor Souza 2021-04-23 08:56:11 +02:00
parent fef68ad2a1
commit 4f71c621f4
4 changed files with 29 additions and 6 deletions

View File

@ -96,6 +96,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Server now denies any running trades when a user exits to the character selection screen.
- Sfx volume changes now also change the ambient sounds volume
- Staff fire shockwave ability no longer has an unlimited vertical range
- Skillbar buttons correctly account for skill points when checking if player has enough stamina for the ability.
## [0.9.0] - 2021-03-20

View File

@ -2267,6 +2267,7 @@ impl Hud {
let healths = ecs.read_storage::<comp::Health>();
let inventories = ecs.read_storage::<comp::Inventory>();
let energies = ecs.read_storage::<comp::Energy>();
let skillsets = ecs.read_storage::<comp::SkillSet>();
let character_states = ecs.read_storage::<comp::CharacterState>();
let controllers = ecs.read_storage::<comp::Controller>();
let ability_map = ecs.fetch::<comp::item::tool::AbilityMap>();
@ -2289,12 +2290,14 @@ impl Hud {
Some(health),
Some(inventory),
Some(energy),
Some(skillset),
Some(_character_state),
Some(_controller),
) = (
healths.get(entity),
inventories.get(entity),
energies.get(entity),
skillsets.get(entity),
character_states.get(entity),
controllers.get(entity).map(|c| &c.inputs),
) {
@ -2308,6 +2311,7 @@ impl Hud {
&health,
&inventory,
&energy,
&skillset,
//&character_state,
self.pulse,
//&controller,

View File

@ -26,7 +26,7 @@ use common::comp::{
tool::{AbilityMap, Tool, ToolKind},
Hands, Item, ItemKind, MaterialStatManifest,
},
Energy, Health, Inventory,
Energy, Health, Inventory, SkillSet,
};
use conrod_core::{
color,
@ -142,6 +142,7 @@ pub struct Skillbar<'a> {
health: &'a Health,
inventory: &'a Inventory,
energy: &'a Energy,
skillset: &'a SkillSet,
// character_state: &'a CharacterState,
// controller: &'a ControllerInputs,
hotbar: &'a hotbar::State,
@ -169,6 +170,7 @@ impl<'a> Skillbar<'a> {
health: &'a Health,
inventory: &'a Inventory,
energy: &'a Energy,
skillset: &'a SkillSet,
// character_state: &'a CharacterState,
pulse: f32,
// controller: &'a ControllerInputs,
@ -191,6 +193,7 @@ impl<'a> Skillbar<'a> {
health,
inventory,
energy,
skillset,
common: widget::CommonBuilder::default(),
// character_state,
pulse,
@ -449,6 +452,7 @@ impl<'a> Widget for Skillbar<'a> {
self.hotbar,
self.inventory,
self.energy,
self.skillset,
self.ability_map,
self.msm,
); // TODO: avoid this
@ -739,6 +743,7 @@ impl<'a> Widget for Skillbar<'a> {
>= tool
.get_abilities(&self.msm, item.components(), self.ability_map)
.secondary
.adjusted_by_skills(self.skillset, Some(tool.kind))
.get_energy_cost()
{
Color::Rgba(1.0, 1.0, 1.0, 1.0)

View File

@ -10,7 +10,7 @@ use common::comp::{
ItemKind, MaterialStatManifest,
},
slot::InvSlotId,
Energy, Inventory,
Energy, Inventory, SkillSet,
};
use conrod_core::{image, Color};
use specs::Entity as EcsEntity;
@ -126,6 +126,7 @@ type HotbarSource<'a> = (
&'a hotbar::State,
&'a Inventory,
&'a Energy,
&'a SkillSet,
&'a AbilityMap,
&'a MaterialStatManifest,
);
@ -136,7 +137,7 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
fn image_key(
&self,
(hotbar, inventory, energy, ability_map, msm): &HotbarSource<'a>,
(hotbar, inventory, energy, skillset, ability_map, msm): &HotbarSource<'a>,
) -> Option<(Self::ImageKey, Option<Color>)> {
hotbar.get(*self).and_then(|contents| match contents {
hotbar::SlotContents::Inventory(idx) => inventory
@ -173,7 +174,13 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
.abilities
.get(0)
{
if energy.current() >= skill.1.get_energy_cost() {
if energy.current()
>= skill
.1
.clone()
.adjusted_by_skills(skillset, Some(tool.kind))
.get_energy_cost()
{
Some(Color::Rgba(1.0, 1.0, 1.0, 1.0))
} else {
Some(Color::Rgba(0.3, 0.3, 0.3, 0.8))
@ -217,7 +224,13 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
.abilities
.get(skill_index)
{
if energy.current() >= skill.1.get_energy_cost() {
if energy.current()
>= skill
.1
.clone()
.adjusted_by_skills(skillset, Some(tool.kind))
.get_energy_cost()
{
Some(Color::Rgba(1.0, 1.0, 1.0, 1.0))
} else {
Some(Color::Rgba(0.3, 0.3, 0.3, 0.8))
@ -232,7 +245,7 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
})
}
fn amount(&self, (hotbar, inventory, _, _, _): &HotbarSource<'a>) -> Option<u32> {
fn amount(&self, (hotbar, inventory, _, _, _, _): &HotbarSource<'a>) -> Option<u32> {
hotbar
.get(*self)
.and_then(|content| match content {