using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace TcgEngine
{
///
/// Generic static functions for TcgEngine
///
public static class GameTool
{
private const string uid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static System.Random random = new System.Random();
//Generate a random string to use as UID
public static string GenerateRandomID(int min = 9, int max = 15)
{
int length = random.Next(min, max);
string unique_id = "";
for (int i = 0; i < length; i++)
{
unique_id += uid_chars[random.Next(uid_chars.Length - 1)];
}
return unique_id;
}
//Generate a random int
public static int GenerateRandomInt()
{
return random.Next(int.MinValue, int.MaxValue);
}
//Generate a random ulong
public static ulong GenerateRandomUInt64()
{
ulong id = (uint)random.Next(int.MinValue, int.MaxValue); //Cast to uint before casting to ulong
uint bid = (uint)random.Next(int.MinValue, int.MaxValue);
id = id << 32;
id = id | bid;
return id;
}
//Pick X random elements in a list (same cant be picked twice, unless it appears twice or more in the list)
public static List PickXRandom(List source, List dest, int x)
{
if (source.Count <= x || x <= 0)
return source; //No need to pick anything
if (dest.Count > 0)
dest.Clear();
for (int i = 0; i < x; i++)
{
int r = random.Next(source.Count);
dest.Add(source[r]);
source.RemoveAt(r);
}
return dest;
}
//Clone a list of string in most optimized way (avoiding as many Add/Remove as possible)
public static void CloneList(List source, List dest)
{
for (int i = 0; i < source.Count; i++)
{
if (i < dest.Count)
dest[i] = source[i];
else
dest.Add(source[i]);
}
if (dest.Count > source.Count)
dest.RemoveRange(source.Count, dest.Count - source.Count);
}
//Clone a list in most optimized way, only the list is cloned, elements references are preserved
public static void CloneListRef(List source, List dest) where T : class
{
for (int i = 0; i < source.Count; i++)
{
if (i < dest.Count)
dest[i] = source[i];
else
dest.Add(source[i]);
}
if (dest.Count > source.Count)
dest.RemoveRange(source.Count, dest.Count - source.Count);
}
//Same a previous function, but elements could be null
public static void CloneListRefNull(List source, ref List dest) where T : class
{
//Source is null, set destination null
if (source == null)
{
dest = null;
return;
}
//Dest is null
if (dest == null)
dest = new List();
//Both arent null, clone
CloneListRef(source, dest);
}
//Check if current device is mobile device
public static bool IsMobile()
{
#if UNITY_ANDROID || UNITY_IOS || UNITY_TIZEN
return true;
#else
return UnityEngine.Device.Application.isMobilePlatform;
#endif
}
//Check if using Universal Render Pipeline
//If this function return compile error (because URP isnt installed and you dont want it, you can simply comment the code and return false
public static bool IsURP()
{
if (GraphicsSettings.renderPipelineAsset is UniversalRenderPipelineAsset)
return true;
return false;
}
}
}