using System.Collections.Generic;
using UnityEngine;
namespace HQFPSWeapons
{
///
/// Represents an asset that stores all the user-defined items.
///
[CreateAssetMenu(menuName = "HQ FPS Weapons Pack/Item Database")]
public class ItemDatabase : ScriptableObject
{
public static ItemDatabase Default
{
get
{
if(m_Default == null)
{
var allDatabases = Resources.LoadAll("");
if(allDatabases != null && allDatabases.Length > 0)
m_Default = allDatabases[0];
}
return m_Default;
}
}
private static ItemDatabase m_Default;
public ItemCategory[] Categories { get { return m_Categories; } }
[SerializeField]
private ItemCategory[] m_Categories = null;
[SerializeField]
private ItemProperty.Definition[] m_ItemProperties = null;
private Dictionary m_Items = new Dictionary();
public ItemData GetItemData(string name)
{
ItemData itemData;
if(m_Items.TryGetValue(name, out itemData))
return itemData;
else
return null;
}
public bool TryGetItem(string name, out ItemData itemData)
{
return m_Items.TryGetValue(name, out itemData);
}
public List GetAllItemNames()
{
List names = new List();
for(int i = 0;i < m_Categories.Length;i ++)
{
var category = m_Categories[i];
for(int j = 0;j < category.Items.Length;j ++)
names.Add(category.Items[j].Name);
}
return names;
}
public List GetAllItemNamesFull()
{
List names = new List();
for(int i = 0;i < m_Categories.Length;i ++)
{
var category = m_Categories[i];
for(int j = 0;j < category.Items.Length;j ++)
names.Add(m_Categories[i].Name + "/" + category.Items[j].Name);
}
return names;
}
public List GetAllCategoryNames()
{
List names = new List();
for(int i = 0;i < m_Categories.Length;i ++)
names.Add(m_Categories[i].Name);
return names;
}
public string[] GetAllPropertyNames()
{
string[] names = new string[m_ItemProperties.Length];
for(int i = 0;i < m_ItemProperties.Length;i ++)
names[i] = m_ItemProperties[i].Name;
return names;
}
public ItemProperty.Definition GetPropertyByName(string name)
{
for(int i = 0;i < m_ItemProperties.Length;i ++)
if(m_ItemProperties[i].Name == name)
return m_ItemProperties[i];
return default(ItemProperty.Definition);
}
public ItemProperty.Definition GetPropertyAtIndex(int index)
{
if(index >= m_ItemProperties.Length)
return default(ItemProperty.Definition);
else
return m_ItemProperties[index];
}
public ItemCategory GetCategoryByName(string name)
{
for(int i = 0;i < m_Categories.Length;i ++)
if(m_Categories[i].Name == name)
return m_Categories[i];
return null;
}
public ItemCategory GetRandomCategory()
{
return m_Categories[Random.Range(0, m_Categories.Length)];
}
public int GetItemCount()
{
int count = 0;
for(int c = 0;c < m_Categories.Length;c ++)
count += m_Categories[c].Items.Length;
return count;
}
private void OnEnable()
{
GenerateDictionaries();
}
private void OnValidate()
{
foreach (var category in m_Categories)
{
for (int j = 0; j < category.Items.Length; j++)
{
category.Items[j].Category = category.Name;
}
}
GenerateDictionaries();
}
private void GenerateDictionaries()
{
m_Items = new Dictionary();
for(int c = 0;c < m_Categories.Length;c ++)
{
var category = m_Categories[c];
for(int i = 0;i < category.Items.Length;i ++)
{
var item = category.Items[i];
if(!m_Items.ContainsKey(item.Name))
{
m_Items.Add(item.Name, item);
}
}
}
}
}
}