JD2022-TU1/main/phone_apps/JDCompanionApp/Assets/Scripts/Databases/CustomizableItemDatabase.cs

117 lines
4.5 KiB
C#

using System;
using System.Collections.Generic;
using LightJSON;
using UnityEngine;
namespace Databases
{
public sealed class CustomizableItemDatabase
{
public List<CustomizableItem> Database { get; private set; }
private static readonly CustomizableItemDatabase _instance = new CustomizableItemDatabase();
//This enum is coming from the console code and is used in server requests. Do not change the order or values!
//Add only with caution.
//This enum is referenced here: main\src\JD\gameplay\Managers\JD_CustomizableItemDatabase.h
public enum CustomizableItemSortBy
{
Id = 0,
Mojo,
None
};
private CustomizableItemDatabase()
{
Database = new List<CustomizableItem>();
}
public static CustomizableItemDatabase Instance
{
get
{
return _instance;
}
}
public void Setup(JSON database)
{
if (database != null)
{
JSON avatars = database.GetFieldAsObject("avatars");
LoadCustomizableItems(avatars.Children, CustomizableItem.CustomizableItemType.Avatar);
JSON skins = database.GetFieldAsObject("skins");
LoadCustomizableItems(skins.Children, CustomizableItem.CustomizableItemType.Skin);
}
}
public List<CustomizableItem> queryDatabase(CustomizableItem.CustomizableItemType type, int unlockType, int jDVersion)
{
var subset = Database.FindAll(x => x.ItemType == type
&& (x.JDVersion == jDVersion || jDVersion == -1) //-1 comes from the server and is used for INVALID_JDVERSION
&& (x.UnlockType == unlockType)); //if the jdVersion query parameter is invalid, do not test for matches on this parameter
return subset;
}
public string getImageURI(CustomizableItem.CustomizableItemType type, int itemId)
{
string imageURI = getDefaultImageURI(type);
CustomizableItem item = Database.Find(x => x.ItemType == type && x.CustomizableItemID == itemId);
if (item != null)
{
imageURI = item.ImageURI;
}
return imageURI;
}
private void LoadCustomizableItems(Dictionary<string, JSON> customizableItemMap, CustomizableItem.CustomizableItemType type)
{
foreach (KeyValuePair<string, JSON> mapItem in customizableItemMap)
{
int customizableId = Int32.Parse(mapItem.Key);
if (Database.Exists(x => x.ItemType == type && x.CustomizableItemID == customizableId))
{
Debug.LogErrorFormat("The item of type {1} and id {2} already exists in the Database ", type, customizableId);
}
else
{
CustomizableItem newItem = new CustomizableItem();
newItem.ItemType = type;
newItem.CustomizableItemID = customizableId;
newItem.ItemStatus = (CustomizableItem.CustomizableItemStatus)mapItem.Value.GetFieldAsNumber("status");
newItem.UnlockType = (int)mapItem.Value.GetFieldAsNumber("unlockType");
newItem.JDVersion = (int)mapItem.Value.GetFieldAsNumber("jdVersion");
newItem.MojoValue = (int)mapItem.Value.GetFieldAsNumber("mojoPrice");
newItem.ImageURI = mapItem.Value.GetFieldAsString("url");
Database.Add(newItem);
}
}
}
public string getDefaultImageURI(CustomizableItem.CustomizableItemType itemType)
{
string imageURI = string.Empty;
switch (itemType)
{
case CustomizableItem.CustomizableItemType.Avatar:
imageURI = "local://DancerProfile/avatar_loading";
break;
case CustomizableItem.CustomizableItemType.Skin:
imageURI = "";
break;
default:
Debug.AssertFormat(false, "[CustomizableItemDatabase.getDefaultImageURI] The current itemType {1} is not handled in the switch case.", itemType);
break;
}
return imageURI;
}
}
}