diff --git a/.gitignore b/.gitignore index e9b160c2..e5bbec84 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ /AxibugEmuOnline.Client/ProjectSettings/AutoStreamingSettings.asset /AxibugEmuOnline.Client/Logs +/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/*.keys +/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/*.keys.meta + /virtuanessrc097-master /AxibugEmuOnline.Server/config.cfg /AxibugEmuOnline.Server/bin/ diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack.meta new file mode 100644 index 00000000..7182dbd8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 611bc182f939ea147a72b08613e2d2ba +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors.meta new file mode 100644 index 00000000..88093e68 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cbe37300d75dbd641be2e6dca83a913c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs new file mode 100644 index 00000000..c9e192f0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs @@ -0,0 +1,329 @@ +#if UNITY_EDITOR_WIN +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEngine; + +namespace AxibugEmuOnline.Editors +{ + public class AxibugNSPTools : Editor + { + static string WorkRoot = Path.GetFullPath(Path.Combine(Application.dataPath, "AxiProjectTools/AxiNSPack")); + static string switch_keys = Path.GetFullPath(Path.Combine(Application.dataPath, "AxiProjectTools/AxiNSPack/switch_keys")); + static string hacpack_root = Path.GetFullPath(Path.Combine(Application.dataPath, "AxiProjectTools/AxiNSPack/hacpack")); + static Dictionary<string, string> tools = new Dictionary<string, string>(); + static string prodKeysPath; + + [MenuItem("Axibug��ֲ����/Switch/AxibugNSPTools/RepackNSP(�����¹���NPS��")] + static void RepackNSP() + { + if (!CheckEnvironmentVariable()) + return; + + string path = EditorUtility.OpenFilePanel( + title: "ѡ�� .nsp �ļ�", + directory: Path.Combine(Application.dataPath, ".."), // Ĭ��·��Ϊ��Ŀ Assets Ŀ¼ + extension: "nsp" // �����ļ�����Ϊ .nsp + ); + + if (string.IsNullOrEmpty(path)) + return; + + RepackNSP(path); + } + + [MenuItem("Axibug��ֲ����/Switch/AxibugNSPTools/Build With RepackNSP(���NSP�����¹���NPS��")] + public static void BuildWithRepackNSP() + { + if (!CheckEnvironmentVariable()) + return; + + if (!EditorUtility.DisplayDialog("���", $"ȷ�ϴ��NSP?", "����", "ȡ��")) + return; + + var levels = new List<string>(); + foreach (var scene in EditorBuildSettings.scenes) + { + if (scene.enabled) + levels.Add(scene.path); + } + + var buildOpt = EditorUserBuildSettings.development ? BuildOptions.Development : BuildOptions.None; + if (EditorUserBuildSettings.buildWithDeepProfilingSupport) + buildOpt |= BuildOptions.EnableDeepProfilingSupport; + if (EditorUserBuildSettings.allowDebugging) + buildOpt |= BuildOptions.AllowDebugging; + + //��ѡ����NSP�� + EditorUserBuildSettings.switchCreateRomFile = true; + +#if UNITY_2018_1_OR_NEWER && !UNITY_6000_0_OR_NEWER + string titleid = PlayerSettings.Switch.applicationID; +#else + string titleid = "null"; +#endif + string targetName = $"{Application.productName}_{titleid}.nsp"; + + string _locationPathName = $"Output/NSPBuild/{targetName}"; + var options = new BuildPlayerOptions + { + scenes = levels.ToArray(), + locationPathName = _locationPathName, + target = BuildTarget.Switch, + options = buildOpt + }; + + try + { + BuildReport report = BuildPipeline.BuildPlayer(options); + } + catch(Exception ex) + { + Debug.LogError($"[AxibugNSPTools] Unity Build NSP ����:{ex.ToString()}"); + return; + } + + string NSPFullPath = Path.GetFullPath(Path.Combine(Application.dataPath, "..", _locationPathName)); + RepackNSP(NSPFullPath); + } + + static bool CheckEnvironmentVariable() + { + // ��ȡ������������Ҫ���ӻ���������飩 + string sdkRoot = Environment.GetEnvironmentVariable("NINTENDO_SDK_ROOT"); + if (string.IsNullOrEmpty(sdkRoot)) + { + Debug.LogError($"[AxibugNSPTools]������ȷ���û�������:NINTENDO_SDK_ROOT,(�������ã���֤���ú�����Unity Hub��Unity)"); + return false; + } + + #region ��ȡprod.keys�ļ�·�� + prodKeysPath = Path.Combine( + switch_keys, + "prod.keys" + ); + + if (!File.Exists(prodKeysPath)) + { + Debug.LogError($"[AxibugNSPTools]δ�ҵ� prod.keys! �������ļ���path:{prodKeysPath}"); + return false; + } + #endregion + + return true; + } + + static void RepackNSP(string nspFile) + { + #region ��ʼ������·�� + // ��ȡ������������Ҫ���ӻ���������飩 + string sdkRoot = Environment.GetEnvironmentVariable("NINTENDO_SDK_ROOT"); + tools["authoringTool"] = Path.Combine(sdkRoot, "Tools/CommandLineTools/AuthoringTool/AuthoringTool.exe"); + tools["hacPack"] = Path.Combine(hacpack_root, "hacpack"); + #endregion + + #region ����NSP�ļ�·�� + string nspFilePath = nspFile; + string nspFileName = Path.GetFileName(nspFilePath); + string nspParentDir = Path.GetDirectoryName(nspFilePath); + #endregion + + #region ��ȡTitle ID + string titleID = ExtractTitleID(nspFilePath); + if (string.IsNullOrEmpty(titleID)) + { + Debug.LogError($"[AxibugNSPTools]NSP�ļ���һ���֣��������TitleID"); + return; + } + Debug.Log($"[AxibugNSPTools]Using Title ID: {titleID}"); + #endregion + + EditorUtility.DisplayProgressBar("AxibugNSPTools", $"������ʱĿ¼", 0); + #region ������ʱĿ¼ + CleanDirectory(Path.Combine(nspParentDir, "repacker_extract")); + CleanDirectory(Path.Combine(Path.GetTempPath(), "NCA")); + CleanDirectory(Path.Combine(WorkRoot, "hacpack_backup")); + #endregion + + EditorUtility.DisplayProgressBar("AxibugNSPTools", $"���NSP�ļ�", 0.2f); + #region ���NSP�ļ� + string extractPath = Path.Combine(nspParentDir, "repacker_extract"); + ExecuteCommand($"{tools["authoringTool"]} extract -o \"{extractPath}\" \"{nspFilePath}\""); + + string controlPath = null; + string programPath = null; + FindNACPAndNPDPaths(extractPath, ref controlPath, ref programPath); + if (controlPath == null || programPath == null) + { + Debug.LogError("[AxibugNSPTools] Critical directory structure not found!"); + return; + } + #endregion + + #region �ؽ�NCA/NSP + string tmpPath = Path.Combine(Path.GetTempPath(), "NCA"); + EditorUtility.DisplayProgressBar("AxibugNSPTools", $"�ؽ�NCA", 0.6f); + string programNCA = BuildProgramNCA(tmpPath, titleID, programPath); + EditorUtility.DisplayProgressBar("AxibugNSPTools", $"�ؽ�NCA", 0.7f); + string controlNCA = BuildControlNCA(tmpPath, titleID, controlPath); + EditorUtility.DisplayProgressBar("AxibugNSPTools", $"�ؽ�NCA", 0.8f); + BuildMetaNCA(tmpPath, titleID, programNCA, controlNCA); + EditorUtility.DisplayProgressBar("AxibugNSPTools", $"�ؽ�NSP", 0.9f); + string outputNSP = BuildFinalNSP(nspFilePath, nspParentDir, tmpPath, titleID); + EditorUtility.DisplayProgressBar("AxibugNSPTools", $"�ؽ�NSP", 1f); + Debug.Log($"[AxibugNSPTools]Repacking completed: {outputNSP}"); + EditorUtility.ClearProgressBar(); + #endregion + } + + #region �������� + static string GetUserInput() + { + Console.Write("Enter the NSP filepath: "); + return Console.ReadLine(); + } + + static string ExtractTitleID(string path) + { + var match = Regex.Match(path, @"0100[\dA-Fa-f]{12}"); + return match.Success ? match.Value : null; + } + + + static void CleanDirectory(string path) + { + if (Directory.Exists(path)) + { + Directory.Delete(path, true); + while (Directory.Exists(path)) ; // �ȴ�ɾ����� + } + } + + static void FindNACPAndNPDPaths(string basePath, ref string controlPath, ref string programPath) + { + foreach (var dir in Directory.GetDirectories(basePath)) + { + if (File.Exists(Path.Combine(dir, "fs0/control.nacp"))) + controlPath = dir; + if (File.Exists(Path.Combine(dir, "fs0/main.npdm"))) + programPath = dir; + } + } + + static string ExecuteCommand(string command) + { + var process = new System.Diagnostics.Process() + { + StartInfo = new System.Diagnostics.ProcessStartInfo + { + FileName = "cmd.exe", + Arguments = $"/C {command}", + RedirectStandardOutput = true, + RedirectStandardError = true, // ���Ӵ������ض��� + UseShellExecute = false, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, // ��ȷָ������ + StandardErrorEncoding = Encoding.UTF8 + } + }; + + var outputBuilder = new StringBuilder(); + var errorBuilder = new StringBuilder(); + + // ʹ���¼���������ʵʱ��� + process.OutputDataReceived += (sender, args) => + { + if (!string.IsNullOrEmpty(args.Data)) + { + outputBuilder.AppendLine(args.Data); + Debug.Log($"[AxibugNSPTools]{args.Data}"); + } + }; + + process.ErrorDataReceived += (sender, args) => + { + if (!string.IsNullOrEmpty(args.Data)) + { + errorBuilder.AppendLine(args.Data); + Debug.LogError($"[AxibugNSPTools]{args.Data}"); + } + }; + + process.Start(); + + // ��ʼ�첽��ȡ��� + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + // �ȴ������˳�����ʱ���ѹرգ� + process.WaitForExit(); + + // ��������Ϣ���ӵ������ + if (errorBuilder.Length > 0) + { + outputBuilder.AppendLine("\nError Output:"); + outputBuilder.Append(errorBuilder); + } + + return outputBuilder.ToString(); + } + #endregion + + #region NCA������ + static string BuildProgramNCA(string tmpPath, string titleID, string programDir) + { + string args = $"-k \"{prodKeysPath}\" -o \"{tmpPath}\" --titleid {titleID} " + + $"--type nca --ncatype program --exefsdir \"{programDir}/fs0\" " + + $"--romfsdir \"{programDir}/fs1\" --logodir \"{programDir}/fs2\""; + + string output = ExecuteCommand($"{tools["hacPack"]} {args}"); + return ParseNCAOutput(output, "Program"); + } + + static string BuildControlNCA(string tmpPath, string titleID, string controlDir) + { + string args = $"-k \"{prodKeysPath}\" -o \"{tmpPath}\" --titleid {titleID} " + + $"--type nca --ncatype control --romfsdir \"{controlDir}/fs0\""; + + string output = ExecuteCommand($"{tools["hacPack"]} {args}"); + + return ParseNCAOutput(output, "Control"); + } + + static void BuildMetaNCA(string tmpPath, string titleID, string programNCA, string controlNCA) + { + string args = $"-k \"{prodKeysPath}\" -o \"{tmpPath}\" --titleid {titleID} " + + $"--type nca --ncatype meta --titletype application " + + $"--programnca \"{programNCA}\" --controlnca \"{controlNCA}\""; + + ExecuteCommand($"{tools["hacPack"]} {args}"); + } + + static string BuildFinalNSP(string origPath, string parentDir, string tmpPath, string titleID) + { + string outputPath = origPath.Replace(".nsp", "_repacked.nsp"); + if (File.Exists(outputPath)) File.Delete(outputPath); + + string args = $"-k \"{prodKeysPath}\" -o \"{parentDir}\" --titleid {titleID} " + + $"--type nsp --ncadir \"{tmpPath}\""; + + ExecuteCommand($"{tools["hacPack"]} {args}"); + File.Move(Path.Combine(parentDir, $"{titleID}.nsp"), outputPath); + return outputPath; + } + + static string ParseNCAOutput(string output, string type) + { + var line = output.Split('\n') + .FirstOrDefault(l => l.Contains($"Created {type} NCA:")); + return line?.Split(':').Last().Trim(); + } + #endregion + } +} +#endif \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs.meta new file mode 100644 index 00000000..a48f3e39 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 55aa3f0466c30bc4683cdbdc4dd75940 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack.meta new file mode 100644 index 00000000..f4c02cc9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d90c85ddb14ad7e4e9a6242ba135da0b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools.meta new file mode 100644 index 00000000..e6fce366 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b31e2ae7250c09548a777d4dcdfe2d1f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP.meta new file mode 100644 index 00000000..708c152c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7be57cd4293e9dc4297ea9b83fe08b18 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe new file mode 100644 index 00000000..7b48599a Binary files /dev/null and b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe differ diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe.meta new file mode 100644 index 00000000..81ccc3b3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e1252f6d74d67ee48af0a0342aecc981 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml new file mode 100644 index 00000000..09433f89 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml @@ -0,0 +1,152 @@ +<?xml version="1.0" encoding="utf-8"?> +<Application> + <Title> + <Language>AmericanEnglish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>BritishEnglish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Japanese</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>French</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>German</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>LatinAmericanSpanish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Spanish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Italian</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Dutch</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>CanadianFrench</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Portuguese</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Russian</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Isbn/> + <StartupUserAccount>Required</StartupUserAccount> + <UserAccountSwitchLock>Disable</UserAccountSwitchLock> + <ParentalControl>None</ParentalControl> + <SupportedLanguage>AmericanEnglish</SupportedLanguage> + <SupportedLanguage>BritishEnglish</SupportedLanguage> + <SupportedLanguage>Japanese</SupportedLanguage> + <SupportedLanguage>French</SupportedLanguage> + <SupportedLanguage>German</SupportedLanguage> + <SupportedLanguage>LatinAmericanSpanish</SupportedLanguage> + <SupportedLanguage>Spanish</SupportedLanguage> + <SupportedLanguage>Italian</SupportedLanguage> + <SupportedLanguage>Dutch</SupportedLanguage> + <SupportedLanguage>CanadianFrench</SupportedLanguage> + <SupportedLanguage>Russian</SupportedLanguage> + <Screenshot>Allow</Screenshot> + <VideoCapture>Disable</VideoCapture> + <PresenceGroupId>0x0104444444441001</PresenceGroupId> + <DisplayVersion>2.0</DisplayVersion> + <Rating> + <Organization>CERO</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>ESRB</Organization> + <Age>10</Age> + </Rating> + <Rating> + <Organization>USK</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>PEGI</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>PEGIPortugal</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>PEGIBBFC</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>Russian</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>ACB</Organization> + <Age>13</Age> + </Rating> + <Rating> + <Organization>OFLC</Organization> + <Age>13</Age> + </Rating> + <DataLossConfirmation>Required</DataLossConfirmation> + <PlayLogPolicy>All</PlayLogPolicy> + <SaveDataOwnerId>0x0104444444441001</SaveDataOwnerId> + <UserAccountSaveDataSize>0x0000000003e00000</UserAccountSaveDataSize> + <UserAccountSaveDataJournalSize>0x0000000000180000</UserAccountSaveDataJournalSize> + <DeviceSaveDataSize>0x0000000000000000</DeviceSaveDataSize> + <DeviceSaveDataJournalSize>0x0000000000000000</DeviceSaveDataJournalSize> + <BcatDeliveryCacheStorageSize>0x0000000000000000</BcatDeliveryCacheStorageSize> + <ApplicationErrorCodeCategory/> + <AddOnContentBaseId>0x0104444444442001</AddOnContentBaseId> + <LogoType>Nintendo</LogoType> + <LocalCommunicationId>0x0104444444441001</LocalCommunicationId> + <LogoHandling>Auto</LogoHandling> + <SeedForPseudoDeviceId>0x0000000000000000</SeedForPseudoDeviceId> + <BcatPassphrase/> + <AddOnContentRegistrationType>AllOnLaunch</AddOnContentRegistrationType> + <UserAccountSaveDataSizeMax>0x0000000000000000</UserAccountSaveDataSizeMax> + <UserAccountSaveDataJournalSizeMax>0x0000000000000000</UserAccountSaveDataJournalSizeMax> + <DeviceSaveDataSizeMax>0x0000000000000000</DeviceSaveDataSizeMax> + <DeviceSaveDataJournalSizeMax>0x0000000000000000</DeviceSaveDataJournalSizeMax> + <TemporaryStorageSize>0x0000000000000000</TemporaryStorageSize> + <CacheStorageSize>0x0000000000000000</CacheStorageSize> + <CacheStorageJournalSize>0x0000000000000000</CacheStorageJournalSize> + <CacheStorageDataAndJournalSizeMax>0x0000000000000000</CacheStorageDataAndJournalSizeMax> + <CacheStorageIndexMax>0x0000000000000000</CacheStorageIndexMax> + <Hdcp>None</Hdcp> + <CrashReport>Deny</CrashReport> + <RuntimeAddOnContentInstall>Deny</RuntimeAddOnContentInstall> + <PlayLogQueryableApplicationId>0x0000000000000000</PlayLogQueryableApplicationId> + <PlayLogQueryCapability>None</PlayLogQueryCapability> + <Repair>None</Repair> + <Attribute>None</Attribute> + <ProgramIndex>0</ProgramIndex> + <RequiredNetworkServiceLicenseOnLaunch>None</RequiredNetworkServiceLicenseOnLaunch> +</Application> diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml.meta new file mode 100644 index 00000000..abd644c0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 42c1295c31de3a948825b9e8e9e8184f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe new file mode 100644 index 00000000..293ebb79 Binary files /dev/null and b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe differ diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe.meta new file mode 100644 index 00000000..d694a349 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7b1b3ff7954facb409d3ba6f9840f762 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys.meta new file mode 100644 index 00000000..5ab90e7c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 409c6e8e5ead0ac4991ea6c243e407dd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt new file mode 100644 index 00000000..e69de29b diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt.meta new file mode 100644 index 00000000..a36d51af --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 08bd0c8a53daacb4ea23b14dde156354 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiAutoBuild.cs b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiAutoBuild.cs new file mode 100644 index 00000000..c8643d9f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiAutoBuild.cs @@ -0,0 +1,118 @@ +#if UNITY_EDITOR +using AxibugEmuOnline.Editors; +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEngine; + +public static class AxiAutoBuild +{ + [MenuItem("Axibug移植工具/AutoBuild/Build ALL")] + public static void Build_Build_ALL() + { + Build_Global(BuildTarget.Android); + Build_Global(BuildTarget.iOS); + Build_Global(BuildTarget.StandaloneWindows); + Build_Global(BuildTarget.StandaloneLinux64); + Build_Global(BuildTarget.WSAPlayer); + AxibugNSPTools.BuildWithRepackNSP(); + } + + [MenuItem("Axibug移植工具/AutoBuild/Android")] + public static void Build_Android() + { + Build_Global(BuildTarget.Android); + } + + [MenuItem("Axibug移植工具/AutoBuild/IOS")] + public static void Build_IOS() + { + Build_Global(BuildTarget.iOS); + } + [MenuItem("Axibug移植工具/AutoBuild/PC")] + public static void Build_PC() + { + Build_Global(BuildTarget.StandaloneWindows); + } + [MenuItem("Axibug移植工具/AutoBuild/Linux")] + public static void Build_Linux64() + { + Build_Global(BuildTarget.StandaloneLinux64); + } + [MenuItem("Axibug移植工具/AutoBuild/UWP")] + public static void Build_UWP() + { + Build_Global(BuildTarget.WSAPlayer); + } + + [MenuItem("Axibug移植工具/AutoBuild/EmbeddedLinux")] + public static void Build_EmbeddedLinux() + { + Build_Global(BuildTarget.EmbeddedLinux); + } + + [MenuItem("Axibug移植工具/AutoBuild/Switch")] + public static void Build_Switch() + { + AxibugNSPTools.BuildWithRepackNSP(); + } + + + public static void Build_Global(BuildTarget target) + { + if (!EditorUtility.DisplayDialog("打包", $"确认打包{target}?", "继续", "取消")) + return; + + var levels = new List<string>(); + foreach (var scene in EditorBuildSettings.scenes) + { + if (scene.enabled) + levels.Add(scene.path); + } + + var buildOpt = EditorUserBuildSettings.development ? BuildOptions.Development : BuildOptions.None; + if (EditorUserBuildSettings.buildWithDeepProfilingSupport) + buildOpt |= BuildOptions.EnableDeepProfilingSupport; + if (EditorUserBuildSettings.allowDebugging) + buildOpt |= BuildOptions.AllowDebugging; + + string targetName = $"{Application.productName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + + targetName += target switch + { + BuildTarget.Android => ".apk", + BuildTarget.iOS => ".ipa", + BuildTarget.StandaloneWindows => ".exe", + _ => "", + }; + + + string _locationPathName = $"Output/{target}/{targetName}"; + string FullPath = Path.GetFullPath(Path.Combine(Application.dataPath, "..", _locationPathName)); + string dirPath = Path.GetDirectoryName(FullPath); + if (!Directory.Exists(dirPath)) + Directory.CreateDirectory(dirPath); + + var options = new BuildPlayerOptions + { + scenes = levels.ToArray(), + locationPathName = _locationPathName, + target = target, + options = buildOpt + }; + + try + { + BuildReport report = BuildPipeline.BuildPlayer(options); + } + catch (Exception ex) + { + Debug.LogError($"[AutoBuild] Unity Build {target} 错误:{ex.ToString()}"); + return; + } + } + +} +#endif \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiAutoBuild.cs.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiAutoBuild.cs.meta new file mode 100644 index 00000000..e40ad9a0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiAutoBuild.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e3b8550d3919d1044b50eb20f0c50fb8 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs index 31e38257..fa31dc04 100644 --- a/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs @@ -29,7 +29,7 @@ public class AxiProjectTools : EditorWindow } } - [MenuItem("Axibug移植工具/[1]采集所有预制体和场景下的UGUI组件")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[1]采集所有预制体和场景下的UGUI组件")] public static void Part1() { GoTAxiProjectToolsSence(); @@ -132,7 +132,7 @@ public class AxiProjectTools : EditorWindow #endif } - [MenuItem("Axibug移植工具/[2]生成中间脚本代码")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[2]生成中间脚本代码")] public static void Part2() { if (UnityEngine.Windows.Directory.Exists(outCsDir)) @@ -161,7 +161,7 @@ public class AxiProjectTools : EditorWindow Debug.Log("<Color=#FFF333>处理完毕 [2]生成中间脚本代码</color>"); } - [MenuItem("Axibug移植工具/[3]收集生成的脚本")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[3]收集生成的脚本")] public static void Part3() { AxiPrefabCache cache = AssetDatabase.LoadAssetAtPath<AxiPrefabCache>(cachecfgPath); @@ -205,7 +205,7 @@ public class AxiProjectTools : EditorWindow } - [MenuItem("Axibug移植工具/[4]替换所有预制体和场景中的组件")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[4]替换所有预制体和场景中的组件")] public static void Part4() { AxiPrefabCache cache = AssetDatabase.LoadAssetAtPath<AxiPrefabCache>(cachecfgPath); @@ -259,7 +259,7 @@ public class AxiProjectTools : EditorWindow } - [MenuItem("Axibug移植工具/[5]UnPack所有嵌套预制体和场景中的预制体")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[5]UnPack所有嵌套预制体和场景中的预制体")] public static void UnpackPrefabs() { @@ -350,7 +350,7 @@ public class AxiProjectTools : EditorWindow } - [MenuItem("Axibug移植工具/[6]修复Sprite")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[6]修复Sprite")] public static void FixMultipleMaterialSprites() { string[] guids = AssetDatabase.FindAssets("t:sprite"); diff --git a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/FrameProfiler.cs b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/FrameProfiler.cs index df242e06..cb9a180c 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/FrameProfiler.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/FrameProfiler.cs @@ -34,6 +34,22 @@ namespace AxiReplay m_targetFrameRate = targetFrameRate; } + /// <summary> + /// 临时方法(暂行) + /// </summary> + /// <param name="mRemoteForwardCount"></param> + /// <returns></returns> + /// <exception cref="NotImplementedException"></exception> + public int TempFrameCount(int mRemoteForwardCount) + { + if (mRemoteForwardCount == 0) + return 0; + if (mRemoteForwardCount < 5) + return 1; + else + return (int)Math.Ceiling(mRemoteForwardCount / 5f); + } + void CalcCacheCount() { double deltaMax = 0; diff --git a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs index cdba7015..f7656a0e 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs @@ -103,7 +103,8 @@ namespace AxiReplay //if (targetFrame == mNextReplay.FrameStartID && targetFrame <= mRemoteFrameIdx && mNetReplayQueue.Count > 0) - if (targetFrame == mNextReplay.FrameStartID && targetFrame <= mRemoteFrameIdx && mNetReplayQueue.Count >= mRemoteForwardCount) + //if (targetFrame == mNextReplay.FrameStartID && targetFrame <= mRemoteFrameIdx && mNetReplayQueue.Count >= mRemoteForwardCount) + if (targetFrame == mNextReplay.FrameStartID && targetFrame <= mRemoteFrameIdx && mNetReplayQueue.Count >= frameProfiler.TempFrameCount(mRemoteForwardCount)) { //当前帧追加 mCurrClientFrameIdx = targetFrame; diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/ColecoVision.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/ColecoVision.cs index fab8dd15..b700e3be 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/ColecoVision.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/ColecoVision.cs @@ -5,6 +5,7 @@ using Essgee.Emulation.Configuration; using Essgee.Emulation.CPU; using Essgee.Emulation.Video; using Essgee.EventArguments; +using Essgee.Metadata; using Essgee.Utilities; using System; using System.Collections.Generic; @@ -182,7 +183,10 @@ namespace Essgee.Emulation.Machines private void LoadBios() { - var (type, bootstrapRomData) = CartridgeLoader.Load(configuration.BiosRom, "ColecoVision BIOS"); + + //var (type, bootstrapRomData) = CartridgeLoader.Load(configuration.BiosRom, "ColecoVision BIOS"); + //直接加载BootStrap + GameMetadataHandler.instance.gameMetaReources.GetDatBytes("Bootstrap/[BIOS] ColecoVision (USA, Europe).col", out byte[] bootstrapRomData); bios = new ColecoCartridge(bootstrapRomData.Length, 0); bios.LoadRom(bootstrapRomData); } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Video/SegaGGVDP.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Video/SegaGGVDP.cs index 3986fabb..d3b08b0c 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Video/SegaGGVDP.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Video/SegaGGVDP.cs @@ -51,19 +51,11 @@ namespace Essgee.Emulation.Video //GCHandle? lasyRenderHandle; protected override void PrepareRenderScreen() { - //// 固定数组,防止垃圾回收器移动它 - //var bitmapcolorRect_handle = GCHandle.Alloc(outputFramebuffer.Clone() as byte[], GCHandleType.Pinned); - //// 获取数组的指针 - //IntPtr mFrameDataPtr = bitmapcolorRect_handle.AddrOfPinnedObject(); - - var eventArgs = RenderScreenEventArgs.Create(numVisiblePixels, numVisibleScanlines, outputFramebuffer_Ptr); + //var eventArgs = RenderScreenEventArgs.Create(numVisiblePixels, numVisibleScanlines, outputFramebuffer_Ptr); + //这里要改成viewport的中间区域的分辨率 + var eventArgs = RenderScreenEventArgs.Create(Viewport.Width, Viewport.Height, outputFramebuffer_Ptr); OnRenderScreen(eventArgs); eventArgs.Release(); - //if (lasyRenderHandle != null) - // lasyRenderHandle.Value.Free(); - //lasyRenderHandle = bitmapcolorRect_handle; - - //OnRenderScreen(new RenderScreenEventArgs(Viewport.Width, Viewport.Height, outputFramebuffer.Clone() as byte[])); } private bool ModifyAndVerifyCoordinates(ref int x, ref int y) diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Metadata/GameMetadataHandler.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Metadata/GameMetadataHandler.cs index 5b0b8d4a..75a630dc 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Metadata/GameMetadataHandler.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Metadata/GameMetadataHandler.cs @@ -19,10 +19,11 @@ namespace Essgee.Metadata public class GameMetadataHandler { + public static GameMetadataHandler instance; //static string datDirectoryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", "No-Intro"); //static string metadataDatabaseFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", "MetadataDatabase.json"); - IGameMetaReources gameMetaReources; + public IGameMetaReources gameMetaReources; //readonly Dictionary<string, DatFile> datFiles; readonly List<CartridgeJSON> cartMetadataDatabase; @@ -31,6 +32,7 @@ namespace Essgee.Metadata public GameMetadataHandler(IGameMetaReources metaresources) { + instance = this; gameMetaReources = metaresources; //if (!gameMetaReources.GetCartMetadataDatabase(out string loadedData)) @@ -356,6 +358,12 @@ namespace Essgee.Metadata ////EssgeeLogger.EnqueueMessageSuccess($"Metadata initialized; {NumKnownGames} game(s) known across {NumKnownSystems} system(s)."); } + ~GameMetadataHandler() + { + if(instance == this) + instance = null; + } + public GameMetadata GetGameMetadata(string datFilename, string romFilename, uint romCrc32, int romSize) { /* Sanity checks */ diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity.meta new file mode 100644 index 00000000..d701a927 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9604fb0f1487b95488164f5dc29a00ba +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/AxiMemory.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/AxiMemory.cs new file mode 100644 index 00000000..b11d0a5b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/AxiMemory.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; + +namespace StoicGooseUnity +{ + public static class StoicGooseUnityAxiMem + { + public static void Init() => AxiMemoryEx.Init(); + public static void FreeAllGCHandle() => AxiMemoryEx.FreeAllGCHandle(); + } + internal unsafe static class AxiMemoryEx + { + static HashSet<GCHandle> GCHandles = new HashSet<GCHandle>(); + + public static void Init() + { + FreeAllGCHandle(); + set_TempBuffer = new byte[0x100000]; + } + + public static void GetObjectPtr(this object srcObj, ref GCHandle handle, ref uint* ptr) + { + GetObjectPtr(srcObj, ref handle, out IntPtr intptr); + ptr = (uint*)intptr; + } + + public static void GetObjectPtr(this object srcObj, ref GCHandle handle, ref short* ptr) + { + GetObjectPtr(srcObj, ref handle, out IntPtr intptr); + ptr = (short*)intptr; + } + public static void GetObjectPtr(this object srcObj, ref GCHandle handle, ref ushort* ptr) + { + GetObjectPtr(srcObj, ref handle, out IntPtr intptr); + ptr = (ushort*)intptr; + } + public static void GetObjectPtr(this object srcObj, ref GCHandle handle, ref int* ptr) + { + GetObjectPtr(srcObj, ref handle, out IntPtr intptr); + ptr = (int*)intptr; + } + public static void GetObjectPtr(this object srcObj, ref GCHandle handle, ref byte* ptr) + { + GetObjectPtr(srcObj, ref handle, out IntPtr intptr); + ptr = (byte*)intptr; + } + + public static void GetObjectPtr(this object srcObj, ref GCHandle handle, ref byte* ptr, out IntPtr intptr) + { + GetObjectPtr(srcObj, ref handle, out intptr); + ptr = (byte*)intptr; + } + + static void GetObjectPtr(this object srcObj, ref GCHandle handle, out IntPtr intptr) + { + ReleaseGCHandle(ref handle); + handle = GCHandle.Alloc(srcObj, GCHandleType.Pinned); + GCHandles.Add(handle); + intptr = handle.AddrOfPinnedObject(); + } + + public static void ReleaseGCHandle(this ref GCHandle handle) + { + if (handle.IsAllocated) + handle.Free(); + GCHandles.Remove(handle); + } + + public static void FreeAllGCHandle() + { + foreach (var handle in GCHandles) + { + if (handle.IsAllocated) + handle.Free(); + } + GCHandles.Clear(); + } + + #region 指针化 TempBuffer + static byte[] TempBuffer_src; + static GCHandle TempBuffer_handle; + public static byte* TempBuffer; + public static byte[] set_TempBuffer + { + set + { + TempBuffer_handle.ReleaseGCHandle(); + if (value == null) + return; + TempBuffer_src = value; + TempBuffer_src.GetObjectPtr(ref TempBuffer_handle, ref TempBuffer); + } + } + #endregion + + public static void Write(this BinaryWriter bw, byte* bufferPtr, int offset, int count) + { + // 使用指针复制数据到临时数组 + Buffer.MemoryCopy(bufferPtr + offset, TempBuffer, 0, count); + // 使用BinaryWriter写入临时数组 + bw.Write(TempBuffer_src, 0, count); + } + public static void Write(this FileStream fs, byte* bufferPtr, int offset, int count) + { + // 使用指针复制数据到临时数组 + Buffer.MemoryCopy(bufferPtr + offset, TempBuffer, 0, count); + // 使用BinaryWriter写入临时数组 + fs.Write(TempBuffer_src, 0, count); + } + public static int Read(this FileStream fs, byte* bufferPtr, int offset, int count) + { + // 使用BinaryWriter写入临时数组 + count = fs.Read(TempBuffer_src, offset, count); + // 使用指针复制数据到临时数组 + Buffer.MemoryCopy(TempBuffer, bufferPtr + offset, 0, count); + return count; + } + } + + internal unsafe static class AxiArray + { + + public static void Copy(byte* src, int srcindex, byte* target, int targetindex, int count) + { + int singlesize = sizeof(byte); + long totalBytesToCopy = count * singlesize; + Buffer.MemoryCopy(&src[srcindex], &target[targetindex], totalBytesToCopy, totalBytesToCopy); + } + public static void Copy(short* src, int srcindex, short* target, int targetindex, int count) + { + int singlesize = sizeof(short); + long totalBytesToCopy = count * singlesize; + Buffer.MemoryCopy(&src[srcindex], &target[targetindex], totalBytesToCopy, totalBytesToCopy); + } + public static void Copy(ushort* src, int srcindex, ushort* target, int targetindex, int count) + { + int singlesize = sizeof(ushort); + long totalBytesToCopy = count * singlesize; + Buffer.MemoryCopy(&src[srcindex], &target[targetindex], totalBytesToCopy, totalBytesToCopy); + } + + public static void Copy(byte* src, byte* target, int index, int count) + { + int singlesize = sizeof(byte); + long totalBytesToCopy = count * singlesize; + Buffer.MemoryCopy(&src[index], &target[index], totalBytesToCopy, totalBytesToCopy); + } + + public static void Copy(ushort* src, ushort* target, int index, int count) + { + int singlesize = sizeof(ushort); + long totalBytesToCopy = count * singlesize; + Buffer.MemoryCopy(&src[index], &target[index], totalBytesToCopy, totalBytesToCopy); + } + public static void Copy(ushort* src, ushort* target, int count) + { + int singlesize = sizeof(ushort); + long totalBytesToCopy = count * singlesize; + Buffer.MemoryCopy(src, target, totalBytesToCopy, totalBytesToCopy); + } + public static void Copy(byte* src, byte* target, int count) + { + int singlesize = sizeof(byte); + long totalBytesToCopy = count * singlesize; + Buffer.MemoryCopy(src, target, totalBytesToCopy, totalBytesToCopy); + } + public static void Clear(byte* data, int index, int lenght) + { + for (int i = index; i < lenght; i++, index++) + data[index] = 0; + } + public static void Clear(ushort* data, int index, int lenght) + { + for (int i = index; i < lenght; i++, index++) + data[index] = 0; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/AxiMemory.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/AxiMemory.cs.meta new file mode 100644 index 00000000..236e26be --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/AxiMemory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 920eb4ce49315964e9537a20e38e6151 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common.meta new file mode 100644 index 00000000..35f0f21c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e1e5391f68e92f4db7f61cf8ed9557e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes.meta new file mode 100644 index 00000000..e4480159 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 70afb0cb69f156a4b877a6dd0462fa04 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/BitDescriptionAttribute.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/BitDescriptionAttribute.cs new file mode 100644 index 00000000..ae8b0a08 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/BitDescriptionAttribute.cs @@ -0,0 +1,21 @@ +using System; + +namespace StoicGoose.Common.Attributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public class BitDescriptionAttribute : Attribute + { + public string Description { get; set; } = string.Empty; + public int LowBit { get; set; } = -1; + public int HighBit { get; set; } = -1; + + public string BitString => LowBit != -1 ? $"B{LowBit}{(HighBit > LowBit ? $"-{HighBit}" : string.Empty)}: " : string.Empty; + + public BitDescriptionAttribute(string desc, int low = -1, int high = -1) + { + Description = desc; + LowBit = low; + HighBit = high; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/BitDescriptionAttribute.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/BitDescriptionAttribute.cs.meta new file mode 100644 index 00000000..3200b069 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/BitDescriptionAttribute.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d881068effe996b459fdd198b8e7b046 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/FormatAttribute.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/FormatAttribute.cs new file mode 100644 index 00000000..104658b2 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/FormatAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace StoicGoose.Common.Attributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public class FormatAttribute : Attribute + { + public string Format { get; set; } = string.Empty; + public int Shift { get; set; } = 0; + + public FormatAttribute(string format, int shift = 0) + { + Format = format; + Shift = shift; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/FormatAttribute.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/FormatAttribute.cs.meta new file mode 100644 index 00000000..3a7ff488 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/FormatAttribute.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2e358d7d3a0a0dd4a835853c38de5b88 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/PortAttribute.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/PortAttribute.cs new file mode 100644 index 00000000..c774966c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/PortAttribute.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace StoicGoose.Common.Attributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public class PortAttribute : Attribute + { + public string Name { get; set; } = string.Empty; + public List<ushort> Numbers { get; set; } = new(); + + public PortAttribute(string name, params ushort[] numbers) + { + Name = name; + Numbers.AddRange(numbers); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/PortAttribute.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/PortAttribute.cs.meta new file mode 100644 index 00000000..4f0df209 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Attributes/PortAttribute.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e622fd59969209c48842cc5f6951d34f \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing.meta new file mode 100644 index 00000000..f6c99610 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62a562265df1f9b41949fb0a0d5d4491 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing/RgbaFile.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing/RgbaFile.cs new file mode 100644 index 00000000..556a8098 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing/RgbaFile.cs @@ -0,0 +1,55 @@ +using System; +using System.IO; +using System.Linq; + +namespace StoicGoose.Common.Drawing +{ + /* RGBA bitmap file format -- https://github.com/bzotto/rgba_bitmap + * ".rgba is the dumbest possible image interchange format, now available for your programming pleasure." + */ + + public class RgbaFile + { + const string expectedMagic = "RGBA"; + + public string MagicNumber { get; protected set; } + public uint Width { get; protected set; } + public uint Height { get; protected set; } + public byte[] PixelData { get; protected set; } + + public RgbaFile(string filename) : this(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { } + + public RgbaFile(Stream stream) + { + MagicNumber = ReadString(stream, 4); + Width = ReadUInt32(stream); + Height = ReadUInt32(stream); + PixelData = new byte[Width * Height * 4]; + stream.Read(PixelData); + } + + public RgbaFile(uint width, uint height, byte[] pixelData) + { + MagicNumber = expectedMagic; + Width = width; + Height = height; + PixelData = pixelData; + } + + public void Save(string filename) => Save(new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)); + + public void Save(Stream stream) + { + WriteString(stream, MagicNumber); + WriteUInt32(stream, Width); + WriteUInt32(stream, Height); + stream.Write(PixelData); + } + + private static string ReadString(Stream stream, int length) => new(Enumerable.Range(0, length).Select(_ => (char)stream.ReadByte()).ToArray()); + private static uint ReadUInt32(Stream stream) => (uint)(((stream.ReadByte() & 0xFF) << 24) | ((stream.ReadByte() & 0xFF) << 16) | ((stream.ReadByte() & 0xFF) << 8) | ((stream.ReadByte() & 0xFF) << 0)); + + private static void WriteString(Stream stream, string str) => Array.ForEach(str.ToCharArray(), (x) => stream.WriteByte((byte)x)); + private static void WriteUInt32(Stream stream, uint val) { stream.WriteByte((byte)((val >> 24) & 0xFF)); stream.WriteByte((byte)((val >> 16) & 0xFF)); stream.WriteByte((byte)((val >> 8) & 0xFF)); stream.WriteByte((byte)((val >> 0) & 0xFF)); } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing/RgbaFile.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing/RgbaFile.cs.meta new file mode 100644 index 00000000..53fab104 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Drawing/RgbaFile.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 319acc894b323fd4f90b8e025383be58 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions.meta new file mode 100644 index 00000000..c0129c15 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d8d552996c36ed1478421faa10628ce6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/ObjectExtensionMethods.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/ObjectExtensionMethods.cs new file mode 100644 index 00000000..effa8c94 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/ObjectExtensionMethods.cs @@ -0,0 +1,20 @@ +//using Newtonsoft.Json; + +//namespace StoicGoose.Common.Extensions +//{ +// public static class ObjectExtensionMethods +// { +// /* https://dotnetcoretutorials.com/2020/09/09/cloning-objects-in-c-and-net-core/ */ +// public static T Clone<T>(this T source) +// { +// if (source is null) return default; +// return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source, new JsonSerializerSettings() +// { +// ReferenceLoopHandling = ReferenceLoopHandling.Ignore +// }), new JsonSerializerSettings() +// { +// ObjectCreationHandling = ObjectCreationHandling.Replace +// }); +// } +// } +//} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/ObjectExtensionMethods.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/ObjectExtensionMethods.cs.meta new file mode 100644 index 00000000..63fc6a43 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/ObjectExtensionMethods.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6e4fde992b04dbe42be66c0ea83bb7c1 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/SerializationExtensionMethods.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/SerializationExtensionMethods.cs new file mode 100644 index 00000000..27d82399 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/SerializationExtensionMethods.cs @@ -0,0 +1,31 @@ +//using System.IO; + +//using Newtonsoft.Json; + +//namespace StoicGoose.Common.Extensions +//{ +// public static class SerializationExtensionMethods +// { +// public static void SerializeToFile(this object obj, string jsonFileName) +// { +// SerializeToFile(obj, jsonFileName, new JsonSerializerSettings() { Formatting = Formatting.Indented }); +// } + +// public static void SerializeToFile(this object obj, string jsonFileName, JsonSerializerSettings serializerSettings) +// { +// using var writer = new StreamWriter(jsonFileName); +// writer.Write(JsonConvert.SerializeObject(obj, serializerSettings)); +// } + +// public static T DeserializeFromFile<T>(this string jsonFileName) +// { +// using var reader = new StreamReader(jsonFileName); +// return (T)JsonConvert.DeserializeObject(reader.ReadToEnd(), typeof(T), new JsonSerializerSettings() { Formatting = Formatting.Indented }); +// } + +// public static T DeserializeObject<T>(this string jsonString) +// { +// return (T)JsonConvert.DeserializeObject(jsonString, typeof(T), new JsonSerializerSettings() { Formatting = Formatting.Indented }); +// } +// } +//} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/SerializationExtensionMethods.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/SerializationExtensionMethods.cs.meta new file mode 100644 index 00000000..1f73c71e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/SerializationExtensionMethods.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 07c7fb2a5f53f2f4aaa60f1673087d9c \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/StringExtensionMethods.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/StringExtensionMethods.cs new file mode 100644 index 00000000..e58ac637 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/StringExtensionMethods.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace StoicGoose.Common.Extensions +{ + public static class StringExtensionMethods + { + /* Modified from https://stackoverflow.com/a/2641383 */ + public static List<int> IndexOfAll(this string str, string value) + { + if (string.IsNullOrEmpty(value)) + throw new ArgumentException("Search string is null or empty", nameof(value)); + + var idxs = new List<int>(); + for (var i = 0; ; i += value.Length) + { + i = str.IndexOf(value, i); + if (i == -1) return idxs; + idxs.Add(i); + } + } + + public static string EnsureEndsWithPeriod(this string str) => str + (!str.EndsWith('.') ? "." : string.Empty); + + /* Regex via https://superuser.com/a/380778 */ + public static string RemoveAnsi(this string str) => Regex.Replace(str, @"\x1b\[[0-9;]*[mGKHF]", ""); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/StringExtensionMethods.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/StringExtensionMethods.cs.meta new file mode 100644 index 00000000..d76f28a9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Extensions/StringExtensionMethods.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: da7cb8ba3dd19cb4e96fedb8dd687ab0 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization.meta new file mode 100644 index 00000000..10622fa7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2df240a96bd839c46a5d441273339c11 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization/Localizer.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization/Localizer.cs new file mode 100644 index 00000000..82cb21c6 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization/Localizer.cs @@ -0,0 +1,37 @@ +//using System; +//using System.Globalization; +//using System.Linq; +//using System.Text.RegularExpressions; + +//using Newtonsoft.Json; +//using Newtonsoft.Json.Linq; + +//namespace StoicGoose.Common.Localization +//{ +// public static class Localizer +// { +// public static string FallbackCulture { get; set; } = "en"; + +// static JObject source = default; + +// public static void Initialize(string jsonData) => source = JsonConvert.DeserializeObject(jsonData) as JObject; + +// public static CultureInfo[] GetSupportedLanguages() => source?.Children().Select(x => new CultureInfo((x as JProperty).Name)).ToArray() ?? Array.Empty<CultureInfo>(); + +// private static JToken GetToken(string path) => source?.SelectToken($"{CultureInfo.CurrentUICulture.TwoLetterISOLanguageName}.{path}") ?? source?.SelectToken($"{FallbackCulture}.{path}"); +// public static string GetString(string path) => GetToken(path)?.Value<string>() ?? path[(path.LastIndexOf('.') + 1)..]; +// public static string GetString(string path, object parameters) +// { +// var result = GetString(path); +// var properties = parameters.GetType().GetProperties(); +// foreach (Match match in Regex.Matches(result, @"{(?<param>[^}:]*):*(?<format>[^}]*)}").Where(x => x.Success)) +// { +// var property = properties.First(x => x.Name == match.Groups["param"].Value); +// var format = match.Groups["format"].Value; +// var formattedValue = string.IsNullOrEmpty(format) ? $"{property.GetValue(parameters)}" : string.Format($"{{0:{format}}}", property.GetValue(parameters)); +// result = result.Replace(match.Value, formattedValue); +// } +// return result; +// } +// } +//} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization/Localizer.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization/Localizer.cs.meta new file mode 100644 index 00000000..11254055 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Localization/Localizer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e82b9629c32ff9f46bfd29ee8db43083 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities.meta new file mode 100644 index 00000000..2c0d21f2 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d169728b1f850a4db4171c5dab2507c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Ansi.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Ansi.cs new file mode 100644 index 00000000..d928ac47 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Ansi.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace StoicGoose.Common.Utilities +{ + public static class Ansi + { + public readonly static string Reset = "\x1B[0m"; + public readonly static string Black = "\x1B[30m"; + public readonly static string Red = "\x1B[31m"; + public readonly static string Green = "\x1B[32m"; + public readonly static string Yellow = "\x1B[33m"; + public readonly static string Blue = "\x1B[34m"; + public readonly static string Magenta = "\x1B[35m"; + public readonly static string Cyan = "\x1B[36m"; + public readonly static string White = "\x1B[37m"; + + public static string RGB(byte r, byte g, byte b) => $"\x1B[38;2;{r};{g};{b}m"; + + // Such a stupid gimmick... but hey, I like stupid gimmicks and I especially like making them, so whatever~ + public static string Gradient(string text, bool useHsl, params (byte r, byte g, byte b)[] colors) + { + var stepsPerColor = (int)Math.Round(text.Length / (colors.Length - 1f), MidpointRounding.AwayFromZero); + var steps = Math.Max(stepsPerColor * (colors.Length - 1), text.Length); + + List<(byte r, byte g, byte b)> gradient = new(); + + for (int i = 0, c = 0; i < steps; i += stepsPerColor, c++) + { + // TODO: this is a workaround for a out-of-range bug, but ugh, it's for a mere gimmick barely anyone will ever see, soooooo... whatever! + if (c + 1 >= colors.Length) c--; + + if (useHsl) + { + var (h1, s1, l1) = RgbToHsl(colors[c + 0].r, colors[c + 0].g, colors[c + 0].b); + var (h2, s2, l2) = RgbToHsl(colors[c + 1].r, colors[c + 1].g, colors[c + 1].b); + + for (var j = 0; j < stepsPerColor; j++) + { + var by = Math.Clamp(j / 1f / ((stepsPerColor - 1) / 1f), 0f, 1f); + var (h, s, l) = Lerp(h1, s1, l1, h2, s2, l2, by); + gradient.Add(HslToRgb(h, s, l)); + } + } + else + { + var (r1, g1, b1) = (colors[c + 0].r / 255f, colors[c + 0].g / 255f, colors[c + 0].b / 255f); + var (r2, g2, b2) = (colors[c + 1].r / 255f, colors[c + 1].g / 255f, colors[c + 1].b / 255f); + + for (var j = 0; j < stepsPerColor; j++) + { + var by = Math.Clamp(j / 1f / ((stepsPerColor - 1) / 1f), 0f, 1f); + gradient.Add(((byte)(Lerp(r1, r2, by) * 255), (byte)(Lerp(g1, g2, by) * 255), (byte)(Lerp(b1, b2, by) * 255))); + } + } + } + + var builder = new StringBuilder(); + for (var i = 0; i < Math.Min(gradient.Count, text.Length); i++) + builder.Append($"{RGB(gradient[i].r, gradient[i].g, gradient[i].b)}{text[i]}"); + return builder.ToString(); + } + + private static float Lerp(float v1, float v2, float by) => v1 * (1f - by) + v2 * by; + private static (float h, float s, float l) Lerp(float h1, float s1, float l1, float h2, float s2, float l2, float by) => (Lerp(h1, h2, by) % 360f, Math.Clamp(Lerp(s1, s2, by), 0f, 1f), Math.Clamp(Lerp(l1, l2, by), 0f, 1f)); + + // http://www.easyrgb.com/en/math.php + private static (float h, float s, float l) RgbToHsl(byte red, byte green, byte blue) + { + float h = 0f, s, l; + + var r = red / 255f; + var g = green / 255f; + var b = blue / 255f; + + var min = Math.Min(Math.Min(r, g), b); + var max = Math.Max(Math.Max(r, g), b); + var deltaMax = max - min; + + l = (max + min) / 2f; + + if (deltaMax == 0) + { + h = 0; + s = 0; + } + else + { + if (l < 0.5f) s = deltaMax / (max + min); + else s = deltaMax / (2f - max - min); + + var deltaR = ((max - r) / 6f + deltaMax / 2f) / deltaMax; + var deltaG = ((max - g) / 6f + deltaMax / 2f) / deltaMax; + var deltaB = ((max - b) / 6f + deltaMax / 2f) / deltaMax; + + if (r == max) h = deltaB - deltaG; + else if (g == max) h = 1f / 3f + deltaR - deltaB; + else if (b == max) h = 2f / 3f + deltaG - deltaR; + + if (h < 0f) h++; + if (h > 1f) h--; + } + + return (h, s, l); + } + + // http://www.easyrgb.com/en/math.php + private static (byte r, byte g, byte b) HslToRgb(float hue, float saturation, float lightness) + { + byte r, g, b; + + if (saturation == 0f) + { + r = (byte)(lightness * 255); + g = (byte)(lightness * 255); + b = (byte)(lightness * 255); + } + else + { + float v1, v2; + + if (lightness < 0.5f) v2 = lightness * (1f + saturation); + else v2 = lightness + saturation - saturation * lightness; + + v1 = 2f * lightness - v2; + + r = (byte)(255 * HueToRgb(v1, v2, hue + 1f / 3f)); + g = (byte)(255 * HueToRgb(v1, v2, hue)); + b = (byte)(255 * HueToRgb(v1, v2, hue - 1f / 3f)); + } + + return (r, g, b); + } + + private static float HueToRgb(float v1, float v2, float vh) + { + if (vh < 0f) vh++; + if (vh > 1) vh--; + + if (6f * vh < 1f) return v1 + (v2 - v1) * 6f * vh; + if (2f * vh < 1f) return v2; + if (3f * vh < 2f) return v1 + (v2 - v1) * (2f / 3f - vh) * 6f; + return v1; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Ansi.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Ansi.cs.meta new file mode 100644 index 00000000..5bf3b212 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Ansi.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0f30cf7d655b21e49a24ff276bbc9861 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Bcd.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Bcd.cs new file mode 100644 index 00000000..e9031e15 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Bcd.cs @@ -0,0 +1,8 @@ +namespace StoicGoose.Common.Utilities +{ + public static class Bcd + { + public static int DecimalToBcd(int value) => ((value / 10) << 4) + (value % 10); + public static int BcdToDecimal(int value) => ((value >> 4) * 10) + value % 16; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Bcd.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Bcd.cs.meta new file mode 100644 index 00000000..959d47de --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Bcd.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e71734276750fc04990a5d08f116ee5d \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/BitHandling.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/BitHandling.cs new file mode 100644 index 00000000..2254857c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/BitHandling.cs @@ -0,0 +1,15 @@ +namespace StoicGoose.Common.Utilities +{ + public static class BitHandling + { + public static void ChangeBit(ref byte value, int bit, bool state) + { + if (state) + value |= (byte)(1 << bit); + else + value &= (byte)~(1 << bit); + } + + public static bool IsBitSet(byte value, int bit) => (value & (1 << bit)) != 0; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/BitHandling.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/BitHandling.cs.meta new file mode 100644 index 00000000..e3d4641d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/BitHandling.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d00bd13e7a297b34683f7c739fc50d46 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/ConfigurationBase.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/ConfigurationBase.cs new file mode 100644 index 00000000..a835de9a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/ConfigurationBase.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace StoicGoose.Common.Utilities +{ + public abstract class ConfigurationBase<T> where T : class, new() + { + public static readonly Dictionary<string, object> Defaults = default; + + static ConfigurationBase() + { + Defaults = GetDefaultValues(); + } + + private static Dictionary<string, object> GetDefaultValues() + { + var dict = new Dictionary<string, object>(); + var instance = new T(); + + foreach (var property in typeof(T).GetProperties().Where(x => x.CanWrite)) + { + var value = property.GetValue(instance); + if (value == null || (property.PropertyType == typeof(string) && string.IsNullOrEmpty(value as string))) continue; + dict.Add(property.Name, value); + } + + return dict; + } + + public void ResetToDefault(string name) + { + var property = GetType().GetProperty(name); + if (property == null) throw new ArgumentException($"Setting '{name}' not found in {GetType().Name}", nameof(name)); + property.SetValue(this, Defaults[name]); + } + } + + public static class ConfigurationBase + { + public static void CopyConfiguration(object source, object destination) + { + if (source == null) throw new ArgumentNullException(nameof(source), "Source cannot be null"); + if (destination == null) throw new ArgumentNullException(nameof(destination), "Destination cannot be null"); + + var sourceType = source.GetType(); + var destType = destination.GetType(); + + foreach (var sourceProperty in sourceType.GetProperties().Where(x => x.CanRead)) + { + var destProperty = destType.GetProperty(sourceProperty.Name); + if (destProperty == null || !destProperty.CanWrite || destProperty.GetSetMethod(true) == null || destProperty.GetSetMethod(true).IsPrivate || + destProperty.GetSetMethod(true).Attributes.HasFlag(System.Reflection.MethodAttributes.Static) || + !destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType)) + continue; + + var sourceValue = sourceProperty.GetValue(source, null); + var destValue = destProperty.GetValue(destination, null); + + if ((sourceProperty.PropertyType.BaseType.IsGenericType ? sourceProperty.PropertyType.BaseType.GetGenericTypeDefinition() : sourceProperty.PropertyType.BaseType) == typeof(ConfigurationBase<>)) + CopyConfiguration(sourceValue, destValue); + else + destProperty.SetValue(destination, sourceValue); + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/ConfigurationBase.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/ConfigurationBase.cs.meta new file mode 100644 index 00000000..0d0d6693 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/ConfigurationBase.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 76e83b1a596480f48a7afe097d979b83 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Crc32.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Crc32.cs new file mode 100644 index 00000000..e7dbfb5b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Crc32.cs @@ -0,0 +1,82 @@ +using System; +using System.IO; + +namespace StoicGoose.Common.Utilities +{ + public static class Crc32 + { + static readonly uint[] crcTable; + static readonly uint crcPolynomial = 0xEDB88320; + static readonly uint crcSeed = 0xFFFFFFFF; + + static Crc32() + { + crcTable = new uint[256]; + + for (var i = 0; i < 256; i++) + { + var entry = (uint)i; + for (int j = 0; j < 8; j++) + { + if ((entry & 0x00000001) == 0x00000001) entry = (entry >> 1) ^ crcPolynomial; + else entry >>= 1; + } + crcTable[i] = entry; + } + } + + private static void VerifyStartAndLength(int dataLength, int segmentStart, int segmentLength) + { + if (segmentStart >= dataLength) throw new Exception("Segment start offset is greater than total length"); + if (segmentLength > dataLength) throw new Exception("Segment length is greater than total length"); + if ((segmentStart + segmentLength) > dataLength) throw new Exception("Segment end offset is greater than total length"); + } + + public static uint Calculate(FileInfo fileInfo) + { + return Calculate(fileInfo, 0, (int)fileInfo.Length); + } + + public static uint Calculate(FileInfo fileInfo, int start, int length) + { + VerifyStartAndLength((int)fileInfo.Length, start, length); + + using FileStream file = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Calculate(file, start, length); + } + + public static uint Calculate(Stream stream) + { + return Calculate(stream, 0, (int)stream.Length); + } + + public static uint Calculate(Stream stream, int start, int length) + { + VerifyStartAndLength((int)stream.Length, start, length); + + var lastStreamPosition = stream.Position; + var data = new byte[length]; + stream.Position = start; + stream.Read(data, 0, length); + var crc = Calculate(data, 0, data.Length); + stream.Position = lastStreamPosition; + + return crc; + } + + public static uint Calculate(byte[] data) + { + return Calculate(data, 0, data.Length); + } + + public static uint Calculate(byte[] data, int start, int length) + { + VerifyStartAndLength(data.Length, start, length); + + uint crc = crcSeed; + for (var i = start; i < (start + length); i++) + crc = ((crc >> 8) ^ crcTable[data[i] ^ (crc & 0x000000FF)]); + return ~crc; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Crc32.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Crc32.cs.meta new file mode 100644 index 00000000..3ace5b40 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Crc32.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: afa4b03878ac3704bb52cae6e463f1f0 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Log.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Log.cs new file mode 100644 index 00000000..37fafa20 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Log.cs @@ -0,0 +1,87 @@ +using System.Collections.Generic; + +namespace StoicGoose.Common.Utilities +{ + public enum LogSeverity { Verbose, Debug, Information, Warning, Error, Fatal } + public enum LogType { Debug, Warning, Error } + + public interface IStoicGooseLogger + { + public void Log(LogType logtype, string message); + public void Debug(string message); + public void Warning(string message); + public void Err(string message); + } + + public static class Log + { + const string defaultTemplate = "{Message}{NewLine}{Exception}"; + + readonly static Dictionary<LogSeverity, LogType> severityToEventLevelMapping = new() + { + { LogSeverity.Verbose, LogType.Debug }, + { LogSeverity.Debug, LogType.Debug }, + { LogSeverity.Information, LogType.Debug }, + { LogSeverity.Warning, LogType.Warning }, + { LogSeverity.Error, LogType.Error }, + { LogSeverity.Fatal, LogType.Error } + }; + + readonly static Dictionary<LogSeverity, string> logSeverityAnsiColors = new() + { + { LogSeverity.Verbose, Ansi.White }, + { LogSeverity.Debug, Ansi.Cyan }, + { LogSeverity.Information, Ansi.Green }, + { LogSeverity.Warning, Ansi.Yellow }, + { LogSeverity.Error, Ansi.Magenta }, + { LogSeverity.Fatal, Ansi.Red } + }; + + static IStoicGooseLogger mainLogger; + + public static void Initialize(IStoicGooseLogger logger) + { + mainLogger = logger; + } + + + public static void WriteLine(string message) => mainLogger.Debug(message); + //public static void WriteFatal(string message) => Write(LogEventLevel.Fatal, message); + + //private static void Write(LogEventLevel logEventLevel, string message) + //{ + // mainLogger?.Write(logEventLevel, message); + // fileLogger?.Write(logEventLevel, message.RemoveAnsi()); + //} + + public static void WriteEvent(LogSeverity severity, object source, string message) + { + var eventLevel = severityToEventLevelMapping.ContainsKey(severity) ? severityToEventLevelMapping[severity] : LogType.Debug; + var logMessage = $"{logSeverityAnsiColors[severity]}[{source?.GetType().Name ?? string.Empty}]{Ansi.Reset}: {message}"; + mainLogger.Log(eventLevel, logMessage); + } + } + + //class TextWriterSink : ILogEventSink + //{ + // readonly TextWriter textWriter = default; + // readonly ITextFormatter textFormatter = default; + + // readonly object syncRoot = new(); + + // //public TextWriterSink(TextWriter writer, ITextFormatter formatter) + // //{ + // // textWriter = writer; + // // textFormatter = formatter ?? throw new ArgumentNullException(nameof(formatter)); + // //} + + // public void Emit(LogEvent logEvent) + // { + // lock (syncRoot) + // { + // textFormatter.Format(logEvent ?? throw new ArgumentNullException(nameof(logEvent)), textWriter); + // textWriter.Flush(); + // } + // } + //} +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Log.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Log.cs.meta new file mode 100644 index 00000000..fae0e83c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Log.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 916e8e9742f5dfc41823c7eb3a544606 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Resources.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Resources.cs new file mode 100644 index 00000000..cf8747b8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Resources.cs @@ -0,0 +1,41 @@ +using System.IO; +using System.Reflection; + +using StoicGoose.Common.Drawing; + +namespace StoicGoose.Common.Utilities +{ + public static class Resources + { + private static Stream GetEmbeddedResourceStream(string name) + { + var assembly = Assembly.GetEntryAssembly(); + name = $"{assembly.GetName().Name}.{name}"; + return assembly.GetManifestResourceStream(name); + } + + public static RgbaFile GetEmbeddedRgbaFile(string name) + { + using var stream = GetEmbeddedResourceStream(name); + if (stream == null) return null; + return new RgbaFile(stream); + } + + public static string GetEmbeddedText(string name) + { + using var stream = GetEmbeddedResourceStream(name); + if (stream == null) return string.Empty; + using var reader = new StreamReader(stream); + return reader.ReadToEnd(); + } + + public static byte[] GetEmbeddedRawData(string name) + { + using var stream = GetEmbeddedResourceStream(name); + if (stream == null) return null; + var buffer = new byte[stream.Length]; + stream.Read(buffer, 0, buffer.Length); + return buffer; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Resources.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Resources.cs.meta new file mode 100644 index 00000000..bd9abd7c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Common/Utilities/Resources.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 20f7f2e2f16528949b80073b5e8778f9 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core.meta new file mode 100644 index 00000000..87a21f1b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b4feaaee1d7195a46a3aa956e4128489 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Bootstrap.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Bootstrap.cs new file mode 100644 index 00000000..6c8291d5 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Bootstrap.cs @@ -0,0 +1,41 @@ +using System; + +using StoicGoose.Core.Interfaces; + +namespace StoicGoose.Core +{ + public class Bootstrap : IComponent + { + readonly byte[] rom = Array.Empty<byte>(); + readonly uint romMask = 0; + + public Bootstrap(int size) + { + rom = new byte[size]; + romMask = (uint)(rom.Length - 1); + } + + public void Reset() + { + // + } + + public void Shutdown() + { + // + } + + public void LoadRom(byte[] data) + { + if (data.Length != rom.Length) + throw new Exception("Data size mismatch error"); + + Buffer.BlockCopy(data, 0, rom, 0, data.Length); + } + + public byte ReadMemory(uint address) + { + return rom[address & romMask]; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Bootstrap.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Bootstrap.cs.meta new file mode 100644 index 00000000..81f3bd4d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Bootstrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d194949ecf04a5341b082bac647c847d \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU.meta new file mode 100644 index 00000000..89957c08 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c1c58bce2e7f29f419b70dc124e97204 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Addressing.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Addressing.cs new file mode 100644 index 00000000..7d24034f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Addressing.cs @@ -0,0 +1,96 @@ +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + private byte ReadOpcodeEb() + { + ReadModRM(); + if (modRm.Mod == ModRM.Modes.Register) + return GetRegister8((RegisterNumber8)modRm.Mem); + else + return ReadMemory8(modRm.Segment, modRm.Offset); + } + + private ushort ReadOpcodeEw() + { + ReadModRM(); + if (modRm.Mod == ModRM.Modes.Register) + return GetRegister16((RegisterNumber16)modRm.Mem); + else + return ReadMemory16(modRm.Segment, modRm.Offset); + } + + private void WriteOpcodeEb(byte value) + { + ReadModRM(); + if (modRm.Mod == ModRM.Modes.Register) + SetRegister8((RegisterNumber8)modRm.Mem, value); + else + WriteMemory8(modRm.Segment, modRm.Offset, value); + } + + private void WriteOpcodeEw(ushort value) + { + ReadModRM(); + if (modRm.Mod == ModRM.Modes.Register) + SetRegister16((RegisterNumber16)modRm.Mem, value); + else + WriteMemory16(modRm.Segment, modRm.Offset, value); + } + + private byte ReadOpcodeGb() + { + ReadModRM(); + return GetRegister8((RegisterNumber8)modRm.Reg); + } + + private ushort ReadOpcodeGw() + { + ReadModRM(); + return GetRegister16((RegisterNumber16)modRm.Reg); + } + + private void WriteOpcodeGb(byte value) + { + ReadModRM(); + SetRegister8((RegisterNumber8)modRm.Reg, value); + } + + private void WriteOpcodeGw(ushort value) + { + ReadModRM(); + SetRegister16((RegisterNumber16)modRm.Reg, value); + } + + private ushort ReadOpcodeSw() + { + ReadModRM(); + return GetSegment((SegmentNumber)modRm.Reg); + } + + private void WriteOpcodeSw(ushort value) + { + ReadModRM(); + SetSegment((SegmentNumber)modRm.Reg, value); + } + + private byte ReadOpcodeIb() + { + return ReadMemory8(cs, ip++); + } + + private ushort ReadOpcodeIw() + { + var value = ReadMemory16(cs, ip); + ip += 2; + return value; + } + + private ushort ReadOpcodeJb() + { + var tmp1 = (ushort)(ip + 1); + var tmp2 = (sbyte)ReadOpcodeIb(); + return (ushort)(tmp1 + tmp2); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Addressing.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Addressing.cs.meta new file mode 100644 index 00000000..896b0df7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Addressing.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e1f6daccd87f15e48a0e766b94f6d27f \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Flags.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Flags.cs new file mode 100644 index 00000000..6176b021 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Flags.cs @@ -0,0 +1,49 @@ +using System; + +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + [Flags] + public enum Flags : ushort + { + Carry = 1 << 0, /* CF */ + ReservedB1 = 1 << 1, /* (reserved) */ + Parity = 1 << 2, /* PF */ + ReservedB3 = 1 << 3, /* (reserved) */ + Auxiliary = 1 << 4, /* AF */ + ReservedB5 = 1 << 5, /* (reserved) */ + Zero = 1 << 6, /* ZF */ + Sign = 1 << 7, /* SF */ + Trap = 1 << 8, /* TF */ + InterruptEnable = 1 << 9, /* IF */ + Direction = 1 << 10, /* DF */ + Overflow = 1 << 11, /* OF */ + ReservedB12 = 1 << 12, /* (reserved) */ + ReservedB13 = 1 << 13, /* (reserved) */ + ReservedB14 = 1 << 14, /* (reserved) */ + ReservedB15 = 1 << 15 /* (reserved) */ + } + + private void SetFlags(Flags flags) + { + this.flags |= flags; + } + + private void ClearFlags(Flags flags) + { + this.flags &= ~flags; + } + + public bool IsFlagSet(Flags flags) + { + return (this.flags & flags) == flags; + } + + private void SetClearFlagConditional(Flags flags, bool condition) + { + if (condition) this.flags |= flags; + else this.flags &= ~flags; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Flags.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Flags.cs.meta new file mode 100644 index 00000000..df94a71a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Flags.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8d3774b3b6efb724ca93707535be9a35 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Implementations.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Implementations.cs new file mode 100644 index 00000000..bf54af7b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Implementations.cs @@ -0,0 +1,527 @@ +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + private byte Add8(bool withCarry, byte a, byte b) + { + int result = a + b + (withCarry && IsFlagSet(Flags.Carry) ? 1 : 0); + + // CF, PF, AF, ZF, SF, OF = according to result + SetClearFlagConditional(Flags.Carry, (result & 0x100) != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ b ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (result ^ b) & 0x80) != 0); + + return (byte)result; + } + + private ushort Add16(bool withCarry, ushort a, ushort b) + { + int result = a + b + (withCarry && IsFlagSet(Flags.Carry) ? 1 : 0); + + // CF, PF, AF, ZF, SF, OF = according to result + SetClearFlagConditional(Flags.Carry, (result & 0x10000) != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ b ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (result ^ b) & 0x8000) != 0); + + return (ushort)result; + } + + private byte Or8(byte a, byte b) + { + int result = a | b; + + // CF, OF = cleared; PF, ZF, SF = according to result; AF = undefined + ClearFlags(Flags.Carry); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + ClearFlags(Flags.Overflow); + + return (byte)result; + } + + private ushort Or16(ushort a, ushort b) + { + int result = a | b; + + // CF, OF = cleared; PF, ZF, SF = according to result; AF = undefined + ClearFlags(Flags.Carry); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + ClearFlags(Flags.Overflow); + + return (ushort)result; + } + + private byte Sub8(bool withBorrow, byte a, byte b) + { + int result = a - (b + (withBorrow && IsFlagSet(Flags.Carry) ? 1 : 0)); + + // CF, PF, AF, ZF, SF, OF = according to result + SetClearFlagConditional(Flags.Carry, (result & 0x100) != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ b ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (a ^ b) & 0x80) != 0); + + return (byte)result; + } + + private ushort Sub16(bool withBorrow, ushort a, ushort b) + { + int result = a - (b + (withBorrow && IsFlagSet(Flags.Carry) ? 1 : 0)); + + // CF, PF, AF, ZF, SF, OF = according to result + SetClearFlagConditional(Flags.Carry, (result & 0x10000) != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ b ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (a ^ b) & 0x8000) != 0); + + return (ushort)result; + } + + private byte And8(byte a, byte b) + { + int result = a & b; + + // CF, OF = cleared; PF, ZF, SF = according to result; AF = undefined + ClearFlags(Flags.Carry); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + ClearFlags(Flags.Overflow); + + return (byte)result; + } + + private ushort And16(ushort a, ushort b) + { + int result = a & b; + + // CF, OF = cleared; PF, ZF, SF = according to result; AF = undefined + ClearFlags(Flags.Carry); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + ClearFlags(Flags.Overflow); + + return (ushort)result; + } + + private void Daa(bool isSubtract) + { + byte oldAl = ax.Low; + + if (((oldAl & 0x0F) > 0x09) || IsFlagSet(Flags.Auxiliary)) + { + ax.Low += (byte)(isSubtract ? -0x06 : 0x06); + SetFlags(Flags.Auxiliary); + } + else + ClearFlags(Flags.Auxiliary); + + if ((oldAl > 0x99) || IsFlagSet(Flags.Carry)) + { + ax.Low += (byte)(isSubtract ? -0x60 : 0x60); + SetFlags(Flags.Carry); + } + else + ClearFlags(Flags.Carry); + + SetClearFlagConditional(Flags.Parity, CalculateParity(ax.Low & 0xFF)); + SetClearFlagConditional(Flags.Zero, (ax.Low & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (ax.Low & 0x80) != 0); + } + + private byte Xor8(byte a, byte b) + { + int result = a ^ b; + + // CF, OF = cleared; PF, ZF, SF = according to result; AF = undefined + ClearFlags(Flags.Carry); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + ClearFlags(Flags.Overflow); + + return (byte)result; + } + + private ushort Xor16(ushort a, ushort b) + { + int result = a ^ b; + + // CF, OF = cleared; PF, ZF, SF = according to result; AF = undefined + ClearFlags(Flags.Carry); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + ClearFlags(Flags.Overflow); + + return (ushort)result; + } + + private void Aaa(bool isSubtract) + { + if (((ax.Low & 0x0F) > 0x09) || IsFlagSet(Flags.Auxiliary)) + { + ax.Low = (byte)(ax.Low + (isSubtract ? -0x06 : 0x06)); + ax.High = (byte)(ax.High + (isSubtract ? -0x01 : 0x01)); + + SetFlags(Flags.Auxiliary); + SetFlags(Flags.Carry); + } + else + { + ClearFlags(Flags.Auxiliary); + ClearFlags(Flags.Carry); + } + + ax.Low &= 0x0F; + } + + private byte Inc8(byte a) + { + int result = a + 1; + + // PF, AF, ZF, SF, OF = according to result, CF = undefined + //Carry + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ 1 ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (result ^ 1) & 0x80) != 0); + + return (byte)result; + } + + private ushort Inc16(ushort a) + { + int result = a + 1; + + // PF, AF, ZF, SF, OF = according to result, CF = undefined + //Carry + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ 1 ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (result ^ 1) & 0x8000) != 0); + + return (ushort)result; + } + + private byte Dec8(byte a) + { + int result = a - 1; + + // PF, AF, ZF, SF, OF = according to result, CF = undefined + //Carry + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ 1 ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (a ^ 1) & 0x80) != 0); + + return (byte)result; + } + + private ushort Dec16(ushort a) + { + int result = a - 1; + + // PF, AF, ZF, SF, OF = according to result, CF = undefined + //Carry + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((a ^ 1 ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ a) & (a ^ 1) & 0x8000) != 0); + + return (ushort)result; + } + + private byte Rol8(bool withCarry, byte a, byte b) + { + int result; + + if (withCarry) + { + result = a; + for (var n = 0; n < b; n++) + { + var carry = result & 0x80; + result = (result << 1) | (IsFlagSet(Flags.Carry) ? 0x01 : 0); + SetClearFlagConditional(Flags.Carry, carry != 0); + } + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x80) != 0); + result &= 0xFF; + } + else + { + result = (a << b) | (a >> (8 - b)); + SetClearFlagConditional(Flags.Carry, ((a << b) & (1 << 8)) != 0); + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x80) != 0); + result &= 0xFF; + } + + return (byte)result; + } + + private ushort Rol16(bool withCarry, ushort a, ushort b) + { + int result; + + if (withCarry) + { + result = a; + for (var n = 0; n < b; n++) + { + var carry = result & 0x80; + result = (result << 1) | (IsFlagSet(Flags.Carry) ? 0x0001 : 0); + SetClearFlagConditional(Flags.Carry, carry != 0); + } + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x8000) != 0); + result &= 0xFFFF; + } + else + { + result = (a << b) | (a >> (16 - b)); + SetClearFlagConditional(Flags.Carry, ((a << b) & (1 << 16)) != 0); + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x8000) != 0); + result &= 0xFFFF; + } + + return (ushort)result; + } + + private byte Ror8(bool withCarry, byte a, byte b) + { + int result; + + if (withCarry) + { + result = a; + for (var n = 0; n < b; n++) + { + var carry = result & 0x01; + result = (IsFlagSet(Flags.Carry) ? 0x80 : 0) | (result >> 1); + SetClearFlagConditional(Flags.Carry, carry != 0); + } + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x80) != 0); + result &= 0xFF; + } + else + { + result = (a >> b) | (a << (8 - b)); + SetClearFlagConditional(Flags.Carry, ((a >> (b - 1)) & 0x01) != 0); + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x80) != 0); + result &= 0xFF; + } + + return (byte)result; + } + + private ushort Ror16(bool withCarry, ushort a, ushort b) + { + int result; + + if (withCarry) + { + result = a; + for (var n = 0; n < b; n++) + { + var carry = result & 0x01; + result = (IsFlagSet(Flags.Carry) ? 0x8000 : 0) | (result >> 1); + SetClearFlagConditional(Flags.Carry, carry != 0); + } + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x8000) != 0); + result &= 0xFFFF; + } + else + { + result = (a >> b) | (a << (16 - b)); + SetClearFlagConditional(Flags.Carry, ((a >> (b - 1)) & 0x01) != 0); + SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x8000) != 0); + result &= 0xFFFF; + } + + return (ushort)result; + } + + private byte Shl8(byte a, byte b) + { + int result = (a << b) & 0xFF; + + if (b != 0) + { + SetClearFlagConditional(Flags.Carry, ((a << b) & (1 << 8)) != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + if (b == 1) SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x80) != 0); + } + + return (byte)result; + } + + private ushort Shl16(ushort a, ushort b) + { + int result = (a << b) & 0xFFFF; + + if (b != 0) + { + SetClearFlagConditional(Flags.Carry, ((a << b) & (1 << 16)) != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + if (b == 1) SetClearFlagConditional(Flags.Overflow, ((a ^ result) & 0x8000) != 0); + } + + return (ushort)result; + } + + private byte Shr8(bool signed, byte a, byte b) + { + if (signed && (b & 16) != 0) + { + SetClearFlagConditional(Flags.Carry, (a & 0x80) != 0); + return (byte)(0 - (IsFlagSet(Flags.Carry) ? 1 : 0)); + } + + int result = (a >> b) & 0xFF; + + SetClearFlagConditional(Flags.Carry, ((a >> (b - 1)) & (1 << 0)) != 0); + if (signed && (a & 0x80) != 0) result |= 0xFF << (8 - b); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + SetClearFlagConditional(Flags.Overflow, !signed && ((a ^ result) & 0x80) != 0); + + return (byte)result; + } + + private ushort Shr16(bool signed, ushort a, ushort b) + { + if (signed && (b & 16) != 0) + { + SetClearFlagConditional(Flags.Carry, (a & 0x8000) != 0); + return (ushort)(0 - (IsFlagSet(Flags.Carry) ? 1 : 0)); + } + + int result = (a >> b) & 0xFFFF; + + SetClearFlagConditional(Flags.Carry, ((a >> (b - 1)) & (1 << 0)) != 0); + if (signed && (a & 0x8000) != 0) result |= 0xFFFF << (16 - b); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + //Aux + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + SetClearFlagConditional(Flags.Overflow, !signed && ((a ^ result) & 0x8000) != 0); + + return (ushort)result; + } + + private byte Neg8(byte b) + { + int result = -b & 0xFF; + + // CF = is operand non-zero?; PF, AF, ZF, SF, OF = according to result + SetClearFlagConditional(Flags.Carry, b != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((0 ^ b ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x80) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ 0) & (0 ^ b) & 0x80) != 0); + + return (byte)result; + } + + private ushort Neg16(ushort b) + { + int result = -b & 0xFFFF; + + // CF = is operand non-zero?; PF, AF, ZF, SF, OF = according to result + SetClearFlagConditional(Flags.Carry, b != 0); + SetClearFlagConditional(Flags.Parity, CalculateParity(result & 0xFF)); + SetClearFlagConditional(Flags.Auxiliary, ((0 ^ b ^ result) & 0x10) != 0); + SetClearFlagConditional(Flags.Zero, (result & 0xFFFF) == 0); + SetClearFlagConditional(Flags.Sign, (result & 0x8000) != 0); + SetClearFlagConditional(Flags.Overflow, ((result ^ 0) & (0 ^ b) & 0x8000) != 0); + + return (ushort)result; + } + + private ushort Mul8(bool signed, byte a, byte b) + { + uint result = (uint)(signed ? ((sbyte)a * (sbyte)b) : (a * b)); + + // CF, OF = is upper half of result non-zero?; PF, AF, ZF, SF = undefined + SetClearFlagConditional(Flags.Overflow, (result >> 8) != 0); + SetClearFlagConditional(Flags.Carry, (result >> 8) != 0); + + return (ushort)result; + } + + private uint Mul16(bool signed, ushort a, ushort b) + { + uint result = (uint)(signed ? ((short)a * (short)b) : (a * b)); + + // CF, OF = is upper half of result non-zero?; PF, AF, ZF, SF = undefined + SetClearFlagConditional(Flags.Overflow, (result >> 16) != 0); + SetClearFlagConditional(Flags.Carry, (result >> 16) != 0); + + return (uint)result; + } + + private ushort Div8(bool signed, ushort a, byte b) + { + if (b == 0) + { + Interrupt(0); + return a; + } + + int quotient = signed ? ((short)a / (sbyte)b) : (a / b); + int remainder = signed ? ((short)a % (sbyte)b) : (a % b); + + // CF, PF, AF, ZF, SF, OF = undefined + + return (ushort)(((remainder & 0xFF) << 8) | (quotient & 0xFF)); + } + + private uint Div16(bool signed, uint a, ushort b) + { + if (b == 0) + { + Interrupt(0); + return a; + } + + int quotient = signed ? ((int)a / (short)b) : (int)(a / b); + int remainder = signed ? ((int)a % (short)b) : (int)(a % b); + + // CF, PF, AF, ZF, SF, OF = undefined + + return (uint)(((remainder & 0xFFFF) << 16) | (quotient & 0xFFFF)); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Implementations.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Implementations.cs.meta new file mode 100644 index 00000000..6d72ba97 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Implementations.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5828627e3b453af4f9d1280493414226 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Memory.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Memory.cs new file mode 100644 index 00000000..bec472ff --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Memory.cs @@ -0,0 +1,37 @@ +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + private byte ReadMemory8(ushort segment, ushort offset) + { + return machine.ReadMemory((uint)((segment << 4) + offset)); + } + + private ushort ReadMemory16(ushort segment, ushort offset) + { + return (ushort)((machine.ReadMemory((uint)((segment << 4) + offset + 1)) << 8) | machine.ReadMemory((uint)((segment << 4) + offset))); + } + + private void WriteMemory8(ushort segment, ushort offset, byte value) + { + machine.WriteMemory((uint)((segment << 4) + offset), value); + } + + private void WriteMemory16(ushort segment, ushort offset, ushort value) + { + machine.WriteMemory((uint)((segment << 4) + offset), (byte)(value & 0xFF)); + machine.WriteMemory((uint)((segment << 4) + offset + 1), (byte)(value >> 8)); + } + + private ushort ReadPort16(ushort port) + { + return (ushort)(machine.ReadPort((ushort)(port + 1)) << 8 | machine.ReadPort(port)); + } + + private void WritePort16(ushort port, ushort value) + { + machine.WritePort(port, (byte)(value & 0xFF)); + machine.WritePort((ushort)(port + 1), (byte)(value >> 8)); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Memory.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Memory.cs.meta new file mode 100644 index 00000000..dd169ae1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Memory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9fbe65ebef4c3df439fcb960d59e10f6 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Miscellaneous.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Miscellaneous.cs new file mode 100644 index 00000000..85fd8c26 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Miscellaneous.cs @@ -0,0 +1,48 @@ +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + private void Push(ushort value) + { + sp -= 2; + WriteMemory16(ss, sp, value); + } + + private ushort Pop() + { + var value = ReadMemory16(ss, sp); + sp += 2; + return value; + } + + private int Loop() + { + if (--cx.Word != 0) { ip = ReadOpcodeJb(); return 4; } + else { ip++; return 1; } + } + + private int LoopWhile(bool condition) + { + if (--cx.Word != 0 && condition) { ip = ReadOpcodeJb(); return 5; } + else { ip++; return 2; } + } + + private int JumpConditional(bool condition) + { + if (condition) { ip = ReadOpcodeJb(); return 4; } + else { ip++; return 1; } + } + + private static bool CalculateParity(int result) + { + int bitsSet = 0; + while (result != 0) { bitsSet += result & 0x01; result >>= 1; } + return bitsSet == 0 || (bitsSet % 2) == 0; + } + + private static void Exchange(ref ushort a, ref ushort b) + { + (b, a) = (a, b); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Miscellaneous.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Miscellaneous.cs.meta new file mode 100644 index 00000000..38796998 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Miscellaneous.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 253866b049a8cb445ab91a6c6cbb65e7 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.ModRM.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.ModRM.cs new file mode 100644 index 00000000..6e56bae2 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.ModRM.cs @@ -0,0 +1,103 @@ +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + ModRM modRm; + + private void ReadModRM() + { + if (modRm.IsSet) return; + + modRm.Set(ReadMemory8(cs, ip++)); + switch (modRm.Mod) + { + case ModRM.Modes.NoDisplacement: + switch (modRm.Mem) + { + case 0b000: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + si); break; + case 0b001: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + di); break; + case 0b010: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + si); break; + case 0b011: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + di); break; + case 0b100: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = si; break; + case 0b101: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = di; break; + case 0b110: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = ReadMemory16(cs, ip); ip += 2; break; + case 0b111: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = bx.Word; break; + } + break; + + case ModRM.Modes.OneByteDisplacement: + { + var displacement = (sbyte)ReadMemory8(cs, ip); + ip++; + switch (modRm.Mem) + { + case 0b000: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + si + displacement); break; + case 0b001: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + di + displacement); break; + case 0b010: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + si + displacement); break; + case 0b011: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + di + displacement); break; + case 0b100: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(si + displacement); break; + case 0b101: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(di + displacement); break; + case 0b110: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + displacement); break; + case 0b111: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + displacement); break; + } + } + break; + + case ModRM.Modes.TwoByteDisplacement: + { + var displacement = (short)ReadMemory16(cs, ip); + ip += 2; + switch (modRm.Mem) + { + case 0b000: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + si + displacement); break; + case 0b001: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + di + displacement); break; + case 0b010: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + si + displacement); break; + case 0b011: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + di + displacement); break; + case 0b100: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(si + displacement); break; + case 0b101: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(di + displacement); break; + case 0b110: modRm.Segment = GetSegmentViaOverride(SegmentNumber.SS); modRm.Offset = (ushort)(bp + displacement); break; + case 0b111: modRm.Segment = GetSegmentViaOverride(SegmentNumber.DS); modRm.Offset = (ushort)(bx.Word + displacement); break; + } + } + break; + } + } + + struct ModRM + { + public enum Modes : byte + { + NoDisplacement = 0b00, + OneByteDisplacement = 0b01, + TwoByteDisplacement = 0b10, + Register = 0b11 + } + + byte data; + + public Modes Mod => (Modes)((data >> 6) & 0b11); + public byte Reg => (byte)((data >> 3) & 0b111); + public byte Mem => (byte)((data >> 0) & 0b111); + + public ushort Segment, Offset; + + public bool IsSet; + + public void Set(byte value) + { + data = value; + + IsSet = true; + } + + public void Reset() + { + data = 0; + Segment = 0; + Offset = 0; + + IsSet = false; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.ModRM.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.ModRM.cs.meta new file mode 100644 index 00000000..f6572ae1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.ModRM.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a81e97a11c345494da1d600ffa5e81c2 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.OpcodeTable.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.OpcodeTable.cs new file mode 100644 index 00000000..ec4a90ad --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.OpcodeTable.cs @@ -0,0 +1,905 @@ +using System; + +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + delegate int Instruction(V30MZ cpu); + readonly static Instruction[] instructions = new Instruction[256] + { + /* 0x00 */ /* ADD Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.Add8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb())); return 1; }, + /* ADD Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.Add16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw())); return 1; }, + /* ADD Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.Add8(false, cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb())); return 1; }, + /* ADD Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.Add16(false, cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw())); return 1; }, + /* 0x04 */ /* ADD AL Ib */ (cpu) => { cpu.ax.Low = cpu.Add8(false, cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* ADD AX Iw */ (cpu) => { cpu.ax.Word = cpu.Add16(false, cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* PUSH ES */ (cpu) => { cpu.Push(cpu.es); return 1; }, + /* POP ES */ (cpu) => { cpu.es = cpu.Pop(); return 1; }, + /* 0x08 */ /* OR Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.Or8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb())); return 1; }, + /* OR Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.Or16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw())); return 1; }, + /* OR Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.Or8(cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb())); return 1; }, + /* OR Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.Or16(cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw())); return 1; }, + /* 0x0C */ /* OR AL Ib */ (cpu) => { cpu.ax.Low = cpu.Or8(cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* OR AX Iw */ (cpu) => { cpu.ax.Word = cpu.Or16(cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* PUSH CS */ (cpu) => { cpu.Push(cpu.cs); return 1; }, + /* (Invalid; NOP?) */ (cpu) => 3, + + /* 0x10 */ /* ADC Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.Add8(true, cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb())); return 1; }, + /* ADC Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.Add16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw())); return 1; }, + /* ADC Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.Add8(true, cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb())); return 1; }, + /* ADC Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.Add16(true, cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw())); return 1; }, + /* 0x14 */ /* ADC AL Ib */ (cpu) => { cpu.ax.Low = cpu.Add8(true, cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* ADC AX Iw */ (cpu) => { cpu.ax.Word = cpu.Add16(true, cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* PUSH SS */ (cpu) => { cpu.Push(cpu.ss); return 1; }, + /* POP SS */ (cpu) => { cpu.ss = cpu.Pop(); return 1; }, + /* 0x18 */ /* SBB Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.Sub8(true, cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb())); return 1; }, + /* SBB Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.Sub16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw())); return 1; }, + /* SBB Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.Sub8(true, cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb())); return 1; }, + /* SBB Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.Sub16(true, cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw())); return 1; }, + /* 0x1C */ /* SBB AL Ib */ (cpu) => { cpu.ax.Low = cpu.Sub8(true, cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* SBB AX Iw */ (cpu) => { cpu.ax.Word = cpu.Sub16(true, cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* PUSH DS */ (cpu) => { cpu.Push(cpu.ds); return 1; }, + /* POP DS */ (cpu) => { cpu.ds = cpu.Pop(); return 1; }, + + /* 0x20 */ /* AND Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.And8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb())); return 1; }, + /* AND Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.And16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw())); return 1; }, + /* AND Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.And8(cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb())); return 1; }, + /* AND Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.And16(cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw())); return 1; }, + /* 0x24 */ /* AND AL Ib */ (cpu) => { cpu.ax.Low = cpu.And8(cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* AND AX Iw */ (cpu) => { cpu.ax.Word = cpu.And16(cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* (Prefix ES) */ (cpu) => 0, + /* DAA */ (cpu) => { cpu.Daa(false); return 10; }, + /* 0x28 */ /* SUB Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.Sub8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb())); return 1; }, + /* SUB Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.Sub16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw())); return 1; }, + /* SUB Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.Sub8(false, cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb())); return 1; }, + /* SUB Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.Sub16(false, cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw())); return 1; }, + /* 0x2C */ /* SUB AL Ib */ (cpu) => { cpu.ax.Low = cpu.Sub8(false, cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* SUB AX Iw */ (cpu) => { cpu.ax.Word = cpu.Sub16(false, cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* (Prefix CS) */ (cpu) => 0, + /* DAS */ (cpu) => { cpu.Daa(true); return 10; }, + + /* 0x30 */ /* XOR Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.Xor8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb())); return 1; }, + /* XOR Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.Xor16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw())); return 1; }, + /* XOR Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.Xor8(cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb())); return 1; }, + /* XOR Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.Xor16(cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw())); return 1; }, + /* 0x34 */ /* XOR AL Ib */ (cpu) => { cpu.ax.Low = cpu.Xor8(cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* XOR AX Iw */ (cpu) => { cpu.ax.Word = cpu.Xor16(cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* (Prefix SS) */ (cpu) => 0, + /* AAA */ (cpu) => { cpu.Aaa(false); return 9; }, + /* 0x38 */ /* CMP Eb Gb */ (cpu) => { cpu.Sub8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeGb()); return 1; }, + /* CMP Ew Gw */ (cpu) => { cpu.Sub16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeGw()); return 1; }, + /* CMP Gb Eb */ (cpu) => { cpu.Sub8(false, cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb()); return 1; }, + /* CMP Gw Ew */ (cpu) => { cpu.Sub16(false, cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw()); return 1; }, + /* 0x3C */ /* CMP AL Ib */ (cpu) => { cpu.Sub8(false, cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* CMP AX Iw */ (cpu) => { cpu.Sub16(false, cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* (Prefix DS) */ (cpu) => 0, + /* AAS */ (cpu) => { cpu.Aaa(true); return 9; }, + + /* 0x40 */ /* INC AX */ (cpu) => { cpu.ax.Word = cpu.Inc16(cpu.ax.Word); return 1; }, + /* INC CX */ (cpu) => { cpu.cx.Word = cpu.Inc16(cpu.cx.Word); return 1; }, + /* INC DX */ (cpu) => { cpu.dx.Word = cpu.Inc16(cpu.dx.Word); return 1; }, + /* INC BX */ (cpu) => { cpu.bx.Word = cpu.Inc16(cpu.bx.Word); return 1; }, + /* 0x44 */ /* INC SP */ (cpu) => { cpu.sp = cpu.Inc16(cpu.sp); return 1; }, + /* INC BP */ (cpu) => { cpu.bp = cpu.Inc16(cpu.bp); return 1; }, + /* INC SI */ (cpu) => { cpu.si = cpu.Inc16(cpu.si); return 1; }, + /* INC DI */ (cpu) => { cpu.di = cpu.Inc16(cpu.di); return 1; }, + /* 0x48 */ /* DEC AX */ (cpu) => { cpu.ax.Word = cpu.Dec16(cpu.ax.Word); return 1; }, + /* DEC CX */ (cpu) => { cpu.cx.Word = cpu.Dec16(cpu.cx.Word); return 1; }, + /* DEC DX */ (cpu) => { cpu.dx.Word = cpu.Dec16(cpu.dx.Word); return 1; }, + /* DEC BX */ (cpu) => { cpu.bx.Word = cpu.Dec16(cpu.bx.Word); return 1; }, + /* 0x4C */ /* DEC SP */ (cpu) => { cpu.sp = cpu.Dec16(cpu.sp); return 1; }, + /* DEC BP */ (cpu) => { cpu.bp = cpu.Dec16(cpu.bp); return 1; }, + /* DEC SI */ (cpu) => { cpu.si = cpu.Dec16(cpu.si); return 1; }, + /* DEC DI */ (cpu) => { cpu.di = cpu.Dec16(cpu.di); return 1; }, + + /* 0x50 */ /* PUSH AX */ (cpu) => { cpu.Push(cpu.ax.Word); return 1; }, + /* PUSH CX */ (cpu) => { cpu.Push(cpu.cx.Word); return 1; }, + /* PUSH DX */ (cpu) => { cpu.Push(cpu.dx.Word); return 1; }, + /* PUSH BX */ (cpu) => { cpu.Push(cpu.bx.Word); return 1; }, + /* 0x54 */ /* PUSH SP */ (cpu) => { cpu.Push(cpu.sp); return 1; }, + /* PUSH BP */ (cpu) => { cpu.Push(cpu.bp); return 1; }, + /* PUSH SI */ (cpu) => { cpu.Push(cpu.si); return 1; }, + /* PUSH DI */ (cpu) => { cpu.Push(cpu.di); return 1; }, + /* 0x58 */ /* POP AX */ (cpu) => { cpu.ax.Word = cpu.Pop(); return 1; }, + /* POP CX */ (cpu) => { cpu.cx.Word = cpu.Pop(); return 1; }, + /* POP DX */ (cpu) => { cpu.dx.Word = cpu.Pop(); return 1; }, + /* POP BX */ (cpu) => { cpu.bx.Word = cpu.Pop(); return 1; }, + /* 0x5C */ /* POP SP */ (cpu) => { cpu.sp = cpu.Pop(); return 1; }, + /* POP BP */ (cpu) => { cpu.bp = cpu.Pop(); return 1; }, + /* POP SI */ (cpu) => { cpu.si = cpu.Pop(); return 1; }, + /* POP DI */ (cpu) => { cpu.di = cpu.Pop(); return 1; }, + + /* 0x60 */ /* PUSHA */ Opcode0x60, + /* POPA */ Opcode0x61, + /* BOUND Gw E */ Opcode0x62, + /* (Invalid; NOP?) */ (cpu) => 3, + /* 0x64 */ /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* 0x68 */ /* PUSH Iw */ (cpu) => { cpu.Push(cpu.ReadOpcodeIw()); return 1; }, + /* IMUL Gw Ew Iw */ (cpu) => { cpu.ReadModRM(); cpu.WriteOpcodeGw((ushort)cpu.Mul16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); return 4; }, + /* PUSH Ib */ (cpu) => { cpu.Push((ushort)(sbyte)cpu.ReadOpcodeIb()); return 1; }, + /* IMUL Gb Eb Ib */ (cpu) => { cpu.ReadModRM(); cpu.WriteOpcodeGw((ushort)cpu.Mul16(true, cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); return 4; }, + /* 0x6C */ /* INSB */ Opcode0x6C, + /* INSW */ Opcode0x6D, + /* OUTSB */ Opcode0x6E, + /* OUTSW */ Opcode0x6F, + + /* 0x70 */ /* JO */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Overflow)), + /* JNO */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Overflow)), + /* JB */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Carry)), + /* JNB */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Carry)), + /* 0x74 */ /* JZ */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Zero)), + /* JNZ */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Zero)), + /* JBE */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Carry) || cpu.IsFlagSet(Flags.Zero)), + /* JA */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Carry) && !cpu.IsFlagSet(Flags.Zero)), + /* 0x78 */ /* JS */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Sign)), + /* JNS */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Sign)), + /* JPE */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Parity)), + /* JPO */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Parity)), + /* 0x7C */ /* JL */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Zero) && cpu.IsFlagSet(Flags.Sign) != cpu.IsFlagSet(Flags.Overflow)), + /* JGE */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Zero) || cpu.IsFlagSet(Flags.Sign) == cpu.IsFlagSet(Flags.Overflow)), + /* JLE */ (cpu) => cpu.JumpConditional(cpu.IsFlagSet(Flags.Zero) || cpu.IsFlagSet(Flags.Sign) != cpu.IsFlagSet(Flags.Overflow)), + /* JG */ (cpu) => cpu.JumpConditional(!cpu.IsFlagSet(Flags.Zero) && cpu.IsFlagSet(Flags.Sign) == cpu.IsFlagSet(Flags.Overflow)), + + /* 0x80 */ /* GRP1 Eb Ib */ Opcode0x80, + /* GRP1 Ew Iw */ Opcode0x81, + /* GRP1 Eb Ib */ Opcode0x80, + /* GRP1 Ew Ib */ Opcode0x83, + /* 0x84 */ /* TEST Gb Eb */ (cpu) => { cpu.And8(cpu.ReadOpcodeGb(), cpu.ReadOpcodeEb()); return 1; }, + /* TEST Gw Ew */ (cpu) => { cpu.And16(cpu.ReadOpcodeGw(), cpu.ReadOpcodeEw()); return 1; }, + /* XCHG Gb Eb */ (cpu) => { var temp = cpu.ReadOpcodeGb(); cpu.WriteOpcodeGb(cpu.ReadOpcodeEb()); cpu.WriteOpcodeEb(temp); return 3; }, + /* XCHG Gw Ew */ (cpu) => { var temp = cpu.ReadOpcodeGw(); cpu.WriteOpcodeGw(cpu.ReadOpcodeEw()); cpu.WriteOpcodeEw(temp); return 3; }, + /* 0x88 */ /* MOV Eb Gb */ (cpu) => { cpu.WriteOpcodeEb(cpu.ReadOpcodeGb()); return 1; }, + /* MOV Ew Gw */ (cpu) => { cpu.WriteOpcodeEw(cpu.ReadOpcodeGw()); return 1; }, + /* MOV Gb Eb */ (cpu) => { cpu.WriteOpcodeGb(cpu.ReadOpcodeEb()); return 1; }, + /* MOV Gw Ew */ (cpu) => { cpu.WriteOpcodeGw(cpu.ReadOpcodeEw()); return 1; }, + /* 0x8C */ /* MOV Ew Sw */ (cpu) => { cpu.WriteOpcodeEw(cpu.ReadOpcodeSw()); return 1; }, + /* LEA Gw M */ Opcode0x8D, + /* MOV Sw Ew */ (cpu) => { cpu.WriteOpcodeSw(cpu.ReadOpcodeEw()); return 1; }, + /* POP Ew */ (cpu) => { cpu.WriteOpcodeEw(cpu.Pop()); return 1; }, + + /* 0x90 */ /* NOP (XCHG AX AX) */ (cpu) => { Exchange(ref cpu.ax.Word, ref cpu.ax.Word); return 3; }, + /* XCHG CX AX */ (cpu) => { Exchange(ref cpu.cx.Word, ref cpu.ax.Word); return 3; }, + /* XCHG DX AX */ (cpu) => { Exchange(ref cpu.dx.Word, ref cpu.ax.Word); return 3; }, + /* XCHG BX AX */ (cpu) => { Exchange(ref cpu.bx.Word, ref cpu.ax.Word); return 3; }, + /* 0x94 */ /* XCHG SP AX */ (cpu) => { Exchange(ref cpu.sp, ref cpu.ax.Word); return 3; }, + /* XCHG BP AX */ (cpu) => { Exchange(ref cpu.bp, ref cpu.ax.Word); return 3; }, + /* XCHG SI AX */ (cpu) => { Exchange(ref cpu.si, ref cpu.ax.Word); return 3; }, + /* XCHG DI AX */ (cpu) => { Exchange(ref cpu.di, ref cpu.ax.Word); return 3; }, + /* 0x98 */ /* CBW */ (cpu) => { cpu.ax.Word = (ushort)(sbyte)cpu.ax.Low; return 2; }, + /* CWD */ (cpu) => { var value = (uint)(short)cpu.ax.Word; cpu.dx.Word = (ushort)((value >> 16) & 0xFFFF); cpu.ax.Word = (ushort)((value >> 0) & 0xFFFF); return 2; }, + /* CALL Ap */ Opcode0x9A, + /* WAIT */ (cpu) => 1, + /* 0x9C */ /* PUSHF */ (cpu) => { cpu.Push((ushort)cpu.flags); return 1; }, + /* POPF */ (cpu) => { cpu.flags = (Flags)cpu.Pop(); return 1; }, + /* SAHF */ Opcode0x9E, + /* LAHF */ (cpu) => { cpu.ax.High = (byte)cpu.flags; return 2; }, + + /* 0xA0 */ /* MOV AL Aw */ (cpu) => { cpu.ax.Low = cpu.ReadMemory8(cpu.GetSegmentViaOverride(SegmentNumber.DS), cpu.ReadOpcodeIw()); return 1; }, + /* MOV AX Aw */ (cpu) => { cpu.ax.Word = cpu.ReadMemory16(cpu.GetSegmentViaOverride(SegmentNumber.DS), cpu.ReadOpcodeIw()); return 1; }, + /* MOV Aw AL */ (cpu) => { cpu.WriteMemory8(cpu.GetSegmentViaOverride(SegmentNumber.DS), cpu.ReadOpcodeIw(), cpu.ax.Low); return 1; }, + /* MOV Aw AX */ (cpu) => { cpu.WriteMemory16(cpu.GetSegmentViaOverride(SegmentNumber.DS), cpu.ReadOpcodeIw(), cpu.ax.Word); return 1; }, + /* 0xA4 */ /* MOVSB */ Opcode0xA4, + /* MOVSW */ Opcode0xA5, + /* CMPSB */ Opcode0xA6, + /* CMPSW */ Opcode0xA7, + /* 0xA8 */ /* TEST AL Ib */ (cpu) => { cpu.And8(cpu.ax.Low, cpu.ReadOpcodeIb()); return 1; }, + /* TEST AX Iw */ (cpu) => { cpu.And16(cpu.ax.Word, cpu.ReadOpcodeIw()); return 1; }, + /* STOSB */ Opcode0xAA, + /* STOSW */ Opcode0xAB, + /* 0xAC */ /* LODSB */ Opcode0xAC, + /* LODSW */ Opcode0xAD, + /* SCASB */ Opcode0xAE, + /* SCASW */ Opcode0xAF, + + /* 0xB0 */ /* MOV AL Ib */ (cpu) => { cpu.ax.Low = cpu.ReadOpcodeIb(); return 1; }, + /* MOV CL Ib */ (cpu) => { cpu.cx.Low = cpu.ReadOpcodeIb(); return 1; }, + /* MOV DL Ib */ (cpu) => { cpu.dx.Low = cpu.ReadOpcodeIb(); return 1; }, + /* MOV BL Ib */ (cpu) => { cpu.bx.Low = cpu.ReadOpcodeIb(); return 1; }, + /* 0xB4 */ /* MOV AH Ib */ (cpu) => { cpu.ax.High = cpu.ReadOpcodeIb(); return 1; }, + /* MOV CH Ib */ (cpu) => { cpu.cx.High = cpu.ReadOpcodeIb(); return 1; }, + /* MOV DH Ib */ (cpu) => { cpu.dx.High = cpu.ReadOpcodeIb(); return 1; }, + /* MOV BH Ib */ (cpu) => { cpu.bx.High = cpu.ReadOpcodeIb(); return 1; }, + /* 0xB8 */ /* MOV AX Iw */ (cpu) => { cpu.ax.Word = cpu.ReadOpcodeIw(); return 1; }, + /* MOV CX Iw */ (cpu) => { cpu.cx.Word = cpu.ReadOpcodeIw(); return 1; }, + /* MOV DX Iw */ (cpu) => { cpu.dx.Word = cpu.ReadOpcodeIw(); return 1; }, + /* MOV BX Iw */ (cpu) => { cpu.bx.Word = cpu.ReadOpcodeIw(); return 1; }, + /* 0xBC */ /* MOV SP Iw */ (cpu) => { cpu.sp = cpu.ReadOpcodeIw(); return 1; }, + /* MOV BP Iw */ (cpu) => { cpu.bp = cpu.ReadOpcodeIw(); return 1; }, + /* MOV SI Iw */ (cpu) => { cpu.si = cpu.ReadOpcodeIw(); return 1; }, + /* MOV DI Iw */ (cpu) => { cpu.di = cpu.ReadOpcodeIw(); return 1; }, + + /* 0xC0 */ /* GRP2 Eb Ib */ Opcode0xC0, + /* GRP2 Ew Ib */ Opcode0xC1, + /* RET Iw */ (cpu) => { var offset = cpu.ReadOpcodeIw(); cpu.ip = cpu.Pop(); cpu.sp += offset; return 5; }, + /* RET */ (cpu) => { cpu.ip = cpu.Pop(); return 5; }, + /* 0xC4 */ /* LES Gw Mp */ Opcode0xC4, + /* LDS Gw Mp */ Opcode0xC5, + /* MOV Eb Ib */ (cpu) => { cpu.ReadModRM(); cpu.WriteOpcodeEb(cpu.ReadOpcodeIb()); return 1; }, + /* MOV Ew Iw */ (cpu) => { cpu.ReadModRM(); cpu.WriteOpcodeEw(cpu.ReadOpcodeIw()); return 1; }, + /* 0xC8 */ /* ENTER */ Opcode0xC8, + /* LEAVE */ (cpu) => { cpu.sp = cpu.bp; cpu.bp = cpu.Pop(); return 1; }, + /* RETF Iw */ (cpu) => { var offset = cpu.ReadOpcodeIw(); cpu.ip = cpu.Pop(); cpu.cs = cpu.Pop(); cpu.sp += offset; return 8; }, + /* RETF */ (cpu) => { cpu.ip = cpu.Pop(); cpu.cs = cpu.Pop(); return 7; }, + /* 0xCC */ /* INT 3 */ (cpu) => { cpu.Interrupt(3); return 8; }, + /* INT Ib */ (cpu) => { cpu.Interrupt(cpu.ReadOpcodeIb()); return 9; }, + /* INTO */ (cpu) => { if (cpu.IsFlagSet(Flags.Overflow)) cpu.Interrupt(4); return 5; }, + /* IRET */ (cpu) => { cpu.ip = cpu.Pop(); cpu.cs = cpu.Pop(); cpu.flags = (Flags)cpu.Pop(); return 9; }, + + /* 0xD0 */ /* GRP2 Eb 1 */ Opcode0xD0, + /* GRP2 Ew 1 */ Opcode0xD1, + /* GRP2 Eb CL */ Opcode0xD2, + /* GRP2 Ew CL */ Opcode0xD3, + /* 0xD4 */ /* AAM */ Opcode0xD4, + /* AAD */ Opcode0xD5, + /* (undocumented XLAT) */ (cpu) => { cpu.ax.Low = cpu.ReadMemory8(cpu.GetSegmentViaOverride(SegmentNumber.DS), (ushort)(cpu.bx.Word + cpu.ax.Low)); return 4; }, + /* XLAT */ (cpu) => { cpu.ax.Low = cpu.ReadMemory8(cpu.GetSegmentViaOverride(SegmentNumber.DS), (ushort)(cpu.bx.Word + cpu.ax.Low)); return 4; }, + /* 0xD8 */ /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* 0xDC */ /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + /* (Invalid; NOP?) */ (cpu) => 3, + + /* 0xE0 */ /* LOOPNZ Jb */ (cpu) => { return cpu.LoopWhile(!cpu.IsFlagSet(Flags.Zero)); }, + /* LOOPZ Jb */ (cpu) => { return cpu.LoopWhile(cpu.IsFlagSet(Flags.Zero)); }, + /* LOOP Jb */ (cpu) => { return cpu.Loop(); }, + /* JCXZ */ (cpu) => { return cpu.JumpConditional(cpu.cx.Word == 0); }, + /* 0xE4 */ /* IN Ib AL */ (cpu) => { cpu.ax.Low = cpu.machine.ReadPort(cpu.ReadOpcodeIb()); return 6; }, + /* IN Ib AX */ (cpu) => { cpu.ax.Word = cpu.ReadPort16(cpu.ReadOpcodeIb()); return 6; }, + /* OUT Ib AL */ (cpu) => { cpu.machine.WritePort(cpu.ReadOpcodeIb(), cpu.ax.Low); return 6; }, + /* OUT Ib AX */ (cpu) => { cpu.WritePort16(cpu.ReadOpcodeIb(), cpu.ax.Word); return 6; }, + /* 0xE8 */ /* CALL Jv */ (cpu) => { var offset = cpu.ReadOpcodeIw(); cpu.Push(cpu.ip); cpu.ip += offset; return 4; }, + /* JMP Jv */ (cpu) => { var offset = cpu.ReadOpcodeIw(); cpu.ip += offset; return 3; }, + /* JMP Ap */ (cpu) => { var newIp = cpu.ReadOpcodeIw(); var newCs = cpu.ReadOpcodeIw(); cpu.ip = newIp; cpu.cs = newCs; return 5; }, + /* JMP Jb */ (cpu) => { cpu.ip = cpu.ReadOpcodeJb(); return 3; }, + /* 0xEC */ /* IN AL DX */ (cpu) => { cpu.ax.Low = cpu.machine.ReadPort(cpu.dx.Word); return 4; }, + /* IN AX DX */ (cpu) => { cpu.ax.Word = cpu.ReadPort16(cpu.dx.Word); return 4; }, + /* OUT DX AL */ (cpu) => { cpu.machine.WritePort(cpu.dx.Word, cpu.ax.Low); return 4; }, + /* OUT DX AX */ (cpu) => { cpu.WritePort16(cpu.dx.Word, cpu.ax.Word); return 4; }, + + /* 0xF0 */ /* (Prefix LOCK) */ (cpu) => 0, + /* (Invalid; NOP?) */ (cpu) => 3, + /* (Prefix REPNZ) */ (cpu) => 0, + /* (Prefix REPZ) */ (cpu) => 0, + /* 0xF4 */ /* HLT */ (cpu) => { cpu.halted = true; return 8; }, + /* CMC */ (cpu) => { cpu.SetClearFlagConditional(Flags.Carry, !cpu.IsFlagSet(Flags.Carry)); return 4; }, + /* GRP3 Eb */ Opcode0xF6, + /* GRP3 Ew */ Opcode0xF7, + /* 0xF8 */ /* CLC */ (cpu) => { cpu.ClearFlags(Flags.Carry); return 4; }, + /* STC */ (cpu) => { cpu.SetFlags(Flags.Carry); return 4; }, + /* CLI */ (cpu) => { cpu.ClearFlags(Flags.InterruptEnable); return 4; }, + /* STI */ (cpu) => { cpu.SetFlags(Flags.InterruptEnable); return 4; }, + /* 0xFC */ /* CLD */ (cpu) => { cpu.ClearFlags(Flags.Direction); return 4; }, + /* STD */ (cpu) => { cpu.SetFlags(Flags.Direction); return 4; }, + /* GRP4 Eb */ Opcode0xFE, + /* GRP4 Ew */ Opcode0xFF + }; + + private static int Opcode0x60(V30MZ cpu) + { + /* PUSHA */ + var oldSp = cpu.sp; + cpu.Push(cpu.ax.Word); + cpu.Push(cpu.cx.Word); + cpu.Push(cpu.dx.Word); + cpu.Push(cpu.bx.Word); + cpu.Push(oldSp); + cpu.Push(cpu.bp); + cpu.Push(cpu.si); + cpu.Push(cpu.di); + return 8; + } + + private static int Opcode0x61(V30MZ cpu) + { + /* POPA */ + cpu.di = cpu.Pop(); + cpu.si = cpu.Pop(); + cpu.bp = cpu.Pop(); + cpu.Pop(); /* don't restore SP */ + cpu.bx.Word = cpu.Pop(); + cpu.dx.Word = cpu.Pop(); + cpu.cx.Word = cpu.Pop(); + cpu.ax.Word = cpu.Pop(); + return 8; + } + + private static int Opcode0x62(V30MZ cpu) + { + /* BOUND Gw E */ + cpu.ReadModRM(); + var lo = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 0)); + var hi = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 2)); + var reg = cpu.GetRegister16((RegisterNumber16)cpu.modRm.Mem); + if (reg < lo || reg > hi) cpu.Interrupt(5); + return 12; + } + + private static int Opcode0x6C(V30MZ cpu) + { + /* INSB */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.InString(false); + else if (cpu.cx.Word != 0) + { + do { cpu.InString(false); cycles += 5; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0x6D(V30MZ cpu) + { + /* INSW */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.InString(true); + else if (cpu.cx.Word != 0) + { + do { cpu.InString(true); cycles += 5; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0x6E(V30MZ cpu) + { + /* OUTSB */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.OutString(false); + else if (cpu.cx.Word != 0) + { + do { cpu.OutString(false); cycles += 6; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0x6F(V30MZ cpu) + { + /* OUTSW */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.OutString(true); + else if (cpu.cx.Word != 0) + { + do { cpu.OutString(true); cycles += 6; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0x80(V30MZ cpu) + { + /* GRP1 Eb Ib */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ADD */ cpu.WriteOpcodeEb(cpu.Add8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x1: /* OR */ cpu.WriteOpcodeEb(cpu.Or8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x2: /* ADC */ cpu.WriteOpcodeEb(cpu.Add8(true, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x3: /* SBB */ cpu.WriteOpcodeEb(cpu.Sub8(true, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x4: /* AND */ cpu.WriteOpcodeEb(cpu.And8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x5: /* SUB */ cpu.WriteOpcodeEb(cpu.Sub8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x6: /* XOR */ cpu.WriteOpcodeEb(cpu.Xor8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x7: /* CMP */ cpu.Sub8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb()); cycles = 1; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0x81(V30MZ cpu) + { + /* GRP1 Ew Iw */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ADD */ cpu.WriteOpcodeEw(cpu.Add16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); cycles = 1; break; + case 0x1: /* OR */ cpu.WriteOpcodeEw(cpu.Or16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); cycles = 1; break; + case 0x2: /* ADC */ cpu.WriteOpcodeEw(cpu.Add16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); cycles = 1; break; + case 0x3: /* SBB */ cpu.WriteOpcodeEw(cpu.Sub16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); cycles = 1; break; + case 0x4: /* AND */ cpu.WriteOpcodeEw(cpu.And16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); cycles = 1; break; + case 0x5: /* SUB */ cpu.WriteOpcodeEw(cpu.Sub16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); cycles = 1; break; + case 0x6: /* XOR */ cpu.WriteOpcodeEw(cpu.Xor16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw())); cycles = 1; break; + case 0x7: /* CMP */ cpu.Sub16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw()); cycles = 1; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0x83(V30MZ cpu) + { + /* GRP1 Ew Ib */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ADD */ cpu.WriteOpcodeEw(cpu.Add16(false, cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x1: /* OR */ cpu.WriteOpcodeEw(cpu.Or16(cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x2: /* ADC */ cpu.WriteOpcodeEw(cpu.Add16(true, cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x3: /* SBB */ cpu.WriteOpcodeEw(cpu.Sub16(true, cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x4: /* AND */ cpu.WriteOpcodeEw(cpu.And16(cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x5: /* SUB */ cpu.WriteOpcodeEw(cpu.Sub16(false, cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x6: /* XOR */ cpu.WriteOpcodeEw(cpu.Xor16(cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb())); cycles = 1; break; + case 0x7: /* CMP */ cpu.Sub16(false, cpu.ReadOpcodeEw(), (ushort)(sbyte)cpu.ReadOpcodeIb()); cycles = 1; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0x8D(V30MZ cpu) + { + /* LEA Gw M */ + cpu.ReadModRM(); + if (cpu.modRm.Mod != ModRM.Modes.Register) + { + cpu.WriteOpcodeGw(cpu.modRm.Offset); + } + return 8; + } + + private static int Opcode0x9A(V30MZ cpu) + { + /* CALL Ap */ + var newIp = cpu.ReadOpcodeIw(); + var newCs = cpu.ReadOpcodeIw(); + + cpu.Push(cpu.cs); + cpu.Push(cpu.ip); + + cpu.ip = newIp; + cpu.cs = newCs; + + return 9; + } + + private static int Opcode0x9E(V30MZ cpu) + { + /* SAHF */ + cpu.SetClearFlagConditional(Flags.Sign, ((Flags)cpu.ax.High & Flags.Sign) == Flags.Sign); + cpu.SetClearFlagConditional(Flags.Zero, ((Flags)cpu.ax.High & Flags.Zero) == Flags.Zero); + cpu.SetClearFlagConditional(Flags.Auxiliary, ((Flags)cpu.ax.High & Flags.Auxiliary) == Flags.Auxiliary); + cpu.SetClearFlagConditional(Flags.Parity, ((Flags)cpu.ax.High & Flags.Parity) == Flags.Parity); + cpu.SetClearFlagConditional(Flags.Carry, ((Flags)cpu.ax.High & Flags.Carry) == Flags.Carry); + return 4; + } + + private static int Opcode0xA4(V30MZ cpu) + { + /* MOVSB */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.MoveString(false); + else if (cpu.cx.Word != 0) + { + do { cpu.MoveString(false); cycles += 5; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0xA5(V30MZ cpu) + { + /* MOVSW */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.MoveString(true); + else if (cpu.cx.Word != 0) + { + do { cpu.MoveString(true); cycles += 5; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0xA6(V30MZ cpu) + { + /* CMPSB */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.CompareString(false); + else if (cpu.cx.Word != 0) + { + do { cpu.CompareString(false); cycles += 4; } while (--cpu.cx.Word != 0 && (cpu.prefixRepeatOnNotEqual ? !cpu.IsFlagSet(Flags.Zero) : cpu.IsFlagSet(Flags.Zero))); + } + return cycles; + } + + private static int Opcode0xA7(V30MZ cpu) + { + /* CMPSW */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.CompareString(true); + else if (cpu.cx.Word != 0) + { + do { cpu.CompareString(true); cycles += 4; } while (--cpu.cx.Word != 0 && (cpu.prefixRepeatOnNotEqual ? !cpu.IsFlagSet(Flags.Zero) : cpu.IsFlagSet(Flags.Zero))); + } + return cycles; + } + + private static int Opcode0xAA(V30MZ cpu) + { + /* STOSB */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.StoreString(false); + else if (cpu.cx.Word != 0) + { + do { cpu.StoreString(false); cycles += 2; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0xAB(V30MZ cpu) + { + /* STOSW */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.StoreString(true); + else if (cpu.cx.Word != 0) + { + do { cpu.StoreString(true); cycles += 2; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0xAC(V30MZ cpu) + { + /* LODSB */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.LoadString(false); + else if (cpu.cx.Word != 0) + { + do { cpu.LoadString(false); cycles += 2; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0xAD(V30MZ cpu) + { + /* LODSW */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.LoadString(true); + else if (cpu.cx.Word != 0) + { + do { cpu.LoadString(true); cycles += 2; } while (--cpu.cx.Word != 0); + } + return cycles; + } + + private static int Opcode0xAE(V30MZ cpu) + { + /* SCASB */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.ScanString(false); + else if (cpu.cx.Word != 0) + { + do { cpu.ScanString(false); cycles += 3; } while (--cpu.cx.Word != 0 && (cpu.prefixRepeatOnNotEqual ? !cpu.IsFlagSet(Flags.Zero) : cpu.IsFlagSet(Flags.Zero))); + } + return cycles; + } + + private static int Opcode0xAF(V30MZ cpu) + { + /* SCASW */ + var cycles = 5; + if (!cpu.prefixHasRepeat) + cpu.ScanString(true); + else if (cpu.cx.Word != 0) + { + do { cpu.ScanString(true); cycles += 3; } while (--cpu.cx.Word != 0 && (cpu.prefixRepeatOnNotEqual ? !cpu.IsFlagSet(Flags.Zero) : cpu.IsFlagSet(Flags.Zero))); + } + return cycles; + } + + private static int Opcode0xC0(V30MZ cpu) + { + /* GRP2 Eb Ib */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ROL */ cpu.WriteOpcodeEb(cpu.Rol8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x1: /* ROR */ cpu.WriteOpcodeEb(cpu.Ror8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x2: /* RCL */ cpu.WriteOpcodeEb(cpu.Rol8(true, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x3: /* RCR */ cpu.WriteOpcodeEb(cpu.Ror8(true, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x4: /* SHL */ cpu.WriteOpcodeEb(cpu.Shl8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x5: /* SHR */ cpu.WriteOpcodeEb(cpu.Shr8(false, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x6: /* --- */ cycles = 3; break; + case 0x7: /* SAR */ cpu.WriteOpcodeEb(cpu.Shr8(true, cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb())); cycles = 3; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xC1(V30MZ cpu) + { + /* GRP2 Ew Ib */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ROL */ cpu.WriteOpcodeEw(cpu.Rol16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x1: /* ROR */ cpu.WriteOpcodeEw(cpu.Ror16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x2: /* RCL */ cpu.WriteOpcodeEw(cpu.Rol16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x3: /* RCR */ cpu.WriteOpcodeEw(cpu.Ror16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x4: /* SHL */ cpu.WriteOpcodeEw(cpu.Shl16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x5: /* SHR */ cpu.WriteOpcodeEw(cpu.Shr16(false, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIb())); cycles = 3; break; + case 0x6: /* --- */ cycles = 3; break; + case 0x7: /* SAR */ cpu.WriteOpcodeEw(cpu.Shr16(true, cpu.ReadOpcodeEw(), cpu.ReadOpcodeIb())); cycles = 3; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xC4(V30MZ cpu) + { + /* LES Gw Mp */ + cpu.ReadModRM(); + if (cpu.modRm.Mod != ModRM.Modes.Register) + { + cpu.WriteOpcodeGw(cpu.ReadOpcodeEw()); + cpu.es = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 2)); + } + return 8; + } + + private static int Opcode0xC5(V30MZ cpu) + { + /* LDS Gw Mp */ + cpu.ReadModRM(); + if (cpu.modRm.Mod != ModRM.Modes.Register) + { + cpu.WriteOpcodeGw(cpu.ReadOpcodeEw()); + cpu.ds = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 2)); + } + return 8; + } + + private static int Opcode0xC8(V30MZ cpu) + { + /* ENTER */ + var offset = cpu.ReadOpcodeIw(); + var length = (byte)(cpu.ReadOpcodeIb() & 0x1F); + + cpu.Push(cpu.bp); + cpu.bp = cpu.sp; + cpu.sp -= offset; + + if (length != 0) + { + for (var i = 1; i < length; i++) + cpu.Push(cpu.ReadMemory16(cpu.ss, (ushort)(cpu.bp - i * 2))); + cpu.Push(cpu.bp); + } + return 7; + } + + private static int Opcode0xD0(V30MZ cpu) + { + /* GRP2 Eb 1 */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ROL */ cpu.WriteOpcodeEb(cpu.Rol8(false, cpu.ReadOpcodeEb(), 1)); cycles = 1; break; + case 0x1: /* ROR */ cpu.WriteOpcodeEb(cpu.Ror8(false, cpu.ReadOpcodeEb(), 1)); cycles = 1; break; + case 0x2: /* RCL */ cpu.WriteOpcodeEb(cpu.Rol8(true, cpu.ReadOpcodeEb(), 1)); cycles = 1; break; + case 0x3: /* RCR */ cpu.WriteOpcodeEb(cpu.Ror8(true, cpu.ReadOpcodeEb(), 1)); cycles = 1; break; + case 0x4: /* SHL */ cpu.WriteOpcodeEb(cpu.Shl8(cpu.ReadOpcodeEb(), 1)); cycles = 1; break; + case 0x5: /* SHR */ cpu.WriteOpcodeEb(cpu.Shr8(false, cpu.ReadOpcodeEb(), 1)); cycles = 1; break; + case 0x6: /* --- */ cycles = 3; break; + case 0x7: /* SAR */ cpu.WriteOpcodeEb(cpu.Shr8(true, cpu.ReadOpcodeEb(), 1)); cycles = 1; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xD1(V30MZ cpu) + { + /* GRP2 Ew 1 */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ROL */ cpu.WriteOpcodeEw(cpu.Rol16(false, cpu.ReadOpcodeEw(), 1)); cycles = 1; break; + case 0x1: /* ROR */ cpu.WriteOpcodeEw(cpu.Ror16(false, cpu.ReadOpcodeEw(), 1)); cycles = 1; break; + case 0x2: /* RCL */ cpu.WriteOpcodeEw(cpu.Rol16(true, cpu.ReadOpcodeEw(), 1)); cycles = 1; break; + case 0x3: /* RCR */ cpu.WriteOpcodeEw(cpu.Ror16(true, cpu.ReadOpcodeEw(), 1)); cycles = 1; break; + case 0x4: /* SHL */ cpu.WriteOpcodeEw(cpu.Shl16(cpu.ReadOpcodeEw(), 1)); cycles = 1; break; + case 0x5: /* SHR */ cpu.WriteOpcodeEw(cpu.Shr16(false, cpu.ReadOpcodeEw(), 1)); cycles = 1; break; + case 0x6: /* --- */ cycles = 3; break; + case 0x7: /* SAR */ cpu.WriteOpcodeEw(cpu.Shr16(true, cpu.ReadOpcodeEw(), 1)); cycles = 1; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xD2(V30MZ cpu) + { + /* GRP2 Eb CL */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ROL */ cpu.WriteOpcodeEb(cpu.Rol8(false, cpu.ReadOpcodeEb(), cpu.cx.Low)); cycles = 3; break; + case 0x1: /* ROR */ cpu.WriteOpcodeEb(cpu.Ror8(false, cpu.ReadOpcodeEb(), cpu.cx.Low)); cycles = 3; break; + case 0x2: /* RCL */ cpu.WriteOpcodeEb(cpu.Rol8(true, cpu.ReadOpcodeEb(), cpu.cx.Low)); cycles = 3; break; + case 0x3: /* RCR */ cpu.WriteOpcodeEb(cpu.Ror8(true, cpu.ReadOpcodeEb(), cpu.cx.Low)); cycles = 3; break; + case 0x4: /* SHL */ cpu.WriteOpcodeEb(cpu.Shl8(cpu.ReadOpcodeEb(), cpu.cx.Low)); cycles = 3; break; + case 0x5: /* SHR */ cpu.WriteOpcodeEb(cpu.Shr8(false, cpu.ReadOpcodeEb(), cpu.cx.Low)); cycles = 3; break; + case 0x6: /* --- */ cycles = 3; break; + case 0x7: /* SAR */ cpu.WriteOpcodeEb(cpu.Shr8(true, cpu.ReadOpcodeEb(), cpu.cx.Low)); cycles = 3; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xD3(V30MZ cpu) + { + /* GRP2 Ew CL */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* ROL */ cpu.WriteOpcodeEw(cpu.Rol16(false, cpu.ReadOpcodeEw(), cpu.cx.Low)); cycles = 3; break; + case 0x1: /* ROR */ cpu.WriteOpcodeEw(cpu.Ror16(false, cpu.ReadOpcodeEw(), cpu.cx.Low)); cycles = 3; break; + case 0x2: /* RCL */ cpu.WriteOpcodeEw(cpu.Rol16(true, cpu.ReadOpcodeEw(), cpu.cx.Low)); cycles = 3; break; + case 0x3: /* RCR */ cpu.WriteOpcodeEw(cpu.Ror16(true, cpu.ReadOpcodeEw(), cpu.cx.Low)); cycles = 3; break; + case 0x4: /* SHL */ cpu.WriteOpcodeEw(cpu.Shl16(cpu.ReadOpcodeEw(), cpu.cx.Low)); cycles = 3; break; + case 0x5: /* SHR */ cpu.WriteOpcodeEw(cpu.Shr16(false, cpu.ReadOpcodeEw(), cpu.cx.Low)); cycles = 3; break; + case 0x6: /* --- */ cycles = 3; break; + case 0x7: /* SAR */ cpu.WriteOpcodeEw(cpu.Shr16(true, cpu.ReadOpcodeEw(), cpu.cx.Low)); cycles = 3; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + /* NOTE: AAM/AAD: While NEC V20/V30 do ignore immediate & always use base 10 (1), V30MZ does *not* ignore the immediate (2) + * (1): https://www.vcfed.org/forum/forum/technical-support/vintage-computer-programming/36551/ + * (2): https://github.com/xdanieldzd/StoicGoose/issues/9 + */ + + private static int Opcode0xD4(V30MZ cpu) + { + /* AAM */ + var value = cpu.ReadOpcodeIb(); + if (value == 0) + { + /* Division-by-zero exception */ + cpu.Interrupt(0); + } + else + { + cpu.ax.High = (byte)(cpu.ax.Low / value); + cpu.ax.Low = (byte)(cpu.ax.Low % value); + cpu.SetClearFlagConditional(Flags.Parity, CalculateParity(cpu.ax.Low)); + cpu.SetClearFlagConditional(Flags.Zero, (cpu.ax.Word & 0xFFFF) == 0); + cpu.SetClearFlagConditional(Flags.Sign, (cpu.ax.Word & 0x8000) != 0); + } + return 16; + } + + private static int Opcode0xD5(V30MZ cpu) + { + /* AAD */ + var value = cpu.ReadOpcodeIb(); + cpu.ax.Low = (byte)(cpu.ax.High * value + cpu.ax.Low); + cpu.ax.High = 0; + cpu.SetClearFlagConditional(Flags.Parity, CalculateParity(cpu.ax.Low)); + cpu.SetClearFlagConditional(Flags.Zero, (cpu.ax.Word & 0xFFFF) == 0); + cpu.SetClearFlagConditional(Flags.Sign, (cpu.ax.Word & 0x8000) != 0); + return 6; + } + + private static int Opcode0xF6(V30MZ cpu) + { + /* GRP3 Eb */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* TEST */ cpu.And8(cpu.ReadOpcodeEb(), cpu.ReadOpcodeIb()); cycles = 1; break; + case 0x1: /* --- */ cycles = 3; break; + case 0x2: /* NOT */ cpu.WriteOpcodeEb((byte)~cpu.ReadOpcodeEb()); cycles = 1; break; + case 0x3: /* NEG */ cpu.WriteOpcodeEb(cpu.Neg8(cpu.ReadOpcodeEb())); cycles = 1; break; + case 0x4: /* MUL */ cpu.ax.Word = cpu.Mul8(false, cpu.ax.Low, cpu.ReadOpcodeEb()); cycles = 3; break; + case 0x5: /* IMUL */ cpu.ax.Word = cpu.Mul8(true, cpu.ax.Low, cpu.ReadOpcodeEb()); cycles = 3; break; + case 0x6: /* DIV */ cpu.ax.Word = cpu.Div8(false, cpu.ax.Word, cpu.ReadOpcodeEb()); cycles = 15; break; + case 0x7: /* IDIV */ cpu.ax.Word = cpu.Div8(true, cpu.ax.Word, cpu.ReadOpcodeEb()); cycles = 17; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xF7(V30MZ cpu) + { + /* GRP3 Ew */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* TEST */ cpu.And16(cpu.ReadOpcodeEw(), cpu.ReadOpcodeIw()); cycles = 1; break; + case 0x1: /* --- */ cycles = 3; break; + case 0x2: /* NOT */ cpu.WriteOpcodeEw((ushort)~cpu.ReadOpcodeEw()); cycles = 1; break; + case 0x3: /* NEG */ cpu.WriteOpcodeEw(cpu.Neg16(cpu.ReadOpcodeEw())); cycles = 1; break; + case 0x4: /* MUL */ { var result = cpu.Mul16(false, cpu.ax.Word, cpu.ReadOpcodeEw()); cpu.dx.Word = (ushort)((result >> 16) & 0xFFFF); cpu.ax.Word = (ushort)((result >> 0) & 0xFFFF); cycles = 3; } break; + case 0x5: /* IMUL */ { var result = cpu.Mul16(true, cpu.ax.Word, cpu.ReadOpcodeEw()); cpu.dx.Word = (ushort)((result >> 16) & 0xFFFF); cpu.ax.Word = (ushort)((result >> 0) & 0xFFFF); cycles = 3; } break; + case 0x6: /* DIV */ { var result = cpu.Div16(false, (uint)(cpu.dx.Word << 16 | cpu.ax.Word), cpu.ReadOpcodeEw()); cpu.dx.Word = (ushort)((result >> 16) & 0xFFFF); cpu.ax.Word = (ushort)((result >> 0) & 0xFFFF); cycles = 23; } break; + case 0x7: /* IDIV */ { var result = cpu.Div16(true, (uint)(cpu.dx.Word << 16 | cpu.ax.Word), cpu.ReadOpcodeEw()); cpu.dx.Word = (ushort)((result >> 16) & 0xFFFF); cpu.ax.Word = (ushort)((result >> 0) & 0xFFFF); cycles = 24; } break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xFE(V30MZ cpu) + { + /* GRP4 Eb */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* INC */ cpu.WriteOpcodeEb(cpu.Inc8(cpu.ReadOpcodeEb())); cycles = 1; break; + case 0x1: /* DEC */ cpu.WriteOpcodeEb(cpu.Dec8(cpu.ReadOpcodeEb())); cycles = 1; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + + private static int Opcode0xFF(V30MZ cpu) + { + /* GRP4 Ew */ + int cycles; + cpu.ReadModRM(); + switch (cpu.modRm.Reg) + { + case 0x0: /* INC */ cpu.WriteOpcodeEw(cpu.Inc16(cpu.ReadOpcodeEw())); cycles = 1; break; + case 0x1: /* DEC */ cpu.WriteOpcodeEw(cpu.Dec16(cpu.ReadOpcodeEw())); cycles = 1; break; + case 0x2: /* CALL */ + { + var offset = cpu.ReadOpcodeEw(); + cpu.Push(cpu.ip); + cpu.ip = offset; + cycles = 5; + } + break; + case 0x3: /* CALL Mp */ + { + if (cpu.modRm.Mod != ModRM.Modes.Register) + { + var offset = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 0)); + var segment = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 2)); + cpu.Push(cpu.cs); + cpu.Push(cpu.ip); + cpu.cs = segment; + cpu.ip = offset; + } + cycles = 11; + } + break; + case 0x4: /* JMP */ cpu.ip = cpu.ReadOpcodeEw(); cycles = 4; break; + case 0x5: /* JMP Mp */ + { + if (cpu.modRm.Mod != ModRM.Modes.Register) + { + cpu.ip = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 0)); + cpu.cs = cpu.ReadMemory16(cpu.modRm.Segment, (ushort)(cpu.modRm.Offset + 2)); + } + cycles = 9; + } + break; + case 0x6: /* PUSH */ cpu.Push(cpu.ReadOpcodeEw()); cycles = 3; break; + case 0x7: /* --- */ cycles = 3; break; + default: throw new Exception("Invalid opcode"); + } + return cycles; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.OpcodeTable.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.OpcodeTable.cs.meta new file mode 100644 index 00000000..038ed7ce --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.OpcodeTable.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7f721c42886f2904c9a7eda1c94b6d14 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Prefixes.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Prefixes.cs new file mode 100644 index 00000000..053e42cf --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Prefixes.cs @@ -0,0 +1,71 @@ +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + SegmentNumber prefixSegOverride; + bool prefixHasRepeat; + bool prefixRepeatOnNotEqual; + + private void ResetPrefixes() + { + prefixSegOverride = SegmentNumber.Unset; + prefixHasRepeat = false; + prefixRepeatOnNotEqual = false; + } + + private bool HandlePrefixes(byte op) + { + var isOpcode = true; + + switch (op) + { + /* Prefixes */ + case 0x26: + /* :ES */ + prefixSegOverride = SegmentNumber.ES; + isOpcode = false; + break; + + case 0x2E: + /* :CS */ + prefixSegOverride = SegmentNumber.CS; + isOpcode = false; + break; + + case 0x36: + /* :SS */ + prefixSegOverride = SegmentNumber.SS; + isOpcode = false; + break; + + case 0x3E: + /* :DS */ + prefixSegOverride = SegmentNumber.DS; + isOpcode = false; + break; + + case 0xF0: + /* LOCK */ + //TODO: implement?? + isOpcode = false; + break; + + case 0xF2: + /* REPNE */ + prefixHasRepeat = true; + prefixRepeatOnNotEqual = true; + isOpcode = false; + break; + + case 0xF3: + /* REP/REPE */ + prefixHasRepeat = true; + prefixRepeatOnNotEqual = false; + isOpcode = false; + break; + } + + return isOpcode; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Prefixes.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Prefixes.cs.meta new file mode 100644 index 00000000..fa2df8ff --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Prefixes.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dff52160b1aa55c48a07722be9d654ff \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Registers.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Registers.cs new file mode 100644 index 00000000..64de5811 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Registers.cs @@ -0,0 +1,111 @@ +using System; +using System.Runtime.InteropServices; + +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + enum RegisterNumber8 : byte + { + AL = 0b000, + CL = 0b001, + DL = 0b010, + BL = 0b011, + AH = 0b100, + CH = 0b101, + DH = 0b110, + BH = 0b111 + } + + enum RegisterNumber16 : byte + { + AX = 0b000, + CX = 0b001, + DX = 0b010, + BX = 0b011, + SP = 0b100, + BP = 0b101, + SI = 0b110, + DI = 0b111 + } + + private byte GetRegister8(RegisterNumber8 reg) + { + return reg switch + { + RegisterNumber8.AL => ax.Low, + RegisterNumber8.CL => cx.Low, + RegisterNumber8.DL => dx.Low, + RegisterNumber8.BL => bx.Low, + RegisterNumber8.AH => ax.High, + RegisterNumber8.CH => cx.High, + RegisterNumber8.DH => dx.High, + RegisterNumber8.BH => bx.High, + _ => throw new ArgumentException("Invalid register", nameof(reg)), + }; + } + + private ushort GetRegister16(RegisterNumber16 reg) + { + return reg switch + { + RegisterNumber16.AX => ax.Word, + RegisterNumber16.CX => cx.Word, + RegisterNumber16.DX => dx.Word, + RegisterNumber16.BX => bx.Word, + RegisterNumber16.SP => sp, + RegisterNumber16.BP => bp, + RegisterNumber16.SI => si, + RegisterNumber16.DI => di, + _ => throw new ArgumentException("Invalid register", nameof(reg)), + }; + } + + private void SetRegister8(RegisterNumber8 reg, byte value) + { + switch (reg) + { + case RegisterNumber8.AL: ax.Low = value; break; + case RegisterNumber8.CL: cx.Low = value; break; + case RegisterNumber8.DL: dx.Low = value; break; + case RegisterNumber8.BL: bx.Low = value; break; + case RegisterNumber8.AH: ax.High = value; break; + case RegisterNumber8.CH: cx.High = value; break; + case RegisterNumber8.DH: dx.High = value; break; + case RegisterNumber8.BH: bx.High = value; break; + default: throw new ArgumentException("Invalid register", nameof(reg)); + } + } + + private void SetRegister16(RegisterNumber16 reg, ushort value) + { + switch (reg) + { + case RegisterNumber16.AX: ax.Word = value; break; + case RegisterNumber16.CX: cx.Word = value; break; + case RegisterNumber16.DX: dx.Word = value; break; + case RegisterNumber16.BX: bx.Word = value; break; + case RegisterNumber16.SP: sp = value; break; + case RegisterNumber16.BP: bp = value; break; + case RegisterNumber16.SI: si = value; break; + case RegisterNumber16.DI: di = value; break; + default: throw new ArgumentException("Invalid register", nameof(reg)); + } + } + + [StructLayout(LayoutKind.Explicit)] + public struct Register16 + { + [FieldOffset(0)] + public byte Low; + [FieldOffset(1)] + public byte High; + + [FieldOffset(0)] + public ushort Word; + + public static implicit operator Register16(ushort value) => new() { Word = value }; + + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Registers.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Registers.cs.meta new file mode 100644 index 00000000..95761e1d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Registers.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a4d62a2a12b27744ea0c51ed3e7a2500 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Segments.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Segments.cs new file mode 100644 index 00000000..d16710a4 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Segments.cs @@ -0,0 +1,45 @@ +using System; + +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + enum SegmentNumber : byte + { + ES = 0b00, + CS = 0b01, + SS = 0b10, + DS = 0b11, + Unset = 0xFF + } + + private ushort GetSegment(SegmentNumber seg) + { + return seg switch + { + SegmentNumber.ES => es, + SegmentNumber.CS => cs, + SegmentNumber.SS => ss, + SegmentNumber.DS => ds, + _ => throw new ArgumentException("Invalid segment", nameof(seg)), + }; + } + + private void SetSegment(SegmentNumber seg, ushort value) + { + switch (seg) + { + case SegmentNumber.ES: es = value; break; + case SegmentNumber.CS: cs = value; break; + case SegmentNumber.SS: ss = value; break; + case SegmentNumber.DS: ds = value; break; + default: throw new ArgumentException("Invalid segment", nameof(seg)); + } + } + + private ushort GetSegmentViaOverride(SegmentNumber seg) + { + return GetSegment(prefixSegOverride != SegmentNumber.Unset ? prefixSegOverride : seg); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Segments.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Segments.cs.meta new file mode 100644 index 00000000..153ca8bc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Segments.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f05e782fc3972e146a5970e63968477a \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Strings.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Strings.cs new file mode 100644 index 00000000..d6d6d6d9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Strings.cs @@ -0,0 +1,104 @@ +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ + { + private static int GetIncrement(bool is16Bit, bool isDirectionFlagSet) + { + return isDirectionFlagSet ? (is16Bit ? -2 : -1) : (is16Bit ? 2 : 1); + } + + private void InString(bool is16Bit) + { + var increment = GetIncrement(is16Bit, IsFlagSet(Flags.Direction)); + + if (!is16Bit) + WriteMemory8(es, di, machine.ReadPort(dx.Word)); + else + WriteMemory16(es, di, ReadPort16(dx.Word)); + + di = (ushort)(di + increment); + } + + private void OutString(bool is16Bit) + { + var increment = GetIncrement(is16Bit, IsFlagSet(Flags.Direction)); + + var temp = GetSegmentViaOverride(SegmentNumber.DS); + + if (!is16Bit) + machine.WritePort(dx.Word, ReadMemory8(temp, si)); + else + WritePort16(dx.Word, ReadMemory16(temp, si)); + + si = (ushort)(si + increment); + } + + private void MoveString(bool is16Bit) + { + var increment = GetIncrement(is16Bit, IsFlagSet(Flags.Direction)); + + var temp = GetSegmentViaOverride(SegmentNumber.DS); + + if (!is16Bit) + WriteMemory8(es, di, ReadMemory8(temp, si)); + else + WriteMemory16(es, di, ReadMemory16(temp, si)); + + di = (ushort)(di + increment); + si = (ushort)(si + increment); + } + + private void CompareString(bool is16Bit) + { + var increment = GetIncrement(is16Bit, IsFlagSet(Flags.Direction)); + + var temp = GetSegmentViaOverride(SegmentNumber.DS); + + if (!is16Bit) + Sub8(false, ReadMemory8(temp, si), ReadMemory8(es, di)); + else + Sub16(false, ReadMemory16(temp, si), ReadMemory16(es, di)); + + di = (ushort)(di + increment); + si = (ushort)(si + increment); + } + + private void StoreString(bool is16Bit) + { + var increment = GetIncrement(is16Bit, IsFlagSet(Flags.Direction)); + + if (!is16Bit) + WriteMemory8(es, di, ax.Low); + else + WriteMemory16(es, di, ax.Word); + + di = (ushort)(di + increment); + } + + private void LoadString(bool is16Bit) + { + var increment = GetIncrement(is16Bit, IsFlagSet(Flags.Direction)); + + var temp = GetSegmentViaOverride(SegmentNumber.DS); + + if (!is16Bit) + ax.Low = ReadMemory8(temp, si); + else + ax.Word = ReadMemory16(temp, si); + + si = (ushort)(si + increment); + } + + private void ScanString(bool is16Bit) + { + var increment = GetIncrement(is16Bit, IsFlagSet(Flags.Direction)); + + if (!is16Bit) + Sub8(false, ax.Low, ReadMemory8(es, di)); + else + Sub16(false, ax.Word, ReadMemory16(es, di)); + + di = (ushort)(di + increment); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Strings.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Strings.cs.meta new file mode 100644 index 00000000..059b3c67 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.Strings.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 43c1a3a659adfb244be70cdc0ded4be7 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.cs new file mode 100644 index 00000000..4a80ff25 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.cs @@ -0,0 +1,139 @@ +using StoicGoose.Core.Interfaces; + +namespace StoicGoose.Core.CPU +{ + public sealed partial class V30MZ : IComponent + { + // TODO: attempt prefetch emulation (Meitantei Conan - Nishi no Meitantei Saidai no Kiki; cart changes banks on startup, can no longer execute jump, execs garbage) + + /* Parent machine instance */ + readonly IMachine machine = default; + + /* General registers */ + Register16 ax, bx, cx, dx; + ushort sp, bp, si, di; + /* Segment registers */ + ushort cs, ds, ss, es; + /* Status and instruction registers */ + ushort ip; + Flags flags; + + bool halted; + int opCycles, intCycles; + + /* Public properties for registers */ + public Register16 AX { get => ax; set => ax = value; } + public Register16 BX { get => bx; set => bx = value; } + public Register16 CX { get => cx; set => cx = value; } + public Register16 DX { get => dx; set => dx = value; } + public ushort SP { get => sp; set => sp = value; } + public ushort BP { get => bp; set => bp = value; } + public ushort SI { get => si; set => si = value; } + public ushort DI { get => di; set => di = value; } + public ushort CS { get => cs; set => cs = value; } + public ushort DS { get => ds; set => ds = value; } + public ushort SS { get => ss; set => ss = value; } + public ushort ES { get => es; set => es = value; } + public ushort IP { get => ip; set => ip = value; } + + public bool IsHalted { get => halted; set => halted = value; } + + public V30MZ(IMachine machine) + { + this.machine = machine; + + Reset(); + } + + public void Reset() + { + /* CPU reset */ + flags = Flags.ReservedB1 | Flags.ReservedB12 | Flags.ReservedB13 | Flags.ReservedB14 | Flags.ReservedB15; + ip = 0x0000; + cs = 0xFFFF; + ds = 0x0000; + ss = 0x0000; + es = 0x0000; + + /* Initialized by WS bootstrap */ + ax.Word = 0x0000; + dx.Word = 0x0000; + bp = 0x0000; + ss = 0x0000; + sp = 0x2000; + ds = 0x0000; + es = 0x0000; + + /* Misc variables */ + halted = false; + opCycles = intCycles = 0; + + ResetPrefixes(); + modRm.Reset(); + } + + public void Shutdown() + { + // + } + + public void Interrupt(int vector) + { + /* Resume execution */ + halted = false; + + /* Read interrupt handler's segment & offset */ + var offset = ReadMemory16(0, (ushort)((vector * 4) + 0)); + var segment = ReadMemory16(0, (ushort)((vector * 4) + 2)); + + /* Push state, clear flags, etc. */ + Push((ushort)flags); + Push(cs); + Push(ip); + + ClearFlags(Flags.InterruptEnable); + ClearFlags(Flags.Trap); + + ResetPrefixes(); + modRm.Reset(); + + intCycles = 32; + + /* Continue with interrupt handler */ + cs = segment; + ip = offset; + } + + public int Step() + { + var cycles = 0; + + if (halted) + { + /* CPU is halted */ + cycles++; + } + else + { + /* Read any prefixes & opcode */ + byte opcode; + while (!HandlePrefixes(opcode = ReadMemory8(cs, ip++))) { } + + /* Execute instruction */ + opCycles = instructions[opcode](this); + + cycles += opCycles; + opCycles = 0; + } + + cycles += intCycles; + intCycles = 0; + + /* Reset state for next instruction */ + ResetPrefixes(); + modRm.Reset(); + + return cycles; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.cs.meta new file mode 100644 index 00000000..814b3b47 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/CPU/V30MZ.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 946e7f92ed1c35e45bd71bbcd108695c \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges.meta new file mode 100644 index 00000000..9d450740 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4878ed813b76a834abf448a6d1c96295 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Cartridge.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Cartridge.cs new file mode 100644 index 00000000..4ab958fb --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Cartridge.cs @@ -0,0 +1,248 @@ +using System; + +using StoicGoose.Common.Utilities; +using StoicGoose.Core.EEPROMs; +using StoicGoose.Core.Interfaces; + +namespace StoicGoose.Core.Cartridges +{ + public class Cartridge : IComponent + { + byte[] rom, sram; + uint romMask, sramMask; + + Metadata metadata; + + /* REG_BANK_xxx */ + byte romBank2, sramBank, romBank0, romBank1; + + /* REG_EEP_xxx -> EEPROM class */ + EEPROM eeprom = default; + + /* REG_RTC_xxx -> RTC class */ + RTC rtc = default; + + public bool IsLoaded => rom?.Length > 0; + public int SizeInBytes => rom?.Length ?? 0; + public uint Crc32 { get; private set; } = default; + + public Metadata Metadata => metadata; + + public Cartridge() + { + rom = Array.Empty<byte>(); + sram = Array.Empty<byte>(); + } + + public void Reset() + { + romBank2 = 0xFF; + sramBank = 0xFF; + romBank0 = 0xFF; + romBank1 = 0xFF; + + eeprom?.Reset(); + rtc?.Reset(); + + // HACK: set RTC to current date/time on boot for testing + rtc?.Program(DateTime.Now); + } + + public void Shutdown() + { + eeprom?.Shutdown(); + rtc?.Shutdown(); + } + + public void LoadRom(byte[] data) + { + rom = data; + romMask = (uint)(rom.Length - 1); + + metadata = new Metadata(rom); + + if (metadata.SaveSize != 0) + { + if (metadata.IsSramSave) + { + sram = new byte[metadata.SaveSize]; + sramMask = (uint)(sram.Length - 1); + } + else if (metadata.IsEepromSave) + { + switch (metadata.SaveType) + { + // TODO: verify size/address bits + case Metadata.SaveTypes.Eeprom1Kbit: eeprom = new EEPROM(metadata.SaveSize, 6); break; + case Metadata.SaveTypes.Eeprom16Kbit: eeprom = new EEPROM(metadata.SaveSize, 10); break; + case Metadata.SaveTypes.Eeprom8Kbit: eeprom = new EEPROM(metadata.SaveSize, 9); break; + } + } + } + + if (metadata.IsRtcPresent) + { + // NOTE: "RTC present" flag is not entirely consistent; ex. Digimon Tamers Battle Spirit has the flag, but does not have an RTC + rtc = new RTC(); + } + + Crc32 = Common.Utilities.Crc32.Calculate(rom); + + Log.WriteEvent(LogSeverity.Information, this, "ROM loaded."); + Log.WriteLine($"~ {Ansi.Cyan}Cartridge metadata{Ansi.Reset} ~"); + Log.WriteLine($" Publisher ID: {Metadata.PublisherCode}, {Metadata.PublisherName} [0x{Metadata.PublisherId:X2}]"); + Log.WriteLine($" System type: {Metadata.SystemType}"); + Log.WriteLine($" Game ID: 0x{Metadata.GameId:X2}"); + Log.WriteLine($" Calculated ID string: {Metadata.GameIdString}"); + Log.WriteLine($" Game revision: 0x{Metadata.GameRevision:X2}"); + Log.WriteLine($" ROM size: {Metadata.RomSize} [0x{(byte)Metadata.RomSize:X2}]"); + Log.WriteLine($" Save type/size: {Metadata.SaveType}/{Metadata.SaveSize} [0x{(byte)Metadata.SaveType:X2}]"); + Log.WriteLine($" Misc flags: 0x{Metadata.MiscFlags:X2}"); + Log.WriteLine($" Orientation: {Metadata.Orientation}"); + Log.WriteLine($" ROM bus width: {Metadata.RomBusWidth}"); + Log.WriteLine($" ROM access speed: {Metadata.RomAccessSpeed}"); + Log.WriteLine($" RTC present: {Metadata.IsRtcPresent} [0x{Metadata.RtcPresentFlag:X2}]"); + Log.WriteLine($" Checksum (from metadata): 0x{Metadata.Checksum:X4}"); + Log.WriteLine($" Checksum (calculated): 0x{Metadata.CalculatedChecksum:X4}"); + Log.WriteLine($" Checksum is {(metadata.IsChecksumValid ? $"{Ansi.Green}valid" : $"{Ansi.Red}invalid")}{Ansi.Reset}!"); + + if (metadata.PublisherId == 0x01 && metadata.GameId == 0x27) + { + // HACK: Meitantei Conan - Nishi no Meitantei Saidai no Kiki, prevent crash on startup (see TODO in V30MZ, prefetching) + rom[0xFFFE8] = 0xEA; + rom[0xFFFE9] = 0x00; + rom[0xFFFEA] = 0x00; + rom[0xFFFEB] = 0x00; + rom[0xFFFEC] = 0x20; + Log.WriteLine($"~ {Ansi.Red}Conan prefetch hack enabled{Ansi.Reset} ~"); + } + } + + public void LoadSram(byte[] data) + { + if (data.Length != sram.Length) throw new Exception("Sram size mismatch"); + Buffer.BlockCopy(data, 0, sram, 0, data.Length); + } + + public void LoadEeprom(byte[] data) + { + eeprom?.LoadContents(data); + } + + public byte[] GetSram() + { + return sram.Clone() as byte[]; + } + + public byte[] GetEeprom() + { + return eeprom?.GetContents().Clone() as byte[]; + } + + public bool Step(int clockCyclesInStep) + { + return rtc != null && rtc.Step(clockCyclesInStep); + } + + public byte ReadMemory(uint address) + { + return address switch + { + /* SRAM */ + var n when n >= 0x010000 && n < 0x020000 && sram.Length != 0 => sram[((uint)(sramBank << 16) | (address & 0x0FFFF)) & sramMask], + /* ROM bank 0 */ + var n when n >= 0x020000 && n < 0x030000 && rom.Length != 0 => rom[((uint)(romBank0 << 16) | (address & 0x0FFFF)) & romMask], + /* ROM bank 1 */ + var n when n >= 0x030000 && n < 0x040000 && rom.Length != 0 => rom[((uint)(romBank1 << 16) | (address & 0x0FFFF)) & romMask], + /* ROM bank 2 */ + var n when n >= 0x040000 && n < 0x100000 && rom.Length != 0 => rom[((uint)(romBank2 << 20) | (address & 0xFFFFF)) & romMask], + /* Unmapped */ + _ => 0x90, + }; + } + + public void WriteMemory(uint address, byte value) + { + /* SRAM */ + if (address >= 0x010000 && address < 0x020000 && sram.Length != 0) + sram[((uint)(sramBank << 16) | (address & 0x0FFFF)) & sramMask] = value; + } + + public byte ReadPort(ushort port) + { + return port switch + { + /* REG_BANK_ROM2 */ + 0xC0 => romBank2, + /* REG_BANK_SRAM */ + 0xC1 => sramBank, + /* REG_BANK_ROM0 */ + 0xC2 => romBank0, + /* REG_BANK_ROM1 */ + 0xC3 => romBank1, + /* REG_EEP_DATA (low) */ + 0xC4 => eeprom != null ? eeprom.ReadPort((byte)(port - 0xC4)) : (byte)0x90, + /* REG_EEP_DATA (high) */ + 0xC5 => eeprom != null ? eeprom.ReadPort((byte)(port - 0xC4)) : (byte)0x90, + /* REG_EEP_ADDR (low) */ + 0xC6 => eeprom != null ? eeprom.ReadPort((byte)(port - 0xC4)) : (byte)0x90, + /* REG_EEP_ADDR (high) */ + 0xC7 => eeprom != null ? eeprom.ReadPort((byte)(port - 0xC4)) : (byte)0x90, + /* REG_EEP_STATUS (read) */ + 0xC8 => eeprom != null ? eeprom.ReadPort((byte)(port - 0xC4)) : (byte)0x90, + /* REG_RTC_STATUS (read) */ + 0xCA => rtc != null ? rtc.ReadPort((byte)(port - 0xCA)) : (byte)0x90, + /* REG_RTC_DATA */ + 0xCB => rtc != null ? rtc.ReadPort((byte)(port - 0xCA)) : (byte)0x90, + /* Unmapped */ + _ => 0x90, + }; + } + + public void WritePort(ushort port, byte value) + { + switch (port) + { + case 0xC0: + /* REG_BANK_ROM2 */ + romBank2 = value; + break; + + case 0xC1: + /* REG_BANK_SRAM */ + sramBank = value; + break; + + case 0xC2: + /* REG_BANK_ROM0 */ + romBank0 = value; + break; + + case 0xC3: + /* REG_BANK_ROM1 */ + romBank1 = value; + break; + + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC8: + /* REG_EEP_DATA (low) */ + /* REG_EEP_DATA (high) */ + /* REG_EEP_ADDR (low) */ + /* REG_EEP_ADDR (high) */ + /* REG_EEP_CMD (write) */ + eeprom?.WritePort((byte)(port - 0xC4), value); + break; + + case 0xCA: + case 0xCB: + /* REG_RTC_CMD (write) */ + /* REG_RTC_DATA */ + rtc?.WritePort((byte)(port - 0xCA), value); + break; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Cartridge.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Cartridge.cs.meta new file mode 100644 index 00000000..fc5cb3d3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Cartridge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4de2597a945e9a14082b644bcddf3e4e \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Metadata.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Metadata.cs new file mode 100644 index 00000000..b373712c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Metadata.cs @@ -0,0 +1,171 @@ +using System.Collections.Generic; + +namespace StoicGoose.Core.Cartridges +{ + public class Metadata + { + public enum SystemTypes : byte + { + WonderSwan = 0x00, + WonderSwanColor = 0x01 + } + + public enum RomSizes : byte + { + Rom1Mbit = 0x00, // ??? + Rom2Mbit = 0x01, // ??? + Rom4Mbit = 0x02, + Rom8Mbit = 0x03, + Rom16Mbit = 0x04, + Rom24Mbit = 0x05, + Rom32Mbit = 0x06, + Rom48Mbit = 0x07, + Rom64Mbit = 0x08, + Rom128Mbit = 0x09 + } + + public enum SaveTypes : byte + { + None = 0x00, + Sram64Kbit = 0x01, + Sram256Kbit = 0x02, + Sram1Mbit = 0x03, + Sram2Mbit = 0x04, + Sram4Mbit = 0x05, + Eeprom1Kbit = 0x10, + Eeprom16Kbit = 0x20, + Eeprom8Kbit = 0x50 //??? + } + + public enum Orientations : byte + { + Horizontal = 0 << 0, + Vertical = 1 << 0, + } + + public enum RomBusWidths : byte + { + Width16Bit = 0 << 1, + Width8Bit = 1 << 1, + } + + public enum RomAccessSpeeds : byte + { + Speed3Cycle = 0 << 2, + Speed1Cycle = 1 << 2 + } + + readonly Dictionary<byte, (string code, string name)> publishers = new() + { + { 0x00, ("???", "Misc. (invalid)") }, + { 0x01, ("BAN", "Bandai") }, + { 0x02, ("TAT", "Taito") }, + { 0x03, ("TMY", "Tomy") }, + { 0x04, ("KEX", "Koei") }, + { 0x05, ("DTE", "Data East") }, + { 0x06, ("AAE", "Asmik Ace") }, + { 0x07, ("MDE", "Media Entertainment") }, + { 0x08, ("NHB", "Nichibutsu") }, + { 0x0A, ("CCJ", "Coconuts Japan") }, + { 0x0B, ("SUM", "Sammy") }, + { 0x0C, ("SUN", "Sunsoft") }, + { 0x0D, ("PAW", "Mebius (?)") }, + { 0x0E, ("BPR", "Banpresto") }, + { 0x10, ("JLC", "Jaleco") }, + { 0x11, ("MGA", "Imagineer") }, + { 0x12, ("KNM", "Konami") }, + { 0x16, ("KBS", "Kobunsha") }, + { 0x17, ("BTM", "Bottom Up") }, + { 0x18, ("KGT", "Kaga Tech") }, + { 0x19, ("SRV", "Sunrise") }, + { 0x1A, ("CFT", "Cyber Front") }, + { 0x1B, ("MGH", "Mega House") }, + { 0x1D, ("BEC", "Interbec") }, + { 0x1E, ("NAP", "Nihon Application") }, + { 0x1F, ("BVL", "Bandai Visual") }, + { 0x20, ("ATN", "Athena") }, + { 0x21, ("KDX", "KID") }, + { 0x22, ("HAL", "HAL Corporation") }, + { 0x23, ("YKE", "Yuki Enterprise") }, + { 0x24, ("OMM", "Omega Micott") }, + { 0x25, ("LAY", "Layup") }, + { 0x26, ("KDK", "Kadokawa Shoten") }, + { 0x27, ("SHL", "Shall Luck") }, + { 0x28, ("SQR", "Squaresoft") }, + { 0x2A, ("SCC", "NTT DoCoMo (?)") }, /* MobileWonderGate */ + { 0x2B, ("TMC", "Tom Create") }, + { 0x2D, ("NMC", "Namco") }, + { 0x2E, ("SES", "Movic (?)") }, + { 0x2F, ("HTR", "E3 Staff (?)") }, + { 0x31, ("VGD", "Vanguard") }, + { 0x32, ("MGT", "Megatron") }, + { 0x33, ("WIZ", "Wiz") }, + { 0x36, ("CAP", "Capcom") }, + }; + + readonly Dictionary<SaveTypes, int> saveSizes = new() + { + { SaveTypes.None, 0 }, + { SaveTypes.Sram64Kbit, 1024 * 8 }, + { SaveTypes.Sram256Kbit, 1024 * 32 }, + { SaveTypes.Sram1Mbit, 1024 * 128 }, + { SaveTypes.Sram2Mbit, 1024 * 256 }, + { SaveTypes.Sram4Mbit, 1024 * 512 }, + { SaveTypes.Eeprom1Kbit, 2 * 64 }, + { SaveTypes.Eeprom16Kbit, 2 * 1024 }, + { SaveTypes.Eeprom8Kbit, 2 * 512 }, + }; + + public byte PublisherId { get; private set; } + public SystemTypes SystemType { get; private set; } + public byte GameId { get; private set; } + public byte GameRevision { get; private set; } + public RomSizes RomSize { get; private set; } + public SaveTypes SaveType { get; private set; } + public byte MiscFlags { get; private set; } + public byte RtcPresentFlag { get; private set; } + public ushort Checksum { get; private set; } + + public string PublisherCode => publishers.ContainsKey(PublisherId) ? publishers[PublisherId].code : "???"; + public string PublisherName => publishers.ContainsKey(PublisherId) ? publishers[PublisherId].name : "(Unknown)"; + + public string GameIdString => $"SWJ-{PublisherCode}{(SystemType == SystemTypes.WonderSwan ? "0" : "C")}{GameId:X2}"; + + public Orientations Orientation => (Orientations)(MiscFlags & (1 << 0)); + public RomBusWidths RomBusWidth => (RomBusWidths)(MiscFlags & (1 << 1)); + public RomAccessSpeeds RomAccessSpeed => (RomAccessSpeeds)(MiscFlags & (1 << 2)); + + public int SaveSize => saveSizes.ContainsKey(SaveType) ? saveSizes[SaveType] : 0; + + public bool IsSramSave => + SaveType == SaveTypes.Sram64Kbit || SaveType == SaveTypes.Sram256Kbit || + SaveType == SaveTypes.Sram1Mbit || SaveType == SaveTypes.Sram2Mbit || SaveType == SaveTypes.Sram4Mbit; + + public bool IsEepromSave => + SaveType == SaveTypes.Eeprom1Kbit || SaveType == SaveTypes.Eeprom16Kbit || SaveType == SaveTypes.Eeprom8Kbit; + + public bool IsRtcPresent => RtcPresentFlag != 0; + + public ushort CalculatedChecksum { get; private set; } + + public bool IsChecksumValid => Checksum == CalculatedChecksum; + + public Metadata(byte[] data) + { + var offset = data.Length - 10; + PublisherId = data[offset + 0]; + SystemType = (SystemTypes)data[offset + 1]; + GameId = data[offset + 2]; + GameRevision = data[offset + 3]; + RomSize = (RomSizes)data[offset + 4]; + SaveType = (SaveTypes)data[offset + 5]; + MiscFlags = data[offset + 6]; + RtcPresentFlag = data[offset + 7]; + Checksum = (ushort)(data[offset + 9] << 8 | data[offset + 8]); + + CalculatedChecksum = 0; + for (var i = 0; i < data.Length - 2; i++) + CalculatedChecksum += data[i + 0]; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Metadata.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Metadata.cs.meta new file mode 100644 index 00000000..718ec51f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/Metadata.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6ca048ba38a22c849a012278fc9515f3 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/RTC.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/RTC.cs new file mode 100644 index 00000000..3683a9a5 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/RTC.cs @@ -0,0 +1,349 @@ +using System; + +using StoicGoose.Common.Utilities; +using StoicGoose.Core.Interfaces; +using StoicGoose.Core.Machines; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Cartridges +{ + /* Seiko S-3511A real-time clock, through Bandai 2003 mapper + * - https://forums.nesdev.org/viewtopic.php?t=21513 + * - https://datasheetspdf.com/pdf-file/1087347/Seiko/S-3511A/1 + */ + + // TODO: interrupts, save/load current state + + public sealed class RTC : IPortAccessComponent + { + const int cyclesInSecond = (int)MachineCommon.CpuClock; + + readonly byte[] numPayloadBytes = new byte[] { 0, 1, 7, 3, 2, 2, 2 }; + readonly int[] numDaysPerMonth = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + /* WS - Status & data registers */ + byte wsData; + byte payloadIndex; + + /* WS+RTC - Communication */ + byte command; + bool isReadAccess; + + /* RTC - Real-time data register */ + byte year, month, day, dayOfWeek, hour, minute, second; + bool isPm, isTestModeActive; + + /* RTC - Status register */ + bool isPowered, is24HourMode; + bool intAE, intME, intFE; + + /* RTC - Alarm time/frequency duty setting register */ + ushort intRegister; + + (bool pm, byte hour, byte minute) alarmTime => (IsBitSet((byte)(intRegister >> 0), 7), (byte)((intRegister >> 0) & 0b00111111), (byte)((intRegister >> 8) & 0b01111111)); + int selectedInterruptFreq + { + get + { + var freq = 0; + for (var j = 0; j < 16; j++) if (((intRegister >> j) & 0b1) == 0b1) freq |= 32768 >> j; + return freq; + } + } + + int cycleCount; + + public RTC() + { + // + } + + public void Reset() + { + wsData = 0; + payloadIndex = 0; + + command = 0; + isReadAccess = false; + + year = dayOfWeek = hour = minute = second = 0; + month = day = 1; + isPm = isTestModeActive = false; + + is24HourMode = intAE = intME = false; + isPowered = intFE = true; + + intRegister = 0x8000; + + cycleCount = 0; + } + + public void Shutdown() + { + // + } + + public void Program(DateTime dateTime) + { + year = (byte)(dateTime.Year % 100); + month = (byte)(dateTime.Month % 13); + day = (byte)(dateTime.Day % 32); + dayOfWeek = (byte)((int)dateTime.DayOfWeek % 8); + hour = (byte)(dateTime.Hour % 25); + minute = (byte)(dateTime.Minute % 60); + second = (byte)(dateTime.Second % 60); + } + + public bool Step(int clockCyclesInStep) + { + var interrupt = false; + + for (var i = 0; i < clockCyclesInStep; i++) + { + if (intFE && !intME) + { + /* Selected frequency steady interrupt output */ + + // TODO probably not right + if (cycleCount >= selectedInterruptFreq) + interrupt = true; + + } + else if (!intFE && intME) + { + /* Per-minute edge interrupt output */ + // TODO + } + else if (intFE && intME) + { + /* Per-minute steady interrupt output */ + // TODO + } + else if (!intFE && !intME && intAE) + { + /* Alarm interrupt output */ + if (alarmTime.pm == isPm && Bcd.BcdToDecimal(alarmTime.hour) == hour && Bcd.BcdToDecimal(alarmTime.minute) == minute) + interrupt = true; + } + + cycleCount++; + if (cycleCount >= cyclesInSecond) + { + UpdateClock(); + cycleCount = 0; + } + } + + return interrupt; + } + + private void UpdateClock() + { + second++; + if (second < 60) return; + + second = 0; + minute++; + if (minute < 60) return; + + minute = 0; + hour++; + if (hour < 24) return; + + hour = 0; + dayOfWeek++; + dayOfWeek %= 7; + + day++; + var extraDay = (month == 2 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) ? 1 : 0; + if (day < numDaysPerMonth[month] + extraDay) return; + + day = 0; + month++; + if (month < 12) return; + + month = 0; + year++; + } + + private void PerformAccess() + { + switch (command & 0b111) + { + case 0b000: + /* Reset */ + wsData = 0; + + year = 0; + month = 1; + day = 1; + dayOfWeek = 0; + hour = 0; + minute = 0; + second = 0; + + isPowered = is24HourMode = false; + intAE = intME = intFE = false; + + intRegister = 0x0000; + break; + + case 0b001: + /* Status register access */ + if (isReadAccess) + { + wsData = 0; + ChangeBit(ref wsData, 7, isPowered); + ChangeBit(ref wsData, 6, is24HourMode); + ChangeBit(ref wsData, 5, intAE); + ChangeBit(ref wsData, 3, intME); + ChangeBit(ref wsData, 1, intFE); + } + else + { + is24HourMode = IsBitSet(wsData, 6); + intAE = IsBitSet(wsData, 5); + intME = IsBitSet(wsData, 3); + intFE = IsBitSet(wsData, 1); + } + break; + + case 0b010: + /* Real-time data access 1 */ + if (isReadAccess) + { + wsData = 0; + switch (payloadIndex) + { + case 0: wsData = (byte)Bcd.DecimalToBcd(year); break; + case 1: wsData = (byte)Bcd.DecimalToBcd(month); break; + case 2: wsData = (byte)Bcd.DecimalToBcd(day); break; + case 3: wsData = (byte)Bcd.DecimalToBcd(dayOfWeek); break; + case 4: wsData = (byte)Bcd.DecimalToBcd(hour); ChangeBit(ref wsData, 7, isPm); break; + case 5: wsData = (byte)Bcd.DecimalToBcd(minute); break; + case 6: wsData = (byte)Bcd.DecimalToBcd(second); ChangeBit(ref wsData, 7, isTestModeActive); break; + } + } + else + { + switch (payloadIndex) + { + case 0: year = (byte)Bcd.BcdToDecimal(wsData); break; + case 1: month = (byte)Bcd.BcdToDecimal(wsData); break; + case 2: day = (byte)Bcd.BcdToDecimal(wsData); break; + case 3: dayOfWeek = (byte)Bcd.BcdToDecimal(wsData); break; + case 4: hour = (byte)(Bcd.BcdToDecimal(wsData) & 0b01111111); isPm = IsBitSet(wsData, 7); break; + case 5: minute = (byte)Bcd.BcdToDecimal(wsData); break; + case 6: second = (byte)(Bcd.BcdToDecimal(wsData) & 0b01111111); isTestModeActive = IsBitSet(wsData, 7); break; + } + } + break; + + case 0b011: + /* Real-time data access 2 */ + if (isReadAccess) + { + wsData = 0; + switch (payloadIndex) + { + case 0: wsData = (byte)Bcd.DecimalToBcd(hour); ChangeBit(ref wsData, 7, isPm); break; + case 1: wsData = (byte)Bcd.DecimalToBcd(minute); break; + case 2: wsData = (byte)Bcd.DecimalToBcd(second); ChangeBit(ref wsData, 7, isTestModeActive); break; + } + } + else + { + switch (payloadIndex) + { + case 0: hour = (byte)(Bcd.BcdToDecimal(wsData) & 0b01111111); isPm = IsBitSet(wsData, 7); break; + case 1: minute = (byte)Bcd.BcdToDecimal(wsData); break; + case 2: second = (byte)(Bcd.BcdToDecimal(wsData) & 0b01111111); isTestModeActive = IsBitSet(wsData, 7); break; + } + } + break; + + case 0b100: + /* Alarm time/frequency duty setting */ + if (isReadAccess) + { + wsData = 0; + switch (payloadIndex) + { + case 0: wsData = (byte)((intRegister >> 0) & 0xFF); break; + case 1: wsData = (byte)((intRegister >> 8) & 0xFF); break; + } + } + else + { + switch (payloadIndex) + { + case 0: intRegister = (ushort)((intRegister & 0xFF00) | (wsData << 0)); break; + case 1: intRegister = (ushort)((intRegister & 0x00FF) | (wsData << 8)); break; + } + } + break; + + case 0b101: + /* Unknown/invalid */ + if (isReadAccess) + { + wsData = 0xFF; + } + break; + + case 0b110: + /* Test mode start -- ignored */ + break; + + case 0b111: + /* Test mode end -- ignored */ + break; + + default: + break; + } + } + + public byte ReadPort(ushort port) + { + var retVal = (byte)0x90; + + if (port == 0) + { + PerformAccess(); + + payloadIndex++; + + ChangeBit(ref retVal, 7, true); // TODO: correct? + ChangeBit(ref retVal, 4, payloadIndex < numPayloadBytes[command & 0b111]); + ChangeBit(ref retVal, 0, true); + retVal |= (byte)((command & 0b1111) << 1); + + if (payloadIndex >= numPayloadBytes[command & 0b111]) + payloadIndex = 0; + } + else if (port == 1) + { + retVal = wsData; + } + + return retVal; + } + + public void WritePort(ushort port, byte value) + { + if (port == 0) + { + isReadAccess = IsBitSet(value, 0); + command = (byte)((value >> 1) & 0b111); + + PerformAccess(); + } + else if (port == 1) + { + wsData = value; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/RTC.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/RTC.cs.meta new file mode 100644 index 00000000..e6e61b38 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Cartridges/RTC.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: acdef41e0d8804e45a3033ad3f95f77e \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA.meta new file mode 100644 index 00000000..223301e7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e29bbdbdcb911604ea0efb453913bff8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxGeneralDMAController.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxGeneralDMAController.cs new file mode 100644 index 00000000..33e2f3f8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxGeneralDMAController.cs @@ -0,0 +1,168 @@ +using StoicGoose.Core.Interfaces; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.DMA +{ + public class SphinxGeneralDMAController : IPortAccessComponent + { + // TODO: verify behavior! + + readonly IMachine machine = default; + + /* REG_DMA_SRC(_HI) */ + uint dmaSource; + /* REG_DMA_DST */ + ushort dmaDestination; + /* REG_DMA_LEN */ + ushort dmaLength; + /* REG_DMA_CTRL */ + byte dmaControl; + + public bool IsActive => IsBitSet(dmaControl, 7); + + bool isDecrementMode => IsBitSet(dmaControl, 6); + + public SphinxGeneralDMAController(IMachine machine) + { + this.machine = machine; + } + + public void Reset() + { + // + + ResetRegisters(); + } + + private void ResetRegisters() + { + dmaSource = dmaDestination = dmaLength = dmaControl = 0; + } + + public void Shutdown() + { + // + } + + public int Step() + { + if (dmaLength == 0 || ((dmaSource >> 16) & 0x0F) == 0x01) + { + /* Disable DMA if length is zero OR source is SRAM */ + ChangeBit(ref dmaControl, 7, false); + return 5; + } + else + { + if (((dmaSource >> 16) & 0x0F) != 0x01) + { + /* Perform DMA if source is not SRAM */ + machine.WriteMemory((uint)(dmaDestination + 0), machine.ReadMemory(dmaSource + 0)); + machine.WriteMemory((uint)(dmaDestination + 1), machine.ReadMemory(dmaSource + 1)); + } + + dmaSource += (uint)(isDecrementMode ? -2 : 2); + dmaDestination += (ushort)(isDecrementMode ? -2 : 2); + dmaLength -= 2; + + return 2; + } + } + + public byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x40: + /* REG_DMA_SRC (low) */ + retVal |= (byte)((dmaSource >> 0) & 0xFE); + break; + case 0x41: + /* REG_DMA_SRC (mid) */ + retVal |= (byte)((dmaSource >> 8) & 0xFF); + break; + case 0x42: + /* REG_DMA_SRC_HI */ + retVal |= (byte)((dmaSource >> 16) & 0x0F); + break; + + case 0x44: + /* REG_DMA_DST (low) */ + retVal |= (byte)((dmaDestination >> 0) & 0xFE); + break; + case 0x45: + /* REG_DMA_DST (high) */ + retVal |= (byte)((dmaDestination >> 8) & 0xFF); + break; + + case 0x46: + /* REG_DMA_LEN */ + retVal |= (byte)((dmaLength >> 0) & 0xFE); + break; + case 0x47: + /* REG_DMA_LEN */ + retVal |= (byte)((dmaLength >> 8) & 0xFF); + break; + + case 0x48: + /* REG_DMA_CTRL */ + retVal |= (byte)(dmaControl & 0b11000000); + break; + } + + return retVal; + } + + public void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x40: + /* REG_DMA_SRC (low) */ + dmaSource &= 0xFFF00; + dmaSource |= (uint)((value << 0) & 0x000FE); + break; + case 0x41: + /* REG_DMA_SRC (high) */ + dmaSource &= 0xF00FE; + dmaSource |= (uint)((value << 8) & 0x0FF00); + break; + case 0x42: + /* REG_DMA_SRC_HI */ + dmaSource &= 0x0FFFE; + dmaSource |= (uint)((value << 16) & 0xF0000); + break; + + case 0x44: + /* REG_DMA_DST (low) */ + dmaDestination &= 0xFF00; + dmaDestination |= (ushort)((value << 0) & 0x00FE); + break; + case 0x45: + /* REG_DMA_DST (high) */ + dmaDestination &= 0x00FE; + dmaDestination |= (ushort)((value << 8) & 0xFF00); + break; + + case 0x46: + /* REG_DMA_LEN (low) */ + dmaLength &= 0xFF00; + dmaLength |= (ushort)((value << 0) & 0x00FE); + break; + case 0x47: + /* REG_DMA_LEN (high) */ + dmaLength &= 0x00FE; + dmaLength |= (ushort)((value << 8) & 0xFF00); + break; + + case 0x48: + /* REG_DMA_CTRL */ + dmaControl = (byte)(value & 0b11000000); + break; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxGeneralDMAController.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxGeneralDMAController.cs.meta new file mode 100644 index 00000000..12b199ae --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxGeneralDMAController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8e43c53f0ef2ab24e9aec07a2ca82f6b \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxSoundDMAController.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxSoundDMAController.cs new file mode 100644 index 00000000..91942425 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxSoundDMAController.cs @@ -0,0 +1,173 @@ +using StoicGoose.Core.Interfaces; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.DMA +{ + public class SphinxSoundDMAController : IPortAccessComponent + { + readonly static int[] cycleCounts = { 768, 512, 256, 128 }; + + readonly static ushort destinationPortChannel2Volume = 0x089; + readonly static ushort destinationPortHyperVoice = 0x095; + + readonly IMachine machine = default; + + /* REG_DMA_SRC(_HI) */ + uint dmaSource; + /* REG_DMA_LEN(_HI) */ + uint dmaLength; + /* REG_DMA_CTRL */ + byte dmaControl; + + public bool IsActive => IsBitSet(dmaControl, 7); + + bool isDecrementMode => IsBitSet(dmaControl, 6); + bool isDestinationHyperVoice => IsBitSet(dmaControl, 4); + bool isLoopingMode => IsBitSet(dmaControl, 3); + int dmaRate => dmaControl & 0b11; + + uint initialSource, initialLength; + + int cycleCount; + + public SphinxSoundDMAController(IMachine machine) + { + this.machine = machine; + } + + public void Reset() + { + initialSource = initialLength = 0; + + cycleCount = 0; + + ResetRegisters(); + } + + private void ResetRegisters() + { + dmaSource = dmaLength = dmaControl = 0; + } + + public void Shutdown() + { + // + } + + public void Step(int clockCyclesInStep) + { + cycleCount += clockCyclesInStep; + + if (cycleCount >= cycleCounts[dmaRate]) + { + machine.WritePort(isDestinationHyperVoice ? destinationPortHyperVoice : destinationPortChannel2Volume, machine.ReadMemory(dmaSource)); + + dmaSource += (uint)(isDecrementMode ? -1 : 1); + dmaLength--; + + if (dmaLength == 0) + { + if (isLoopingMode) + { + dmaSource = initialSource; + dmaLength = initialLength; + } + else + ChangeBit(ref dmaControl, 7, false); + } + + cycleCount = 0; + } + } + + public byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x4A: + /* REG_SDMA_SRC (low) */ + retVal |= (byte)((dmaSource >> 0) & 0xFF); + break; + case 0x4B: + /* REG_SDMA_SRC (mid) */ + retVal |= (byte)((dmaSource >> 8) & 0xFF); + break; + case 0x4C: + /* REG_SDMA_SRC_HI */ + retVal |= (byte)((dmaSource >> 16) & 0x0F); + break; + + case 0x4E: + /* REG_SDMA_LEN (low) */ + retVal |= (byte)((dmaLength >> 0) & 0xFE); + break; + case 0x4F: + /* REG_SDMA_LEN (mid) */ + retVal |= (byte)((dmaLength >> 8) & 0xFF); + break; + case 0x50: + /* REG_SDMA_LEN_HI */ + retVal |= (byte)((dmaLength >> 16) & 0x0F); + break; + + case 0x52: + /* REG_SDMA_CTRL */ + retVal |= (byte)(dmaControl & 0b11011111); + break; + } + + return retVal; + } + + public void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x4A: + /* REG_SDMA_SRC (low) */ + dmaSource &= 0xFFF00; + dmaSource |= (uint)((value << 0) & 0x000FF); + break; + case 0x4B: + /* REG_SDMA_SRC (mid) */ + dmaSource &= 0xF00FF; + dmaSource |= (uint)((value << 8) & 0x0FF00); + break; + case 0x4C: + /* REG_SDMA_SRC_HI */ + dmaSource &= 0x0FFFF; + dmaSource |= (uint)((value << 16) & 0xF0000); + break; + + case 0x4E: + /* REG_SDMA_LEN (low) */ + dmaLength &= 0xFFF00; + dmaLength |= (ushort)((value << 0) & 0x00FF); + break; + case 0x4F: + /* REG_SDMA_LEN (mid) */ + dmaLength &= 0xF00FF; + dmaLength |= (ushort)((value << 8) & 0xFF00); + break; + case 0x50: + /* REG_SDMA_SRC_HI */ + dmaLength &= 0x0FFFF; + dmaLength |= (uint)((value << 16) & 0xF0000); + break; + + case 0x52: + /* REG_SDMA_CTRL */ + if (!IsActive && IsBitSet(value, 7)) + { + initialSource = dmaSource; + initialLength = dmaLength; + } + dmaControl = (byte)(value & 0b11011111); + break; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxSoundDMAController.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxSoundDMAController.cs.meta new file mode 100644 index 00000000..3c50aab5 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/DMA/SphinxSoundDMAController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ef4ffde1da744e54fb8facfbc5fac13f \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display.meta new file mode 100644 index 00000000..cc2f4bee --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3611bec488c079c419db211c75d1afd1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/AswanDisplayController.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/AswanDisplayController.cs new file mode 100644 index 00000000..13edb2b8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/AswanDisplayController.cs @@ -0,0 +1,179 @@ +using StoicGoose.Core.Interfaces; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Display +{ + public sealed unsafe class AswanDisplayController : DisplayControllerCommon + { + public AswanDisplayController(IMachine machine) : base(machine) { } + + protected override void RenderSleep(int y, int x) + { + DisplayUtilities.CopyPixel((255, 255, 255), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderBackColor(int y, int x) + { + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[backColorIndex & 0b0111])), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderSCR1(int y, int x) + { + if (!scr1Enable) return; + + var scrollX = (x + scr1ScrollX) & 0xFF; + var scrollY = (y + scr1ScrollY) & 0xFF; + + var mapOffset = (uint)((scr1Base << 11) | ((scrollY >> 3) << 6) | ((scrollX >> 3) << 1)); + var attribs = ReadMemory16(mapOffset); + var tileNum = (ushort)(attribs & 0x01FF); + var tilePal = (byte)((attribs >> 9) & 0b1111); + + var pixelColor = DisplayUtilities.ReadPixel(machine, tileNum, scrollY ^ (((attribs >> 15) & 0b1) * 7), scrollX ^ (((attribs >> 14) & 0b1) * 7), false, false, false); + + var isOpaque = !IsBitSet(tilePal, 2) || pixelColor != 0; + if (!isOpaque) return; + + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[palMonoData[tilePal][pixelColor & 0b11]])), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderSCR2(int y, int x) + { + if (!scr2Enable) return; + + var scrollX = (x + scr2ScrollX) & 0xFF; + var scrollY = (y + scr2ScrollY) & 0xFF; + + var mapOffset = (uint)((scr2Base << 11) | ((scrollY >> 3) << 6) | ((scrollX >> 3) << 1)); + var attribs = ReadMemory16(mapOffset); + var tileNum = (ushort)(attribs & 0x01FF); + var tilePal = (byte)((attribs >> 9) & 0b1111); + + var isVisible = !scr2WindowEnable || (scr2WindowEnable && ((!scr2WindowDisplayOutside && IsInsideSCR2Window(y, x)) || (scr2WindowDisplayOutside && IsOutsideSCR2Window(y, x)))); + if (!isVisible) return; + + var pixelColor = DisplayUtilities.ReadPixel(machine, tileNum, scrollY ^ (((attribs >> 15) & 0b1) * 7), scrollX ^ (((attribs >> 14) & 0b1) * 7), false, false, false); + + var isOpaque = !IsBitSet(tilePal, 2) || pixelColor != 0; + if (!isOpaque) return; + + isUsedBySCR2[(y * HorizontalDisp) + x] = true; + + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[palMonoData[tilePal][pixelColor & 0b11]])), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderSprites(int y, int x) + { + if (!sprEnable) return; + + if (x == 0) + { + activeSpriteCountOnLine = 0; + for (var i = 0; i < spriteCountNextFrame; i++) + { + var spriteY = (spriteData[i] >> 16) & 0xFF; + if ((byte)(y - spriteY) <= 7 && activeSpriteCountOnLine < maxSpritesPerLine) + activeSpritesOnLine[activeSpriteCountOnLine++] = spriteData[i]; + } + } + + for (var i = 0; i < activeSpriteCountOnLine; i++) + { + var activeSprite = activeSpritesOnLine[i]; + + var spriteX = (activeSprite >> 24) & 0xFF; + if (x < 0 || x >= HorizontalDisp || (byte)(x - spriteX) > 7) continue; + + var windowDisplayOutside = ((activeSprite >> 12) & 0b1) == 0b1; + if (!sprWindowEnable || (sprWindowEnable && (windowDisplayOutside != IsInsideSPRWindow(y, x)))) + { + var tileNum = (ushort)(activeSprite & 0x01FF); + var tilePal = (byte)((activeSprite >> 9) & 0b111); + var priorityAboveSCR2 = ((activeSprite >> 13) & 0b1) == 0b1; + var spriteY = (activeSprite >> 16) & 0xFF; + + var isVisible = !isUsedBySCR2[(y * HorizontalDisp) + x] || priorityAboveSCR2; + if (!isVisible) continue; + + var pixelColor = DisplayUtilities.ReadPixel(machine, tileNum, (byte)((y - spriteY) ^ (((activeSprite >> 15) & 0b1) * 7)), (byte)((x - spriteX) ^ (((activeSprite >> 14) & 0b1) * 7)), false, false, false); + + var isOpaque = !IsBitSet(tilePal, 2) || pixelColor != 0; + if (!isOpaque) continue; + + tilePal += 8; + + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[palMonoData[tilePal][pixelColor & 0b11]])), outputFramebuffer, x, y, HorizontalDisp); + } + } + } + + public override byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x01: + /* REG_BACK_COLOR */ + retVal |= (byte)(backColorIndex & 0b111); + break; + + case 0x04: + /* REG_SPR_BASE */ + retVal |= (byte)(sprBase & 0b11111); + break; + + case 0x07: + /* REG_MAP_BASE */ + retVal |= (byte)((scr1Base & 0b111) << 0); + retVal |= (byte)((scr2Base & 0b111) << 4); + break; + + case 0x14: + /* REG_LCD_CTRL */ + ChangeBit(ref retVal, 0, lcdActive); + break; + + default: + /* Fall through to common */ + retVal = base.ReadPort(port); + break; + } + + return retVal; + } + + public override void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x01: + /* REG_BACK_COLOR */ + backColorIndex = (byte)(value & 0b111); + break; + + case 0x04: + /* REG_SPR_BASE */ + sprBase = (byte)(value & 0b11111); + break; + + case 0x07: + /* REG_MAP_BASE */ + scr1Base = (byte)((value >> 0) & 0b111); + scr2Base = (byte)((value >> 4) & 0b111); + break; + + case 0x14: + /* REG_LCD_CTRL */ + lcdActive = IsBitSet(value, 0); + break; + + default: + /* Fall through to common */ + base.WritePort(port, value); + break; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/AswanDisplayController.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/AswanDisplayController.cs.meta new file mode 100644 index 00000000..ce2209d9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/AswanDisplayController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7245d0f687e243a4d9389a2c3c37d708 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayControllerCommon.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayControllerCommon.cs new file mode 100644 index 00000000..11249218 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayControllerCommon.cs @@ -0,0 +1,773 @@ +using System; +using System.Runtime.InteropServices; + +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Interfaces; +using StoicGoose.Core.Machines; +using StoicGooseUnity; +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Display +{ + public unsafe abstract class DisplayControllerCommon : IPortAccessComponent + { + public const int HorizontalDisp = 224; + public const int HorizontalBlank = 32; + public const int HorizontalTotal = HorizontalDisp + HorizontalBlank; + public const double HorizontalClock = MachineCommon.CpuClock / HorizontalTotal; + + public const int VerticalDisp = 144; + public const int VerticalBlank = 15; + public const int VerticalTotal = VerticalDisp + VerticalBlank; + public const double VerticalClock = 12000.0 / VerticalTotal; + + public const int ScreenWidth = HorizontalDisp; + public const int ScreenHeight = VerticalDisp; + + protected const int maxSpriteCount = 128; + protected const int maxSpritesPerLine = 32; + + [Flags] + public enum DisplayInterrupts + { + None = 0, + LineCompare = 1 << 0, + VBlankTimer = 1 << 1, + VBlank = 1 << 2, + HBlankTimer = 1 << 3 + } + + protected readonly uint[] spriteData = new uint[maxSpriteCount]; + protected readonly uint[] spriteDataNextFrame = new uint[maxSpriteCount]; + protected readonly uint[] activeSpritesOnLine = new uint[maxSpritesPerLine]; + + protected readonly bool[] isUsedBySCR2 = new bool[HorizontalDisp * VerticalDisp]; + + protected int spriteCountNextFrame = 0, activeSpriteCountOnLine = 0; + + protected int cycleCount = 0; + //protected readonly byte[] outputFramebuffer = new byte[ScreenWidth * ScreenHeight * 4]; + + + #region //指针化 outputFramebuffer + protected byte[] outputFramebuffer_src; + protected GCHandle outputFramebuffer_handle; + protected IntPtr outputFramebuffer_IntPtr; + protected byte* outputFramebuffer; + protected int outputFramebufferLength; + protected bool outputFramebuffer_IsNull => outputFramebuffer == null; + protected byte[] outputFramebuffer_set + { + set + { + outputFramebuffer_handle.ReleaseGCHandle(); + outputFramebuffer_src = value; + outputFramebufferLength = value.Length; + outputFramebuffer_src.GetObjectPtr(ref outputFramebuffer_handle, ref outputFramebuffer, out outputFramebuffer_IntPtr); + } + } + #endregion + + + + //public Action<byte[]> SendFramebuffer { get; set; } = default; + public Action<IntPtr, long> SendFramebuffer { get; set; } = default; + + protected readonly IMachine machine = default; + + /* REG_DISP_CTRL */ + protected bool scr1Enable, scr2Enable, sprEnable, sprWindowEnable, scr2WindowDisplayOutside, scr2WindowEnable; + /* REG_BACK_COLOR */ + protected byte backColorIndex; + /* REG_LINE_xxx */ + protected int lineCurrent, lineCompare; + /* REG_SPR_xxx */ + protected int sprBase, sprFirst, sprCount; + /* REG_MAP_BASE */ + protected int scr1Base, scr2Base; + /* REG_SCR2_WIN_xx */ + protected int scr2WinX0, scr2WinY0, scr2WinX1, scr2WinY1; + /* REG_SPR_WIN_xx */ + protected int sprWinX0, sprWinY0, sprWinX1, sprWinY1; + /* REG_SCR1_xx */ + protected int scr1ScrollX, scr1ScrollY; + /* REG_SCR2_xx */ + protected int scr2ScrollX, scr2ScrollY; + /* REG_LCD_xxx */ + protected bool lcdActive; + protected bool iconSleep, iconVertical, iconHorizontal, iconAux1, iconAux2, iconAux3; + protected int vtotal, vsync; + /* REG_PALMONO_POOL_x */ + protected readonly byte[] palMonoPools = default; + /* REG_PALMONO_x */ + protected readonly byte[][] palMonoData = default; + /* REG_xTMR_xxx */ + protected readonly DisplayTimer hBlankTimer = new(), vBlankTimer = new(); + + public DisplayControllerCommon(IMachine machine) + { + this.machine = machine; + + //初始化指针 + outputFramebuffer_set = new byte[ScreenWidth * ScreenHeight * 4]; + + palMonoPools = new byte[8]; + palMonoData = new byte[16][]; + for (var i = 0; i < palMonoData.GetLength(0); i++) palMonoData[i] = new byte[4]; + } + + public void Reset() + { + cycleCount = 0; + + //Array.Fill<byte>(outputFramebuffer, 255); + for (var i = 0; i < outputFramebufferLength; i++) + outputFramebuffer[i] = 255; + + Array.Fill(isUsedBySCR2, false); + + Array.Fill<uint>(spriteData, 0); + Array.Fill<uint>(spriteDataNextFrame, 0); + Array.Fill<uint>(activeSpritesOnLine, 0); + + spriteCountNextFrame = 0; + activeSpriteCountOnLine = 0; + + ResetRegisters(); + } + + protected virtual void ResetRegisters() + { + scr1Enable = scr2Enable = sprEnable = sprWindowEnable = scr2WindowDisplayOutside = scr2WindowEnable = false; + backColorIndex = 0; + lineCurrent = lineCompare = 0; + sprBase = sprFirst = sprCount = 0; + scr1Base = scr2Base = 0; + scr2WinX0 = scr2WinY0 = scr2WinX1 = scr2WinY1 = 0; + sprWinX0 = sprWinY0 = sprWinX1 = sprWinY1 = 0; + scr1ScrollX = scr1ScrollY = 0; + scr2ScrollX = scr2ScrollY = 0; + lcdActive = true; /* NOTE: Final Lap 2000 depends on bootstrap doing this, otherwise LCD stays off? */ + iconSleep = iconVertical = iconHorizontal = iconAux1 = iconAux2 = iconAux3 = false; + vtotal = VerticalTotal - 1; + vsync = VerticalTotal - 4; /* NOTE: Full usage/meaning unknown, so we're ignoring it for now */ + Array.Fill<byte>(palMonoPools, 0); + for (var i = 0; i < palMonoData.GetLength(0); i++) Array.Fill<byte>(palMonoData[i], 0); + hBlankTimer.Reset(); + vBlankTimer.Reset(); + } + + public void Shutdown() + { + /* Nothing to do... */ + } + + public DisplayInterrupts Step(int clockCyclesInStep) + { + var interrupt = DisplayInterrupts.None; + + cycleCount += clockCyclesInStep; + + if (cycleCount >= HorizontalTotal) + { + /* Sprite fetch */ + if (lineCurrent == VerticalDisp - 2) + { + spriteCountNextFrame = 0; + for (var j = sprFirst; j < sprFirst + Math.Min(maxSpriteCount, sprCount); j++) + { + var k = (uint)((sprBase << 9) + (j << 2)); + spriteDataNextFrame[spriteCountNextFrame++] = (uint)(machine.ReadMemory(k + 3) << 24 | machine.ReadMemory(k + 2) << 16 | machine.ReadMemory(k + 1) << 8 | machine.ReadMemory(k + 0)); + } + } + + /* Render pixels */ + for (var x = 0; x < HorizontalDisp; x++) + RenderPixel(lineCurrent, x); + + /* Line compare interrupt */ + if (lineCurrent == lineCompare) + interrupt |= DisplayInterrupts.LineCompare; + + /* H-timer interrupt */ + if (hBlankTimer.Step()) + interrupt |= DisplayInterrupts.HBlankTimer; + + /* V-blank interrupt */ + if (lineCurrent == VerticalDisp) + { + interrupt |= DisplayInterrupts.VBlank; + + /* V-timer interrupt */ + if (vBlankTimer.Step()) + interrupt |= DisplayInterrupts.VBlankTimer; + + /* Transfer framebuffer */ + //SendFramebuffer?.Invoke(outputFramebuffer.Clone() as byte[]); + SendFramebuffer?.Invoke(outputFramebuffer_IntPtr, outputFramebufferLength); + } + + /* Advance scanline */ + lineCurrent++; + + /* Is frame finished? */ + if (lineCurrent > Math.Max(VerticalDisp, vtotal)) + { + /* Copy sprite data for next frame */ + for (int j = 0, k = spriteCountNextFrame - 1; k >= 0; j++, k--) spriteData[j] = spriteDataNextFrame[k]; + Array.Fill<uint>(spriteDataNextFrame, 0); + + /* Reset variables */ + lineCurrent = 0; + Array.Fill(isUsedBySCR2, false); + } + + /* End of scanline */ + cycleCount = 0; + } + + return interrupt; + } + + protected void RenderPixel(int y, int x) + { + if (y < 0 || y >= VerticalDisp || x < 0 || x >= HorizontalDisp) return; + + if (lcdActive) + { + RenderBackColor(y, x); + RenderSCR1(y, x); + RenderSCR2(y, x); + RenderSprites(y, x); + } + else + { + /* LCD sleeping */ + RenderSleep(y, x); + } + } + + protected abstract void RenderSleep(int y, int x); + protected abstract void RenderBackColor(int y, int x); + protected abstract void RenderSCR1(int y, int x); + protected abstract void RenderSCR2(int y, int x); + protected abstract void RenderSprites(int y, int x); + + protected static void ValidateWindowCoordinates(ref int x0, ref int x1, ref int y0, ref int y1) + { + /* Thank you for this fix, for the encouragement and hints and advice, for just having been there... Thank you for everything, Near. + * https://forum.fobby.net/index.php?t=msg&goto=6085 */ + + if (x0 > x1) + (x1, x0) = (x0, x1); + + if (y0 > y1) + (y1, y0) = (y0, y1); + } + + protected bool IsInsideSCR2Window(int y, int x) + { + var x0 = scr2WinX0; + var x1 = scr2WinX1; + var y0 = scr2WinY0; + var y1 = scr2WinY1; + + ValidateWindowCoordinates(ref x0, ref x1, ref y0, ref y1); + + return ((x >= x0 && x <= x1) || (x >= x1 && x <= x0)) && + ((y >= y0 && y <= y1) || (y >= y1 && y <= y0)); + } + + protected bool IsOutsideSCR2Window(int y, int x) + { + var x0 = scr2WinX0; + var x1 = scr2WinX1; + var y0 = scr2WinY0; + var y1 = scr2WinY1; + + ValidateWindowCoordinates(ref x0, ref x1, ref y0, ref y1); + + return x < x0 || x > x1 || y < y0 || y > y1; + } + + protected bool IsInsideSPRWindow(int y, int x) + { + var x0 = sprWinX0; + var x1 = sprWinX1; + var y0 = sprWinY0; + var y1 = sprWinY1; + + ValidateWindowCoordinates(ref x0, ref x1, ref y0, ref y1); + + return ((x >= x0 && x <= x1) || (x >= x1 && x <= x0)) && + ((y >= y0 && y <= y1) || (y >= y1 && y <= y0)); + } + + protected byte ReadMemory8(uint address) => machine.ReadMemory(address); + protected ushort ReadMemory16(uint address) => (ushort)(machine.ReadMemory(address + 1) << 8 | machine.ReadMemory(address)); + protected uint ReadMemory32(uint address) => (uint)(machine.ReadMemory(address + 3) << 24 | machine.ReadMemory(address + 2) << 16 | machine.ReadMemory(address + 1) << 8 | machine.ReadMemory(address)); + + public virtual byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x00: + /* REG_DISP_CTRL */ + ChangeBit(ref retVal, 0, scr1Enable); + ChangeBit(ref retVal, 1, scr2Enable); + ChangeBit(ref retVal, 2, sprEnable); + ChangeBit(ref retVal, 3, sprWindowEnable); + ChangeBit(ref retVal, 4, scr2WindowDisplayOutside); + ChangeBit(ref retVal, 5, scr2WindowEnable); + break; + + case 0x02: + /* REG_LINE_CUR */ + retVal |= (byte)(lineCurrent & 0xFF); + break; + + case 0x03: + /* REG_LINE_CMP */ + retVal |= (byte)(lineCompare & 0xFF); + break; + + case 0x05: + /* REG_SPR_FIRST */ + retVal |= (byte)(sprFirst & 0x7F); + break; + + case 0x06: + /* REG_SPR_COUNT */ + retVal |= (byte)(sprCount & 0xFF); + break; + + case 0x08: + /* REG_SCR2_WIN_X0 */ + retVal |= (byte)(scr2WinX0 & 0xFF); + break; + + case 0x09: + /* REG_SCR2_WIN_Y0 */ + retVal |= (byte)(scr2WinY0 & 0xFF); + break; + + case 0x0A: + /* REG_SCR2_WIN_X1 */ + retVal |= (byte)(scr2WinX1 & 0xFF); + break; + + case 0x0B: + /* REG_SCR2_WIN_Y1 */ + retVal |= (byte)(scr2WinY1 & 0xFF); + break; + + case 0x0C: + /* REG_SPR_WIN_X0 */ + retVal |= (byte)(sprWinX0 & 0xFF); + break; + + case 0x0D: + /* REG_SPR_WIN_Y0 */ + retVal |= (byte)(sprWinY0 & 0xFF); + break; + + case 0x0E: + /* REG_SPR_WIN_X1 */ + retVal |= (byte)(sprWinX1 & 0xFF); + break; + + case 0x0F: + /* REG_SPR_WIN_Y1 */ + retVal |= (byte)(sprWinY1 & 0xFF); + break; + + case 0x10: + /* REG_SCR1_X */ + retVal |= (byte)(scr1ScrollX & 0xFF); + break; + + case 0x11: + /* REG_SCR1_Y */ + retVal |= (byte)(scr1ScrollY & 0xFF); + break; + + case 0x12: + /* REG_SCR2_X */ + retVal |= (byte)(scr2ScrollX & 0xFF); + break; + + case 0x13: + /* REG_SCR2_Y */ + retVal |= (byte)(scr2ScrollY & 0xFF); + break; + + case 0x15: + /* REG_LCD_ICON */ + ChangeBit(ref retVal, 0, iconSleep); + ChangeBit(ref retVal, 1, iconVertical); + ChangeBit(ref retVal, 2, iconHorizontal); + ChangeBit(ref retVal, 3, iconAux1); + ChangeBit(ref retVal, 4, iconAux2); + ChangeBit(ref retVal, 5, iconAux3); + break; + + case 0x16: + /* REG_LCD_VTOTAL */ + retVal |= (byte)(vtotal & 0xFF); + break; + + case 0x17: + /* REG_LCD_VSYNC */ + retVal |= (byte)(vsync & 0xFF); + break; + + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + /* REG_PALMONO_POOL_x */ + retVal |= (byte)(palMonoPools[((port & 0b11) << 1) | 0] << 0); + retVal |= (byte)(palMonoPools[((port & 0b11) << 1) | 1] << 4); + break; + + case ushort _ when port >= 0x20 && port <= 0x3F: + /* REG_PALMONO_x */ + retVal |= (byte)(palMonoData[(port >> 1) & 0b1111][((port & 0b1) << 1) | 0] << 0); + retVal |= (byte)(palMonoData[(port >> 1) & 0b1111][((port & 0b1) << 1) | 1] << 4); + break; + + case 0xA2: + /* REG_TMR_CTRL */ + ChangeBit(ref retVal, 0, hBlankTimer.Enable); + ChangeBit(ref retVal, 1, hBlankTimer.Repeating); + ChangeBit(ref retVal, 2, vBlankTimer.Enable); + ChangeBit(ref retVal, 3, vBlankTimer.Repeating); + break; + + case 0xA4: + case 0xA5: + /* REG_HTMR_FREQ */ + retVal |= (byte)((hBlankTimer.Frequency >> ((port & 0b1) * 8)) & 0xFF); + break; + + case 0xA6: + case 0xA7: + /* REG_VTMR_FREQ */ + retVal |= (byte)((vBlankTimer.Frequency >> ((port & 0b1) * 8)) & 0xFF); + break; + + case 0xA8: + case 0xA9: + /* REG_HTMR_CTR */ + retVal |= (byte)((hBlankTimer.Counter >> ((port & 0b1) * 8)) & 0xFF); + break; + + case 0xAA: + case 0xAB: + /* REG_VTMR_CTR */ + retVal |= (byte)((vBlankTimer.Counter >> ((port & 0b1) * 8)) & 0xFF); + break; + } + + return retVal; + } + + public virtual void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x00: + /* REG_DISP_CTRL */ + scr1Enable = IsBitSet(value, 0); + scr2Enable = IsBitSet(value, 1); + sprEnable = IsBitSet(value, 2); + sprWindowEnable = IsBitSet(value, 3); + scr2WindowDisplayOutside = IsBitSet(value, 4); + scr2WindowEnable = IsBitSet(value, 5); + break; + + case 0x03: + /* REG_LINE_CMP */ + lineCompare = (byte)(value & 0xFF); + break; + + case 0x05: + /* REG_SPR_FIRST */ + sprFirst = (byte)(value & 0x7F); + break; + + case 0x06: + /* REG_SPR_COUNT */ + sprCount = (byte)(value & 0xFF); + break; + + case 0x08: + /* REG_SCR2_WIN_X0 */ + scr2WinX0 = (byte)(value & 0xFF); + break; + + case 0x09: + /* REG_SCR2_WIN_Y0 */ + scr2WinY0 = (byte)(value & 0xFF); + break; + + case 0x0A: + /* REG_SCR2_WIN_X1 */ + scr2WinX1 = (byte)(value & 0xFF); + break; + + case 0x0B: + /* REG_SCR2_WIN_Y1 */ + scr2WinY1 = (byte)(value & 0xFF); + break; + + case 0x0C: + /* REG_SPR_WIN_X0 */ + sprWinX0 = (byte)(value & 0xFF); + break; + + case 0x0D: + /* REG_SPR_WIN_Y0 */ + sprWinY0 = (byte)(value & 0xFF); + break; + + case 0x0E: + /* REG_SPR_WIN_X1 */ + sprWinX1 = (byte)(value & 0xFF); + break; + + case 0x0F: + /* REG_SPR_WIN_Y1 */ + sprWinY1 = (byte)(value & 0xFF); + break; + + case 0x10: + /* REG_SCR1_X */ + scr1ScrollX = (byte)(value & 0xFF); + break; + + case 0x11: + /* REG_SCR1_Y */ + scr1ScrollY = (byte)(value & 0xFF); + break; + + case 0x12: + /* REG_SCR2_X */ + scr2ScrollX = (byte)(value & 0xFF); + break; + + case 0x13: + /* REG_SCR2_Y */ + scr2ScrollY = (byte)(value & 0xFF); + break; + + case 0x15: + /* REG_LCD_ICON */ + iconSleep = IsBitSet(value, 0); + iconVertical = IsBitSet(value, 1); + iconHorizontal = IsBitSet(value, 2); + iconAux1 = IsBitSet(value, 3); + iconAux2 = IsBitSet(value, 4); + iconAux3 = IsBitSet(value, 5); + break; + + case 0x16: + /* REG_LCD_VTOTAL */ + vtotal = (byte)(value & 0xFF); + break; + + case 0x17: + /* REG_LCD_VSYNC */ + vsync = (byte)(value & 0xFF); + break; + + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + /* REG_PALMONO_POOL_x */ + palMonoPools[((port & 0b11) << 1) | 0] = (byte)((value >> 0) & 0b1111); + palMonoPools[((port & 0b11) << 1) | 1] = (byte)((value >> 4) & 0b1111); + break; + + case ushort _ when port >= 0x20 && port <= 0x3F: + /* REG_PALMONO_x */ + palMonoData[(port >> 1) & 0b1111][((port & 0b1) << 1) | 0] = (byte)((value >> 0) & 0b111); + palMonoData[(port >> 1) & 0b1111][((port & 0b1) << 1) | 1] = (byte)((value >> 4) & 0b111); + break; + + case 0xA2: + /* REG_TMR_CTRL */ + hBlankTimer.Enable = IsBitSet(value, 0); + hBlankTimer.Repeating = IsBitSet(value, 1); + vBlankTimer.Enable = IsBitSet(value, 2); + vBlankTimer.Repeating = IsBitSet(value, 3); + break; + + case 0xA4: + /* REG_HTMR_FREQ (low) */ + hBlankTimer.Frequency = (ushort)((hBlankTimer.Frequency & 0xFF00) | value); + hBlankTimer.Counter = (ushort)((hBlankTimer.Counter & 0xFF00) | value); + break; + + case 0xA5: + /* REG_HTMR_FREQ (high) */ + hBlankTimer.Frequency = (ushort)((hBlankTimer.Frequency & 0x00FF) | (value << 8)); + hBlankTimer.Counter = (ushort)((hBlankTimer.Counter & 0x00FF) | (value << 8)); + break; + + case 0xA6: + /* REG_VTMR_FREQ (low) */ + vBlankTimer.Frequency = (ushort)((vBlankTimer.Frequency & 0xFF00) | value); + vBlankTimer.Counter = (ushort)((vBlankTimer.Counter & 0xFF00) | value); + break; + + case 0xA7: + /* REG_VTMR_FREQ (high) */ + vBlankTimer.Frequency = (ushort)((vBlankTimer.Frequency & 0x00FF) | (value << 8)); + vBlankTimer.Counter = (ushort)((vBlankTimer.Counter & 0x00FF) | (value << 8)); + break; + } + } + + [Port("REG_DISP_CTRL", 0x000)] + [BitDescription("SCR1 enable", 0)] + public bool Scr1Enable => scr1Enable; + [Port("REG_DISP_CTRL", 0x000)] + [BitDescription("SCR2 enable", 1)] + public bool Scr2Enable => scr2Enable; + [Port("REG_DISP_CTRL", 0x000)] + [BitDescription("SPR enable", 2)] + public bool SprEnable => sprEnable; + [Port("REG_DISP_CTRL", 0x000)] + [BitDescription("SPR window enable", 3)] + public bool SprWindowEnable => sprWindowEnable; + [Port("REG_DISP_CTRL", 0x000)] + [BitDescription("SCR2 window mode; display outside?", 4)] + public bool Scr2WindowDisplayOutside => scr2WindowDisplayOutside; + [Port("REG_DISP_CTRL", 0x000)] + [BitDescription("SCR2 window enable", 5)] + public bool Scr2WindowEnable => scr2WindowEnable; + [Port("REG_BACK_COLOR", 0x001)] + [BitDescription("Background color pool index", 0, 2)] + public virtual byte BackColorIndex => backColorIndex; + [Port("REG_LINE_CUR", 0x002)] + [BitDescription("Current line being drawn")] + public int LineCurrent => lineCurrent; + [Port("REG_LINE_CMP", 0x003)] + [BitDescription("Line compare interrupt line")] + public int LineCompare => lineCompare; + [Port("REG_SPR_BASE", 0x004)] + [BitDescription("Sprite table base address", 0, 4)] + [Format("X4", 9)] + public virtual int SprBase => sprBase; + [Port("REG_SPR_FIRST", 0x005)] + [BitDescription("First sprite to draw", 0, 6)] + public int SprFirst => sprFirst; + [Port("REG_SPR_COUNT", 0x006)] + [BitDescription("Number of sprites to draw")] + public int SprCount => sprCount; + [Port("REG_MAP_BASE", 0x007)] + [BitDescription("SCR1 base address", 0, 2)] + [Format("X4", 11)] + public virtual int Scr1Base => scr1Base; + [Port("REG_MAP_BASE", 0x007)] + [BitDescription("SCR2 base address", 4, 6)] + [Format("X4", 11)] + public virtual int Scr2Base => scr2Base; + [Port("REG_SCR2_WIN_X0", 0x008)] + [BitDescription("Top-left X of SCR2 window")] + public int Scr2WinX0 => scr2WinX0; + [Port("REG_SCR2_WIN_Y0", 0x009)] + [BitDescription("Top-left Y of SCR2 window")] + public int Scr2WinY0 => scr2WinY0; + [Port("REG_SCR2_WIN_X1", 0x00A)] + [BitDescription("Bottom-right X of SCR2 window")] + public int Scr2WinX1 => scr2WinX1; + [Port("REG_SCR2_WIN_Y1", 0x00B)] + [BitDescription("Bottom-right Y of SCR2 window")] + public int Scr2WinY1 => scr2WinY1; + [Port("REG_SPR_WIN_X0", 0x00C)] + [BitDescription("Top-left X of SPR window")] + public int SprWinX0 => sprWinX0; + [Port("REG_SPR_WIN_Y0", 0x00D)] + [BitDescription("Top-left Y of SPR window")] + public int SprWinY0 => sprWinY0; + [Port("REG_SPR_WIN_X1", 0x00E)] + [BitDescription("Bottom-right X of SPR window")] + public int SprWinX1 => sprWinX1; + [Port("REG_SPR_WIN_Y1", 0x00F)] + [BitDescription("Bottom-right Y of SPR window")] + public int SprWinY1 => sprWinY1; + [Port("REG_SCR1_X", 0x010)] + [BitDescription("SCR1 X scroll")] + public int Scr1ScrollX => scr1ScrollX; + [Port("REG_SCR1_Y", 0x011)] + [BitDescription("SCR1 Y scroll")] + public int Scr1ScrollY => scr1ScrollY; + [Port("REG_SCR2_X", 0x012)] + [BitDescription("SCR2 X scroll")] + public int Scr2ScrollX => scr2ScrollX; + [Port("REG_SCR2_Y", 0x013)] + [BitDescription("SCR2 Y scroll")] + public int Scr2ScrollY => scr2ScrollY; + [Port("REG_LCD_CTRL", 0x014)] + [BitDescription("LCD sleep mode; is LCD active?", 0)] + public bool LcdActive => lcdActive; + [Port("REG_LCD_ICON", 0x015)] + [BitDescription("Sleep indicator", 0)] + public bool IconSleep => iconSleep; + [Port("REG_LCD_ICON", 0x015)] + [BitDescription("Vertical orientation indicator", 1)] + public bool IconVertical => iconVertical; + [Port("REG_LCD_ICON", 0x015)] + [BitDescription("Horizontal orientation indicator", 2)] + public bool IconHorizontal => iconHorizontal; + [Port("REG_LCD_ICON", 0x015)] + [BitDescription("Auxiliary 1 (Small circle)", 3)] + public bool IconAux1 => iconAux1; + [Port("REG_LCD_ICON", 0x015)] + [BitDescription("Auxiliary 2 (Medium circle)", 4)] + public bool IconAux2 => iconAux2; + [Port("REG_LCD_ICON", 0x015)] + [BitDescription("Auxiliary 3 (Big circle)", 5)] + public bool IconAux3 => iconAux3; + [Port("REG_LCD_VTOTAL", 0x016)] + [BitDescription("Display VTOTAL")] + public int VTotal => vtotal; + [Port("REG_LCD_VSYNC", 0x017)] + [BitDescription("VSYNC line position")] + public int VSync => vsync; + [Port("REG_TMR_CTRL", 0x0A2)] + [BitDescription("H-blank timer enable", 0)] + public bool HBlankTimerEnable => hBlankTimer.Enable; + [Port("REG_TMR_CTRL", 0x0A2)] + [BitDescription("H-blank timer mode; is repeating?", 1)] + public bool HBlankTimerRepeating => hBlankTimer.Repeating; + [Port("REG_TMR_CTRL", 0x0A2)] + [BitDescription("V-blank timer enable", 2)] + public bool VBlankTimerEnable => vBlankTimer.Enable; + [Port("REG_TMR_CTRL", 0x0A2)] + [BitDescription("V-blank timer mode; is repeating?", 3)] + public bool VBlankTimerRepeating => vBlankTimer.Repeating; + [Port("REG_HTMR_FREQ", 0x0A4, 0x0A5)] + [BitDescription("H-blank timer frequency")] + public ushort HBlankTimerFrequency => hBlankTimer.Frequency; + [Port("REG_VTMR_FREQ", 0x0A6, 0x0A7)] + [BitDescription("V-blank timer frequency")] + public ushort VBlankTimerFrequency => vBlankTimer.Frequency; + [Port("REG_HTMR_CTR", 0x0A8, 0x0A9)] + [BitDescription("H-blank timer counter")] + public ushort HBlankTimerCounter => hBlankTimer.Counter; + [Port("REG_VTMR_CTR", 0x0AA, 0x0AB)] + [BitDescription("V-blank timer counter")] + public ushort VBlankTimerCounter => vBlankTimer.Counter; + + // TODO: reorganize palmono stuff & add attributes + + public byte[] PalMonoPools => palMonoPools; + public byte[][] PalMonoData => palMonoData; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayControllerCommon.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayControllerCommon.cs.meta new file mode 100644 index 00000000..0370aaca --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayControllerCommon.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1a27fcff4fc28e846845555e4cd903cd \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayTimer.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayTimer.cs new file mode 100644 index 00000000..c94518ca --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayTimer.cs @@ -0,0 +1,40 @@ +namespace StoicGoose.Core.Display +{ + public class DisplayTimer + { + public bool Enable { get; set; } + public bool Repeating { get; set; } + public ushort Frequency { get; set; } + + public ushort Counter { get; set; } + + public DisplayTimer() + { + Reset(); + } + + public void Reset() + { + Enable = Repeating = false; + Frequency = Counter = 0; + } + + public void Reload() + { + Counter = Frequency; + } + + public bool Step() + { + var counterNew = (ushort)(Counter - 1); + + if (Enable && Counter != 0) + { + Counter = counterNew; + if (Repeating && Counter == 0) + Reload(); + } + return counterNew == 0; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayTimer.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayTimer.cs.meta new file mode 100644 index 00000000..e23e0f0d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayTimer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 25ad8c5efc6af8d45b2500b9c3411df0 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayUtilities.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayUtilities.cs new file mode 100644 index 00000000..eccecc05 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayUtilities.cs @@ -0,0 +1,73 @@ +using System; +using StoicGoose.Core.Interfaces; + +namespace StoicGoose.Core.Display +{ + public static class DisplayUtilities + { + // TODO: WSC high contrast mode + + private static ushort ReadMemory16(IMachine machine, uint address) => (ushort)(machine.ReadMemory(address + 1) << 8 | machine.ReadMemory(address)); + private static uint ReadMemory32(IMachine machine, uint address) => (uint)(machine.ReadMemory(address + 3) << 24 | machine.ReadMemory(address + 2) << 16 | machine.ReadMemory(address + 1) << 8 | machine.ReadMemory(address)); + + public static byte ReadPixel(IMachine machine, ushort tile, int y, int x, bool isPacked, bool is4bpp, bool isColor) + { + /* http://perfectkiosk.net/stsws.html#color_mode */ + + /* WonderSwan OR Color/Crystal in 2bpp mode */ + if (!isColor || (isColor && !is4bpp)) + { + var data = ReadMemory16(machine, (uint)(0x2000 + (tile << 4) + ((y % 8) << 1))); + return (byte)((((data >> 15 - (x % 8)) & 0b1) << 1 | ((data >> 7 - (x % 8)) & 0b1)) & 0b11); + } + + /* WonderSwan Color/Crystal in 4bpp mode */ + else if (isColor && is4bpp) + { + /* 4bpp planar mode */ + if (!isPacked) + { + var data = ReadMemory32(machine, (uint)(0x4000 + ((tile & 0x03FF) << 5) + ((y % 8) << 2))); + return (byte)((((data >> 31 - (x % 8)) & 0b1) << 3 | ((data >> 23 - (x % 8)) & 0b1) << 2 | ((data >> 15 - (x % 8)) & 0b1) << 1 | ((data >> 7 - (x % 8)) & 0b1)) & 0b1111); + } + + /* 4bpp packed mode */ + else if (isPacked) + { + var data = machine.ReadMemory((ushort)(0x4000 + ((tile & 0x03FF) << 5) + ((y % 8) << 2) + ((x % 8) >> 1))); + return (byte)((data >> 4 - (((x % 8) & 0b1) << 2)) & 0b1111); + } + } + + throw new Exception("Invalid display controller configuration"); + } + + public static ushort ReadColor(IMachine machine, byte paletteIdx, byte colorIdx) + { + var address = (uint)(0x0FE00 + (paletteIdx << 5) + (colorIdx << 1)); + return (ushort)(machine.ReadMemory(address + 1) << 8 | machine.ReadMemory(address)); + } + + private static byte DuplicateBits(int value) => (byte)((value & 0b1111) | (value & 0b1111) << 4); + + public static (byte r, byte g, byte b) GeneratePixel(byte data) => (DuplicateBits(data), DuplicateBits(data), DuplicateBits(data)); + public static (byte r, byte g, byte b) GeneratePixel(ushort data) => (DuplicateBits(data >> 8), DuplicateBits(data >> 4), DuplicateBits(data >> 0)); + + public static unsafe void CopyPixel((byte r, byte g, byte b) pixel, byte* data, int x, int y, int stride) => CopyPixel(pixel, data, ((y * stride) + x) * 4); + public static unsafe void CopyPixel((byte r, byte g, byte b) pixel, byte* data, long address) + { + data[address + 0] = pixel.r; + data[address + 1] = pixel.g; + data[address + 2] = pixel.b; + data[address + 3] = 255; + } + //public static void CopyPixel((byte r, byte g, byte b) pixel, byte[] data, int x, int y, int stride) => CopyPixel(pixel, data, ((y * stride) + x) * 4); + //public static void CopyPixel((byte r, byte g, byte b) pixel, byte[] data, long address) + //{ + // data[address + 0] = pixel.r; + // data[address + 1] = pixel.g; + // data[address + 2] = pixel.b; + // data[address + 3] = 255; + //} + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayUtilities.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayUtilities.cs.meta new file mode 100644 index 00000000..75587f15 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/DisplayUtilities.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3ef0eca0ad43a254f80fdccdc5891b74 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/SphinxDisplayController.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/SphinxDisplayController.cs new file mode 100644 index 00000000..ac993b10 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/SphinxDisplayController.cs @@ -0,0 +1,259 @@ +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Interfaces; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Display +{ + public sealed unsafe class SphinxDisplayController : DisplayControllerCommon + { + // TODO: reimplement high contrast mode; also, get a WSC, figure out how it's supposed to look? + + /* REG_BACK_COLOR */ + byte backColorPalette; + /* REG_LCD_CTRL */ + bool lcdContrastHigh; + /* REG_DISP_MODE */ + bool displayPackedFormatSet, display4bppFlagSet, displayColorFlagSet; + + public SphinxDisplayController(IMachine machine) : base(machine) { } + + protected override void ResetRegisters() + { + base.ResetRegisters(); + + backColorPalette = 0; + lcdContrastHigh = false; + displayPackedFormatSet = display4bppFlagSet = displayColorFlagSet = false; + } + + protected override void RenderSleep(int y, int x) + { + DisplayUtilities.CopyPixel((0, 0, 0), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderBackColor(int y, int x) + { + if (displayColorFlagSet) + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel(DisplayUtilities.ReadColor(machine, backColorPalette, backColorIndex)), outputFramebuffer, x, y, HorizontalDisp); + else + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[backColorIndex & 0b0111])), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderSCR1(int y, int x) + { + if (!scr1Enable) return; + + var scrollX = (x + scr1ScrollX) & 0xFF; + var scrollY = (y + scr1ScrollY) & 0xFF; + + var mapOffset = (uint)((scr1Base << 11) | ((scrollY >> 3) << 6) | ((scrollX >> 3) << 1)); + var attribs = ReadMemory16(mapOffset); + var tileNum = (ushort)((attribs & 0x01FF) | (displayColorFlagSet ? (((attribs >> 13) & 0b1) << 9) : 0)); + var tilePal = (byte)((attribs >> 9) & 0b1111); + + var pixelColor = DisplayUtilities.ReadPixel(machine, tileNum, scrollY ^ (((attribs >> 15) & 0b1) * 7), scrollX ^ (((attribs >> 14) & 0b1) * 7), displayPackedFormatSet, display4bppFlagSet, displayColorFlagSet); + + var isOpaque = (!display4bppFlagSet && !IsBitSet(tilePal, 2)) || pixelColor != 0; + if (!isOpaque) return; + + if (displayColorFlagSet) + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel(DisplayUtilities.ReadColor(machine, tilePal, pixelColor)), outputFramebuffer, x, y, HorizontalDisp); + else + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[palMonoData[tilePal][pixelColor & 0b11]])), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderSCR2(int y, int x) + { + if (!scr2Enable) return; + + var scrollX = (x + scr2ScrollX) & 0xFF; + var scrollY = (y + scr2ScrollY) & 0xFF; + + var mapOffset = (uint)((scr2Base << 11) | ((scrollY >> 3) << 6) | ((scrollX >> 3) << 1)); + var attribs = ReadMemory16(mapOffset); + var tileNum = (ushort)((attribs & 0x01FF) | (displayColorFlagSet ? (((attribs >> 13) & 0b1) << 9) : 0)); + var tilePal = (byte)((attribs >> 9) & 0b1111); + + var isVisible = !scr2WindowEnable || (scr2WindowEnable && ((!scr2WindowDisplayOutside && IsInsideSCR2Window(y, x)) || (scr2WindowDisplayOutside && IsOutsideSCR2Window(y, x)))); + if (!isVisible) return; + + var pixelColor = DisplayUtilities.ReadPixel(machine, tileNum, scrollY ^ (((attribs >> 15) & 0b1) * 7), scrollX ^ (((attribs >> 14) & 0b1) * 7), displayPackedFormatSet, display4bppFlagSet, displayColorFlagSet); + + var isOpaque = (!display4bppFlagSet && !IsBitSet(tilePal, 2)) || pixelColor != 0; + if (!isOpaque) return; + + isUsedBySCR2[(y * HorizontalDisp) + x] = true; + + if (displayColorFlagSet) + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel(DisplayUtilities.ReadColor(machine, tilePal, pixelColor)), outputFramebuffer, x, y, HorizontalDisp); + else + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[palMonoData[tilePal][pixelColor & 0b11]])), outputFramebuffer, x, y, HorizontalDisp); + } + + protected override void RenderSprites(int y, int x) + { + if (!sprEnable) return; + + if (x == 0) + { + activeSpriteCountOnLine = 0; + for (var i = 0; i < spriteCountNextFrame; i++) + { + var spriteY = (spriteData[i] >> 16) & 0xFF; + if ((byte)(y - spriteY) <= 7 && activeSpriteCountOnLine < maxSpritesPerLine) + activeSpritesOnLine[activeSpriteCountOnLine++] = spriteData[i]; + } + } + + for (var i = 0; i < activeSpriteCountOnLine; i++) + { + var activeSprite = activeSpritesOnLine[i]; + + var spriteX = (activeSprite >> 24) & 0xFF; + if (x < 0 || x >= HorizontalDisp || (byte)(x - spriteX) > 7) continue; + + var windowDisplayOutside = ((activeSprite >> 12) & 0b1) == 0b1; + if (!sprWindowEnable || (sprWindowEnable && (windowDisplayOutside != IsInsideSPRWindow(y, x)))) + { + var tileNum = (ushort)(activeSprite & 0x01FF); + var tilePal = (byte)((activeSprite >> 9) & 0b111); + var priorityAboveSCR2 = ((activeSprite >> 13) & 0b1) == 0b1; + var spriteY = (activeSprite >> 16) & 0xFF; + + var isVisible = !isUsedBySCR2[(y * HorizontalDisp) + x] || priorityAboveSCR2; + if (!isVisible) continue; + + var pixelColor = DisplayUtilities.ReadPixel(machine, tileNum, (byte)((y - spriteY) ^ (((activeSprite >> 15) & 0b1) * 7)), (byte)((x - spriteX) ^ (((activeSprite >> 14) & 0b1) * 7)), displayPackedFormatSet, display4bppFlagSet, displayColorFlagSet); + + var isOpaque = (!display4bppFlagSet && !IsBitSet(tilePal, 2)) || pixelColor != 0; + if (!isOpaque) continue; + + tilePal += 8; + + if (displayColorFlagSet) + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel(DisplayUtilities.ReadColor(machine, tilePal, pixelColor)), outputFramebuffer, x, y, HorizontalDisp); + else + DisplayUtilities.CopyPixel(DisplayUtilities.GeneratePixel((byte)(15 - palMonoPools[palMonoData[tilePal][pixelColor & 0b11]])), outputFramebuffer, x, y, HorizontalDisp); + } + } + } + + public override byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x01: + /* REG_BACK_COLOR */ + retVal |= (byte)((backColorIndex & 0b1111) << 0); + retVal |= (byte)((backColorPalette & 0b1111) << 4); + break; + + case 0x04: + /* REG_SPR_BASE */ + retVal |= (byte)(sprBase & (displayColorFlagSet ? 0b111111 : 0b011111)); + break; + + case 0x07: + /* REG_MAP_BASE */ + retVal |= (byte)((scr1Base & (displayColorFlagSet ? 0b1111 : 0b0111)) << 0); + retVal |= (byte)((scr2Base & (displayColorFlagSet ? 0b1111 : 0b0111)) << 4); + break; + + case 0x14: + /* REG_LCD_CTRL */ + ChangeBit(ref retVal, 0, lcdActive); + ChangeBit(ref retVal, 1, lcdContrastHigh); + break; + + case 0x60: + /* REG_DISP_MODE */ + ChangeBit(ref retVal, 5, displayPackedFormatSet); + ChangeBit(ref retVal, 6, display4bppFlagSet); + ChangeBit(ref retVal, 7, displayColorFlagSet); + break; + + default: + /* Fall through to common */ + retVal = base.ReadPort(port); + break; + } + + return retVal; + } + + public override void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x01: + /* REG_BACK_COLOR */ + backColorIndex = (byte)((value >> 0) & 0b1111); + backColorPalette = (byte)((value >> 4) & 0b1111); + break; + + case 0x04: + /* REG_SPR_BASE */ + sprBase = (byte)(value & (displayColorFlagSet ? 0b111111 : 0b011111)); + break; + + case 0x07: + /* REG_MAP_BASE */ + scr1Base = (byte)((value >> 0) & (displayColorFlagSet ? 0b1111 : 0b0111)); + scr2Base = (byte)((value >> 4) & (displayColorFlagSet ? 0b1111 : 0b0111)); + break; + + case 0x14: + /* REG_LCD_CTRL */ + lcdActive = IsBitSet(value, 0); + lcdContrastHigh = IsBitSet(value, 1); + break; + + case 0x60: + /* REG_DISP_MODE */ + displayPackedFormatSet = IsBitSet(value, 5); + display4bppFlagSet = IsBitSet(value, 6); + displayColorFlagSet = IsBitSet(value, 7); + break; + + default: + /* Fall through to common */ + base.WritePort(port, value); + break; + } + } + + [Port("REG_BACK_COLOR", 0x001)] + [BitDescription("Background color index", 0, 3)] + public override byte BackColorIndex => backColorIndex; + [Port("REG_BACK_COLOR", 0x001)] + [BitDescription("Background color palette", 4, 7)] + public byte BackColorPalette => backColorPalette; + [Port("REG_SPR_BASE", 0x004)] + [BitDescription("Sprite table base address", 0, 5)] + [Format("X4", 9)] + public override int SprBase => sprBase; + [Port("REG_MAP_BASE", 0x007)] + [BitDescription("SCR1 base address", 0, 3)] + [Format("X4", 11)] + public override int Scr1Base => scr1Base; + [Port("REG_MAP_BASE", 0x007)] + [BitDescription("SCR2 base address", 4, 7)] + [Format("X4", 11)] + public override int Scr2Base => scr2Base; + [Port("REG_LCD_CTRL", 0x014)] + [BitDescription("LCD contrast setting; high contrast?", 1)] + public bool LcdContrastHigh => lcdContrastHigh; + [Port("REG_DISP_MODE", 0x060)] + [BitDescription("Tile format; is packed format?", 5)] + public bool DisplayPackedFormatSet => displayPackedFormatSet; + [Port("REG_DISP_MODE", 0x060)] + [BitDescription("Tile bits-per-pixel; is 4bpp?", 6)] + public bool Display4bppFlagSet => display4bppFlagSet; + [Port("REG_DISP_MODE", 0x060)] + [BitDescription("Display color mode; is color?", 7)] + public bool DisplayColorFlagSet => displayColorFlagSet; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/SphinxDisplayController.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/SphinxDisplayController.cs.meta new file mode 100644 index 00000000..ca142302 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Display/SphinxDisplayController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: db70409b0ab432c438c40e9b0d82e082 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs.meta new file mode 100644 index 00000000..b2bf5e17 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af8d3a9a00752da4496e02fe3b303d68 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs/EEPROM.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs/EEPROM.cs new file mode 100644 index 00000000..4a695b2f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs/EEPROM.cs @@ -0,0 +1,204 @@ +using System; + +using StoicGoose.Core.Interfaces; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.EEPROMs +{ + public sealed class EEPROM : IPortAccessComponent + { + readonly byte[] contents = default; + readonly int numAddressBits = 0; + + bool eraseWriteEnable = false; + + byte dataLo, dataHi, addressLo, addressHi, statusCmd; + + public EEPROM(int size, int addressBits) + { + contents = new byte[size]; + numAddressBits = addressBits; + } + + public void Reset() + { + dataLo = dataHi = 0; + addressLo = addressHi = 0; + statusCmd = 0; + } + + public void Shutdown() + { + // + } + + public void LoadContents(byte[] data) + { + if (data.Length != contents.Length) + throw new Exception("Data size mismatch error"); + + Buffer.BlockCopy(data, 0, contents, 0, data.Length); + } + + public byte[] GetContents() + { + return contents; + } + + public void Program(int address, byte value) + { + contents[address & (contents.Length - 1)] = value; + } + + private void BeginAccess() + { + var addressHiLo = (addressHi << 8) | addressLo; + + var address = (addressHiLo & ((1 << numAddressBits) - 1)) << 1; + var opcode = (addressHiLo >> (numAddressBits + 0)) & 0b11; + var extOpcode = (addressHiLo >> (numAddressBits - 2)) & 0b11; // if opcode == 0, then extended + var start = ((addressHiLo >> (numAddressBits + 2)) & 0b1) == 0b1; + + // only one bit may be set + var requestBitsSet = 0; + for (var i = 4; i < 8; i++) requestBitsSet += (statusCmd >> i) & 0b1; + if (requestBitsSet != 1) return; + + switch ((statusCmd >> 4) & 0b1111) + { + /* Read request? */ + case 0b0001: + PerformAccess(start, opcode, extOpcode, address); + ChangeBit(ref statusCmd, 0, true); + ChangeBit(ref statusCmd, 4, false); + break; + + /* Write request? */ + case 0b0010: + PerformAccess(start, opcode, extOpcode, address); + ChangeBit(ref statusCmd, 1, true); + ChangeBit(ref statusCmd, 5, false); + break; + + /* Erase or misc request? */ + case 0b0100: + PerformAccess(start, opcode, extOpcode, address); + ChangeBit(ref statusCmd, 2, true); + ChangeBit(ref statusCmd, 6, false); + break; + + /* Reset request? */ + case 0b1000: + Reset(); + ChangeBit(ref statusCmd, 3, true); + ChangeBit(ref statusCmd, 7, false); + break; + } + } + + private void PerformAccess(bool start, int opcode, int extOpcode, int address) + { + if (!start) return; + + switch (opcode) + { + /* EWEN/ERAL/WRAL/EWDS */ + case 0b00: + { + switch (extOpcode) + { + /* EWDS */ + case 0b00: + eraseWriteEnable = false; + break; + + /* WRAL */ + case 0b01: + if (eraseWriteEnable) + { + for (var i = 0; i < contents.Length; i += 2) + { + contents[i + 0] = dataLo; + contents[i + 1] = dataHi; + } + } + break; + + /* ERAL */ + case 0b10: + if (eraseWriteEnable) + { + for (var i = 0; i < contents.Length; i++) + contents[i] = 0xFF; + } + break; + + /* EWEN */ + case 0b11: + eraseWriteEnable = true; + break; + } + } + break; + + /* WRITE */ + case 0b01: + if (eraseWriteEnable) + { + contents[address + 0] = dataLo; + contents[address + 1] = dataHi; + } + break; + + /* READ */ + case 0b10: + dataLo = contents[address + 0]; + dataHi = contents[address + 1]; + break; + + /* ERASE */ + case 0b11: + if (eraseWriteEnable) + { + dataLo = contents[address + 0]; + contents[address + 0] = 0xFF; + dataHi = contents[address + 1]; + contents[address + 1] = 0xFF; + } + break; + } + } + + public byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x00: retVal = dataLo; break; + case 0x01: retVal = dataHi; break; + case 0x02: retVal = addressLo; break; + case 0x03: retVal = addressHi; break; + case 0x04: retVal = (byte)(statusCmd & 0b0011); break; + } + + return retVal; + } + + public void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x00: dataLo = value; break; + case 0x01: dataHi = value; break; + case 0x02: addressLo = value; break; + case 0x03: addressHi = value; break; + case 0x04: + statusCmd = (byte)((statusCmd & 0b00001111) | (value & 0b11110000)); + BeginAccess(); + break; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs/EEPROM.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs/EEPROM.cs.meta new file mode 100644 index 00000000..c1f09626 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/EEPROMs/EEPROM.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3ce5cac210519e94a88dff895ab51d1e \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces.meta new file mode 100644 index 00000000..55b04239 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ca27119fa51e6604d92b9801e45d5b41 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IComponent.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IComponent.cs new file mode 100644 index 00000000..530b502e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IComponent.cs @@ -0,0 +1,8 @@ +namespace StoicGoose.Core.Interfaces +{ + public interface IComponent + { + void Reset(); + void Shutdown(); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IComponent.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IComponent.cs.meta new file mode 100644 index 00000000..d5ac1760 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fbe5f8c7b7960364a905f23a70f22e2b \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMachine.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMachine.cs new file mode 100644 index 00000000..b371c270 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMachine.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +using StoicGoose.Core.Cartridges; +using StoicGoose.Core.CPU; +using StoicGoose.Core.Display; +using StoicGoose.Core.EEPROMs; +using StoicGoose.Core.Sound; + +namespace StoicGoose.Core.Interfaces +{ + + public interface IMachine + { + //static IEnumerable<Type> GetMachineTypes() => Assembly.GetAssembly(typeof(IMachine)).GetTypes().Where(x => !x.IsInterface && !x.IsAbstract && x.IsAssignableTo(typeof(IMachine))); + static IEnumerable<Type> GetMachineTypes() + { + return Assembly.GetAssembly(typeof(IMachine)) + .GetTypes() + .Where(x => !x.IsInterface && + !x.IsAbstract && + typeof(IMachine).IsAssignableFrom(x)); + } + + string Manufacturer { get; } + string Model { get; } + + int ScreenWidth { get; } + int ScreenHeight { get; } + double RefreshRate { get; } + string GameControls { get; } + string HardwareControls { get; } + string VerticalControlRemap { get; } + + string InternalEepromDefaultUsername { get; } + Dictionary<ushort, byte> InternalEepromDefaultData { get; } + + Cartridge Cartridge { get; } + V30MZ Cpu { get; } + DisplayControllerCommon DisplayController { get; } + SoundControllerCommon SoundController { get; } + EEPROM InternalEeprom { get; } + + //Func<(List<string> buttonsPressed, List<string> buttonsHeld)> ReceiveInput { get; set; } + + Func<long> ReceiveInput { get; set; } + + Func<uint, byte, byte> ReadMemoryCallback { get; set; } + Action<uint, byte> WriteMemoryCallback { get; set; } + Func<ushort, byte, byte> ReadPortCallback { get; set; } + Action<ushort, byte> WritePortCallback { get; set; } + Func<bool> RunStepCallback { get; set; } + + void Initialize(); + void Reset(); + void Shutdown(); + + void RunFrame(); + void RunLine(); + void RunStep(); + + void LoadBootstrap(byte[] data); + bool IsBootstrapLoaded { get; } + bool UseBootstrap { get; set; } + void LoadInternalEeprom(byte[] data); + void LoadRom(byte[] data); + void LoadSaveData(byte[] data); + + byte[] GetInternalEeprom(); + byte[] GetSaveData(); + + byte ReadMemory(uint address); + void WriteMemory(uint address, byte value); + byte ReadPort(ushort port); + void WritePort(ushort port, byte value); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMachine.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMachine.cs.meta new file mode 100644 index 00000000..7ec97bae --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMachine.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f0af901bd4adf4f449a3ec347bcd46ae \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMemoryAccessComponent.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMemoryAccessComponent.cs new file mode 100644 index 00000000..1297847c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMemoryAccessComponent.cs @@ -0,0 +1,8 @@ +namespace StoicGoose.Core.Interfaces +{ + interface IMemoryAccessComponent : IComponent + { + byte ReadMemory(uint address); + void WriteMemory(uint address, byte value); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMemoryAccessComponent.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMemoryAccessComponent.cs.meta new file mode 100644 index 00000000..3f123089 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IMemoryAccessComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7bbbf381ccd119f4291d1e8671a4e9b2 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IPortAccessComponent.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IPortAccessComponent.cs new file mode 100644 index 00000000..5c9f035d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IPortAccessComponent.cs @@ -0,0 +1,8 @@ +namespace StoicGoose.Core.Interfaces +{ + interface IPortAccessComponent : IComponent + { + byte ReadPort(ushort port); + void WritePort(ushort port, byte value); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IPortAccessComponent.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IPortAccessComponent.cs.meta new file mode 100644 index 00000000..59088af0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Interfaces/IPortAccessComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d81205bc9412fb24e9905b414e4b6b30 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines.meta new file mode 100644 index 00000000..b17c2d48 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 35bba939b8459124c8b129925c4cc47d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/MachineCommon.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/MachineCommon.cs new file mode 100644 index 00000000..1991f346 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/MachineCommon.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections.Generic; + +using StoicGoose.Common.Attributes; +using StoicGoose.Common.Utilities; +using StoicGoose.Core.Cartridges; +using StoicGoose.Core.CPU; +using StoicGoose.Core.Display; +using StoicGoose.Core.EEPROMs; +using StoicGoose.Core.Interfaces; +using StoicGoose.Core.Serial; +using StoicGoose.Core.Sound; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Machines +{ + public abstract class MachineCommon : IMachine, IMemoryAccessComponent, IPortAccessComponent + { + // http://daifukkat.su/docs/wsman/ + + public abstract string Manufacturer { get; } + public abstract string Model { get; } + + public int ScreenWidth => DisplayControllerCommon.ScreenWidth; + public int ScreenHeight => DisplayControllerCommon.ScreenHeight; + public double RefreshRate => DisplayControllerCommon.VerticalClock; + public string GameControls => "Start, B, A, X1, X2, X3, X4, Y1, Y2, Y3, Y4"; + public string HardwareControls => "Volume"; + public string VerticalControlRemap => "X1=Y2, X2=Y3, X3=Y4, X4=Y1, Y1=X2, Y2=X3, Y3=X4, Y4=X1"; + + public abstract string InternalEepromDefaultUsername { get; } + public abstract Dictionary<ushort, byte> InternalEepromDefaultData { get; } + + public const double MasterClock = 12288000.0; /* 12.288 MHz xtal */ + public const double CpuClock = MasterClock / 4.0; /* /4 = 3.072 MHz */ + + public abstract int InternalRamSize { get; } + public uint InternalRamMask { get; protected set; } = 0; + public byte[] InternalRam { get; protected set; } = default; + + public Cartridge Cartridge { get; protected set; } = new(); + public V30MZ Cpu { get; protected set; } = default; + public DisplayControllerCommon DisplayController { get; protected set; } = default; + public SoundControllerCommon SoundController { get; protected set; } = default; + public EEPROM InternalEeprom { get; protected set; } = default; + public Bootstrap BootstrapRom { get; protected set; } = default; + public SerialPort Serial { get; protected set; } = default; + + public abstract int InternalEepromSize { get; } + public abstract int InternalEepromAddressBits { get; } + + public abstract int BootstrapRomAddress { get; } + public abstract int BootstrapRomSize { get; } + + //public Func<(List<string> buttonsPressed, List<string> buttonsHeld)> ReceiveInput { get; set; } = default; + public Func<long> ReceiveInput { get; set; } = default; + + public Func<uint, byte, byte> ReadMemoryCallback { get; set; } = default; + public Action<uint, byte> WriteMemoryCallback { get; set; } = default; + public Func<ushort, byte, byte> ReadPortCallback { get; set; } = default; + public Action<ushort, byte> WritePortCallback { get; set; } = default; + public Func<bool> RunStepCallback { get; set; } = default; + + protected bool cancelFrameExecution = false; + + public int CurrentClockCyclesInLine { get; protected set; } = 0; + public int CurrentClockCyclesInFrame { get; protected set; } = 0; + + public int TotalClockCyclesInFrame { get; protected set; } = 0; + + /* REG_HW_FLAGS */ + protected bool cartEnable, isWSCOrGreater, is16BitExtBus, cartRom1CycleSpeed, builtInSelfTestOk; + /* REG_KEYPAD */ + protected bool keypadYEnable, keypadXEnable, keypadButtonEnable; + /* REG_INT_xxx */ + protected byte interruptBase, interruptEnable, interruptStatus; + + public bool IsBootstrapLoaded { get; private set; } = false; + public bool UseBootstrap { get; set; } = false; + + public virtual void Initialize() + { + if (InternalRamSize == -1) throw new Exception("Internal RAM size not set"); + + InternalRamMask = (uint)(InternalRamSize - 1); + InternalRam = new byte[InternalRamSize]; + + Cpu = new(this); + InternalEeprom = new(InternalEepromSize, InternalEepromAddressBits); + BootstrapRom = new(BootstrapRomSize); + Serial = new(); + + InitializeEepromToDefaults(); + + Log.WriteEvent(LogSeverity.Information, this, "Machine initialized."); + } + + public virtual void Reset() + { + for (var i = 0; i < InternalRam.Length; i++) InternalRam[i] = 0; + + Cartridge?.Reset(); + Cpu?.Reset(); + DisplayController?.Reset(); + SoundController?.Reset(); + InternalEeprom?.Reset(); + Serial?.Reset(); + + CurrentClockCyclesInFrame = 0; + CurrentClockCyclesInLine = 0; + TotalClockCyclesInFrame = (int)Math.Round(CpuClock / DisplayControllerCommon.VerticalClock); + + ResetRegisters(); + + Log.WriteEvent(LogSeverity.Information, this, "Machine reset."); + } + + public virtual void ResetRegisters() + { + cartEnable = !IsBootstrapLoaded || !UseBootstrap; + is16BitExtBus = true; + cartRom1CycleSpeed = false; + builtInSelfTestOk = true; + + keypadYEnable = keypadXEnable = keypadButtonEnable = false; + + interruptBase = interruptEnable = interruptStatus = 0; + } + + public virtual void Shutdown() + { + Cartridge?.Shutdown(); + Cpu?.Shutdown(); + DisplayController?.Shutdown(); + SoundController?.Shutdown(); + InternalEeprom?.Shutdown(); + Serial?.Shutdown(); + + Log.WriteEvent(LogSeverity.Information, this, "Machine shutdown."); + } + + protected virtual void InitializeEepromToDefaults() + { + var data = ConvertUsernameForEeprom(InternalEepromDefaultUsername); + for (var i = 0; i < data.Length; i++) InternalEeprom.Program(0x60 + i, data[i]); // Username (0x60-0x6F, max 16 characters) + foreach (var (address, value) in InternalEepromDefaultData) InternalEeprom.Program(address, value); + } + + private static byte[] ConvertUsernameForEeprom(string name) + { + var data = new byte[16]; + for (var i = 0; i < data.Length; i++) + { + var c = i < name.Length ? name[i] : ' '; + if (c == ' ') data[i] = (byte)(c - ' ' + 0x00); + else if (c >= '0' && c <= '9') data[i] = (byte)(c - '0' + 0x01); + else if (c >= 'A' && c <= 'Z') data[i] = (byte)(c - 'A' + 0x0B); + else if (c >= 'a' && c <= 'b') data[i] = (byte)(c - 'A' + 0x0B); + else if (c == '♥') data[i] = (byte)(c - '♥' + 0x25); + else if (c == '♪') data[i] = (byte)(c - '♪' + 0x26); + else if (c == '+') data[i] = (byte)(c - '+' + 0x27); + else if (c == '-') data[i] = (byte)(c - '-' + 0x28); + else if (c == '?') data[i] = (byte)(c - '?' + 0x29); + else if (c == '.') data[i] = (byte)(c - '.' + 0x2A); + else data[i] = 0x00; + } + return data; + } + + public void RunFrame() + { + while (CurrentClockCyclesInFrame < TotalClockCyclesInFrame) + { + RunLine(); + + if (cancelFrameExecution) return; + } + + CurrentClockCyclesInFrame -= TotalClockCyclesInFrame; + + _ = ReceiveInput?.Invoke(); + } + + public void RunLine() + { + while (CurrentClockCyclesInLine < DisplayControllerCommon.HorizontalTotal) + { + RunStep(); + + if (cancelFrameExecution) return; + } + + CurrentClockCyclesInFrame += CurrentClockCyclesInLine; + CurrentClockCyclesInLine = 0; + } + + public abstract void RunStep(); + + protected void RaiseInterrupt(int number) + { + if (!IsBitSet(interruptEnable, number)) return; + ChangeBit(ref interruptStatus, number, true); + } + + protected void LowerInterrupt(int number) + { + ChangeBit(ref interruptStatus, number, false); + } + + protected void HandleInterrupts() + { + if (!Cpu.IsFlagSet(V30MZ.Flags.InterruptEnable)) return; + + for (var i = 7; i >= 0; i--) + { + if (!IsBitSet(interruptStatus, i)) continue; + + Cpu.IsHalted = false; + Cpu.Interrupt((interruptBase & 0b11111000) | i); + return; + } + } + + public void LoadBootstrap(byte[] data) + { + BootstrapRom.LoadRom(data); + + IsBootstrapLoaded = true; + } + + public void LoadInternalEeprom(byte[] data) + { + InternalEeprom.LoadContents(data); + } + + public void LoadRom(byte[] data) + { + Cartridge.LoadRom(data); + } + + public void LoadSaveData(byte[] data) + { + if (Cartridge.Metadata.IsSramSave) + Cartridge.LoadSram(data); + else if (Cartridge.Metadata.IsEepromSave) + Cartridge.LoadEeprom(data); + } + + public byte[] GetInternalEeprom() + { + return InternalEeprom.GetContents(); + } + + public byte[] GetSaveData() + { + if (Cartridge.Metadata != null) + { + if (Cartridge.Metadata.IsSramSave) + return Cartridge.GetSram(); + else if (Cartridge.Metadata.IsEepromSave) + return Cartridge.GetEeprom(); + } + + return Array.Empty<byte>(); + } + + public byte ReadMemory(uint address) + { + byte retVal; + + if (!cartEnable && BootstrapRom != null && address >= BootstrapRomAddress) + { + /* Bootstrap enabled */ + retVal = BootstrapRom.ReadMemory(address); + } + else + { + address &= 0xFFFFF; + + if ((address & 0xF0000) == 0x00000) + { + /* Internal RAM -- returns 0x90 if unmapped */ + if (address < InternalRamSize) + retVal = InternalRam[address & InternalRamMask]; + else + retVal = 0x90; + } + else + { + /* Cartridge */ + retVal = Cartridge.ReadMemory(address); + } + } + + if (ReadMemoryCallback != null) + retVal = ReadMemoryCallback.Invoke(address, retVal); + + return retVal; + } + + public void WriteMemory(uint address, byte value) + { + WriteMemoryCallback?.Invoke(address, value); + + address &= 0xFFFFF; + if ((address & 0xF0000) == 0x00000) + { + /* Internal RAM -- no effect if unmapped */ + if (address < InternalRamSize) + InternalRam[address & InternalRamMask] = value; + } + else if ((address & 0xF0000) == 0x10000) + { + /* Cartridge -- SRAM only, other writes not emitted */ + Cartridge.WriteMemory(address, value); + } + } + + public abstract byte ReadPort(ushort port); + public abstract void WritePort(ushort port, byte value); + + [Port("REG_HW_FLAGS", 0x0A0)] + [BitDescription("BIOS lockout; is cartridge mapped?", 0)] + public bool CartEnable => cartEnable; + [Port("REG_HW_FLAGS", 0x0A0)] + [BitDescription("System type; is WSC or greater?", 1)] + public bool IsWSCOrGreater => isWSCOrGreater; + [Port("REG_HW_FLAGS", 0x0A0)] + [BitDescription("External bus width; is 16-bit bus?", 2)] + public bool Is16BitExtBus => is16BitExtBus; + [Port("REG_HW_FLAGS", 0x0A0)] + [BitDescription("Cartridge ROM speed; is 1-cycle?", 3)] + public bool CartRom1CycleSpeed => cartRom1CycleSpeed; + [Port("REG_HW_FLAGS", 0x0A0)] + [BitDescription("Built-in self test passed", 7)] + public bool BuiltInSelfTestOk => builtInSelfTestOk; + + [Port("REG_KEYPAD", 0x0B5)] + [BitDescription("Y keys check enabled", 4)] + public bool KeypadYEnable => keypadYEnable; + [Port("REG_KEYPAD", 0x0B5)] + [BitDescription("X keys check enabled", 5)] + public bool KeypadXEnable => keypadXEnable; + [Port("REG_KEYPAD", 0x0B5)] + [BitDescription("Button check enabled", 6)] + public bool KeypadButtonEnable => keypadButtonEnable; + + [Port("REG_INT_BASE", 0x0B0)] + public abstract byte InterruptBase { get; } + [Port("REG_INT_ENABLE", 0x0B2)] + [BitDescription("Interrupt enable bitmask", 4)] + [Format("X2")] + public byte InterruptEnable => interruptEnable; + [Port("REG_INT_STATUS", 0x0B4)] + [BitDescription("Interrupt status bitmask", 4)] + [Format("X2")] + public byte InterruptStatus => interruptStatus; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/MachineCommon.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/MachineCommon.cs.meta new file mode 100644 index 00000000..7195c435 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/MachineCommon.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 961184224ac597c4281ef0e43aa48d68 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwan.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwan.cs new file mode 100644 index 00000000..ebc82ddd --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwan.cs @@ -0,0 +1,334 @@ +using System.Collections.Generic; + +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Display; +using StoicGoose.Core.Serial; +using StoicGoose.Core.Sound; +using StoicGooseUnity; +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Machines +{ + public partial class WonderSwan : MachineCommon + { + public override string Manufacturer => "Bandai"; + public override string Model => "WonderSwan"; + + public override string InternalEepromDefaultUsername => "WONDERSWAN"; + public override Dictionary<ushort, byte> InternalEepromDefaultData => new() + { + { 0x70, 0x19 }, // Year of birth [just for fun, here set to original WS release date; new systems probably had no date set?] + { 0x71, 0x99 }, // "" + { 0x72, 0x03 }, // Month of birth [again, WS release for fun] + { 0x73, 0x04 }, // Day of birth [and again] + { 0x74, 0x00 }, // Sex [set to ?] + { 0x75, 0x00 }, // Blood type [set to ?] + + { 0x76, 0x00 }, // Last game played, publisher ID [set to presumably none] + { 0x77, 0x00 }, // "" + { 0x78, 0x00 }, // Last game played, game ID [set to presumably none] + { 0x79, 0x00 }, // "" + { 0x7A, 0x00 }, // Swan ID (see Mama Mitte) -- TODO: set to valid/random value? + { 0x7B, 0x00 }, // "" + { 0x7C, 0x00 }, // Number of different games played [set to presumably none] + { 0x7D, 0x00 }, // Number of times settings were changed [set to presumably none] + { 0x7E, 0x00 }, // Number of times powered on [set to presumably none] + { 0x7F, 0x00 } // "" + }; + + public override int InternalRamSize => 16 * 1024; + + public override int InternalEepromSize => 64 * 2; + public override int InternalEepromAddressBits => 6; + + public override int BootstrapRomAddress => 0xFF000; + public override int BootstrapRomSize => 0x1000; + + public override void Initialize() + { + DisplayController = new AswanDisplayController(this); + SoundController = new AswanSoundController(this, 44100, 2); + + base.Initialize(); + } + + public override void ResetRegisters() + { + isWSCOrGreater = false; + + base.ResetRegisters(); + } + + public override void RunStep() + { + if (RunStepCallback == null || RunStepCallback.Invoke() == false) + { + HandleInterrupts(); + + var currentCpuClockCycles = Cpu.Step(); + + var displayInterrupt = DisplayController.Step(currentCpuClockCycles); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.LineCompare)) RaiseInterrupt(4); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.VBlankTimer)) RaiseInterrupt(5); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.VBlank)) RaiseInterrupt(6); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.HBlankTimer)) RaiseInterrupt(7); + + SoundController.Step(currentCpuClockCycles); + + if (Cartridge.Step(currentCpuClockCycles)) RaiseInterrupt(2); + else LowerInterrupt(2); + + var serialInterrupt = Serial.Step(); + if (serialInterrupt.HasFlag(SerialPort.SerialInterrupts.SerialSend)) RaiseInterrupt(0); + if (serialInterrupt.HasFlag(SerialPort.SerialInterrupts.SerialRecieve)) RaiseInterrupt(3); + + CurrentClockCyclesInLine += currentCpuClockCycles; + + cancelFrameExecution = false; + } + else + cancelFrameExecution = true; + } + + public override byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + /* Display controller, etc. (H/V timers, DISP_MODE) */ + case var n when (n >= 0x00 && n < 0x40) || n == 0x60 || n == 0xA2 || (n >= 0xA4 && n <= 0xAB): + retVal = DisplayController.ReadPort(port); + break; + + /* Sound controller */ + case var n when n >= 0x80 && n < 0xA0: + retVal = SoundController.ReadPort(port); + break; + + /* Serial port */ + case var n when n == 0xB1 || n == 0xB3: + retVal = Serial.ReadPort(port); + break; + + /* System controller */ + case 0xA0: + /* REG_HW_FLAGS */ + ChangeBit(ref retVal, 0, cartEnable); + ChangeBit(ref retVal, 1, false); + ChangeBit(ref retVal, 2, is16BitExtBus); + ChangeBit(ref retVal, 3, cartRom1CycleSpeed); + ChangeBit(ref retVal, 7, builtInSelfTestOk); + break; + + case 0xB0: + /* REG_INT_BASE */ + retVal = interruptBase; + retVal |= 0b11; + break; + + case 0xB2: + /* REG_INT_ENABLE */ + retVal = interruptEnable; + break; + + case 0xB4: + /* REG_INT_STATUS */ + retVal = interruptStatus; + break; + + case 0xB5: + /* REG_KEYPAD */ + ChangeBit(ref retVal, 4, keypadYEnable); + ChangeBit(ref retVal, 5, keypadXEnable); + ChangeBit(ref retVal, 6, keypadButtonEnable); + + /* Get input from UI */ + var buttonsHeld = ReceiveInput?.Invoke(); + if (buttonsHeld != null) + { + if (buttonsHeld > 0) + RaiseInterrupt(1); + + if (keypadYEnable) + { + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y1) > 0) ChangeBit(ref retVal, 0, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y2) > 0) ChangeBit(ref retVal, 1, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y3) > 0) ChangeBit(ref retVal, 2, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y4) > 0) ChangeBit(ref retVal, 3, true); + } + + if (keypadXEnable) + { + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X1) > 0) ChangeBit(ref retVal, 0, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X2) > 0) ChangeBit(ref retVal, 1, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X3) > 0) ChangeBit(ref retVal, 2, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X4) > 0) ChangeBit(ref retVal, 3, true); + } + + if (keypadButtonEnable) + { + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Start) > 0) ChangeBit(ref retVal, 1, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.A) > 0) ChangeBit(ref retVal, 2, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.B) > 0) ChangeBit(ref retVal, 3, true); + } + } + //var buttonsHeld = ReceiveInput?.Invoke().buttonsHeld; + //if (buttonsHeld != null) + //{ + // if (buttonsHeld.Count > 0) + // RaiseInterrupt(1); + + // if (keypadYEnable) + // { + + + // if (buttonsHeld.Contains("Y1")) ChangeBit(ref retVal, 0, true); + // if (buttonsHeld.Contains("Y2")) ChangeBit(ref retVal, 1, true); + // if (buttonsHeld.Contains("Y3")) ChangeBit(ref retVal, 2, true); + // if (buttonsHeld.Contains("Y4")) ChangeBit(ref retVal, 3, true); + // } + + // if (keypadXEnable) + // { + // if (buttonsHeld.Contains("X1")) ChangeBit(ref retVal, 0, true); + // if (buttonsHeld.Contains("X2")) ChangeBit(ref retVal, 1, true); + // if (buttonsHeld.Contains("X3")) ChangeBit(ref retVal, 2, true); + // if (buttonsHeld.Contains("X4")) ChangeBit(ref retVal, 3, true); + // } + + // if (keypadButtonEnable) + // { + // if (buttonsHeld.Contains("Start")) ChangeBit(ref retVal, 1, true); + // if (buttonsHeld.Contains("A")) ChangeBit(ref retVal, 2, true); + // if (buttonsHeld.Contains("B")) ChangeBit(ref retVal, 3, true); + // } + //} + break; + + case 0xB6: + /* REG_INT_ACK */ + retVal = 0x00; + break; + + case 0xB7: + /* ??? */ + retVal = 0x00; + break; + + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + /* REG_IEEP_DATA (low) */ + /* REG_IEEP_DATA (high) */ + /* REG_IEEP_ADDR (low) */ + /* REG_IEEP_ADDR (high) */ + /* REG_IEEP_CMD (write) */ + retVal = InternalEeprom.ReadPort((ushort)(port - 0xBA)); + break; + + /* Cartridge */ + case var n when n >= 0xC0 && n < 0x100: + retVal = Cartridge.ReadPort(port); + break; + + /* Unmapped */ + default: + retVal = 0x90; + break; + } + + if (ReadPortCallback != null) + retVal = ReadPortCallback.Invoke(port, retVal); + + return retVal; + } + + public override void WritePort(ushort port, byte value) + { + WritePortCallback?.Invoke(port, value); + + switch (port) + { + /* Display controller, etc. (H/V timers, DISP_MODE) */ + case var n when (n >= 0x00 && n < 0x40) || n == 0x60 || n == 0xA2 || (n >= 0xA4 && n <= 0xAB): + DisplayController.WritePort(port, value); + break; + + /* Sound controller */ + case var n when n >= 0x80 && n < 0xA0: + SoundController.WritePort(port, value); + break; + + /* Serial port */ + case var n when n == 0xB1 || n == 0xB3: + Serial.WritePort(port, value); + break; + + /* System controller */ + case 0xA0: + /* REG_HW_FLAGS */ + if (!cartEnable) + cartEnable = IsBitSet(value, 0); + is16BitExtBus = IsBitSet(value, 2); + cartRom1CycleSpeed = IsBitSet(value, 3); + break; + + case 0xB0: + /* REG_INT_BASE */ + interruptBase = (byte)(value & 0b11111000); + break; + + case 0xB2: + /* REG_INT_ENABLE */ + interruptEnable = value; + break; + + case 0xB4: + /* REG_INT_STATUS -- read-only */ + break; + + case 0xB5: + /* REG_KEYPAD */ + keypadYEnable = IsBitSet(value, 4); + keypadXEnable = IsBitSet(value, 5); + keypadButtonEnable = IsBitSet(value, 6); + break; + + case 0xB6: + /* REG_INT_ACK */ + interruptStatus &= (byte)~(value & (0b11110010 | ~interruptEnable)); + break; + + case 0xB7: + /* ??? */ + break; + + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + /* REG_IEEP_DATA (low) */ + /* REG_IEEP_DATA (high) */ + /* REG_IEEP_ADDR (low) */ + /* REG_IEEP_ADDR (high) */ + /* REG_IEEP_STATUS (read) */ + InternalEeprom.WritePort((ushort)(port - 0xBA), value); + break; + + /* Cartridge */ + case var n when n >= 0xC0 && n < 0x100: + Cartridge.WritePort(port, value); + break; + } + } + + [Port("REG_INT_BASE", 0x0B0)] + [BitDescription("Interrupt base address", 3, 7)] + [Format("X4", 0)] + public override byte InterruptBase => interruptBase; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwan.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwan.cs.meta new file mode 100644 index 00000000..c6d1d16b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwan.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f3e696cb652b87242b1d85bfbc978b7b \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwanColor.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwanColor.cs new file mode 100644 index 00000000..9e4dc8c9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwanColor.cs @@ -0,0 +1,396 @@ +using System.Collections.Generic; + +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Display; +using StoicGoose.Core.DMA; +using StoicGoose.Core.Serial; +using StoicGoose.Core.Sound; +using StoicGooseUnity; +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Machines +{ + public partial class WonderSwanColor : MachineCommon + { + public override string Manufacturer => "Bandai"; + public override string Model => "WonderSwan Color"; + + public override string InternalEepromDefaultUsername => "WONDERSWANCOLOR"; + public override Dictionary<ushort, byte> InternalEepromDefaultData => new() + { + { 0x70, 0x20 }, // Year of birth [set to WSC release date for fun] + { 0x71, 0x00 }, // "" + { 0x72, 0x12 }, // Month of birth [again] + { 0x73, 0x09 }, // Day of birth [again] + { 0x74, 0x00 }, // Sex [?] + { 0x75, 0x00 }, // Blood type [?] + + { 0x76, 0x00 }, // Last game played, publisher ID [none] + { 0x77, 0x00 }, // "" + { 0x78, 0x00 }, // Last game played, game ID [none] + { 0x79, 0x00 }, // "" + { 0x7A, 0x00 }, // Swan ID (see Mama Mitte) -- TODO: set to valid/random value? + { 0x7B, 0x00 }, // "" + { 0x7C, 0x00 }, // Number of different games played [none] + { 0x7D, 0x00 }, // Number of times settings were changed [none] + { 0x7E, 0x00 }, // Number of times powered on [none] + { 0x7F, 0x00 } // "" + }; + + public override int InternalRamSize => 64 * 1024; + + public override int InternalEepromSize => 1024 * 2; + public override int InternalEepromAddressBits => 10; + + public override int BootstrapRomAddress => 0xFE000; + public override int BootstrapRomSize => 0x2000; + + public SphinxGeneralDMAController DmaController { get; protected set; } = default; + public SphinxSoundDMAController SoundDmaController { get; protected set; } = default; + + public override void Initialize() + { + DisplayController = new SphinxDisplayController(this); + SoundController = new SphinxSoundController(this, 44100, 2); + DmaController = new SphinxGeneralDMAController(this); + SoundDmaController = new SphinxSoundDMAController(this); + + base.Initialize(); + } + + public override void Reset() + { + DmaController.Reset(); + + base.Reset(); + } + + public override void ResetRegisters() + { + isWSCOrGreater = true; + + base.ResetRegisters(); + } + + public override void Shutdown() + { + DmaController.Shutdown(); + + base.Shutdown(); + } + + protected override void InitializeEepromToDefaults() + { + base.InitializeEepromToDefaults(); + + InternalEeprom.Program(0x83, (byte)(0b0 << 6 | SoundController.MaxMasterVolume & 0b11)); // Flags (low contrast, max volume) + } + + public override void RunStep() + { + if (RunStepCallback == null || RunStepCallback.Invoke() == false) + { + HandleInterrupts(); + + var currentCpuClockCycles = DmaController.IsActive ? DmaController.Step() : Cpu.Step(); + + var displayInterrupt = DisplayController.Step(currentCpuClockCycles); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.LineCompare)) RaiseInterrupt(4); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.VBlankTimer)) RaiseInterrupt(5); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.VBlank)) RaiseInterrupt(6); + if (displayInterrupt.HasFlag(DisplayControllerCommon.DisplayInterrupts.HBlankTimer)) RaiseInterrupt(7); + + if (SoundDmaController.IsActive) + SoundDmaController.Step(currentCpuClockCycles); + + SoundController.Step(currentCpuClockCycles); + + if (Cartridge.Step(currentCpuClockCycles)) RaiseInterrupt(2); + else LowerInterrupt(2); + + var serialInterrupt = Serial.Step(); + if (serialInterrupt.HasFlag(SerialPort.SerialInterrupts.SerialSend)) RaiseInterrupt(0); + if (serialInterrupt.HasFlag(SerialPort.SerialInterrupts.SerialRecieve)) RaiseInterrupt(3); + + CurrentClockCyclesInLine += currentCpuClockCycles; + + cancelFrameExecution = false; + } + else + cancelFrameExecution = true; + } + + public override byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + /* Display controller, etc. (H/V timers, DISP_MODE) */ + case var n when (n >= 0x00 && n < 0x40) || n == 0x60 || n == 0xA2 || (n >= 0xA4 && n <= 0xAB): + retVal = DisplayController.ReadPort(port); + break; + + /* DMA controller */ + case var n when n >= 0x40 && n < 0x4A: + retVal = DmaController.ReadPort(port); + break; + + /* Sound DMA controller */ + case var n when n >= 0x4A && n < 0x53: + retVal = SoundDmaController.ReadPort(port); + break; + + /* Sound controller */ + case var n when (n >= 0x80 && n < 0xA0) || (n >= 0x6A && n <= 0x6B): + retVal = SoundController.ReadPort(port); + break; + + /* Serial port */ + case var n when n == 0xB1 || n == 0xB3: + retVal = Serial.ReadPort(port); + break; + + /* Misc system registers */ + case 0x62: + /* REG_WSC_SYSTEM */ + ChangeBit(ref retVal, 7, false); // not SwanCrystal + break; + + /* System controller */ + case 0xA0: + /* REG_HW_FLAGS */ + ChangeBit(ref retVal, 0, cartEnable); + ChangeBit(ref retVal, 1, true); + ChangeBit(ref retVal, 2, is16BitExtBus); + ChangeBit(ref retVal, 3, cartRom1CycleSpeed); + ChangeBit(ref retVal, 7, builtInSelfTestOk); + break; + + case 0xB0: + /* REG_INT_BASE */ + retVal = interruptBase; + break; + + case 0xB2: + /* REG_INT_ENABLE */ + retVal = interruptEnable; + break; + + case 0xB4: + /* REG_INT_STATUS */ + retVal = interruptStatus; + break; + + case 0xB5: + /* REG_KEYPAD */ + ChangeBit(ref retVal, 4, keypadYEnable); + ChangeBit(ref retVal, 5, keypadXEnable); + ChangeBit(ref retVal, 6, keypadButtonEnable); + + /* Get input from UI */ + var buttonsHeld = ReceiveInput?.Invoke(); + if (buttonsHeld != null) + { + if (buttonsHeld > 0) + RaiseInterrupt(1); + + if (keypadYEnable) + { + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y1) > 0) ChangeBit(ref retVal, 0, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y2) > 0) ChangeBit(ref retVal, 1, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y3) > 0) ChangeBit(ref retVal, 2, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Y4) > 0) ChangeBit(ref retVal, 3, true); + } + + if (keypadXEnable) + { + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X1) > 0) ChangeBit(ref retVal, 0, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X2) > 0) ChangeBit(ref retVal, 1, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X3) > 0) ChangeBit(ref retVal, 2, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.X4) > 0) ChangeBit(ref retVal, 3, true); + } + + if (keypadButtonEnable) + { + if ((buttonsHeld.Value & (ushort)StoicGooseKey.Start) > 0) ChangeBit(ref retVal, 1, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.A) > 0) ChangeBit(ref retVal, 2, true); + if ((buttonsHeld.Value & (ushort)StoicGooseKey.B) > 0) ChangeBit(ref retVal, 3, true); + } + } + //var buttonsHeld = ReceiveInput?.Invoke().buttonsHeld; + //if (buttonsHeld != null) + //{ + // if (buttonsHeld.Count > 0) + // RaiseInterrupt(1); + + // if (keypadYEnable) + // { + // if (buttonsHeld.Contains("Y1")) ChangeBit(ref retVal, 0, true); + // if (buttonsHeld.Contains("Y2")) ChangeBit(ref retVal, 1, true); + // if (buttonsHeld.Contains("Y3")) ChangeBit(ref retVal, 2, true); + // if (buttonsHeld.Contains("Y4")) ChangeBit(ref retVal, 3, true); + // } + + // if (keypadXEnable) + // { + // if (buttonsHeld.Contains("X1")) ChangeBit(ref retVal, 0, true); + // if (buttonsHeld.Contains("X2")) ChangeBit(ref retVal, 1, true); + // if (buttonsHeld.Contains("X3")) ChangeBit(ref retVal, 2, true); + // if (buttonsHeld.Contains("X4")) ChangeBit(ref retVal, 3, true); + // } + + // if (keypadButtonEnable) + // { + // if (buttonsHeld.Contains("Start")) ChangeBit(ref retVal, 1, true); + // if (buttonsHeld.Contains("A")) ChangeBit(ref retVal, 2, true); + // if (buttonsHeld.Contains("B")) ChangeBit(ref retVal, 3, true); + // } + //} + break; + + case 0xB6: + /* REG_INT_ACK */ + retVal = 0x00; + break; + + case 0xB7: + /* ??? */ + retVal = 0x00; + break; + + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + /* REG_IEEP_DATA (low) */ + /* REG_IEEP_DATA (high) */ + /* REG_IEEP_ADDR (low) */ + /* REG_IEEP_ADDR (high) */ + /* REG_IEEP_CMD (write) */ + retVal = InternalEeprom.ReadPort((ushort)(port - 0xBA)); + break; + + /* Cartridge */ + case var n when n >= 0xC0 && n < 0x100: + retVal = Cartridge.ReadPort(port); + break; + + /* Unmapped */ + default: + retVal = 0x90; + break; + } + + if (ReadPortCallback != null) + retVal = ReadPortCallback.Invoke(port, retVal); + + return retVal; + } + + public override void WritePort(ushort port, byte value) + { + WritePortCallback?.Invoke(port, value); + + switch (port) + { + /* Display controller, etc. (H/V timers, DISP_MODE) */ + case var n when (n >= 0x00 && n < 0x40) || n == 0x60 || n == 0xA2 || (n >= 0xA4 && n <= 0xAB): + DisplayController.WritePort(port, value); + break; + + /* DMA controller */ + case var n when n >= 0x40 && n < 0x4A: + DmaController.WritePort(port, value); + break; + + /* Sound DMA controller */ + case var n when n >= 0x4A && n < 0x53: + SoundDmaController.WritePort(port, value); + break; + + /* Sound controller */ + case var n when (n >= 0x80 && n < 0xA0) || (n >= 0x6A && n <= 0x6B): + SoundController.WritePort(port, value); + break; + + /* Serial port */ + case var n when n == 0xB1 || n == 0xB3: + Serial.WritePort(port, value); + break; + + /* Misc system registers */ + case 0x62: + /* REG_WSC_SYSTEM */ + if (IsBitSet(value, 0)) + { + // TODO: power-off bit, stop emulation? + } + break; + + /* System controller */ + case 0xA0: + /* REG_HW_FLAGS */ + if (!cartEnable) + cartEnable = IsBitSet(value, 0); + is16BitExtBus = IsBitSet(value, 2); + cartRom1CycleSpeed = IsBitSet(value, 3); + break; + + case 0xB0: + /* REG_INT_BASE */ + interruptBase = (byte)(value & 0b11111110); + break; + + case 0xB2: + /* REG_INT_ENABLE */ + interruptEnable = value; + break; + + case 0xB4: + /* REG_INT_STATUS -- read-only */ + break; + + case 0xB5: + /* REG_KEYPAD */ + keypadYEnable = IsBitSet(value, 4); + keypadXEnable = IsBitSet(value, 5); + keypadButtonEnable = IsBitSet(value, 6); + break; + + case 0xB6: + /* REG_INT_ACK */ + interruptStatus &= (byte)~(value & (0b11110010 | ~interruptEnable)); + break; + + case 0xB7: + /* ??? */ + break; + + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + /* REG_IEEP_DATA (low) */ + /* REG_IEEP_DATA (high) */ + /* REG_IEEP_ADDR (low) */ + /* REG_IEEP_ADDR (high) */ + /* REG_IEEP_STATUS (read) */ + InternalEeprom.WritePort((ushort)(port - 0xBA), value); + break; + + /* Cartridge */ + case var n when n >= 0xC0 && n < 0x100: + Cartridge.WritePort(port, value); + break; + } + } + + [Port("REG_INT_BASE", 0x0B0)] + [BitDescription("Interrupt base address", 1, 7)] + [Format("X4", 0)] + public override byte InterruptBase => interruptBase; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwanColor.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwanColor.cs.meta new file mode 100644 index 00000000..6c103aa3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Machines/WonderSwanColor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8054a1a1d865d2e4ea3fa676c4de78dd \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial.meta new file mode 100644 index 00000000..77e284ad --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2fcb17a464660ae4fbecae852698c8ab +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial/SerialPort.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial/SerialPort.cs new file mode 100644 index 00000000..054093bf --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial/SerialPort.cs @@ -0,0 +1,130 @@ +using System; + +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Interfaces; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Serial +{ + public class SerialPort : IPortAccessComponent + { + // https://github.com/ares-emulator/ares/tree/709afef820914e3399425bb77cbc1baf895028a1/ares/ws/serial + + [Flags] + public enum SerialInterrupts + { + None = 0, + SerialSend = 1 << 0, + SerialRecieve = 1 << 1 + } + + int baudClock, txBitClock; + + /* REG_SER_DATA */ + protected byte serialData; + /* REG_SER_STATUS */ + protected bool enable, baudRateSelect, txEmpty, rxOverrun, rxFull; + + public void Reset() + { + serialData = 0; + enable = baudRateSelect = rxOverrun = rxFull = false; + } + + public void Shutdown() + { + /* Nothing to do... */ + } + + public SerialInterrupts Step() + { + if (!enable) return SerialInterrupts.None; + + if (!baudRateSelect && ++baudClock < 4) return SerialInterrupts.None; + baudClock = 0; + + // STUB + if (!txEmpty) + { + if (++txBitClock == 9) + { + txBitClock = 0; + txEmpty = true; + } + } + + var interrupt = SerialInterrupts.None; + if (txEmpty) interrupt |= SerialInterrupts.SerialSend; + if (rxFull) interrupt |= SerialInterrupts.SerialRecieve; + return interrupt; + } + + public virtual byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0xB1: + /* REG_SER_DATA */ + retVal = serialData; + rxFull = false; + break; + + case 0xB3: + /* REG_SER_STATUS */ + ChangeBit(ref retVal, 7, enable); + ChangeBit(ref retVal, 6, baudRateSelect); + ChangeBit(ref retVal, 2, txEmpty); + ChangeBit(ref retVal, 1, rxOverrun); + ChangeBit(ref retVal, 0, rxFull); + break; + } + + return retVal; + } + + public virtual void WritePort(ushort port, byte value) + { + switch (port) + { + case 0xB1: + /* REG_SER_DATA */ + if (txEmpty) + { + serialData = value; + txEmpty = false; + } + break; + + case 0xB3: + /* REG_SER_STATUS */ + enable = IsBitSet(value, 7); + baudRateSelect = IsBitSet(value, 6); + rxOverrun = !IsBitSet(value, 5); + break; + } + } + + [Port("REG_SER_DATA", 0x0B1)] + [BitDescription("Serial data")] + [Format("X2")] + public byte SerialData => serialData; + [Port("REG_SER_STATUS", 0x0B3)] + [BitDescription("Serial enabled?", 7)] + public bool Enable => enable; + [Port("REG_SER_STATUS", 0x0B3)] + [BitDescription("Baud rate; is 38400 baud?", 6)] + public bool BaudRateSelect => baudRateSelect; + [Port("REG_SER_STATUS", 0x0B3)] + [BitDescription("TX empty?", 2)] + public bool TxEmpty => txEmpty; + [Port("REG_SER_STATUS", 0x0B3)] + [BitDescription("RX overrun?", 1)] + public bool RxOverrun => rxOverrun; + [Port("REG_SER_STATUS", 0x0B3)] + [BitDescription("RX full?", 0)] + public bool RxFull => rxFull; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial/SerialPort.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial/SerialPort.cs.meta new file mode 100644 index 00000000..a993eb35 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Serial/SerialPort.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c946ee9cecab7f343b5e8896d2d98d7a \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound.meta new file mode 100644 index 00000000..e081fa81 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f7258409b0150f847b07fd6219501ad8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/AswanSoundController.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/AswanSoundController.cs new file mode 100644 index 00000000..42cdf168 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/AswanSoundController.cs @@ -0,0 +1,126 @@ +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Interfaces; + +namespace StoicGoose.Core.Sound +{ + public class AswanSoundController : SoundControllerCommon + { + public override byte MaxMasterVolume => 2; + public override int NumChannels => 4; + + /* REG_SND_9697 */ + protected ushort unknown9697; + /* REG_SND_9899 */ + protected ushort unknown9899; + + public AswanSoundController(IMachine machine, int rate, int outChannels) : base(machine, rate, outChannels) { } + + public override void ResetRegisters() + { + base.ResetRegisters(); + + unknown9697 = 0; + unknown9899 = 0; + } + + public override int[] GenerateSample() + { + channelSampleBuffers[0].Add((short)(channel1.IsEnabled ? (channel1.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[0].Add((short)(channel1.IsEnabled ? (channel1.OutputRight & 0x07FF) << 5 : 0)); + channelSampleBuffers[1].Add((short)(channel2.IsEnabled ? (channel2.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[1].Add((short)(channel2.IsEnabled ? (channel2.OutputRight & 0x07FF) << 5 : 0)); + channelSampleBuffers[2].Add((short)(channel3.IsEnabled ? (channel3.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[2].Add((short)(channel3.IsEnabled ? (channel3.OutputRight & 0x07FF) << 5 : 0)); + channelSampleBuffers[3].Add((short)(channel4.IsEnabled ? (channel4.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[3].Add((short)(channel4.IsEnabled ? (channel4.OutputRight & 0x07FF) << 5 : 0)); + + var mixedLeft = 0; + if (channel1.IsEnabled) mixedLeft += channel1.OutputLeft; + if (channel2.IsEnabled) mixedLeft += channel2.OutputLeft; + if (channel3.IsEnabled) mixedLeft += channel3.OutputLeft; + if (channel4.IsEnabled) mixedLeft += channel4.OutputLeft; + mixedLeft = (mixedLeft & 0x07FF) << 5; + + var mixedRight = 0; + if (channel1.IsEnabled) mixedRight += channel1.OutputRight; + if (channel2.IsEnabled) mixedRight += channel2.OutputRight; + if (channel3.IsEnabled) mixedRight += channel3.OutputRight; + if (channel4.IsEnabled) mixedRight += channel4.OutputRight; + mixedRight = (mixedRight & 0x07FF) << 5; + + return new[] { mixedLeft, mixedRight }; + } + + public override byte ReadPort(ushort port) + { + return port switch + { + /* REG_SND_9697 (low) */ + 0x96 => (byte)((unknown9697 >> 0) & 0b11111111), + /* REG_SND_9697 (high) */ + 0x97 => (byte)((unknown9697 >> 8) & 0b00000011), + /* REG_SND_9899 (low) */ + 0x98 => (byte)((unknown9899 >> 0) & 0b11111111), + /* REG_SND_9899 (high) */ + 0x99 => (byte)((unknown9899 >> 8) & 0b00000011), + /* REG_SND_9A */ + 0x9A => 0b111, + /* REG_SND_9B */ + 0x9B => 0b11111110, + /* REG_SND_9C */ + 0x9C => 0b11111111, + /* REG_SND_9D */ + 0x9D => 0b11111111, + /* Fall through to common */ + _ => base.ReadPort(port) + }; + } + + public override void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x96: + /* REG_SND_9697 (low) */ + unknown9697 = (ushort)((unknown9697 & 0x0300) | (value << 0)); + break; + + case 0x97: + /* REG_SND_9697 (high) */ + unknown9697 = (ushort)((unknown9697 & 0x00FF) | (value << 8)); + break; + + case 0x98: + /* REG_SND_9899 (low) */ + unknown9899 = (ushort)((unknown9899 & 0x0300) | (value << 0)); + break; + + case 0x99: + /* REG_SND_9899 (high) */ + unknown9899 = (ushort)((unknown9899 & 0x00FF) | (value << 8)); + break; + + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + /* REG_SND_9x */ + break; + + default: + /* Fall through to common */ + base.WritePort(port, value); + break; + } + } + + [Port("REG_SND_9697", 0x096, 0x097)] + [BitDescription("Unknown data", 0, 9)] + [Format("X4")] + public ushort Unknown9697 => unknown9697; + [Port("REG_SND_9899", 0x098, 0x099)] + [BitDescription("Unknown data", 0, 9)] + [Format("X4")] + public ushort Unknown9899 => unknown9899; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/AswanSoundController.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/AswanSoundController.cs.meta new file mode 100644 index 00000000..60fbf46b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/AswanSoundController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 28765af694138b54d82c34169449c831 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel1.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel1.cs new file mode 100644 index 00000000..c6209252 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel1.cs @@ -0,0 +1,55 @@ +namespace StoicGoose.Core.Sound +{ + /* Channel 1, no additional features */ + public sealed class SoundChannel1 + { + const int counterReload = 2048; + + ushort counter; + byte pointer; + + public byte OutputLeft { get; set; } + public byte OutputRight { get; set; } + + readonly WaveTableReadDelegate waveTableReadDelegate; + + /* REG_SND_CH1_PITCH */ + public ushort Pitch { get; set; } + /* REG_SND_CH1_VOL */ + public byte VolumeLeft { get; set; } + public byte VolumeRight { get; set; } + /* REG_SND_CTRL */ + public bool IsEnabled { get; set; } + + public SoundChannel1(WaveTableReadDelegate waveTableRead) => waveTableReadDelegate = waveTableRead; + + public void Reset() + { + counter = counterReload; + pointer = 0; + OutputLeft = OutputRight = 0; + + Pitch = 0; + VolumeLeft = VolumeRight = 0; + IsEnabled = false; + } + + public void Step() + { + counter--; + if (counter == Pitch) + { + var data = waveTableReadDelegate((ushort)(pointer >> 1)); + if ((pointer & 0b1) == 0b1) data >>= 4; + data &= 0x0F; + + OutputLeft = (byte)(data * VolumeLeft); + OutputRight = (byte)(data * VolumeRight); + + pointer++; + pointer &= 0b11111; + counter = counterReload; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel1.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel1.cs.meta new file mode 100644 index 00000000..accfd797 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel1.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 72cd30fc769465c4e8a91b33b4baf47d \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel2.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel2.cs new file mode 100644 index 00000000..b2d9f97c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel2.cs @@ -0,0 +1,75 @@ +namespace StoicGoose.Core.Sound +{ + /* Channel 2, supports PCM voice */ + public sealed class SoundChannel2 + { + const int counterReload = 2048; + + ushort counter; + byte pointer; + + public byte OutputLeft { get; set; } + public byte OutputRight { get; set; } + + readonly WaveTableReadDelegate waveTableReadDelegate; + + /* REG_SND_CH2_PITCH */ + public ushort Pitch { get; set; } + /* REG_SND_CH2_VOL */ + public byte VolumeLeft { get; set; } + public byte VolumeRight { get; set; } + /* REG_SND_CTRL */ + public bool IsEnabled { get; set; } + public bool IsVoiceEnabled { get; set; } + + /* REG_SND_VOICE_CTRL */ + public bool PcmRightFull { get; set; } + public bool PcmRightHalf { get; set; } + public bool PcmLeftFull { get; set; } + public bool PcmLeftHalf { get; set; } + + public SoundChannel2(WaveTableReadDelegate waveTableRead) => waveTableReadDelegate = waveTableRead; + + public void Reset() + { + counter = counterReload; + pointer = 0; + OutputLeft = OutputRight = 0; + + Pitch = 0; + VolumeLeft = VolumeRight = 0; + IsEnabled = false; + + IsVoiceEnabled = false; + + PcmRightFull = PcmRightHalf = PcmLeftFull = PcmLeftHalf = false; + } + + public void Step() + { + if (IsVoiceEnabled) + { + var pcm = (ushort)(VolumeLeft << 4 | VolumeRight); + OutputLeft = (byte)(PcmLeftFull ? pcm : (PcmLeftHalf ? pcm >> 1 : 0)); + OutputRight = (byte)(PcmRightFull ? pcm : (PcmRightHalf ? pcm >> 1 : 0)); + } + else + { + counter--; + if (counter == Pitch) + { + var data = waveTableReadDelegate((ushort)(pointer >> 1)); + if ((pointer & 0b1) == 0b1) data >>= 4; + data &= 0x0F; + + OutputLeft = (byte)(data * VolumeLeft); + OutputRight = (byte)(data * VolumeRight); + + pointer++; + pointer &= 0b11111; + counter = counterReload; + } + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel2.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel2.cs.meta new file mode 100644 index 00000000..82a1d818 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel2.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4082002c536d05c4f97e428bfdfbb686 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel3.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel3.cs new file mode 100644 index 00000000..5c6b88aa --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel3.cs @@ -0,0 +1,88 @@ +namespace StoicGoose.Core.Sound +{ + /* Channel 3, has optional sweep */ + public sealed class SoundChannel3 + { + const int counterReload = 2048; + const int sweepReload = 32 * 256; + + ushort counter; + byte pointer; + + public byte OutputLeft { get; set; } + public byte OutputRight { get; set; } + + int sweepCounter; + int sweepCycles; + + readonly WaveTableReadDelegate waveTableReadDelegate; + + /* REG_SND_CH3_PITCH */ + public ushort Pitch { get; set; } + /* REG_SND_CH3_VOL */ + public byte VolumeLeft { get; set; } + public byte VolumeRight { get; set; } + /* REG_SND_CTRL */ + public bool IsEnabled { get; set; } + public bool IsSweepEnabled { get; set; } + + /* REG_SND_SWEEP_VALUE */ + public sbyte SweepValue { get; set; } + /* REG_SND_SWEEP_TIME */ + public byte SweepTime { get; set; } + + public SoundChannel3(WaveTableReadDelegate waveTableRead) => waveTableReadDelegate = waveTableRead; + + public void Reset() + { + counter = counterReload; + pointer = 0; + OutputLeft = OutputRight = 0; + + Pitch = 0; + VolumeLeft = VolumeRight = 0; + IsEnabled = false; + + IsSweepEnabled = false; + + sweepCounter = 0; + sweepCycles = sweepReload; + + SweepValue = 0; + SweepTime = 0; + } + + public void Step() + { + if (IsSweepEnabled) + { + sweepCycles--; + if (sweepCycles == 0) + { + sweepCounter--; + if (sweepCounter <= 0) + { + sweepCounter = SweepTime; + Pitch = (ushort)(Pitch + SweepValue); + } + } + sweepCycles = sweepReload; + } + + counter--; + if (counter == Pitch) + { + var data = waveTableReadDelegate((ushort)(pointer >> 1)); + if ((pointer & 0b1) == 0b1) data >>= 4; + data &= 0x0F; + + OutputLeft = (byte)(data * VolumeLeft); + OutputRight = (byte)(data * VolumeRight); + + pointer++; + pointer &= 0b11111; + counter = counterReload; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel3.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel3.cs.meta new file mode 100644 index 00000000..4ba8af64 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel3.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2885470480fbb3846b82cc3aec9dc315 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel4.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel4.cs new file mode 100644 index 00000000..755ebbd2 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel4.cs @@ -0,0 +1,88 @@ +namespace StoicGoose.Core.Sound +{ + /* Channel 4, supports noise */ + public sealed class SoundChannel4 + { + const int counterReload = 2048; + + readonly static byte[] noiseLfsrTaps = { 14, 10, 13, 4, 8, 6, 9, 11 }; + + ushort counter; + byte pointer; + + public byte OutputLeft { get; set; } + public byte OutputRight { get; set; } + + readonly WaveTableReadDelegate waveTableReadDelegate; + + /* REG_SND_CH4_PITCH */ + public ushort Pitch { get; set; } + /* REG_SND_CH4_VOL */ + public byte VolumeLeft { get; set; } + public byte VolumeRight { get; set; } + /* REG_SND_CTRL */ + public bool IsEnabled { get; set; } + public bool IsNoiseEnabled { get; set; } + + /* REG_SND_NOISE */ + public byte NoiseMode { get; set; } + public bool NoiseReset { get; set; } + public bool NoiseEnable { get; set; } + /* REG_SND_RANDOM */ + public ushort NoiseLfsr { get; set; } + + public SoundChannel4(WaveTableReadDelegate waveTableRead) => waveTableReadDelegate = waveTableRead; + + public void Reset() + { + counter = counterReload; + pointer = 0; + OutputLeft = OutputRight = 0; + + Pitch = 0; + VolumeLeft = VolumeRight = 0; + IsEnabled = false; + + IsNoiseEnabled = false; + + NoiseMode = 0; + NoiseReset = NoiseEnable = false; + NoiseLfsr = 0; + } + + public void Step() + { + counter--; + if (counter == Pitch) + { + if (NoiseEnable) + { + var tap = noiseLfsrTaps[NoiseMode]; + var noise = (1 ^ (NoiseLfsr >> 7) ^ (NoiseLfsr >> tap)) & 0b1; + NoiseLfsr = (ushort)(((NoiseLfsr << 1) | noise) & 0x7FFF); + } + + var data = IsNoiseEnabled ? ((NoiseLfsr & 0b1) * 0x0F) : waveTableReadDelegate((ushort)(pointer >> 1)); + if (!IsNoiseEnabled) + { + if ((pointer & 0b1) == 0b1) data >>= 4; + data &= 0x0F; + } + + OutputLeft = (byte)(data * VolumeLeft); + OutputRight = (byte)(data * VolumeRight); + + if (NoiseReset) + { + NoiseLfsr = 0; + OutputLeft = OutputRight = 0; + NoiseReset = false; + } + + pointer++; + pointer &= 0b11111; + counter = counterReload; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel4.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel4.cs.meta new file mode 100644 index 00000000..fb9f58cc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannel4.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b6fec75dc93d8b646a1294310530ae97 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannelHyperVoice.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannelHyperVoice.cs new file mode 100644 index 00000000..b27cae5b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannelHyperVoice.cs @@ -0,0 +1,55 @@ +namespace StoicGoose.Core.Sound +{ + /* HyperVoice channel */ + public sealed class SoundChannelHyperVoice + { + public byte OutputLeft { get; set; } + public byte OutputRight { get; set; } + + /* REG_HYPER_CTRL */ + public bool IsEnabled { get; set; } + public int ScalingMode { get; set; } + public int Volume { get; set; } + public byte CtrlUnknown { get; set; } + + /* REG_HYPER_CHAN_CTRL */ + public bool RightEnable { get; set; } + public bool LeftEnable { get; set; } + public byte ChanCtrlUnknown { get; set; } + + /* REG_SND_HYPERVOICE */ + public byte Data { get; set; } + + public SoundChannelHyperVoice() { } + + public void Reset() + { + OutputLeft = OutputRight = 0; + + IsEnabled = false; + ScalingMode = Volume = 0; + CtrlUnknown = 0; + + RightEnable = LeftEnable = false; + ChanCtrlUnknown = 0; + + Data = 0; + } + + public void Step() + { + var output = (byte)0; + + switch (ScalingMode) + { + case 0: output = (byte)(Data << 3 - Volume); break; + case 1: output = (byte)((Data << 3 - Volume) | (-0x100 << 3 - Volume)); break; + case 2: output = (byte)(Data << 3 - Volume); break; // ??? + case 3: output = (byte)(Data << 3); break; + } + + OutputLeft = LeftEnable ? output : (byte)0; + OutputRight = RightEnable ? output : (byte)0; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannelHyperVoice.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannelHyperVoice.cs.meta new file mode 100644 index 00000000..b93bb622 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundChannelHyperVoice.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b15fb27a01956c340b331a6969e590f9 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundControllerCommon.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundControllerCommon.cs new file mode 100644 index 00000000..70c30572 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundControllerCommon.cs @@ -0,0 +1,487 @@ +using System; +using System.Collections.Generic; + +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Interfaces; +using StoicGoose.Core.Machines; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Sound +{ + public delegate byte WaveTableReadDelegate(ushort address); + + public abstract partial class SoundControllerCommon : IPortAccessComponent + { + /* http://daifukkat.su/docs/wsman/#hw_sound */ + + public abstract byte MaxMasterVolume { get; } + public abstract int NumChannels { get; } + + readonly int sampleRate, numOutputChannels; + + protected readonly SoundChannel1 channel1 = default; + protected readonly SoundChannel2 channel2 = default; + protected readonly SoundChannel3 channel3 = default; + protected readonly SoundChannel4 channel4 = default; + + protected readonly List<short>[] channelSampleBuffers = default; + protected readonly List<short> mixedSampleBuffer = new(); + + public short[][] LastEnqueuedChannelSamples { get; private set; } = default; + public short[] LastEnqueuedMixedSamples { get; private set; } = Array.Empty<short>(); + + public Action<short[]> SendSamples { get; set; } = default; + + readonly double clockRate, refreshRate; + readonly int samplesPerFrame, cyclesPerFrame, cyclesPerSample; + int cycleCount; + + protected readonly IMachine machine = default; + + /* REG_SND_WAVE_BASE */ + protected byte waveTableBase; + /* REG_SND_OUTPUT */ + protected bool speakerEnable, headphoneEnable, headphonesConnected; + protected byte speakerVolumeShift; + /* REG_SND_VOLUME */ + protected byte masterVolume; + + public SoundControllerCommon(IMachine machine, int rate, int outChannels) + { + this.machine = machine; + + sampleRate = rate; + numOutputChannels = outChannels; + + channel1 = new SoundChannel1((a) => this.machine.ReadMemory((uint)((waveTableBase << 6) + (0 << 4) + a))); + channel2 = new SoundChannel2((a) => this.machine.ReadMemory((uint)((waveTableBase << 6) + (1 << 4) + a))); + channel3 = new SoundChannel3((a) => this.machine.ReadMemory((uint)((waveTableBase << 6) + (2 << 4) + a))); + channel4 = new SoundChannel4((a) => this.machine.ReadMemory((uint)((waveTableBase << 6) + (3 << 4) + a))); + + channelSampleBuffers = new List<short>[NumChannels]; + for (var i = 0; i < channelSampleBuffers.Length; i++) channelSampleBuffers[i] = new(); + + LastEnqueuedChannelSamples = new short[NumChannels][]; + + clockRate = MachineCommon.CpuClock; + refreshRate = Display.DisplayControllerCommon.VerticalClock; + + samplesPerFrame = (int)(sampleRate / refreshRate); + cyclesPerFrame = (int)(clockRate / refreshRate); + cyclesPerSample = cyclesPerFrame / samplesPerFrame; + } + + public virtual void Reset() + { + cycleCount = 0; + + channel1.Reset(); + channel2.Reset(); + channel3.Reset(); + channel4.Reset(); + + FlushSamples(); + + ResetRegisters(); + } + + public virtual void ResetRegisters() + { + waveTableBase = 0; + speakerEnable = headphoneEnable = false; + headphonesConnected = true; /* NOTE: always set for stereo sound */ + speakerVolumeShift = 0; + masterVolume = MaxMasterVolume; + } + + public void Shutdown() + { + /* Nothing to do */ + } + + public void ChangeMasterVolume() + { + var newMasterVolume = MasterVolume - 1; + if (newMasterVolume < 0) newMasterVolume = MaxMasterVolume; + else if (newMasterVolume > MaxMasterVolume) newMasterVolume = 0; + + masterVolume = (byte)newMasterVolume; + } + + public void Step(int clockCyclesInStep) + { + cycleCount += clockCyclesInStep; + + for (int i = 0; i < clockCyclesInStep; i++) + StepChannels(); + + if (cycleCount >= cyclesPerSample) + { + ProcessSample(GenerateSample()); + cycleCount -= cyclesPerSample; + } + + if (mixedSampleBuffer.Count >= (samplesPerFrame * numOutputChannels)) + { + var sampleArray = mixedSampleBuffer.ToArray(); + + LastEnqueuedMixedSamples = sampleArray; + for (var i = 0; i < NumChannels; i++) LastEnqueuedChannelSamples[i] = channelSampleBuffers[i].ToArray(); + + SendSamples?.Invoke(sampleArray.Clone() as short[]); + + FlushSamples(); + } + } + + public virtual void StepChannels() + { + channel1.Step(); + channel2.Step(); + channel3.Step(); + channel4.Step(); + } + + public abstract int[] GenerateSample(); + + public virtual void ProcessSample(int[] lrSamples) + { + if (headphonesConnected && !headphoneEnable && !speakerEnable) + /* Headphones connected but neither headphones nor speaker enabled? Don't output sound */ + lrSamples[0] = lrSamples[1] = 0; + else if (!headphonesConnected) + /* Otherwise, no headphones connected? Mix down to mono, perform volume shift */ + lrSamples[0] = lrSamples[1] = ((lrSamples[0] + lrSamples[1]) / 2) >> speakerVolumeShift; + + mixedSampleBuffer.Add((short)(lrSamples[0] * (masterVolume / (double)MaxMasterVolume))); /* Left */ + mixedSampleBuffer.Add((short)(lrSamples[1] * (masterVolume / (double)MaxMasterVolume))); /* Right */ + } + + public void FlushSamples() + { + foreach (var buffer in channelSampleBuffers) + buffer.Clear(); + + mixedSampleBuffer.Clear(); + } + + public virtual byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x80: + case 0x81: + /* REG_SND_CH1_PITCH */ + retVal |= (byte)(channel1.Pitch >> ((port & 0b1) * 8)); + break; + case 0x82: + case 0x83: + /* REG_SND_CH2_PITCH */ + retVal |= (byte)(channel2.Pitch >> ((port & 0b1) * 8)); + break; + case 0x84: + case 0x85: + /* REG_SND_CH3_PITCH */ + retVal |= (byte)(channel3.Pitch >> ((port & 0b1) * 8)); + break; + case 0x86: + case 0x87: + /* REG_SND_CH4_PITCH */ + retVal |= (byte)(channel4.Pitch >> ((port & 0b1) * 8)); + break; + + case 0x88: + /* REG_SND_CH1_VOL */ + retVal |= (byte)(channel1.VolumeLeft << 4 | channel1.VolumeRight); + break; + case 0x89: + /* REG_SND_CH2_VOL */ + retVal |= (byte)(channel2.VolumeLeft << 4 | channel2.VolumeRight); + break; + case 0x8A: + /* REG_SND_CH3_VOL */ + retVal |= (byte)(channel3.VolumeLeft << 4 | channel3.VolumeRight); + break; + case 0x8B: + /* REG_SND_CH4_VOL */ + retVal |= (byte)(channel4.VolumeLeft << 4 | channel4.VolumeRight); + break; + + case 0x8C: + /* REG_SND_SWEEP_VALUE */ + retVal |= (byte)channel3.SweepValue; + break; + + case 0x8D: + /* REG_SND_SWEEP_TIME */ + retVal |= (byte)(channel3.SweepTime & 0b11111); + break; + + case 0x8E: + /* REG_SND_NOISE */ + retVal |= (byte)(channel4.NoiseMode & 0b111); + /* Noise reset (bit 3) always reads 0 */ + ChangeBit(ref retVal, 4, channel4.NoiseEnable); + break; + + case 0x8F: + /* REG_SND_WAVE_BASE */ + retVal |= waveTableBase; + break; + + case 0x90: + /* REG_SND_CTRL */ + ChangeBit(ref retVal, 0, channel1.IsEnabled); + ChangeBit(ref retVal, 1, channel2.IsEnabled); + ChangeBit(ref retVal, 2, channel3.IsEnabled); + ChangeBit(ref retVal, 3, channel4.IsEnabled); + ChangeBit(ref retVal, 5, channel2.IsVoiceEnabled); + ChangeBit(ref retVal, 6, channel3.IsSweepEnabled); + ChangeBit(ref retVal, 7, channel4.IsNoiseEnabled); + break; + + case 0x91: + /* REG_SND_OUTPUT */ + ChangeBit(ref retVal, 0, speakerEnable); + ChangeBit(ref retVal, 3, headphoneEnable); + ChangeBit(ref retVal, 7, headphonesConnected); + retVal |= (byte)((speakerVolumeShift & 0b11) << 1); + break; + + case 0x92: + case 0x93: + /* REG_SND_RANDOM */ + retVal |= (byte)((channel4.NoiseLfsr >> ((port & 0b1) * 8)) & 0xFF); + break; + + case 0x94: + /* REG_SND_VOICE_CTRL */ + ChangeBit(ref retVal, 0, channel2.PcmRightFull); + ChangeBit(ref retVal, 1, channel2.PcmRightHalf); + ChangeBit(ref retVal, 2, channel2.PcmLeftFull); + ChangeBit(ref retVal, 3, channel2.PcmLeftHalf); + break; + + case 0x9E: + /* REG_SND_VOLUME */ + retVal |= (byte)(masterVolume & 0b11); + break; + + default: + throw new NotImplementedException($"Unimplemented sound register read {port:X2}"); + } + + return retVal; + } + + public virtual void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x80: + case 0x81: + /* REG_SND_CH1_PITCH */ + channel1.Pitch &= (ushort)((port & 0b1) != 0b1 ? 0x0700 : 0x00FF); + channel1.Pitch |= (ushort)(value << ((port & 0b1) * 8)); + break; + case 0x82: + case 0x83: + /* REG_SND_CH2_PITCH */ + channel2.Pitch &= (ushort)((port & 0b1) != 0b1 ? 0x0700 : 0x00FF); + channel2.Pitch |= (ushort)(value << ((port & 0b1) * 8)); + break; + case 0x84: + case 0x85: + /* REG_SND_CH3_PITCH */ + channel3.Pitch &= (ushort)((port & 0b1) != 0b1 ? 0x0700 : 0x00FF); + channel3.Pitch |= (ushort)(value << ((port & 0b1) * 8)); + break; + case 0x86: + case 0x87: + /* REG_SND_CH4_PITCH */ + channel4.Pitch &= (ushort)((port & 0b1) != 0b1 ? 0x0700 : 0x00FF); + channel4.Pitch |= (ushort)(value << ((port & 0b1) * 8)); + break; + + case 0x88: + /* REG_SND_CH1_VOL */ + channel1.VolumeLeft = (byte)((value >> 4) & 0b1111); + channel1.VolumeRight = (byte)((value >> 0) & 0b1111); + break; + case 0x89: + /* REG_SND_CH2_VOL */ + channel2.VolumeLeft = (byte)((value >> 4) & 0b1111); + channel2.VolumeRight = (byte)((value >> 0) & 0b1111); + break; + case 0x8A: + /* REG_SND_CH3_VOL */ + channel3.VolumeLeft = (byte)((value >> 4) & 0b1111); + channel3.VolumeRight = (byte)((value >> 0) & 0b1111); + break; + case 0x8B: + /* REG_SND_CH4_VOL */ + channel4.VolumeLeft = (byte)((value >> 4) & 0b1111); + channel4.VolumeRight = (byte)((value >> 0) & 0b1111); + break; + + case 0x8C: + /* REG_SND_SWEEP_VALUE */ + channel3.SweepValue = (sbyte)value; + break; + + case 0x8D: + /* REG_SND_SWEEP_TIME */ + channel3.SweepTime = (byte)(value & 0b11111); + break; + + case 0x8E: + /* REG_SND_NOISE */ + channel4.NoiseMode = (byte)(value & 0b111); + channel4.NoiseReset = IsBitSet(value, 3); + channel4.NoiseEnable = IsBitSet(value, 4); + break; + + case 0x8F: + /* REG_SND_WAVE_BASE */ + waveTableBase = value; + break; + + case 0x90: + /* REG_SND_CTRL */ + channel1.IsEnabled = IsBitSet(value, 0); + channel2.IsEnabled = IsBitSet(value, 1); + channel3.IsEnabled = IsBitSet(value, 2); + channel4.IsEnabled = IsBitSet(value, 3); + channel2.IsVoiceEnabled = IsBitSet(value, 5); + channel3.IsSweepEnabled = IsBitSet(value, 6); + channel4.IsNoiseEnabled = IsBitSet(value, 7); + break; + + case 0x91: + /* REG_SND_OUTPUT */ + speakerEnable = IsBitSet(value, 0); + speakerVolumeShift = (byte)((value >> 1) & 0b11); + headphoneEnable = IsBitSet(value, 3); + /* Headphones connected (bit 7) is read-only */ + break; + + case 0x92: + case 0x93: + /* REG_SND_RANDOM */ + break; + + case 0x94: + /* REG_SND_VOICE_CTRL */ + channel2.PcmRightFull = IsBitSet(value, 0); + channel2.PcmRightHalf = IsBitSet(value, 1); + channel2.PcmLeftFull = IsBitSet(value, 2); + channel2.PcmLeftHalf = IsBitSet(value, 3); + break; + + case 0x9E: + /* REG_SND_VOLUME */ + masterVolume = (byte)(value & 0b11); + break; + + default: + throw new NotImplementedException($"Unimplemented sound register write {port:X2}"); + } + } + + [Port("REG_SND_CH1_PITCH", 0x080, 0x081)] + [BitDescription("Channel 1 pitch (frequency reload)", 0, 10)] + public ushort Channel1Pitch => channel1.Pitch; + [Port("REG_SND_CH2_PITCH", 0x082, 0x083)] + [BitDescription("Channel 2 pitch (frequency reload)", 0, 10)] + public ushort Channel2Pitch => channel2.Pitch; + [Port("REG_SND_CH3_PITCH", 0x084, 0x085)] + [BitDescription("Channel 3 pitch (frequency reload)", 0, 10)] + public ushort Channel3Pitch => channel3.Pitch; + [Port("REG_SND_CH4_PITCH", 0x086, 0x087)] + [BitDescription("Channel 4 pitch (frequency reload)", 0, 10)] + public ushort Channel4Pitch => channel4.Pitch; + [Port("REG_SND_CH1_VOL", 0x088)] + [BitDescription("Channel 1 volume right", 0, 3)] + public byte Channel1VolumeRight => channel1.VolumeRight; + [Port("REG_SND_CH1_VOL", 0x088)] + [BitDescription("Channel 1 volume left", 4, 7)] + public byte Channel1VolumeLeft => channel1.VolumeLeft; + [Port("REG_SND_CH2_VOL", 0x089)] + [BitDescription("Channel 2 volume right", 0, 3)] + public byte Channel2VolumeRight => channel2.VolumeRight; + [Port("REG_SND_CH2_VOL", 0x089)] + [BitDescription("Channel 2 volume left", 4, 7)] + public byte Channel2VolumeLeft => channel2.VolumeLeft; + [Port("REG_SND_CH3_VOL", 0x08A)] + [BitDescription("Channel 3 volume right", 0, 3)] + public byte Channel3VolumeRight => channel3.VolumeRight; + [Port("REG_SND_CH3_VOL", 0x08A)] + [BitDescription("Channel 3 volume left", 4, 7)] + public byte Channel3VolumeLeft => channel3.VolumeLeft; + [Port("REG_SND_CH4_VOL", 0x08B)] + [BitDescription("Channel 4 volume right", 0, 3)] + public byte Channel4VolumeRight => channel4.VolumeRight; + [Port("REG_SND_CH4_VOL", 0x08B)] + [BitDescription("Channel 4 volume left", 4, 7)] + public byte Channel4VolumeLeft => channel4.VolumeLeft; + [Port("REG_SND_SWEEP_VALUE", 0x08C)] + [BitDescription("Channel 3 sweep value")] + public sbyte Channel3SweepValue => channel3.SweepValue; + [Port("REG_SND_SWEEP_TIME", 0x08D)] + [BitDescription("Channel 3 sweep time", 0, 4)] + public byte Channel3SweepTime => channel3.SweepTime; + [Port("REG_SND_NOISE", 0x08E)] + [BitDescription("Channel 4 noise mode", 0, 2)] + public byte Channel4NoiseMode => channel4.NoiseMode; + [Port("REG_SND_NOISE", 0x08E)] + [BitDescription("Is channel 4 noise enabled?", 4)] + public bool Channel4NoiseEnable => channel4.NoiseEnable; + [Port("REG_SND_WAVE_BASE", 0x08F)] + [BitDescription("Wavetable base address")] + [Format("X4", 6)] + public byte WaveTableBase => waveTableBase; + [Port("REG_SND_CTRL", 0x090)] + [BitDescription("Is channel 1 enabled?", 0)] + public bool Channel1IsEnabled => channel1.IsEnabled; + [Port("REG_SND_CTRL", 0x090)] + [BitDescription("Is channel 2 enabled?", 1)] + public bool Channel2IsEnabled => channel2.IsEnabled; + [Port("REG_SND_CTRL", 0x090)] + [BitDescription("Is channel 3 enabled?", 2)] + public bool Channel3IsEnabled => channel3.IsEnabled; + [Port("REG_SND_CTRL", 0x090)] + [BitDescription("Is channel 4 enabled?", 3)] + public bool Channel4IsEnabled => channel4.IsEnabled; + [Port("REG_SND_CTRL", 0x090)] + [BitDescription("Is channel 2 in voice mode?", 5)] + public bool Channel2IsVoiceEnabled => channel2.IsVoiceEnabled; + [Port("REG_SND_CTRL", 0x090)] + [BitDescription("Is channel 3 in sweep mode?", 6)] + public bool Channel3IsSweepEnabled => channel3.IsSweepEnabled; + [Port("REG_SND_CTRL", 0x090)] + [BitDescription("Is channel 4 in noise mode?", 7)] + public bool Channel4IsNoiseEnabled => channel4.IsNoiseEnabled; + [Port("REG_SND_OUTPUT", 0x091)] + [BitDescription("Is speaker enabled?", 0)] + public bool SpeakerEnable => speakerEnable; + [Port("REG_SND_OUTPUT", 0x091)] + [BitDescription("Speaker PWM volume bitshift", 1, 2)] + public byte SpeakerVolumeShift => speakerVolumeShift; + [Port("REG_SND_OUTPUT", 0x091)] + [BitDescription("Are headphones enabled?", 3)] + public bool HeadphoneEnable => headphoneEnable; + [Port("REG_SND_OUTPUT", 0x091)] + [BitDescription("Are headphones connected?", 7)] + public bool HeadphonesConnected => headphonesConnected; + [Port("REG_SND_RANDOM", 0x092, 0x093)] + [BitDescription("Current noise LFSR value", 0, 14)] + [Format("X4")] + public ushort Channel4NoiseLfsr => channel4.NoiseLfsr; + [Port("REG_SND_VOLUME", 0x09E)] + [BitDescription("Master volume level", 0, 1)] + public byte MasterVolume => masterVolume; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundControllerCommon.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundControllerCommon.cs.meta new file mode 100644 index 00000000..935f95ac --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SoundControllerCommon.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 58b2556218f34ae4eaca2861c63517cd \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SphinxSoundController.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SphinxSoundController.cs new file mode 100644 index 00000000..4922a423 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SphinxSoundController.cs @@ -0,0 +1,182 @@ +using StoicGoose.Common.Attributes; +using StoicGoose.Core.Interfaces; + +using static StoicGoose.Common.Utilities.BitHandling; + +namespace StoicGoose.Core.Sound +{ + public class SphinxSoundController : SoundControllerCommon + { + public override byte MaxMasterVolume => 3; + public override int NumChannels => 5; + + readonly SoundChannelHyperVoice channelHyperVoice = default; + + public SphinxSoundController(IMachine machine, int rate, int outChannels) : base(machine, rate, outChannels) + { + channelHyperVoice = new(); + } + + public override void Reset() + { + base.Reset(); + + channelHyperVoice.Reset(); + } + + public override void StepChannels() + { + base.StepChannels(); + + channelHyperVoice.Step(); + } + + public override int[] GenerateSample() + { + channelSampleBuffers[0].Add((short)(channel1.IsEnabled ? (channel1.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[0].Add((short)(channel1.IsEnabled ? (channel1.OutputRight & 0x07FF) << 5 : 0)); + channelSampleBuffers[1].Add((short)(channel2.IsEnabled ? (channel2.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[1].Add((short)(channel2.IsEnabled ? (channel2.OutputRight & 0x07FF) << 5 : 0)); + channelSampleBuffers[2].Add((short)(channel3.IsEnabled ? (channel3.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[2].Add((short)(channel3.IsEnabled ? (channel3.OutputRight & 0x07FF) << 5 : 0)); + channelSampleBuffers[3].Add((short)(channel4.IsEnabled ? (channel4.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[3].Add((short)(channel4.IsEnabled ? (channel4.OutputRight & 0x07FF) << 5 : 0)); + channelSampleBuffers[4].Add((short)(channelHyperVoice.IsEnabled ? (channelHyperVoice.OutputLeft & 0x07FF) << 5 : 0)); + channelSampleBuffers[4].Add((short)(channelHyperVoice.IsEnabled ? (channelHyperVoice.OutputRight & 0x07FF) << 5 : 0)); + + var mixedLeft = 0; + if (channel1.IsEnabled) mixedLeft += channel1.OutputLeft; + if (channel2.IsEnabled) mixedLeft += channel2.OutputLeft; + if (channel3.IsEnabled) mixedLeft += channel3.OutputLeft; + if (channel4.IsEnabled) mixedLeft += channel4.OutputLeft; + if (channelHyperVoice.IsEnabled && headphonesConnected) mixedLeft += channelHyperVoice.OutputLeft; + mixedLeft = (mixedLeft & 0x07FF) << 5; + + var mixedRight = 0; + if (channel1.IsEnabled) mixedRight += channel1.OutputRight; + if (channel2.IsEnabled) mixedRight += channel2.OutputRight; + if (channel3.IsEnabled) mixedRight += channel3.OutputRight; + if (channel4.IsEnabled) mixedRight += channel4.OutputRight; + if (channelHyperVoice.IsEnabled && headphonesConnected) mixedRight += channelHyperVoice.OutputRight; + mixedRight = (mixedRight & 0x07FF) << 5; + + return new[] { mixedLeft, mixedRight }; + } + + public override byte ReadPort(ushort port) + { + var retVal = (byte)0; + + switch (port) + { + case 0x6A: + /* REG_HYPER_CTRL */ + ChangeBit(ref retVal, 7, channelHyperVoice.IsEnabled); + retVal |= (byte)((channelHyperVoice.CtrlUnknown << 4) & 0b111); + retVal |= (byte)((channelHyperVoice.ScalingMode << 2) & 0b11); + retVal |= (byte)((channelHyperVoice.Volume << 0) & 0b11); + break; + + case 0x6B: + /* REG_HYPER_CHAN_CTRL */ + ChangeBit(ref retVal, 6, channelHyperVoice.RightEnable); + ChangeBit(ref retVal, 5, channelHyperVoice.LeftEnable); + retVal |= (byte)((channelHyperVoice.ChanCtrlUnknown << 0) & 0b1111); + break; + + case 0x95: + /* REG_SND_HYPERVOICE */ + retVal |= channelHyperVoice.Data; + break; + + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + /* REG_SND_9x */ + retVal = 0; + break; + + default: + /* Fall through to common */ + retVal |= base.ReadPort(port); + break; + } + + return retVal; + } + + public override void WritePort(ushort port, byte value) + { + switch (port) + { + case 0x6A: + /* REG_HYPER_CTRL */ + channelHyperVoice.IsEnabled = IsBitSet(value, 7); + channelHyperVoice.CtrlUnknown = (byte)((value >> 4) & 0b111); + channelHyperVoice.ScalingMode = (byte)((value >> 2) & 0b11); + channelHyperVoice.Volume = (byte)((value >> 0) & 0b11); + break; + + case 0x6B: + /* REG_HYPER_CHAN_CTRL */ + channelHyperVoice.RightEnable = IsBitSet(value, 6); + channelHyperVoice.LeftEnable = IsBitSet(value, 5); + channelHyperVoice.ChanCtrlUnknown = (byte)((value >> 0) & 0b1111); + break; + + case 0x95: + /* REG_SND_HYPERVOICE */ + channelHyperVoice.Data = value; + break; + + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + /* REG_SND_9x */ + break; + + default: + /* Fall through to common */ + base.WritePort(port, value); + break; + } + } + + [Port("REG_HYPER_CTRL", 0x06A)] + [BitDescription("Is HyperVoice enabled?", 7)] + public bool ChannelHyperVoiceIsEnable => channelHyperVoice.IsEnabled; + [Port("REG_HYPER_CTRL", 0x06A)] + [BitDescription("HyperVoice control unknown", 4, 6)] + public byte ChannelHyperVoiceCtrlUnknown => channelHyperVoice.CtrlUnknown; + [Port("REG_HYPER_CTRL", 0x06A)] + [BitDescription("HyperVoice scaling mode", 2, 3)] + public int ChannelHyperVoiceScalingMode => channelHyperVoice.ScalingMode; + [Port("REG_HYPER_CTRL", 0x06A)] + [BitDescription("HyperVoice volume", 0, 1)] + public int ChannelHyperVoiceVolume => channelHyperVoice.Volume; + + [Port("REG_HYPER_CHAN_CTRL", 0x06B)] + [BitDescription("Is HyperVoice right channel enabled?", 6)] + public bool ChannelHyperVoiceChanRightEnable => channelHyperVoice.RightEnable; + [Port("REG_HYPER_CHAN_CTRL", 0x06B)] + [BitDescription("Is HyperVoice left channel enabled?", 5)] + public bool ChannelHyperVoiceChanLeftEnable => channelHyperVoice.LeftEnable; + [Port("REG_HYPER_CHAN_CTRL", 0x06B)] + [BitDescription("HyperVoice channel control unknown", 0, 3)] + public byte ChannelHyperVoiceChanCtrlUnknown => channelHyperVoice.ChanCtrlUnknown; + + [Port("REG_SND_HYPERVOICE", 0x095)] + [BitDescription("HyperVoice channel working sample")] + public byte ChannelHyperVoiceData => channelHyperVoice.Data; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SphinxSoundController.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SphinxSoundController.cs.meta new file mode 100644 index 00000000..0d383538 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGoose.Core/Sound/SphinxSoundController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f1a789d9d88897f498d2634d568514c3 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseKey.cs b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseKey.cs new file mode 100644 index 00000000..a52006e1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseKey.cs @@ -0,0 +1,20 @@ +using System; + +namespace StoicGooseUnity +{ + [Flags] + public enum StoicGooseKey : ushort + { + X1 = 1, + X2 = 2, + X3 = 4, + X4 = 8, + Y1 = 16, + Y2 = 32, + Y3 = 64, + Y4 = 128, + Start = 256, + A = 512, + B = 1024 + } +} diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseKey.cs.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseKey.cs.meta new file mode 100644 index 00000000..ab8e45bc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseKey.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5e6310aac38e03548983e7e42f83018b \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseUnity.asmdef b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseUnity.asmdef new file mode 100644 index 00000000..fd78c039 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseUnity.asmdef @@ -0,0 +1,14 @@ +{ + "name": "StoicGooseUnity", + "rootNamespace": "", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseUnity.asmdef.meta b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseUnity.asmdef.meta new file mode 100644 index 00000000..57f393e7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Plugins/StoicGooseUnity/StoicGooseUnity.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 28e943ec033eb584b994cc1198ac76be +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap.meta b/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap.meta new file mode 100644 index 00000000..aa751ad4 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4dd43205ce0bd8f489c559dcc06b6526 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap/[BIOS] ColecoVision (USA, Europe).col.bytes b/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap/[BIOS] ColecoVision (USA, Europe).col.bytes new file mode 100644 index 00000000..ba4b278e Binary files /dev/null and b/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap/[BIOS] ColecoVision (USA, Europe).col.bytes differ diff --git a/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap/[BIOS] ColecoVision (USA, Europe).col.bytes.meta b/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap/[BIOS] ColecoVision (USA, Europe).col.bytes.meta new file mode 100644 index 00000000..9ef2c8c4 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/EssgeeUnity/emu/Dat/Bootstrap/[BIOS] ColecoVision (USA, Europe).col.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: efcafc093c10d4b46823dab15640a334 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/IMPORTENT.prefab b/AxibugEmuOnline.Client/Assets/Resources/IMPORTENT.prefab index 038080ca..8e7c8dc7 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/IMPORTENT.prefab +++ b/AxibugEmuOnline.Client/Assets/Resources/IMPORTENT.prefab @@ -1409,7 +1409,7 @@ PrefabInstance: m_Modifications: - target: {fileID: 1924338507, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} propertyPath: m_AnchoredPosition.y - value: -184 + value: -184.00003 objectReference: {fileID: 0} - target: {fileID: 155136085858422342, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} propertyPath: m_AnchorMax.y @@ -3955,6 +3955,26 @@ PrefabInstance: propertyPath: m_AnchoredPosition.x value: 0 objectReference: {fileID: 0} + - target: {fileID: 4533431376032812611, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} + propertyPath: MenuSetting.Array.data[1].SubMenus.Array.size + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 4533431376032812611, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} + propertyPath: MenuSetting.Array.data[1].SubMenus.Array.data[5].Icon + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + - target: {fileID: 4533431376032812611, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} + propertyPath: MenuSetting.Array.data[1].SubMenus.Array.data[5].Name + value: NeoGeo + objectReference: {fileID: 0} + - target: {fileID: 4533431376032812611, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} + propertyPath: MenuSetting.Array.data[1].SubMenus.Array.data[5].Description + value: SNK NeoGeo + objectReference: {fileID: 0} + - target: {fileID: 4533431376032812611, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} + propertyPath: MenuSetting.Array.data[1].SubMenus.Array.data[5].OverrideTemplate + value: + objectReference: {fileID: -3959751710151339114, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - target: {fileID: 4578492792357404689, guid: 450328d5a907c8249a60bc3980ba66f6, type: 3} propertyPath: m_AnchorMax.y value: 0 diff --git a/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/1uacdrk5ajfqttmocoj8n1fguv-c2507e1f253341b4207000b9f5fe358b.png.meta b/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/1uacdrk5ajfqttmocoj8n1fguv-c2507e1f253341b4207000b9f5fe358b.png.meta index a6657fe9..527581e1 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/1uacdrk5ajfqttmocoj8n1fguv-c2507e1f253341b4207000b9f5fe358b.png.meta +++ b/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/1uacdrk5ajfqttmocoj8n1fguv-c2507e1f253341b4207000b9f5fe358b.png.meta @@ -122,6 +122,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: @@ -139,7 +152,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: a60ed2fb3f19d22b0800000000000000 internalID: -5607665484935864214 diff --git a/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/6rf7oodogdjj94kre161mjq6bn-74e93e8b5108d6763a22df752eb86134.png.meta b/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/6rf7oodogdjj94kre161mjq6bn-74e93e8b5108d6763a22df752eb86134.png.meta index 97712681..009751d1 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/6rf7oodogdjj94kre161mjq6bn-74e93e8b5108d6763a22df752eb86134.png.meta +++ b/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/6rf7oodogdjj94kre161mjq6bn-74e93e8b5108d6763a22df752eb86134.png.meta @@ -268,6 +268,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: @@ -285,7 +311,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: ae446cd8ddb906a60800000000000000 internalID: 7665297941653243114 @@ -307,7 +333,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 9905fa78510838ed0800000000000000 internalID: -2412944145381371751 @@ -329,7 +355,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: ec31bc9e9d2523270800000000000000 internalID: 8228730565043098574 @@ -351,7 +377,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 861cea38537c463c0800000000000000 internalID: -4367146705986076312 @@ -373,7 +399,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: be44dbee93bdef0d0800000000000000 internalID: -3387028827871034133 @@ -395,7 +421,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 1c6962d8cd118cb70800000000000000 internalID: 8919398700965861057 @@ -417,7 +443,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 549d6f8a9c4a6ad20800000000000000 internalID: 3289497763870857541 @@ -439,7 +465,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 3a355be5fcd45a600800000000000000 internalID: 478874488427336611 @@ -461,7 +487,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 4af4f6b140c3a1b30800000000000000 internalID: 4258782385970040740 @@ -483,7 +509,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 5833db928c0d09c60800000000000000 internalID: 7822982110854853509 @@ -505,7 +531,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: dc65f3b1ba3190740800000000000000 internalID: 5118644077100750541 @@ -527,7 +553,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: f125ec73a5adcab90800000000000000 internalID: -7229163220818308577 @@ -549,7 +575,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 600885ca6ed1d6180800000000000000 internalID: -9120600793784221690 @@ -571,7 +597,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 39127d0c3f8c8d6d0800000000000000 internalID: -2965399405385539181 @@ -593,7 +619,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 26275ed2ec8efb150800000000000000 internalID: 5890682809854816866 @@ -615,7 +641,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 6c18d8564b7bfc4b0800000000000000 internalID: -5417909841277648442 @@ -637,7 +663,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 043955a96c345c6f0800000000000000 internalID: -665050849695395008 @@ -659,7 +685,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: b271df2b428cc7870800000000000000 internalID: 8682034241610782507 @@ -681,7 +707,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 0162a51d5d2d6c4a0800000000000000 internalID: -6573334790318447088 @@ -703,7 +729,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 0b40f3c2cc9a83640800000000000000 internalID: 5059980875731502256 @@ -725,7 +751,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 8a5becc95e4822690800000000000000 internalID: -7628388697099029080 @@ -747,7 +773,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 5f853cf090b938360800000000000000 internalID: 7170745494925433077 @@ -769,7 +795,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: d4fbbb62904e15cd0800000000000000 internalID: -2571023184296165555 @@ -791,7 +817,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 210aaa94a912f6080800000000000000 internalID: -9192091367895293934 @@ -813,7 +839,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 134ba18b7ecc934f0800000000000000 internalID: -848421759184358351 @@ -835,7 +861,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 3fd1aca73e730af70800000000000000 internalID: 9196411889247722995 @@ -857,7 +883,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 3bd21a6ef1d3bc700800000000000000 internalID: 561609785760361907 @@ -879,7 +905,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: b1106690fef5cfec0800000000000000 internalID: -3531842527505809125 @@ -901,7 +927,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 249461d82c9ccd180800000000000000 internalID: -9089168110512617150 @@ -923,7 +949,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 0d84d20cb7ee4e7d0800000000000000 internalID: -2889922845592434480 @@ -945,7 +971,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: b366cb4d2242f0da0800000000000000 internalID: -5976518448480754117 @@ -967,7 +993,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 38391ada3a8103a00800000000000000 internalID: 734113830533174147 @@ -989,7 +1015,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 1c36916cdda6d0810800000000000000 internalID: 1733158932351378369 @@ -1011,7 +1037,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 5e8971403903b4840800000000000000 internalID: 5209310801971091685 @@ -1033,7 +1059,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 7f45b7376087b3020800000000000000 internalID: 2322582001942222071 @@ -1055,7 +1081,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: cf94b711167990a70800000000000000 internalID: 8793726190578518524 @@ -1077,7 +1103,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: c4f47bd0118cd1870800000000000000 internalID: 8655294034446077772 @@ -1099,7 +1125,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 4c0c856c246202060800000000000000 internalID: 6926578295133225156 @@ -1121,7 +1147,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 7d79415329cdbc1f0800000000000000 internalID: -1023481969782777897 @@ -1143,7 +1169,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: c7cc5f0c80564a660800000000000000 internalID: 7396147576320674940 @@ -1165,7 +1191,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: df1e8b82e4d3608c0800000000000000 internalID: -4033469010363751939 @@ -1187,7 +1213,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: a31527d6e9f423940800000000000000 internalID: 5274365655463907642 @@ -1209,7 +1235,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 238cc0c883d60cdd0800000000000000 internalID: -2467852506163787726 @@ -1231,7 +1257,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 82c61bf5a52aa8c40800000000000000 internalID: 5515399202704813096 @@ -1253,7 +1279,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 185b884bc0d87cda0800000000000000 internalID: -5924611699074615935 @@ -1275,7 +1301,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 5381fa291ff6dd470800000000000000 internalID: 8421009961591445557 @@ -1297,7 +1323,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: aae9b461bf7e35350800000000000000 internalID: 6004397793811865258 @@ -1319,7 +1345,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 3000f367d488e4480800000000000000 internalID: -8913036746241933309 @@ -1341,7 +1367,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 2ef77e550f20cbd00800000000000000 internalID: 989669249371308002 @@ -1363,7 +1389,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 661747c0552a2bdc0800000000000000 internalID: -3624656263914950298 @@ -1385,7 +1411,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: f2f81b5e082ec6690800000000000000 internalID: -7607456627298300113 @@ -1407,7 +1433,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 703a9ba279d88a9e0800000000000000 internalID: -1609881186388565241 @@ -1429,7 +1455,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 9b8e69f0996d8fec0800000000000000 internalID: -3532837954792265543 @@ -1451,7 +1477,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: ac786f2c7ba4bf8d0800000000000000 internalID: -2811571389252335670 diff --git a/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/misc.png.meta b/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/misc.png.meta index a4d652e2..b82dcc41 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/misc.png.meta +++ b/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/misc.png.meta @@ -185,6 +185,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: @@ -202,7 +215,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: f696e6c3890961050800000000000000 internalID: 5770958956045166959 @@ -224,7 +237,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 56cf26953b243a080800000000000000 internalID: -9177418277584700315 @@ -246,7 +259,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 7de6f018be452df20800000000000000 internalID: 3445910035351170775 @@ -268,7 +281,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 86c79d1d354d65870800000000000000 internalID: 8671351589016534120 @@ -290,7 +303,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 1d0ef2cd858886200800000000000000 internalID: 173538500886388945 @@ -312,7 +325,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 0d2b6d78ce32e67c0800000000000000 internalID: -4076281113925471536 @@ -334,7 +347,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: 1812f2c00fa2ff960800000000000000 internalID: 7637870703528583553 @@ -356,7 +369,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: e07da79bc9d230bc0800000000000000 internalID: -3818157907930065138 @@ -378,7 +391,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: fe9042cb2d29961d0800000000000000 internalID: -3356990613430728209 @@ -400,7 +413,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: eec1b1448cf2a4370800000000000000 internalID: 8307504999820893422 @@ -422,7 +435,7 @@ TextureImporter: customData: outline: [] physicsShape: [] - tessellationDetail: 0 + tessellationDetail: -1 bones: [] spriteID: e1fe73202608acd30800000000000000 internalID: 4452512340041527070 diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity.meta b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity.meta new file mode 100644 index 00000000..750c3c6a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e38b0e24f0e41b54fb38be7507821d5c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/StoicGooseUnity.prefab b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/StoicGooseUnity.prefab new file mode 100644 index 00000000..3276f677 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/StoicGooseUnity.prefab @@ -0,0 +1,365 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &70883439141109485 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697793132499616605} + - component: {fileID: 8208523459577044397} + - component: {fileID: 1761025800639127157} + - component: {fileID: 175477975286986780} + - component: {fileID: 8490678488192273632} + - component: {fileID: 6011412303868462633} + m_Layer: 0 + m_Name: StoicGooseUnity + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1697793132499616605 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70883439141109485} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4829774629647575852} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8208523459577044397 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70883439141109485} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b7e1a8282bc4d764c81f63e62fd7aec8, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1761025800639127157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70883439141109485} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e8778828cf820b640b9d26ae977cdaba, type: 3} + m_Name: + m_EditorClassIdentifier: + mWidth: 0 + mHeight: 0 + mDataLenght: 0 + m_rawBufferWarper: {fileID: 0} + m_drawCanvas: {fileID: 1415903496979242101} + m_drawCanvasrect: {fileID: 4829774629647575852} +--- !u!114 &175477975286986780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70883439141109485} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 925771571ae9709429297d42587ce36d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_as: {fileID: 6011412303868462633} +--- !u!114 &8490678488192273632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70883439141109485} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 54c184e653057e64da4b9be96f4d876d, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!82 &6011412303868462633 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70883439141109485} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_Resource: {fileID: 0} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!1 &2203418964758308711 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 153069469667130431} + - component: {fileID: 1996193783355217829} + - component: {fileID: 1415903496979242101} + m_Layer: 5 + m_Name: GameRawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &153069469667130431 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2203418964758308711} + m_LocalRotation: {x: 1, y: 0, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4829774629647575852} + m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1996193783355217829 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2203418964758308711} + m_CullTransparentMesh: 1 +--- !u!114 &1415903496979242101 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2203418964758308711} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!1 &5558964681998005947 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4829774629647575852} + - component: {fileID: 6904606342347745421} + - component: {fileID: 2921482546112766419} + - component: {fileID: 7864505849399022799} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4829774629647575852 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5558964681998005947} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 153069469667130431} + m_Father: {fileID: 1697793132499616605} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &6904606342347745421 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5558964681998005947} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &2921482546112766419 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5558964681998005947} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &7864505849399022799 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5558964681998005947} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/StoicGooseUnity.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/StoicGooseUnity.prefab.meta new file mode 100644 index 00000000..2216e9ab --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/StoicGooseUnity.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 19a6fb74a404996459f79316dcef0f41 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu.meta b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu.meta new file mode 100644 index 00000000..d0afd9e6 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c002056b1a3ebd541ba56af40fe41ac2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat.meta b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat.meta new file mode 100644 index 00000000..93c82f9e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: baecae65d43245441a7e7e2b16e96ae9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan Color.dat.bytes b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan Color.dat.bytes new file mode 100644 index 00000000..c8c5af5f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan Color.dat.bytes @@ -0,0 +1,479 @@ +<?xml version="1.0"?> +<datafile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://datomatic.no-intro.org/stuff https://datomatic.no-intro.org/stuff/schema_nointro_datfile_v3.xsd"> + <header> + <id>51</id> + <name>Bandai - WonderSwan Color</name> + <description>Bandai - WonderSwan Color</description> + <version>20230827-003018</version> + <author>C. V. Reynolds, Gefflon, Hiccup, omonim2007, PPLToast, rarenight, relax, sCZther, SonGoku, xuom2</author> + <homepage>No-Intro</homepage> + <url>https://www.no-intro.org</url> + <clrmamepro forcenodump="required"/> + </header> + <game name="[BIOS] SwanCrystal Boot ROM (Japan) (En)" id="0121" cloneofid="0096"> + <description>[BIOS] SwanCrystal Boot ROM (Japan) (En)</description> + <rom name="[BIOS] SwanCrystal Boot ROM (Japan) (En).wsc" size="8192" crc="0b382c81" md5="d3eff34719a363e586e12b700501ed91" sha1="8270c4a72624692842a3cb9f195058f2ffba48c5" sha256="82e96addf5ab1ce09a84b6eedaa904e4ca432756851f7e0cc0649006c183834d"/> + </game> + <game name="[BIOS] WonderSwan Color Boot ROM (Japan) (En)" id="0096"> + <description>[BIOS] WonderSwan Color Boot ROM (Japan) (En)</description> + <rom name="[BIOS] WonderSwan Color Boot ROM (Japan) (En).wsc" size="8192" crc="cb06d9c3" md5="880893bd5a7d53fff826bd76a83d566e" sha1="c5ad0b8af45d762662a69f50b64161b9c8919efb" sha256="f5a5c044d84ce1681f94e9ef74287cb989784497be5bd5108df17908dfa55db2"/> + </game> + <game name="Alchemist Marie & Elie - Futari no Atelier (Japan)" id="0001"> + <description>Alchemist Marie & Elie - Futari no Atelier (Japan)</description> + <rom name="Alchemist Marie & Elie - Futari no Atelier (Japan).wsc" size="4194304" crc="b18cdc0d" md5="cb58db877b8adfce59f2e34cc4224d8b" sha1="99d9d7f951ae589059f34e76aea7489ae4cd79f1"/> + </game> + <game name="Another Heaven - Memory of those Days (Japan)" id="0002"> + <description>Another Heaven - Memory of those Days (Japan)</description> + <rom name="Another Heaven - Memory of those Days (Japan).wsc" size="4194304" crc="d7a0ab74" md5="30e5f0895254ea2952f4a6a707ace47c" sha1="caf4a8de853ded732b2a72619acf2784eeceafc7" status="verified"/> + </game> + <game name="Arc the Lad - Kishin Fukkatsu (Japan)" id="0003"> + <description>Arc the Lad - Kishin Fukkatsu (Japan)</description> + <rom name="Arc the Lad - Kishin Fukkatsu (Japan).wsc" size="8388608" crc="e2317345" md5="7a1023850bddb3b9547a9be8075da01d" sha1="68981c05d8118d4189100eed462ee6639328dc59" status="verified"/> + </game> + <game name="Battle Spirit - Digimon Frontier (Japan) (Rev 1)" id="0004"> + <description>Battle Spirit - Digimon Frontier (Japan) (Rev 1)</description> + <rom name="Battle Spirit - Digimon Frontier (Japan) (Rev 1).wsc" size="4194304" crc="8ba49dab" md5="5fd4676d03e21bf3eee5c9c0236c992c" sha1="fffb1aea34e0a96113cd10ba9de515000d27bfe6" status="verified"/> + </game> + <game name="Blue Wing Blitz (Japan)" id="0005"> + <description>Blue Wing Blitz (Japan)</description> + <rom name="Blue Wing Blitz (Japan).wsc" size="2097152" crc="99027238" md5="1ea61538422bc2d6349c321fa15b334f" sha1="02103fc5fc97c3a38834ced32a3cfe6523832535"/> + </game> + <game name="Cardinal Sins - Recycle Edition (World) (v1.02) (WonderWitch Conversion)" id="0123"> + <description>Cardinal Sins - Recycle Edition (World) (v1.02) (WonderWitch Conversion)</description> + <rom name="Cardinal Sins - Recycle Edition (World) (v1.02) (WonderWitch Conversion).wsc" size="524288" crc="7ee85eb9" md5="485072a6e4fbd66f7162ebbc899541c5" sha1="1c8af39ee8c499947e8cc14f42b274594e2da141" sha256="b3cd54eb15d212887ed41c2b574927a0379faae5d3fb3c461b025f0b51608cb5" mia="yes"/> + </game> + <game name="Dark Eyes - Battle Gate (Japan)" id="0006"> + <description>Dark Eyes - Battle Gate (Japan)</description> + <rom name="Dark Eyes - Battle Gate (Japan).wsc" size="4194304" crc="12ae932c" md5="d3d18ea7800d93cb3a22e275bae9f836" sha1="c2188171dc0f78fb6a13bbb55b4e85bdf7b82fd5"/> + </game> + <game name="Dicing Knight. (Japan)" id="0007"> + <description>Dicing Knight. (Japan)</description> + <rom name="Dicing Knight. (Japan).wsc" size="2097152" crc="1887389c" md5="098b747bf9d88f651735b45197e393e1" sha1="1e4d8e8b3d16083968055cc76b604da91fa0a132" status="verified"/> + </game> + <game name="Digimon - Anode Tamer & Cathode Tamer - Veedramon Version (Hong Kong) (En)" id="0008"> + <description>Digimon - Anode Tamer & Cathode Tamer - Veedramon Version (Hong Kong) (En)</description> + <rom name="Digimon - Anode Tamer & Cathode Tamer - Veedramon Version (Hong Kong) (En).wsc" size="4194304" crc="77689273" md5="47b23a84817217cc5b9bbd85fe634174" sha1="7a6411cf8a4d91e8a4e0532779f11bdd25b92363"/> + </game> + <game name="Digimon - Anode Tamer & Cathode Tamer - Veedramon Version (Korea) (En)" id="0111" cloneofid="0008"> + <description>Digimon - Anode Tamer & Cathode Tamer - Veedramon Version (Korea) (En)</description> + <rom name="Digimon - Anode Tamer & Cathode Tamer - Veedramon Version (Korea) (En).wsc" size="4194304" crc="7b2a02e3" md5="31b9dc2a403ddacacf1a7cd0c15c5227" sha1="c43ce28fa21b0a6725a6f0e5b2b68bcae6c508f2"/> + </game> + <game name="Digimon Adventure 02 - D1 Tamers (Japan)" id="0009" cloneofid="0097"> + <description>Digimon Adventure 02 - D1 Tamers (Japan)</description> + <rom name="Digimon Adventure 02 - D1 Tamers (Japan).wsc" size="4194304" crc="4d28637e" md5="833bd00f18fac9b03392a1d2cec17a54" sha1="18d3dfe25d82964ab7bb61af363d368fd12f4d4b" status="verified"/> + </game> + <game name="Digimon Adventure 02 - D1 Tamers (Japan) (Rev 1)" id="0097"> + <description>Digimon Adventure 02 - D1 Tamers (Japan) (Rev 1)</description> + <rom name="Digimon Adventure 02 - D1 Tamers (Japan) (Rev 1).wsc" size="4194304" crc="62f4e4b4" md5="bb1067e3df3b632b32cd38543da8bd81" sha1="6fbb07bfefac7832436ec56e4d95678428b0f7ba" status="verified"/> + </game> + <game name="Digimon Tamers - Battle Spirit (Japan, Korea) (En,Ja)" id="0010"> + <description>Digimon Tamers - Battle Spirit (Japan, Korea) (En,Ja)</description> + <rom name="Digimon Tamers - Battle Spirit (Japan, Korea) (En,Ja).wsc" size="4194304" crc="c927bfcb" md5="71146ab7c32bd1524c27da0faefcf46a" sha1="757e92177385a14d979227edee1cb544b4c56bd6" status="verified"/> + </game> + <game name="Digimon Tamers - Battle Spirit Ver. 1.5 (Japan)" id="0011"> + <description>Digimon Tamers - Battle Spirit Ver. 1.5 (Japan)</description> + <rom name="Digimon Tamers - Battle Spirit Ver. 1.5 (Japan).wsc" size="8388608" crc="6caad4a2" md5="7e1be9ec064d8e1e92f26668c8a74326" sha1="3f39ff494a3d8dd9d55a2e7cf86b47f1c8e8a156" status="verified"/> + </game> + <game name="Digimon Tamers - Brave Tamer (Japan) (Rev 1)" id="0012"> + <description>Digimon Tamers - Brave Tamer (Japan) (Rev 1)</description> + <rom name="Digimon Tamers - Brave Tamer (Japan) (Rev 1).wsc" size="4194304" crc="f1f4d41f" md5="5883b9d0f63fe8daa9c1a2259c154466" sha1="31a718cfbcff2dab56ab9606a0b5b2dfccecbbcb" status="verified"/> + </game> + <game name="Digimon Tamers - Digimon Medley (Japan)" id="0013" cloneofid="0102"> + <description>Digimon Tamers - Digimon Medley (Japan)</description> + <rom name="Digimon Tamers - Digimon Medley (Japan).wsc" size="4194304" crc="fa92418d" md5="aaa71e8698a1e765d655eb24fcac19e3" sha1="8638737e5a35c6be05a888dc81e504e0d80fd756" status="verified"/> + </game> + <game name="Digimon Tamers - Digimon Medley (Japan) (Rev 1)" id="0102"> + <description>Digimon Tamers - Digimon Medley (Japan) (Rev 1)</description> + <rom name="Digimon Tamers - Digimon Medley (Japan) (Rev 1).wsc" size="4194304" crc="84a46949" md5="367e9ef3630061fdf91a2110911611a7" sha1="6c5a2dc7e231ebd278fe22bb7f01b1a7cc3785d6" status="verified"/> + </game> + <game name="Digital Monster - D-Project (Japan)" id="0014" cloneofid="0105"> + <description>Digital Monster - D-Project (Japan)</description> + <rom name="Digital Monster - D-Project (Japan).wsc" size="4194304" crc="faaefbcb" md5="88eee9ec8e4f093a55125f42cd868647" sha1="3e8fffe1f607ea5f855397d9d877cecb285507f7"/> + </game> + <game name="Digital Monster - D-Project (Japan) (Rev 1)" id="0098" cloneofid="0105"> + <description>Digital Monster - D-Project (Japan) (Rev 1)</description> + <rom name="Digital Monster - D-Project (Japan) (Rev 1).wsc" size="4194304" crc="bd83b82d" md5="473af43db90ac49686c91672fc0bb095" sha1="7dab09df13e65aa778e3bc9100efffb10b93b8a9"/> + </game> + <game name="Digital Monster - D-Project (Japan) (Rev 2)" id="0105"> + <description>Digital Monster - D-Project (Japan) (Rev 2)</description> + <rom name="Digital Monster - D-Project (Japan) (Rev 2).wsc" size="4194304" crc="0e40829c" md5="173e9d76206a88bf05696027b4d55850" sha1="016de32719e920fd9996c52d7eb81f2a60a24d7a" sha256="b8a4a641a896e205467b6c209aa5af604472e1779d1aed9888e3ecad84dbce33" status="verified"/> + </game> + <game name="Digital Monster Card Game - Ver. WonderSwan Color (Japan)" id="0015" cloneofid="0103"> + <description>Digital Monster Card Game - Ver. WonderSwan Color (Japan)</description> + <rom name="Digital Monster Card Game - Ver. WonderSwan Color (Japan).wsc" size="4194304" crc="603cb5e6" md5="52b643d1564b4e093e786e670aa30582" sha1="ba16a0770f7a71dd49e2879799fd04a4f04f7e60" status="verified"/> + </game> + <game name="Digital Monster Card Game - Ver. WonderSwan Color (Japan) (Rev 2)" id="0103"> + <description>Digital Monster Card Game - Ver. WonderSwan Color (Japan) (Rev 2)</description> + <rom name="Digital Monster Card Game - Ver. WonderSwan Color (Japan) (Rev 2).wsc" size="4194304" crc="1e760c41" md5="c17c4de6648c776b246ae83991ac3978" sha1="e31bfa54cbf539a9d28090b372d8e669a93c3e28" status="verified"/> + </game> + <game name="Dokodemo Hamster 3 - Odekake Saffron (Japan) (Rev 2)" id="0016"> + <description>Dokodemo Hamster 3 - Odekake Saffron (Japan) (Rev 2)</description> + <rom name="Dokodemo Hamster 3 - Odekake Saffron (Japan) (Rev 2).wsc" size="2097152" crc="93e19f13" md5="9ca8890339c62cc782b1a61c81e055ef" sha1="66b4bd15ef67dc324736a1cc78d6aca335f03389"/> + </game> + <game name="Dragon Ball (Japan)" id="0017"> + <description>Dragon Ball (Japan)</description> + <rom name="Dragon Ball (Japan).wsc" size="2097152" crc="067238d1" md5="7209acaa3415a4f179ac17fd574453a6" sha1="5384f9974c66e5e26129a4709976de0bb1ae1f17"/> + </game> + <game name="Final Fantasy (Japan)" id="0018"> + <description>Final Fantasy (Japan)</description> + <rom name="Final Fantasy (Japan).wsc" size="4194304" crc="b7243e88" md5="e36650ac50df69d1832a0d496c165db2" sha1="26628eb76c16880b6faf2e706778d91a60144078" status="verified"/> + </game> + <game name="Final Fantasy II (Japan)" id="0019"> + <description>Final Fantasy II (Japan)</description> + <rom name="Final Fantasy II (Japan).wsc" size="4194304" crc="f09e752f" md5="e03e666452651e82eb5734a9d684802a" sha1="959321e3b971516e38a4cbf95b0fc3efc0b0a825" sha256="73e6265656ad16118c7d0896eeba516c5e499ac0f214508fb0f232a8b459be2d" status="verified"/> + </game> + <game name="Final Fantasy IV (Japan)" id="0020"> + <description>Final Fantasy IV (Japan)</description> + <rom name="Final Fantasy IV (Japan).wsc" size="4194304" crc="f699d6d1" md5="47d83279cbdbd91c51cb7b0063d5d3e5" sha1="6d707e88c85d1b5ef708631e709668006a9ee244"/> + </game> + <game name="Final Lap Special - GT & Formula Machine (Japan)" id="0021"> + <description>Final Lap Special - GT & Formula Machine (Japan)</description> + <rom name="Final Lap Special - GT & Formula Machine (Japan).wsc" size="4194304" crc="b07e6a56" md5="0870f205e8a0148cc75d642f00558057" sha1="4c3f092b095bdb0afdaf8d32d4c54b4d6c209c96"/> + </game> + <game name="Flash Koibito-kun (Japan)" id="0022"> + <description>Flash Koibito-kun (Japan)</description> + <rom name="Flash Koibito-kun (Japan).wsc" size="2097152" crc="69d8d433" md5="ca1526278a8cf00816b1a88a51916b00" sha1="a3d6717efdb8f243fe86b4c3d869a9734a2e02d3"/> + </game> + <game name="Flash Masta Firmware (USA) (2016-08-29) (Unl)" id="0116"> + <description>Flash Masta Firmware (USA) (2016-08-29) (Unl)</description> + <rom name="Flash Masta Firmware (USA) (2016-08-29) (Unl).wsc" size="131072" crc="c071d240" md5="53a132ba86468f4b94ba5677ba8e6005" sha1="2fce8b8e08e3f90999589b2d226fc7038b17ef22"/> + </game> + <game name="Flash Masta Firmware (USA) (2016-05-13) (Unl)" id="0117" cloneofid="0116"> + <description>Flash Masta Firmware (USA) (2016-05-13) (Unl)</description> + <rom name="Flash Masta Firmware (USA) (2016-05-13) (Unl).wsc" size="524288" crc="aabce377" md5="13bf6cd03774fb7ddb70d62813aa89b9" sha1="9869c7c97e229e103203360454495a4dbcdc3614"/> + </game> + <game name="From TV Animation One Piece - Chopper no Daibouken (Japan)" id="0023"> + <description>From TV Animation One Piece - Chopper no Daibouken (Japan)</description> + <rom name="From TV Animation One Piece - Chopper no Daibouken (Japan).wsc" size="4194304" crc="8e120b5a" md5="f19436970509e5e97b5fd96752aadb8a" sha1="221f48e97ec2c6d0046213956e1f36e923c0dec2"/> + </game> + <game name="From TV Animation One Piece - Grand Battle Swan Colosseum (Japan)" id="0024"> + <description>From TV Animation One Piece - Grand Battle Swan Colosseum (Japan)</description> + <rom name="From TV Animation One Piece - Grand Battle Swan Colosseum (Japan).wsc" size="8388608" crc="f8a1dd2b" md5="7fa6a3034b8c03fca0b756fb5526ce62" sha1="01e765bf356cdcb413bfd27c6321f7449465766a" sha256="f6d9727a3183bd8b9a9a4765f8437c07c232935219cf4907b993d4b23b4cffb7" status="verified"/> + </game> + <game name="From TV Animation One Piece - Grand Battle Swan Colosseum (Japan) (Sample)" id="0100" cloneofid="0024"> + <description>From TV Animation One Piece - Grand Battle Swan Colosseum (Japan) (Sample)</description> + <rom name="From TV Animation One Piece - Grand Battle Swan Colosseum (Japan) (Sample).wsc" size="8388608" crc="23853305" md5="3163aefecbb4daa562dcfa286e4084e1" sha1="60aad42f70367fad2e1ce4a84214e467c53f873c" sha256="cdc5d215df65383c8e84abb8da72682ae81ed96d2281489764d584072d342181" status="verified"/> + </game> + <game name="From TV Animation One Piece - Niji no Shima Densetsu (Japan)" id="0025"> + <description>From TV Animation One Piece - Niji no Shima Densetsu (Japan)</description> + <rom name="From TV Animation One Piece - Niji no Shima Densetsu (Japan).wsc" size="4194304" crc="427056c4" md5="547501367ccf6262a70d0030e68cc75e" sha1="2410690ad46667c52b63402df9e95fc8a75cee62" status="verified"/> + </game> + <game name="From TV Animation One Piece - Treasure Wars (Japan)" id="0026" cloneofid="0099"> + <description>From TV Animation One Piece - Treasure Wars (Japan)</description> + <rom name="From TV Animation One Piece - Treasure Wars (Japan).wsc" size="4194304" crc="205503c3" md5="9a860c9eea23a35bb5b17a1ae640e269" sha1="dd1e6e5467b72fcb5848f07a9747aa66bb207d45" status="verified"/> + </game> + <game name="From TV Animation One Piece - Treasure Wars (Japan) (Rev 1)" id="0099"> + <description>From TV Animation One Piece - Treasure Wars (Japan) (Rev 1)</description> + <rom name="From TV Animation One Piece - Treasure Wars (Japan) (Rev 1).wsc" size="4194304" crc="3df3e34c" md5="166946565e646215816123677c7c2108" sha1="55088795164170c24b243a1b572506f123064c0f"/> + </game> + <game name="From TV Animation One Piece - Treasure Wars 2 - Buggy Land e Youkoso (Japan)" id="0027"> + <description>From TV Animation One Piece - Treasure Wars 2 - Buggy Land e Youkoso (Japan)</description> + <rom name="From TV Animation One Piece - Treasure Wars 2 - Buggy Land e Youkoso (Japan).wsc" size="8388608" crc="0d1048f0" md5="852740c38184f0dbb27ee2bdf670869a" sha1="b7775e8f60fd62dc07f2865f8fad29a11e12dbb5"/> + </game> + <game name="Front Mission (Japan)" id="0028"> + <description>Front Mission (Japan)</description> + <rom name="Front Mission (Japan).wsc" size="8388608" crc="2f9e2560" md5="9bfcf86bf65c9fdae4a0f88fadafd0d8" sha1="3c752694ab651f9a00ccd39c334a2e3ff78f5cb2"/> + </game> + <game name="Gekitou! Crash Gear Turbo - Gear Champion League (Japan)" id="0029"> + <description>Gekitou! Crash Gear Turbo - Gear Champion League (Japan)</description> + <rom name="Gekitou! Crash Gear Turbo - Gear Champion League (Japan).wsc" size="4194304" crc="8a8b827c" md5="497bc31e5e84ade37a809aeb90208943" sha1="1bc1e831b9e2aefc59f2cac5f19f7d22be574fc1" status="verified"/> + </game> + <game name="Gensou Maden Saiyuuki Retribution - Hi no Ataru Basho de (Japan) (Rev 2)" id="0030"> + <description>Gensou Maden Saiyuuki Retribution - Hi no Ataru Basho de (Japan) (Rev 2)</description> + <rom name="Gensou Maden Saiyuuki Retribution - Hi no Ataru Basho de (Japan) (Rev 2).wsc" size="2097152" crc="446e2581" md5="cdbcacff7dd0348beffb1e228592e2e1" sha1="adbe6e38a0bc6a2d19da64a444071977b771f14f" status="verified"/> + </game> + <game name="Golden Axe (Japan)" id="0031"> + <description>Golden Axe (Japan)</description> + <rom name="Golden Axe (Japan).wsc" size="4194304" crc="bc944a98" md5="55c9cc830000f0aaf721eac69d1703cc" sha1="87661841ca63e99b04c0f6dc4ba3454c897e0c6d"/> + </game> + <game name="Gransta Chronicle (Japan)" id="0032"> + <description>Gransta Chronicle (Japan)</description> + <rom name="Gransta Chronicle (Japan).wsc" size="8388608" crc="af24f95c" md5="f6a4c3b2b58b14dbb96c622757b89150" sha1="3a4c5d1c08b74cf05b4cb64cbfd7c3dd8b1c3789" status="verified"/> + </game> + <game name="Guilty Gear Petit (Japan)" id="0033"> + <description>Guilty Gear Petit (Japan)</description> + <rom name="Guilty Gear Petit (Japan).wsc" size="2097152" crc="9750bc2a" md5="be0f50bc4470711a31be0bd33c775ad2" sha1="6d8f8fd330f32374b55cf6b998196a7db2131073"/> + </game> + <game name="Guilty Gear Petit 2 (Japan)" id="0034"> + <description>Guilty Gear Petit 2 (Japan)</description> + <rom name="Guilty Gear Petit 2 (Japan).wsc" size="4194304" crc="d7a12bd5" md5="1eb91e6b46ab5624c7b707ea7b7abe9d" sha1="f7aeab6724154f7ef6a389f9f18b7100045e1064"/> + </game> + <game name="GunPey EX (Japan)" id="0035"> + <description>GunPey EX (Japan)</description> + <rom name="GunPey EX (Japan).wsc" size="1048576" crc="0c9cb12c" md5="b7f9c3d80b83178ba192297ea755d066" sha1="1eb729aa9ab0a7df6f8a3470a6fede59d7622d4a"/> + </game> + <game name="Hanjuku Hero - Ah, Sekai yo Hanjuku Nare...!! (Japan) (Rev 1)" id="0036"> + <description>Hanjuku Hero - Ah, Sekai yo Hanjuku Nare...!! (Japan) (Rev 1)</description> + <rom name="Hanjuku Hero - Ah, Sekai yo Hanjuku Nare...!! (Japan) (Rev 1).wsc" size="4194304" crc="31e09bed" md5="6c1b75de270e7e96df161833a5522b7d" sha1="2e3f221d6965f53b29586d2019ee81dec6d1ac30"/> + </game> + <game name="Hataraku Chocobo (Japan)" id="0037"> + <description>Hataraku Chocobo (Japan)</description> + <rom name="Hataraku Chocobo (Japan).wsc" size="1048576" crc="7a29e9a6" md5="ebab0f1f4148d54437834971d9756431" sha1="9bd63ed48926b27be70333fbe07da2ceed56328a" status="verified"/> + </game> + <game name="Hunter X Hunter - Greed Island (Japan)" id="0038" cloneofid="0108"> + <description>Hunter X Hunter - Greed Island (Japan)</description> + <rom name="Hunter X Hunter - Greed Island (Japan).wsc" size="8388608" crc="a487b7a8" md5="c8c0387c6a1f9e55a111da9fde7b854a" sha1="f66335b5af87e7cb72ae311eb9b339534722f738"/> + </game> + <game name="Hunter X Hunter - Greed Island (Japan) (Rev 1)" id="0108"> + <description>Hunter X Hunter - Greed Island (Japan) (Rev 1)</description> + <rom name="Hunter X Hunter - Greed Island (Japan) (Rev 1).wsc" size="8388608" crc="130af567" md5="e54a236ff923346e1b6eaed84bc8033c" sha1="e26410d4eee4cc8cec5e2e369604aedf26d69d0c" status="verified"/> + </game> + <game name="Hunter X Hunter - Michibikareshi Mono (Japan)" id="0039"> + <description>Hunter X Hunter - Michibikareshi Mono (Japan)</description> + <rom name="Hunter X Hunter - Michibikareshi Mono (Japan).wsc" size="4194304" crc="9402bca9" md5="d3e0f6a6731565c1bd57757a0e4bad3c" sha1="bc591fc24d3f8e94b70503fd8b6a35fa58151139"/> + </game> + <game name="Hunter X Hunter - Sorezore no Ketsui (Japan)" id="0040"> + <description>Hunter X Hunter - Sorezore no Ketsui (Japan)</description> + <rom name="Hunter X Hunter - Sorezore no Ketsui (Japan).wsc" size="4194304" crc="d0b20c5a" md5="12a59977999dcf7baebd79c81ab8f5a7" sha1="2da2a9bcff4813abcb5b2c88095258d89a575378" status="verified"/> + </game> + <game name="Inuyasha - Fuuun Emaki (Japan)" id="0041"> + <description>Inuyasha - Fuuun Emaki (Japan)</description> + <rom name="Inuyasha - Fuuun Emaki (Japan).wsc" size="4194304" crc="3ff5791f" md5="71578fb7c59a3a3923d03d1d48b5ffd3" sha1="99d5bdde193685a1d09ea73bb79a54b4da82625d" status="verified"/> + </game> + <game name="Inuyasha - Kagome no Sengoku Nikki (Japan)" id="0042"> + <description>Inuyasha - Kagome no Sengoku Nikki (Japan)</description> + <rom name="Inuyasha - Kagome no Sengoku Nikki (Japan).wsc" size="2097152" crc="0c23d551" md5="f1e53c706af452671467b8f4595258d4" sha1="b4fbea1a2c50d8566685f72820b360af4b54f82f" status="verified"/> + </game> + <game name="Inuyasha - Kagome no Yume Nikki (Japan)" id="0043"> + <description>Inuyasha - Kagome no Yume Nikki (Japan)</description> + <rom name="Inuyasha - Kagome no Yume Nikki (Japan).wsc" size="4194304" crc="44453234" md5="209a77802e1c1a5d73c0dfc9dc726f7d" sha1="f7c8f8b6b6d036df8fc4bde72fcfac2846dffe35" status="verified"/> + </game> + <game name="Judgement Silversword - Rebirth Edition (Japan) (Rev 4321)" id="0044" cloneofid="0045"> + <description>Judgement Silversword - Rebirth Edition (Japan) (Rev 4321)</description> + <rom name="Judgement Silversword - Rebirth Edition (Japan) (Rev 4321).wsc" size="2097152" crc="aa13e9de" md5="282ff1481a55f7483d8defa4c9c1d81b" sha1="1dc66ac8ac21eb651723428657c9b18cb80d9ee0"/> + </game> + <game name="Judgement Silversword - Rebirth Edition (Japan) (Rev 5C21)" id="0045"> + <description>Judgement Silversword - Rebirth Edition (Japan) (Rev 5C21)</description> + <rom name="Judgement Silversword - Rebirth Edition (Japan) (Rev 5C21).wsc" size="2097152" crc="85c4c9a1" md5="b017d367af1ba43171beba3e184d9ee9" sha1="58c691cb31f96eea5689693fd23768d02e8b133f" status="verified"/> + </game> + <game name="Kidou Senshi Gundam - Giren no Yabou - Tokubetsu Hen - Aoki Hoshi no Hasha (Japan)" id="0046"> + <description>Kidou Senshi Gundam - Giren no Yabou - Tokubetsu Hen - Aoki Hoshi no Hasha (Japan)</description> + <rom name="Kidou Senshi Gundam - Giren no Yabou - Tokubetsu Hen - Aoki Hoshi no Hasha (Japan).wsc" size="4194304" crc="d4061551" md5="399e48a3347c378554de65848f1f496c" sha1="20b671bc14a8ab6373deecc641479d09658ac21f" status="verified"/> + </game> + <game name="Kidou Senshi Gundam Seed (Japan)" id="0047"> + <description>Kidou Senshi Gundam Seed (Japan)</description> + <rom name="Kidou Senshi Gundam Seed (Japan).wsc" size="4194304" crc="bce15137" md5="8e7aabf85435384bd5e80a1eb6e6409a" sha1="e933ff8eace56a462019ae4654b0bab1b21b1d6c" status="verified"/> + </game> + <game name="Kidou Senshi Gundam Vol. 1 - Side 7 (Japan)" id="0048"> + <description>Kidou Senshi Gundam Vol. 1 - Side 7 (Japan)</description> + <rom name="Kidou Senshi Gundam Vol. 1 - Side 7 (Japan).wsc" size="4194304" crc="08c0247b" md5="3f81d86b97a81ed8fb2fd90a20b94c7a" sha1="29e72e7f96f145a0ff56e447f577310df2ec463b" status="verified"/> + </game> + <game name="Kidou Senshi Gundam Vol. 2 - Jaburo (Japan)" id="0049"> + <description>Kidou Senshi Gundam Vol. 2 - Jaburo (Japan)</description> + <rom name="Kidou Senshi Gundam Vol. 2 - Jaburo (Japan).wsc" size="8388608" crc="39a1391a" md5="95b2632395ce85fc5f0cdb762e665136" sha1="df1a794f7e3992b1e1e9de14141b607746202202" status="verified"/> + </game> + <game name="Kidou Senshi Gundam Vol. 3 - A Baoa Qu (Japan)" id="0050"> + <description>Kidou Senshi Gundam Vol. 3 - A Baoa Qu (Japan)</description> + <rom name="Kidou Senshi Gundam Vol. 3 - A Baoa Qu (Japan).wsc" size="8388608" crc="a9f5bf54" md5="fc3bf32e77a2b1f6b749242e89f35e9a" sha1="35443e2ef8a20a0ad82da1274b2768c16239dd46" status="verified"/> + </game> + <game name="Kinnikuman II-Sei - Choujin Seisenshi (Japan)" id="0051"> + <description>Kinnikuman II-Sei - Choujin Seisenshi (Japan)</description> + <rom name="Kinnikuman II-Sei - Choujin Seisenshi (Japan).wsc" size="4194304" crc="6142fd9d" md5="c69232823a6a14ad7bf6dd539c435ba3" sha1="efcf8f92357ffc6f6ec0e4aa960cd97a5070836e"/> + </game> + <game name="Kinnikuman II-Sei - Dream Tag Match (Japan)" id="0052"> + <description>Kinnikuman II-Sei - Dream Tag Match (Japan)</description> + <rom name="Kinnikuman II-Sei - Dream Tag Match (Japan).wsc" size="2097152" crc="462f9275" md5="3d41e27fb5cc7eee9187ef275acb86b9" sha1="81dd3124cce8a1aafd423bfe0814187fb7c646cb" sha256="83c5f23f014d7b94f23169940c589b5a9749f4a4d3168114e615522c4446721e" status="verified"/> + </game> + <game name="Kurupara! (Japan) (Rev 1)" id="0053"> + <description>Kurupara! (Japan) (Rev 1)</description> + <rom name="Kurupara! (Japan) (Rev 1).wsc" size="2097152" crc="274719f5" md5="9450a7cf7d4adea3aa9a97529bcd5b4b" sha1="9942d1b7d1c00126b9891e560e6a3e264f8fdc2e"/> + </game> + <game name="Last Alive (Japan)" id="0054"> + <description>Last Alive (Japan)</description> + <rom name="Last Alive (Japan).wsc" size="4194304" crc="da4479bf" md5="5ee55daa90d63f97a01a569ef5023431" sha1="b019f41207e396d9fe3509dccdbe1cc6e7ac46bb"/> + </game> + <game name="Makai Toushi Sa-Ga (Japan)" id="0055"> + <description>Makai Toushi Sa-Ga (Japan)</description> + <rom name="Makai Toushi Sa-Ga (Japan).wsc" size="4194304" crc="1b6f5f30" md5="957137e7d5249c02fecff063e0c86e87" sha1="6b7a9b810c932974cbda4de7178cf0ea5a90e628"/> + </game> + <game name="mama Mitte (Japan) (Program)" id="0110" cloneofid="0118"> + <description>mama Mitte (Japan) (Program)</description> + <rom name="mama Mitte (Japan) (Program).wsc" size="1048576" crc="f366172e" md5="992fe1e67e917977fcb13afa54d9ff9b" sha1="196190b24297008ab4e48b418ff29b2f8d4bc610"/> + </game> + <game name="mama Mitte (Japan) (Rev D) (Program)" id="0118"> + <description>mama Mitte (Japan) (Rev D) (Program)</description> + <rom name="mama Mitte (Japan) (Rev D) (Program).wsc" size="1048576" crc="867a8a3f" md5="c56c0d1c5f1d5f032d93554eb31d134a" sha1="b901a571d9e6c988245594588d875d696bc76594" sha256="462ee43b22bd922835894197718aca83b6963e681410312306da79108dbc10e5"/> + </game> + <game name="Meitantei Conan - Yuugure no Oujo (Japan)" id="0056"> + <description>Meitantei Conan - Yuugure no Oujo (Japan)</description> + <rom name="Meitantei Conan - Yuugure no Oujo (Japan).wsc" size="4194304" crc="9f6e3f8d" md5="6ec4fe6789acab4347355fcb53f10146" sha1="36d8bc2ce7920d940943358d48f056f81055ab34" status="verified"/> + </game> + <game name="Memories Off - Festa (Japan)" id="0057"> + <description>Memories Off - Festa (Japan)</description> + <rom name="Memories Off - Festa (Japan).wsc" size="2097152" crc="8e123373" md5="a23a6c63016540a3e6e1ed6f7eb5e5cc" sha1="f47b4ab9197999bbec351750601baa20fbbd7177"/> + </game> + <game name="Mikeneko Holmes - Ghost Panic (Japan)" id="0058"> + <description>Mikeneko Holmes - Ghost Panic (Japan)</description> + <rom name="Mikeneko Holmes - Ghost Panic (Japan).wsc" size="4194304" crc="d75effc2" md5="861083eb47c62024cf3c99141c83a857" sha1="2358701531e8a38419859cd70bf2fbbd967b6745"/> + </game> + <game name="Mr. Driller (Japan)" id="0059"> + <description>Mr. Driller (Japan)</description> + <rom name="Mr. Driller (Japan).wsc" size="2097152" crc="5555d95c" md5="9d600bfe28196609fbe4fb5b89486cbc" sha1="209232f1e91c05140529d466c0ef6b7ad3386de1"/> + </game> + <game name="Namco Super Wars (Japan)" id="0060"> + <description>Namco Super Wars (Japan)</description> + <rom name="Namco Super Wars (Japan).wsc" size="2097152" crc="8ce4652f" md5="4180034fe25dbc97ddd0d7e3adf83e3b" sha1="c48569fd0a46ab7b7ceafeb5698be90420cd4fbe" status="verified"/> + </game> + <game name="Naruto - Konoha Ninpouchou (Japan)" id="0061"> + <description>Naruto - Konoha Ninpouchou (Japan)</description> + <rom name="Naruto - Konoha Ninpouchou (Japan).wsc" size="4194304" crc="71556e6a" md5="5f742027ef79b71b0007ff5654e9565f" sha1="dbaa50fd56e69e72fdfe49362ef5fe4437d66667" status="verified"/> + </game> + <game name="NAVI GET 400 Million (Japan) (Version 1.0) (Program)" id="0119" cloneofid="0112"> + <description>NAVI GET 400 Million (Japan) (Version 1.0) (Program)</description> + <rom name="NAVI GET 400 Million (Japan) (Version 1.0) (Program).wsc" size="1048576" crc="f79be3b5" md5="4278fd901c463102b2b683cffe40b1f6" sha1="b01a9572351ac8f36a578ea5486b1ae71c5d21a7"/> + </game> + <game name="NAVI GET 400 Million (Japan) (Version 3.0) (Program)" id="0112"> + <description>NAVI GET 400 Million (Japan) (Version 3.0) (Program)</description> + <rom name="NAVI GET 400 Million (Japan) (Version 3.0) (Program).wsc" size="1048576" crc="4c6cbdb2" md5="9dce5e7af6841901b902f701ab6f861a" sha1="4253d5151a925c7ad766f3dd19497150d578940b"/> + </game> + <game name="NAVI GET 400 Million (Japan) (Version 2.1) (Program)" id="0113" cloneofid="0112"> + <description>NAVI GET 400 Million (Japan) (Version 2.1) (Program)</description> + <rom name="NAVI GET 400 Million (Japan) (Version 2.1) (Program).wsc" size="1048576" crc="0a072698" md5="71bda13f8ab40f74c67b358528f08742" sha1="bc571f5cace41b17ddb5646d67329021be472aee"/> + </game> + <game name="NAVI GET 400 Million (Japan) (Version 9) (Program)" id="0120" cloneofid="0112"> + <description>NAVI GET 400 Million (Japan) (Version 9) (Program)</description> + <rom name="NAVI GET 400 Million (Japan) (Version 9) (Program).wsc" size="1048576" crc="83512340" md5="269f61e701aec1720ecc205437f6912d" sha1="863260de4e0626ee7f4055ee7d9ce95824d635f2"/> + </game> + <game name="Pocket no Naka no Doraemon (Japan)" id="0062"> + <description>Pocket no Naka no Doraemon (Japan)</description> + <rom name="Pocket no Naka no Doraemon (Japan).wsc" size="4194304" crc="2b61bb2b" md5="77e8335f51cd8f5baa2117bbf2b25307" sha1="57338999b949589c36ce116a30f433e9618685e4"/> + </game> + <game name="Raku Jongg (Japan)" id="0063"> + <description>Raku Jongg (Japan)</description> + <rom name="Raku Jongg (Japan).wsc" size="1048576" crc="fe4ff701" md5="a461ad467a1bf5ba55fa1874017f621b" sha1="977d5830e45c78b9020e9d06a63a9ad6bc623745" status="verified"/> + </game> + <game name="Rhyme Rider Kerorican (Japan)" id="0064"> + <description>Rhyme Rider Kerorican (Japan)</description> + <rom name="Rhyme Rider Kerorican (Japan).wsc" size="4194304" crc="60706555" md5="04237a449794b5a7a8e4a3572707befc" sha1="5973306a864c3804ee10b209e45067807d39a4de"/> + </game> + <game name="Riviera - Yakusoku no Chi Riviera (Japan)" id="0065"> + <description>Riviera - Yakusoku no Chi Riviera (Japan)</description> + <rom name="Riviera - Yakusoku no Chi Riviera (Japan).wsc" size="8388608" crc="2460b45a" md5="3e62a6b6af656fcac225cd02446acb9d" sha1="a8f8d3efc9b2d5741081e05f517d746ee5437f87"/> + </game> + <game name="Rockman EXE - N1 Battle (Japan) (Rev 1)" id="0066"> + <description>Rockman EXE - N1 Battle (Japan) (Rev 1)</description> + <rom name="Rockman EXE - N1 Battle (Japan) (Rev 1).wsc" size="4194304" crc="1f10ca75" md5="d902afdadf17b452621c50a1ffda2fa9" sha1="9b4786adca7b83fe66a9d4b9fd4ffaf32abe7656"/> + </game> + <game name="Rockman EXE WS (Japan)" id="0067"> + <description>Rockman EXE WS (Japan)</description> + <rom name="Rockman EXE WS (Japan).wsc" size="4194304" crc="658c4b98" md5="a66390da2c2defcf092eb107edaf4fa0" sha1="b4a3ff3b72639f27d1a6f449b0335074aeb9e603"/> + </game> + <game name="Romancing Sa-Ga (Japan)" id="0068"> + <description>Romancing Sa-Ga (Japan)</description> + <rom name="Romancing Sa-Ga (Japan).wsc" size="4194304" crc="9c98d97d" md5="a4862ef07e13231ae429a98ef667a74a" sha1="06fcc9aad3ae478db6eed27621af4f56a6488a67" status="verified"/> + </game> + <game name="RUN=DIM - Return to Earth (Japan)" id="0069"> + <description>RUN=DIM - Return to Earth (Japan)</description> + <rom name="RUN=DIM - Return to Earth (Japan).wsc" size="2097152" crc="15c4552e" md5="5898c0dfee65ff9b47ce6ec1be2014d5" sha1="3a41a3b8fc126da07e2a82c21056a45c15efbc98" status="verified"/> + </game> + <game name="Saint Seiya - Ougon Densetsu Hen - Perfect Edition (Japan)" id="0070"> + <description>Saint Seiya - Ougon Densetsu Hen - Perfect Edition (Japan)</description> + <rom name="Saint Seiya - Ougon Densetsu Hen - Perfect Edition (Japan).wsc" size="2097152" crc="6e8a792d" md5="fd7f1859cb0ee0b63ccb7f36e9a3351d" sha1="8542649963efe0976015759382c180b7c056be9a"/> + </game> + <game name="SD Gundam - Operation U.C. (Japan)" id="0071"> + <description>SD Gundam - Operation U.C. (Japan)</description> + <rom name="SD Gundam - Operation U.C. (Japan).wsc" size="2097152" crc="f0acda5c" md5="12c3cca0ef52343509dda1c1fb4c1b65" sha1="152c4d63b1b17f2c717a43efc75d718b614f9ddc" status="verified"/> + </game> + <game name="SD Gundam Eiyuu Den - Kishi Densetsu (Japan)" id="0072"> + <description>SD Gundam Eiyuu Den - Kishi Densetsu (Japan)</description> + <rom name="SD Gundam Eiyuu Den - Kishi Densetsu (Japan).wsc" size="4194304" crc="c60e5162" md5="3944c5d21434e5836f414b319af96331" sha1="ebd4b37ade6df717f7b637747a4d3c45a6cca037"/> + </game> + <game name="SD Gundam Eiyuu Den - Musha Densetsu (Japan)" id="0073"> + <description>SD Gundam Eiyuu Den - Musha Densetsu (Japan)</description> + <rom name="SD Gundam Eiyuu Den - Musha Densetsu (Japan).wsc" size="4194304" crc="18ecffb8" md5="18267bcb9d31ffb6711f5464f6ab8077" sha1="d8097e25431f0ad5183b2479ee0837599677a300"/> + </game> + <game name="SD Gundam G Generation - Gather Beat 2 (Japan)" id="0074"> + <description>SD Gundam G Generation - Gather Beat 2 (Japan)</description> + <rom name="SD Gundam G Generation - Gather Beat 2 (Japan).wsc" size="8388608" crc="4d21a347" md5="6c1949e0201437ed16d9182956b67b0e" sha1="016ff46509cbfe57a7440a1755d3a41ef49c048f"/> + </game> + <game name="SD Gundam G Generation - Mono-Eye Gundams (Japan)" id="0075" cloneofid="0107"> + <category>Games</category> + <description>SD Gundam G Generation - Mono-Eye Gundams (Japan)</description> + <rom name="SD Gundam G Generation - Mono-Eye Gundams (Japan).wsc" size="8388608" crc="6aca1f04" md5="c492c6406967e5533022e490b7584da9" sha1="91e087056207fce21e782e25e383c203bc046897"/> + </game> + <game name="SD Gundam G Generation - Mono-Eye Gundams (Japan) (Rev 2)" id="0107"> + <category>Games</category> + <description>SD Gundam G Generation - Mono-Eye Gundams (Japan) (Rev 2)</description> + <rom name="SD Gundam G Generation - Mono-Eye Gundams (Japan) (Rev 2).wsc" size="8388608" crc="a3ecc9ac" md5="c1cb619ec3a596366a324da1f8957985" sha1="1f7c28d9d575b260d973f8526ecadda834032149" sha256="e0ec49d6586787bf11c985787a921b69956770657e71461ffab00f217642dd98"/> + </game> + <game name="Senkaiden Ni - TV Animation Senkaiden Houshin Engi Yori (Japan)" id="0076"> + <description>Senkaiden Ni - TV Animation Senkaiden Houshin Engi Yori (Japan)</description> + <rom name="Senkaiden Ni - TV Animation Senkaiden Houshin Engi Yori (Japan).wsc" size="4194304" crc="9f35d00f" md5="29badb7011c6d4d7b2047249f24fafb9" sha1="df9e831842072d9af613effbee7162229849de58"/> + </game> + <game name="Shaman King - Asu e no Ishi (Japan)" id="0077" cloneofid="0078"> + <description>Shaman King - Asu e no Ishi (Japan)</description> + <rom name="Shaman King - Asu e no Ishi (Japan).wsc" size="4194304" crc="6c029674" md5="ed02c631f0915b7ce37c9267e13a2271" sha1="1e735d1e83a7bfa06c5c717c7e8a386d55a8e3f0"/> + </game> + <game name="Shaman King - Asu e no Ishi (Japan) (Rev 1)" id="0078"> + <description>Shaman King - Asu e no Ishi (Japan) (Rev 1)</description> + <rom name="Shaman King - Asu e no Ishi (Japan) (Rev 1).wsc" size="4194304" crc="34908cb4" md5="0383d7778eac82483efb4e9d276581c6" sha1="473195666a633573c777d3be98d7e8f46569c84b"/> + </game> + <game name="Sorobang (Japan) (Rev 1)" id="0079"> + <description>Sorobang (Japan) (Rev 1)</description> + <rom name="Sorobang (Japan) (Rev 1).wsc" size="1048576" crc="0e467d97" md5="8756f7653d5d7dd201c1048078ff1cd0" sha1="983582fe8d18839df30b6d29fb75780a9e32f4ec"/> + </game> + <game name="Star Hearts - Hoshi to Daichi no Shisha (Japan)" id="0081"> + <description>Star Hearts - Hoshi to Daichi no Shisha (Japan)</description> + <rom name="Star Hearts - Hoshi to Daichi no Shisha (Japan).wsc" size="4194304" crc="138d1018" md5="41a4a0ab39c036fb4ad741f19027e443" sha1="2b2c2a0566646156bcdde2a00b728c5b8218aa23"/> + </game> + <game name="Star Hearts - Hoshi to Daichi no Shisha - Taikenban (Japan) (Not For Sale)" id="0080" cloneofid="0081"> + <description>Star Hearts - Hoshi to Daichi no Shisha - Taikenban (Japan) (Not For Sale)</description> + <rom name="Star Hearts - Hoshi to Daichi no Shisha - Taikenban (Japan) (Not For Sale).wsc" size="4194304" crc="9874e9a2" md5="624cc1e06ade72315784b82f30f7f83f" sha1="44940ae0140df1bd91d742a166c459df1b6c2339"/> + </game> + <game name="Super Robot Taisen Compact 3 (Japan) (Rev 5)" id="0082" cloneofid="0083"> + <description>Super Robot Taisen Compact 3 (Japan) (Rev 5)</description> + <rom name="Super Robot Taisen Compact 3 (Japan) (Rev 5).wsc" size="8388608" crc="6918c824" md5="38be1f76e69fe58f9268c032c7f22fbb" sha1="b579f204be604ebef4e8238e5883152b70399c4d"/> + </game> + <game name="Super Robot Taisen Compact 3 (Japan) (Rev 6)" id="0083"> + <description>Super Robot Taisen Compact 3 (Japan) (Rev 6)</description> + <rom name="Super Robot Taisen Compact 3 (Japan) (Rev 6).wsc" size="8388608" crc="188ca644" md5="d43e85a61b91423de8a91f78e62936fe" sha1="dd6fe0f278cdec2670d3be8552dbb0cf6a3a2841"/> + </game> + <game name="Super Robot Taisen Compact for WonderSwan Color (Japan)" id="0084"> + <description>Super Robot Taisen Compact for WonderSwan Color (Japan)</description> + <rom name="Super Robot Taisen Compact for WonderSwan Color (Japan).wsc" size="4194304" crc="16e0d929" md5="59c20a67961e60791360d8d29d937ef0" sha1="bf212cecbbc51ee32ee2655a072f55e7bf70b9ec" status="verified"/> + </game> + <game name="Terrors 2 (Japan)" id="0085"> + <description>Terrors 2 (Japan)</description> + <rom name="Terrors 2 (Japan).wsc" size="4194304" crc="9bd8f08c" md5="a8f950c87c0237ead29b23c04368de44" sha1="9532113e14b03c95f034c015168e21273d42eff1" status="verified"/> + </game> + <game name="Tetris (Japan)" id="0086"> + <description>Tetris (Japan)</description> + <rom name="Tetris (Japan).wsc" size="1048576" crc="7b0caea9" md5="b7e66090d059f77636161fa4e21f3e89" sha1="1a86403d7896d60fcb7a4c09367f5a976c7ea5a5" status="verified"/> + </game> + <game name="Tonpuusou (Japan)" id="0087"> + <description>Tonpuusou (Japan)</description> + <rom name="Tonpuusou (Japan).wsc" size="1048576" crc="47659b2c" md5="ccab821fe0db8dc9c468d2d3479b530a" sha1="fb53c28bd48174d3829467f1ab81d3f87f9a7f5b"/> + </game> + <game name="Uchuu Senkan Yamato (Japan)" id="0088"> + <description>Uchuu Senkan Yamato (Japan)</description> + <rom name="Uchuu Senkan Yamato (Japan).wsc" size="4194304" crc="5793bdda" md5="9f612c697b72b2d5e87776edd95de077" sha1="dd1878279a6667fb66dd1ac44a2cdb9a5acbe415"/> + </game> + <game name="Ultraman - Hikari no Kuni no Shisha (Japan)" id="0089"> + <description>Ultraman - Hikari no Kuni no Shisha (Japan)</description> + <rom name="Ultraman - Hikari no Kuni no Shisha (Japan).wsc" size="2097152" crc="de2208ab" md5="50afa9b3099b822b0f01e32fbecff9bf" sha1="bd107befe5ce6c5508d2da8be351b9984166ae1d"/> + </game> + <game name="Wild Card (Japan)" id="0090"> + <description>Wild Card (Japan)</description> + <rom name="Wild Card (Japan).wsc" size="2097152" crc="d9401f0a" md5="3da84c8d458cb9ef07b923dadb209990" sha1="ea878a485a20abd5251065fd66e82d9d8b8a669d" status="verified"/> + </game> + <game name="With You - Mitsumete Itai (Japan)" id="0091"> + <description>With You - Mitsumete Itai (Japan)</description> + <rom name="With You - Mitsumete Itai (Japan).wsc" size="4194304" crc="e14e9d36" md5="b810c7e4d13452444633b6a6a123664b" sha1="6a4f4a03c367ccf00aa7462191c929a2736eb44b"/> + </game> + <game name="Wizardry Scenario 1 - Proving Grounds of the Mad Overlord (Japan)" id="0092"> + <description>Wizardry Scenario 1 - Proving Grounds of the Mad Overlord (Japan)</description> + <rom name="Wizardry Scenario 1 - Proving Grounds of the Mad Overlord (Japan).wsc" size="2097152" crc="15e55706" md5="f0ba64cd7b88eab7add0f7af02080072" sha1="c1ad383d337dba8a63295cfb8c7ca8470c893c67"/> + </game> + <game name="Wonder Classic (Japan)" id="0093"> + <description>Wonder Classic (Japan)</description> + <rom name="Wonder Classic (Japan).wsc" size="4194304" crc="12f10b27" md5="50a6fd0e2a65487b5ea2672d2b93a862" sha1="55b54944efd6e277fa7140925ed2457a8cfb40b8"/> + </game> + <game name="X - Card of Fate (Japan)" id="0094"> + <description>X - Card of Fate (Japan)</description> + <rom name="X - Card of Fate (Japan).wsc" size="4194304" crc="66b617d5" md5="26c76cfcb14c5c8799dbe4367184d4a5" sha1="c1ab4e24f261615ca59f937b866fcf7047b67796"/> + </game> + <game name="XI Little (Japan)" id="0095"> + <description>XI Little (Japan)</description> + <rom name="XI Little (Japan).wsc" size="2097152" crc="25e2ba75" md5="3c5e5826998dcf3ee18b9396c860df6f" sha1="97c29917a78918a6905fd61a1466971cfd2a33c6"/> + </game> +</datafile> diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan Color.dat.bytes.meta b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan Color.dat.bytes.meta new file mode 100644 index 00000000..048f4791 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan Color.dat.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: af2f9150b8258834096b238494c8da95 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan.dat.bytes b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan.dat.bytes new file mode 100644 index 00000000..1fe7764d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan.dat.bytes @@ -0,0 +1,561 @@ +<?xml version="1.0"?> +<datafile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://datomatic.no-intro.org/stuff https://datomatic.no-intro.org/stuff/schema_nointro_datfile_v3.xsd"> + <header> + <id>50</id> + <name>Bandai - WonderSwan</name> + <description>Bandai - WonderSwan</description> + <version>20230717-110112</version> + <author>C. V. Reynolds, Gefflon, gigadeath, Hiccup, kazumi213, MeguCocoa, omonim2007, PPLToast, RetroUprising, sCZther, SonGoku, xuom2</author> + <homepage>No-Intro</homepage> + <url>https://www.no-intro.org</url> + <clrmamepro forcenodump="required"/> + </header> + <game name="[BIOS] WonderSwan Boot ROM (Japan) (En)" id="0118"> + <description>[BIOS] WonderSwan Boot ROM (Japan) (En)</description> + <rom name="[BIOS] WonderSwan Boot ROM (Japan) (En).ws" size="4096" crc="7f35f890" md5="54b915694731cc22e07d3fb8a00ee2db" sha1="4015bcacea76bb0b5bbdb13c5358f7e1abb986a1" sha256="bf4480dbea1c47c8b54ce7be9382bc1006148f431fbe4277e136351fa74f635e"/> + </game> + <game name="Anchorz Field (Japan)" id="0001"> + <description>Anchorz Field (Japan)</description> + <rom name="Anchorz Field (Japan).ws" size="1048576" crc="425eb893" md5="7528a5de5924896d152920b1eaf8fd5d" sha1="06447c248afce04c4f4a1c3b5f7a4ab6f383c94b"/> + </game> + <game name="Armored Unit (Japan)" id="0002"> + <description>Armored Unit (Japan)</description> + <rom name="Armored Unit (Japan).ws" size="1048576" crc="04366d92" md5="9587c46e7a2d4d8c2e5ddc971b7325fd" sha1="1578669c1fcf59ab5f5e603c6a65121d7ae209b1"/> + </game> + <game name="Bakusou Dekotora Densetsu for WonderSwan (Japan)" id="0003"> + <description>Bakusou Dekotora Densetsu for WonderSwan (Japan)</description> + <rom name="Bakusou Dekotora Densetsu for WonderSwan (Japan).ws" size="2097152" crc="392dd813" md5="c53a5d8c189a23b16c444c4e8ef581af" sha1="821bb81917445b63ac663c706ab4ce27de28543f"/> + </game> + <game name="BANDAI Default Splash Screen (Japan) (Program)" id="0140"> + <description>BANDAI Default Splash Screen (Japan) (Program)</description> + <rom name="BANDAI Default Splash Screen (Japan) (Program).ws" size="16777216" crc="9da44185" md5="133aada0250cf13a3e34966cc0c0ba7c" sha1="930277816a22eeeb68646a135192c6104abbc948" sha256="a218fc09e9c6d62b2661039f47a6c115b81480c8fe3bccb9063abc21cbb42344"/> + </game> + <game name="beatmania for WonderSwan (Japan)" id="0004"> + <description>beatmania for WonderSwan (Japan)</description> + <rom name="beatmania for WonderSwan (Japan).ws" size="16777216" crc="324622c9" md5="b814e71eb1d079466a9535566d605280" sha1="544e76133fa53fc0ae5e00e3465b9cf634f14fd0" status="verified"/> + </game> + <game name="Buffers Evolution (Japan)" id="0005"> + <description>Buffers Evolution (Japan)</description> + <rom name="Buffers Evolution (Japan).ws" size="4194304" crc="b25a0635" md5="9b15b2236cae605f7bc3bea3859fdd36" sha1="35eea568f756bacf533bb9aaad7e3239ba00e411"/> + </game> + <game name="Cardcaptor Sakura - Sakura to Fushigi na Clow Card (Japan)" id="0006"> + <description>Cardcaptor Sakura - Sakura to Fushigi na Clow Card (Japan)</description> + <rom name="Cardcaptor Sakura - Sakura to Fushigi na Clow Card (Japan).ws" size="2097152" crc="7f3a14c0" md5="bb9f130931b2b7d1f646f44d1667ad63" sha1="39e9a897b681b2c326b052827d7c534f22290286" status="verified"/> + </game> + <game name="Chaos Gear - Michibikareshi Mono (Japan)" id="0007"> + <description>Chaos Gear - Michibikareshi Mono (Japan)</description> + <rom name="Chaos Gear - Michibikareshi Mono (Japan).ws" size="2097152" crc="27b3cc18" md5="f647a51827915109d1bc6a05c076eda4" sha1="e212bba4fac51bbfcf440966da0e67b1686dcfc5"/> + </game> + <game name="Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 2)" id="0008" cloneofid="0119"> + <description>Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 2)</description> + <rom name="Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 2).ws" size="2097152" crc="ccaa4853" md5="edbc77ab0d585447d927318a6eb66c9b" sha1="3b62fd2841602f1077270848ab7a3aad58712ee9"/> + </game> + <game name="Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 1)" id="0114" cloneofid="0119"> + <description>Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 1)</description> + <rom name="Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 1).ws" size="2097152" crc="a607a350" md5="6d7d60c65e5a5cc92f83a62c434577b5" sha1="a8c4f423429a8683cfebd05370ea122613349033" status="verified"/> + </game> + <game name="Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 3)" id="0119"> + <description>Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 3)</description> + <rom name="Chocobo no Fushigi na Dungeon for WonderSwan (Japan) (Rev 3).ws" size="2097152" crc="aa53971d" md5="03b416e7326a34c9546e8336f7d50bf2" sha1="f7a65e95a8e97f35ec2419897ad96af1e1d49676"/> + </game> + <game name="Chou Aniki - Otoko no Tamafuda (Japan) (Rev 4)" id="0009"> + <description>Chou Aniki - Otoko no Tamafuda (Japan) (Rev 4)</description> + <rom name="Chou Aniki - Otoko no Tamafuda (Japan) (Rev 4).ws" size="1048576" crc="7fff2520" md5="24fd819c4f4866d7c5c340d0273acbf9" sha1="eb538b82c5516fae8ce38778e41fb118aa5c830f"/> + </game> + <game name="Chou Denki Card Battle - Youfu Makai (Japan) (Rev 3)" id="0010"> + <description>Chou Denki Card Battle - Youfu Makai (Japan) (Rev 3)</description> + <rom name="Chou Denki Card Battle - Youfu Makai (Japan) (Rev 3).ws" size="2097152" crc="56e2c069" md5="5432d188664bc4e5dae0fc859580cda1" sha1="c4436a59fd830ba6af2d63462f71e1ab1cfa3212"/> + </game> + <game name="Clock Tower for WonderSwan (Japan) (Rev 1)" id="0011"> + <description>Clock Tower for WonderSwan (Japan) (Rev 1)</description> + <rom name="Clock Tower for WonderSwan (Japan) (Rev 1).ws" size="4194304" crc="4e8909d1" md5="8f0ba3401662a40e8da5ebcfe7b85e81" sha1="db9b3308336b59aeff7bd173d687953a37739381"/> + </game> + <game name="Crazy Climber (Japan)" id="0012"> + <description>Crazy Climber (Japan)</description> + <rom name="Crazy Climber (Japan).ws" size="1048576" crc="0cb57376" md5="0ed3a08a3a9858f65d1487889645dc55" sha1="a88882426bf435416616191902a26b2b066f2491"/> + </game> + <game name="D's Garage 21 Koubo Game - Tane o Maku Tori (Japan)" id="0013"> + <description>D's Garage 21 Koubo Game - Tane o Maku Tori (Japan)</description> + <rom name="D's Garage 21 Koubo Game - Tane o Maku Tori (Japan).ws" size="1048576" crc="b1caec06" md5="e39e90944a683b9d4a996a53804826f0" sha1="83e190af2e25fbb3e93b1d5835c52fe6f1d279ce" sha256="3d791b4e9b05eb600ba89be687bc49dee171af645c3a046b5f8f695198005daf" status="verified"/> + </game> + <game name="Densha de Go! (Japan) (Rev 1)" id="0014"> + <description>Densha de Go! (Japan) (Rev 1)</description> + <rom name="Densha de Go! (Japan) (Rev 1).ws" size="4194304" crc="b62e5dd0" md5="7b2180e38b4720ce711768a73c33c9df" sha1="d3da0ae529c6f78162682141154a95879f288ca7" sha256="4f68c09f93cce8ef4aa600394f22f8a14825e0fdbad4f4a13d799fdd08a6067b" status="verified"/> + </game> + <game name="Densha de Go! 2 (Japan)" id="0015"> + <description>Densha de Go! 2 (Japan)</description> + <rom name="Densha de Go! 2 (Japan).ws" size="4194304" crc="af9d8f42" md5="eec79ad5bb634a90b9d020415046e921" sha1="c07f776ac4374b648d1a49efd9d6fcd0db2ac1fa"/> + </game> + <game name="Digimon - Ver. WonderSwan (Hong Kong) (En)" id="0016" cloneofid="0020"> + <description>Digimon - Ver. WonderSwan (Hong Kong) (En)</description> + <rom name="Digimon - Ver. WonderSwan (Hong Kong) (En).ws" size="2097152" crc="94ea6ffc" md5="d5f7fbf06c57aa50f08c14e64d2e02a2" sha1="5cc59ec1687fe83ec5fb048d3dfc37849747df34"/> + </game> + <game name="Digimon Adventure - Anode Tamer (Japan) (Rev 1)" id="0017"> + <description>Digimon Adventure - Anode Tamer (Japan) (Rev 1)</description> + <rom name="Digimon Adventure - Anode Tamer (Japan) (Rev 1).ws" size="2097152" crc="6e9dd148" md5="ba249ee5c5ccb1512e0fb6af200a361a" sha1="9db54826c2887dea07aac774bd15e092596e37af"/> + </game> + <game name="Digimon Adventure - Anode Tamer (Japan)" id="0115" cloneofid="0017"> + <description>Digimon Adventure - Anode Tamer (Japan)</description> + <rom name="Digimon Adventure - Anode Tamer (Japan).ws" size="2097152" crc="fc6946f0" md5="db33df2754fb51ce740006cf9176049f" sha1="c49bd00c95bca49a183d59f85e81815efb1a2fb9" status="verified"/> + </game> + <game name="Digimon Adventure - Cathode Tamer (Japan)" id="0018"> + <description>Digimon Adventure - Cathode Tamer (Japan)</description> + <rom name="Digimon Adventure - Cathode Tamer (Japan).ws" size="2097152" crc="42ad238b" md5="10f50d5b44a7b8b1f308c1bea8263823" sha1="0b54cc1d350ab92c42ce8214784389b994562bf6" status="verified"/> + </game> + <game name="Digimon Adventure 02 - Tag Tamers (Japan) (Rev 1)" id="0019"> + <description>Digimon Adventure 02 - Tag Tamers (Japan) (Rev 1)</description> + <rom name="Digimon Adventure 02 - Tag Tamers (Japan) (Rev 1).ws" size="2097152" crc="6ededaf8" md5="2cb264ba76b88452d7576992f2b90dbf" sha1="44a5502b70ea75926b87377e3f634c8093bc574a" status="verified"/> + </game> + <game name="Digimon Adventure 02 - Tag Tamers (Japan)" id="0123" cloneofid="0019"> + <description>Digimon Adventure 02 - Tag Tamers (Japan)</description> + <rom name="Digimon Adventure 02 - Tag Tamers (Japan).ws" size="2097152" crc="56ce1bc5" md5="0ae28388d68fb56bee38cc96faf37f90" sha1="521754084afc6321ae329421b9d2ab0f0cac8c70" status="verified"/> + </game> + <game name="Digital Monster - Ver. WonderSwan (Japan) (Rev 1)" id="0020"> + <description>Digital Monster - Ver. WonderSwan (Japan) (Rev 1)</description> + <rom name="Digital Monster - Ver. WonderSwan (Japan) (Rev 1).ws" size="2097152" crc="ab59de2e" md5="deb2c37baea996386b2af10bdd0ca3b1" sha1="ecea24db6e65254ab4d6e312de0eb951c7df716f" status="verified"/> + </game> + <game name="Digital Partner (Japan)" id="0021"> + <description>Digital Partner (Japan)</description> + <rom name="Digital Partner (Japan).ws" size="2097152" crc="b5e675ae" md5="768b8f5722f0b07be4e8ac356e90acf2" sha1="c622f6742ca3f0129fc12dce0a1c17d292388ffb" sha256="c98c05e7ed2005b162051a242ed91b68a47b576a44da329492718e168a18ee58" status="verified"/> + </game> + <game name="Dokodemo Hamster (Japan)" id="0022"> + <description>Dokodemo Hamster (Japan)</description> + <rom name="Dokodemo Hamster (Japan).ws" size="1048576" crc="89e7d950" md5="da17db6b7f491510e4b284996ff0eebf" sha1="3d5a1ed77e721908eb1145aaedef17c0ee6355ae"/> + </game> + <game name="Engacho! for WonderSwan (Japan)" id="0023"> + <description>Engacho! for WonderSwan (Japan)</description> + <rom name="Engacho! for WonderSwan (Japan).ws" size="1048576" crc="4e467626" md5="3584e4a63a6ae9fa546722a349f88573" sha1="f79451034b6d844f0e10c825306bbc26f26a5466"/> + </game> + <game name="Fever - Sankyo Koushiki Pachinko Simulation for WonderSwan (Japan)" id="0024"> + <description>Fever - Sankyo Koushiki Pachinko Simulation for WonderSwan (Japan)</description> + <rom name="Fever - Sankyo Koushiki Pachinko Simulation for WonderSwan (Japan).ws" size="2097152" crc="8922dd0b" md5="ae2e0e9da1f25119cb4ad24a821446ba" sha1="f26b0215c49e04cb8ef6f031b627dff6a49d2015"/> + </game> + <game name="Final Lap 2000 (Japan)" id="0025"> + <description>Final Lap 2000 (Japan)</description> + <rom name="Final Lap 2000 (Japan).ws" size="1048576" crc="ce2f1a1d" md5="a466797b353d610f43a0f030cec721c1" sha1="cfcb14be6d2f1dbffdfcefb8c8d83b4f39bc102b"/> + </game> + <game name="Fire Pro Wrestling for WonderSwan (Japan) (Rev 5)" id="0026"> + <description>Fire Pro Wrestling for WonderSwan (Japan) (Rev 5)</description> + <rom name="Fire Pro Wrestling for WonderSwan (Japan) (Rev 5).ws" size="4194304" crc="f246a68e" md5="dd9be38cd66ffd3b526d3388c6b99b8e" sha1="fbb745b016cc710ff6f82ec3091a181415d8de61"/> + </game> + <game name="Fishing Freaks - Bass Rise for WonderSwan (Japan)" id="0027"> + <description>Fishing Freaks - Bass Rise for WonderSwan (Japan)</description> + <rom name="Fishing Freaks - Bass Rise for WonderSwan (Japan).ws" size="1048576" crc="a1fb16fc" md5="eb3f161ea3db4ebd759c9b1346032d4f" sha1="f8f077da30f227f3793e97c7f1d656559f08b9d4"/> + </game> + <game name="From TV Animation One Piece - Mezase Kaizoku Ou! (Japan)" id="0028"> + <description>From TV Animation One Piece - Mezase Kaizoku Ou! (Japan)</description> + <rom name="From TV Animation One Piece - Mezase Kaizoku Ou! (Japan).ws" size="1048576" crc="f2e362b8" md5="fe30867e698c071f6be94cce24b095ee" sha1="99c831c27c478064e3d3fa8f9f089cc28f0e946f" status="verified"/> + </game> + <game name="Ganso Jajamaru-kun (Japan)" id="0029"> + <description>Ganso Jajamaru-kun (Japan)</description> + <rom name="Ganso Jajamaru-kun (Japan).ws" size="524288" crc="a193458c" md5="6f09fc64352ba0051e724c4ae58402f4" sha1="cbf6455e89b20a000b6121e5c485be1a20d1f726"/> + </game> + <game name="Glocal Hexcite (Japan)" id="0030"> + <description>Glocal Hexcite (Japan)</description> + <rom name="Glocal Hexcite (Japan).ws" size="1048576" crc="4aed3911" md5="21744e51668ab1fca63e5b2a204c194d" sha1="837528b9d95e309f7b1e8c4ffd46ca3e2b68a5a3"/> + </game> + <game name="Gomoku Narabe & Reversi - Touryuumon (Japan)" id="0031"> + <description>Gomoku Narabe & Reversi - Touryuumon (Japan)</description> + <rom name="Gomoku Narabe & Reversi - Touryuumon (Japan).ws" size="1048576" crc="a9f11523" md5="3ab76903152993aeee1118818bfad8f7" sha1="0931ddec058eefb32a68a1752716ed2ba68b78bf"/> + </game> + <game name="Goraku Ou Tango! (Japan) (Rev 2)" id="0032"> + <description>Goraku Ou Tango! (Japan) (Rev 2)</description> + <rom name="Goraku Ou Tango! (Japan) (Rev 2).ws" size="1048576" crc="00137e86" md5="1adacf9cb5aa3eb5839a9e2c94933348" sha1="af3fe9da3f5ee0f5a7b06b0440223db88fcb3bf2" status="verified"/> + </game> + <game name="GunPey (Japan)" id="0033"> + <description>GunPey (Japan)</description> + <rom name="GunPey (Japan).ws" size="1048576" crc="a1656bbb" md5="816c81b156146be62a45edd7d7d49fc6" sha1="ee4b777f029bac9561e60c19407d08360e733822" status="verified"/> + </game> + <game name="Hanafuda Shiyouyo (Japan)" id="0034"> + <description>Hanafuda Shiyouyo (Japan)</description> + <rom name="Hanafuda Shiyouyo (Japan).ws" size="1048576" crc="4b22270d" md5="2e26e037cb01f70a6454a61c2955e8b1" sha1="1eda3327eb9b5a5844a95ac789f71b669f4cb6a7"/> + </game> + <game name="Harobots (Japan)" id="0035" cloneofid="0122"> + <description>Harobots (Japan)</description> + <rom name="Harobots (Japan).ws" size="2097152" crc="aa525c04" md5="0eb951b486fe25f37371835be81eed75" sha1="1f42c5694a798de8ff3c68f63dfc7395be1669a5"/> + </game> + <game name="Harobots (Japan) (Rev 1)" id="0122"> + <description>Harobots (Japan) (Rev 1)</description> + <rom name="Harobots (Japan) (Rev 1).ws" size="2097152" crc="f75ce82c" md5="b9020cfae65fe791bd52723cbff31707" sha1="ecbaf210f92c75a55df9dff4777ea364596ae0c9"/> + </game> + <game name="Hunter X Hunter - Ishi o Tsugu Mono (Japan) (Rev 2)" id="0036"> + <description>Hunter X Hunter - Ishi o Tsugu Mono (Japan) (Rev 2)</description> + <rom name="Hunter X Hunter - Ishi o Tsugu Mono (Japan) (Rev 2).ws" size="4194304" crc="70aa800e" md5="fd2165de8c6bb617166f6bb34447e70d" sha1="57b4278fc5812f52413ca65f45225922d4f2ec3d"/> + </game> + <game name="Hunter X Hunter - Ishi o Tsugu Mono (Japan) (Rev 1)" id="0121" cloneofid="0036"> + <description>Hunter X Hunter - Ishi o Tsugu Mono (Japan) (Rev 1)</description> + <rom name="Hunter X Hunter - Ishi o Tsugu Mono (Japan) (Rev 1).ws" size="4194304" crc="bd6fc68a" md5="cc9d1519e1aba4a0f48f2052af031671" sha1="43d985b31848e1ae58d07231da80ee7aa8d3f686" status="verified"/> + </game> + <game name="Kakutou Ryouri Densetsu Bistro Recipe - Wonder Battle Hen (Japan)" id="0038"> + <description>Kakutou Ryouri Densetsu Bistro Recipe - Wonder Battle Hen (Japan)</description> + <rom name="Kakutou Ryouri Densetsu Bistro Recipe - Wonder Battle Hen (Japan).ws" size="1048576" crc="4d103236" md5="8be5abfaef7ad77d14f92f10b2460098" sha1="b40fbc7b72921c9ac31330831c0f77e4133ec7d6"/> + </game> + <game name="Kaze no Klonoa - Moonlight Museum (Japan)" id="0039"> + <description>Kaze no Klonoa - Moonlight Museum (Japan)</description> + <rom name="Kaze no Klonoa - Moonlight Museum (Japan).ws" size="1048576" crc="80c6ef12" md5="5e907dd88b3cfb2855a18fb1bf689860" sha1="207a3ceb9a09eabca6e455deeb7035e7e04c9795" status="verified"/> + </game> + <game name="Keiba Yosou Shien Soft - Yosou Shinkaron (Japan)" id="0040"> + <description>Keiba Yosou Shien Soft - Yosou Shinkaron (Japan)</description> + <rom name="Keiba Yosou Shien Soft - Yosou Shinkaron (Japan).ws" size="1048576" crc="517f962e" md5="840be356bd48676bd4e39f1e3d54c3b3" sha1="12d26522665cb8ecb3178bc242d984deae438e5c"/> + </game> + <game name="Kiss Yori... - Seaside Serenade (Japan) (Rev 2)" id="0041"> + <description>Kiss Yori... - Seaside Serenade (Japan) (Rev 2)</description> + <rom name="Kiss Yori... - Seaside Serenade (Japan) (Rev 2).ws" size="2097152" crc="3b4c60c6" md5="611d42816a979ece34dd8221d3023c9c" sha1="9ef89b6fe68c5a06d34344e8c783ec24114ad959"/> + </game> + <game name="Kosodate Quiz - Dokodemo My Angel (Japan)" id="0042"> + <description>Kosodate Quiz - Dokodemo My Angel (Japan)</description> + <rom name="Kosodate Quiz - Dokodemo My Angel (Japan).ws" size="2097152" crc="4c48624c" md5="a5e1cf7e43e991592890d916369bcf88" sha1="52b154a3e36d01357649a9f7f614139ce6cc46b8" status="verified"/> + </game> + <game name="Kyousouba Ikusei Simulation - Keiba (Japan) (Rev 1)" id="0043"> + <description>Kyousouba Ikusei Simulation - Keiba (Japan) (Rev 1)</description> + <rom name="Kyousouba Ikusei Simulation - Keiba (Japan) (Rev 1).ws" size="1048576" crc="ecfbcb1d" md5="442e0025aeda0ad8df502696aa97c499" sha1="a309a430fbbed6c42f41d8ccaf4aba82e96d6a7b"/> + </game> + <game name="Langrisser Millennium WS - The Last Century (Japan) (Rev 1)" id="0044"> + <description>Langrisser Millennium WS - The Last Century (Japan) (Rev 1)</description> + <rom name="Langrisser Millennium WS - The Last Century (Japan) (Rev 1).ws" size="1048576" crc="9e0854e2" md5="0e4369d3f611377433272b3563325ca2" sha1="9fdf3f5821f2a4488139525fe49e87b23de4571f"/> + </game> + <game name="Last Stand (Japan)" id="0045"> + <description>Last Stand (Japan)</description> + <rom name="Last Stand (Japan).ws" size="2097152" crc="cccaf8a1" md5="cf7ee109aa551fdebaadd5bfbe344fd7" sha1="d524da01f2bfad92c2fa080950229955a3030ef2"/> + </game> + <game name="Lode Runner for WonderSwan (Japan)" id="0046"> + <description>Lode Runner for WonderSwan (Japan)</description> + <rom name="Lode Runner for WonderSwan (Japan).ws" size="1048576" crc="21279e82" md5="c7445937d6fbc462256bd2ebcdbf3c25" sha1="847f51592f181aa68061900700149b86cdba651b"/> + </game> + <game name="Macross - True Love Song (Japan)" id="0047"> + <description>Macross - True Love Song (Japan)</description> + <rom name="Macross - True Love Song (Japan).ws" size="4194304" crc="62d419cd" md5="694042e6f8eaa2423693c0a9bba8aef0" sha1="211e051db3fd4d7ae1ea143e043f87cfbcec5f1c"/> + </game> + <game name="Magical Drop for WonderSwan (Japan)" id="0048"> + <description>Magical Drop for WonderSwan (Japan)</description> + <rom name="Magical Drop for WonderSwan (Japan).ws" size="1048576" crc="637ada93" md5="f98cbebf4a06794aa74636e7a6285ace" sha1="a25944969068ee495254f94c2c48dfffcb66ce8d"/> + </game> + <game name="Mahjong Touryuumon (Japan) (Rev 3)" id="0049"> + <description>Mahjong Touryuumon (Japan) (Rev 3)</description> + <rom name="Mahjong Touryuumon (Japan) (Rev 3).ws" size="1048576" crc="e7e7fd4c" md5="7edd59281ec08fdb2daaf45e58085e7e" sha1="281079b22cb213ee4dda5c304b5b5be028130929" status="verified"/> + </game> + <game name="Mahjong Touryuumon (Japan) (Rev 1)" id="0116" cloneofid="0049"> + <description>Mahjong Touryuumon (Japan) (Rev 1)</description> + <rom name="Mahjong Touryuumon (Japan) (Rev 1).ws" size="1048576" crc="c2ed122e" md5="60ad41d50a0b9dd55b0161b1853b824c" sha1="748ca335d39515a6650352449972684be749052a" status="verified"/> + </game> + <game name="Makaimura for WonderSwan (Japan)" id="0050"> + <description>Makaimura for WonderSwan (Japan)</description> + <rom name="Makaimura for WonderSwan (Japan).ws" size="2097152" crc="00b31fbb" md5="f06beaff2703728baa8dddc0ddeb7094" sha1="5eaeab859e5f647fac354dad285a311387ea126b" status="verified"/> + </game> + <game name="Medarot Perfect Edition - Kabuto Version (Japan)" id="0051"> + <description>Medarot Perfect Edition - Kabuto Version (Japan)</description> + <rom name="Medarot Perfect Edition - Kabuto Version (Japan).ws" size="1048576" crc="12fb8b28" md5="893ac7863337a65c919780b41bc52406" sha1="509e5748e5efdfb56093c78ae886153dd1838215"/> + </game> + <game name="Medarot Perfect Edition - Kuwagata Version (Japan)" id="0052"> + <description>Medarot Perfect Edition - Kuwagata Version (Japan)</description> + <rom name="Medarot Perfect Edition - Kuwagata Version (Japan).ws" size="1048576" crc="2b40745d" md5="d8a29d331e9ba86609c75a4aedf9c269" sha1="315061e4739e947175d6ad7f006498cd61a33f8c"/> + </game> + <game name="Meitantei Conan - Majutsushi no Chousenjou! (Japan)" id="0053"> + <description>Meitantei Conan - Majutsushi no Chousenjou! (Japan)</description> + <rom name="Meitantei Conan - Majutsushi no Chousenjou! (Japan).ws" size="1048576" crc="92fbf7fb" md5="98e88544d8b7df359e37bf2c17dd0641" sha1="8f3f97be31f3bd0e6922ab7795aa6f04bc5cfe2a" status="verified"/> + </game> + <game name="Meitantei Conan - Nishi no Meitantei Saidai no Kiki! (Japan)" id="0054"> + <description>Meitantei Conan - Nishi no Meitantei Saidai no Kiki! (Japan)</description> + <rom name="Meitantei Conan - Nishi no Meitantei Saidai no Kiki! (Japan).ws" size="2097152" crc="e226863b" md5="1990a2c04395b08df6181f6c8be2a953" sha1="e5684789e81f9d739010db575022a12a448b5509"/> + </game> + <game name="Metakomi Theraphy - Nee Kiite! (Japan)" id="0055"> + <description>Metakomi Theraphy - Nee Kiite! (Japan)</description> + <rom name="Metakomi Theraphy - Nee Kiite! (Japan).ws" size="2097152" crc="a3ead689" md5="a9c86af9db3743595186274b65c93f90" sha1="dc94e17a942acfdc1eb0c38d91bf72460a4bb8f9"/> + </game> + <game name="Mingle Magnet (Japan) (En,Ja) (Rev 1)" id="0056"> + <description>Mingle Magnet (Japan) (En,Ja) (Rev 1)</description> + <rom name="Mingle Magnet (Japan) (En,Ja) (Rev 1).ws" size="524288" crc="9baac7bb" md5="555bee0c37a0726d8e8646a290de137f" sha1="c7230ef709f6ceaef9a220541c8cdc05c0cd549f"/> + </game> + <game name="Mobile Suit Gundam MSVS (Japan)" id="0057"> + <description>Mobile Suit Gundam MSVS (Japan)</description> + <rom name="Mobile Suit Gundam MSVS (Japan).ws" size="2097152" crc="53b9fef8" md5="3ad90f3b8fdb3f2f5a7769e42ebc0792" sha1="2688ca67ac31ce3d5c3523b0e11cad55e70fa257" sha256="d82239a439c51ced0fa7243e21d8f834f70340d072ef55a3ebc73f3d38f560c0" status="verified"/> + </game> + <game name="MobileWonderGate (Japan) (Rev 1)" id="0058"> + <description>MobileWonderGate (Japan) (Rev 1)</description> + <rom name="MobileWonderGate (Japan) (Rev 1).ws" size="2097152" crc="80de367d" md5="b1b20bb24be3767ab5bfcfca54b51c54" sha1="92d4a6ff6f2b1152d8935025f38f910155e5d709" status="verified"/> + </game> + <game name="Moero!! Pro Yakyuu Rookies (Japan)" id="0059"> + <description>Moero!! Pro Yakyuu Rookies (Japan)</description> + <rom name="Moero!! Pro Yakyuu Rookies (Japan).ws" size="1048576" crc="eb995e86" md5="ff73a924c6e7d5190be8a9c749b4c9fd" sha1="e88e659cc04fc08a04b8c881f62fe086c5cdab06"/> + </game> + <game name="Morita Shougi for WonderSwan (Japan)" id="0060"> + <description>Morita Shougi for WonderSwan (Japan)</description> + <rom name="Morita Shougi for WonderSwan (Japan).ws" size="1048576" crc="d675c265" md5="9472518275eaf9f3dedca8b59e2fa97f" sha1="3ce41c90cfc1d53a89ade2c88e0b16cdc92c0268"/> + </game> + <game name="Nazo Ou Pocket (Japan)" id="0061"> + <description>Nazo Ou Pocket (Japan)</description> + <rom name="Nazo Ou Pocket (Japan).ws" size="1048576" crc="4ed8820c" md5="5e06ad2f0c65d68a124542ddfffdff37" sha1="b358c65bae818c4b3de6bf668d16c311534036c2"/> + </game> + <game name="Neon Genesis Evangelion - Shito Ikusei (Japan)" id="0062"> + <description>Neon Genesis Evangelion - Shito Ikusei (Japan)</description> + <rom name="Neon Genesis Evangelion - Shito Ikusei (Japan).ws" size="2097152" crc="bf8d9212" md5="0215c4b8a395f6fcf8f5b07605eae08b" sha1="ae31488cee1c91f383efbe3083b4abec092dda36" status="verified"/> + </game> + <game name="Nice On (Japan) (Rev 1)" id="0063"> + <description>Nice On (Japan) (Rev 1)</description> + <rom name="Nice On (Japan) (Rev 1).ws" size="1048576" crc="b5dbcf12" md5="4b33b1f24f05300c1504f1d9b92d4361" sha1="6a479ee45e69cd3d6cc6cdda5a60eff3077953b0" status="verified"/> + </game> + <game name="Nihon Pro Mahjong Renmei Kounin - Tetsuman (Japan) (Rev 2)" id="0064"> + <description>Nihon Pro Mahjong Renmei Kounin - Tetsuman (Japan) (Rev 2)</description> + <rom name="Nihon Pro Mahjong Renmei Kounin - Tetsuman (Japan) (Rev 2).ws" size="1048576" crc="44b3e67c" md5="4aa43895710a9fa5a96b9cd1da46348f" sha1="4eefc5a51008c2ab33e8d04064ec9bdcbc03d036" status="verified"/> + </game> + <game name="Nobunaga no Yabou for WonderSwan (Japan)" id="0065"> + <description>Nobunaga no Yabou for WonderSwan (Japan)</description> + <rom name="Nobunaga no Yabou for WonderSwan (Japan).ws" size="1048576" crc="04531734" md5="d8bb5304f1a68a07e0aca535555171d5" sha1="785ebb7528f5268e1a1fc10dffbe95ccf6d39560"/> + </game> + <game name="Ou-chan no Oekaki Logic (Japan)" id="0066"> + <description>Ou-chan no Oekaki Logic (Japan)</description> + <rom name="Ou-chan no Oekaki Logic (Japan).ws" size="524288" crc="631bd97a" md5="5e92e316ce0998edbec00b31a6f2e112" sha1="0f73d3112b1184f74e728cf1252ffbee6a146fa6"/> + </game> + <game name="Pocket Fighter (Japan)" id="0067"> + <description>Pocket Fighter (Japan)</description> + <rom name="Pocket Fighter (Japan).ws" size="2097152" crc="35361250" md5="e79dddc7db77ad96c52b0b7690f8c1b1" sha1="fb8d0f4e58a4192989ec71eb6e392d182aaa3eec"/> + </game> + <game name="Pro Mahjong Kiwame for WonderSwan (Japan) (Rev 1)" id="0068"> + <description>Pro Mahjong Kiwame for WonderSwan (Japan) (Rev 1)</description> + <rom name="Pro Mahjong Kiwame for WonderSwan (Japan) (Rev 1).ws" size="1048576" crc="90f7e6d6" md5="a2e4f77f749fb0a95db697903d42e718" sha1="32013a7a745a3aa2fd63cc9427c5e1f2635655ed"/> + </game> + <game name="Puyo Puyo Tsuu (Japan)" id="0069"> + <description>Puyo Puyo Tsuu (Japan)</description> + <rom name="Puyo Puyo Tsuu (Japan).ws" size="1048576" crc="5a41a7ba" md5="e5394d336231c99e9c93f1f41e80a401" sha1="d72c1221c2ce3e281a0ee288a3d079aa8e1b714b" status="verified"/> + </game> + <game name="Puzzle Bobble (Japan)" id="0070"> + <description>Puzzle Bobble (Japan)</description> + <rom name="Puzzle Bobble (Japan).ws" size="1048576" crc="f504cd84" md5="cf5e9f022baadd1ed9b0a9e88b503e95" sha1="fdb8e9f37a4b097350b7c5b1b8ee381ca51dc0b6"/> + </game> + <game name="Rainbow Islands - Putty's Party (Japan)" id="0071"> + <description>Rainbow Islands - Putty's Party (Japan)</description> + <rom name="Rainbow Islands - Putty's Party (Japan).ws" size="2097152" crc="8f8608ad" md5="854bd4105d726bf7e76fef8393d6ead0" sha1="759deb79a3fc3befed705d7264e4b88adbadacc7"/> + </game> + <game name="Ring Infinity (Japan)" id="0072"> + <description>Ring Infinity (Japan)</description> + <rom name="Ring Infinity (Japan).ws" size="4194304" crc="14adbd4b" md5="ffee38c08b4e76cf68420f2e22973284" sha1="9896d93c97381dc06b6f044de6c9bd112ca0c94b" status="verified"/> + </game> + <game name="Robot Works (Japan)" id="0074"> + <description>Robot Works (Japan)</description> + <rom name="Robot Works (Japan).ws" size="1048576" crc="6adf0e32" md5="6ca5dff7d8a86279591fbb14324e7c3d" sha1="4d4d4a3fde6b1dbbc8f008fbd035fb59624dfba7"/> + </game> + <game name="Robot Works (Hong Kong) (En,Ja) (Rev 1)" id="0073" cloneofid="0074"> + <description>Robot Works (Hong Kong) (En,Ja) (Rev 1)</description> + <rom name="Robot Works (Hong Kong) (En,Ja) (Rev 1).ws" size="1048576" crc="be6be690" md5="dbaff79d3a241fba6af06cf5b7c935b8" sha1="2117ed92e8cb4ae61868535f1d4d16851b480890"/> + </game> + <game name="Rockman & Forte - Mirai Kara no Chousensha (Japan)" id="0075"> + <description>Rockman & Forte - Mirai Kara no Chousensha (Japan)</description> + <rom name="Rockman & Forte - Mirai Kara no Chousensha (Japan).ws" size="2097152" crc="cd206a9e" md5="523004d48e9d606e1557c2c57af6790b" sha1="9f8829aa8ea523e8370cbb2acd2acce056bb7958"/> + </game> + <game name="Sangokushi for WonderSwan (Japan)" id="0076"> + <description>Sangokushi for WonderSwan (Japan)</description> + <rom name="Sangokushi for WonderSwan (Japan).ws" size="524288" crc="e385ee88" md5="9434714e17547ebf3a67baf63c8a6d04" sha1="d064b94f31b15564c9a3dbd3a68690244ea043ac"/> + </game> + <game name="Sangokushi II for WonderSwan (Japan)" id="0077"> + <description>Sangokushi II for WonderSwan (Japan)</description> + <rom name="Sangokushi II for WonderSwan (Japan).ws" size="1048576" crc="440b2630" md5="263e4218454f7350839ec257441bed85" sha1="3e7492478059d142a6a41b40219eba0c688a8e3f"/> + </game> + <game name="SD Gundam - Emotional Jam (Japan) (Rev 3)" id="0078"> + <description>SD Gundam - Emotional Jam (Japan) (Rev 3)</description> + <rom name="SD Gundam - Emotional Jam (Japan) (Rev 3).ws" size="2097152" crc="ae83f873" md5="6620592b79b06d1857b449508fe1d557" sha1="ae54a1f8916a2d37a1e0c82c5a9b5d8fe0eeae51" status="verified"/> + </game> + <game name="SD Gundam - Emotional Jam (Japan) (Rev 2)" id="0129" cloneofid="0078"> + <description>SD Gundam - Emotional Jam (Japan) (Rev 2)</description> + <rom name="SD Gundam - Emotional Jam (Japan) (Rev 2).ws" size="2097152" crc="adfc3048" md5="c38ac44ef65779506dabd0f6db59748c" sha1="b3b4cf8e996c2a1fb149074725dc4b07922b3133"/> + </game> + <game name="SD Gundam G Generation - Gather Beat (Japan)" id="0079"> + <description>SD Gundam G Generation - Gather Beat (Japan)</description> + <rom name="SD Gundam G Generation - Gather Beat (Japan).ws" size="4194304" crc="e4eb3ab1" md5="39a4626ba187933297b3155180147778" sha1="5e5db8b066e1b41c5c12a2d4ffa97b73ed6c3f03" status="verified"/> + </game> + <game name="SD Gundam Gashapon Senki - Episode 1 (Japan)" id="0080"> + <description>SD Gundam Gashapon Senki - Episode 1 (Japan)</description> + <rom name="SD Gundam Gashapon Senki - Episode 1 (Japan).ws" size="1048576" crc="21eb4c59" md5="aff7a473a087e38a1a1a7d5f71ffc426" sha1="e6899de5b53f73c8978e3330dca0f2daaf95f140" status="verified"/> + </game> + <game name="SD Gundam Gashapon Senki - Episode 1 (Japan) (Alt)" id="0125" cloneofid="0080"> + <description>SD Gundam Gashapon Senki - Episode 1 (Japan) (Alt)</description> + <rom name="SD Gundam Gashapon Senki - Episode 1 (Japan) (Alt).ws" size="2097152" crc="2ec1e9c8" md5="c30a3facebc27ac58c359dedca66cce1" sha1="80eff574c75c2168fd0991c0efd16f9a9cadc24c"/> + </game> + <game name="Senkaiden - TV Animation Senkaiden Houshin Engi Yori (Japan)" id="0081"> + <description>Senkaiden - TV Animation Senkaiden Houshin Engi Yori (Japan)</description> + <rom name="Senkaiden - TV Animation Senkaiden Houshin Engi Yori (Japan).ws" size="2097152" crc="07a3dd46" md5="0230c5ed802e72a9c6bb690e262a302b" sha1="fc8b0b9b7efeac54812e7ae54153b7ae0cb9c12f" status="verified"/> + </game> + <game name="Sennou Millennium (Japan)" id="0082"> + <description>Sennou Millennium (Japan)</description> + <rom name="Sennou Millennium (Japan).ws" size="1048576" crc="301436ac" md5="e12db3065b59e51bae7bf86053dd5782" sha1="708288e70b3186f6c0ef07acaef1b50fe6b7ab22"/> + </game> + <game name="Shanghai Pocket (Japan)" id="0083"> + <description>Shanghai Pocket (Japan)</description> + <rom name="Shanghai Pocket (Japan).ws" size="524288" crc="1c489351" md5="37772a59d2fc13b07ba6260b3c4299da" sha1="d64b9b2d567d1cea5960f64e5bdf83d4514446da" status="verified"/> + </game> + <game name="Shin Nihon Pro Wrestling - Toukon Retsuden (Japan) (Rev 1)" id="0084"> + <description>Shin Nihon Pro Wrestling - Toukon Retsuden (Japan) (Rev 1)</description> + <rom name="Shin Nihon Pro Wrestling - Toukon Retsuden (Japan) (Rev 1).ws" size="1048576" crc="5b76f901" md5="91896b3ee0975f58a8cf322a59da85f2" sha1="7324c5939b8b64858c96bd9726f5b5c483a11e22"/> + </game> + <game name="Shougi Touryuumon (Japan)" id="0085"> + <description>Shougi Touryuumon (Japan)</description> + <rom name="Shougi Touryuumon (Japan).ws" size="1048576" crc="3ad194eb" md5="f95259c0c48527db0f8a63cb3e9b0527" sha1="0bc88b0affa97225e22c531306e9930ddb8f8905"/> + </game> + <game name="Side Pocket for WonderSwan (Japan)" id="0086"> + <description>Side Pocket for WonderSwan (Japan)</description> + <rom name="Side Pocket for WonderSwan (Japan).ws" size="1048576" crc="8655269e" md5="496100bcd73fbfa39e473c6ddee190b2" sha1="4a756dab81e0101475dc2e5494270f3df7dac1e6"/> + </game> + <game name="Slither Link (Japan)" id="0087"> + <description>Slither Link (Japan)</description> + <rom name="Slither Link (Japan).ws" size="1048576" crc="352a570d" md5="d422d16a28390d395f4c0878c555e52c" sha1="9a087b0e6031e7e5e6d133ac82fecb8faa30816a"/> + </game> + <game name="Soccer Yarou! - Challenge the World (Japan)" id="0088"> + <description>Soccer Yarou! - Challenge the World (Japan)</description> + <rom name="Soccer Yarou! - Challenge the World (Japan).ws" size="1048576" crc="1263da65" md5="5d0ef57b85182dcbe630edda46064cfb" sha1="435f207cce79ad6ac5b564e8a37e0d4395bd3739"/> + </game> + <game name="Sotsugyou for WonderSwan (Japan) (Rev 1)" id="0089"> + <description>Sotsugyou for WonderSwan (Japan) (Rev 1)</description> + <rom name="Sotsugyou for WonderSwan (Japan) (Rev 1).ws" size="2097152" crc="f016dfe1" md5="2030ae7ddc9f47307165859d75026f13" sha1="e461762566d529d1b103f119da50353902d180d7"/> + </game> + <game name="Space Invaders (Japan)" id="0090"> + <description>Space Invaders (Japan)</description> + <rom name="Space Invaders (Japan).ws" size="1048576" crc="8d83014f" md5="5558b39b21cc90b0b2f0a4358c043eec" sha1="54dd6e3fe81a8a384a0ffdd7a39211a5de9174c7"/> + </game> + <game name="Super Robot Taisen Compact (Japan) (Rev 2)" id="0091"> + <description>Super Robot Taisen Compact (Japan) (Rev 2)</description> + <rom name="Super Robot Taisen Compact (Japan) (Rev 2).ws" size="2097152" crc="7021d54f" md5="bd6d4cb18dbd098a797d6c09fad23ccd" sha1="e93d58ab5819992e54223f5d1c4d5aeb6983d6a3" status="verified"/> + </game> + <game name="Super Robot Taisen Compact (Japan)" id="0117" cloneofid="0091"> + <description>Super Robot Taisen Compact (Japan)</description> + <rom name="Super Robot Taisen Compact (Japan).ws" size="2097152" crc="8a8c5aa8" md5="4f678ef6dd98bd4c0ebad56271528857" sha1="a957111681951eb6a971a6b4f75bca7f89b29628" status="verified"/> + </game> + <game name="Super Robot Taisen Compact (Japan) (Rev 1)" id="0124" cloneofid="0091"> + <description>Super Robot Taisen Compact (Japan) (Rev 1)</description> + <rom name="Super Robot Taisen Compact (Japan) (Rev 1).ws" size="2097152" crc="7572e478" md5="5c4c57fbc68c5248cace4cb325236a83" sha1="c4a21084bff1f2a63784fe7d11e046f305ad310a" status="verified"/> + </game> + <game name="Super Robot Taisen Compact 2 - Dai-1-bu - Chijou Gekidou Hen (Japan)" id="0092"> + <description>Super Robot Taisen Compact 2 - Dai-1-bu - Chijou Gekidou Hen (Japan)</description> + <rom name="Super Robot Taisen Compact 2 - Dai-1-bu - Chijou Gekidou Hen (Japan).ws" size="4194304" crc="782877bc" md5="af355adec937a9db1d447980bf85aa2e" sha1="e6911e5bb0a742ba299e05b20ee81f2faa4854a5" status="verified"/> + </game> + <game name="Super Robot Taisen Compact 2 - Dai-2-bu - Uchuu Gekishin Hen (Japan) (Rev 4)" id="0093"> + <description>Super Robot Taisen Compact 2 - Dai-2-bu - Uchuu Gekishin Hen (Japan) (Rev 4)</description> + <rom name="Super Robot Taisen Compact 2 - Dai-2-bu - Uchuu Gekishin Hen (Japan) (Rev 4).ws" size="4194304" crc="ecbb46de" md5="bb1cf0d7237d7ae2c8aac562fc62906d" sha1="6014ac0b8978e710f26c9cc41180cdf788584743" status="verified"/> + </game> + <game name="Super Robot Taisen Compact 2 - Dai-3-bu - Ginga Kessen Hen (Japan) (Rev 2)" id="0094"> + <description>Super Robot Taisen Compact 2 - Dai-3-bu - Ginga Kessen Hen (Japan) (Rev 2)</description> + <rom name="Super Robot Taisen Compact 2 - Dai-3-bu - Ginga Kessen Hen (Japan) (Rev 2).ws" size="4194304" crc="0b0f8981" md5="44f63dcb11c916df900a128a6f2e3839" sha1="d24d8cea57c5c487e877eaa523eefb0dd184556d"/> + </game> + <game name="Taikyoku Igo - Heisei Kiin (Japan)" id="0113"> + <description>Taikyoku Igo - Heisei Kiin (Japan)</description> + <rom name="Taikyoku Igo - Heisei Kiin (Japan).ws" size="524288" crc="5023db90" md5="9fae96e8955c6a5684b04bfe53f93a5d" sha1="636395a62d16f31cac845fef1927dda3890d3f0c" sha256="cbb805f2ef607af3c2fb49509929d2b8df4ee0c8ded8b6b57b551f56eb6810cf"/> + </game> + <game name="Tanjou Debut for WonderSwan (Japan) (Rev 1)" id="0096"> + <description>Tanjou Debut for WonderSwan (Japan) (Rev 1)</description> + <rom name="Tanjou Debut for WonderSwan (Japan) (Rev 1).ws" size="2097152" crc="8b74f59a" md5="c80ab865bc9a93e946354f41815e93c4" sha1="2f35d250b8ddeb98ca3a2704a4ad85713f4c71b0"/> + </game> + <game name="Tare Panda no GunPey (Japan)" id="0097"> + <description>Tare Panda no GunPey (Japan)</description> + <rom name="Tare Panda no GunPey (Japan).ws" size="1048576" crc="a5643aa3" md5="c21571f057d05bb01db2ece8517b121d" sha1="9622c65c939f05a9dfae288919ec5bd15c348f14"/> + </game> + <game name="Tekken Card Challenge (Japan)" id="0098"> + <description>Tekken Card Challenge (Japan)</description> + <rom name="Tekken Card Challenge (Japan).ws" size="1048576" crc="e7c608e5" md5="1e8bca5c31f62a9dd1121884351a2885" sha1="96a9ce5e56dc0c9648027ad4454e6f35e88d9a07" status="verified"/> + </game> + <game name="Tenori-on (Japan) (En)" id="0132"> + <description>Tenori-on (Japan) (En)</description> + <rom name="Tenori-on (Japan) (En).ws" size="524288" crc="6fe79bb1" md5="8b5c2993d6eccf6a03f377f9c99d5a92" sha1="c0104db6e176cfa64a95e4c9bc9382beae4d70d1" sha256="8d11c841805a241a14af9c5d135840eb3e8106a32a7ee134e986b65af2cd8cc5"/> + </game> + <game name="Terrors (Japan)" id="0099"> + <description>Terrors (Japan)</description> + <rom name="Terrors (Japan).ws" size="4194304" crc="ef5b6b82" md5="b03441b7b71af24450da7f06b4aac718" sha1="7148d750f12b5da9a0efd99f5a5a7ccadecbdf60"/> + </game> + <game name="Tetsujin 28 Gou (Japan)" id="0100"> + <description>Tetsujin 28 Gou (Japan)</description> + <rom name="Tetsujin 28 Gou (Japan).ws" size="4194304" crc="6f304dca" md5="8b8ea655dbea4a3152b300126556404c" sha1="65c4c6aaa36328bba5d56419af59af5d3420ed78"/> + </game> + <game name="Time Bokan Series - Bokan Densetsu - Buta mo Odaterya Doronboo (Japan)" id="0101"> + <description>Time Bokan Series - Bokan Densetsu - Buta mo Odaterya Doronboo (Japan)</description> + <rom name="Time Bokan Series - Bokan Densetsu - Buta mo Odaterya Doronboo (Japan).ws" size="1048576" crc="7da6acb9" md5="9a41ed23b82a090ec4508d3725e19f9b" sha1="ad77d2e8429d5ed926d514d926050086f4edbeee"/> + </game> + <game name="Tokyo Majin Gakuen - Fuju Houroku (Japan)" id="0102"> + <description>Tokyo Majin Gakuen - Fuju Houroku (Japan)</description> + <rom name="Tokyo Majin Gakuen - Fuju Houroku (Japan).ws" size="8388608" crc="91117d1b" md5="a002e1af08611506555e9a2fe559eddc" sha1="866c67737a4fbb5f09a0b13bbdb89397bcab1f55" status="verified"/> + </game> + <game name="Trump Collection - Bottom-Up Teki Trump Seikatsu (Japan) (Rev 1)" id="0103"> + <description>Trump Collection - Bottom-Up Teki Trump Seikatsu (Japan) (Rev 1)</description> + <rom name="Trump Collection - Bottom-Up Teki Trump Seikatsu (Japan) (Rev 1).ws" size="1048576" crc="c283ec5f" md5="c1c2fc60d813556480226d45d62121a1" sha1="9313e6d7090e91cca0304dc450b2f2f87329ae7a"/> + </game> + <game name="Trump Collection 2 - Bottom-Up Teki Sekaiisshuu no Tabi (Japan) (Rev 1)" id="0104"> + <description>Trump Collection 2 - Bottom-Up Teki Sekaiisshuu no Tabi (Japan) (Rev 1)</description> + <rom name="Trump Collection 2 - Bottom-Up Teki Sekaiisshuu no Tabi (Japan) (Rev 1).ws" size="1048576" crc="64aaf392" md5="523da6fd9e07e6e1d1bee62be04d7b1e" sha1="b25ff8fc79168e439ba913a2cea6195094be9ac2"/> + </game> + <game name="Turntablist - DJ Battle (Japan)" id="0105"> + <description>Turntablist - DJ Battle (Japan)</description> + <rom name="Turntablist - DJ Battle (Japan).ws" size="4194304" crc="0d5171f0" md5="144b29a9997c016fb4b2bb05e3965cfe" sha1="858f1f57b5522a1701cc8a0abae43cec948e26a6"/> + </game> + <game name="Umizuri ni Ikou! (Japan)" id="0106"> + <description>Umizuri ni Ikou! (Japan)</description> + <rom name="Umizuri ni Ikou! (Japan).ws" size="524288" crc="86b56511" md5="bce82b55b44a7d9b8eeb06cdcc884968" sha1="4f739292d11a45490851eaf40c0a7081824ad75a"/> + </game> + <game name="Uzumaki - Denshi Kaiki Hen (Japan) (Rev 4)" id="0107"> + <description>Uzumaki - Denshi Kaiki Hen (Japan) (Rev 4)</description> + <rom name="Uzumaki - Denshi Kaiki Hen (Japan) (Rev 4).ws" size="2097152" crc="812020ef" md5="eacb689de3482cf6e6da8befc7da65b2" sha1="4c8166e0632bdb8c098d586a7b1522ed7b63b5f7"/> + </game> + <game name="Uzumaki - Noroi Simulation (Japan)" id="0037"> + <description>Uzumaki - Noroi Simulation (Japan)</description> + <rom name="Uzumaki - Noroi Simulation (Japan).ws" size="2097152" crc="ca3f0b00" md5="c329cc51abf1f9f85c33ca28d5a26f0c" sha1="38f708a4c0c4fcec0cf4d6ce051d1ff76466d617"/> + </game> + <game name="Vaitz Blade (Japan) (Rev 1)" id="0108"> + <description>Vaitz Blade (Japan) (Rev 1)</description> + <rom name="Vaitz Blade (Japan) (Rev 1).ws" size="4194304" crc="8fc9e145" md5="49a2932821583fa7d3ed07312b47ab32" sha1="cfb877f0988920c8fe4da5cdd7583197799df621" status="verified"/> + </game> + <game name="Wasabi Produce - Street Dancer (Japan)" id="0109"> + <description>Wasabi Produce - Street Dancer (Japan)</description> + <rom name="Wasabi Produce - Street Dancer (Japan).ws" size="4194304" crc="1860b655" md5="da0eb7a02b6a5250047eef22deba5c39" sha1="672cfc0e4547b2721d11b67476391b6e6cca81ae"/> + </game> + <game name="Wonder Stadium (Japan)" id="0111"> + <description>Wonder Stadium (Japan)</description> + <rom name="Wonder Stadium (Japan).ws" size="1048576" crc="23bc0309" md5="56c33436c90f652e02092d064287b5ce" sha1="cb9454a8277bb2a7d5a6e3b4ddc84194fcbb1231" status="verified"/> + </game> + <game name="Wonder Stadium '99 (Japan)" id="0110"> + <description>Wonder Stadium '99 (Japan)</description> + <rom name="Wonder Stadium '99 (Japan).ws" size="1048576" crc="e252919d" md5="cbd1f30650653d8ac845915bc2aea608" sha1="bb138765346d9f4d77615444d090b1328a59818a" status="verified"/> + </game> + <game name="WonderSwan Handy Sonar (Japan) (Rev 1)" id="0112" cloneofid="0126"> + <description>WonderSwan Handy Sonar (Japan) (Rev 1)</description> + <rom name="WonderSwan Handy Sonar (Japan) (Rev 1).ws" size="1048576" crc="2ab9852d" md5="5db558122eabe25b930d57c8e5fb05d8" sha1="70d65a936ee1dfc2b89c543312c205285d955efb"/> + </game> + <game name="WonderSwan Handy Sonar (Japan) (Rev 2)" id="0126"> + <description>WonderSwan Handy Sonar (Japan) (Rev 2)</description> + <rom name="WonderSwan Handy Sonar (Japan) (Rev 2).ws" size="1048576" crc="d4188811" md5="74562136e58960870694c8b6bc913cd2" sha1="a1691ef96097c409b56c77f1d4c731fbfb3f386b" status="verified"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.0.0) (Program)" id="0128" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.0.0) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.0.0) (Program).ws" size="524288" crc="dc60f640" md5="c0fe5cdc311f91aeaa350cda5a8cb31c" sha1="e8b8562d0d63eff76581782647d455cb94b58c77" status="verified"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.2.0) (Program)" id="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.2.0) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.2.0) (Program).ws" size="524288" crc="8e5e9633" md5="5670b16583073b43dc1b486ebee87660" sha1="d9dd280972ec45e56de98f3d425533dd49713caf" status="verified"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.1.5) (Program)" id="0131" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.1.5) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.1.5) (Program).ws" size="524288" crc="45ba7287" md5="dcc8ea5ccb5815f41692467775789770" sha1="905cca29fd6188b2c6237b1fb71e89d7b6a1f842" status="verified"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.0.2) (Program)" id="0133" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.0.2) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.0.2) (Program).ws" size="524288" crc="71aa2e39" md5="375e9ad8ee04587ba92c3adeecd429b5" sha1="f20af32f9e6a2d7deff2d474d20a9da8d2462e07"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.0.3) (Program)" id="0134" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.0.3) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.0.3) (Program).ws" size="524288" crc="f71ef60c" md5="8c4a28687ca4d042bea7df0aa20ad894" sha1="c98fecb3da5cd9712026eea7ca8943fd77356058"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.1.1) (Program)" id="0135" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.1.1) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.1.1) (Program).ws" size="524288" crc="f8bdf7ab" md5="e1afd5588561655121d97d94c20db1f9" sha1="0a09eca4a8a1bce2bad344216589ee833f0b8383"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.1.2) (Program)" id="0136" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.1.2) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.1.2) (Program).ws" size="524288" crc="05c0166e" md5="13566913cd2c8d529869ea03342f5249" sha1="159648c577811986397dbae86002793d18e9147b"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.1.3) (Program)" id="0137" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.1.3) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.1.3) (Program).ws" size="524288" crc="9303fa7e" md5="f7bc604aba650f56c06174bc0f31fbbc" sha1="4ed5d9ef000d33b785bbd659aaec376157faa646"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.1.4) (Program)" id="0138" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.1.4) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.1.4) (Program).ws" size="524288" crc="e8d001b8" md5="75a68a0739c137a4ced5bded8214c733" sha1="9e42a85003c66b286f8335c3372f05df86e1607b"/> + </game> + <game name="WonderWitch (Japan) (FreyaOS 1.1.6b1) (Program)" id="0139" cloneofid="0130"> + <description>WonderWitch (Japan) (FreyaOS 1.1.6b1) (Program)</description> + <rom name="WonderWitch (Japan) (FreyaOS 1.1.6b1) (Program).ws" size="524288" crc="6480bf70" md5="08ec42043bf68583b830d4e9c2fd3e48" sha1="7913dcda7ec702e152a48e2df0cd721035138c54"/> + </game> +</datafile> diff --git a/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan.dat.bytes.meta b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan.dat.bytes.meta new file mode 100644 index 00000000..b4f07022 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/StoicGooseUnity/emu/Dat/Bandai - WonderSwan.dat.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8c7855ba6b3026744bae333b09af339f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/LaunchUI.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/LaunchUI.prefab index d91419cc..d0e9b39f 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/LaunchUI.prefab +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/LaunchUI.prefab @@ -149,6 +149,74 @@ MonoBehaviour: Description: SNK NeoGeo OverrideTemplate: {fileID: -3959751710151339114, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: IGS PGM + SubTitle: + Description: IGS PGM + OverrideTemplate: {fileID: -3959751710151339114, guid: c4467b8175b4db64093d603a93775dff, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: Arcade Old + SubTitle: + Description: "\u66F4\u53E4\u65E9\u7684\u8857\u673A\u5355\u72EC\u5206\u7C7B" + OverrideTemplate: {fileID: 1952221633680236903, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: Master System / Master III + SubTitle: + Description: SAGE Master System / Master III + OverrideTemplate: {fileID: 1952221633680236903, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: GAME BOY + SubTitle: + Description: Nintendo GAME BOY + OverrideTemplate: {fileID: 1952221633680236903, guid: 16523b967a6221241ab1109d556992f4, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: GAME BOY Color + SubTitle: + Description: Nintendo GAME BOY Color + OverrideTemplate: {fileID: 1952221633680236903, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: Game Gear + SubTitle: + Description: "Game Gear \u662F\u4E16\u5609\u516C\u53F8\u4E8E1990\u5E74\u63A8\u51FA\u7684\u9996\u6B3E\u638C\u4E0A\u6E38\u620F\u673A\uFF0C\u4E3B\u6253\u5F69\u8272\u80CC\u5149\u5C4F\u5E55\u548C\u5BB6\u7528\u673A\u79FB\u690D\u6E38\u620F" + OverrideTemplate: {fileID: 1952221633680236903, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: SC-3000 + SubTitle: + Description: "SEGA Computer 3000\u200B" + OverrideTemplate: {fileID: 1952221633680236903, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: SG-1000 + SubTitle: + Description: SEGA Game 1000 + OverrideTemplate: {fileID: 1952221633680236903, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: ColecoVision + SubTitle: + Description: "ColecoVision \u662F Coleco \u516C\u53F8\u4E8E1982\u5E748\u6708\u63A8\u51FA\u7684\u7B2C\u4E8C\u4E16\u4EE3\u5BB6\u7528\u6E38\u620F\u673A\uFF0C\u4EE5\u201C\u5C06\u8857\u673A\u4F53\u9A8C\u5E26\u5165\u5BB6\u5EAD\u201D\u4E3A\u76EE\u6807\uFF0C\u5BF9\u65E9\u671F\u6E38\u620F\u673A\u5E02\u573A\u53CA\u4EFB\u5929\u5802FC\u7684\u8BBE\u8BA1\u4EA7\u751F\u4E86\u6DF1\u8FDC\u5F71\u54CD" + OverrideTemplate: {fileID: 1952221633680236903, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: "Wonder Swan / \u795E\u5947\u5929\u9E45" + SubTitle: + Description: "WonderSwan\uFF08\u65E5\u8BED\uFF1A\u30EF\u30F3\u30C0\u30FC\u30B9\u30EF\u30F3\uFF0C\u7B80\u79F0\u4E3AWS\uFF09\u662F\u65E5\u672C\u73A9\u5177\u5236\u9020\u5546\u4E07\u4EE3\uFF08\u540E\u4E0E\u5357\u68A6\u5BAB\u5408\u5E76\u4E3A\u4E07\u4EE3\u5357\u68A6\u5BAB\uFF09\u63A8\u51FA\u768416\u4F4D\u638C\u4E0A\u6E38\u620F\u673A\u3001\u7B2C\u4E94\u4E16\u4EE3\u6E38\u620F\u673A\uFF0C\u7531Game + Boy\u8BBE\u8BA1\u8005\u6A2A\u4E95\u519B\u5E73\u6210\u7ACB\u7684\u7684\u516C\u53F8Koto + Laboratory\u548C\u4E07\u4EE3\u5171\u540C\u8BBE\u8BA1" + OverrideTemplate: {fileID: 1952221633680236903, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + SubMenus: [] + - Icon: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + Name: "Wonder Swan Color / \u795E\u5947\u5929\u9E45 Color" + SubTitle: + Description: "WSC\u4E3ABANDAI\uFF08\u4E07\u4EE3\uFF09\u516C\u53F8\u63A8\u51FA\u7684\u638C\u673A\u4E2D\u6587\u540D\u4E3A\u201C\u795E\u5947\u5929\u9E45\u201D\u540E\u9762\u7684\u5B57\u6BCDC\u662FCOLOER\u5373\u5F69\u8272\u7684\u610F\u601D\u3002\u6B64\u673A\u7684\u8BBE\u8BA1\u8005\u662FGB\u7684\u751F\u7236\u6A2A\u4E95\u519B\u5E73\u5148\u751F\u3002\u4E3B\u673A\u4E3A16\u4F4D\u4E3B\u673A\uFF0C\u53EF\u652F\u6301\u6A2A\u5411\u548C\u675F\u5411\u4E24\u79CD\u6E38\u620F\u65B9\u5F0F\u3002" + OverrideTemplate: {fileID: 1952221633680236903, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + SubMenus: [] - Icon: {fileID: 21300000, guid: ecce24ec6d4b5b546af85d64ba55a3a2, type: 3} Name: "\u8054\u673A" SubTitle: @@ -441,9 +509,9 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1799050900648665819} - - {fileID: 1184851303049462769} - - {fileID: 785838946138973877} + - {fileID: 4059251362547879848} + - {fileID: 905490728719920459} + - {fileID: 5045491097022569823} m_Father: {fileID: 6855144573435021451} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -540,1733 +608,13 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 ---- !u!1001 &237795026414169094 +--- !u!1001 &195434918666700151 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 7102897325704768026} - m_Modifications: - - target: {fileID: 632697230221148209, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Alpha - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Text - value: Settings - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3189920797946144379, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Name - value: Settings - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: c300d49e84cf0fb4186c750320e50146, type: 3} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.x - value: 0.85 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.y - value: 0.85 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.z - value: 0.85 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 5143889585655868127} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 5045841496318279737} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 5474864158941640372} - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} ---- !u!224 &1799050900648665819 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - m_PrefabInstance: {fileID: 237795026414169094} - m_PrefabAsset: {fileID: 0} ---- !u!224 &3425962791347450238 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - m_PrefabInstance: {fileID: 237795026414169094} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &849559553353436460 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 7102897325704768026} - m_Modifications: - - target: {fileID: 632697230221148209, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Alpha - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Text - value: Game - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3189920797946144379, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Name - value: Game - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 1b52cdd34b39a8c4fa0dad6f2007e2f3, type: 3} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.x - value: 0.85 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.y - value: 0.85 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.z - value: 0.85 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 5009508442035475531} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 5933553774289376271} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 8357948833395801439} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 6492895799213979968} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 4184602137809474294} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 8664827731639454549} - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 4494951505442638845} - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} ---- !u!224 &1184851303049462769 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - m_PrefabInstance: {fileID: 849559553353436460} - m_PrefabAsset: {fileID: 0} ---- !u!224 &2814076563062444116 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - m_PrefabInstance: {fileID: 849559553353436460} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &1251031242959235176 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 7102897325704768026} - m_Modifications: - - target: {fileID: 632697230221148209, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Alpha - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Text - value: "\u8054\u673A" - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3189920797946144379, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Name - value: "\u8054\u673A" - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: ecce24ec6d4b5b546af85d64ba55a3a2, type: 3} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.x - value: 0.85 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.y - value: 0.85 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - propertyPath: m_LocalScale.z - value: 0.85 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: - - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - insertIndex: -1 - addedObject: {fileID: 4071037221002938751} - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} ---- !u!224 &785838946138973877 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - m_PrefabInstance: {fileID: 1251031242959235176} - m_PrefabAsset: {fileID: 0} ---- !u!224 &4439185947132507408 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} - m_PrefabInstance: {fileID: 1251031242959235176} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &2425719923196992555 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 2814076563062444116} - m_Modifications: - - target: {fileID: 734025543935719296, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Text - value: NeoGeo - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMax.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMax.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMin.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMin.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.x - value: 144 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.y - value: 104 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.x - value: -72 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.y - value: -831 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2619187604372594158, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} - - target: {fileID: 3189920797946144379, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Name - value: NeoGeo - objectReference: {fileID: 0} - - target: {fileID: 3380485461544738227, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Text - value: SNK NeoGeo - objectReference: {fileID: 0} - - target: {fileID: 5331629140490413834, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Alpha - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} - - target: {fileID: 8126322204359135913, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} ---- !u!224 &4184602137809474294 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} - m_PrefabInstance: {fileID: 2425719923196992555} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &2577300175051671458 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 4439185947132507408} - m_Modifications: - - target: {fileID: 15566658635405967, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 15566658635405967, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 15566658635405967, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 15566658635405967, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 15566658635405967, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 15566658635405967, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 15566658635405967, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 734025543935719296, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Text - value: "\u623F\u95F4\u5217\u8868" - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMax.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMax.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMin.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMin.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.x - value: 144 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.y - value: 104 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.x - value: -72 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.y - value: -207 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2619187604372594158, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: e1f1b901785009046a04b7f05cbfc2c6, type: 3} - - target: {fileID: 3189920797946144379, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Name - value: "\u623F\u95F4\u5217\u8868" - objectReference: {fileID: 0} - - target: {fileID: 3380485461544738227, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Text - value: "\u5728\u7EBF\u623F\u95F4\u5217\u8868" - objectReference: {fileID: 0} - - target: {fileID: 5331629140490413834, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Alpha - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: e1f1b901785009046a04b7f05cbfc2c6, type: 3} - - target: {fileID: 8126322204359135913, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} ---- !u!224 &4071037221002938751 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} - m_PrefabInstance: {fileID: 2577300175051671458} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &3575709725216339833 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 2814076563062444116} - m_Modifications: - - target: {fileID: 460203047818732930, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3127083372996404082, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMax.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMax.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMin.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchorMin.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.x - value: 144 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_SizeDelta.y - value: 104 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.x - value: -72 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_AnchoredPosition.y - value: -987 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6906796367924543454, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_Text - value: Master System / Master III - objectReference: {fileID: 0} - - target: {fileID: 9106117812833555594, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - propertyPath: m_Name - value: MasterSystem - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} ---- !u!224 &8664827731639454549 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} - m_PrefabInstance: {fileID: 3575709725216339833} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &4728837085048453021 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 2814076563062444116} - m_Modifications: - - target: {fileID: 734025543935719296, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Text - value: CPS2 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMax.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMax.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMin.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMin.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.x - value: 144 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.y - value: 104 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.x - value: -72 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.y - value: -675 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2619187604372594158, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} - - target: {fileID: 3189920797946144379, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Name - value: CPS2 - objectReference: {fileID: 0} - - target: {fileID: 3380485461544738227, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Text - value: "Capcom Arcade \u2161" - objectReference: {fileID: 0} - - target: {fileID: 5331629140490413834, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Alpha - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} - - target: {fileID: 8126322204359135913, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} ---- !u!224 &6492895799213979968 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} - m_PrefabInstance: {fileID: 4728837085048453021} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &5324210966524959442 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 2814076563062444116} - m_Modifications: - - target: {fileID: 734025543935719296, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Text - value: NES - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMax.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMax.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMin.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMin.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.x - value: 144 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.y - value: 104 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.x - value: -72 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.y - value: -363 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2619187604372594158, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} - - target: {fileID: 3189920797946144379, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Name - value: NES - objectReference: {fileID: 0} - - target: {fileID: 3380485461544738227, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Text - value: Nintendo Entertainment System / Family Computer - objectReference: {fileID: 0} - - target: {fileID: 5331629140490413834, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Alpha - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} - - target: {fileID: 8126322204359135913, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: b170104e466853c49b29f9b5b103364e, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: b170104e466853c49b29f9b5b103364e, type: 3} ---- !u!224 &5933553774289376271 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} - m_PrefabInstance: {fileID: 5324210966524959442} - m_PrefabAsset: {fileID: 0} ---- !u!1001 &5783129759281854569 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 3425962791347450238} + m_TransformParent: {fileID: 1092597733360213005} m_Modifications: - target: {fileID: 734025543935719296, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} propertyPath: m_IsActive @@ -2372,425 +720,137 @@ PrefabInstance: propertyPath: m_Alpha value: 0 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - target: {fileID: 6771349210554360888, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} propertyPath: m_Sprite value: objectReference: {fileID: 8228730565043098574, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} - - target: {fileID: 8126322204359135913, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} ---- !u!224 &5474864158941640372 stripped +--- !u!224 &1805100227214035882 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 98ac562d730eabc42b9a3b12c715d114, type: 3} - m_PrefabInstance: {fileID: 5783129759281854569} + m_PrefabInstance: {fileID: 195434918666700151} m_PrefabAsset: {fileID: 0} ---- !u!1001 &6690543928294155266 +--- !u!1001 &1427742513238972974 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 3425962791347450238} + m_TransformParent: {fileID: 4317834147708567278} m_Modifications: - - target: {fileID: 734025543935719296, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_Text - value: "\u80CC\u666F" - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_Pivot.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_Pivot.y value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_AnchorMax.x value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_AnchorMax.y value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_AnchorMin.x value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_AnchorMin.y value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_SizeDelta.x value: 144 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_SizeDelta.y value: 104 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalRotation.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalRotation.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalRotation.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_AnchoredPosition.x value: -72 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_AnchoredPosition.y - value: -207 + value: -2235 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 2619187604372594158, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 0bdbd1b2830ae724dbd62e306f54d60a, type: 3} - - target: {fileID: 3189920797946144379, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_Name - value: "\u80CC\u666F" - objectReference: {fileID: 0} - - target: {fileID: 3380485461544738227, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + - target: {fileID: 6906796367924543454, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} propertyPath: m_Text - value: + value: ColecoVision objectReference: {fileID: 0} - - target: {fileID: 5331629140490413834, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_Alpha - value: 0 + - target: {fileID: 9003373412835913538, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} + propertyPath: m_Text + value: "ColecoVision \u662F Coleco \u516C\u53F8\u4E8E1982\u5E748\u6708\u63A8\u51FA\u7684\u7B2C\u4E8C\u4E16\u4EE3\u5BB6\u7528\u6E38\u620F\u673A\uFF0C\u4EE5\u201C\u5C06\u8857\u673A\u4F53\u9A8C\u5E26\u5165\u5BB6\u5EAD\u201D\u4E3A\u76EE\u6807\uFF0C\u5BF9\u65E9\u671F\u6E38\u620F\u673A\u5E02\u573A\u53CA\u4EFB\u5929\u5802FC\u7684\u8BBE\u8BA1\u4EA7\u751F\u4E86\u6DF1\u8FDC\u5F71\u54CD" objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 0bdbd1b2830ae724dbd62e306f54d60a, type: 3} - - target: {fileID: 8126322204359135913, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 + - target: {fileID: 9106117812833555594, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} + propertyPath: m_Name + value: ColecoVision objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} ---- !u!224 &5143889585655868127 stripped + m_SourcePrefab: {fileID: 100100000, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} +--- !u!224 &6516853407300068866 stripped RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} - m_PrefabInstance: {fileID: 6690543928294155266} + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 146c51253379ea34cb1e979eb56072b1, type: 3} + m_PrefabInstance: {fileID: 1427742513238972974} m_PrefabAsset: {fileID: 0} ---- !u!1001 &6754621027495300836 +--- !u!1001 &1434864455140837103 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 3425962791347450238} + m_TransformParent: {fileID: 1092597733360213005} m_Modifications: - target: {fileID: 734025543935719296, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} propertyPath: m_IsActive @@ -2896,425 +956,1512 @@ PrefabInstance: propertyPath: m_Alpha value: 0 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - target: {fileID: 6771349210554360888, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} propertyPath: m_Sprite value: objectReference: {fileID: 21300000, guid: 8b2d1bdf739173c40bb205540b308d02, type: 3} - - target: {fileID: 8126322204359135913, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9038541706626733903, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} ---- !u!224 &5045841496318279737 stripped +--- !u!224 &599818281276590130 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 3ecc1c637c161184099b69c3d7a0f354, type: 3} - m_PrefabInstance: {fileID: 6754621027495300836} + m_PrefabInstance: {fileID: 1434864455140837103} m_PrefabAsset: {fileID: 0} ---- !u!1001 &6790877867377924758 +--- !u!1001 &1669605207363117974 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 2814076563062444116} + m_TransformParent: {fileID: 7102897325704768026} m_Modifications: - - target: {fileID: 734025543935719296, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 991446423622995247, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_Text - value: "\u6536\u85CF" - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMax.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMax.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMin.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMin.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_SizeDelta.x - value: 144 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_SizeDelta.y - value: 104 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.x - value: -72 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.y - value: -207 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2619187604372594158, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 7637870703528583553, guid: a8e14774cb9b81d4799116466bc09437, type: 3} - - target: {fileID: 3189920797946144379, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_Name - value: "\u6536\u85CF" - objectReference: {fileID: 0} - - target: {fileID: 3380485461544738227, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_Text - value: "\u5C55\u793A\u6240\u6709\u5E73\u53F0\u6536\u85CF\u7684rom" - objectReference: {fileID: 0} - - target: {fileID: 5331629140490413834, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 632697230221148209, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_Alpha value: 0 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 991446423622995247, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Text + value: Game + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 200 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 203 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.x + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 6771349210554360888, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchoredPosition.x + value: -664 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchoredPosition.y + value: -245 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3189920797946144379, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Name + value: Game + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_Sprite value: - objectReference: {fileID: 7637870703528583553, guid: a8e14774cb9b81d4799116466bc09437, type: 3} - - target: {fileID: 8126322204359135913, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + objectReference: {fileID: 21300000, guid: 1b52cdd34b39a8c4fa0dad6f2007e2f3, type: 3} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.x + value: 0.85 + objectReference: {fileID: 0} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.y + value: 0.85 + objectReference: {fileID: 0} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.z + value: 0.85 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 4916857729186405442} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 9100259551027709282} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 5915103534449548264} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 2468814289847610196} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 9161925335042560357} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 488536325200041129} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 1735927827576127070} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 7627876286178725017} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 3198253282780471134} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 7565994594409076016} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 5814797579013412827} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 3086809728505469733} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 8545248743875837910} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 6516853407300068866} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 7601123610744924862} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 7577688307410105946} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} +--- !u!224 &905490728719920459 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + m_PrefabInstance: {fileID: 1669605207363117974} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4317834147708567278 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + m_PrefabInstance: {fileID: 1669605207363117974} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1806665220749945847 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 144 objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: -72 objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} propertyPath: m_AnchoredPosition.y + value: -1767 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_SizeDelta.x + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMax.y + - target: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchorMin.y - value: 0 + - target: {fileID: 6906796367924543454, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_Text + value: Game Gear objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_SizeDelta.x - value: 0 + - target: {fileID: 9003373412835913538, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_Text + value: "Game Gear \u662F\u4E16\u5609\u516C\u53F8\u4E8E1990\u5E74\u63A8\u51FA\u7684\u9996\u6B3E\u638C\u4E0A\u6E38\u620F\u673A\uFF0C\u4E3B\u6253\u5F69\u8272\u80CC\u5149\u5C4F\u5E55\u548C\u5BB6\u7528\u673A\u79FB\u690D\u6E38\u620F" objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 + - target: {fileID: 9106117812833555594, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + propertyPath: m_Name + value: Game Gear objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} ---- !u!224 &5009508442035475531 stripped + m_SourcePrefab: {fileID: 100100000, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} +--- !u!224 &5814797579013412827 stripped RectTransform: - m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} - m_PrefabInstance: {fileID: 6790877867377924758} + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 9d1d397edc91f544b917d31d56f7074b, type: 3} + m_PrefabInstance: {fileID: 1806665220749945847} m_PrefabAsset: {fileID: 0} ---- !u!1001 &7513750463397081986 +--- !u!1001 &2124840448071277172 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 2814076563062444116} + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 734025543935719296, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Text + value: IGS PGM + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_AnchoredPosition.y + value: -987 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2619187604372594158, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + - target: {fileID: 3189920797946144379, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Name + value: IGS PGM + objectReference: {fileID: 0} + - target: {fileID: 3380485461544738227, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Text + value: IGS PGM + objectReference: {fileID: 0} + - target: {fileID: 5331629140490413834, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: c4467b8175b4db64093d603a93775dff, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c4467b8175b4db64093d603a93775dff, type: 3} +--- !u!224 &488536325200041129 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: c4467b8175b4db64093d603a93775dff, type: 3} + m_PrefabInstance: {fileID: 2124840448071277172} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &2279606829499168741 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1092597733360213005} + m_Modifications: + - target: {fileID: 734025543935719296, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Text + value: "\u80CC\u666F" + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_AnchoredPosition.y + value: -207 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2619187604372594158, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: 0bdbd1b2830ae724dbd62e306f54d60a, type: 3} + - target: {fileID: 3189920797946144379, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Name + value: "\u80CC\u666F" + objectReference: {fileID: 0} + - target: {fileID: 3380485461544738227, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Text + value: + objectReference: {fileID: 0} + - target: {fileID: 5331629140490413834, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: 0bdbd1b2830ae724dbd62e306f54d60a, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} +--- !u!224 &295434682472724792 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: dd267389f23898f45b22dbc9670a17c7, type: 3} + m_PrefabInstance: {fileID: 2279606829499168741} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &2340595223093063861 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_AnchoredPosition.y + value: -1299 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6906796367924543454, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_Text + value: Master System / Master III + objectReference: {fileID: 0} + - target: {fileID: 9003373412835913538, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_Text + value: SAGE Master System / Master III + objectReference: {fileID: 0} + - target: {fileID: 9106117812833555594, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + propertyPath: m_Name + value: Master System / Master III + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} +--- !u!224 &7627876286178725017 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 29303a37c43a05e48baf7b3fe43bfd09, type: 3} + m_PrefabInstance: {fileID: 2340595223093063861} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &2344551020705630838 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_AnchoredPosition.y + value: -2547 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6906796367924543454, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_Text + value: "Wonder Swan Color / \u795E\u5947\u5929\u9E45 Color" + objectReference: {fileID: 0} + - target: {fileID: 9003373412835913538, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_Text + value: "WSC\u4E3ABANDAI\uFF08\u4E07\u4EE3\uFF09\u516C\u53F8\u63A8\u51FA\u7684\u638C\u673A\u4E2D\u6587\u540D\u4E3A\u201C\u795E\u5947\u5929\u9E45\u201D\u540E\u9762\u7684\u5B57\u6BCDC\u662FCOLOER\u5373\u5F69\u8272\u7684\u610F\u601D\u3002\u6B64\u673A\u7684\u8BBE\u8BA1\u8005\u662FGB\u7684\u751F\u7236\u6A2A\u4E95\u519B\u5E73\u5148\u751F\u3002\u4E3B\u673A\u4E3A16\u4F4D\u4E3B\u673A\uFF0C\u53EF\u652F\u6301\u6A2A\u5411\u548C\u675F\u5411\u4E24\u79CD\u6E38\u620F\u65B9\u5F0F\u3002" + objectReference: {fileID: 0} + - target: {fileID: 9106117812833555594, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + propertyPath: m_Name + value: "Wonder Swan Color / \u795E\u5947\u5929\u9E45 Color" + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} +--- !u!224 &7577688307410105946 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 017a4e122916b0c489123671b06d9ea7, type: 3} + m_PrefabInstance: {fileID: 2344551020705630838} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &2367840363771991698 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_AnchoredPosition.y + value: -2391 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6906796367924543454, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_Text + value: "Wonder Swan / \u795E\u5947\u5929\u9E45" + objectReference: {fileID: 0} + - target: {fileID: 9003373412835913538, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_Text + value: "WonderSwan\uFF08\u65E5\u8BED\uFF1A\u30EF\u30F3\u30C0\u30FC\u30B9\u30EF\u30F3\uFF0C\u7B80\u79F0\u4E3AWS\uFF09\u662F\u65E5\u672C\u73A9\u5177\u5236\u9020\u5546\u4E07\u4EE3\uFF08\u540E\u4E0E\u5357\u68A6\u5BAB\u5408\u5E76\u4E3A\u4E07\u4EE3\u5357\u68A6\u5BAB\uFF09\u63A8\u51FA\u768416\u4F4D\u638C\u4E0A\u6E38\u620F\u673A\u3001\u7B2C\u4E94\u4E16\u4EE3\u6E38\u620F\u673A\uFF0C\u7531Game + Boy\u8BBE\u8BA1\u8005\u6A2A\u4E95\u519B\u5E73\u6210\u7ACB\u7684\u7684\u516C\u53F8Koto + Laboratory\u548C\u4E07\u4EE3\u5171\u540C\u8BBE\u8BA1" + objectReference: {fileID: 0} + - target: {fileID: 9106117812833555594, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + propertyPath: m_Name + value: "Wonder Swan / \u795E\u5947\u5929\u9E45" + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} +--- !u!224 &7601123610744924862 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 6b9cf0040ec05e742aa8ca739b5f6adf, type: 3} + m_PrefabInstance: {fileID: 2367840363771991698} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &2404658431831599388 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_AnchoredPosition.y + value: -1611 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6906796367924543454, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_Text + value: GAME BOY Color + objectReference: {fileID: 0} + - target: {fileID: 9003373412835913538, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_Text + value: Nintendo GAME BOY Color + objectReference: {fileID: 0} + - target: {fileID: 9106117812833555594, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + propertyPath: m_Name + value: GAME BOY Color + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} +--- !u!224 &7565994594409076016 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: c73ba8d34c204a5408505f72df70da0b, type: 3} + m_PrefabInstance: {fileID: 2404658431831599388} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &2589017321316548981 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7102897325704768026} + m_Modifications: + - target: {fileID: 632697230221148209, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Text + value: Settings + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_SizeDelta.x + value: 200 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_SizeDelta.y + value: 203 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchoredPosition.x + value: -664 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchoredPosition.y + value: -245 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3189920797946144379, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Name + value: Settings + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: c300d49e84cf0fb4186c750320e50146, type: 3} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.x + value: 0.85 + objectReference: {fileID: 0} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.y + value: 0.85 + objectReference: {fileID: 0} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.z + value: 0.85 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 295434682472724792} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 599818281276590130} + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 1805100227214035882} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} +--- !u!224 &1092597733360213005 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + m_PrefabInstance: {fileID: 2589017321316548981} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4059251362547879848 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + m_PrefabInstance: {fileID: 2589017321316548981} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &3311887530792451334 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 8176807569060777722} + m_Modifications: + - target: {fileID: 734025543935719296, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Text + value: "\u623F\u95F4\u5217\u8868" + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_AnchoredPosition.y + value: -207 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2619187604372594158, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: e1f1b901785009046a04b7f05cbfc2c6, type: 3} + - target: {fileID: 3189920797946144379, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Name + value: "\u623F\u95F4\u5217\u8868" + objectReference: {fileID: 0} + - target: {fileID: 3380485461544738227, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Text + value: "\u5728\u7EBF\u623F\u95F4\u5217\u8868" + objectReference: {fileID: 0} + - target: {fileID: 5331629140490413834, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: e1f1b901785009046a04b7f05cbfc2c6, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} +--- !u!224 &3912891659551650779 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 71eabba88b30a4945b153dbaa6237441, type: 3} + m_PrefabInstance: {fileID: 3311887530792451334} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &4177563188377789833 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 734025543935719296, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Text + value: CPS2 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_AnchoredPosition.y + value: -675 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2619187604372594158, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + - target: {fileID: 3189920797946144379, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Name + value: CPS2 + objectReference: {fileID: 0} + - target: {fileID: 3380485461544738227, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Text + value: "Capcom Arcade \u2161" + objectReference: {fileID: 0} + - target: {fileID: 5331629140490413834, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} +--- !u!224 &2468814289847610196 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: cf3c029a754c0dc40b15ce6b1962e31f, type: 3} + m_PrefabInstance: {fileID: 4177563188377789833} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &4554842985378694138 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_AnchoredPosition.y + value: -2079 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6906796367924543454, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_Text + value: SG-1000 + objectReference: {fileID: 0} + - target: {fileID: 9003373412835913538, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_Text + value: SEGA Game 1000 + objectReference: {fileID: 0} + - target: {fileID: 9106117812833555594, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + propertyPath: m_Name + value: SG-1000 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} +--- !u!224 &8545248743875837910 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: a2a595dedf34bfe4f970da5fcaaa0283, type: 3} + m_PrefabInstance: {fileID: 4554842985378694138} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &5309173593580639541 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} m_Modifications: - target: {fileID: 734025543935719296, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} propertyPath: m_IsActive @@ -3324,30 +2471,6 @@ PrefabInstance: propertyPath: m_Text value: CPS1 objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1559746939363341302, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - target: {fileID: 1998281097548910301, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} propertyPath: m_Pivot.x value: 0 @@ -3444,280 +2567,634 @@ PrefabInstance: propertyPath: m_Alpha value: 0 objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6087025893861054323, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6095356919362338847, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - target: {fileID: 6771349210554360888, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} propertyPath: m_Sprite value: objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} - - target: {fileID: 8126322204359135913, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8126322204359135913, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8754483333502849411, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8789823129857705082, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} ---- !u!224 &8357948833395801439 stripped +--- !u!224 &5915103534449548264 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: ae0d9b04c112f5b4c98feb0af7ed5676, type: 3} - m_PrefabInstance: {fileID: 7513750463397081986} + m_PrefabInstance: {fileID: 5309173593580639541} m_PrefabAsset: {fileID: 0} ---- !u!1001 &8629347071825754065 +--- !u!1001 &5888349638185763442 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 2814076563062444116} + m_TransformParent: {fileID: 4317834147708567278} m_Modifications: - - target: {fileID: 460203047818732930, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 144 objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 104 objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 460203047818732930, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 471896259363812078, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_AnchoredPosition.y + value: -1143 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 1952221633680236903, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: Platform - value: 4 + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6906796367924543454, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_Text + value: Arcade Old + objectReference: {fileID: 0} + - target: {fileID: 9003373412835913538, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_Text + value: "\u66F4\u53E4\u65E9\u7684\u8857\u673A\u5355\u72EC\u5206\u7C7B" + objectReference: {fileID: 0} + - target: {fileID: 9106117812833555594, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + propertyPath: m_Name + value: Arcade Old + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} +--- !u!224 &1735927827576127070 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: a5295d41d2c9aae41bfdf2c9c712074e, type: 3} + m_PrefabInstance: {fileID: 5888349638185763442} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &6754974452157174658 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7102897325704768026} + m_Modifications: + - target: {fileID: 632697230221148209, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Text + value: "\u8054\u673A" + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 200 objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_SizeDelta.y + value: 203 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: -664 objectReference: {fileID: 0} - - target: {fileID: 2512431393477943384, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} propertyPath: m_AnchoredPosition.y + value: -245 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 3127083372996404082, guid: 16523b967a6221241ab1109d556992f4, type: 3} - propertyPath: m_SizeDelta.x + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3189920797946144379, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Name + value: "\u8054\u673A" + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: ecce24ec6d4b5b546af85d64ba55a3a2, type: 3} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.x + value: 0.85 + objectReference: {fileID: 0} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.y + value: 0.85 + objectReference: {fileID: 0} + - target: {fileID: 8754483333502849411, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + propertyPath: m_LocalScale.z + value: 0.85 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + insertIndex: -1 + addedObject: {fileID: 3912891659551650779} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} +--- !u!224 &5045491097022569823 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + m_PrefabInstance: {fileID: 6754974452157174658} + m_PrefabAsset: {fileID: 0} +--- !u!224 &8176807569060777722 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 3226730524206505336, guid: ece591129eb9bcc48bd83ec153c98018, type: 3} + m_PrefabInstance: {fileID: 6754974452157174658} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &6883578444828758687 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 734025543935719296, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Text + value: "\u6536\u85CF" + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 144 objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 104 objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: -72 objectReference: {fileID: 0} - - target: {fileID: 3161584559533241995, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} propertyPath: m_AnchoredPosition.y + value: -207 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2619187604372594158, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 7637870703528583553, guid: a8e14774cb9b81d4799116466bc09437, type: 3} + - target: {fileID: 3189920797946144379, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Name + value: "\u6536\u85CF" + objectReference: {fileID: 0} + - target: {fileID: 3380485461544738227, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Text + value: "\u5C55\u793A\u6240\u6709\u5E73\u53F0\u6536\u85CF\u7684rom" + objectReference: {fileID: 0} + - target: {fileID: 5331629140490413834, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 7637870703528583553, guid: a8e14774cb9b81d4799116466bc09437, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} +--- !u!224 &4916857729186405442 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 2ab970ec87696e44a99fdd18821215fc, type: 3} + m_PrefabInstance: {fileID: 6883578444828758687} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &7167007059898459913 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 144 objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: -72 objectReference: {fileID: 0} - - target: {fileID: 5169807349761294599, guid: 16523b967a6221241ab1109d556992f4, type: 3} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} propertyPath: m_AnchoredPosition.y + value: -1923 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6906796367924543454, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_Text + value: SC-3000 + objectReference: {fileID: 0} + - target: {fileID: 9003373412835913538, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_Text + value: "SEGA Computer 3000\u200B" + objectReference: {fileID: 0} + - target: {fileID: 9106117812833555594, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + propertyPath: m_Name + value: SC-3000 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} +--- !u!224 &3086809728505469733 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 8fae89702697f0147bad6c542d95ae58, type: 3} + m_PrefabInstance: {fileID: 7167007059898459913} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &7250479423501819832 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 734025543935719296, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Text + value: NeoGeo + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_AnchoredPosition.y + value: -831 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2619187604372594158, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + - target: {fileID: 3189920797946144379, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Name + value: NeoGeo + objectReference: {fileID: 0} + - target: {fileID: 3380485461544738227, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Text + value: SNK NeoGeo + objectReference: {fileID: 0} + - target: {fileID: 5331629140490413834, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} +--- !u!224 &9161925335042560357 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: 7478117b6f7d6cb4cb8c0f5d56205ea1, type: 3} + m_PrefabInstance: {fileID: 7250479423501819832} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &7332605178436412274 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: - target: {fileID: 5305486536744057900, guid: 16523b967a6221241ab1109d556992f4, type: 3} propertyPath: m_Pivot.x value: 0 @@ -3784,7 +3261,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5305486536744057900, guid: 16523b967a6221241ab1109d556992f4, type: 3} propertyPath: m_AnchoredPosition.y - value: -1143 + value: -1455 objectReference: {fileID: 0} - target: {fileID: 5305486536744057900, guid: 16523b967a6221241ab1109d556992f4, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -3804,19 +3281,145 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 9003373412835913538, guid: 16523b967a6221241ab1109d556992f4, type: 3} propertyPath: m_Text - value: Nintendo Game Boy + value: Nintendo GAME BOY objectReference: {fileID: 0} - target: {fileID: 9106117812833555594, guid: 16523b967a6221241ab1109d556992f4, type: 3} propertyPath: m_Name - value: GameBoy + value: GAME BOY objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 16523b967a6221241ab1109d556992f4, type: 3} ---- !u!224 &4494951505442638845 stripped +--- !u!224 &3198253282780471134 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 5305486536744057900, guid: 16523b967a6221241ab1109d556992f4, type: 3} - m_PrefabInstance: {fileID: 8629347071825754065} + m_PrefabInstance: {fileID: 7332605178436412274} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &7345880936025361343 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4317834147708567278} + m_Modifications: + - target: {fileID: 734025543935719296, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 991446423622995247, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Text + value: NES + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_SizeDelta.x + value: 144 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_SizeDelta.y + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_AnchoredPosition.x + value: -72 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_AnchoredPosition.y + value: -363 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2619187604372594158, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + - target: {fileID: 3189920797946144379, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Name + value: NES + objectReference: {fileID: 0} + - target: {fileID: 3380485461544738227, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Text + value: Nintendo Entertainment System / Family Computer + objectReference: {fileID: 0} + - target: {fileID: 5331629140490413834, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Alpha + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6771349210554360888, guid: b170104e466853c49b29f9b5b103364e, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: b170104e466853c49b29f9b5b103364e, type: 3} +--- !u!224 &9100259551027709282 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1998281097548910301, guid: b170104e466853c49b29f9b5b103364e, type: 3} + m_PrefabInstance: {fileID: 7345880936025361343} m_PrefabAsset: {fileID: 0} diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ArcadeOld_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ArcadeOld_Template.prefab new file mode 100644 index 00000000..107f002e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ArcadeOld_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_ArcadeOld_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 30 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ArcadeOld_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ArcadeOld_Template.prefab.meta new file mode 100644 index 00000000..284d1bb8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ArcadeOld_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a5295d41d2c9aae41bfdf2c9c712074e +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ColecoVision_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ColecoVision_Template.prefab new file mode 100644 index 00000000..7b5305c0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ColecoVision_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_ColecoVision_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 6 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ColecoVision_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ColecoVision_Template.prefab.meta new file mode 100644 index 00000000..221a0678 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_ColecoVision_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 146c51253379ea34cb1e979eb56072b1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoyColor_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoyColor_Template.prefab new file mode 100644 index 00000000..a6dfe55d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoyColor_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_GameBoyColor_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 5 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoyColor_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoyColor_Template.prefab.meta new file mode 100644 index 00000000..4e917037 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoyColor_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c73ba8d34c204a5408505f72df70da0b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoy_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoy_Template.prefab index 11e7d622..75f8d301 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoy_Template.prefab +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameBoy_Template.prefab @@ -1105,7 +1105,7 @@ MonoBehaviour: UnSelectScale: 1 RomGroupRoot: {fileID: 8704788976101297821} StarRom: 0 - Platform: 2 + Platform: 4 SearchKey: --- !u!114 &2091811895805808559 MonoBehaviour: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameGear_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameGear_Template.prefab new file mode 100644 index 00000000..b2eba1c9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameGear_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_GameGear_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 3 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameGear_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameGear_Template.prefab.meta new file mode 100644 index 00000000..ef2b10df --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_GameGear_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9d1d397edc91f544b917d31d56f7074b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SC3000_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SC3000_Template.prefab new file mode 100644 index 00000000..fd63608e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SC3000_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_SC3000_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 7 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SC3000_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SC3000_Template.prefab.meta new file mode 100644 index 00000000..c7c1d584 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SC3000_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8fae89702697f0147bad6c542d95ae58 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SG1000_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SG1000_Template.prefab new file mode 100644 index 00000000..bdcc53f7 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SG1000_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_SG1000_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 8 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SG1000_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SG1000_Template.prefab.meta new file mode 100644 index 00000000..9a84bc19 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_SG1000_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a2a595dedf34bfe4f970da5fcaaa0283 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Color_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Color_Template.prefab new file mode 100644 index 00000000..651daa50 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Color_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_Wonder_Swan_Color_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 41 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Color_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Color_Template.prefab.meta new file mode 100644 index 00000000..7665d43a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Color_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 017a4e122916b0c489123671b06d9ea7 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Template.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Template.prefab new file mode 100644 index 00000000..bd60a298 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Template.prefab @@ -0,0 +1,1129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &547097114322157613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2959939562593878400} + - component: {fileID: 437203712799690500} + - component: {fileID: 4882225280214010061} + m_Layer: 5 + m_Name: RomGroup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2959939562593878400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5615390190915218624} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &437203712799690500 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdacbe30e88f6a844a435595a4affdbb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 500, y: 200} + m_Spacing: {x: 0, y: 20} + m_Constraint: 1 + m_ConstraintCount: 1 + ItemTemplate: {fileID: 1998281097548910301, guid: e6df0d7c236795247971f0d1e691b068, type: 3} + ViewRect: {fileID: 5615390190915218624} + PauseUpdateView: 0 +--- !u!114 &4882225280214010061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 547097114322157613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1731000361478154045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471896259363812078} + - component: {fileID: 4047536162787520316} + - component: {fileID: 6906796367924543454} + - component: {fileID: 7379165731187569985} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471896259363812078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &4047536162787520316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_CullTransparentMesh: 1 +--- !u!114 &6906796367924543454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: NAME +--- !u!114 &7379165731187569985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731000361478154045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &2384302913435809247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3127083372996404082} + - component: {fileID: 6945246414914211772} + - component: {fileID: 6172144285760254677} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3127083372996404082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460203047818732930} + - {fileID: 3161584559533241995} + m_Father: {fileID: 5305486536744057900} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 130} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6945246414914211772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &6172144285760254677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2384302913435809247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!1 &3538343756569101823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5169807349761294599} + - component: {fileID: 7825479500896033466} + - component: {fileID: 7987100532788937847} + - component: {fileID: 4168298989964156774} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5169807349761294599 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7825479500896033466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_CullTransparentMesh: 1 +--- !u!114 &7987100532788937847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4168298989964156774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3538343756569101823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5385582025794088653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460203047818732930} + - component: {fileID: 3728605797866308165} + - component: {fileID: 1144802487456110281} + - component: {fileID: 7017134925330126122} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460203047818732930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4631375053668232476} + - {fileID: 6233968584065934053} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &3728605797866308165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_CullTransparentMesh: 1 +--- !u!114 &1144802487456110281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7017134925330126122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5385582025794088653} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 144 + m_PreferredHeight: 104 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &5418383961348466497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8062875795445748770} + - component: {fileID: 2662717078255122285} + - component: {fileID: 3625047787372487136} + m_Layer: 5 + m_Name: SelectArrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8062875795445748770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 63, y: 70} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2662717078255122285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_CullTransparentMesh: 1 +--- !u!114 &3625047787372487136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5418383961348466497} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1023481969782777897, guid: d518d00d4940e854bbe45d9ef891401a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5941102631143440070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2512431393477943384} + - component: {fileID: 8619900709659458996} + - component: {fileID: 9003373412835913538} + - component: {fileID: 598358273028336866} + m_Layer: 5 + m_Name: Descript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2512431393477943384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3161584559533241995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 33} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8619900709659458996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_CullTransparentMesh: 1 +--- !u!114 &9003373412835913538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: SNK NeoGeo +--- !u!114 &598358273028336866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5941102631143440070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfabb0440166ab443bba8876756fdfa9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.3137255} + m_EffectDistance: {x: 3, y: -3} + m_UseGraphicAlpha: 1 +--- !u!1 &6355781530872251761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4631375053668232476} + - component: {fileID: 178555959028296911} + - component: {fileID: 8521572219737141023} + - component: {fileID: 5380294627991656309} + - component: {fileID: 7817320956777133495} + - component: {fileID: 5660897083404887179} + m_Layer: 5 + m_Name: shadowIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4631375053668232476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &178555959028296911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_CullTransparentMesh: 1 +--- !u!114 &8521572219737141023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b12ca21105df97a469be3cf97a4f5fc1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5380294627991656309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8b2ed11d675446c5a49da1ea296d490, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 300 + m_EffectMaterial: {fileID: 21305736874167728, guid: aee96bc531e6eba468ec405e536f515f, type: 2} + m_EffectFactor: 0 + m_ColorFactor: 0 + m_BlurFactor: 0 + m_EffectMode: 0 + m_ColorMode: 1 + m_BlurMode: 3 + m_AdvancedBlur: 1 + m_ShadowBlur: 1 + m_ShadowStyle: 0 + m_ShadowColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_AdditionalShadows: [] +--- !u!114 &7817320956777133495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_BlurFactor: 1 + m_Style: 3 + m_AdditionalShadows: [] + m_EffectColor: {r: 1, g: 1, b: 1, a: 0} + m_EffectDistance: {x: 8, y: 8} + m_UseGraphicAlpha: 0 +--- !u!95 &5660897083404887179 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6355781530872251761} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0b3ccf7414d2ead43be0cd33b6e1b53c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &7067879617774535778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5615390190915218624} + - component: {fileID: 889923332512703221} + - component: {fileID: 1675349766756430658} + m_Layer: 5 + m_Name: viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5615390190915218624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2959939562593878400} + m_Father: {fileID: 6233968584065934053} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &889923332512703221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_CullTransparentMesh: 1 +--- !u!114 &1675349766756430658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7067879617774535778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7311425894574767944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3161584559533241995} + - component: {fileID: 9167458784761723490} + - component: {fileID: 2010379511303345659} + - component: {fileID: 1744265074350971135} + m_Layer: 5 + m_Name: InfoNode + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3161584559533241995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 471896259363812078} + - {fileID: 5169807349761294599} + - {fileID: 2512431393477943384} + m_Father: {fileID: 3127083372996404082} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9167458784761723490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &2010379511303345659 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1744265074350971135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7311425894574767944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 600 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7421823347209277103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6233968584065934053} + - component: {fileID: 9045566912386895324} + - component: {fileID: 1354521528220721166} + - component: {fileID: 8704788976101297821} + m_Layer: 5 + m_Name: RomGroupScroll + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6233968584065934053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5615390190915218624} + - {fileID: 8062875795445748770} + m_Father: {fileID: 460203047818732930} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0.000015258789, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &9045566912386895324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2959939562593878400} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 0 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5615390190915218624} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1354521528220721166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d1e3e91ac34bc8468f357ee247ffb6a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_menuItemRoot: {fileID: 0} + SubMenuItemTemplate: {fileID: 0} + alphaGroup: {fileID: 0} + m_selectItemPosition: {x: 50, y: -51} + step: 50 + splitStep: 200 + m_selectArrow: {fileID: 8062875795445748770} + ArrowOffset: 60 + WidthFix: 280 + itemGroup: {fileID: 437203712799690500} + srollRect: {fileID: 9045566912386895324} +--- !u!225 &8704788976101297821 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7421823347209277103} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &9106117812833555594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5305486536744057900} + - component: {fileID: 1952221633680236903} + - component: {fileID: 2091811895805808559} + m_Layer: 5 + m_Name: Game_Wonder_Swan_Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5305486536744057900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3127083372996404082} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -72, y: -831} + m_SizeDelta: {x: 144, y: 104} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1952221633680236903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2f2e38adaa854144b67512333b1b363, type: 3} + m_Name: + m_EditorClassIdentifier: + Icon: {fileID: 1144802487456110281} + Txt: {fileID: 6906796367924543454} + SubTitle: {fileID: 0} + spline: {fileID: 0} + Descript: {fileID: 9003373412835913538} + Root: {fileID: 3127083372996404082} + ShadowIcon: {fileID: 8521572219737141023} + InfoNode: {fileID: 2010379511303345659} + SubMenuItemGroup: {fileID: 1354521528220721166} + SelectScale: 1 + UnSelectScale: 1 + RomGroupRoot: {fileID: 8704788976101297821} + StarRom: 0 + Platform: 40 + SearchKey: +--- !u!114 &2091811895805808559 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9106117812833555594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: 230 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Template.prefab.meta b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Template.prefab.meta new file mode 100644 index 00000000..c6887046 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/SubMenuItemTemplates/Game_Wonder_Swan_Template.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6b9cf0040ec05e742aa8ca739b5f6adf +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxibugEmuOnline.Client.asmdef b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxibugEmuOnline.Client.asmdef index 4c67b1ed..81c9246d 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/AxibugEmuOnline.Client.asmdef +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/AxibugEmuOnline.Client.asmdef @@ -6,9 +6,9 @@ "VirtualNes.Core", "UIEffect2018", "Mame.Core", - "Essgee.Unity", - "Unity.InputSystem" - ], + "Essgee.Unity" + "StoicGooseUnity" + "Unity.InputSystem" ], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": true, diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/EssgeeEmulator/UEssgee.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/EssgeeEmulator/UEssgee.cs index 57ad9e97..aeca7de5 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/EssgeeEmulator/UEssgee.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/EssgeeEmulator/UEssgee.cs @@ -38,7 +38,7 @@ public class UEssgee : MonoBehaviour, IEmuCore UEGSoundPlayer soundHandler; GameMetadataHandler gameMetadataHandler; GameMetadata lastGameMetadata; - EmulatorHandler emulatorHandler; + Essgee.Emulation.EmulatorHandler emulatorHandler; UEGResources uegResources; UEGLog uegLog; UEGSaveByteConvert uegSaveByteConvert; @@ -297,7 +297,7 @@ public class UEssgee : MonoBehaviour, IEmuCore // EmuStandInfo.Configuration.SerializeToFile(EmuStandInfo.programConfigPath); //} - EmuStandInfo.Configuration = new Configuration(); + EmuStandInfo.Configuration = new Essgee.Configuration(); List<Type> machineType = new List<Type>(); machineType.Add(typeof(GameBoy)); @@ -505,7 +505,7 @@ public class UEssgee : MonoBehaviour, IEmuCore if (emulatorHandler != null) ShutdownEmulation(); - emulatorHandler = new EmulatorHandler(machineType, ExceptionHandler, uegSaveByteConvert); + emulatorHandler = new Essgee.Emulation.EmulatorHandler(machineType, ExceptionHandler, uegSaveByteConvert); emulatorHandler.Initialize(); emulatorHandler.SendLogMessage += EmulatorHandler_SendLogMessage; diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UMAME.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UMAME.cs index 11365705..950fea83 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UMAME.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/MameEmulator/UMAME.cs @@ -43,10 +43,6 @@ public class UMAME : MonoBehaviour, IEmuCore public uint Frame => (uint)emu.currEmuFrame; void Awake() { - //设为60帧 - App.tick.SetFrameRate(60); - // 强制横屏 - Screen.orientation = ScreenOrientation.LandscapeLeft; instance = this; mFPS = GameObject.Find("FPS").GetComponent<Text>(); mCanvas = GameObject.Find("Canvas").GetComponent<Canvas>(); diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator.meta new file mode 100644 index 00000000..8d46363a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 218c1e917c9305445b77d6ee8c43c78f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common.meta new file mode 100644 index 00000000..a3932718 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 27413e559e2279046810313f807b4880 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/Configuration.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/Configuration.cs new file mode 100644 index 00000000..45b2bfb1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/Configuration.cs @@ -0,0 +1,89 @@ +using StoicGoose.Common.Utilities; +using System.Collections.Generic; + + +public sealed class Configuration : ConfigurationBase<Configuration> +{ + //[DisplayName("General")] + //[Description("General settings.")] + public GeneralConfiguration General { get; set; } = new GeneralConfiguration(); + //[DisplayName("Video")] + //[Description("Settings related to video output.")] + public VideoConfiguration Video { get; set; } = new VideoConfiguration(); + //[DisplayName("Sound")] + //[Description("Settings related to sound output.")] + public SoundConfiguration Sound { get; set; } = new SoundConfiguration(); + //[DisplayName("Input")] + //[Description("Settings related to emulation input.")] + public InputConfiguration Input { get; set; } = new InputConfiguration(); +} + +public sealed class GeneralConfiguration : ConfigurationBase<GeneralConfiguration> +{ + //[DisplayName("Prefer Original WS")] + //[Description("Prefer emulation of the original non-Color system.")] + public bool PreferOriginalWS { get; set; } = false; + //[DisplayName("Use Bootstrap ROM")] + //[Description("Toggle using WonderSwan bootstrap ROM images.")] + public bool UseBootstrap { get; set; } = false; + //[DisplayName("WS Bootstrap ROM Path")] + //[Description("Path to the WonderSwan bootstrap ROM image to use.")] + public string BootstrapFile { get; set; } = string.Empty; + //[DisplayName("WSC Bootstrap ROM Path")] + //[Description("Path to the WonderSwan Color bootstrap ROM image to use.")] + public string BootstrapFileWSC { get; set; } = string.Empty; + //[DisplayName("Limit FPS")] + //[Description("Toggle limiting the framerate to the system's native ~75.47 Hz.")] + public bool LimitFps { get; set; } = true; + //[DisplayName("Enable Cheats")] + //[Description("Toggle using the cheat system.")] + public bool EnableCheats { get; set; } = true; + //[DisplayName("Recent Files")] + //[Description("List of recently loaded files.")] + //public List<string> RecentFiles { get; set; } = new List<string>(15); +} + +public sealed class VideoConfiguration : ConfigurationBase<VideoConfiguration> +{ + //[DisplayName("Screen Size")] + //[Description("Size of the emulated screen, in times original display resolution.")] + public int ScreenSize { get; set; } = 3; + //[DisplayName("Shader")] + //[Description("Currently selected shader.")] + public string Shader { get; set; } = string.Empty; + //[DisplayName("Brightness")] + //[Description("Adjust the brightness of the emulated screen, in percent.")] + //[Range(-100, 100)] + public int Brightness { get; set; } = 0; + //[DisplayName("Contrast")] + //[Description("Adjust the contrast of the emulated screen, in percent.")] + //[Range(0, 200)] + public int Contrast { get; set; } = 100; + //[DisplayName("Saturation")] + //[Description("Adjust the saturation of the emulated screen, in percent.")] + //[Range(0, 200)] + public int Saturation { get; set; } = 100; +} + +public sealed class SoundConfiguration : ConfigurationBase<SoundConfiguration> +{ + //[DisplayName("Mute")] + //[Description("Toggles muting all sound output.")] + public bool Mute { get; set; } = false; + //[DisplayName("Low-Pass Filter")] + //[Description("Toggles low-pass filter for all sound output.")] + public bool LowPassFilter { get; set; } = true; +} + +public sealed class InputConfiguration : ConfigurationBase<InputConfiguration> +{ + //[DisplayName("Automatic Remapping")] + //[Description("Automatically remap X-/Y-pads with game orientation.")] + public bool AutoRemap { get; set; } = true; + //[DisplayName("Game Controls")] + //[Description("Controls related to game input, i.e. X-/Y-pads, etc.")] + public Dictionary<string, List<string>> GameControls { get; set; } = new Dictionary<string, List<string>>(); + //[DisplayName("System Controls")] + //[Description("Controls related to hardware functions, i.e. volume button.")] + public Dictionary<string, List<string>> SystemControls { get; set; } = new Dictionary<string, List<string>>(); +} diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/Configuration.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/Configuration.cs.meta new file mode 100644 index 00000000..e43254f8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/Configuration.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ee0a5e22651983e479915e5429079d99 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/GlobalVariables.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/GlobalVariables.cs new file mode 100644 index 00000000..e493c9ba --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/GlobalVariables.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Reflection; + + +public static class GlobalVariables +{ + public static readonly bool IsAuthorsMachine = System.Environment.MachineName == "KAMIKO"; +#if DEBUG + public static readonly bool IsDebugBuild = true; +#else + public static readonly bool IsDebugBuild = false; +#endif + public static readonly bool EnableLocalDebugIO = IsAuthorsMachine; + + public static readonly bool EnableSuperVerbosity = false; + public static readonly bool EnableOpenGLDebug = false; + + public static readonly bool EnableSkipBootstrapIfFound = false; + + public static string[] Dump() + { + var vars = new List<string>(); + foreach (var fieldInfo in typeof(GlobalVariables).GetFields(BindingFlags.Static | BindingFlags.Public)) + vars.Add($"{fieldInfo.Name} == {fieldInfo.GetValue(null)}"); + return vars.ToArray(); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/GlobalVariables.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/GlobalVariables.cs.meta new file mode 100644 index 00000000..b35cc907 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Common/GlobalVariables.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 043ec2227e850204faefe0ce10f2ae04 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle.meta new file mode 100644 index 00000000..e67f73d3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cb360a28c0621034ea0d310e18e5a747 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/DatabaseHandler.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/DatabaseHandler.cs new file mode 100644 index 00000000..01953a32 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/DatabaseHandler.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml; +using System.Xml.Serialization; +using StoicGoose.Common.Utilities; + +public sealed class DatabaseHandler +{ + readonly Dictionary<string, DatFile> datFiles = new(); + const string ResourceRoot = "StoicGooseUnity/emu/"; + + public DatabaseHandler() + { + { + string wsc = "Bandai - WonderSwan Color.dat"; + GetDatBytes(wsc, out byte[] loadedData); + using (MemoryStream stream = new MemoryStream(loadedData)) + { + var root = new XmlRootAttribute("datafile") { IsNullable = true }; + var serializer = new XmlSerializer(typeof(DatFile), root); + var reader = XmlReader.Create(stream, new() { DtdProcessing = DtdProcessing.Ignore }); + datFiles.Add(Path.GetFileName(wsc), (DatFile)serializer.Deserialize(reader)); + } + } + + { + string ws = "Bandai - WonderSwan.dat"; + GetDatBytes(ws, out byte[] loadedData); + using (MemoryStream stream = new MemoryStream(loadedData)) + { + var root = new XmlRootAttribute("datafile") { IsNullable = true }; + var serializer = new XmlSerializer(typeof(DatFile), root); + var reader = XmlReader.Create(stream, new() { DtdProcessing = DtdProcessing.Ignore }); + datFiles.Add(Path.GetFileName(ws), (DatFile)serializer.Deserialize(reader)); + } + } + + Log.WriteEvent(LogSeverity.Information, this, $"Loaded {datFiles.Count} .dat file(s) with {datFiles.Sum(x => x.Value.Game.Length)} known game(s)."); + foreach (var datFile in datFiles.Select(x => x.Value)) + Log.WriteLine($" '{datFile.Header.Name} ({datFile.Header.Version})' from {datFile.Header.Homepage}"); + } + + bool GetDatBytes(string DatName, out byte[] loadedData) + { + try + { + loadedData = UnityEngine.Resources.Load<UnityEngine.TextAsset>(ResourceRoot + "Dat/" + DatName).bytes; + return true; + } + catch + { + loadedData = null; + return false; + } + } + + private DatGame GetGame(uint romCrc32, int romSize) + { + return datFiles.Select(x => x.Value.Game).Select(x => x.FirstOrDefault(x => x.Rom.Any(y => y.Crc.ToLowerInvariant() == $"{romCrc32:x8}" && y.Size.ToLowerInvariant() == $"{romSize:D}"))).FirstOrDefault(x => x != null); + } + + public string GetGameTitle(uint romCrc32, int romSize) + { + return GetGame(romCrc32, romSize)?.Name.Replace("&", "&&") ?? "unrecognized game"; + } + + public class DatHeader + { + [XmlElement("name")] + public string Name { get; set; } + [XmlElement("description")] + public string Description { get; set; } + [XmlElement("category")] + public string Category { get; set; } + [XmlElement("version")] + public string Version { get; set; } + [XmlElement("date")] + public string Date { get; set; } + [XmlElement("author")] + public string Author { get; set; } + [XmlElement("email")] + public string Email { get; set; } + [XmlElement("homepage")] + public string Homepage { get; set; } + [XmlElement("url")] + public string Url { get; set; } + [XmlElement("comment")] + public string Comment { get; set; } + } + + public class DatRelease + { + [XmlAttribute("name")] + public string Name { get; set; } + [XmlAttribute("region")] + public string Region { get; set; } + [XmlAttribute("language")] + public string Language { get; set; } + [XmlAttribute("date")] + public string Date { get; set; } + [XmlAttribute("default")] + public string Default { get; set; } + } + + public class DatBiosSet + { + [XmlAttribute("name")] + public string Name { get; set; } + [XmlAttribute("description")] + public string Description { get; set; } + [XmlAttribute("default")] + public string Default { get; set; } + } + + public class DatRom + { + [XmlAttribute("name")] + public string Name { get; set; } + [XmlAttribute("size")] + public string Size { get; set; } + [XmlAttribute("crc")] + public string Crc { get; set; } + [XmlAttribute("sha1")] + public string Sha1 { get; set; } + [XmlAttribute("md5")] + public string Md5 { get; set; } + [XmlAttribute("merge")] + public string Merge { get; set; } + [XmlAttribute("status")] + public string Status { get; set; } + [XmlAttribute("date")] + public string Date { get; set; } + } + + public class DatDisk + { + [XmlAttribute("name")] + public string Name { get; set; } + [XmlAttribute("sha1")] + public string Sha1 { get; set; } + [XmlAttribute("md5")] + public string Md5 { get; set; } + [XmlAttribute("merge")] + public string Merge { get; set; } + [XmlAttribute("status")] + public string Status { get; set; } + } + + public class DatSample + { + [XmlAttribute("name")] + public string Name { get; set; } + } + + public class DatArchive + { + [XmlAttribute("name")] + public string Name { get; set; } + } + + public class DatGame + { + [XmlAttribute("name")] + public string Name { get; set; } + [XmlAttribute("sourcefile")] + public string SourceFile { get; set; } + [XmlAttribute("isbios")] + public string IsBios { get; set; } + [XmlAttribute("cloneof")] + public string CloneOf { get; set; } + [XmlAttribute("romof")] + public string RomOf { get; set; } + [XmlAttribute("sampleof")] + public string SampleOf { get; set; } + [XmlAttribute("board")] + public string Board { get; set; } + [XmlAttribute("rebuildto")] + public string RebuildTo { get; set; } + + [XmlElement("year")] + public string Year { get; set; } + [XmlElement("manufacturer")] + public string Manufacturer { get; set; } + + [XmlElement("release")] + public DatRelease[] Release { get; set; } + + [XmlElement("biosset")] + public DatBiosSet[] BiosSet { get; set; } + + [XmlElement("rom")] + public DatRom[] Rom { get; set; } + + [XmlElement("disk")] + public DatDisk[] Disk { get; set; } + + [XmlElement("sample")] + public DatSample[] Sample { get; set; } + + [XmlElement("archive")] + public DatArchive[] Archive { get; set; } + } + + [Serializable()] + public class DatFile + { + [XmlElement("header")] + public DatHeader Header { get; set; } + + [XmlElement("game")] + public DatGame[] Game { get; set; } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/DatabaseHandler.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/DatabaseHandler.cs.meta new file mode 100644 index 00000000..8dcc4098 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/DatabaseHandler.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 28105de94482c1643b7398d0bbb32af2 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/EmulatorHandler.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/EmulatorHandler.cs new file mode 100644 index 00000000..cb268120 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/EmulatorHandler.cs @@ -0,0 +1,133 @@ +using StoicGoose.Core.Interfaces; +using StoicGooseUnity; +using System; +using System.Diagnostics; +using System.Threading; + +public class EmulatorHandler +{ + readonly static string threadName = $"Unity_Emulation"; + + //Thread thread = default; + volatile bool threadRunning = false, threadPaused = false; + + volatile bool isResetRequested = false; + volatile bool isPauseRequested = false, newPauseState = false; + volatile bool isFpsLimiterChangeRequested = false, limitFps = true, newLimitFps = false; + + public bool IsRunning => threadRunning; + public bool IsPaused => threadPaused; + + public IMachine Machine { get; } = default; + public int AxiEmuRunFrame { get; private set; } + + public EmulatorHandler(Type machineType) + { + StoicGooseUnityAxiMem.Init(); + Machine = Activator.CreateInstance(machineType) as IMachine; + Machine.Initialize(); + } + + public void Startup() + { + Machine.Reset(); + + threadRunning = true; + threadPaused = false; + + //thread = new Thread(ThreadMainLoop) { Name = threadName, Priority = ThreadPriority.AboveNormal, IsBackground = false }; + //thread.Start(); + AxiEmuRunFrame = 0; + } + + public void Reset() + { + isResetRequested = true; + } + + public void Pause() + { + isPauseRequested = true; + newPauseState = true; + } + + public void Unpause() + { + isPauseRequested = true; + newPauseState = false; + } + + public void Shutdown() + { + threadRunning = false; + threadPaused = false; + //thread?.Join(); + Machine.Shutdown(); + StoicGooseUnityAxiMem.FreeAllGCHandle(); + } + + public void SetFpsLimiter(bool value) + { + isFpsLimiterChangeRequested = true; + newLimitFps = value; + } + + private void ThreadMainLoop() + { + var stopWatch = Stopwatch.StartNew(); + var interval = 1000.0 / Machine.RefreshRate; + var lastTime = 0.0; + + while (true) + { + if (!threadRunning) break; + + if (isResetRequested) + { + Machine.Reset(); + stopWatch.Restart(); + lastTime = 0.0; + + isResetRequested = false; + } + + if (isPauseRequested) + { + threadPaused = newPauseState; + isPauseRequested = false; + } + + if (isFpsLimiterChangeRequested) + { + limitFps = newLimitFps; + isFpsLimiterChangeRequested = false; + } + + if (!threadPaused) + { + if (limitFps) + { + while ((stopWatch.Elapsed.TotalMilliseconds - lastTime) < interval) + Thread.Sleep(0); + + lastTime += interval; + } + else + lastTime = stopWatch.Elapsed.TotalMilliseconds; + + Machine.RunFrame(); + } + else + lastTime = stopWatch.Elapsed.TotalMilliseconds; + } + } + + public void Frame_Update() + { + if (!threadRunning || !threadPaused) + return; + + Machine.RunFrame(); + AxiEmuRunFrame++; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/EmulatorHandler.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/EmulatorHandler.cs.meta new file mode 100644 index 00000000..4aa9582a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/EmulatorHandler.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: da891d0a5babf7649992f83861f6f33d \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface.meta new file mode 100644 index 00000000..e736b368 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8193f4d4ec66bb441b59f6549e95e013 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGKeyboard.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGKeyboard.cs new file mode 100644 index 00000000..716f8f5d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGKeyboard.cs @@ -0,0 +1,52 @@ +using StoicGooseUnity; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +public class SGKeyboard : MonoBehaviour +{ + Dictionary<KeyCode, StoicGooseKey> dictKey2SGKey = new Dictionary<KeyCode, StoicGooseKey>(); + KeyCode[] checkKeys; + long currInput; + private void Awake() + { + SetVerticalOrientation(false); + } + + + internal void PollInput(ref long buttonsHeld) + { + buttonsHeld = currInput; + } + + internal void SetVerticalOrientation(bool isVerticalOrientation) + { + dictKey2SGKey[KeyCode.Return] = StoicGooseKey.Start; + dictKey2SGKey[KeyCode.W] = StoicGooseKey.X1; + dictKey2SGKey[KeyCode.S] = StoicGooseKey.X2; + dictKey2SGKey[KeyCode.A] = StoicGooseKey.X3; + dictKey2SGKey[KeyCode.D] = StoicGooseKey.X4; + dictKey2SGKey[KeyCode.G] = StoicGooseKey.Y1; + dictKey2SGKey[KeyCode.V] = StoicGooseKey.Y2; + dictKey2SGKey[KeyCode.C] = StoicGooseKey.Y3; + dictKey2SGKey[KeyCode.B] = StoicGooseKey.Y4; + dictKey2SGKey[KeyCode.Return] = StoicGooseKey.Start; + dictKey2SGKey[KeyCode.J] = StoicGooseKey.B; + dictKey2SGKey[KeyCode.K] = StoicGooseKey.A; + checkKeys = dictKey2SGKey.Keys.ToArray(); + } + + public void Update_InputData() + { + currInput = 0; + for (int i = 0; i < checkKeys.Length; i++) + { + KeyCode key = checkKeys[i]; + if (Input.GetKey(key)) + { + currInput |= (long)dictKey2SGKey[key]; + } + } + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGKeyboard.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGKeyboard.cs.meta new file mode 100644 index 00000000..6d44ae03 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGKeyboard.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 54c184e653057e64da4b9be96f4d876d \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGLogger.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGLogger.cs new file mode 100644 index 00000000..19fcea2e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGLogger.cs @@ -0,0 +1,36 @@ +using StoicGoose.Common.Utilities; +using System; + +public class SGLogger : IStoicGooseLogger +{ + public void Debug(string message) + { + UnityEngine.Debug.Log(message); + } + + public void Err(string message) + { + UnityEngine.Debug.LogError(message); + } + + public void Log(StoicGoose.Common.Utilities.LogType logtype, string message) + { + switch (logtype) + { + case LogType.Debug: + Debug(message); + break; + case LogType.Warning: + Warning(message); + break; + case LogType.Error: + Err(message); + break; + } + } + + public void Warning(string message) + { + UnityEngine.Debug.LogWarning(message); + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGLogger.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGLogger.cs.meta new file mode 100644 index 00000000..9ac0db44 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGLogger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e9f99144ff5ead44297997370fab702c \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGSoundPlayer.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGSoundPlayer.cs new file mode 100644 index 00000000..11279d35 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGSoundPlayer.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +public class SGSoundPlayer : MonoBehaviour//, ISoundPlayer +{ + [SerializeField] + private AudioSource m_as; + private RingBuffer<float> _buffer = new RingBuffer<float>(44100 * 2); + private TimeSpan lastElapsed; + public double audioFPS { get; private set; } + + void Awake() + { + // ��ȡ��ǰ��Ƶ���� + AudioConfiguration config = AudioSettings.GetConfiguration(); + + // ����Ŀ����Ƶ���� + config.sampleRate = 44100; // ������Ϊ 44100Hz + config.numRealVoices = 32; // ���������ƵԴ��������ѡ�� + config.numVirtualVoices = 512; // ����������ƵԴ��������ѡ�� + config.dspBufferSize = 1024; // ���� DSP ��������С����ѡ�� + config.speakerMode = AudioSpeakerMode.Stereo; // ����Ϊ��������2 ������ + + // Ӧ���µ���Ƶ���� + if (AudioSettings.Reset(config)) + { + Debug.Log("Audio settings updated successfully."); + Debug.Log("Sample Rate: " + config.sampleRate + "Hz"); + Debug.Log("Speaker Mode: " + config.speakerMode); + } + else + { + Debug.LogError("Failed to update audio settings."); + } + + } + + private Queue<float> sampleQueue = new Queue<float>(); + + + // Unity ��Ƶ�̻߳ص� + void OnAudioFilterRead(float[] data, int channels) + { + for (int i = 0; i < data.Length; i++) + { + if (_buffer.TryRead(out float rawData)) + data[i] = rawData; + else + data[i] = 0; // ������ʱ���� + } + } + + + public void Initialize() + { + if (!m_as.isPlaying) + { + m_as.Play(); + } + } + + public void StopPlay() + { + if (m_as.isPlaying) + { + m_as.Stop(); + } + } + + //public void SubmitSamples(short[] buffer, short[][] ChannelSamples, int samples_a) + //{ + // var current = UStoicGoose.sw.Elapsed; + // var delta = current - lastElapsed; + // lastElapsed = current; + // audioFPS = 1d / delta.TotalSeconds; + + // for (int i = 0; i < samples_a; i += 1) + // { + // _buffer.Write(buffer[i] / 32767.0f); + + // } + //} + public void BufferWirte(int Off, byte[] Data) + { + } + + public void GetCurrentPosition(out int play_position, out int write_position) + { + play_position = 0; + write_position = 0; + } + + public void SetVolume(int Vol) + { + //TODO ���� + if (m_as) + return; + m_as.volume = Vol; + } + + + internal void EnqueueSamples(short[] buffer) + { + var current = UStoicGoose.sw.Elapsed; + var delta = current - lastElapsed; + lastElapsed = current; + audioFPS = 1d / delta.TotalSeconds; + + for (int i = 0; i < buffer.Length; i += 1) + { + _buffer.Write(buffer[i] / 32767.0f); + } + } + + internal void Unpause() + { + throw new NotImplementedException(); + } + + internal void Pause() + { + throw new NotImplementedException(); + } + +} diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGSoundPlayer.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGSoundPlayer.cs.meta new file mode 100644 index 00000000..f4fa8e10 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGSoundPlayer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 925771571ae9709429297d42587ce36d \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGVideoPlayer.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGVideoPlayer.cs new file mode 100644 index 00000000..0c663ea9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGVideoPlayer.cs @@ -0,0 +1,113 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +public class SGVideoPlayer : MonoBehaviour +{ + + [SerializeField] + private int mWidth; + [SerializeField] + private int mHeight; + [SerializeField] + private int mDataLenght; + [SerializeField] + private Texture2D m_rawBufferWarper; + [SerializeField] + private RawImage m_drawCanvas; + [SerializeField] + private RectTransform m_drawCanvasrect; + //byte[] mFrameData; + IntPtr mFrameDataPtr; + public Texture2D rawBufferWarper => m_rawBufferWarper; + public RawImage DrawCanvas => m_drawCanvas; + private TimeSpan lastElapsed; + public double videoFPS { get; private set; } + public ulong mFrame { get; private set; } + bool bInit = false; + bool bHadData = false; + + private void Awake() + { + bHadData = false; + mFrame = 0; + m_drawCanvas = GameObject.Find("GameRawImage").GetComponent<RawImage>(); + m_drawCanvasrect = m_drawCanvas.GetComponent<RectTransform>(); + } + + public void Initialize() + { + m_drawCanvas.color = Color.white; + + if (m_rawBufferWarper == null) + { + mDataLenght = mWidth * mHeight * 4; + //mFrameData = new byte[mDataLenght]; + + //// �̶����飬��ֹ�����������ƶ��� + //var bitmapcolorRect_handle = GCHandle.Alloc(mFrameData, GCHandleType.Pinned); + //// ��ȡ�����ָ�� + //mFrameDataPtr = bitmapcolorRect_handle.AddrOfPinnedObject(); + + + //MAME������BGRA32���úú� + m_rawBufferWarper = new Texture2D(mWidth, mHeight, TextureFormat.BGRA32, false); + //m_rawBufferWarper = new Texture2D(mWidth, mHeight, TextureFormat.ARGB32, false); + m_rawBufferWarper.filterMode = FilterMode.Point; + } + + //mFrameDataPtr = framePtr; + m_drawCanvas.texture = m_rawBufferWarper; + bInit = true; + + float targetWidth = ((float)mWidth / mHeight) * m_drawCanvasrect.rect.height; + m_drawCanvasrect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, targetWidth); + } + + public void StopVideo() + { + bInit = false; + m_drawCanvas.color = new Color(0, 0, 0, 0); + } + + void Update() + { + if (!bHadData + || + !UStoicGoose.instance.emulatorHandler.IsRunning) + return; + + if (!bInit) + { + Initialize(); + return; + } + m_rawBufferWarper.LoadRawTextureData(mFrameDataPtr, mDataLenght); + m_rawBufferWarper.Apply(); + } + + + public byte[] GetScreenImg() + { + return (m_drawCanvas.texture as Texture2D).EncodeToJPG(); + } + + public bool IsVerticalOrientation { get; internal set; } + + internal void UpdateScreen(IntPtr ptr, long frame_number) + { + var current = UStoicGoose.sw.Elapsed; + var delta = current - lastElapsed; + lastElapsed = current; + videoFPS = 1d / delta.TotalSeconds; + mFrameDataPtr = ptr; + if (!bHadData) + bHadData = true; + } + + internal void SetSize(int screenWidth, int screenHeight) + { + mWidth = screenWidth; + mHeight = screenHeight; + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGVideoPlayer.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGVideoPlayer.cs.meta new file mode 100644 index 00000000..519fd5e1 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/StoicGooseInterface/SGVideoPlayer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e8778828cf820b640b9d26ae977cdaba \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/UStoicGoose.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/UStoicGoose.cs new file mode 100644 index 00000000..f749ac88 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/UStoicGoose.cs @@ -0,0 +1,717 @@ +using AxibugEmuOnline.Client; +using AxibugEmuOnline.Client.ClientCore; +using AxibugProtobuf; +using StoicGoose.Common.Utilities; +using StoicGoose.Core.Machines; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using UnityEngine; +using UnityEngine.UI; +using CartridgeMetadata = StoicGoose.Core.Cartridges.Metadata; + +public class UStoicGoose : MonoBehaviour, IEmuCore +{ + public static UStoicGoose instance; + public static System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew(); + + /* Constants */ + readonly static int maxScreenSizeFactor = 5; + readonly static int maxRecentFiles = 15; + readonly static int statusIconSize = 12; + + readonly static List<(string description, string extension, Func<string, Stream> streamReadFunc)> supportedFileInformation = new() + { + ("WonderSwan ROMs", ".ws", GetStreamFromFile), + ("WonderSwan Color ROMs", ".wsc", GetStreamFromFile), + ("Zip Archives", ".zip", GetStreamFromFirstZippedFile) + }; + + /* Various handlers */ + DatabaseHandler databaseHandler = default; + SGVideoPlayer graphicsHandler = default; + SGSoundPlayer soundHandler = default; + SGKeyboard inputHandler = default; + SGLogger loggerHandler = default; + public EmulatorHandler emulatorHandler = default; + private RomPlatformType mPlatform = RomPlatformType.WonderSwan; + + /* Misc. windows */ + //SoundRecorderForm soundRecorderForm = default; + //CheatsForm cheatsForm = default; + + /* Misc. runtime variables */ + Type machineType = default; + bool isVerticalOrientation = false; + string internalEepromPath = string.Empty; + + public string CurrRomName { get; private set; } + + #region 实现IEmuCore + public RomPlatformType Platform => mPlatform; + + public uint Frame => (uint)emulatorHandler.AxiEmuRunFrame; + + public Texture OutputPixel => graphicsHandler.rawBufferWarper; + + public RawImage DrawCanvas => graphicsHandler.DrawCanvas; + public object GetState() + { + throw new NotImplementedException(); + } + + public byte[] GetStateBytes() + { + throw new NotImplementedException(); + } + + public void LoadState(object state) + { + throw new NotImplementedException(); + } + + public void LoadStateFromBytes(byte[] data) + { + throw new NotImplementedException(); + } + + public void Pause() + { + PauseEmulation(); + } + + public void Resume() + { + UnpauseEmulation(); + } + + public MsgBool StartGame(RomFile romFile) + { + mPlatform = romFile.Platform; + + Init(); + + + //保存当前正在进行的游戏存档 + if (emulatorHandler != null && !emulatorHandler.IsRunning) + { + SaveAllData(); + } + + if (LoadAndRunCartridge(romFile.LocalFilePath)) + return true; + else + return "Rom加载失败"; + } + + public void Dispose() + { + //保存当前正在进行的游戏存档 + if (emulatorHandler != null && !emulatorHandler.IsRunning) + { + SaveAllData(); + } + EmuClose(); + } + + public void DoReset() + { + ResetEmulation(); + } + + public IControllerSetuper GetControllerSetuper() + { + throw new NotImplementedException(); + } + + public bool PushEmulatorFrame() + { + throw new NotImplementedException(); + } + + public void AfterPushFrame() + { + throw new NotImplementedException(); + } + + public void GetAudioParams(out int frequency, out int channels) + { + throw new NotImplementedException(); + } + #endregion + + //Cheat[] cheats = default; + + #region Unity 生命周期 + + void Awake() + { + //关闭垂直同步 + QualitySettings.vSyncCount = 0; + //设为60帧 + Application.targetFrameRate = 60; + + instance = this; + loggerHandler = new SGLogger(); + graphicsHandler = this.gameObject.GetComponent<SGVideoPlayer>(); + soundHandler = this.gameObject.GetComponent<SGSoundPlayer>(); + inputHandler = this.gameObject.GetComponent<SGKeyboard>(); + Log.Initialize(loggerHandler); + Program.InitPath(Application.persistentDataPath); + //Init(); + //LoadAndRunCartridge("G:/BaiduNetdiskDownload/Rockman & Forte - Mirai Kara no Chousen Sha (J) [M][!].ws"); + } + private void Update() + { + if (!emulatorHandler.IsRunning) + return; + + inputHandler.Update_InputData(); + + emulatorHandler.Frame_Update(); + } + void OnDestroy() + { + EmuClose(); + } + #endregion + private void Init() + { + Log.WriteEvent(LogSeverity.Information, this, "Initializing emulator and UI..."); + + machineType = Program.Configuration.General.PreferOriginalWS ? typeof(WonderSwan) : typeof(WonderSwanColor); + + InitializeEmulatorHandler(); + VerifyConfiguration(); + InitializeOtherHandlers(); + //InitializeWindows(); + + //SizeAndPositionWindow(); + SetWindowTitleAndStatus(); + Log.WriteEvent(LogSeverity.Information, this, "Initialization done!"); + } + + + private void EmuClose() + { + SaveAllData(); + emulatorHandler.Shutdown(); + + Program.SaveConfiguration(); + } + + + private void InitializeEmulatorHandler() + { + emulatorHandler = new EmulatorHandler(machineType); + emulatorHandler.SetFpsLimiter(Program.Configuration.General.LimitFps); + } + + private void VerifyConfiguration() + { + foreach (var button in emulatorHandler.Machine.GameControls.Replace(" ", "").Split(',')) + { + if (!Program.Configuration.Input.GameControls.ContainsKey(button)) + Program.Configuration.Input.GameControls[button] = new(); + } + + foreach (var button in emulatorHandler.Machine.HardwareControls.Replace(" ", "").Split(',')) + { + if (!Program.Configuration.Input.SystemControls.ContainsKey(button)) + Program.Configuration.Input.SystemControls[button] = new(); + } + + if (Program.Configuration.Video.ScreenSize < 2 || Program.Configuration.Video.ScreenSize > maxScreenSizeFactor) + Program.Configuration.Video.ResetToDefault(nameof(Program.Configuration.Video.ScreenSize)); + + //if (string.IsNullOrEmpty(Program.Configuration.Video.Shader) || (graphicsHandler != null && !graphicsHandler.AvailableShaders.Contains(Program.Configuration.Video.Shader))) + // Program.Configuration.Video.Shader = GraphicsHandler.DefaultShaderName; + } + + private void InitializeOtherHandlers() + { + databaseHandler = new DatabaseHandler(); + + //statusIconsLocation = machineType == typeof(WonderSwan) ? new(0, DisplayControllerCommon.ScreenHeight) : new(DisplayControllerCommon.ScreenWidth, 0); + + //TODO graphicsHandler基本参数,可能需要补上 + //graphicsHandler = new GraphicsHandler(machineType, new(emulatorHandler.Machine.ScreenWidth, emulatorHandler.Machine.ScreenHeight), statusIconsLocation, statusIconSize, machineType != typeof(WonderSwan), Program.Configuration.Video.Shader) + //{ + // IsVerticalOrientation = isVerticalOrientation + //}; + + //TODO 声音基本参数,可能需要补上 + //soundHandler = new SoundHandler(44100, 2); + //soundHandler.SetVolume(1.0f); + //soundHandler.SetMute(Program.Configuration.Sound.Mute); + //soundHandler.SetLowPassFilter(Program.Configuration.Sound.LowPassFilter); + + //TODO Input基本参数,可能需要补上 + //inputHandler = new InputHandler(renderControl); + //inputHandler.SetKeyMapping(Program.Configuration.Input.GameControls, Program.Configuration.Input.SystemControls); + //inputHandler.SetVerticalOrientation(isVerticalOrientation); + //inputHandler.SetEnableRemapping(Program.Configuration.Input.AutoRemap); + //inputHandler.SetVerticalRemapping(emulatorHandler.Machine.VerticalControlRemap + // .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) + // .Select(x => x.Split('=', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) + // .ToDictionary(x => x[0], x => x[1])); + + + emulatorHandler.Machine.DisplayController.SendFramebuffer = graphicsHandler.UpdateScreen; + emulatorHandler.Machine.SoundController.SendSamples = (s) => + { + soundHandler.EnqueueSamples(s); + //soundRecorderForm.EnqueueSamples(s); + }; + + emulatorHandler.Machine.ReceiveInput += () => + { + //var buttonsPressed = new List<string>(); + //var buttonsHeld = new List<string>(); + + //inputHandler.PollInput(ref buttonsPressed, ref buttonsHeld); + long buttonsHeld = 0; + inputHandler.PollInput(ref buttonsHeld); + return buttonsHeld; + //if (buttonsPressed.Contains("Volume")) + // emulatorHandler.Machine.SoundController.ChangeMasterVolume(); + + //return (buttonsPressed, buttonsHeld); + }; + + //renderControl.Resize += (s, e) => { if (s is Control control) graphicsHandler.Resize(control.ClientRectangle); }; + //renderControl.Paint += (s, e) => + //{ + // graphicsHandler.SetClearColor(Color.Black); + + // graphicsHandler.ClearFrame(); + + // if (emulatorHandler.Machine is MachineCommon machine) + // { + // var activeIcons = new List<string>() { "Power" }; + + // if (machine.BuiltInSelfTestOk) activeIcons.Add("Initialized"); + + // if (machine.DisplayController.IconSleep) activeIcons.Add("Sleep"); + // if (machine.DisplayController.IconVertical) activeIcons.Add("Vertical"); + // if (machine.DisplayController.IconHorizontal) activeIcons.Add("Horizontal"); + // if (machine.DisplayController.IconAux1) activeIcons.Add("Aux1"); + // if (machine.DisplayController.IconAux2) activeIcons.Add("Aux2"); + // if (machine.DisplayController.IconAux3) activeIcons.Add("Aux3"); + + // if (machine.SoundController.HeadphonesConnected) activeIcons.Add("Headphones"); + // if (machine.SoundController.MasterVolume == 0) activeIcons.Add("Volume0"); + // if (machine.SoundController.MasterVolume == 1) activeIcons.Add("Volume1"); + // if (machine.SoundController.MasterVolume == 2) activeIcons.Add("Volume2"); + // if (machine.SoundController.MasterVolume == 3 && machine is WonderSwanColor) activeIcons.Add("Volume3"); + + // graphicsHandler.UpdateStatusIcons(activeIcons); + // } + // graphicsHandler.DrawFrame(); + //}; + + internalEepromPath = Path.Combine(Program.InternalDataPath, $"{machineType.Name}.eep"); + } + + //private void InitializeWindows() + //{ + // soundRecorderForm = new(soundHandler.SampleRate, soundHandler.NumChannels); + // cheatsForm = new() + // { + // Callback = (c) => + // { + // if (emulatorHandler.IsRunning) + // cheats = (Cheat[])c.Clone(); + // } + // }; + //} + + private void SizeAndPositionWindow() + { + graphicsHandler.SetSize(emulatorHandler.Machine.ScreenWidth, emulatorHandler.Machine.ScreenHeight); + //if (WindowState == For emulatorHandler.Machine.ScreenHeight;mWindowState.Maximized) + // WindowState = FormWindowState.Normal; + + //MinimumSize = SizeFromClientSize(CalculateRequiredClientSize(2)); + //Size = SizeFromClientSize(CalculateRequiredClientSize(Program.Configuration.Video.ScreenSize)); + //var screen = Screen.FromControl(this); + //var workingArea = screen.WorkingArea; + //Location = new Point() + //{ + // X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - Width) / 2), + // Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - Height) / 2) + //}; + } + + + //TODO 设置屏幕宽高 看是否需要 + //private Size CalculateRequiredClientSize(int screenSize) + //{ + // if (emulatorHandler == null || graphicsHandler == null) + // return ClientSize; + + // var statusIconsOnRight = statusIconsLocation.X > statusIconsLocation.Y; + + // int screenWidth, screenHeight; + + // if (!isVerticalOrientation) + // { + // screenWidth = emulatorHandler.Machine.ScreenWidth; + // screenHeight = emulatorHandler.Machine.ScreenHeight; + // if (statusIconsOnRight) screenWidth += statusIconSize; + // if (!statusIconsOnRight) screenHeight += statusIconSize; + // } + // else + // { + // screenWidth = emulatorHandler.Machine.ScreenHeight; + // screenHeight = emulatorHandler.Machine.ScreenWidth; + // if (!statusIconsOnRight) screenWidth += statusIconSize; + // if (statusIconsOnRight) screenHeight += statusIconSize; + // } + + // return new(screenWidth * screenSize, (screenHeight * screenSize) + menuStrip.Height + statusStrip.Height); + //} + + private void SetWindowTitleAndStatus() + { + //TODO 修改为状态字符串,显示在某个地方 + + //var titleStringBuilder = new StringBuilder(); + + //titleStringBuilder.Append($"{Application.ProductName} {Program.GetVersionString(false)}"); + + //if (emulatorHandler.Machine.Cartridge.IsLoaded) + //{ + // titleStringBuilder.Append($" - [{Path.GetFileName(Program.Configuration.General.RecentFiles.First())}]"); + + // var statusStringBuilder = new StringBuilder(); + // statusStringBuilder.Append($"Emulating {emulatorHandler.Machine.Manufacturer} {emulatorHandler.Machine.Model}, "); + // statusStringBuilder.Append($"playing {databaseHandler.GetGameTitle(emulatorHandler.Machine.Cartridge.Crc32, emulatorHandler.Machine.Cartridge.SizeInBytes)} ({emulatorHandler.Machine.Cartridge.Metadata.GameIdString})"); + + // tsslStatus.Text = statusStringBuilder.ToString(); + // tsslEmulationStatus.Text = emulatorHandler.IsRunning ? (emulatorHandler.IsPaused ? "Paused" : "Running") : "Stopped"; + //} + //else + //{ + // tsslStatus.Text = "Ready"; + // tsslEmulationStatus.Text = "Stopped"; + //} + + //Text = titleStringBuilder.ToString(); + } + + private void LoadBootstrap(string filename) + { + if (GlobalVariables.EnableSkipBootstrapIfFound) return; + + if (!emulatorHandler.IsRunning) + { + if (File.Exists(filename)) + { + using var stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var data = new byte[stream.Length]; + stream.Read(data, 0, data.Length); + emulatorHandler.Machine.LoadBootstrap(data); + } + emulatorHandler.Machine.UseBootstrap = Program.Configuration.General.UseBootstrap; + } + } + + private void LoadInternalEeprom() + { + if (!emulatorHandler.IsRunning && File.Exists(internalEepromPath)) + { + using var stream = new FileStream(internalEepromPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var data = new byte[stream.Length]; + stream.Read(data, 0, data.Length); + emulatorHandler.Machine.LoadInternalEeprom(data); + } + } + + private static Stream GetStreamFromFile(string filename) + { + return new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + } + + private static Stream GetStreamFromFirstZippedFile(string filename) + { + return new ZipArchive(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)).Entries.FirstOrDefault()?.Open(); + } + + private bool LoadAndRunCartridge(string filename) + { + try + { + if (emulatorHandler.IsRunning) + { + SaveAllData(); + emulatorHandler.Shutdown(); + } + + using var inputStream = supportedFileInformation.FirstOrDefault(x => x.extension == Path.GetExtension(filename)).streamReadFunc(filename) ?? GetStreamFromFile(filename); + using var stream = new MemoryStream(); + inputStream.CopyTo(stream); + stream.Position = 0; + + var data = new byte[stream.Length]; + stream.Read(data, 0, data.Length); + emulatorHandler.Machine.LoadRom(data); + + graphicsHandler.IsVerticalOrientation = isVerticalOrientation = emulatorHandler.Machine.Cartridge.Metadata.Orientation == CartridgeMetadata.Orientations.Vertical; + inputHandler.SetVerticalOrientation(isVerticalOrientation); + + CurrRomName = Path.GetFileName(filename); + + LoadRam(); + + LoadBootstrap(emulatorHandler.Machine is WonderSwan ? Program.Configuration.General.BootstrapFile : Program.Configuration.General.BootstrapFileWSC); + LoadInternalEeprom(); + + //初始化音频 + soundHandler.Initialize(); + + emulatorHandler.Startup(); + + SizeAndPositionWindow(); + SetWindowTitleAndStatus(); + + Program.SaveConfiguration(); + return true; + } + catch (Exception ex) when (!AppEnvironment.DebugMode) + { + App.log.Error("ex=>"+ex.ToString()); + return false; + } + } + + private void LoadRam() + { + //var path = Path.Combine(Program.SaveDataPath, $"{Path.GetFileNameWithoutExtension(Program.Configuration.General.RecentFiles.First())}.sav"); + var path = Path.Combine(Program.SaveDataPath, $"{CurrRomName}.sav"); + if (!File.Exists(path)) return; + + using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var data = new byte[stream.Length]; + stream.Read(data, 0, data.Length); + if (data.Length != 0) + emulatorHandler.Machine.LoadSaveData(data); + } + + private void SaveAllData() + { + SaveInternalEeprom(); + SaveRam(); + } + + private void SaveInternalEeprom() + { + var data = emulatorHandler.Machine.GetInternalEeprom(); + if (data.Length == 0) return; + + using var stream = new FileStream(internalEepromPath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); + stream.Write(data, 0, data.Length); + } + + private void SaveRam() + { + var data = emulatorHandler.Machine.GetSaveData(); + if (data.Length == 0) return; + + //var path = Path.Combine(Program.SaveDataPath, $"{Path.GetFileNameWithoutExtension(Program.Configuration.General.RecentFiles.First())}.sav"); + var path = Path.Combine(Program.SaveDataPath, $"{CurrRomName}.sav"); + + using var stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); + stream.Write(data, 0, data.Length); + } + + + private void PauseEmulation() + { + if (!emulatorHandler.IsRunning) return; + + emulatorHandler.Pause(); + soundHandler.Pause(); + + SetWindowTitleAndStatus(); + } + + private void UnpauseEmulation() + { + if (!emulatorHandler.IsRunning) return; + + emulatorHandler.Unpause(); + soundHandler.Unpause(); + + SetWindowTitleAndStatus(); + } + + private void ResetEmulation() + { + SaveAllData(); + emulatorHandler.Reset(); + + Program.SaveConfiguration(); + } + +} + +static class Program +{ + static string jsonConfigFileName;//= "Config.json"; + static string logFileName;//= "Log.txt"; + static string internalDataDirectoryName;//= "Internal"; + static string saveDataDirectoryName;//= "Saves"; + static string cheatDataDirectoryName;//= "Cheats"; + static string debuggingDataDirectoryName;//= "Debugging"; + static string assetsDirectoryName;//= "Assets"; + static string shaderDirectoryName;//= "Shaders"; + static string noIntroDatDirectoryName;//= "No-Intro"; + static string mutexName;//= $"Unity_{GetVersionDetails()}"; + static string programDataDirectory;//= Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Application.ProductName); + static string programConfigPath;//= Path.Combine(programDataDirectory, jsonConfigFileName); + + public static Configuration Configuration;// { get; private set; } = LoadConfiguration(programConfigPath); + + public static string DataPath;//{ get; } = string.Empty; + public static string InternalDataPath;//{ get; } = string.Empty; + public static string SaveDataPath;//{ get; } = string.Empty; + public static string CheatsDataPath;//{ get; } = string.Empty; + public static string DebuggingDataPath;//{ get; } = string.Empty; + + static string programApplicationDirectory;// = AppDomain.CurrentDomain.BaseDirectory; + static string programAssetsDirectory;// = Path.Combine(programApplicationDirectory, assetsDirectoryName); + + //public static string ShaderPath { get; } = string.Empty; + public static string NoIntroDatPath;// { get; } = string.Empty; + + //static MainForm mainForm = default; + + public static void InitPath(string CustonDataDir) + { + try + { + jsonConfigFileName = "Config.json"; + logFileName = "Log.txt"; + internalDataDirectoryName = "Internal"; + saveDataDirectoryName = "Saves"; + cheatDataDirectoryName = "Cheats"; + debuggingDataDirectoryName = "Debugging"; + assetsDirectoryName = "Assets"; + shaderDirectoryName = "Shaders"; + noIntroDatDirectoryName = "No-Intro"; + mutexName = $"Unity_{GetVersionDetails()}"; + programDataDirectory = Path.Combine(CustonDataDir, "AxibugEmu"); + programConfigPath = Path.Combine(programDataDirectory, jsonConfigFileName); + Configuration = LoadConfiguration(programConfigPath); + Log.WriteLine(Path.Combine(programDataDirectory, logFileName)); + programApplicationDirectory = AppDomain.CurrentDomain.BaseDirectory; + programAssetsDirectory = Path.Combine(programApplicationDirectory, assetsDirectoryName); + Directory.CreateDirectory(DataPath = programDataDirectory); + Directory.CreateDirectory(InternalDataPath = Path.Combine(programDataDirectory, internalDataDirectoryName)); + Directory.CreateDirectory(SaveDataPath = Path.Combine(programDataDirectory, saveDataDirectoryName)); + Directory.CreateDirectory(CheatsDataPath = Path.Combine(programDataDirectory, cheatDataDirectoryName)); + Directory.CreateDirectory(DebuggingDataPath = Path.Combine(programDataDirectory, debuggingDataDirectoryName)); + + //if (!Directory.Exists(ShaderPath = Path.Combine(programAssetsDirectory, shaderDirectoryName))) + // throw new DirectoryNotFoundException("Shader directory missing"); + + if (!Directory.Exists(NoIntroDatPath = Path.Combine(programAssetsDirectory, noIntroDatDirectoryName))) + throw new DirectoryNotFoundException("No-Intro .dat directory missing"); + } + catch (DirectoryNotFoundException e) + { + } + } + + //[STAThread] + //static void Main() + //{ + // using var mutex = new Mutex(true, mutexName, out bool newInstance); + // if (!newInstance) + // { + // MessageBox.Show($"Another instance of {Application.ProductName} is already running.\n\nThis instance will now shut down.", + // $"{Application.ProductName} Startup Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // Environment.Exit(-1); + // } + + // Application.SetHighDpiMode(HighDpiMode.SystemAware); + // Application.EnableVisualStyles(); + // Application.SetCompatibleTextRenderingDefault(false); + + // if (!Debugger.IsAttached) + // { + // Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); + // Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + // AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + // } + + // Application.Run(mainForm = new MainForm()); + //} + + //static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) + //{ + // if (e.Exception is GLFWException glEx) + // { + // var renderControl = mainForm.Controls["renderControl"] as OpenGL.RenderControl; + // MessageBox.Show($"{glEx.Message.EnsureEndsWithPeriod()}\n\n{Application.ProductName} requires GPU and drivers supporting OpenGL {renderControl.APIVersion.Major}.{renderControl.APIVersion.Minor}.", $"{Application.ProductName} Startup Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // } + // else + // { + // MessageBox.Show(e.Exception.Message.EnsureEndsWithPeriod(), $"{Application.ProductName} Startup Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // } + + // Environment.Exit(-1); + //} + + //static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + //{ + // MessageBox.Show((e.ExceptionObject as Exception).Message, $"{Application.ProductName} Startup Error"); + // Environment.Exit(-1); + //} + + private static Configuration LoadConfiguration(string filename) + { + Directory.CreateDirectory(Path.GetDirectoryName(filename)); + + Configuration configuration; + //if (!File.Exists(filename) || (configuration = filename.DeserializeFromFile<Configuration>()) == null) + //{ + // configuration = new Configuration(); + // configuration.SerializeToFile(filename); + //} + + configuration = new Configuration(); + + return configuration; + } + + public static void ReplaceConfiguration(Configuration newConfig) + { + ConfigurationBase.CopyConfiguration(newConfig, Configuration); + SaveConfiguration(); + } + + public static void SaveConfiguration() + { + //Configuration?.SerializeToFile(programConfigPath); + } + + private static string GetVersionDetails() + { + //return $"{ThisAssembly.Git.Branch}-{ThisAssembly.Git.Commit}{(ThisAssembly.Git.IsDirty ? "-dirty" : string.Empty)}{(GlobalVariables.IsDebugBuild ? "+debug" : string.Empty)}"; + return $"{(GlobalVariables.IsDebugBuild ? "+debug" : string.Empty)}"; + } + + //public static string GetVersionString(bool detailed) + //{ + // var version = new Version(Application.ProductVersion); + // var stringBuilder = new StringBuilder(); + // stringBuilder.Append($"v{version.Major:D3}{(version.Minor != 0 ? $".{version.Minor}" : string.Empty)}"); + // if (detailed) stringBuilder.Append($" ({GetVersionDetails()})"); + // return stringBuilder.ToString(); + //} +} + diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/UStoicGoose.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/UStoicGoose.cs.meta new file mode 100644 index 00000000..4d5d9493 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Emulator/StoicGooseEmulator/UStoicGoose.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b7e1a8282bc4d764c81f63e62fd7aec8 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppEmu.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppEmu.cs index 117d33fd..a46290aa 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppEmu.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppEmu.cs @@ -58,7 +58,8 @@ namespace AxibugEmuOnline.Client.Manager case RomPlatformType.Cps1: case RomPlatformType.Cps2: case RomPlatformType.Igs: - case RomPlatformType.Neogeo: + case RomPlatformType.Neogeo: + case RomPlatformType.ArcadeOld: m_emuCore = GameObject.Instantiate(Resources.Load<GameObject>("MAME/UMAME")).GetComponent<IEmuCore>(); break; case RomPlatformType.MasterSystem: @@ -69,7 +70,11 @@ namespace AxibugEmuOnline.Client.Manager case RomPlatformType.Sc3000: case RomPlatformType.Sg1000: m_emuCore = GameObject.Instantiate(Resources.Load<GameObject>("EssgeeUnity/EssgeeUnity")).GetComponent<IEmuCore>(); - break; + break; + case RomPlatformType.WonderSwan: + case RomPlatformType.WonderSwanColor: + m_emuCore = GameObject.Instantiate(Resources.Load<GameObject>("StoicGooseUnity/StoicGooseUnity")).GetComponent<IEmuCore>(); + break; } var result = m_emuCore.StartGame(romFile); diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/ScreenScaler.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/ScreenScaler.cs index 62c0d2fd..9d1b7f16 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/ScreenScaler.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/ScreenScaler.cs @@ -105,11 +105,13 @@ namespace AxibugEmuOnline.Client.Settings { switch (platform) { - case RomPlatformType.Nes: return new Vector2Int(256, 240); + case RomPlatformType.Nes: + return new Vector2Int(256, 240); case RomPlatformType.Cps1: case RomPlatformType.Cps2: case RomPlatformType.Neogeo: case RomPlatformType.Igs: + case RomPlatformType.ArcadeOld: return UMAME.instance.mUniVideoPlayer.mScreenSize; case RomPlatformType.MasterSystem: case RomPlatformType.GameGear: diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Protobuf/ProtobufAxibugEmuOnline.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Protobuf/ProtobufAxibugEmuOnline.cs index 7db4888f..755f46d8 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Protobuf/ProtobufAxibugEmuOnline.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Protobuf/ProtobufAxibugEmuOnline.cs @@ -157,17 +157,18 @@ namespace AxibugProtobuf { "bBAFEhQKEFN3aXRjaFByb0NvbnRyb2wQBhIQCgxTd2l0Y2hKb3lDb24QBxIS", "Cg5YQk9YMzYwQ29udHJvbBAIEhIKDlhCT1hPTkVDb250cm9sEAkSEQoNUFNW", "aXRhQ29udHJvbBAKEhIKDldpaVVQYWRDb250cm9sEAsSFAoQV2lpUmVtb3Rl", - "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKtsBCg9Sb21QbGF0", + "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKoMCCg9Sb21QbGF0", "Zm9ybVR5cGUSCwoHSW52YWxpZBAAEgcKA05lcxABEhEKDU1hc3Rlcl9TeXN0", "ZW0QAhINCglHYW1lX0dlYXIQAxIMCghHYW1lX0JveRAEEhIKDkdhbWVfQm95", "X0NvbG9yEAUSEQoNQ29sZWNvX1Zpc2lvbhAGEgsKB1NDXzMwMDAQBxILCgdT", "R18xMDAwEAgSCgoGTkVPR0VPEBQSBwoDSUdTEBUSCAoEQ1BTMRAWEggKBENQ", - "UzIQFxIOCgpBcmNhZGVfT0xEEB4SCAoDQWxsEOcHKnAKDVJvb21HYW1lU3Rh", - "dGUSEgoOTm9uZV9HYW1lU3RhdGUQABIMCghPbmx5SG9zdBABEhEKDVdhaXRS", - "YXdVcGRhdGUQAhINCglXYWl0UmVhZHkQAxIJCgVQYXVzZRAEEhAKDEluT25s", - "aW5lR2FtZRAFKk4KEUxvZ2luUmVzdWx0U3RhdHVzEiEKHUxvZ2luUmVzdWx0", - "U3RhdHVzX0Jhc2VEZWZhdWx0EAASBgoCT0sQARIOCgpBY2NvdW50RXJyEAJC", - "AkgBYgZwcm90bzM=")); + "UzIQFxIOCgpBcmNhZGVfT0xEEB4SDwoLV29uZGVyX1N3YW4QKBIVChFXb25k", + "ZXJfU3dhbl9Db2xvchApEggKA0FsbBDnBypwCg1Sb29tR2FtZVN0YXRlEhIK", + "Dk5vbmVfR2FtZVN0YXRlEAASDAoIT25seUhvc3QQARIRCg1XYWl0UmF3VXBk", + "YXRlEAISDQoJV2FpdFJlYWR5EAMSCQoFUGF1c2UQBBIQCgxJbk9ubGluZUdh", + "bWUQBSpOChFMb2dpblJlc3VsdFN0YXR1cxIhCh1Mb2dpblJlc3VsdFN0YXR1", + "c19CYXNlRGVmYXVsdBAAEgYKAk9LEAESDgoKQWNjb3VudEVychACQgJIAWIG", + "cHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.GamePadType), typeof(global::AxibugProtobuf.RomPlatformType), typeof(global::AxibugProtobuf.RoomGameState), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -480,6 +481,8 @@ namespace AxibugProtobuf { [pbr::OriginalName("CPS1")] Cps1 = 22, [pbr::OriginalName("CPS2")] Cps2 = 23, [pbr::OriginalName("Arcade_OLD")] ArcadeOld = 30, + [pbr::OriginalName("Wonder_Swan")] WonderSwan = 40, + [pbr::OriginalName("Wonder_Swan_Color")] WonderSwanColor = 41, [pbr::OriginalName("All")] All = 999, } diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs index 9548927d..af565a5a 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/CommandDispatcher/CommandListener.cs @@ -45,7 +45,7 @@ namespace AxibugEmuOnline.Client { foreach (var executer in executers) { - App.log.Debug($"CommandListener GetCommand | {Time.frameCount}|{executer.name}| {cmd.Cmd}|{cmd.Cancel}"); + //App.log.Debug($"CommandListener GetCommand | {Time.frameCount}|{executer.name}| {cmd.Cmd}|{cmd.Cancel}"); executer.ExecuteCommand(cmd.Cmd, cmd.Cancel); } } diff --git a/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs b/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs index 15546784..608df6b6 100644 --- a/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs +++ b/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs @@ -4,7 +4,6 @@ namespace AxibugEmuOnline.Server.Common { public static class ProtoBufHelper { - public static byte[] Serizlize(IMessage msg) { return msg.ToByteArray(); diff --git a/AxibugEmuOnline.Server/Common/SQLRUN.cs b/AxibugEmuOnline.Server/Common/SQLRUN.cs index b21e78a1..e54d72a7 100644 --- a/AxibugEmuOnline.Server/Common/SQLRUN.cs +++ b/AxibugEmuOnline.Server/Common/SQLRUN.cs @@ -10,7 +10,7 @@ namespace AxibugEmuOnline.Server.Common const int DefaultCount = 1; const int MaxLimit = 10; - static readonly object _sync = new object(); + static readonly Lock _sync = new Lock(); static MySqlConnectionStringBuilder connBuilder; public static void InitConnMgr() diff --git a/AxibugEmuOnline.Server/Data/ServerInputSnapShot.cs b/AxibugEmuOnline.Server/Data/ServerInputSnapShot.cs new file mode 100644 index 00000000..4c312818 --- /dev/null +++ b/AxibugEmuOnline.Server/Data/ServerInputSnapShot.cs @@ -0,0 +1,30 @@ +using System.Runtime.InteropServices; + +namespace AxibugEmuOnline.Server.Data +{ + + [StructLayout(LayoutKind.Explicit, Size = 8)] + public struct ServerInputSnapShot + { + [FieldOffset(0)] + public UInt64 all; + + [FieldOffset(0)] + public byte p1_byte; + [FieldOffset(1)] + public byte p2_byte; + [FieldOffset(2)] + public byte p3_byte; + [FieldOffset(3)] + public byte p4_byte; + + [FieldOffset(0)] + public ushort p1_ushort; + [FieldOffset(2)] + public ushort p2_ushort; + [FieldOffset(4)] + public ushort p3_ushort; + [FieldOffset(6)] + public ushort p4_ushort; + } +} diff --git a/AxibugEmuOnline.Server/Manager/ChatManager.cs b/AxibugEmuOnline.Server/Manager/ChatManager.cs index 3c14876e..d671ecf1 100644 --- a/AxibugEmuOnline.Server/Manager/ChatManager.cs +++ b/AxibugEmuOnline.Server/Manager/ChatManager.cs @@ -2,6 +2,7 @@ using AxibugEmuOnline.Server.Common; using AxibugEmuOnline.Server.NetWork; using System.Net.Sockets; +using AxibugEmuOnline.Server.Manager.Client; namespace AxibugEmuOnline.Server.Manager { diff --git a/AxibugEmuOnline.Server/Manager/Client/ClientInfo.cs b/AxibugEmuOnline.Server/Manager/Client/ClientInfo.cs new file mode 100644 index 00000000..97f23b81 --- /dev/null +++ b/AxibugEmuOnline.Server/Manager/Client/ClientInfo.cs @@ -0,0 +1,44 @@ +using AxibugProtobuf; +using System.Net.Sockets; + +namespace AxibugEmuOnline.Server.Manager.Client +{ + public class ClientInfo + { + public long UID { get; set; } + public string NickName { get; set; } = string.Empty; + public string Account { get; set; } = string.Empty; + internal DeviceType deviceType { get; set; } = DeviceType.Default; + public Socket _socket { get; set; } + public bool IsOffline { get; set; } = false; + public DateTime RegisterDT { get; set; } + public DateTime LogOutDT { get; set; } + public DateTime LogInDT { get; set; } + public DateTime LastLogInDT { get; set; } + public UserRoomState RoomState { get; set; } = new UserRoomState(); + public TimeSpan LastStartPingTime { get; set; } + public int LastPingSeed { get; set; } + public double AveNetDelay { get; set; } + public double MinNetDelay { get; set; } + public double MaxNetDelay { get; set; } + public List<double> NetDelays { get; set; } = new List<double>(); + public const int NetAveDelayCount = 3; + } + + public class UserRoomState + { + public int RoomID { get; private set; } + public UserRoomState() + { + ClearRoomData(); + } + public void SetRoomData(int roomID) + { + RoomID = roomID; + } + public void ClearRoomData() + { + RoomID = -1; + } + } +} diff --git a/AxibugEmuOnline.Server/Manager/ClientManager.cs b/AxibugEmuOnline.Server/Manager/ClientManager.cs index 56f76c1d..580539bf 100644 --- a/AxibugEmuOnline.Server/Manager/ClientManager.cs +++ b/AxibugEmuOnline.Server/Manager/ClientManager.cs @@ -1,59 +1,18 @@ using AxibugEmuOnline.Server.Common; using AxibugEmuOnline.Server.Event; +using AxibugEmuOnline.Server.Manager.Client; using AxibugEmuOnline.Server.NetWork; using AxibugProtobuf; -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI; -using System.Collections.Generic; using System.Net.Sockets; using System.Timers; namespace AxibugEmuOnline.Server.Manager { - public class ClientInfo - { - public long UID { get; set; } - public string NickName { get; set; } = string.Empty; - public string Account { get; set; } = string.Empty; - internal DeviceType deviceType { get; set; } = DeviceType.Default; - public Socket _socket { get; set; } - public bool IsOffline { get; set; } = false; - public DateTime RegisterDT { get; set; } - public DateTime LogOutDT { get; set; } - public DateTime LogInDT { get; set; } - public DateTime LastLogInDT { get; set; } - public UserRoomState RoomState { get; set; } = new UserRoomState(); - public TimeSpan LastStartPingTime { get; set; } - public int LastPingSeed { get; set; } - public double AveNetDelay { get; set; } - public double MinNetDelay { get; set; } - public double MaxNetDelay { get; set; } - public List<double> NetDelays { get; set; } = new List<double>(); - public const int NetAveDelayCount = 3; - } - - public class UserRoomState - { - public int RoomID { get; private set; } - public UserRoomState() - { - ClearRoomData(); - } - public void SetRoomData(int roomID) - { - RoomID = roomID; - } - public void ClearRoomData() - { - RoomID = -1; - } - } - public class ClientManager { - private List<ClientInfo> ClientList = new List<ClientInfo>(); - private Dictionary<Socket, ClientInfo> _DictSocketClient = new Dictionary<Socket, ClientInfo>(); - private Dictionary<long?, ClientInfo> _DictUIDClient = new Dictionary<long?, ClientInfo>(); + private HashSet<ClientInfo> mClientList = new HashSet<ClientInfo>(); + private Dictionary<Socket, ClientInfo> mDictSocketClient = new Dictionary<Socket, ClientInfo>(); + private Dictionary<long?, ClientInfo> mDictUIDClient = new Dictionary<long?, ClientInfo>(); private long TestUIDSeed = 0; private System.Timers.Timer clientCheckTimer; @@ -94,7 +53,7 @@ namespace AxibugEmuOnline.Server.Manager private void ClientCheckClearOffline_Elapsed(object sender, ElapsedEventArgs e) { DateTime CheckDT = DateTime.Now.AddMinutes(-1 * _RemoveOfflineCacheMin); - ClientInfo[] OfflineClientlist = ClientList.Where(w => w.IsOffline == true && w.LogOutDT < CheckDT).ToArray(); + ClientInfo[] OfflineClientlist = mClientList.Where(w => w.IsOffline == true && w.LogOutDT < CheckDT).ToArray(); for (int i = 0; i < OfflineClientlist.Length; i++) { @@ -121,10 +80,10 @@ namespace AxibugEmuOnline.Server.Manager Socket oldsocket = cinfo._socket; cinfo._socket = _socket; - if (_DictSocketClient.ContainsKey(oldsocket)) - _DictSocketClient.Remove(oldsocket); + if (mDictSocketClient.ContainsKey(oldsocket)) + mDictSocketClient.Remove(oldsocket); - _DictSocketClient[_socket] = cinfo; + mDictSocketClient[_socket] = cinfo; } else { @@ -149,11 +108,11 @@ namespace AxibugEmuOnline.Server.Manager try { Console.WriteLine("追加连接玩家 UID=>" + clientInfo.UID + " | " + clientInfo.Account); - lock (ClientList) + lock (mClientList) { - _DictUIDClient.Add(clientInfo.UID, clientInfo); - _DictSocketClient.Add(clientInfo._socket, clientInfo); - ClientList.Add(clientInfo); + mDictUIDClient.Add(clientInfo.UID, clientInfo); + mDictSocketClient.Add(clientInfo._socket, clientInfo); + mClientList.Add(clientInfo); } } catch (Exception ex) @@ -168,15 +127,15 @@ namespace AxibugEmuOnline.Server.Manager /// <param name="client"></param> public void RemoveClient(ClientInfo client) { - lock (ClientList) + lock (mClientList) { - if (_DictUIDClient.ContainsKey(client.UID)) - _DictUIDClient.Remove(client.UID); + if (mDictUIDClient.ContainsKey(client.UID)) + mDictUIDClient.Remove(client.UID); - if (_DictSocketClient.ContainsKey(client._socket)) - _DictSocketClient.Remove(client._socket); + if (mDictSocketClient.ContainsKey(client._socket)) + mDictSocketClient.Remove(client._socket); - ClientList.Remove(client); + mClientList.Remove(client); } } @@ -186,15 +145,15 @@ namespace AxibugEmuOnline.Server.Manager /// <param name="client"></param> public bool GetClientByUID(long uid, out ClientInfo client, bool bNeedOnline = false) { - lock (ClientList) + lock (mClientList) { - if (!_DictUIDClient.ContainsKey(uid)) + if (!mDictUIDClient.ContainsKey(uid)) { client = null; return false; } - client = _DictUIDClient[uid]; + client = mDictUIDClient[uid]; if (bNeedOnline && client.IsOffline) @@ -205,12 +164,12 @@ namespace AxibugEmuOnline.Server.Manager public ClientInfo GetClientForUID(long UID) { - return _DictUIDClient.ContainsKey(UID) ? _DictUIDClient[UID] : null; + return mDictUIDClient.ContainsKey(UID) ? mDictUIDClient[UID] : null; } public ClientInfo GetClientForSocket(Socket sk) { - return _DictSocketClient.ContainsKey(sk) ? _DictSocketClient[sk] : null; + return mDictSocketClient.ContainsKey(sk) ? mDictSocketClient[sk] : null; } /// <summary> @@ -219,7 +178,7 @@ namespace AxibugEmuOnline.Server.Manager /// <returns></returns> public List<ClientInfo> GetOnlineClientList() { - return ClientList.Where(w => w.IsOffline == false).ToList(); + return mClientList.Where(w => w.IsOffline == false).ToList(); } @@ -229,10 +188,10 @@ namespace AxibugEmuOnline.Server.Manager /// <param name="sk"></param> public void SetClientOfflineForSocket(Socket sk) { - if (!_DictSocketClient.ContainsKey(sk)) + if (!mDictSocketClient.ContainsKey(sk)) return; - ClientInfo cinfo = _DictSocketClient[sk]; + ClientInfo cinfo = mDictSocketClient[sk]; Console.WriteLine("标记玩家UID" + cinfo.UID + "为离线"); cinfo.IsOffline = true; cinfo.LogOutDT = DateTime.Now; @@ -242,10 +201,10 @@ namespace AxibugEmuOnline.Server.Manager public void RemoveClientForSocket(Socket sk) { - if (!_DictSocketClient.ContainsKey(sk)) + if (!mDictSocketClient.ContainsKey(sk)) return; - RemoveClient(_DictSocketClient[sk]); + RemoveClient(mDictSocketClient[sk]); } #endregion @@ -320,7 +279,7 @@ namespace AxibugEmuOnline.Server.Manager public void ClientSendALL(int CMDID, int ERRCODE, byte[] data, long SkipUID = -1) { - ClientSend(ClientList, CMDID, ERRCODE, data, SkipUID); + ClientSend(mClientList, CMDID, ERRCODE, data, SkipUID); } public void ClientSend(List<long> UIDs, int CMDID, int ERRCODE, byte[] data, long SkipUID = -1) @@ -340,17 +299,18 @@ namespace AxibugEmuOnline.Server.Manager /// <param name="CMDID"></param> /// <param name="ERRCODE"></param> /// <param name="data"></param> - public void ClientSend(List<ClientInfo> _toclientlist, int CMDID, int ERRCODE, byte[] data, long SkipUID = -1) + public void ClientSend(IEnumerable<ClientInfo> _toclientlist, int CMDID, int ERRCODE, byte[] data, long SkipUID = -1) { - for (int i = 0; i < _toclientlist.Count(); i++) + //for (int i = 0; i < _toclientlist.Count(); i++) + foreach(var _c in _toclientlist) { - if (_toclientlist[i] == null || _toclientlist[i].IsOffline) + if (_c == null || _c.IsOffline) continue; - if (SkipUID > -1 && _toclientlist[i].UID == SkipUID) + if (SkipUID > -1 && _c.UID == SkipUID) continue; - AppSrv.g_SocketMgr.SendToSocket(_toclientlist[i]._socket, CMDID, ERRCODE, data); + AppSrv.g_SocketMgr.SendToSocket(_c._socket, CMDID, ERRCODE, data); } } @@ -376,7 +336,7 @@ namespace AxibugEmuOnline.Server.Manager public int GetOnlineClient() { - return ClientList.Where(w => !w.IsOffline).Count(); + return mClientList.Where(w => !w.IsOffline).Count(); } } } diff --git a/AxibugEmuOnline.Server/Manager/GameShareManager.cs b/AxibugEmuOnline.Server/Manager/GameShareManager.cs index 29d455ad..dc1b8304 100644 --- a/AxibugEmuOnline.Server/Manager/GameShareManager.cs +++ b/AxibugEmuOnline.Server/Manager/GameShareManager.cs @@ -1,4 +1,5 @@ using AxibugEmuOnline.Server.Common; +using AxibugEmuOnline.Server.Manager.Client; using AxibugEmuOnline.Server.NetWork; using AxibugProtobuf; using MySql.Data.MySqlClient; @@ -170,32 +171,34 @@ namespace AxibugEmuOnline.Server.Manager ptype = RomPlatformType.Invalid; using (MySqlConnection conn = SQLRUN.GetConn("GetRomPlatformType")) - { - try { - string query = "SELECT PlatformType from romlist where Id = ?RomID "; - using (var command = new MySqlCommand(query, conn)) + try { - // 设置参数值 - command.Parameters.AddWithValue("?RomID", RomID); - // 执行查询并处理结果 - using (var reader = command.ExecuteReader()) + string query = "SELECT PlatformType from romlist where Id = ?RomID "; + using (var command = new MySqlCommand(query, conn)) { - while (reader.Read()) + // 设置参数值 + command.Parameters.AddWithValue("?RomID", RomID); + // 执行查询并处理结果 + using (var reader = command.ExecuteReader()) { - ptype = (RomPlatformType)reader.GetInt32(0); + while (reader.Read()) + { + ptype = (RomPlatformType)reader.GetInt32(0); + } } } } - } - catch (Exception e) - { - AppSrv.g_Log.Error(e); - } + catch (Exception e) + { + AppSrv.g_Log.Error(e); + } } if (ptype == RomPlatformType.Invalid) AppSrv.g_Log.Error($"RomID {RomID} 没找到平台配置"); + else + mDictRomID2Platform[RomID] = ptype; return ptype; } diff --git a/AxibugEmuOnline.Server/Manager/LogManager.cs b/AxibugEmuOnline.Server/Manager/LogManager.cs index 89a22e54..84e41848 100644 --- a/AxibugEmuOnline.Server/Manager/LogManager.cs +++ b/AxibugEmuOnline.Server/Manager/LogManager.cs @@ -1,7 +1,4 @@ -using AxibugProtobuf; -using static Mysqlx.Expect.Open.Types; - -namespace AxibugEmuOnline.Server.Manager +namespace AxibugEmuOnline.Server.Manager { public class LogManager { diff --git a/AxibugEmuOnline.Server/Manager/LoginManager.cs b/AxibugEmuOnline.Server/Manager/LoginManager.cs index 63f5a2ed..f88db02a 100644 --- a/AxibugEmuOnline.Server/Manager/LoginManager.cs +++ b/AxibugEmuOnline.Server/Manager/LoginManager.cs @@ -1,5 +1,6 @@ using AxibugEmuOnline.Server.Common; using AxibugEmuOnline.Server.Event; +using AxibugEmuOnline.Server.Manager.Client; using AxibugEmuOnline.Server.NetWork; using AxibugProtobuf; using MySql.Data.MySqlClient; @@ -264,12 +265,15 @@ namespace AxibugEmuOnline.Server.Manager ProtoBufHelper.DeSerizlize<Protobuf_Token_Struct>(protobufData); byte[] encryptData = AESHelper.Encrypt(protobufData); string tobase64 = Convert.ToBase64String(encryptData); - return tobase64; + AppSrv.g_Log.Debug("token_base64=>" + tobase64); + string result = Uri.EscapeDataString(tobase64); + AppSrv.g_Log.Debug("token_urlcode=>" + result); + return result; } static Protobuf_Token_Struct DecrypToken(string tokenStr) { - byte[] encryptData = Convert.FromBase64String(tokenStr); + byte[] encryptData = Convert.FromBase64String(tokenStr); byte[] decryptData = AESHelper.Decrypt(encryptData); return ProtoBufHelper.DeSerizlize<Protobuf_Token_Struct>(decryptData); } diff --git a/AxibugEmuOnline.Server/Manager/Room/GameRoom.cs b/AxibugEmuOnline.Server/Manager/Room/GameRoom.cs new file mode 100644 index 00000000..46ff1965 --- /dev/null +++ b/AxibugEmuOnline.Server/Manager/Room/GameRoom.cs @@ -0,0 +1,756 @@ +using AxibugEmuOnline.Server.Common; +using AxibugEmuOnline.Server.Data; +using AxibugEmuOnline.Server.Manager.Client; +using AxibugProtobuf; + +namespace AxibugEmuOnline.Server.Manager.Room +{ + public class GameRoom : IDisposable + { + public int RoomID { get; private set; } + public int GameRomID { get; private set; } + public RomPlatformType GameRomPlatformType { get; private set; } + public string RomHash { get; private set; } + public long HostUID { get; private set; } + public long ScreenProviderUID { get; private set; } + public GameRoomSlot[] PlayerSlot { get; private set; } + public long Player1_UID => PlayerSlot[0].UID; + public long Player2_UID => PlayerSlot[1].UID; + public long Player3_UID => PlayerSlot[2].UID; + public long Player4_UID => PlayerSlot[3].UID; + public Google.Protobuf.ByteString? NextStateRaw { get; private set; } + public Google.Protobuf.ByteString? ScreenRaw { get; private set; } + //public bool[] PlayerReadyState { get; private set; } + public List<long> SynUIDs; + //public RoomPlayerState PlayerState => getPlayerState(); + private RoomGameState mGameState; + public uint mCurrServerFrameId = 0; + public ServerInputSnapShot mCurrInputData; + public Queue<(uint, ServerInputSnapShot)> mInputQueue; + + public List<double> send2time; + const int SynLimitOnSec = 61; + + Lock synInputLock = new Lock(); + //TODO + //public Dictionary<int, Queue<byte[]>> mDictPlayerIdx2SendQueue; + public RoomGameState GameState + { + get { return mGameState; } + set + { + if (mGameState != value) + { + mGameState = value; + switch (value) + { + case RoomGameState.WaitRawUpdate: + NextStateRaw = null; + break; + case RoomGameState.WaitReady: + ClearAllSlotReadyState();//清理玩家所有准备状态 + break; + } + } + } + } + /// <summary> + /// 服务器提前帧数 + /// </summary> + public uint SrvForwardFrames { get; set; } + + public void Init(int roomID, int gameRomID, string roomHash, long hostUId, bool bloadState = false, RomPlatformType ptype = default) + { + Dispose(); + RoomID = roomID; + GameRomID = gameRomID; + GameRomPlatformType = ptype; + RomHash = roomHash; + HostUID = hostUId; + ScreenProviderUID = hostUId; + + if (PlayerSlot == null) + { + PlayerSlot = new GameRoomSlot[4]; + for (uint i = 0; i < PlayerSlot.Length; i++) + PlayerSlot[i] = new GameRoomSlot(); + } + + for (uint i = 0; i < PlayerSlot.Length; i++) + PlayerSlot[i].Init(i); + + //PlayerReadyState = new bool[4]; + SynUIDs = ObjectPoolAuto.AcquireList<long>();//new List<long>();//广播角色列表 + GameState = RoomGameState.NoneGameState; + mCurrInputData = new ServerInputSnapShot(); + mInputQueue = ObjectPoolAuto.AcquireQueue<(uint, ServerInputSnapShot)>(); + // new Queue<(uint, ServerInputSnapShot)>(); + //mDictPlayerIdx2SendQueue = new Dictionary<int, Queue<byte[]>>(); + send2time = ObjectPoolAuto.AcquireList<double>(); + } + + /// <summary> + /// 房间释放时,需要调用 + /// </summary> + public void Dispose() + { + if (SynUIDs != null) + { + ObjectPoolAuto.Release(SynUIDs); + SynUIDs = null; + } + + if (mInputQueue != null) + { + ObjectPoolAuto.Release(mInputQueue); + mInputQueue = null; + } + + if (send2time != null) + { + ObjectPoolAuto.Release(send2time); + send2time = null; + } + } + + public bool GetSlotDataByUID(long uid, out Dictionary<uint, uint> slotIdx2JoyIdx) + { + slotIdx2JoyIdx = new Dictionary<uint, uint>(); + var dataarr = PlayerSlot.Where(w => w.UID == uid).ToArray(); + foreach (var slot in dataarr) + slotIdx2JoyIdx[slot.SlotIdx] = slot.LocalJoyIdx; + return slotIdx2JoyIdx.Count > 0; + } + /// <summary> + /// 按照SlotIdx设置Input + /// </summary> + /// <param name="slotIdx"></param> + void SetInputDataBySlotIdx(uint slotIdx, ServerInputSnapShot data) + { + ushort val = 0; + switch (GameRomPlatformType) + { + case RomPlatformType.Cps1: + case RomPlatformType.Cps2: + case RomPlatformType.Neogeo: + case RomPlatformType.Igs: + case RomPlatformType.ArcadeOld: + { + switch (slotIdx) + { + case 0: val = data.p1_ushort; break; + case 1: val = data.p2_ushort; break; + case 2: val = data.p3_ushort; break; + case 4: val = data.p4_ushort; break; + } + + //ushort 类型作为单个玩家操作 + switch (slotIdx) + { + case 0: mCurrInputData.p1_ushort = val; break; + case 1: mCurrInputData.p2_ushort = val; break; + case 2: mCurrInputData.p3_ushort = val; break; + case 4: mCurrInputData.p3_ushort = val; break; + } + } + break; + default: + { + switch (slotIdx) + { + case 0: val = data.p1_byte; break; + case 1: val = data.p2_byte; break; + case 2: val = data.p3_byte; break; + case 4: val = data.p4_byte; break; + } + //byte 类型作为单个玩家操作 + switch (slotIdx) + { + case 0: mCurrInputData.p1_byte = (byte)val; break; + case 1: mCurrInputData.p2_byte = (byte)val; break; + case 2: mCurrInputData.p3_byte = (byte)val; break; + case 4: mCurrInputData.p3_byte = (byte)val; break; + } + } + break; + } + } + /// <summary> + /// 按照UID清理SlotData + /// </summary> + /// <param name="uid"></param> + void ClearSlotDataByUid(long uid) + { + var dataarr = PlayerSlot.Where(w => w.UID == uid).ToArray(); + foreach (var slot in dataarr) + { + slot.Init(slot.SlotIdx); + ClearInputDataBySlotIdx(slot.SlotIdx); + } + } + /// <summary> + /// 按照SlotIdx清理SlotData + /// </summary> + /// <param name="slotIdx"></param> + void ClearSlotDataBySlotIdx(uint slotIdx) + { + PlayerSlot[slotIdx].Init(slotIdx); + ClearInputDataBySlotIdx(slotIdx); + } + /// <summary> + /// 按照SlotIdx清理Input + /// </summary> + /// <param name="slotIdx"></param> + void ClearInputDataBySlotIdx(uint slotIdx) + { + switch (GameRomPlatformType) + { + case RomPlatformType.Cps1: + case RomPlatformType.Cps2: + case RomPlatformType.Neogeo: + case RomPlatformType.Igs: + case RomPlatformType.ArcadeOld: + { + //ushort 类型作为单个玩家操作 + switch (slotIdx) + { + case 0: mCurrInputData.p1_ushort = 0; break; + case 1: mCurrInputData.p2_ushort = 0; break; + case 2: mCurrInputData.p3_ushort = 0; break; + case 4: mCurrInputData.p4_ushort = 0; break; + } + } + break; + default: + { + //byte 类型作为单个玩家操作 + switch (slotIdx) + { + case 0: mCurrInputData.p1_byte = 0; break; + case 1: mCurrInputData.p2_byte = 0; break; + case 2: mCurrInputData.p3_byte = 0; break; + case 4: mCurrInputData.p3_byte = 0; break; + } + } + break; + } + + } + /// <summary> + /// 更新同步名单 + /// </summary> + void UpdateSynUIDs() + { + for (int i = SynUIDs.Count - 1; i >= 0; i--) + { + long uid = SynUIDs[i]; + + bool bHad = false; + if (Player1_UID == uid) bHad = true; + else if (Player2_UID == uid) bHad = true; + else if (Player3_UID == uid) bHad = true; + else if (Player4_UID == uid) bHad = true; + if (!bHad) + SynUIDs.RemoveAt(i); + } + if (Player1_UID > 0 && !SynUIDs.Contains(Player1_UID)) SynUIDs.Add(Player1_UID); + if (Player2_UID > 0 && !SynUIDs.Contains(Player2_UID)) SynUIDs.Add(Player2_UID); + if (Player3_UID > 0 && !SynUIDs.Contains(Player3_UID)) SynUIDs.Add(Player3_UID); + if (Player4_UID > 0 && !SynUIDs.Contains(Player4_UID)) SynUIDs.Add(Player4_UID); + } + + #region 准备状态管理 + bool IsAllReady() + { + bool Ready = true; + if ( + (Player1_UID > 0 && !PlayerSlot[0].Ready) + || + (Player2_UID > 0 && !PlayerSlot[1].Ready) + || + (Player3_UID > 0 && !PlayerSlot[2].Ready) + || + (Player4_UID > 0 && !PlayerSlot[3].Ready) + ) + { + Ready = false; + } + return Ready; + } + /// <summary> + /// 清除所有槽位准备状态 + /// </summary> + void ClearAllSlotReadyState() + { + for (var i = 0; i < PlayerSlot.Length; i++) + { + PlayerSlot[i].Ready = false; + } + } + /// <summary> + /// 按照UID设置Ready信息 + /// </summary> + /// <param name="uid"></param> + void SetReadyByUid(long uid) + { + for (var i = 0; i < PlayerSlot.Length; i++) + { + if (PlayerSlot[i].UID == uid) + PlayerSlot[i].Ready = true; + } + } + #endregion + + public void SetPlayerSlotData(ClientInfo _c, ref readonly Dictionary<uint, (uint, GamePadType)> newSlotIdx2JoyIdx) + { + GetSlotDataByUID(_c.UID, out Dictionary<uint, uint> oldSlotIdx2JoyIdx); + HashSet<uint> diffSlotIdxs = ObjectPoolAuto.AcquireSet<uint>();// new HashSet<uint>(); + foreach (var old in oldSlotIdx2JoyIdx) + { + uint old_slotIdx = old.Key; + //如果旧位置已经不存在于新位置,则需要算作diff + if (!newSlotIdx2JoyIdx.ContainsKey(old_slotIdx)) + { + diffSlotIdxs.Add(old_slotIdx); continue; + } + uint old_slotjoyIdx = old.Value; + //如果旧位置不变,但客户端本地JoyIdx变化则算作diff + if (old_slotjoyIdx != newSlotIdx2JoyIdx[old_slotIdx].Item1) + { + diffSlotIdxs.Add(old_slotIdx); continue; + } + } + //如果是在旧数据中不存在的位置,则算作diff + foreach (var newdata in newSlotIdx2JoyIdx) + { + uint new_slotIdx = newdata.Key; + if (!oldSlotIdx2JoyIdx.ContainsKey(new_slotIdx)) + { + diffSlotIdxs.Add(new_slotIdx); continue; + } + } + //必要的diff slot 清理键值数据 + foreach (var diffSlotIdx in diffSlotIdxs) + { + ClearSlotDataBySlotIdx(diffSlotIdx); + } + //设置新的槽位 + foreach (var slotdata in newSlotIdx2JoyIdx) + { + PlayerSlot[slotdata.Key].LocalJoyIdx = slotdata.Value.Item1; + PlayerSlot[slotdata.Key].LocalGamePadType = slotdata.Value.Item2; + PlayerSlot[slotdata.Key].UID = _c.UID; + AppSrv.g_Log.DebugCmd($"SetPlayerSlot RoomID->{RoomID} _c.UID->{_c.UID} PlayerSlotIdx->{slotdata.Key} LocalJoyIdx->{slotdata.Value}"); + } + //更新需要同步的UID + UpdateSynUIDs(); + _c.RoomState.SetRoomData(this.RoomID); + + ObjectPoolAuto.Release(diffSlotIdxs); + } + public void RemovePlayer(ClientInfo _c) + { + ClearSlotDataByUid(_c.UID); + UpdateSynUIDs(); + _c.RoomState.ClearRoomData(); + } + public bool GetPlayerUIDByIdx(uint Idx, out long UID) + { + switch (Idx) + { + case 0: UID = Player1_UID; break; + case 1: UID = Player2_UID; break; + case 2: UID = Player3_UID; break; + case 3: UID = Player4_UID; break; + default: UID = -1; break; + } + return UID > 0; + } + public bool GetFreeSlot(out uint SlotIdx) + { + for (uint i = 0; i < PlayerSlot.Length; i++) + { + if (PlayerSlot[i].UID < 0) + { + SlotIdx = i; + return true; + } + } + SlotIdx = 0; + return false; + } + public bool GetPlayerClientByIdx(uint Idx, out ClientInfo _c) + { + _c = null; + if (!GetPlayerUIDByIdx(Idx, out long UID)) + return false; + + if (!AppSrv.g_ClientMgr.GetClientByUID(UID, out _c)) + return false; + + return true; + } + public void GetAllPlayerClientList(ref List<ClientInfo> list) + { + List<long> Uids = SynUIDs; + foreach (long uid in Uids) + { + if (!AppSrv.g_ClientMgr.GetClientByUID(uid, out ClientInfo _c, true)) + continue; + list.Add(_c); + } + } + + void SetInputBySlotIdxJoyIdx(uint SlotIdx, uint LocalJoyIdx, ServerInputSnapShot clieninput) + { + switch (LocalJoyIdx) + { + case 0: SetInputDataBySlotIdx(SlotIdx, clieninput); break; + case 1: SetInputDataBySlotIdx(SlotIdx, clieninput); break; + case 2: SetInputDataBySlotIdx(SlotIdx, clieninput); break; + case 3: SetInputDataBySlotIdx(SlotIdx, clieninput); break; + } + } + public int GetPlayerCount() + { + return SynUIDs.Count; + } + public void UpdateRoomForwardNum() + { + + List<ClientInfo> playerlist = ObjectPoolAuto.AcquireList<ClientInfo>(); + GetAllPlayerClientList(ref playerlist); + + double maxNetDelay = 0; + for (int i = 0; i < playerlist.Count; i++) + { + ClientInfo player = playerlist[i]; + maxNetDelay = Math.Max(maxNetDelay, player.AveNetDelay); + } + float MustTaskFrame = 1; + SrvForwardFrames = (uint)((maxNetDelay / 0.016f) + MustTaskFrame); + if (SrvForwardFrames < 2) + SrvForwardFrames = 2; + //AppSrv.g_Log.Debug($"服务器提前跑帧数:Max(2,({maxNetDelay} / {0.016f}) + {MustTaskFrame}) = {SrvForwardFrames}"); + + ObjectPoolAuto.Release(playerlist); + } + + #region 帧相关 + void StartNewTick() + { + mInputQueue.Clear(); + //mDictPlayerIdx2SendQueue.Clear(); + + mCurrServerFrameId = 0; + //??????????=>>mCurrInputData.all = 1; + + mCurrInputData.all = 0; + + UpdateRoomForwardNum(); + + uint StartForwardFrames = (SrvForwardFrames * 2) + 5; + StartForwardFrames = Math.Max(10, StartForwardFrames); + //服务器提前跑帧数 + for (int i = 0; i < StartForwardFrames; i++) + TakeFrame(); + + AppSrv.g_Log.Info($"房间初始提前量=>{StartForwardFrames},当前延迟提前量=>{SrvForwardFrames}"); + } + public void TakeFrame() + { + lock (synInputLock) + { + mInputQueue.Enqueue((mCurrServerFrameId, mCurrInputData)); + mCurrServerFrameId++; + if (mCurrServerFrameId % 60 == 0) + { + UpdateRoomForwardNum(); + } + } + } + #endregion + + ulong LastTestSend = 0; + internal ulong LastTestRecv; + + + /// <summary> + /// 广播数据 + /// </summary> + public void SynInputData() + { + List<(uint frameId, ServerInputSnapShot inputdata)> temp = new List<(uint frameId, ServerInputSnapShot inputdata)>(); + bool flagInitList = false; + lock (synInputLock) + { + #region 限制帧速率 + //double timeNow = AppSrv.g_Tick.timeNow; + //while (mInputQueue.Count > 0) + //{ + // if (send2time.Count >= SynLimitOnSec) + // { + // //AppSrv.g_Log.Info($"{timeNow} - {send2time[0]} =>{timeNow - send2time[0]}"); + // if (timeNow - send2time[0] < 1f) //最早的历史发送还在一秒之内 + // break; + // else + // send2time.RemoveAt(0); + // } + // if (!flagInitList) + // { + // flagInitList = true; + // //temp = new List<(uint frameId, ServerInputSnapShot inputdata)>(); + // temp = ObjectPoolAuto.AcquireList<(uint frameId, ServerInputSnapShot inputdata)>(); + // } + // temp.Add(mInputQueue.Dequeue()); + // send2time.Add(timeNow); + //} + + //第二种限制速率办法 + //int SendCount = 0; ; + //while (mInputQueue.Count > 0) + //{ + // SendCount++; + // temp.Add(mInputQueue.Dequeue()); + // if (SendCount >= SynLimitOnSec) + // { + // AppSrv.g_Log.Debug($"outSide SendCount=>{SendCount},morequeue.count->{mInputQueue.Count}"); + // break; + // } + //} + #endregion + + int SendCount = 0; ; + while (mInputQueue.Count > 0) + { + SendCount++; + temp.Add(mInputQueue.Dequeue()); + if (SendCount >= SynLimitOnSec) + { + AppSrv.g_Log.Debug($"outSide SendCount=>{SendCount},morequeue.count->{mInputQueue.Count}"); + break; + } + } + } + + //if (!flagInitList) + // return; + + for (int i = 0; i < temp.Count; i++) + { + (uint frameId, ServerInputSnapShot inputdata) data = temp[i]; + + Protobuf_Room_Syn_RoomFrameAllInputData resp = new Protobuf_Room_Syn_RoomFrameAllInputData() + { + FrameID = data.frameId, + InputData = data.inputdata.all, + ServerFrameID = mCurrServerFrameId, + ServerForwardCount = this.SrvForwardFrames + }; + AppSrv.g_ClientMgr.ClientSend(SynUIDs, (int)CommandID.CmdRoomSynPlayerInput, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(resp)); + //if (LastTestSend != data.inputdata.all) + //{ + // LastTestSend = data.inputdata.all; + // AppSrv.g_Log.Debug($" {DateTime.Now.ToString("hh:mm:ss.fff")} SynInput=> RoomID->{RoomID} ServerFrameID->{mCurrServerFrameId} SynUIDs=>{string.Join(",", SynUIDs)} "); + //} + } + + ObjectPoolAuto.Release(temp); + } + + bool CheckRoomStateChange(int oldPlayerCount, int newPlayerCount) + { + bool bChanged = false; + bool bNewToOnlyHost = (oldPlayerCount != 1 && newPlayerCount == 1); + bool bMorePlayer = (oldPlayerCount < 2 && newPlayerCount >= 2) || (newPlayerCount > oldPlayerCount); + switch (this.GameState) + { + case RoomGameState.NoneGameState: + if (bNewToOnlyHost) + { + this.GameState = RoomGameState.OnlyHost; + bChanged = true; + } + break; + case RoomGameState.OnlyHost: + if (bMorePlayer)//加入更多玩家 + { + this.GameState = RoomGameState.WaitRawUpdate; + bChanged = true; + break; + } + break; + case RoomGameState.WaitRawUpdate: + if (bMorePlayer)//加入更多玩家 + { + this.GameState = RoomGameState.WaitRawUpdate; + bChanged = true; + break; + } + if (NextStateRaw != null)//已经上传即时存档 + { + this.GameState = RoomGameState.WaitReady; + bChanged = true; + break; + } + break; + case RoomGameState.WaitReady: + if (bMorePlayer)//加入更多玩家 + { + this.GameState = RoomGameState.WaitRawUpdate; + bChanged = true; + break; + } + //没有未准备的 + bool bAllReady = IsAllReady(); + if (bAllReady) + { + this.GameState = RoomGameState.InOnlineGame; + //新开Tick + StartNewTick(); + bChanged = true; + break; + } + break; + case RoomGameState.Pause: + if (bMorePlayer)//加入更多玩家 + { + this.GameState = RoomGameState.WaitRawUpdate; + bChanged = true; + break; + } + break; + case RoomGameState.InOnlineGame: + if (bMorePlayer)//加入更多玩家 + { + this.GameState = RoomGameState.WaitRawUpdate; + bChanged = true; + break; + } + break; + } + + + + //房主离线,自动选择延迟最低另一名玩家做房主 + if (!GetSlotDataByUID(this.HostUID, out Dictionary<uint, uint> slotIdx2JoyIdx)) + { + List<ClientInfo> userlist = ObjectPoolAuto.AcquireList<ClientInfo>(); + GetAllPlayerClientList(ref userlist); + if (userlist.Count > 0) + { + ClientInfo? client = userlist.OrderBy(w => w.AveNetDelay).FirstOrDefault(); + this.HostUID = client.UID; + AppSrv.g_Log.DebugCmd($"更换房主为{this.HostUID}"); + bChanged = true; + } + ObjectPoolAuto.Release(userlist); + } + + if (this.GameState > RoomGameState.OnlyHost && newPlayerCount == 1) + { + this.GameState = RoomGameState.OnlyHost; + AppSrv.g_Log.DebugCmd("回到OnlyHost状态"); + bChanged = true; + } + + + return bChanged; + } + + + #region 对外开放函数 + + #region 房间进出 + /// <summary> + /// 进入房间 + /// </summary> + /// <param name="RoomID"></param> + /// <param name="PlayerNum"></param> + /// <param name="_c"></param> + /// <param name="errcode"></param> + /// <returns></returns> + public bool Join(uint slotIdx, uint joyIdx, ClientInfo _c, out ErrorCode errcode, out bool bHadRoomStateChange) + { + bHadRoomStateChange = false; + int oldPlayerCount = GetPlayerCount(); + if (GetPlayerUIDByIdx(slotIdx, out long hadUID)) + { + errcode = ErrorCode.ErrorRoomSlotAlreadlyHadPlayer; + return false; + } + AppSrv.g_Log.Debug($"Join _c.UID->{_c.UID} RoomID->{RoomID}"); + Dictionary<uint, (uint, GamePadType)> slotInfo = new Dictionary<uint, (uint, GamePadType)>(); + slotInfo[slotIdx] = (joyIdx, GamePadType.GlobalGamePad); + SetPlayerSlotData(_c, ref slotInfo); + int newPlayerCount = GetPlayerCount(); + errcode = ErrorCode.ErrorOk; + bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); + return true; + } + + /// <summary> + /// 离开房间 + /// </summary> + /// <param name="RoomID"></param> + /// <param name="_c"></param> + /// <param name="errcode"></param> + /// <returns></returns> + public bool Leave(ClientInfo _c, out ErrorCode errcode, out bool bHadRoomStateChange) + { + int oldPlayerCount = GetPlayerCount(); + RemovePlayer(_c); + int newPlayerCount = GetPlayerCount(); + errcode = ErrorCode.ErrorOk; + bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); + return true; + } + #endregion + public void SetPlayerInput(long UID, uint FrameID, ServerInputSnapShot clieninput) + { + for (uint i = 0; i < PlayerSlot.Count(); i++) + { + GameRoomSlot slotData = PlayerSlot[i]; + if (slotData.UID != UID) + continue; + SetInputBySlotIdxJoyIdx(slotData.SlotIdx, slotData.LocalJoyIdx, clieninput); + } + } + public bool SetRePlayerReady(long UID, out ErrorCode errcode, out bool bHadRoomStateChange) + { + int oldPlayerCount = GetPlayerCount(); + SetReadyByUid(UID); + int newPlayerCount = GetPlayerCount(); + errcode = ErrorCode.ErrorOk; + bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); + return true; + } + public void SetLoadRaw(Google.Protobuf.ByteString NextStateRaw, out bool bHadRoomStateChange) + { + int oldPlayerCount = GetPlayerCount(); + AppSrv.g_Log.Debug($"SetLoadRaw proto Lenght->{NextStateRaw.Length}"); + this.NextStateRaw = NextStateRaw; + int newPlayerCount = GetPlayerCount(); + bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); + } + public void InputScreenData(Google.Protobuf.ByteString screenRaw) + { + this.ScreenRaw = NextStateRaw; + } + + + #region 客户端推帧方案 + public bool GetNeedForwardTick(uint clientFrame, out long forwaFrame) + { + forwaFrame = 0; + //目标帧,客户端+服务器提前量 + long targetFrame = clientFrame + SrvForwardFrames; + if (targetFrame > mCurrServerFrameId)//更靠前 + forwaFrame = targetFrame - mCurrServerFrameId; + return forwaFrame > 0; + } + #endregion + + #endregion + } +} diff --git a/AxibugEmuOnline.Server/Manager/Room/GameRoomSlot.cs b/AxibugEmuOnline.Server/Manager/Room/GameRoomSlot.cs new file mode 100644 index 00000000..11b69f7f --- /dev/null +++ b/AxibugEmuOnline.Server/Manager/Room/GameRoomSlot.cs @@ -0,0 +1,20 @@ +using AxibugProtobuf; + +namespace AxibugEmuOnline.Server.Manager.Room +{ + public class GameRoomSlot + { + public uint SlotIdx { get; set; } + public long UID { get; set; } + public uint LocalJoyIdx { get; set; } + public GamePadType LocalGamePadType { get; set; } + public bool Ready = false; + public void Init(uint SlotIdx) + { + this.SlotIdx = SlotIdx; + UID = -1; + LocalJoyIdx = 0; + Ready = false; + } + } +} diff --git a/AxibugEmuOnline.Server/Manager/RoomManager.cs b/AxibugEmuOnline.Server/Manager/RoomManager.cs index 23c5f5ed..f2ab0889 100644 --- a/AxibugEmuOnline.Server/Manager/RoomManager.cs +++ b/AxibugEmuOnline.Server/Manager/RoomManager.cs @@ -1,21 +1,18 @@ using AxibugEmuOnline.Server.Common; +using AxibugEmuOnline.Server.Data; using AxibugEmuOnline.Server.Manager; +using AxibugEmuOnline.Server.Manager.Client; +using AxibugEmuOnline.Server.Manager.Room; using AxibugEmuOnline.Server.NetWork; using AxibugProtobuf; using MySql.Data.MySqlClient; -using Org.BouncyCastle.Crypto.Parameters; -using System.Collections.Generic; -using System.Data; using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Security.Policy; namespace AxibugEmuOnline.Server { - public class RoomManager { - Dictionary<int, Data_RoomData> mDictRoom = new Dictionary<int, Data_RoomData>(); + Dictionary<int, GameRoom> mDictRoom = new Dictionary<int, GameRoom>(); List<int> mKeyRoomList = new List<int>(); AutoResetEvent roomTickARE; Thread threadRoomTick; @@ -53,7 +50,7 @@ namespace AxibugEmuOnline.Server return RoomIDSeed++; } - void AddRoom(Data_RoomData data) + void AddRoom(GameRoom data) { lock (mDictRoom) { @@ -79,14 +76,14 @@ namespace AxibugEmuOnline.Server } } - public Data_RoomData GetRoomData(int RoomID) + public GameRoom GetRoomData(int RoomID) { - if (!mDictRoom.TryGetValue(RoomID, out Data_RoomData data)) + if (!mDictRoom.TryGetValue(RoomID, out GameRoom data)) return null; return data; } - public void GetRoomList(ref List<Data_RoomData> roomList) + public void GetRoomList(ref List<GameRoom> roomList) { lock (mDictRoom) { @@ -136,7 +133,7 @@ namespace AxibugEmuOnline.Server } #endregion - private Protobuf_Room_MiniInfo GetProtoDataRoom(Data_RoomData room) + private Protobuf_Room_MiniInfo GetProtoDataRoom(GameRoom room) { Protobuf_Room_MiniInfo result = new Protobuf_Room_MiniInfo() { @@ -153,7 +150,7 @@ namespace AxibugEmuOnline.Server for (byte i = 0; i < room.PlayerSlot.Count(); i++) { Protobuf_Room_GamePlaySlot pbSlot = new Protobuf_Room_GamePlaySlot(); - Data_RoomSlot slot = room.PlayerSlot[i]; + GameRoomSlot slot = room.PlayerSlot[i]; if (slot.UID > 0) { pbSlot.PlayerUID = slot.UID; @@ -178,7 +175,7 @@ namespace AxibugEmuOnline.Server Protobuf_Room_List msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_List>(reqData); Protobuf_Room_List_RESP resp = new Protobuf_Room_List_RESP(); - List<Data_RoomData> temp = ObjectPoolAuto.AcquireList<Data_RoomData>(); + List<GameRoom> temp = ObjectPoolAuto.AcquireList<GameRoom>(); GetRoomList(ref temp); foreach (var room in temp) resp.RoomMiniInfoList.Add(GetProtoDataRoom(room)); @@ -191,7 +188,7 @@ namespace AxibugEmuOnline.Server ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(sk); Protobuf_Room_Get_Screen msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_Get_Screen>(reqData); - Data_RoomData room = GetRoomData(_c.RoomState.RoomID); + GameRoom room = GetRoomData(_c.RoomState.RoomID); bool bHadRoomStateChange = false; ErrorCode Errcode = ErrorCode.ErrorOk; Protobuf_Room_Get_Screen_RESP resp = new Protobuf_Room_Get_Screen_RESP(); @@ -212,7 +209,7 @@ namespace AxibugEmuOnline.Server /// </summary> /// <param name="RoomID"></param> /// <param name="type">//[0] 更新或新增 [1] 删除</param> - public void SendRoomUpdateToAll(Data_RoomData room, int type) + public void SendRoomUpdateToAll(GameRoom room, int type) { if (room == null) return; @@ -232,7 +229,7 @@ namespace AxibugEmuOnline.Server ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(sk); Protobuf_Room_Create msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_Create>(reqData); Protobuf_Room_Create_RESP resp = new Protobuf_Room_Create_RESP(); - Data_RoomData newRoom = new Data_RoomData(); + GameRoom newRoom = new GameRoom(); RomPlatformType ptype = AppSrv.g_GameShareMgr.GetRomPlatformType(msg.GameRomID); newRoom.Init(GetNewRoomID(), msg.GameRomID, msg.GameRomHash, _c.UID, false, ptype); @@ -261,7 +258,7 @@ namespace AxibugEmuOnline.Server Protobuf_Room_Join msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_Join>(reqData); Protobuf_Room_Join_RESP resp = new Protobuf_Room_Join_RESP(); ErrorCode joinErrcode; - Data_RoomData room = GetRoomData(msg.RoomID); + GameRoom room = GetRoomData(msg.RoomID); bool bHadRoomStateChange = false; if (room == null) { @@ -285,7 +282,7 @@ namespace AxibugEmuOnline.Server //加入 if (room.Join(SlotIdx, (uint)0, _c, out joinErrcode, out bHadRoomStateChange)) { - Data_RoomData roomData = GetRoomData(msg.RoomID); + GameRoom roomData = GetRoomData(msg.RoomID); resp.RoomMiniInfo = GetProtoDataRoom(roomData); } @@ -338,7 +335,7 @@ namespace AxibugEmuOnline.Server return; Protobuf_Room_Leave_RESP resp = new Protobuf_Room_Leave_RESP(); ErrorCode errcode; - Data_RoomData room = GetRoomData(_c.RoomState.RoomID); + GameRoom room = GetRoomData(_c.RoomState.RoomID); bool bHadRoomStateChange = false; if (room == null) { @@ -375,7 +372,7 @@ namespace AxibugEmuOnline.Server Protobuf_Room_Change_PlaySlotWithJoy msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_Change_PlaySlotWithJoy>(reqData); Protobuf_Room_Change_PlaySlotWithJoy_RESP resp = new Protobuf_Room_Change_PlaySlotWithJoy_RESP(); ErrorCode errcode = ErrorCode.ErrorOk; - Data_RoomData room = GetRoomData(_c.RoomState.RoomID); + GameRoom room = GetRoomData(_c.RoomState.RoomID); if (room == null) { errcode = ErrorCode.ErrorRoomNotFound; @@ -413,7 +410,7 @@ namespace AxibugEmuOnline.Server Protobuf_Room_HostPlayer_UpdateStateRaw msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_HostPlayer_UpdateStateRaw>(reqData); Protobuf_Room_HostPlayer_UpdateStateRaw_RESP resp = new Protobuf_Room_HostPlayer_UpdateStateRaw_RESP(); ErrorCode errcode = ErrorCode.ErrorOk; - Data_RoomData room = GetRoomData(_c.RoomState.RoomID); + GameRoom room = GetRoomData(_c.RoomState.RoomID); if (room == null) errcode = ErrorCode.ErrorRoomNotFound; else if (room.GameState != RoomGameState.WaitRawUpdate) @@ -435,7 +432,7 @@ namespace AxibugEmuOnline.Server AppSrv.g_Log.DebugCmd($"OnRoomPlayerReady _c->{_c.UID}"); Protobuf_Room_Player_Ready msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_Player_Ready>(reqData); ErrorCode errcode = ErrorCode.ErrorOk; - Data_RoomData room = GetRoomData(_c.RoomState.RoomID); + GameRoom room = GetRoomData(_c.RoomState.RoomID); if (room == null) return; lock (room) @@ -453,7 +450,7 @@ namespace AxibugEmuOnline.Server { ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(sk); Protobuf_Room_SinglePlayerInputData msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_SinglePlayerInputData>(reqData); - Data_RoomData room = GetRoomData(_c.RoomState.RoomID); + GameRoom room = GetRoomData(_c.RoomState.RoomID); if (room == null) return; @@ -496,7 +493,9 @@ namespace AxibugEmuOnline.Server if (room.LastTestRecv != room.mCurrInputData.all) { room.LastTestRecv = room.mCurrInputData.all; - //AppSrv.g_Log.Debug($" {DateTime.Now.ToString("hh:mm:ss.fff")} SynTestRecv=> UID->{_c.UID} roomId->{room.mCurrServerFrameId} input->{msg.InputData}"); +#if DEBUG + AppSrv.g_Log.Debug($" {DateTime.Now.ToString("hh:mm:ss.fff")} SynTestRecv=> UID->{_c.UID} roomId->{room.mCurrServerFrameId} input->{msg.InputData}"); +#endif } } @@ -505,7 +504,7 @@ namespace AxibugEmuOnline.Server AppSrv.g_Log.DebugCmd($"OnCmdScreen lenght:{reqData.Length}"); ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(sk); Protobuf_Screnn_Frame msg = ProtoBufHelper.DeSerizlize<Protobuf_Screnn_Frame>(reqData); - Data_RoomData room = AppSrv.g_Room.GetRoomData(msg.RoomID); + GameRoom room = AppSrv.g_Room.GetRoomData(msg.RoomID); room.InputScreenData(msg.RawBitmap); } @@ -515,7 +514,7 @@ namespace AxibugEmuOnline.Server /// <param name="RoomID"></param> public void Protobuf_Room_MyRoom_State_Change(int RoomID) { - Data_RoomData room = GetRoomData(RoomID); + GameRoom room = GetRoomData(RoomID); if (room == null) return; @@ -539,7 +538,7 @@ namespace AxibugEmuOnline.Server /// 广播联机Step /// </summary> /// <param name="room"></param> - public void SendRoomStepChange(Data_RoomData room) + public void SendRoomStepChange(GameRoom room) { List<ClientInfo> roomClient = ObjectPoolAuto.AcquireList<ClientInfo>(); @@ -599,7 +598,7 @@ namespace AxibugEmuOnline.Server for (int i = 0; i < mKeyRoomList.Count; i++) { int roomid = mKeyRoomList[i]; - if (!mDictRoom.TryGetValue(roomid, out Data_RoomData room) || room.GameState < RoomGameState.InOnlineGame) + if (!mDictRoom.TryGetValue(roomid, out GameRoom room) || room.GameState < RoomGameState.InOnlineGame) continue; //更新帧(服务器主动跑时用) room.TakeFrame(); @@ -610,793 +609,5 @@ namespace AxibugEmuOnline.Server #endregion } - public class Data_RoomData : IDisposable - { - public int RoomID { get; private set; } - public int GameRomID { get; private set; } - public RomPlatformType GameRomPlatformType { get; private set; } - public string RomHash { get; private set; } - public long HostUID { get; private set; } - public long ScreenProviderUID { get; private set; } - public Data_RoomSlot[] PlayerSlot { get; private set; } - public long Player1_UID => PlayerSlot[0].UID; - public long Player2_UID => PlayerSlot[1].UID; - public long Player3_UID => PlayerSlot[2].UID; - public long Player4_UID => PlayerSlot[3].UID; - public Google.Protobuf.ByteString? NextStateRaw { get; private set; } - public Google.Protobuf.ByteString? ScreenRaw { get; private set; } - //public bool[] PlayerReadyState { get; private set; } - public List<long> SynUIDs; - //public RoomPlayerState PlayerState => getPlayerState(); - private RoomGameState mGameState; - public uint mCurrServerFrameId = 0; - public ServerInputSnapShot mCurrInputData; - public Queue<(uint, ServerInputSnapShot)> mInputQueue; - public List<double> send2time; - const int SynLimitOnSec = 61; - - object synInputLock = new object(); - //TODO - //public Dictionary<int, Queue<byte[]>> mDictPlayerIdx2SendQueue; - public RoomGameState GameState - { - get { return mGameState; } - set - { - if (mGameState != value) - { - mGameState = value; - switch (value) - { - case RoomGameState.WaitRawUpdate: - NextStateRaw = null; - break; - case RoomGameState.WaitReady: - ClearAllSlotReadyState();//清理玩家所有准备状态 - break; - } - } - } - } - /// <summary> - /// 服务器提前帧数 - /// </summary> - public uint SrvForwardFrames { get; set; } - - public void Init(int roomID, int gameRomID, string roomHash, long hostUId, bool bloadState = false, RomPlatformType ptype = default) - { - Dispose(); - RoomID = roomID; - GameRomID = gameRomID; - GameRomPlatformType = ptype; - RomHash = roomHash; - HostUID = hostUId; - ScreenProviderUID = hostUId; - - if (PlayerSlot == null) - { - PlayerSlot = new Data_RoomSlot[4]; - for (uint i = 0; i < PlayerSlot.Length; i++) - PlayerSlot[i] = new Data_RoomSlot(); - } - - for (uint i = 0; i < PlayerSlot.Length; i++) - PlayerSlot[i].Init(i); - - //PlayerReadyState = new bool[4]; - SynUIDs = ObjectPoolAuto.AcquireList<long>();//new List<long>();//广播角色列表 - GameState = RoomGameState.NoneGameState; - mCurrInputData = new ServerInputSnapShot(); - mInputQueue = ObjectPoolAuto.AcquireQueue<(uint, ServerInputSnapShot)>(); - // new Queue<(uint, ServerInputSnapShot)>(); - //mDictPlayerIdx2SendQueue = new Dictionary<int, Queue<byte[]>>(); - send2time = ObjectPoolAuto.AcquireList<double>(); - } - - /// <summary> - /// 房间释放时,需要调用 - /// </summary> - public void Dispose() - { - if (SynUIDs != null) - { - ObjectPoolAuto.Release(SynUIDs); - SynUIDs = null; - } - - if (mInputQueue != null) - { - ObjectPoolAuto.Release(mInputQueue); - mInputQueue = null; - } - - if (send2time != null) - { - ObjectPoolAuto.Release(send2time); - send2time = null; - } - } - - public bool GetSlotDataByUID(long uid, out Dictionary<uint, uint> slotIdx2JoyIdx) - { - slotIdx2JoyIdx = new Dictionary<uint, uint>(); - var dataarr = PlayerSlot.Where(w => w.UID == uid).ToArray(); - foreach (var slot in dataarr) - slotIdx2JoyIdx[slot.SlotIdx] = slot.LocalJoyIdx; - return slotIdx2JoyIdx.Count > 0; - } - /// <summary> - /// 按照SlotIdx设置Input - /// </summary> - /// <param name="slotIdx"></param> - void SetInputDataBySlotIdx(uint slotIdx, ServerInputSnapShot data) - { - ushort val = 0; - switch (GameRomPlatformType) - { - case RomPlatformType.Cps1: - case RomPlatformType.Cps2: - case RomPlatformType.Neogeo: - case RomPlatformType.Igs: - case RomPlatformType.ArcadeOld: - { - switch (slotIdx) - { - case 0: val = data.p1_ushort; break; - case 1: val = data.p2_ushort; break; - case 2: val = data.p3_ushort; break; - case 4: val = data.p4_ushort; break; - } - - //ushort 类型作为单个玩家操作 - switch (slotIdx) - { - case 0: mCurrInputData.p1_ushort = val; break; - case 1: mCurrInputData.p2_ushort = val; break; - case 2: mCurrInputData.p3_ushort = val; break; - case 4: mCurrInputData.p3_ushort = val; break; - } - } - break; - default: - { - switch (slotIdx) - { - case 0: val = data.p1_byte; break; - case 1: val = data.p2_byte; break; - case 2: val = data.p3_byte; break; - case 4: val = data.p4_byte; break; - } - //byte 类型作为单个玩家操作 - switch (slotIdx) - { - case 0: mCurrInputData.p1_byte = (byte)val; break; - case 1: mCurrInputData.p2_byte = (byte)val; break; - case 2: mCurrInputData.p3_byte = (byte)val; break; - case 4: mCurrInputData.p3_byte = (byte)val; break; - } - } - break; - } - } - /// <summary> - /// 按照UID清理SlotData - /// </summary> - /// <param name="uid"></param> - void ClearSlotDataByUid(long uid) - { - var dataarr = PlayerSlot.Where(w => w.UID == uid).ToArray(); - foreach (var slot in dataarr) - { - slot.Init(slot.SlotIdx); - ClearInputDataBySlotIdx(slot.SlotIdx); - } - } - /// <summary> - /// 按照SlotIdx清理SlotData - /// </summary> - /// <param name="slotIdx"></param> - void ClearSlotDataBySlotIdx(uint slotIdx) - { - PlayerSlot[slotIdx].Init(slotIdx); - ClearInputDataBySlotIdx(slotIdx); - } - /// <summary> - /// 按照SlotIdx清理Input - /// </summary> - /// <param name="slotIdx"></param> - void ClearInputDataBySlotIdx(uint slotIdx) - { - switch (GameRomPlatformType) - { - case RomPlatformType.Cps1: - case RomPlatformType.Cps2: - case RomPlatformType.Neogeo: - case RomPlatformType.Igs: - case RomPlatformType.ArcadeOld: - { - //ushort 类型作为单个玩家操作 - switch (slotIdx) - { - case 0: mCurrInputData.p1_ushort = 0; break; - case 1: mCurrInputData.p2_ushort = 0; break; - case 2: mCurrInputData.p3_ushort = 0; break; - case 4: mCurrInputData.p4_ushort = 0; break; - } - } - break; - default: - { - //byte 类型作为单个玩家操作 - switch (slotIdx) - { - case 0: mCurrInputData.p1_byte = 0; break; - case 1: mCurrInputData.p2_byte = 0; break; - case 2: mCurrInputData.p3_byte = 0; break; - case 4: mCurrInputData.p3_byte = 0; break; - } - } - break; - } - - } - /// <summary> - /// 更新同步名单 - /// </summary> - void UpdateSynUIDs() - { - for (int i = SynUIDs.Count - 1; i >= 0; i--) - { - long uid = SynUIDs[i]; - - bool bHad = false; - if (Player1_UID == uid) bHad = true; - else if (Player2_UID == uid) bHad = true; - else if (Player3_UID == uid) bHad = true; - else if (Player4_UID == uid) bHad = true; - if (!bHad) - SynUIDs.RemoveAt(i); - } - if (Player1_UID > 0 && !SynUIDs.Contains(Player1_UID)) SynUIDs.Add(Player1_UID); - if (Player2_UID > 0 && !SynUIDs.Contains(Player2_UID)) SynUIDs.Add(Player2_UID); - if (Player3_UID > 0 && !SynUIDs.Contains(Player3_UID)) SynUIDs.Add(Player3_UID); - if (Player4_UID > 0 && !SynUIDs.Contains(Player4_UID)) SynUIDs.Add(Player4_UID); - } - - #region 准备状态管理 - bool IsAllReady() - { - bool Ready = true; - if ( - (Player1_UID > 0 && !PlayerSlot[0].Ready) - || - (Player2_UID > 0 && !PlayerSlot[1].Ready) - || - (Player3_UID > 0 && !PlayerSlot[2].Ready) - || - (Player4_UID > 0 && !PlayerSlot[3].Ready) - ) - { - Ready = false; - } - return Ready; - } - /// <summary> - /// 清除所有槽位准备状态 - /// </summary> - void ClearAllSlotReadyState() - { - for (var i = 0; i < PlayerSlot.Length; i++) - { - PlayerSlot[i].Ready = false; - } - } - /// <summary> - /// 按照UID设置Ready信息 - /// </summary> - /// <param name="uid"></param> - void SetReadyByUid(long uid) - { - for (var i = 0; i < PlayerSlot.Length; i++) - { - if (PlayerSlot[i].UID == uid) - PlayerSlot[i].Ready = true; - } - } - #endregion - - public void SetPlayerSlotData(ClientInfo _c, ref readonly Dictionary<uint, (uint, GamePadType)> newSlotIdx2JoyIdx) - { - GetSlotDataByUID(_c.UID, out Dictionary<uint, uint> oldSlotIdx2JoyIdx); - HashSet<uint> diffSlotIdxs = ObjectPoolAuto.AcquireSet<uint>();// new HashSet<uint>(); - foreach (var old in oldSlotIdx2JoyIdx) - { - uint old_slotIdx = old.Key; - //如果旧位置已经不存在于新位置,则需要算作diff - if (!newSlotIdx2JoyIdx.ContainsKey(old_slotIdx)) - { - diffSlotIdxs.Add(old_slotIdx); continue; - } - uint old_slotjoyIdx = old.Value; - //如果旧位置不变,但客户端本地JoyIdx变化则算作diff - if (old_slotjoyIdx != newSlotIdx2JoyIdx[old_slotIdx].Item1) - { - diffSlotIdxs.Add(old_slotIdx); continue; - } - } - //如果是在旧数据中不存在的位置,则算作diff - foreach (var newdata in newSlotIdx2JoyIdx) - { - uint new_slotIdx = newdata.Key; - if (!oldSlotIdx2JoyIdx.ContainsKey(new_slotIdx)) - { - diffSlotIdxs.Add(new_slotIdx); continue; - } - } - //必要的diff slot 清理键值数据 - foreach (var diffSlotIdx in diffSlotIdxs) - { - ClearSlotDataBySlotIdx(diffSlotIdx); - } - //设置新的槽位 - foreach (var slotdata in newSlotIdx2JoyIdx) - { - PlayerSlot[slotdata.Key].LocalJoyIdx = slotdata.Value.Item1; - PlayerSlot[slotdata.Key].LocalGamePadType = slotdata.Value.Item2; - PlayerSlot[slotdata.Key].UID = _c.UID; - AppSrv.g_Log.DebugCmd($"SetPlayerSlot RoomID->{RoomID} _c.UID->{_c.UID} PlayerSlotIdx->{slotdata.Key} LocalJoyIdx->{slotdata.Value}"); - } - //更新需要同步的UID - UpdateSynUIDs(); - _c.RoomState.SetRoomData(this.RoomID); - - ObjectPoolAuto.Release(diffSlotIdxs); - } - public void RemovePlayer(ClientInfo _c) - { - ClearSlotDataByUid(_c.UID); - UpdateSynUIDs(); - _c.RoomState.ClearRoomData(); - } - public bool GetPlayerUIDByIdx(uint Idx, out long UID) - { - switch (Idx) - { - case 0: UID = Player1_UID; break; - case 1: UID = Player2_UID; break; - case 2: UID = Player3_UID; break; - case 3: UID = Player4_UID; break; - default: UID = -1; break; - } - return UID > 0; - } - public bool GetFreeSlot(out uint SlotIdx) - { - for (uint i = 0; i < PlayerSlot.Length; i++) - { - if (PlayerSlot[i].UID < 0) - { - SlotIdx = i; - return true; - } - } - SlotIdx = 0; - return false; - } - public bool GetPlayerClientByIdx(uint Idx, out ClientInfo _c) - { - _c = null; - if (!GetPlayerUIDByIdx(Idx, out long UID)) - return false; - - if (!AppSrv.g_ClientMgr.GetClientByUID(UID, out _c)) - return false; - - return true; - } - public void GetAllPlayerClientList(ref List<ClientInfo> list) - { - List<long> Uids = SynUIDs; - foreach (long uid in Uids) - { - if (!AppSrv.g_ClientMgr.GetClientByUID(uid, out ClientInfo _c, true)) - continue; - list.Add(_c); - } - } - - void SetInputBySlotIdxJoyIdx(uint SlotIdx, uint LocalJoyIdx, ServerInputSnapShot clieninput) - { - switch (LocalJoyIdx) - { - case 0: SetInputDataBySlotIdx(SlotIdx, clieninput); break; - case 1: SetInputDataBySlotIdx(SlotIdx, clieninput); break; - case 2: SetInputDataBySlotIdx(SlotIdx, clieninput); break; - case 3: SetInputDataBySlotIdx(SlotIdx, clieninput); break; - } - } - public int GetPlayerCount() - { - return SynUIDs.Count; - } - public void UpdateRoomForwardNum() - { - - List<ClientInfo> playerlist = ObjectPoolAuto.AcquireList<ClientInfo>(); - GetAllPlayerClientList(ref playerlist); - - double maxNetDelay = 0; - for (int i = 0; i < playerlist.Count; i++) - { - ClientInfo player = playerlist[i]; - maxNetDelay = Math.Max(maxNetDelay, player.AveNetDelay); - } - float MustTaskFrame = 1; - SrvForwardFrames = (uint)((maxNetDelay / 0.016f) + MustTaskFrame); - if (SrvForwardFrames < 2) - SrvForwardFrames = 2; - //AppSrv.g_Log.Debug($"服务器提前跑帧数:Max(2,({maxNetDelay} / {0.016f}) + {MustTaskFrame}) = {SrvForwardFrames}"); - - ObjectPoolAuto.Release(playerlist); - } - - #region 帧相关 - void StartNewTick() - { - mInputQueue.Clear(); - //mDictPlayerIdx2SendQueue.Clear(); - - mCurrServerFrameId = 0; - //??????????=>>mCurrInputData.all = 1; - - mCurrInputData.all = 0; - - UpdateRoomForwardNum(); - - uint StartForwardFrames = (SrvForwardFrames * 2) + 5; - StartForwardFrames = Math.Max(10, StartForwardFrames); - //服务器提前跑帧数 - for (int i = 0; i < StartForwardFrames; i++) - TakeFrame(); - - AppSrv.g_Log.Info($"房间初始提前量=>{StartForwardFrames},当前延迟提前量=>{SrvForwardFrames}"); - } - public void TakeFrame() - { - lock (synInputLock) - { - mInputQueue.Enqueue((mCurrServerFrameId, mCurrInputData)); - mCurrServerFrameId++; - if (mCurrServerFrameId % 60 == 0) - { - UpdateRoomForwardNum(); - } - } - } - #endregion - - ulong LastTestSend = 0; - internal ulong LastTestRecv; - - - /// <summary> - /// 广播数据 - /// </summary> - public void SynInputData() - { - List<(uint frameId, ServerInputSnapShot inputdata)> temp = new List<(uint frameId, ServerInputSnapShot inputdata)>(); - bool flagInitList = false; - lock (synInputLock) - { - #region 限制帧速率 - //double timeNow = AppSrv.g_Tick.timeNow; - //while (mInputQueue.Count > 0) - //{ - // if (send2time.Count >= SynLimitOnSec) - // { - // //AppSrv.g_Log.Info($"{timeNow} - {send2time[0]} =>{timeNow - send2time[0]}"); - // if (timeNow - send2time[0] < 1f) //最早的历史发送还在一秒之内 - // break; - // else - // send2time.RemoveAt(0); - // } - // if (!flagInitList) - // { - // flagInitList = true; - // //temp = new List<(uint frameId, ServerInputSnapShot inputdata)>(); - // temp = ObjectPoolAuto.AcquireList<(uint frameId, ServerInputSnapShot inputdata)>(); - // } - // temp.Add(mInputQueue.Dequeue()); - // send2time.Add(timeNow); - //} - - //第二种限制速率办法 - //int SendCount = 0; ; - //while (mInputQueue.Count > 0) - //{ - // SendCount++; - // temp.Add(mInputQueue.Dequeue()); - // if (SendCount >= SynLimitOnSec) - // { - // AppSrv.g_Log.Debug($"outSide SendCount=>{SendCount},morequeue.count->{mInputQueue.Count}"); - // break; - // } - //} - #endregion - - int SendCount = 0; ; - while (mInputQueue.Count > 0) - { - SendCount++; - temp.Add(mInputQueue.Dequeue()); - if (SendCount >= SynLimitOnSec) - { - AppSrv.g_Log.Debug($"outSide SendCount=>{SendCount},morequeue.count->{mInputQueue.Count}"); - break; - } - } - } - - //if (!flagInitList) - // return; - - for (int i = 0; i < temp.Count; i++) - { - (uint frameId, ServerInputSnapShot inputdata) data = temp[i]; - - Protobuf_Room_Syn_RoomFrameAllInputData resp = new Protobuf_Room_Syn_RoomFrameAllInputData() - { - FrameID = data.frameId, - InputData = data.inputdata.all, - ServerFrameID = mCurrServerFrameId, - ServerForwardCount = this.SrvForwardFrames - }; - AppSrv.g_ClientMgr.ClientSend(SynUIDs, (int)CommandID.CmdRoomSynPlayerInput, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(resp)); - //if (LastTestSend != data.inputdata.all) - //{ - // LastTestSend = data.inputdata.all; - // AppSrv.g_Log.Debug($" {DateTime.Now.ToString("hh:mm:ss.fff")} SynInput=> RoomID->{RoomID} ServerFrameID->{mCurrServerFrameId} SynUIDs=>{string.Join(",", SynUIDs)} "); - //} - } - - ObjectPoolAuto.Release(temp); - } - - bool CheckRoomStateChange(int oldPlayerCount, int newPlayerCount) - { - bool bChanged = false; - bool bNewToOnlyHost = (oldPlayerCount != 1 && newPlayerCount == 1); - bool bMorePlayer = (oldPlayerCount < 2 && newPlayerCount >= 2) || (newPlayerCount > oldPlayerCount); - switch (this.GameState) - { - case RoomGameState.NoneGameState: - if (bNewToOnlyHost) - { - this.GameState = RoomGameState.OnlyHost; - bChanged = true; - } - break; - case RoomGameState.OnlyHost: - if (bMorePlayer)//加入更多玩家 - { - this.GameState = RoomGameState.WaitRawUpdate; - bChanged = true; - break; - } - break; - case RoomGameState.WaitRawUpdate: - if (bMorePlayer)//加入更多玩家 - { - this.GameState = RoomGameState.WaitRawUpdate; - bChanged = true; - break; - } - if (NextStateRaw != null)//已经上传即时存档 - { - this.GameState = RoomGameState.WaitReady; - bChanged = true; - break; - } - break; - case RoomGameState.WaitReady: - if (bMorePlayer)//加入更多玩家 - { - this.GameState = RoomGameState.WaitRawUpdate; - bChanged = true; - break; - } - //没有未准备的 - bool bAllReady = IsAllReady(); - if (bAllReady) - { - this.GameState = RoomGameState.InOnlineGame; - //新开Tick - StartNewTick(); - bChanged = true; - break; - } - break; - case RoomGameState.Pause: - if (bMorePlayer)//加入更多玩家 - { - this.GameState = RoomGameState.WaitRawUpdate; - bChanged = true; - break; - } - break; - case RoomGameState.InOnlineGame: - if (bMorePlayer)//加入更多玩家 - { - this.GameState = RoomGameState.WaitRawUpdate; - bChanged = true; - break; - } - break; - } - - - - //房主离线,自动选择延迟最低另一名玩家做房主 - if (!GetSlotDataByUID(this.HostUID, out Dictionary<uint, uint> slotIdx2JoyIdx)) - { - List<ClientInfo> userlist = ObjectPoolAuto.AcquireList<ClientInfo>(); - GetAllPlayerClientList(ref userlist); - if (userlist.Count > 0) - { - ClientInfo? client = userlist.OrderBy(w => w.AveNetDelay).FirstOrDefault(); - this.HostUID = client.UID; - AppSrv.g_Log.DebugCmd($"更换房主为{this.HostUID}"); - bChanged = true; - } - ObjectPoolAuto.Release(userlist); - } - - if (this.GameState > RoomGameState.OnlyHost && newPlayerCount == 1) - { - this.GameState = RoomGameState.OnlyHost; - AppSrv.g_Log.DebugCmd("回到OnlyHost状态"); - bChanged = true; - } - - - return bChanged; - } - - - #region 对外开放函数 - - #region 房间进出 - /// <summary> - /// 进入房间 - /// </summary> - /// <param name="RoomID"></param> - /// <param name="PlayerNum"></param> - /// <param name="_c"></param> - /// <param name="errcode"></param> - /// <returns></returns> - public bool Join(uint slotIdx, uint joyIdx, ClientInfo _c, out ErrorCode errcode, out bool bHadRoomStateChange) - { - bHadRoomStateChange = false; - int oldPlayerCount = GetPlayerCount(); - if (GetPlayerUIDByIdx(slotIdx, out long hadUID)) - { - errcode = ErrorCode.ErrorRoomSlotAlreadlyHadPlayer; - return false; - } - AppSrv.g_Log.Debug($"Join _c.UID->{_c.UID} RoomID->{RoomID}"); - Dictionary<uint, (uint, GamePadType)> slotInfo = new Dictionary<uint, (uint, GamePadType)>(); - slotInfo[slotIdx] = (joyIdx, GamePadType.GlobalGamePad); - SetPlayerSlotData(_c, ref slotInfo); - int newPlayerCount = GetPlayerCount(); - errcode = ErrorCode.ErrorOk; - bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); - return true; - } - - /// <summary> - /// 离开房间 - /// </summary> - /// <param name="RoomID"></param> - /// <param name="_c"></param> - /// <param name="errcode"></param> - /// <returns></returns> - public bool Leave(ClientInfo _c, out ErrorCode errcode, out bool bHadRoomStateChange) - { - int oldPlayerCount = GetPlayerCount(); - RemovePlayer(_c); - int newPlayerCount = GetPlayerCount(); - errcode = ErrorCode.ErrorOk; - bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); - return true; - } - #endregion - public void SetPlayerInput(long UID, uint FrameID, ServerInputSnapShot clieninput) - { - for (uint i = 0; i < PlayerSlot.Count(); i++) - { - Data_RoomSlot slotData = PlayerSlot[i]; - if (slotData.UID != UID) - continue; - SetInputBySlotIdxJoyIdx(slotData.SlotIdx, slotData.LocalJoyIdx, clieninput); - } - } - public bool SetRePlayerReady(long UID, out ErrorCode errcode, out bool bHadRoomStateChange) - { - int oldPlayerCount = GetPlayerCount(); - SetReadyByUid(UID); - int newPlayerCount = GetPlayerCount(); - errcode = ErrorCode.ErrorOk; - bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); - return true; - } - public void SetLoadRaw(Google.Protobuf.ByteString NextStateRaw, out bool bHadRoomStateChange) - { - int oldPlayerCount = GetPlayerCount(); - AppSrv.g_Log.Debug($"SetLoadRaw proto Lenght->{NextStateRaw.Length}"); - this.NextStateRaw = NextStateRaw; - int newPlayerCount = GetPlayerCount(); - bHadRoomStateChange = CheckRoomStateChange(oldPlayerCount, newPlayerCount); - } - public void InputScreenData(Google.Protobuf.ByteString screenRaw) - { - this.ScreenRaw = NextStateRaw; - } - - - #region 客户端推帧方案 - public bool GetNeedForwardTick(uint clientFrame, out long forwaFrame) - { - forwaFrame = 0; - //目标帧,客户端+服务器提前量 - long targetFrame = clientFrame + SrvForwardFrames; - if (targetFrame > mCurrServerFrameId)//更靠前 - forwaFrame = targetFrame - mCurrServerFrameId; - return forwaFrame > 0; - } - #endregion - - #endregion - } - - public class Data_RoomSlot - { - public uint SlotIdx { get; set; } - public long UID { get; set; } - public uint LocalJoyIdx { get; set; } - public GamePadType LocalGamePadType { get; set; } - public bool Ready = false; - public void Init(uint SlotIdx) - { - this.SlotIdx = SlotIdx; - UID = -1; - LocalJoyIdx = 0; - Ready = false; - } - } - - [StructLayout(LayoutKind.Explicit, Size = 8)] - public struct ServerInputSnapShot - { - [FieldOffset(0)] - public UInt64 all; - - [FieldOffset(0)] - public byte p1_byte; - [FieldOffset(1)] - public byte p2_byte; - [FieldOffset(2)] - public byte p3_byte; - [FieldOffset(3)] - public byte p4_byte; - - [FieldOffset(0)] - public ushort p1_ushort; - [FieldOffset(2)] - public ushort p2_ushort; - [FieldOffset(4)] - public ushort p3_ushort; - [FieldOffset(6)] - public ushort p4_ushort; - } } \ No newline at end of file diff --git a/AxibugEmuOnline.Server/Manager/SavDataManager.cs b/AxibugEmuOnline.Server/Manager/SavDataManager.cs index 60524150..d4af4547 100644 --- a/AxibugEmuOnline.Server/Manager/SavDataManager.cs +++ b/AxibugEmuOnline.Server/Manager/SavDataManager.cs @@ -1,4 +1,5 @@ using AxibugEmuOnline.Server.Common; +using AxibugEmuOnline.Server.Manager.Client; using AxibugEmuOnline.Server.NetWork; using AxibugProtobuf; using MySql.Data.MySqlClient; @@ -246,11 +247,12 @@ namespace AxibugEmuOnline.Server.Manager { string dir = Path.GetDirectoryName(path); if (!Directory.Exists(dir)) - { Directory.CreateDirectory(dir); - } - File.WriteAllBytes(path, data); + using (var fs = new FileStream(path, FileMode.Create)) + { + fs.Write(data, 0, data.Length); + } return true; } catch (Exception ex) diff --git a/AxibugEmuOnline.Server/Manager/UserManager.cs b/AxibugEmuOnline.Server/Manager/UserManager.cs index 61b72a36..dca044a6 100644 --- a/AxibugEmuOnline.Server/Manager/UserManager.cs +++ b/AxibugEmuOnline.Server/Manager/UserManager.cs @@ -1,5 +1,6 @@ using AxibugEmuOnline.Server.Common; using AxibugEmuOnline.Server.Event; +using AxibugEmuOnline.Server.Manager.Client; using AxibugEmuOnline.Server.NetWork; using AxibugProtobuf; using System.Net.Sockets; @@ -32,8 +33,6 @@ namespace AxibugEmuOnline.Server.Manager public void RecvGetUserList(Socket _socket, byte[] reqData) { - Protobuf_UserList msg = ProtoBufHelper.DeSerizlize<Protobuf_UserList>(reqData); - ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(_socket); Protobuf_UserList_RESP respData = new Protobuf_UserList_RESP(); diff --git a/AxibugEmuOnline.Server/Program.cs b/AxibugEmuOnline.Server/Program.cs index 70dc50bf..9c09148d 100644 --- a/AxibugEmuOnline.Server/Program.cs +++ b/AxibugEmuOnline.Server/Program.cs @@ -1,5 +1,7 @@ using AxibugEmuOnline.Server.Common; using AxibugEmuOnline.Server.Manager; +using AxibugEmuOnline.Server.Manager.Client; +using AxibugEmuOnline.Server.Manager.Room; using MySql.Data.MySqlClient; namespace AxibugEmuOnline.Server @@ -21,7 +23,7 @@ namespace AxibugEmuOnline.Server { case "rlist": { - List<Data_RoomData> roomlist = ObjectPoolAuto.AcquireList<Data_RoomData>(); + List<GameRoom> roomlist = ObjectPoolAuto.AcquireList<GameRoom>(); AppSrv.g_Room.GetRoomList(ref roomlist); AppSrv.g_Log.Info($"RoomCount:{roomlist.Count}"); diff --git a/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs b/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs index 7db4888f..755f46d8 100644 --- a/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs +++ b/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs @@ -157,17 +157,18 @@ namespace AxibugProtobuf { "bBAFEhQKEFN3aXRjaFByb0NvbnRyb2wQBhIQCgxTd2l0Y2hKb3lDb24QBxIS", "Cg5YQk9YMzYwQ29udHJvbBAIEhIKDlhCT1hPTkVDb250cm9sEAkSEQoNUFNW", "aXRhQ29udHJvbBAKEhIKDldpaVVQYWRDb250cm9sEAsSFAoQV2lpUmVtb3Rl", - "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKtsBCg9Sb21QbGF0", + "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKoMCCg9Sb21QbGF0", "Zm9ybVR5cGUSCwoHSW52YWxpZBAAEgcKA05lcxABEhEKDU1hc3Rlcl9TeXN0", "ZW0QAhINCglHYW1lX0dlYXIQAxIMCghHYW1lX0JveRAEEhIKDkdhbWVfQm95", "X0NvbG9yEAUSEQoNQ29sZWNvX1Zpc2lvbhAGEgsKB1NDXzMwMDAQBxILCgdT", "R18xMDAwEAgSCgoGTkVPR0VPEBQSBwoDSUdTEBUSCAoEQ1BTMRAWEggKBENQ", - "UzIQFxIOCgpBcmNhZGVfT0xEEB4SCAoDQWxsEOcHKnAKDVJvb21HYW1lU3Rh", - "dGUSEgoOTm9uZV9HYW1lU3RhdGUQABIMCghPbmx5SG9zdBABEhEKDVdhaXRS", - "YXdVcGRhdGUQAhINCglXYWl0UmVhZHkQAxIJCgVQYXVzZRAEEhAKDEluT25s", - "aW5lR2FtZRAFKk4KEUxvZ2luUmVzdWx0U3RhdHVzEiEKHUxvZ2luUmVzdWx0", - "U3RhdHVzX0Jhc2VEZWZhdWx0EAASBgoCT0sQARIOCgpBY2NvdW50RXJyEAJC", - "AkgBYgZwcm90bzM=")); + "UzIQFxIOCgpBcmNhZGVfT0xEEB4SDwoLV29uZGVyX1N3YW4QKBIVChFXb25k", + "ZXJfU3dhbl9Db2xvchApEggKA0FsbBDnBypwCg1Sb29tR2FtZVN0YXRlEhIK", + "Dk5vbmVfR2FtZVN0YXRlEAASDAoIT25seUhvc3QQARIRCg1XYWl0UmF3VXBk", + "YXRlEAISDQoJV2FpdFJlYWR5EAMSCQoFUGF1c2UQBBIQCgxJbk9ubGluZUdh", + "bWUQBSpOChFMb2dpblJlc3VsdFN0YXR1cxIhCh1Mb2dpblJlc3VsdFN0YXR1", + "c19CYXNlRGVmYXVsdBAAEgYKAk9LEAESDgoKQWNjb3VudEVychACQgJIAWIG", + "cHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.GamePadType), typeof(global::AxibugProtobuf.RomPlatformType), typeof(global::AxibugProtobuf.RoomGameState), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -480,6 +481,8 @@ namespace AxibugProtobuf { [pbr::OriginalName("CPS1")] Cps1 = 22, [pbr::OriginalName("CPS2")] Cps2 = 23, [pbr::OriginalName("Arcade_OLD")] ArcadeOld = 30, + [pbr::OriginalName("Wonder_Swan")] WonderSwan = 40, + [pbr::OriginalName("Wonder_Swan_Color")] WonderSwanColor = 41, [pbr::OriginalName("All")] All = 999, } diff --git a/AxibugEmuOnline.Web/Controllers/ApiController.cs b/AxibugEmuOnline.Web/Controllers/ApiController.cs index 86525b62..fed3d27f 100644 --- a/AxibugEmuOnline.Web/Controllers/ApiController.cs +++ b/AxibugEmuOnline.Web/Controllers/ApiController.cs @@ -114,7 +114,7 @@ namespace AxibugEmuOnline.Web.Controllers if (UID > 0) { - query = $"SELECT r.id,r.`Name`,r.GameType,r.Note,r.RomUrl,r.ImgUrl,r.`Hash`,r.`playcount`,r.`stars`,r.`PlatformType`,r.`parentids`,IF(s.uid IS NOT NULL, TRUE, FALSE) AS is_collected FROM romlist r left join rom_stars s on r.id = s.romid {GetWhereCmd(condition)} {HotOrderBy} LIMIT ?offset, ?pageSize;"; + query = $"SELECT r.id,r.`Name`,r.GameType,r.Note,r.RomUrl,r.ImgUrl,r.`Hash`,r.`playcount`,r.`stars`,r.`PlatformType`,r.`parentids`,IF(s.uid = {UID}, TRUE, FALSE) AS is_collected FROM romlist r left join rom_stars s on r.id = s.romid {GetWhereCmd(condition)} {HotOrderBy} LIMIT ?offset, ?pageSize;"; } else { diff --git a/AxibugEmuOnline.Web/Protobuf/ProtobufAxibugEmuOnline.cs b/AxibugEmuOnline.Web/Protobuf/ProtobufAxibugEmuOnline.cs index 7db4888f..755f46d8 100644 --- a/AxibugEmuOnline.Web/Protobuf/ProtobufAxibugEmuOnline.cs +++ b/AxibugEmuOnline.Web/Protobuf/ProtobufAxibugEmuOnline.cs @@ -157,17 +157,18 @@ namespace AxibugProtobuf { "bBAFEhQKEFN3aXRjaFByb0NvbnRyb2wQBhIQCgxTd2l0Y2hKb3lDb24QBxIS", "Cg5YQk9YMzYwQ29udHJvbBAIEhIKDlhCT1hPTkVDb250cm9sEAkSEQoNUFNW", "aXRhQ29udHJvbBAKEhIKDldpaVVQYWRDb250cm9sEAsSFAoQV2lpUmVtb3Rl", - "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKtsBCg9Sb21QbGF0", + "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKoMCCg9Sb21QbGF0", "Zm9ybVR5cGUSCwoHSW52YWxpZBAAEgcKA05lcxABEhEKDU1hc3Rlcl9TeXN0", "ZW0QAhINCglHYW1lX0dlYXIQAxIMCghHYW1lX0JveRAEEhIKDkdhbWVfQm95", "X0NvbG9yEAUSEQoNQ29sZWNvX1Zpc2lvbhAGEgsKB1NDXzMwMDAQBxILCgdT", "R18xMDAwEAgSCgoGTkVPR0VPEBQSBwoDSUdTEBUSCAoEQ1BTMRAWEggKBENQ", - "UzIQFxIOCgpBcmNhZGVfT0xEEB4SCAoDQWxsEOcHKnAKDVJvb21HYW1lU3Rh", - "dGUSEgoOTm9uZV9HYW1lU3RhdGUQABIMCghPbmx5SG9zdBABEhEKDVdhaXRS", - "YXdVcGRhdGUQAhINCglXYWl0UmVhZHkQAxIJCgVQYXVzZRAEEhAKDEluT25s", - "aW5lR2FtZRAFKk4KEUxvZ2luUmVzdWx0U3RhdHVzEiEKHUxvZ2luUmVzdWx0", - "U3RhdHVzX0Jhc2VEZWZhdWx0EAASBgoCT0sQARIOCgpBY2NvdW50RXJyEAJC", - "AkgBYgZwcm90bzM=")); + "UzIQFxIOCgpBcmNhZGVfT0xEEB4SDwoLV29uZGVyX1N3YW4QKBIVChFXb25k", + "ZXJfU3dhbl9Db2xvchApEggKA0FsbBDnBypwCg1Sb29tR2FtZVN0YXRlEhIK", + "Dk5vbmVfR2FtZVN0YXRlEAASDAoIT25seUhvc3QQARIRCg1XYWl0UmF3VXBk", + "YXRlEAISDQoJV2FpdFJlYWR5EAMSCQoFUGF1c2UQBBIQCgxJbk9ubGluZUdh", + "bWUQBSpOChFMb2dpblJlc3VsdFN0YXR1cxIhCh1Mb2dpblJlc3VsdFN0YXR1", + "c19CYXNlRGVmYXVsdBAAEgYKAk9LEAESDgoKQWNjb3VudEVychACQgJIAWIG", + "cHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.GamePadType), typeof(global::AxibugProtobuf.RomPlatformType), typeof(global::AxibugProtobuf.RoomGameState), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -480,6 +481,8 @@ namespace AxibugProtobuf { [pbr::OriginalName("CPS1")] Cps1 = 22, [pbr::OriginalName("CPS2")] Cps2 = 23, [pbr::OriginalName("Arcade_OLD")] ArcadeOld = 30, + [pbr::OriginalName("Wonder_Swan")] WonderSwan = 40, + [pbr::OriginalName("Wonder_Swan_Color")] WonderSwanColor = 41, [pbr::OriginalName("All")] All = 999, } diff --git a/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs b/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs index 7db4888f..755f46d8 100644 --- a/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs +++ b/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs @@ -157,17 +157,18 @@ namespace AxibugProtobuf { "bBAFEhQKEFN3aXRjaFByb0NvbnRyb2wQBhIQCgxTd2l0Y2hKb3lDb24QBxIS", "Cg5YQk9YMzYwQ29udHJvbBAIEhIKDlhCT1hPTkVDb250cm9sEAkSEQoNUFNW", "aXRhQ29udHJvbBAKEhIKDldpaVVQYWRDb250cm9sEAsSFAoQV2lpUmVtb3Rl", - "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKtsBCg9Sb21QbGF0", + "Q29udHJvbBAMEhYKEk5pbnRlbmRvM0RTQ29udHJvbBANKoMCCg9Sb21QbGF0", "Zm9ybVR5cGUSCwoHSW52YWxpZBAAEgcKA05lcxABEhEKDU1hc3Rlcl9TeXN0", "ZW0QAhINCglHYW1lX0dlYXIQAxIMCghHYW1lX0JveRAEEhIKDkdhbWVfQm95", "X0NvbG9yEAUSEQoNQ29sZWNvX1Zpc2lvbhAGEgsKB1NDXzMwMDAQBxILCgdT", "R18xMDAwEAgSCgoGTkVPR0VPEBQSBwoDSUdTEBUSCAoEQ1BTMRAWEggKBENQ", - "UzIQFxIOCgpBcmNhZGVfT0xEEB4SCAoDQWxsEOcHKnAKDVJvb21HYW1lU3Rh", - "dGUSEgoOTm9uZV9HYW1lU3RhdGUQABIMCghPbmx5SG9zdBABEhEKDVdhaXRS", - "YXdVcGRhdGUQAhINCglXYWl0UmVhZHkQAxIJCgVQYXVzZRAEEhAKDEluT25s", - "aW5lR2FtZRAFKk4KEUxvZ2luUmVzdWx0U3RhdHVzEiEKHUxvZ2luUmVzdWx0", - "U3RhdHVzX0Jhc2VEZWZhdWx0EAASBgoCT0sQARIOCgpBY2NvdW50RXJyEAJC", - "AkgBYgZwcm90bzM=")); + "UzIQFxIOCgpBcmNhZGVfT0xEEB4SDwoLV29uZGVyX1N3YW4QKBIVChFXb25k", + "ZXJfU3dhbl9Db2xvchApEggKA0FsbBDnBypwCg1Sb29tR2FtZVN0YXRlEhIK", + "Dk5vbmVfR2FtZVN0YXRlEAASDAoIT25seUhvc3QQARIRCg1XYWl0UmF3VXBk", + "YXRlEAISDQoJV2FpdFJlYWR5EAMSCQoFUGF1c2UQBBIQCgxJbk9ubGluZUdh", + "bWUQBSpOChFMb2dpblJlc3VsdFN0YXR1cxIhCh1Mb2dpblJlc3VsdFN0YXR1", + "c19CYXNlRGVmYXVsdBAAEgYKAk9LEAESDgoKQWNjb3VudEVychACQgJIAWIG", + "cHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.GamePadType), typeof(global::AxibugProtobuf.RomPlatformType), typeof(global::AxibugProtobuf.RoomGameState), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -480,6 +481,8 @@ namespace AxibugProtobuf { [pbr::OriginalName("CPS1")] Cps1 = 22, [pbr::OriginalName("CPS2")] Cps2 = 23, [pbr::OriginalName("Arcade_OLD")] ArcadeOld = 30, + [pbr::OriginalName("Wonder_Swan")] WonderSwan = 40, + [pbr::OriginalName("Wonder_Swan_Color")] WonderSwanColor = 41, [pbr::OriginalName("All")] All = 999, } diff --git a/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto b/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto index 0440c5f9..bac57066 100644 --- a/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto +++ b/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto @@ -148,6 +148,8 @@ enum RomPlatformType CPS1 = 22; CPS2 = 23; Arcade_OLD = 30; + Wonder_Swan = 40; + Wonder_Swan_Color = 41; All = 999; } diff --git a/README.md b/README.md index 27e0df95..bd05cc59 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ ## 代码贡献/协作者 -[AlienJack](https://github.com/AlienJack "AlienJack") +[AlienJack](https://github.com/AlienJack "AlienJack") [alienjack1989](https://space.bilibili.com/6819295 "alienjack1989") ## NES 模拟器内核