Files
przygody-pana-cegly/scripts/components/SkillUnlockerComponent.cs

73 lines
2.1 KiB
C#

using Godot;
using Godot.Collections;
using Mr.BrickAdventures.Autoloads;
using Mr.BrickAdventures.scripts.interfaces;
using Mr.BrickAdventures.scripts.Resources;
namespace Mr.BrickAdventures.scripts.components;
[GlobalClass]
public partial class SkillUnlockerComponent : Node
{
public SkillManager SkillManager { get; private set; }
[Signal]
public delegate void SkillUnlockedEventHandler(SkillData skill);
private GameStateStore Store => GameStateStore.Instance;
public override void _Ready()
{
SkillManager = SkillManager.Instance;
}
private bool HasEnoughCoins(int amount) => (Store?.GetTotalCoins() ?? 0) >= amount;
public bool TryUnlockSkill(SkillData skill)
{
if (Store == null) return false;
if (Store.IsSkillUnlocked(skill)) return false;
if (!HasEnoughCoins(skill.Upgrades[0].Cost)) return false;
skill.Level = 1;
Store.RemoveCoins(skill.Upgrades[0].Cost);
Store.UnlockSkillInSession(skill);
SkillManager.AddSkill(skill);
EmitSignalSkillUnlocked(skill);
return true;
}
public void UnlockAllSkills()
{
var availableSkills = SkillManager.AvailableSkills;
foreach (var skill in availableSkills)
{
Store?.UnlockSkillPermanently(skill);
EmitSignalSkillUnlocked(skill);
}
SkillManager.ApplyUnlockedSkills();
}
public bool TryUpgradeSkill(SkillData skill)
{
if (Store == null) return false;
if (!Store.IsSkillUnlocked(skill)) return false;
if (skill.Level >= skill.MaxLevel) return false;
if (!HasEnoughCoins(skill.Upgrades[skill.Level].Cost)) return false;
Store.RemoveCoins(skill.Upgrades[skill.Level].Cost);
skill.Level++;
if (SkillManager.ActiveComponents.TryGetValue(skill.Name, out Variant componentVariant))
{
var component = componentVariant.AsGodotObject();
if (component is ISkill skillInstance)
skillInstance.ApplyUpgrade(skill.Upgrades[skill.Level - 1]);
}
EmitSignalSkillUnlocked(skill);
return true;
}
}