PkmnLib.NET/PkmnLib.Static/Item.cs

150 lines
3.4 KiB
C#

using System.Collections.Immutable;
using PkmnLib.Static.Utils;
namespace PkmnLib.Static;
/// <summary>
/// An item category defines which bag slot items are stored in.
/// </summary>
public enum ItemCategory
{
/// <summary>
/// This is where most items should go.
/// </summary>
MiscItem,
/// <summary>
/// Pokeballs are used for capturing Pokémons.
/// </summary>
Pokeball,
/// <summary>
/// Medicine is used for healing HP, PP, and status effects.
/// </summary>
Medicine,
/// <summary>
/// Berry is used for all berries.
/// </summary>
Berry,
/// <summary>
/// TMHM is used for Technical and Hidden Machines.
/// </summary>
TmHm,
/// <summary>
/// Form Changer is used for items that change forms, such as mega stones.
/// </summary>
FormChanger,
/// <summary>
/// Key Items are single stored items, generally used for story progression.
/// </summary>
KeyItem,
/// <summary>
/// Mail is used for mail items.
/// </summary>
Mail,
}
/// <summary>
/// A battle item category defines how the item is categorized when in battle.
/// </summary>
public enum BattleItemCategory
{
/// <summary>
/// This item can't be used in battle.
/// </summary>
None,
/// <summary>
/// This item is used for healing Pokémon.
/// </summary>
Healing,
/// <summary>
/// This item is used for healing Pokémon from a status.
/// </summary>
StatusHealing,
/// <summary>
/// This item is used for capturing Pokémon.
/// </summary>
Pokeball,
/// <summary>
/// This item does not belong in above categories, but is still a battle item.
/// </summary>
MiscBattleItem,
}
/// <summary>
/// An item is an object which the player can pick up, keep in their Bag, and use in some manner.
/// </summary>
public interface IItem : INamedValue
{
/// <summary>
/// Which bag slot items are stored in.
/// </summary>
ItemCategory Category { get; }
/// <summary>
/// How the item is categorized when in battle.
/// </summary>
BattleItemCategory BattleCategory { get; }
/// <summary>
/// The buying value of the item.
/// </summary>
int Price { get; }
/// <summary>
/// A set of arbitrary flags that can be set on the item.
/// </summary>
ImmutableHashSet<StringKey> Flags { get; }
/// <summary>
/// Checks whether the item has a specific flag.
/// </summary>
/// <param name="key">The flag to check for.</param>
/// <returns>True if the item has the flag, false otherwise.</returns>
bool HasFlag(string key);
}
/// <inheritdoc />
public class ItemImpl : IItem
{
/// <inheritdoc cref="ItemImpl"/>
public ItemImpl(StringKey name, ItemCategory category, BattleItemCategory battleCategory, int price,
IEnumerable<StringKey> flags)
{
Name = name;
Category = category;
BattleCategory = battleCategory;
Price = price;
Flags = [..flags];
}
/// <inheritdoc />
public StringKey Name { get; }
/// <inheritdoc />
public ItemCategory Category { get; }
/// <inheritdoc />
public BattleItemCategory BattleCategory { get; }
/// <inheritdoc />
public int Price { get; }
/// <inheritdoc />
public ImmutableHashSet<StringKey> Flags { get; }
/// <inheritdoc />
public bool HasFlag(string key)
{
return Flags.Contains(key);
}
}