Commit 5ec93fca authored by hex's avatar hex

Add in-app game data reload and manager reset support

parent 2a4c8eae
......@@ -56,6 +56,9 @@ public class Menu : WindowServantSP
base.show();
Program.charge();
// 如有资源更新完成,回到主菜单后自动重载数据(无需重启 App)
Program.I().ApplyPendingReloadGameDatabases();
// 自动检查超先行卡更新
if (!_isCheckingUpdate && !isPreDownloading)
{
......@@ -679,7 +682,17 @@ public class Menu : WindowServantSP
{
byte[] ypkData = File.ReadAllBytes(ypkFilePathInDownloads);
Program.I().ExtractZipFile(ypkData, expansionsDir);
Program.PrintToChat("更新成功!请【重启游戏】以使改动完全生效。");
Program.PrintToChat("超先行卡包安装完成,正在重载数据...");
Program.I().RequestReloadGameDatabases();
if (isShowed)
{
Program.I().ApplyPendingReloadGameDatabases();
}
else
{
Program.PrintToChat("更新成功!请返回主菜单以自动生效(无需重启)。");
}
}
catch (Exception e)
{
......@@ -785,7 +798,16 @@ public class Menu : WindowServantSP
// 同步操作,如果失败会抛出异常
Program.I().ExtractZipFile(ypkData, expansionsDir);
Program.PrintToChat("更新成功!请【重启游戏】以使改动完全生效。");
Program.PrintToChat("超先行卡包安装完成,正在重载数据...");
Program.I().RequestReloadGameDatabases();
if (isShowed)
{
Program.I().ApplyPendingReloadGameDatabases();
}
else
{
Program.PrintToChat("更新成功!请返回主菜单以自动生效(无需重启)。");
}
}
else
{
......
......@@ -584,6 +584,101 @@ public class Program : MonoBehaviour
return false;
}
private bool _pendingReloadGameDatabases = false;
public void RequestReloadGameDatabases()
{
_pendingReloadGameDatabases = true;
}
public bool ApplyPendingReloadGameDatabases()
{
if (!_pendingReloadGameDatabases)
{
return false;
}
_pendingReloadGameDatabases = false;
return ReloadGameDatabases();
}
public bool ReloadGameDatabases()
{
PrintToChat(InterString.Get("正在重新加载本地数据..."));
try
{
GameStringManager.Reset();
YGOSharp.CardsManager.Reset();
YGOSharp.PacksManager.Reset();
YGOSharp.BanlistManager.Reset();
bool cardsLoaded = LoadDatabaseFile(
"cards.cdb",
(path) => YGOSharp.CardsManager.initialize(path)
);
bool stringsLoaded = LoadDatabaseFile(
"strings.conf",
(path) => GameStringManager.initialize(path)
);
if (File.Exists("expansions/lflist.conf"))
{
YGOSharp.BanlistManager.initialize("expansions/lflist.conf");
}
else
{
LoadDatabaseFile(
"lflist.conf",
(path) => YGOSharp.BanlistManager.initialize(path)
);
}
YGOSharp.BanlistManager.initializeComplete();
if (File.Exists("expansions/strings.conf"))
{
GameStringManager.initialize("expansions/strings.conf");
}
if (Directory.Exists("expansions"))
{
FileInfo[] fileInfos = (new DirectoryInfo("expansions"))
.GetFiles("*.cdb")
.OrderByDescending(x => x.Name)
.ToArray();
foreach (var fileInfo in fileInfos)
{
YGOSharp.CardsManager.initialize(fileInfo.FullName, false, true);
}
}
YGOSharp.CardsManager.updateSetNames();
if (Directory.Exists("pack"))
{
FileInfo[] fileInfos = (new DirectoryInfo("pack")).GetFiles("*.db");
foreach (var fileInfo in fileInfos)
{
YGOSharp.PacksManager.initialize(fileInfo.FullName);
}
YGOSharp.PacksManager.initializeSec();
}
if (!cardsLoaded || !stringsLoaded)
{
PrintToChat(InterString.Get("本地数据部分重载失败,建议【重启游戏】以确保完整生效。"));
return false;
}
PrintToChat(InterString.Get("本地数据已重新加载,无需重启。"));
return true;
}
catch (Exception e)
{
DEBUGLOG(e);
PrintToChat(InterString.Get("本地数据重载失败,请【重启游戏】后重试。"));
return false;
}
}
// [修改] 使用 UnityFileDownloader 完全重写后台更新协程
private IEnumerator UpdateClientCoroutine()
{
......
......@@ -15,6 +15,12 @@ public static class GameStringManager
public static List<hashedString> xilies = new List<hashedString>();
public static void Reset()
{
hashedStrings.Clear();
xilies.Clear();
}
public static int helper_stringToInt(string str)
{
int return_value = 0;
......
......@@ -95,7 +95,7 @@ public class SelectServer : WindowServantSP
}
case "[OCG]EXP":
{
UIHelper.getByName<UIInput>(gameObject, "ip_").value = "exp.baldlee.top";
UIHelper.getByName<UIInput>(gameObject, "ip_").value = "e.ygo.pro";
UIHelper.getByName<UIInput>(gameObject, "port_").value = "23333";
Config.Set("serversPicker", "[OCG]EXP");
......
......@@ -8,6 +8,11 @@ namespace YGOSharp
{
public static List<Banlist> Banlists { get; private set; }
public static void Reset()
{
Banlists = new List<Banlist>();
}
public static bool initialize(string fileName, bool test = false)
{
List<Banlist> new_list = new List<Banlist>();
......
......@@ -10,12 +10,22 @@ namespace YGOSharp
{
internal static class CardsManager
{
private static readonly object _lock = new object();
private static IDictionary<int, Card> _cards = new Dictionary<int, Card>();
public static string nullName = "";
public static string nullString = "";
internal static void Reset()
{
lock (_lock)
{
_cards = new Dictionary<int, Card>();
}
}
internal static bool initialize(
string databaseFullPath,
bool test = false,
......@@ -35,6 +45,8 @@ namespace YGOSharp
nullString += "\r\n\r\n";
nullString += "喜欢游戏王DIY的朋友欢迎来222服QQ群642043095";
}
lock (_lock)
{
bool success = true;
try
{
......@@ -63,26 +75,33 @@ namespace YGOSharp
}
}
}
catch (System.Exception e)
catch (System.Exception)
{
success = false;
}
return success;
}
}
internal static Card GetCard(int id)
{
lock (_lock)
{
if (_cards.ContainsKey(id))
return _cards[id].clone();
return null;
}
}
internal static Card GetCardRaw(int id)
{
lock (_lock)
{
if (_cards.ContainsKey(id))
return _cards[id];
return null;
}
}
internal static Card Get(int id)
{
......@@ -124,6 +143,8 @@ namespace YGOSharp
}
internal static void updateSetNames()
{
lock (_lock)
{
foreach (var item in _cards)
{
......@@ -131,6 +152,7 @@ namespace YGOSharp
card.strSetName = GameStringHelper.getSetName(card.Setcode);
}
}
}
internal static List<Card> searchAdvanced(
string getName,
......@@ -156,6 +178,8 @@ namespace YGOSharp
)
{
List<Card> returnValue = new List<Card>();
lock (_lock)
{
foreach (var item in _cards)
{
Card card = item.Value;
......@@ -202,7 +226,9 @@ namespace YGOSharp
{
if (judgeint(getAttack, getAttack_UP, card.Attack))
{
if (judgeint(getDefence, getDefence_UP, card.Defense))
if (
judgeint(getDefence, getDefence_UP, card.Defense)
)
{
if (judgeint(getLevel, getLevel_UP, card.Level))
{
......@@ -246,6 +272,7 @@ namespace YGOSharp
}
}
}
}
nameInSearch = getName;
returnValue.Sort(comparisonOfCard());
nameInSearch = "";
......@@ -279,6 +306,8 @@ namespace YGOSharp
internal static List<Card> search(string getName, List<int> getsearchCode)
{
List<Card> returnValue = new List<Card>();
lock (_lock)
{
foreach (var item in _cards)
{
Card card = item.Value;
......@@ -287,8 +316,12 @@ namespace YGOSharp
|| Regex.Replace(card.Name, getName, "miaowu", RegexOptions.IgnoreCase)
!= card.Name
//|| Regex.Replace(card.Desc, getName, "miaowu", RegexOptions.IgnoreCase) != card.Desc
|| Regex.Replace(card.strSetName, getName, "miaowu", RegexOptions.IgnoreCase)
!= card.strSetName
|| Regex.Replace(
card.strSetName,
getName,
"miaowu",
RegexOptions.IgnoreCase
) != card.strSetName
|| card.Id.ToString() == getName
)
{
......@@ -298,6 +331,7 @@ namespace YGOSharp
}
}
}
}
nameInSearch = getName;
returnValue.Sort(comparisonOfCard());
nameInSearch = "";
......@@ -619,6 +653,12 @@ namespace YGOSharp
static Dictionary<string, string> pacDic = new Dictionary<string, string>();
internal static void Reset()
{
packs.Clear();
pacDic.Clear();
}
internal static void initialize(string databaseFullPath)
{
using (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment