This commit is contained in:
sin365 2024-12-27 01:25:10 +08:00
commit 59b62350ea
103 changed files with 4142 additions and 2875 deletions

View File

@ -1,3 +1,4 @@
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEditor;
@ -21,4 +22,5 @@ public class AxiPrefabCache_Com2GUID
public string ToPATH;
public string ToGUID;
public MonoScript monoScript;
}
}
#endif

View File

@ -1,3 +1,4 @@
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using System.IO;
@ -86,7 +87,7 @@ public class AxiProjectTools : EditorWindow
static void LoopPrefabNode(string rootPath, GameObject trans, int depth)
{
string nodename = $"{rootPath}>{trans.name}";
#if UNITY_5_4_OR_NEWER && !UNITY_2018_4_OR_NEWER
#if UNITY_2018_4_OR_NEWER
GameObject prefabRoot = trans.gameObject;
int comCount = prefabRoot.GetComponentCount();
for (int i = 0; i < comCount; i++)
@ -95,11 +96,6 @@ public class AxiProjectTools : EditorWindow
if (com == null)
continue;
if (com.name.Contains("VideoPlayer"))
{
}
MonoBehaviour monoCom = com as MonoBehaviour;
if (monoCom == null)
continue;
@ -262,11 +258,13 @@ public class AxiProjectTools : EditorWindow
}
[MenuItem("Axibug移植工具/[5]UnPack所有预制体")]
[MenuItem("Axibug移植工具/[5]UnPack所有嵌套预制体和场景中的预制体")]
public static void UnpackPrefabs()
{
string[] allAssetPaths = AssetDatabase.GetAllAssetPaths();
#if UNITY_2018_4_OR_NEWER
GoTAxiProjectToolsSence();
string[] allAssetPaths = AssetDatabase.GetAllAssetPaths();
int prefabCount = 0;
foreach (string path in allAssetPaths)
@ -278,13 +276,41 @@ public class AxiProjectTools : EditorWindow
prefabCount++;
}
}
Debug.Log($"Unpacked {prefabCount} prefabs.");
Debug.Log($"{prefabCount}个预制体Unpack");
Debug.Log("<Color=#FFF333>处理完毕 [5]UnPack所有预制体</color>");
}
string[] sceneGuids = AssetDatabase.FindAssets("t:scene");
foreach (string guid in sceneGuids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
if (path.Contains(toolSenceName))
continue;
static void UnpackPrefab(string prefabPath)
EditorSceneManager.OpenScene(path);
Scene currentScene = SceneManager.GetActiveScene();
GameObject[] rootObjects = currentScene.GetRootGameObjects();
foreach (GameObject rootObj in rootObjects)
{
// 遍历场景中的所有对象
TraverseHierarchy(rootObj);
}
// Save the scene // 获取当前打开的场景
currentScene = EditorSceneManager.GetActiveScene();
// 保存场景到文件(默认路径和名称)
bool success = EditorSceneManager.SaveScene(currentScene, currentScene.path);
Debug.Log($"{currentScene.name}场景中 所有物体Unpack");
}
GoTAxiProjectToolsSence();
Debug.Log("<Color=#FFF333>处理完毕 [5]UnPack所有预制体</color>");
#else
Debug.Log("低版本不要执行本函数");
#endif
}
static void UnpackPrefab(string prefabPath)
{
#if UNITY_2018_4_OR_NEWER
GameObject prefabInstance = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
if (prefabInstance == null)
{
@ -296,10 +322,14 @@ public class AxiProjectTools : EditorWindow
TraverseHierarchy(obj);
PrefabUtility.SaveAsPrefabAsset(obj, prefabPath);
GameObject.DestroyImmediate(obj);
#else
Debug.Log("低版本不要执行本函数");
#endif
}
static void TraverseHierarchy(GameObject obj)
{
#if UNITY_2018_4_OR_NEWER
// 检查该对象是否是预制体的实例
if (PrefabUtility.IsPartOfPrefabInstance(obj))
{
@ -313,6 +343,9 @@ public class AxiProjectTools : EditorWindow
{
TraverseHierarchy(obj.transform.GetChild(i).gameObject);
}
#else
Debug.Log("低版本不要执行本函数");
#endif
}
@ -379,4 +412,5 @@ public class AxiProjectTools : EditorWindow
textureImporter.SaveAndReimport();
}
}
}
}
#endif

View File

@ -1,6 +1,8 @@
using AxibugEmuOnline.Client;
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
namespace AxibugEmuOnline.Editors
{
[CustomEditor(typeof(CommandDispatcher))]
@ -13,8 +15,8 @@ namespace AxibugEmuOnline.Editors
if (!Application.isPlaying) return;
var dispacather = target as CommandDispatcher;
dispacather.GetRegisters(out var normal, out var solo);
IReadOnlyList<CommandExecuter> normal; IReadOnlyList<CommandExecuter> solo;
dispacather.GetRegisters(out normal, out solo);
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
EditorGUILayout.LabelField("NORMAL");

View File

@ -60,7 +60,7 @@ namespace AxiReplay
if (!bNetInit)
{
data = default(ReplayStep);
frameDiff = default;
frameDiff = default(int);
inputDiff = false;
return false;
}
@ -73,7 +73,7 @@ namespace AxiReplay
if (!bNetInit)
{
data = default(ReplayStep);
frameDiff = default;
frameDiff = default(int);
inputDiff = false;
return false;
}

View File

@ -5,152 +5,154 @@ using System.Text;
namespace AxiReplay
{
public class ReplayWriter : IReplayWriter
{
public ReplayData.ReplayFormat mFormat { get; private set; }
public Encoding TexEncoding { get; private set; }
ReplayHandler handler;
string mTitle;
string mNote;
int mAllFrame;
int mAllTime;
long mData;
int mSingleInputLenght;
int mSingleDataLenght;
MemoryStream mStream;
BinaryWriter mBinaryWriter;
public class ReplayWriter : IReplayWriter
{
public ReplayData.ReplayFormat mFormat { get; private set; }
public Encoding TexEncoding { get; private set; }
ReplayHandler handler;
string mTitle;
string mNote;
int mAllFrame;
int mAllTime;
long mData;
int mSingleInputLenght;
int mSingleDataLenght;
MemoryStream mStream;
BinaryWriter mBinaryWriter;
int mCurrFrame;
UInt64 mCurrInput;
ReplayStep wirteStep;
int mCurrFrame;
UInt64 mCurrInput;
ReplayStep wirteStep;
List<string> dbgList = new List<string>();
List<string> dbgList = new List<string>();
public ReplayWriter(string Title, string Note, ReplayData.ReplayFormat format, Encoding encoding)
{
mTitle = Title;
mNote = Note;
TexEncoding = encoding;
mFormat = format;
switch (mFormat)
{
case ReplayData.ReplayFormat.FM32IP64: mSingleInputLenght = sizeof(UInt64); break;
case ReplayData.ReplayFormat.FM32IP32: mSingleInputLenght = sizeof(UInt32); break;
case ReplayData.ReplayFormat.FM32IP16: mSingleInputLenght = sizeof(UInt16); break;
case ReplayData.ReplayFormat.FM32IPBYTE: mSingleInputLenght = sizeof(byte); break;
}
mSingleDataLenght = (sizeof(UInt32)) + mSingleInputLenght;
public ReplayWriter(string Title, string Note, ReplayData.ReplayFormat format, Encoding encoding)
{
mTitle = Title;
mNote = Note;
TexEncoding = encoding;
mFormat = format;
switch (mFormat)
{
case ReplayData.ReplayFormat.FM32IP64: mSingleInputLenght = sizeof(UInt64); break;
case ReplayData.ReplayFormat.FM32IP32: mSingleInputLenght = sizeof(UInt32); break;
case ReplayData.ReplayFormat.FM32IP16: mSingleInputLenght = sizeof(UInt16); break;
case ReplayData.ReplayFormat.FM32IPBYTE: mSingleInputLenght = sizeof(byte); break;
}
mSingleDataLenght = (sizeof(UInt32)) + mSingleInputLenght;
mStream = new MemoryStream();
mBinaryWriter = new BinaryWriter(mStream);
mStream = new MemoryStream();
mBinaryWriter = new BinaryWriter(mStream);
mCurrFrame = -1;
mCurrInput = int.MaxValue;
wirteStep = new ReplayStep();
mCurrFrame = -1;
mCurrInput = int.MaxValue;
wirteStep = new ReplayStep();
dbgList.Clear();
dbgList.Clear();
}
}
int byFrameIdx = 0;
/// <summary>
/// 往前推进帧的,指定帧下标
/// </summary>
/// <param name="frameInput"></param>
public void NextFramebyFrameIdx(int FrameID, UInt64 frameInput)
{
TakeFrame(FrameID - byFrameIdx, frameInput);
byFrameIdx = FrameID;
}
int byFrameIdx = 0;
/// <summary>
/// 往前推进帧的,指定帧下标
/// </summary>
/// <param name="frameInput"></param>
public void NextFramebyFrameIdx(int FrameID, UInt64 frameInput)
{
TakeFrame(FrameID - byFrameIdx, frameInput);
byFrameIdx = FrameID;
}
/// <summary>
/// 往前推进1帧的Input
/// </summary>
/// <param name="frameInput"></param>
public void NextFrame(UInt64 frameInput)
{
TakeFrame(1, frameInput);
}
/// <summary>
/// 往前推进1帧的Input
/// </summary>
/// <param name="frameInput"></param>
public void NextFrame(UInt64 frameInput)
{
TakeFrame(1, frameInput);
}
/// <summary>
/// 往前推进指定帧数量的Input
/// </summary>
/// <param name="frameInput"></param>
public void TakeFrame(int addFrame, UInt64 frameInput)
{
if (addFrame < 0)
{
/// <summary>
/// 往前推进指定帧数量的Input
/// </summary>
/// <param name="frameInput"></param>
public void TakeFrame(int addFrame, UInt64 frameInput)
{
if (addFrame < 0)
{
}
mCurrFrame += addFrame;
if (mCurrInput == frameInput)
return;
mCurrInput = frameInput;
}
mCurrFrame += addFrame;
if (mCurrInput == frameInput)
return;
mCurrInput = frameInput;
wirteStep.FrameStartID = mCurrFrame;
wirteStep.InPut = mCurrInput;
dbgList.Add($"{mCurrFrame} | {mCurrInput}");
wirteStep.FrameStartID = mCurrFrame;
wirteStep.InPut = mCurrInput;
dbgList.Add($"{mCurrFrame} | {mCurrInput}");
switch (mFormat)
{
case ReplayData.ReplayFormat.FM32IP64:
mBinaryWriter.Write(wirteStep.FrameStartID);
mBinaryWriter.Write(wirteStep.InPut);
break;
case ReplayData.ReplayFormat.FM32IP32:
mBinaryWriter.Write(BitConverter.GetBytes(wirteStep.All64Data), 0, 4 + 4);
break;
case ReplayData.ReplayFormat.FM32IP16:
mBinaryWriter.Write(BitConverter.GetBytes(wirteStep.All64Data), 0, 4 + 2);
break;
case ReplayData.ReplayFormat.FM32IPBYTE:
mBinaryWriter.Write(BitConverter.GetBytes(wirteStep.All64Data), 0, 4 + 1);
break;
}
}
switch (mFormat)
{
case ReplayData.ReplayFormat.FM32IP64:
mBinaryWriter.Write(wirteStep.FrameStartID);
mBinaryWriter.Write(wirteStep.InPut);
break;
case ReplayData.ReplayFormat.FM32IP32:
mBinaryWriter.Write(BitConverter.GetBytes(wirteStep.All64Data), 0, 4 + 4);
break;
case ReplayData.ReplayFormat.FM32IP16:
mBinaryWriter.Write(BitConverter.GetBytes(wirteStep.All64Data), 0, 4 + 2);
break;
case ReplayData.ReplayFormat.FM32IPBYTE:
mBinaryWriter.Write(BitConverter.GetBytes(wirteStep.All64Data), 0, 4 + 1);
break;
}
}
public void SaveData(string path, bool bWithDump = false, string dumppath = null)
{
ReplayData.GetStringByteData(mTitle, out byte[] titleData, out int titleLenghtWithEnd, TexEncoding);
ReplayData.GetStringByteData(mNote, out byte[] noteData, out int noteLenghtWithEnd, TexEncoding);
public void SaveData(string path, bool bWithDump = false, string dumppath = null)
{
byte[] titleData; int titleLenghtWithEnd;
ReplayData.GetStringByteData(mTitle, out titleData, out titleLenghtWithEnd, TexEncoding);
byte[] noteData; int noteLenghtWithEnd;
ReplayData.GetStringByteData(mNote, out noteData, out noteLenghtWithEnd, TexEncoding);
ReplayHandler handler = new ReplayHandler();
handler.Format = (int)this.mFormat;
handler.DataOffset = ReplayData.HandlerLenght;
handler.CreateTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
handler.AllFrame = wirteStep.FrameStartID;
handler.SingleLenght = mSingleDataLenght;
ReplayHandler handler = new ReplayHandler();
handler.Format = (int)this.mFormat;
handler.DataOffset = ReplayData.HandlerLenght;
handler.CreateTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
handler.AllFrame = wirteStep.FrameStartID;
handler.SingleLenght = mSingleDataLenght;
using (FileStream fs = new FileStream(path, FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
//写入Handler
bw.Write(ReplayData.GetHandlerData(handler));
//写入Data
bw.Write(mStream.ToArray());
}
}
using (FileStream fs = new FileStream(path, FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
//写入Handler
bw.Write(ReplayData.GetHandlerData(handler));
//写入Data
bw.Write(mStream.ToArray());
}
}
if (bWithDump)
{
List<string> temp = new List<string>();
temp.Add($"Format => {handler.Format}");
temp.Add($"DataOffset => {handler.DataOffset}");
temp.Add($"CreateTime => {handler.CreateTime}");
temp.Add($"AllFrame => {handler.AllFrame}");
temp.Add($"SingleLenght => {handler.SingleLenght}");
dbgList.InsertRange(0, temp);
File.WriteAllLines(dumppath, dbgList);
}
}
if (bWithDump)
{
List<string> temp = new List<string>();
temp.Add($"Format => {handler.Format}");
temp.Add($"DataOffset => {handler.DataOffset}");
temp.Add($"CreateTime => {handler.CreateTime}");
temp.Add($"AllFrame => {handler.AllFrame}");
temp.Add($"SingleLenght => {handler.SingleLenght}");
dbgList.InsertRange(0, temp);
File.WriteAllLines(dumppath, dbgList);
}
}
public void Dispose()
{
mStream.Dispose();
mBinaryWriter.Dispose();
//TODO
}
public void Dispose()
{
mStream.Dispose();
mBinaryWriter.Dispose();
//TODO
}
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 898ba71ded907534ba7eaada7855cadc

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 353264361911f2f43bb2c088c7e73fec
guid: 957996f7ef8e16e4d83eace2efbcbfaa
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,20 +1,19 @@
fileFormatVersion: 2
guid: 324deac494a24a7499801349c7908062
guid: 255d4b97366fc9e429c8cf1a54ee47b8
timeCreated: 1499268372
licenseType: Pro
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
enabled: 0
settings: {}
- first:
Editor: Editor
@ -23,11 +22,10 @@ PluginImporter:
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
PSP2: PSP2
second:
enabled: 0
settings:
CPU: AnyCPU
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,31 @@
fileFormatVersion: 2
guid: e4a33d16bdff8ff418e7a5fe120bd193
timeCreated: 1499268372
licenseType: Pro
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
PSP2: PSP2
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 7c3fabe6430be6943b1fc06a25a275a8
guid: b3de348afcfb8214ea5dced94199f16e
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: eb76ae7b43c117c449fe04e536cf3f34
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
'': Any
second:
enabled: 0
settings:
Exclude Editor: 0
Exclude Linux: 1
Exclude Linux64: 1
Exclude LinuxUniversal: 1
Exclude OSXUniversal: 1
Exclude PSP2: 0
Exclude Win: 1
Exclude Win64: 1
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: AnyOS
- first:
Facebook: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Facebook: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
PSP2: PSP2
second:
enabled: 1
settings: {}
- first:
Standalone: Linux
second:
enabled: 0
settings:
CPU: x86
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: x86_64
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@ -25,12 +25,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9760340517325694}
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: []
m_Father: {fileID: 4232056521131536011}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &9003897287163669553
MonoBehaviour:
@ -56,6 +57,7 @@ AudioSource:
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 0}
m_Resource: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
@ -169,9 +171,9 @@ RectTransform:
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: 1038087993597378172}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@ -240,11 +242,11 @@ RectTransform:
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: 3430872171738201552}
- {fileID: 5684774662137182450}
m_Father: {fileID: 4232056520494431727}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
@ -289,12 +291,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4232056520112715746}
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: []
m_Father: {fileID: 4232056521131536011}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &4232056520112715744
MonoBehaviour:
@ -311,6 +314,8 @@ MonoBehaviour:
NesEmu: {fileID: 4232056521131536012}
DrawCanvas: {fileID: 4232056520494431724}
Image: {fileID: 4232056521759880274}
GPUTurboMat_gpu: {fileID: 2100000, guid: 07e28fcb992bc124e986f9d8ff3beb97, type: 2}
GPUTurbo: 1
--- !u!1 &4232056520494431712
GameObject:
m_ObjectHideFlags: 0
@ -322,7 +327,6 @@ GameObject:
- component: {fileID: 4232056520494431727}
- component: {fileID: 4232056520494431724}
- component: {fileID: 4232056520494431725}
- component: {fileID: 4232056520494431726}
m_Layer: 5
m_Name: Canvas
m_TagString: Untagged
@ -340,11 +344,11 @@ RectTransform:
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: 4232056521759880275}
- {fileID: 1038087993597378172}
m_Father: {fileID: 4232056521131536011}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
@ -368,7 +372,9 @@ Canvas:
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
@ -395,23 +401,6 @@ MonoBehaviour:
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!114 &4232056520494431726
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4232056520494431712}
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
--- !u!1 &4232056521131536013
GameObject:
m_ObjectHideFlags: 0
@ -436,15 +425,16 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4232056521131536013}
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: 4232056520112715745}
- {fileID: 4785916497946256520}
- {fileID: 4232056520494431727}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &4232056521131536012
MonoBehaviour:
@ -458,10 +448,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 39557e19783acee499ace6c68549e8f8, type: 3}
m_Name:
m_EditorClassIdentifier:
InputTemplate: {fileID: 0}
VideoProvider: {fileID: 4232056520112715744}
AudioProvider: {fileID: 9003897287163669553}
m_bPause: 0
--- !u!1 &4232056521759880276
GameObject:
m_ObjectHideFlags: 0
@ -490,9 +478,9 @@ RectTransform:
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: 4232056520494431727}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@ -519,7 +507,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 2100000, guid: 07e28fcb992bc124e986f9d8ff3beb97, type: 2}
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}
@ -562,9 +550,9 @@ RectTransform:
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: 1038087993597378172}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}

View File

@ -25,17 +25,18 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2371389415552619370}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 1727149598719982521}
m_Children:
- {fileID: 1771748875814093347}
m_Father: {fileID: 8950855035476021338}
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: 84, y: 0}
m_SizeDelta: {x: 502, y: 160}
m_AnchoredPosition: {x: 49, y: 0}
m_SizeDelta: {x: 251, y: 80}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &6564505248202665844
CanvasRenderer:
@ -100,17 +101,17 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2721335758118728454}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 1727149598719982521}
m_Father: {fileID: 8950855035476021338}
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: 142, y: 160}
m_SizeDelta: {x: 71, y: 80}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &9075115120373129637
CanvasRenderer:
@ -159,7 +160,7 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 1727149598719982521}
- component: {fileID: 7654163251363580929}
- component: {fileID: 8370099016684185830}
m_Layer: 5
m_Name: RoomPlayerSlotUnit
m_TagString: Untagged
@ -179,20 +180,143 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 846681823671095772}
- {fileID: 6665974318866355999}
- {fileID: 8950855035476021338}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 100}
m_SizeDelta: {x: 300, y: 100}
m_Pivot: {x: 0, y: 1}
--- !u!222 &7654163251363580929
CanvasRenderer:
--- !u!114 &8370099016684185830
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5376230278482525414}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bfe4359a48b5c349b439e88eb53b8b1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_controllerIndex: 0
m_connectInfoNode: {fileID: 2371389415552619370}
m_indexIcon: {fileID: 4536003039670490184}
m_playerName: {fileID: 6617607173830585898}
--- !u!1 &5662729590297657737
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8950855035476021338}
m_Layer: 5
m_Name: Root
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8950855035476021338
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5662729590297657737}
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: 846681823671095772}
- {fileID: 6665974318866355999}
m_Father: {fileID: 1727149598719982521}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -0.000030517578, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &7128973212336692590
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1771748875814093347}
- component: {fileID: 4464870872037843803}
- component: {fileID: 6617607173830585898}
m_Layer: 5
m_Name: playerName
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1771748875814093347
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7128973212336692590}
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: 6665974318866355999}
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: 30.93, y: -1.59}
m_SizeDelta: {x: 146.1, y: 30.63}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4464870872037843803
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7128973212336692590}
m_CullTransparentMesh: 1
--- !u!114 &6617607173830585898
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7128973212336692590}
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: 1
m_MinSize: 4
m_MaxSize: 20
m_Alignment: 4
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: PLAYER_NAME

View File

@ -64,6 +64,85 @@ MonoBehaviour:
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &1793510994393845066
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2940710093054777883}
- component: {fileID: 6850622733671985395}
- component: {fileID: 2118483068810584522}
m_Layer: 5
m_Name: ControlSlotInfo
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2940710093054777883
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1793510994393845066}
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: 2921874279820016524}
- {fileID: 3201409976408832832}
- {fileID: 2711516940043786061}
- {fileID: 3283429487447647189}
m_Father: {fileID: 6362836288749559125}
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: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6850622733671985395
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1793510994393845066}
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: 0
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &2118483068810584522
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1793510994393845066}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 909a5b71ba48a9c46a57d43017072837, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &2196797712553207707
GameObject:
m_ObjectHideFlags: 0
@ -93,7 +172,8 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 2940710093054777883}
m_Father: {fileID: 5353336693430589123}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@ -626,6 +706,7 @@ MonoBehaviour:
DelayValue: {fileID: 6486398873987280650}
OnlinePlayerCount: {fileID: 9033504323044377285}
FPS: {fileID: 2545793518460288919}
ControlSlotInfoNode: {fileID: 1793510994393845066}
--- !u!1 &5629957813601835122
GameObject:
m_ObjectHideFlags: 0
@ -1304,3 +1385,423 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1001 &3627982800791678196
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 2940710093054777883}
m_Modifications:
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.x
value: 300
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5376230278482525414, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Name
value: P3
objectReference: {fileID: 0}
- target: {fileID: 8370099016684185830, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_slotIndex
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
--- !u!224 &2711516940043786061 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
m_PrefabInstance: {fileID: 3627982800791678196}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &4208900619059435628
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 2940710093054777883}
m_Modifications:
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.x
value: 300
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5376230278482525414, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Name
value: P4
objectReference: {fileID: 0}
- target: {fileID: 8370099016684185830, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_slotIndex
value: 3
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
--- !u!224 &3283429487447647189 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
m_PrefabInstance: {fileID: 4208900619059435628}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &4293513748768145657
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 2940710093054777883}
m_Modifications:
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.x
value: 300
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5376230278482525414, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Name
value: P2
objectReference: {fileID: 0}
- target: {fileID: 8370099016684185830, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_slotIndex
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
--- !u!224 &3201409976408832832 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
m_PrefabInstance: {fileID: 4293513748768145657}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &4572424957848191029
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 2940710093054777883}
m_Modifications:
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Pivot.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.x
value: 300
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5376230278482525414, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
propertyPath: m_Name
value: P1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
--- !u!224 &2921874279820016524 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 1727149598719982521, guid: cf7167f02ca8e8a4eb176121ffa58f50, type: 3}
m_PrefabInstance: {fileID: 4572424957848191029}
m_PrefabAsset: {fileID: 0}

View File

@ -931,7 +931,8 @@ GameObject:
m_Component:
- component: {fileID: 802786939}
- component: {fileID: 802786941}
- component: {fileID: 802786940}
- component: {fileID: 802786942}
- component: {fileID: 802786943}
m_Layer: 5
m_Name: Image2
m_TagString: Untagged
@ -958,7 +959,15 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &802786940
--- !u!222 &802786941
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 802786938}
m_CullTransparentMesh: 1
--- !u!114 &802786942
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@ -967,7 +976,7 @@ MonoBehaviour:
m_GameObject: {fileID: 802786938}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
@ -978,24 +987,25 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: e043954733c440645ba43b09301ee4a6, 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!222 &802786941
CanvasRenderer:
m_Texture: {fileID: 2800000, guid: e043954733c440645ba43b09301ee4a6, type: 3}
m_UVRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
--- !u!114 &802786943
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 802786938}
m_CullTransparentMesh: 1
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a0987fcca76655248ac8defaffd1cb45, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!224 &939125854 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 3531919739338806919, guid: 1de15a80c8c1aa94486563740a15d91c, type: 3}
@ -1010,9 +1020,6 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 1124446957}
- component: {fileID: 1124446960}
- component: {fileID: 1124446959}
- component: {fileID: 1124446958}
- component: {fileID: 1124446961}
m_Layer: 5
m_Name: FilterPreview
@ -1028,83 +1035,20 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1124446956}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1471857115}
- {fileID: 802786939}
m_Father: {fileID: 1335662459}
m_Father: {fileID: 1599240741}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {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, y: 0}
--- !u!114 &1124446958
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1124446956}
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
--- !u!114 &1124446959
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1124446956}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 1920, y: 1080}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!223 &1124446960
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1124446956}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 1
m_Camera: {fileID: 1475480931}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 1
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 1
m_TargetDisplay: 0
m_Pivot: {x: 0.5, y: 0.5}
--- !u!225 &1124446961
CanvasGroup:
m_ObjectHideFlags: 0
@ -1153,11 +1097,9 @@ Transform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1639312037}
- {fileID: 1475480929}
- {fileID: 74796459}
- {fileID: 1427887270}
- {fileID: 1599240741}
- {fileID: 1124446957}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1335662460
@ -1172,7 +1114,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 980f937ad27ad8540afeb8b7f100997e, type: 3}
m_Name:
m_EditorClassIdentifier:
m_filterVolume: {fileID: 1475480930}
m_filterPreview: {fileID: 1124446961}
m_xmbBg: {fileID: 730698712}
bTest: 0
@ -1229,6 +1170,18 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 1599240741}
m_Modifications:
- target: {fileID: 245821230929098307, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 245821230929098307, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 245821230929098307, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1108503213262670097, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1253,6 +1206,22 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1700008050955832379, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1700008050955832379, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1700008050955832379, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1700008050955832379, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1710183501897154830, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1341,6 +1310,22 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2256656160383605798, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2256656160383605798, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2256656160383605798, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2256656160383605798, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2580867844924924490, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1369,6 +1354,158 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2711516940043786061, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2711516940043786061, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2711516940043786061, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2711516940043786061, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2711516940043786061, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2921874279820016524, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2921874279820016524, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2940710093054777883, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2940710093054777883, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2940710093054777883, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2940710093054777883, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2940710093054777883, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2940710093054777883, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2940710093054777883, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3082393374055389930, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3082393374055389930, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3082393374055389930, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3082393374055389930, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3201409976408832832, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3201409976408832832, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3201409976408832832, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3201409976408832832, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3283429487447647189, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3283429487447647189, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3283429487447647189, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3283429487447647189, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3283429487447647189, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3382122818573208955, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3382122818573208955, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3515422821744378301, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3515422821744378301, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3515422821744378301, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3515422821744378301, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3515422821744378301, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3638410964911123998, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3638410964911123998, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3638410964911123998, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3638410964911123998, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4195056312044822544, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1409,6 +1546,18 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4671900371089820408, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4671900371089820408, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4671900371089820408, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4701095282238438274, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1457,6 +1606,22 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5155040771471469003, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5155040771471469003, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5155040771471469003, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5155040771471469003, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5179542162941529357, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1577,6 +1742,22 @@ PrefabInstance:
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6064974212694732928, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6064974212694732928, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6064974212694732928, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6064974212694732928, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6228199563403754553, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1649,6 +1830,26 @@ PrefabInstance:
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6384207385666895815, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6384207385666895815, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6384207385666895815, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6384207385666895815, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6384207385666895815, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6462781698725903427, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1705,6 +1906,46 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6696282460080611485, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6696282460080611485, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6696282460080611485, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6696282460080611485, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6696282460080611485, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7042646075262940748, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7042646075262940748, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7042646075262940748, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7042646075262940748, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7042646075262940748, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7158194035478552859, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1757,6 +1998,18 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7294832541871909085, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7294832541871909085, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7294832541871909085, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7535416527851975519, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -1785,6 +2038,34 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8720207225742131896, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8720207225742131896, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8720207225742131896, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8720207225742131896, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 9044517244222250025, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 9044517244222250025, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 9044517244222250025, guid: 3b211f31b55a35e44a8fa38666f63383, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
@ -1884,174 +2165,6 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
imgUI: {fileID: 1471857116}
--- !u!1 &1475480928
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1475480929}
- component: {fileID: 1475480931}
- component: {fileID: 1475480932}
- component: {fileID: 1475480930}
m_Layer: 5
m_Name: GameCamera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1475480929
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1475480928}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.98, y: 20.14, z: 6.23}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1335662459}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1475480930
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1475480928}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8b9a305e18de0c04dbd257a21cd47087, type: 3}
m_Name:
m_EditorClassIdentifier:
sharedProfile: {fileID: 11400000, guid: 17060e2d2f9e5c340a526f08317e5a98, type: 2}
isGlobal: 1
blendDistance: 0
weight: 1
priority: 0
--- !u!20 &1475480931
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1475480928}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 1
orthographic size: 5
m_Depth: -2
m_CullingMask:
serializedVersion: 2
m_Bits: 32
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!114 &1475480932
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1475480928}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 948f4100a11a5c24981795d21301da5c, type: 3}
m_Name:
m_EditorClassIdentifier:
volumeTrigger: {fileID: 0}
volumeLayer:
serializedVersion: 2
m_Bits: 32
stopNaNPropagation: 1
finalBlitToCameraTarget: 0
antialiasingMode: 0
temporalAntialiasing:
jitterSpread: 0.75
sharpness: 0.25
stationaryBlending: 0.95
motionBlending: 0.85
subpixelMorphologicalAntialiasing:
quality: 2
fastApproximateAntialiasing:
fastMode: 0
keepAlpha: 0
fog:
enabled: 1
excludeSkybox: 1
debugLayer:
lightMeter:
width: 512
height: 256
showCurves: 1
histogram:
width: 512
height: 256
channel: 3
waveform:
exposure: 0.12
height: 256
vectorscope:
size: 256
exposure: 0.12
overlaySettings:
linearDepth: 0
motionColorIntensity: 4
motionGridSize: 64
colorBlindnessType: 0
colorBlindnessStrength: 1
m_Resources: {fileID: 11400000, guid: d82512f9c8e5d4a4d938b575d47f88d4, type: 2}
m_ShowToolkit: 0
m_ShowCustomSorter: 0
breakBeforeColorGrading: 0
m_BeforeTransparentBundles: []
m_BeforeStackBundles:
- assemblyQualifiedName: FixingPixelArtGrille, AxibugEmuOnline.Client, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
- assemblyQualifiedName: MattiasCRT, AxibugEmuOnline.Client, Version=0.0.0.0, Culture=neutral,
PublicKeyToken=null
- assemblyQualifiedName: LCDPostEffect, AxibugEmuOnline.Client, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
m_AfterStackBundles: []
--- !u!1 &1498586261
GameObject:
m_ObjectHideFlags: 3
@ -2190,10 +2303,11 @@ RectTransform:
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1124446957}
- {fileID: 1983793178}
- {fileID: 1469631713}
- {fileID: 939125854}
- {fileID: 1318590597}
- {fileID: 1469631713}
m_Father: {fileID: 1335662459}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@ -2214,7 +2328,7 @@ GameObject:
- component: {fileID: 1639312035}
m_Layer: 0
m_Name: UICamera
m_TagString: Untagged
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@ -2263,7 +2377,7 @@ Camera:
field of view: 60
orthographic: 1
orthographic size: 5
m_Depth: -1
m_Depth: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 32
@ -2467,10 +2581,18 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 406143166925924216, guid: 1de15a80c8c1aa94486563740a15d91c, type: 3}
propertyPath: m_AnchoredPosition.x
value: -5
objectReference: {fileID: 0}
- target: {fileID: 736530578155193984, guid: 1de15a80c8c1aa94486563740a15d91c, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 736530578155193984, guid: 1de15a80c8c1aa94486563740a15d91c, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 935090267056593628, guid: 1de15a80c8c1aa94486563740a15d91c, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@ -2963,6 +3085,10 @@ PrefabInstance:
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8801936766261209235, guid: 1de15a80c8c1aa94486563740a15d91c, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []

View File

@ -34,6 +34,11 @@ namespace AxibugEmuOnline.Client.ClientCore
#region Mono
public static TickLoop tickLoop;
private static CoroutineRunner coRunner;
#if UNITY_PSP2
public static SonyVitaCommonDialog sonyVitaCommonDialog;
#endif
#endregion
#if UNITY_PSP2 && !UNITY_EDITOR //PSV真机
@ -43,15 +48,13 @@ namespace AxibugEmuOnline.Client.ClientCore
#endif
public static void Init(Initer initer, bool isTest = false, string testSrvIP = "")
{
PlayerPrefs.DeleteAll();
//其他平台必要的初始化
if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
{
PSP2Init();
}
if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
{
//PSV 等平台需要手动创建目录
PSP2Init();
}
settings = new AppSettings();
settings = new AppSettings();
log = new LogManager();
LogManager.OnLog += OnNoSugarNetLog;
@ -66,7 +69,7 @@ namespace AxibugEmuOnline.Client.ClientCore
CacheMgr = new CacheManager();
roomMgr = new AppRoom();
share = new AppShare();
filter = new FilterManager(initer.m_filterVolume, initer.m_filterPreview, initer.m_xmbBg);
filter = new FilterManager(initer.m_filterPreview, initer.m_xmbBg);
bTest = isTest;
mTestSrvIP = testSrvIP;
var go = new GameObject("[AppAxibugEmuOnline]");
@ -90,9 +93,12 @@ namespace AxibugEmuOnline.Client.ClientCore
Directory.CreateDirectory(PersistentDataPath);
#if UNITY_PSP2
//创建PSV弹窗UI
sonyVitaCommonDialog = new GameObject().AddComponent<SonyVitaCommonDialog>();
//释放解码 FMV的26M内存一般游戏用不上PSP才用那破玩意儿
UnityEngine.PSVita.PSVitaVideoPlayer.TransferMemToMonoHeap();
#endif
}
private static IEnumerator AppTickFlow()
@ -122,7 +128,7 @@ namespace AxibugEmuOnline.Client.ClientCore
yield break;
}
AxiHttpProxy.SendWebRequestProxy request = AxiHttpProxy.Get($"{App.httpAPI.WebSiteApi}/CheckStandInfo?platform={platform}&version={Application.version}");
AxiHttpProxy.SendWebRequestProxy request = AxiHttpProxy.Get($"{App.httpAPI.WebSiteApi}/CheckStandInfo?platform={platform}&version={Application.version}");
yield return request.SendWebRequest;
if (!request.downloadHandler.isDone)
yield break;

View File

@ -14,7 +14,6 @@ using System.Threading;
public static class PSVThread
{
static Thread psvThread = new Thread(Loop);
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static Queue<Action> qActs = new Queue<Action>();
static Queue<Action> qWork = new Queue<Action>();
@ -29,6 +28,7 @@ public static class PSVThread
}
#if UNITY_PSP2
static Thread psvThread = new Thread(Loop);
static bool bSingleInit = false;
static void SingleInit()
{

View File

@ -9,7 +9,10 @@
/// 登录成功
/// </summary>
OnLoginSucceed,
/// <summary>
/// 当登录被置为false时
/// </summary>
OnLossLoginState,
/// <summary>
/// 登录失败
/// </summary>
@ -62,11 +65,20 @@
/// <summary>
/// 服务器等待Step更新
/// </summary>
OnRoomWaitStepChange,
OnRoomWaitStepChange,
/// <summary>
/// 当房间中手柄位信息发生任何变化时触发,进入房间后也应该触发
/// </summary>
OnRoomSlotDataChanged,
OnRoomSlotDataChanged,
/// <summary>
/// 当手柄连接设置发生变化时触发
/// </summary>
OnControllerConnectChanged,
/// <summary>
/// 当本机手柄渴望插入时触发
/// <para>参数: <see cref="int"/> 本地手柄序号[0,3]</para>
/// </summary>
OnLocalJoyDesireInvert
}
}

View File

@ -1,28 +1,32 @@
using System;
using Assets.Script.AppMain.Filter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
namespace AxibugEmuOnline.Client
{
public abstract class FilterEffect : PostProcessEffectSettings
public abstract class FilterEffect
{
private List<EditableParamerter> m_editableParamList;
public BoolParameter Enable = new BoolParameter(false);
public abstract string Name { get; }
public IReadOnlyCollection<EditableParamerter> EditableParam => m_editableParamList.AsReadOnly();
public abstract string Name { get; }
List<EditableParamerter> m_editableParamList;
Material m_material;
protected abstract string ShaderName { get; }
public FilterEffect()
{
GetEditableFilterParamters();
m_material = new Material(Shader.Find(ShaderName));
}
protected void GetEditableFilterParamters()
void GetEditableFilterParamters()
{
var parameters = (from t in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)
where t.FieldType.IsSubclassOf(typeof(ParameterOverride))
where t.FieldType.IsSubclassOf(typeof(FilterParameter))
where t.DeclaringType.IsSubclassOf(typeof(FilterEffect))
orderby t.MetadataToken
select t);
@ -30,7 +34,7 @@ namespace AxibugEmuOnline.Client
m_editableParamList = new List<EditableParamerter>();
foreach (var param in parameters)
{
var paramObj = (ParameterOverride)param.GetValue(this);
var paramObj = (FilterParameter)param.GetValue(this);
var rangeAtt = param.GetCustomAttribute<RangeAttribute>();
float min = 0;
float max = 10;
@ -44,47 +48,41 @@ namespace AxibugEmuOnline.Client
}
}
public void Render(Texture src, RenderTexture result)
{
m_material.SetTexture("_MainTex", src);
OnRenderer(m_material, src, result);
}
protected abstract void OnRenderer(Material renderMat, Texture src, RenderTexture result);
public class EditableParamerter
{
private ParameterOverride m_paramObject;
private FieldInfo valueFieldInfo;
private FilterParameter m_paramObject;
public Type ValueType { get; private set; }
public Type ValueType => m_paramObject.ValueType;
public string Name { get; private set; }
public object Value
{
get => valueFieldInfo.GetValue(m_paramObject);
set
{
valueFieldInfo.SetValue(m_paramObject, value);
m_paramObject.overrideState = true;
}
get => m_paramObject.Value;
set => m_paramObject.Value = value;
}
public object MinValue { get; private set; }
public object MaxValue { get; private set; }
public EditableParamerter(string name, ParameterOverride paramObject, object minValue, object maxValue)
public EditableParamerter(string name, FilterParameter paramObject, object minValue, object maxValue)
{
m_paramObject = paramObject;
Name = name;
var paramType = paramObject.GetType();
valueFieldInfo = paramType.GetField("value", BindingFlags.Public | BindingFlags.Instance);
if (valueFieldInfo != null)
{
ValueType = valueFieldInfo.FieldType;
}
else
{
ValueType = typeof(object);
}
MinValue = minValue;
MaxValue = maxValue;
}
public void ResetToDefault() => m_paramObject.overrideState = false;
public void ResetToDefault() => m_paramObject.Value = null;
public void Apply(object overrideValue)

View File

@ -0,0 +1,402 @@
using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using static AxibugEmuOnline.Client.FilterEffect;
namespace AxibugEmuOnline.Client
{
public class FilterManager
{
private List<Filter> m_filters;
private Dictionary<EnumPlatform, Filter> m_filterPlatforms = new Dictionary<EnumPlatform, Filter>();
private AlphaWraper m_previewFilterWraper;
FilterRomSetting m_filterRomSetting;
/// <summary>
/// 滤镜列表
/// </summary>
public IReadOnlyList<Filter> Filters => m_filters;
public FilterManager(CanvasGroup filterPreview, CanvasGroup mainBg)
{
#if UNITY_PSP2
m_filters = new List<Filter>();
m_filterRomSetting = new FilterRomSetting();
m_previewFilterWraper = new AlphaWraper(mainBg, filterPreview, false);
return;
#endif
m_filters = new List<Filter>
{
new Filter(new FixingPixelArtGrille()),
new Filter(new LCDPostEffect()),
new Filter(new MattiasCRT()),
};
var json = PlayerPrefs.GetString(nameof(FilterRomSetting));
m_filterRomSetting = JsonUtility.FromJson<FilterRomSetting>(json) ?? new FilterRomSetting();
m_previewFilterWraper = new AlphaWraper(mainBg, filterPreview, false);
ShutDownFilterPreview();
ShutDownFilter();
}
private RenderTexture result = null;
public Texture ExecuteFilterRender(Texture src)
{
if (result == null)
{
//result = RenderTexture.GetTemporary(Screen.width, Screen.height);
result = Initer.instance.renderTest;
}
else if (result.width != Screen.width || result.height != Screen.height)
{
//RenderTexture.ReleaseTemporary(result);
//result = RenderTexture.GetTemporary(Screen.width, Screen.height);
result = Initer.instance.renderTest;
}
bool anyFilterEnable = false;
foreach (var filter in Filters)
{
if (!filter.m_setting.Enable.GetValue()) continue;
filter.m_setting.Render(src, result);
anyFilterEnable = true;
}
if (anyFilterEnable)
return result;
else
return src;
}
/// <summary> 关闭滤镜预览 </summary>
public void ShutDownFilterPreview()
{
m_previewFilterWraper.On = false;
}
/// <summary> 开启滤镜预览 </summary>
public void EnableFilterPreview()
{
m_previewFilterWraper.On = true;
}
/// <summary>
/// 打开滤镜
/// </summary>
/// <param name="filter"></param>
public void EnableFilter(Filter filter)
{
foreach (var selfFiler in Filters)
{
if (selfFiler != filter) selfFiler.m_setting.Enable.Override(false);
else selfFiler.m_setting.Enable.Override(true);
}
}
/// <summary>
/// 关闭滤镜效果
/// </summary>
public void ShutDownFilter()
{
//关闭所有后处理效果
foreach (var filter in Filters)
filter.m_setting.Enable.Override(false);
}
/// <summary>
/// 为指定rom设置滤镜以及滤镜的预设
/// </summary>
/// <param name="rom">rom对象</param>
/// <param name="filter">滤镜</param>
/// <param name="preset">滤镜预设</param>
public void SetupFilter(RomFile rom, Filter filter, FilterPreset preset)
{
m_filterRomSetting.Setup(rom, filter, preset);
string json = m_filterRomSetting.ToJson();
PlayerPrefs.SetString(nameof(FilterRomSetting), json);
}
/// <summary>
/// 获得指定rom配置的滤镜设置
/// </summary>
/// <param name="rom">rom对象</param>
/// <returns>此元组任意内任意成员都有可能为空</returns>
public GetFilterSetting_result GetFilterSetting(RomFile rom)
{
var value = m_filterRomSetting.Get(rom);
Filter filter = null;
FilterPreset preset = null;
//filter = Filters.FirstOrDefault(f => f.Name == value.filterName);
//if (filter != null)
//{
// string presetName = value.presetName;
// preset = filter.Presets.FirstOrDefault(p => p.Name == presetName);
//}
filter = Filters.FirstOrDefault(f => f.Name == value.Item1);
if (filter != null)
{
string presetName = value.Item2;
preset = filter.Presets.FirstOrDefault(p => p.Name == presetName);
}
return new GetFilterSetting_result()
{
filter = filter,
preset = preset
};
}
public struct GetFilterSetting_result
{
public Filter filter;
public FilterPreset preset;
}
public class Filter
{
public string Name => m_setting.Name;
public IReadOnlyCollection<EditableParamerter> Paramerters => m_setting.EditableParam;
/// <summary> 滤镜预设 </summary>
public List<FilterPreset> Presets = new List<FilterPreset>();
/// <summary> 滤镜默认预设 </summary>
public FilterPreset DefaultPreset = new FilterPreset("DEFAULT");
internal FilterEffect m_setting;
public Filter(FilterEffect setting)
{
m_setting = setting;
loadPresets();
}
private void loadPresets()
{
var json = PlayerPrefs.GetString($"Filter_{Name}_PresetList", string.Empty);
var loadedPresets = JsonUtility.FromJson<FilterPresetList>(json);
if (loadedPresets == null) return;
else Presets = loadedPresets.presets;
}
public void SavePresets()
{
var json = JsonUtility.ToJson(new FilterPresetList(Presets));
PlayerPrefs.SetString($"Filter_{Name}_PresetList", json);
}
public MsgBool CreatePreset(string presetName, out FilterPreset newPreset)
{
newPreset = null;
if (string.IsNullOrWhiteSpace(presetName)) return "名称不能为空";
if (Presets.Count(p => p.Name == presetName) != 0) return "名称重复";
newPreset = new FilterPreset(presetName);
Presets.Add(newPreset);
SavePresets();
return true;
}
public void RemovePreset(FilterPreset preset)
{
if (!Presets.Remove(preset)) return;
SavePresets();
EventInvoker.RaiseFilterPresetRemoved(this, preset);
}
public void ResetPreset()
{
foreach (var param in Paramerters)
{
param.ResetToDefault();
}
}
public void ApplyPreset(FilterPreset preset)
{
foreach (var param in Paramerters)
{
var value = preset.GetParamValue(param.Name, param.ValueType);
if (value == null)
param.ResetToDefault();
else
param.Apply(value);
}
}
}
[Serializable]
private class FilterPresetList
{
public List<FilterPreset> presets;
public FilterPresetList(List<FilterPreset> presets)
{
this.presets = presets;
foreach (var preset in presets)
{
preset.ReadyForJson();
}
}
}
[Serializable]
public class FilterPreset
{
[SerializeField]
public string Name;
[SerializeField]
private List<string> m_paramName = new List<string>();
[SerializeField]
private List<string> m_valueJson = new List<string>();
private bool m_cacheReady = false;
private Dictionary<string, string> m_paramName2ValueJson;
public FilterPreset(string presetName)
{
Name = presetName;
}
public void ReadyForJson()
{
prepareCache();
m_paramName = m_paramName2ValueJson.Keys.ToList();
m_valueJson = m_paramName2ValueJson.Values.ToList();
}
public string GetParamValueJson(string paramName)
{
prepareCache();
string value;
m_paramName2ValueJson.TryGetValue(paramName, out value);
return value;
}
public object GetParamValue(string paramName, Type valueType)
{
var rawStr = GetParamValueJson(paramName);
if (rawStr == null) return null;
if (valueType == typeof(float))
{
float floatVal;
float.TryParse(rawStr, out floatVal);
return floatVal;
}
else if (valueType.IsEnum)
{
var names = Enum.GetNames(valueType);
var values = Enum.GetValues(valueType);
for (int i = 0; i < names.Length; i++)
{
if (names[i].Equals(rawStr))
{
return values.GetValue(i);
}
}
return null;
}
else
{
App.log.Error($"尚未支持的滤镜参数类型{valueType}");
return null;
}
}
public void SetParamValue(string paramName, Type valueType, object value)
{
prepareCache();
m_paramName2ValueJson[paramName] = value.ToString();
}
private void prepareCache()
{
if (m_cacheReady) return;
m_paramName2ValueJson = new Dictionary<string, string>();
for (int i = 0; i < m_paramName.Count; i++)
{
m_paramName2ValueJson[m_paramName[i]] = m_valueJson[i];
}
m_cacheReady = true;
}
}
[Serializable]
public class FilterRomSetting
{
[SerializeField]
private List<int> m_romID;
[SerializeField]
private List<Item> m_items;
bool m_cacheReady = false;
Dictionary<int, Item> m_cache;
public void Setup(RomFile rom, Filter filter, FilterPreset preset)
{
prepareCache();
if (filter == null)
m_cache.Remove(rom.ID);
else
m_cache[rom.ID] = new Item { FilterName = filter.Name, PresetName = preset != null ? preset.Name : null };
}
public string ToJson()
{
prepareCache();
m_romID = m_cache.Keys.ToList();
m_items = m_cache.Values.ToList();
return JsonUtility.ToJson(this);
}
public ValueTuple<string, string> Get(RomFile rom)
{
prepareCache();
Item item;
m_cache.TryGetValue(rom.ID, out item);
return new ValueTuple<string, string>(item.FilterName, item.PresetName);
}
private void prepareCache()
{
if (m_cacheReady) return;
if (m_items == null) m_items = new List<Item>();
if (m_romID == null) m_romID = new List<int>();
m_cache = new Dictionary<int, Item>();
for (int i = 0; i < m_romID.Count && i < m_items.Count; i++)
{
m_cache[m_romID[i]] = m_items[i];
}
m_cacheReady = true;
}
[Serializable]
struct Item
{
public string FilterName;
public string PresetName;
}
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: f61dfd2411084ec469cdb3faacca298e

View File

@ -0,0 +1,49 @@
using System;
using System.Collections;
using UnityEngine;
namespace Assets.Script.AppMain.Filter
{
public abstract class FilterParameter
{
public abstract Type ValueType { get; }
object m_overrideValue;
protected object m_defaultValue;
public object Value
{
get => m_overrideValue ?? m_defaultValue;
set => m_overrideValue = value;
}
}
public class FilterParameter<T> : FilterParameter
{
public override Type ValueType => typeof(T);
public void Override(T value)
{
Value = value;
}
public T GetValue() => (T)Value;
public FilterParameter(T defaultValue)
{
m_defaultValue = defaultValue;
}
}
public class BoolParameter : FilterParameter<bool>
{
public BoolParameter(bool defaultValue) : base(defaultValue) { }
}
public class Vector2Parameter : FilterParameter<Vector2>
{
public Vector2Parameter(Vector2 defaultValue) : base(defaultValue) { }
}
public class FloatParameter : FilterParameter<float>
{
public FloatParameter(float defaultValue) : base(defaultValue) { }
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 53e95955f1beeb34a87d2046875fa16f

View File

@ -1,50 +1,29 @@
using AxibugEmuOnline.Client;
using Assets.Script.AppMain.Filter;
using AxibugEmuOnline.Client;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
[System.Serializable]
[PostProcess(typeof(FixingPixelArtGrilleRenderer), PostProcessEvent.BeforeStack, "Filter/FixingPixelArtGrille")]
public sealed class FixingPixelArtGrille : FilterEffect
{
public override string Name => nameof(FixingPixelArtGrille);
public ParameterOverride<EnumMaskStyle> MaskStyle = new ParameterOverride<EnumMaskStyle> { value = EnumMaskStyle.ApertureGrille };
[Tooltip("Emulated input resolution\nOptimize for resize")]
public Vector2Parameter DrawResolution = new Vector2Parameter
{
value = new Vector2(272, 240)
};
[Tooltip("Hardness of scanline")]
protected override string ShaderName => "PostEffect/FixingPixcelArtGrille";
public FilterParameter<EnumMaskStyle> MaskStyle = new FilterParameter<EnumMaskStyle>(EnumMaskStyle.ApertureGrille);
public Vector2Parameter DrawResolution = new Vector2Parameter(new Vector2(272, 240));
[Range(-32, 0)]
public FloatParameter HardScan = new FloatParameter { value = -10 };
[Tooltip("Hardness of pixels in scanline")]
public FloatParameter HardScan = new FloatParameter(-10);
[Range(-6, 0)]
public FloatParameter HardPix = new FloatParameter { value = -2 };
[Tooltip("Hardness of short vertical bloom")]
public FloatParameter HardPix = new FloatParameter(-2);
[Range(-8, 0)]
public FloatParameter HardBloomScan = new FloatParameter { value = -4.0f };
[Tooltip("Hardness of short horizontal bloom")]
public FloatParameter HardBloomScan = new FloatParameter(-4.0f);
[Range(-4, 0)]
public FloatParameter HardBloomPix = new FloatParameter { value = -1.5f };
[Tooltip("Amount of small bloom effect")]
public FloatParameter HardBloomPix = new FloatParameter(-1.5f);
[Range(0, 1)]
public FloatParameter BloomAmount = new FloatParameter { value = 1 / 16f };
[Tooltip("Display warp")]
public Vector2Parameter Warp = new Vector2Parameter { value = new Vector2(1f / 64f, 1f / 24f) };
[Tooltip("Amount of shadow mask Light")]
public FloatParameter BloomAmount = new FloatParameter(1 / 16f);
public Vector2Parameter Warp = new Vector2Parameter(new Vector2(1f / 64f, 1f / 24f));
[Range(1, 3)]
public FloatParameter MaskLight = new FloatParameter { value = 1.5f };
public FloatParameter MaskLight = new FloatParameter(1.5f);
[Range(0.1f, 1)]
[Tooltip("Amount of shadow mask Dark")]
public FloatParameter MaskDrak = new FloatParameter { value = 0.5f };
public FloatParameter MaskDrak = new FloatParameter(0.5f);
public enum EnumMaskStyle
{
@ -53,54 +32,41 @@ public sealed class FixingPixelArtGrille : FilterEffect
StretchedVGA,
VGAStyle
}
}
public sealed class FixingPixelArtGrilleRenderer : PostProcessEffectRenderer<FixingPixelArtGrille>
{
private Shader shader;
private Material material;
public override void Init()
protected override void OnRenderer(Material renderMat, Texture src, RenderTexture result)
{
shader = Shader.Find("PostEffect/FixingPixcelArtGrille");
material = new Material(shader);
}
renderMat.SetVector("_iResolution", new Vector4(result.width, result.height, 0, 0));
renderMat.SetVector("_res", new Vector4(DrawResolution.GetValue().x, DrawResolution.GetValue().y, 0, 0));
renderMat.SetFloat("_hardScan", HardScan.GetValue());
renderMat.SetFloat("_hardPix", HardPix.GetValue());
renderMat.SetFloat("_hardBloomScan", HardBloomScan.GetValue());
renderMat.SetFloat("_hardBloomPix", HardBloomPix.GetValue());
renderMat.SetFloat("_bloomAmount", BloomAmount.GetValue());
renderMat.SetVector("_warp", Warp.GetValue());
renderMat.SetFloat("_maskDark", MaskDrak.GetValue());
renderMat.SetFloat("_maskLight", MaskLight.GetValue());
public override void Render(PostProcessRenderContext context)
{
material.SetVector("_iResolution", new Vector4(Screen.width, Screen.height, 0, 0));
var res = settings.DrawResolution;
material.SetVector("_res", new Vector4(res.value.x, res.value.y, 0, 0));
material.SetFloat("_hardScan", settings.HardScan.value);
material.SetFloat("_hardPix", settings.HardPix.value);
material.SetFloat("_hardBloomScan", settings.HardBloomScan.value);
material.SetFloat("_hardBloomPix", settings.HardBloomPix.value);
material.SetFloat("_bloomAmount", settings.BloomAmount.value);
material.SetVector("_warp", settings.Warp.value);
material.SetFloat("_maskDark", settings.MaskDrak.value);
material.SetFloat("_maskLight", settings.MaskLight.value);
renderMat.DisableKeyword("_MASKSTYLE_VGASTYLE");
renderMat.DisableKeyword("_MASKSTYLE_TVSTYLE");
renderMat.DisableKeyword("_MASKSTYLE_APERTUREGRILLE");
renderMat.DisableKeyword("_MASKSTYLE_STRETCHEDVGA");
material.DisableKeyword("_MASKSTYLE_VGASTYLE");
material.DisableKeyword("_MASKSTYLE_TVSTYLE");
material.DisableKeyword("_MASKSTYLE_APERTUREGRILLE");
material.DisableKeyword("_MASKSTYLE_STRETCHEDVGA");
switch (settings.MaskStyle.value)
switch (MaskStyle.GetValue())
{
case FixingPixelArtGrille.EnumMaskStyle.VGAStyle:
material.EnableKeyword("_MASKSTYLE_VGASTYLE");
case EnumMaskStyle.VGAStyle:
renderMat.EnableKeyword("_MASKSTYLE_VGASTYLE");
break;
case FixingPixelArtGrille.EnumMaskStyle.TVStyle:
material.EnableKeyword("_MASKSTYLE_TVSTYLE");
case EnumMaskStyle.TVStyle:
renderMat.EnableKeyword("_MASKSTYLE_TVSTYLE");
break;
case FixingPixelArtGrille.EnumMaskStyle.ApertureGrille:
material.EnableKeyword("_MASKSTYLE_APERTUREGRILLE");
case EnumMaskStyle.ApertureGrille:
renderMat.EnableKeyword("_MASKSTYLE_APERTUREGRILLE");
break;
case FixingPixelArtGrille.EnumMaskStyle.StretchedVGA:
material.EnableKeyword("_MASKSTYLE_STRETCHEDVGA");
case EnumMaskStyle.StretchedVGA:
renderMat.EnableKeyword("_MASKSTYLE_STRETCHEDVGA");
break;
}
context.command.Blit(context.source, context.destination, material);
Graphics.Blit(src, result, renderMat);
}
}

View File

@ -1,96 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-2985742813244632235
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 98a055cea8a1355429d1cbb752c4e60e, type: 3}
m_Name: MattiasCRT
m_EditorClassIdentifier:
active: 1
enabled:
overrideState: 1
value: 1
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8e6292b2c06870d4495f009f912b9600, type: 3}
m_Name: GameCamera Profile
m_EditorClassIdentifier:
settings:
- {fileID: 117625959343581733}
- {fileID: -2985742813244632235}
- {fileID: 2118329037781486242}
--- !u!114 &117625959343581733
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e88ab71ab1a47d048ba0e45b742f6140, type: 3}
m_Name: FixingPixelArtGrille
m_EditorClassIdentifier:
active: 1
enabled:
overrideState: 1
value: 1
MaskStyle:
overrideState: 0
value: 1
DrawResolution:
overrideState: 0
value: {x: 272, y: 240}
HardScan:
overrideState: 0
value: -10
HardPix:
overrideState: 0
value: -2
HardBloomScan:
overrideState: 0
value: -4
HardBloomPix:
overrideState: 0
value: -1.5
BloomAmount:
overrideState: 0
value: 0.0625
Warp:
overrideState: 0
value: {x: 0.015625, y: 0.041666668}
MaskLight:
overrideState: 0
value: 1.5
MaskDrak:
overrideState: 0
value: 0.5
--- !u!114 &2118329037781486242
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2a0a5286ac74b734ba8d1e0cfdfb9c8d, type: 3}
m_Name: LCDPostEffect
m_EditorClassIdentifier:
active: 1
enabled:
overrideState: 1
value: 1

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 17060e2d2f9e5c340a526f08317e5a98
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,28 +1,15 @@
using AxibugEmuOnline.Client;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
[System.Serializable]
[PostProcess(typeof(LCDPostEffectRenderer), PostProcessEvent.BeforeStack, "Filter/LCDPostEffect")]
public sealed class LCDPostEffect : FilterEffect
{
public override string Name => nameof(LCDPostEffect);
protected override string ShaderName => "Filter/LCDPostEffect";
protected override void OnRenderer(Material renderMat, Texture src, RenderTexture result)
{
renderMat.SetVector("_iResolution", new Vector4(Screen.width, Screen.height, 0, 0));
Graphics.Blit(src, result, renderMat);
}
}
public sealed class LCDPostEffectRenderer : PostProcessEffectRenderer<LCDPostEffect>
{
private Shader shader;
private Material material;
public override void Init()
{
shader = Shader.Find("Filter/LCDPostEffect");
material = new Material(shader);
}
public override void Render(PostProcessRenderContext context)
{
material.SetVector("_iResolution", new Vector4(Screen.width, Screen.height, 0, 0));
context.command.Blit(context.source, context.destination, material);
}
}

View File

@ -1,28 +1,15 @@
using AxibugEmuOnline.Client;
using AxibugEmuOnline.Client;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
[System.Serializable]
[PostProcess(typeof(MattiasCRTRenderer), PostProcessEvent.BeforeStack, "Filter/MattiasCRT")]
public sealed class MattiasCRT : FilterEffect
{
public override string Name => nameof(MattiasCRT);
}
public sealed class MattiasCRTRenderer : PostProcessEffectRenderer<MattiasCRT>
{
private Shader shader;
private Material material;
protected override string ShaderName => "Filter/MattiasCRT";
public override void Init()
protected override void OnRenderer(Material renderMat, Texture src, RenderTexture result)
{
shader = Shader.Find("Filter/MattiasCRT");
material = new Material(shader);
}
public override void Render(PostProcessRenderContext context)
{
material.SetVector("_iResolution", new Vector4(Screen.width, Screen.height, 0, 0));
context.command.Blit(context.source, context.destination, material);
renderMat.SetVector("_iResolution", new Vector4(result.width, result.height, 0, 0));
Graphics.Blit(src, result, renderMat);
}
}

View File

@ -0,0 +1,21 @@
using AxibugEmuOnline.Client.ClientCore;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(RawImage))]
public class UIFilterPreviewer : MonoBehaviour
{
private RawImage m_rawImg;
private Texture m_src;
private void Awake()
{
m_rawImg = GetComponent<RawImage>();
m_src = m_rawImg.texture;
}
private void Update()
{
m_rawImg.texture = App.filter.ExecuteFilterRender(m_src);
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a0987fcca76655248ac8defaffd1cb45

View File

@ -1,4 +1,4 @@
using UnityEngine;
using UnityEngine;
namespace AxibugEmuOnline.Client
{
@ -14,7 +14,9 @@ namespace AxibugEmuOnline.Client
void Resume();
void SetupScheme();
void StartGame(RomFile romFile);
void DoReset();
void DoReset();
IControllerSetuper GetControllerSetuper();
EnumPlatform Platform { get; }
uint Frame { get; }
}

View File

@ -1,12 +1,10 @@
using AxibugEmuOnline.Client.ClientCore;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
namespace AxibugEmuOnline.Client
{
public class Initer : MonoBehaviour
{
public PostProcessVolume m_filterVolume;
public CanvasGroup m_filterPreview;
public CanvasGroup m_xmbBg;
public static string dev_UUID;

View File

@ -13,7 +13,7 @@ namespace AxibugEmuOnline.Client.Manager
/// </summary>
private IEmuCore m_emuCore;
private VirtualNes.Core.IControllerSetuper m_controllerSetuper;
private IControllerSetuper m_controllerSetuper;
/// <summary>
/// unity的c#实现有bug,以接口类型保存的monobehaviour引用,!=和==运算符没有调用到monobehaviour重写过的运算符
@ -63,39 +63,31 @@ namespace AxibugEmuOnline.Client.Manager
m_emuCore.SetupScheme();
m_controllerSetuper = Supporter.GetControllerSetuper();
SetupController();
m_controllerSetuper = m_emuCore.GetControllerSetuper();
//自动分配0号手柄到0号手柄位
m_controllerSetuper.SetConnect(con0ToSlot: 0);
Eventer.Instance.PostEvent(EEvent.OnControllerConnectChanged);
Eventer.Instance.RegisterEvent(EEvent.OnRoomSlotDataChanged, OnSlotDataChanged);
}
private void OnSlotDataChanged()
{
SetupController();
}
long selfUID = App.user.userdata.UID;
uint? con0Slot;
uint? con1Slot;
uint? con2Slot;
uint? con3Slot;
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 0, out con0Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 1, out con1Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 2, out con2Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 3, out con3Slot);
m_controllerSetuper.SetConnect(con0Slot, con1Slot, con2Slot, con3Slot);
private void SetupController()
{
if (!App.roomMgr.InRoom) //不在房间中,自动分配0号手柄到0号手柄位
{
m_controllerSetuper.SetConnect(con0ToSlot: 0);
}
else //在房间中则使用服务器下发的手柄槽位信息分配本地手柄
{
long selfUID = App.user.userdata.UID;
uint? con0Slot;
uint? con1Slot;
uint? con2Slot;
uint? con3Slot;
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 0, out con0Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 1, out con1Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 2, out con2Slot);
App.roomMgr.mineRoomMiniInfo.GetPlayerSlotIdxByUid(selfUID, 3, out con3Slot);
m_controllerSetuper.SetConnect(con0Slot, con1Slot, con2Slot, con3Slot);
}
Eventer.Instance.PostEvent(EEvent.OnControllerConnectChanged);
}
public void StopGame()

View File

@ -14,7 +14,7 @@ namespace AxibugEmuOnline.Client.Manager
public class AppRoom
{
public Protobuf_Room_MiniInfo mineRoomMiniInfo { get; private set; } = null;
public bool InRoom => mineRoomMiniInfo != null;
public bool InRoom => App.user.IsLoggedIn && mineRoomMiniInfo != null;
public bool IsHost => mineRoomMiniInfo?.HostPlayerUID == App.user.userdata.UID;
public bool IsScreenProviderUID => mineRoomMiniInfo?.ScreenProviderUID == App.user.userdata.UID;
public RoomGameState RoomState => mineRoomMiniInfo.GameState;
@ -35,6 +35,7 @@ namespace AxibugEmuOnline.Client.Manager
Protobuf_Room_Create _Protobuf_Room_Create = new Protobuf_Room_Create();
Protobuf_Room_Join _Protobuf_Room_Join = new Protobuf_Room_Join();
Protobuf_Room_Leave _Protobuf_Room_Leave = new Protobuf_Room_Leave();
Protobuf_Room_Change_PlaySlotWithJoy _Protobuf_Room_Change_PlaySlotWithJoy = new Protobuf_Room_Change_PlaySlotWithJoy();
Protobuf_Room_Player_Ready _Protobuf_Room_Player_Ready = new Protobuf_Room_Player_Ready();
Protobuf_Room_SinglePlayerInputData _Protobuf_Room_SinglePlayerInputData = new Protobuf_Room_SinglePlayerInputData();
Protobuf_Screnn_Frame _Protobuf_Screnn_Frame = new Protobuf_Screnn_Frame();
@ -298,6 +299,12 @@ namespace AxibugEmuOnline.Client.Manager
void RecvRoomMyRoomStateChange(byte[] reqData)
{
if (mineRoomMiniInfo == null)
{
App.log.Error("RecvRoomMyRoomStateChange 时 mineRoomMiniInfo 为空");
return;
}
Protobuf_Room_MyRoom_State_Change msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_MyRoom_State_Change>(reqData);
long[] oldRoomPlayer = GetRoom4PlayerUIDs();
Protobuf_Room_GamePlaySlot[] oldslotArr = GetRoom4GameSlotMiniInfos();
@ -399,8 +406,52 @@ namespace AxibugEmuOnline.Client.Manager
// OverlayManager.PopTip($"[{PlayerName}]进入房间,手柄位:P{i}");
// }
//}
}
/// <summary>
/// 发送修改玩家槽位,但是增量
/// </summary>
/// <param name="dictSlotIdx2LocalJoyIdx">玩家占用房间GamePlaySlot和LocalJoyIdx字典</param>
public void SendChangePlaySlotIdxWithJoyIdx(uint localJoyIndex, uint slotIndex)
{
if (!App.roomMgr.InRoom) return;
Dictionary<uint, uint> temp = new Dictionary<uint, uint>();
for (int i = 0; i < App.roomMgr.mineRoomMiniInfo.GamePlaySlotList.Count; i++)
{
var item = App.roomMgr.mineRoomMiniInfo.GamePlaySlotList[i];
if (item.PlayerUID <= 0) continue;
if (item.PlayerUID != App.user.userdata.UID) return;
temp[(uint)i] = (uint)item.PlayerLocalJoyIdx;
}
temp[slotIndex] = localJoyIndex;
SendChangePlaySlotIdxWithJoyIdx(temp);
}
/// <summary>
/// 发送修改玩家槽位,全量
/// </summary>
/// <param name="dictSlotIdx2LocalJoyIdx">玩家占用房间GamePlaySlot和LocalJoyIdx字典</param>
public void SendChangePlaySlotIdxWithJoyIdx(Dictionary<uint, uint> dictSlotIdx2LocalJoyIdx)
{
if (!InRoom)
return;
_Protobuf_Room_Change_PlaySlotWithJoy.SlotWithJoy.Clear();
foreach (var slotdata in dictSlotIdx2LocalJoyIdx)
{
_Protobuf_Room_Change_PlaySlotWithJoy.SlotWithJoy.Add(new Protobuf_PlaySlotIdxWithJoyIdx()
{
PlayerSlotIdx = (int)slotdata.Key,
PlayerLocalJoyIdx = (int)slotdata.Value,
});
}
App.log.Info($"SendChangePlaySlotIdxWithJoyIdx");
App.network.SendToServer((int)CommandID.CmdRoomChangePlayerWithJoy, ProtoBufHelper.Serizlize(_Protobuf_Room_Change_PlaySlotWithJoy));
}
/// <summary>
/// 上报即时存档
/// </summary>
@ -512,16 +563,15 @@ namespace AxibugEmuOnline.Client.Manager
/// <param name="roomMiniInfo"></param>
/// <param name="freeSlots"></param>
/// <returns></returns>
public static bool GetFreeSlot(this Protobuf_Room_MiniInfo roomMiniInfo, out int[] freeSlots)
public static bool GetFreeSlot(this Protobuf_Room_MiniInfo roomMiniInfo, ref List<int> freeSlots)
{
List<int> temp = new List<int>();
freeSlots.Clear();
for (int i = 0; i < roomMiniInfo.GamePlaySlotList.Count; i++)
{
if (roomMiniInfo.GamePlaySlotList[i].PlayerUID <= 0)
temp.Add(i);
freeSlots.Add(i);
}
freeSlots = temp.ToArray();
return freeSlots.Length > 0;
return freeSlots.Count > 0;
}
/// <summary>
@ -530,15 +580,10 @@ namespace AxibugEmuOnline.Client.Manager
public static bool GetPlayerSlotIdxByUid(this Protobuf_Room_MiniInfo roomMiniInfo, long uid, int joyIdx, out uint? slotIdx)
{
slotIdx = null;
//joyIdx取值返回[0,3],这个序号代表玩家本地的手柄编号
//todo : 根据uid和controllerIndex 返回占用的位置
//目前未实现,所有非0号位置的手柄,都返回false
for (int i = 0; i < roomMiniInfo.GamePlaySlotList.Count; i++)
{
if (roomMiniInfo.GamePlaySlotList[i].PlayerUID == uid)
if (roomMiniInfo.GamePlaySlotList[i].PlayerUID == uid && roomMiniInfo.GamePlaySlotList[i].PlayerLocalJoyIdx == joyIdx)
{
slotIdx = (uint)i;
return true;

View File

@ -0,0 +1,39 @@
/// <summary>
/// 负责管理本地控制器与具体游戏之间的槽位分配
/// </summary>
public interface IControllerSetuper
{
/// <summary>
/// 设置本地手柄与游戏手柄槽位的映射,这个方法是一个全量更新手柄插入设置的方法
/// </summary>
void SetConnect(
uint? con0ToSlot = null,
uint? con1ToSlot = null,
uint? con2ToSlot = null,
uint? con3ToSlot = null);
/// <summary>
/// 指定手柄插槽位,获取当前槽位连接的本地手柄序号
/// </summary>
/// <param name="slotIndex"></param>
/// <returns></returns>
int? GetSlotConnectingControllerIndex(int slotIndex);
IController GetSlotConnectingController(int slotIndex);
/// <summary>
/// 获得一个空的槽位
/// </summary>
/// <returns></returns>
uint? GetFreeSlotIndex();
/// <summary>
/// 增量式的修改一个手柄和一个槽位的连接关系
/// </summary>
/// <param name="conIndex"></param>
/// <param name="slotIndex"></param>
void LetControllerConnect(int conIndex, uint slotIndex);
}
public interface IController
{
bool AnyButtonDown();
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: f567cb126b157854e9f9b2c71f8cda8e

View File

@ -1,364 +0,0 @@
using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
using static AxibugEmuOnline.Client.FilterEffect;
namespace AxibugEmuOnline.Client
{
public class FilterManager
{
private PostProcessProfile m_filterPorfile;
private List<Filter> m_filters;
private Dictionary<EnumPlatform, Filter> m_filterPlatforms = new Dictionary<EnumPlatform, Filter>();
private AlphaWraper m_previewFilterWraper;
FilterRomSetting m_filterRomSetting;
/// <summary>
/// 滤镜列表
/// </summary>
public IReadOnlyList<Filter> Filters => m_filters;
public FilterManager(PostProcessVolume filterVolume, CanvasGroup filterPreview, CanvasGroup mainBg)
{
if (filterVolume == null)
return;
m_filterPorfile = filterVolume.profile;
m_filters = m_filterPorfile.settings.Where(setting => setting is FilterEffect).Select(setting => new Filter(setting as FilterEffect)).ToList();
var json = PlayerPrefs.GetString(nameof(FilterRomSetting));
m_filterRomSetting = JsonUtility.FromJson<FilterRomSetting>(json) ?? new FilterRomSetting();
m_previewFilterWraper = new AlphaWraper(mainBg, filterPreview, false);
ShutDownFilterPreview();
ShutDownFilter();
}
/// <summary> 关闭滤镜预览 </summary>
public void ShutDownFilterPreview()
{
m_previewFilterWraper.On = false;
}
/// <summary> 开启滤镜预览 </summary>
public void EnableFilterPreview()
{
m_previewFilterWraper.On = true;
}
/// <summary>
/// 打开滤镜
/// </summary>
/// <param name="filter"></param>
public void EnableFilter(Filter filter)
{
foreach (var selfFiler in Filters)
{
if (selfFiler != filter) selfFiler.m_setting.enabled.Override(false);
else selfFiler.m_setting.enabled.Override(true);
}
}
/// <summary>
/// 关闭滤镜效果
/// </summary>
public void ShutDownFilter()
{
//关闭所有后处理效果
foreach (var setting in m_filterPorfile.settings)
setting.enabled.Override(false);
}
/// <summary>
/// 为指定rom设置滤镜以及滤镜的预设
/// </summary>
/// <param name="rom">rom对象</param>
/// <param name="filter">滤镜</param>
/// <param name="preset">滤镜预设</param>
public void SetupFilter(RomFile rom, Filter filter, FilterPreset preset)
{
m_filterRomSetting.Setup(rom, filter, preset);
string json = m_filterRomSetting.ToJson();
PlayerPrefs.SetString(nameof(FilterRomSetting), json);
}
/// <summary>
/// 获得指定rom配置的滤镜设置
/// </summary>
/// <param name="rom">rom对象</param>
/// <returns>此元组任意内任意成员都有可能为空</returns>
public GetFilterSetting_result GetFilterSetting(RomFile rom)
{
var value = m_filterRomSetting.Get(rom);
Filter filter = null;
FilterPreset preset = null;
//filter = Filters.FirstOrDefault(f => f.Name == value.filterName);
//if (filter != null)
//{
// string presetName = value.presetName;
// preset = filter.Presets.FirstOrDefault(p => p.Name == presetName);
//}
filter = Filters.FirstOrDefault(f => f.Name == value.Item1);
if (filter != null)
{
string presetName = value.Item2;
preset = filter.Presets.FirstOrDefault(p => p.Name == presetName);
}
return new GetFilterSetting_result()
{
filter = filter,
preset = preset
};
}
public struct GetFilterSetting_result
{
public Filter filter;
public FilterPreset preset;
}
public class Filter
{
public string Name => m_setting.Name;
public IReadOnlyCollection<EditableParamerter> Paramerters => m_setting.EditableParam;
/// <summary> 滤镜预设 </summary>
public List<FilterPreset> Presets = new List<FilterPreset>();
/// <summary> 滤镜默认预设 </summary>
public FilterPreset DefaultPreset = new FilterPreset("DEFAULT");
internal FilterEffect m_setting;
public Filter(FilterEffect setting)
{
m_setting = setting;
loadPresets();
}
private void loadPresets()
{
var json = PlayerPrefs.GetString($"Filter_{Name}_PresetList", string.Empty);
var loadedPresets = JsonUtility.FromJson<FilterPresetList>(json);
if (loadedPresets == null) return;
else Presets = loadedPresets.presets;
}
public void SavePresets()
{
var json = JsonUtility.ToJson(new FilterPresetList(Presets));
PlayerPrefs.SetString($"Filter_{Name}_PresetList", json);
}
public MsgBool CreatePreset(string presetName, out FilterPreset newPreset)
{
newPreset = null;
if (string.IsNullOrWhiteSpace(presetName)) return "名称不能为空";
if (Presets.Count(p => p.Name == presetName) != 0) return "名称重复";
newPreset = new FilterPreset(presetName);
Presets.Add(newPreset);
SavePresets();
return true;
}
public void RemovePreset(FilterPreset preset)
{
if (!Presets.Remove(preset)) return;
SavePresets();
EventInvoker.RaiseFilterPresetRemoved(this, preset);
}
public void ResetPreset()
{
foreach (var param in Paramerters)
{
param.ResetToDefault();
}
}
public void ApplyPreset(FilterPreset preset)
{
foreach (var param in Paramerters)
{
var value = preset.GetParamValue(param.Name, param.ValueType);
if (value == null)
param.ResetToDefault();
else
param.Apply(value);
}
}
}
[Serializable]
private class FilterPresetList
{
public List<FilterPreset> presets;
public FilterPresetList(List<FilterPreset> presets)
{
this.presets = presets;
foreach (var preset in presets)
{
preset.ReadyForJson();
}
}
}
[Serializable]
public class FilterPreset
{
[SerializeField]
public string Name;
[SerializeField]
private List<string> m_paramName = new List<string>();
[SerializeField]
private List<string> m_valueJson = new List<string>();
private bool m_cacheReady = false;
private Dictionary<string, string> m_paramName2ValueJson;
public FilterPreset(string presetName)
{
Name = presetName;
}
public void ReadyForJson()
{
prepareCache();
m_paramName = m_paramName2ValueJson.Keys.ToList();
m_valueJson = m_paramName2ValueJson.Values.ToList();
}
public string GetParamValueJson(string paramName)
{
prepareCache();
string value;
m_paramName2ValueJson.TryGetValue(paramName, out value);
return value;
}
public object GetParamValue(string paramName, Type valueType)
{
var rawStr = GetParamValueJson(paramName);
if (rawStr == null) return null;
if (valueType == typeof(float))
{
float floatVal;
float.TryParse(rawStr, out floatVal);
return floatVal;
}
else if (valueType.IsEnum)
{
var names = Enum.GetNames(valueType);
var values = Enum.GetValues(valueType);
for (int i = 0; i < names.Length; i++)
{
if (names[i].Equals(rawStr))
{
return values.GetValue(i);
}
}
return null;
}
else
{
App.log.Error($"尚未支持的滤镜参数类型{valueType}");
return null;
}
}
public void SetParamValue(string paramName, Type valueType, object value)
{
prepareCache();
m_paramName2ValueJson[paramName] = value.ToString();
}
private void prepareCache()
{
if (m_cacheReady) return;
m_paramName2ValueJson = new Dictionary<string, string>();
for (int i = 0; i < m_paramName.Count; i++)
{
m_paramName2ValueJson[m_paramName[i]] = m_valueJson[i];
}
m_cacheReady = true;
}
}
[Serializable]
public class FilterRomSetting
{
[SerializeField]
private List<int> m_romID;
[SerializeField]
private List<Item> m_items;
bool m_cacheReady = false;
Dictionary<int, Item> m_cache;
public void Setup(RomFile rom, Filter filter, FilterPreset preset)
{
prepareCache();
if (filter == null)
m_cache.Remove(rom.ID);
else
m_cache[rom.ID] = new Item { FilterName = filter.Name, PresetName = preset != null ? preset.Name : null };
}
public string ToJson()
{
prepareCache();
m_romID = m_cache.Keys.ToList();
m_items = m_cache.Values.ToList();
return JsonUtility.ToJson(this);
}
public ValueTuple<string,string> Get(RomFile rom)
{
prepareCache();
Item item;
m_cache.TryGetValue(rom.ID, out item);
return new ValueTuple<string, string>(item.FilterName, item.PresetName);
}
private void prepareCache()
{
if (m_cacheReady) return;
if (m_items == null) m_items = new List<Item>();
if (m_romID == null) m_romID = new List<int>();
m_cache = new Dictionary<int, Item>();
for (int i = 0; i < m_romID.Count && i < m_items.Count; i++)
{
m_cache[m_romID[i]] = m_items[i];
}
m_cacheReady = true;
}
[Serializable]
struct Item
{
public string FilterName;
public string PresetName;
}
}
}
}

View File

@ -2,6 +2,7 @@ using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
@ -14,7 +15,27 @@ namespace AxibugEmuOnline.Client
public delegate void GetRomListAPI(Action<Resp_GameList> callback, int page, int pageSize = 10);
public delegate void SearchRomListAPI(Action<Resp_GameList> callback, string searchKey, int page, int pageSize = 10);
public static string UrlEncode(string str)
{
StringBuilder sb = new StringBuilder();
foreach (char c in str)
{
if ((c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
c == '-' || c == '_' || c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || c == ')')
{
sb.Append(c);
}
else
{
sb.Append('%').Append(((int)c).ToString("X2"));
}
}
return sb.ToString();
}
public void GetNesRomList(Action<Resp_GameList> callback, int page, int pageSize = 10)
{
App.StartCoroutine(GetNesRomListFlow(page, pageSize, callback));
@ -26,6 +47,13 @@ namespace AxibugEmuOnline.Client
}
private IEnumerator SearchNesRomListFlow(string searchKey, int page, int pageSize, Action<Resp_GameList> callback)
{
//避免特殊字符和个别文字编码问题
byte[] gb2312Bytes = Encoding.Default.GetBytes(searchKey);
byte[] utf8Bytes = Encoding.Convert(Encoding.Default, Encoding.UTF8, gb2312Bytes);
// 将UTF-8编码的字节数组转换回字符串此时是UTF-8编码的字符串
string utf8String = Encoding.UTF8.GetString(utf8Bytes);
searchKey = UrlEncode(utf8String);
App.log.Info($"search->{utf8String} ->{searchKey}");
AxiHttpProxy.SendWebRequestProxy request = AxiHttpProxy.Get($"{WebSiteApi}/NesRomList?Page={page}&PageSize={pageSize}&SearchKey={searchKey}");
yield return request.SendWebRequest;

View File

@ -1,4 +1,4 @@
using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.ClientCore;
using AxiReplay;
using System;
using System.IO;
@ -10,6 +10,12 @@ namespace AxibugEmuOnline.Client
{
public class CoreSupporter : ISupporterImpl
{
private NesControllerMapper m_controllerMapper;
public CoreSupporter(NesControllerMapper conMapper)
{
m_controllerMapper = conMapper;
}
public Stream OpenRom(string fname)
{
try
@ -57,7 +63,6 @@ namespace AxibugEmuOnline.Client
}
public EmulatorConfig Config { get; private set; } = new EmulatorConfig();
public NesControllerMapper ControllerMapper { get; private set; } = new NesControllerMapper();
public void PrepareDirectory(string directPath)
{
Directory.CreateDirectory($"{App.PersistentDataPath}/{directPath}");
@ -116,7 +121,7 @@ namespace AxibugEmuOnline.Client
}
else m_sampledState = default(ControllerState);
var localState = ControllerMapper.CreateState();
var localState = m_controllerMapper.CreateState();
var rawData = ToNet(localState);
if (LastTestInput != rawData)
{
@ -127,15 +132,10 @@ namespace AxibugEmuOnline.Client
}
else
{
m_sampledState = ControllerMapper.CreateState();
m_sampledState = m_controllerMapper.CreateState();
}
}
public IControllerSetuper GetControllerSetuper()
{
return ControllerMapper;
}
public ControllerState FromNet(AxiReplay.ReplayStep step)
{
var temp = new ServerInputSnapShot();

View File

@ -1,4 +1,9 @@
using UnityEngine;
using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Common;
using AxibugEmuOnline.Client.Event;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using VirtualNes.Core;
namespace AxibugEmuOnline.Client
@ -17,18 +22,103 @@ namespace AxibugEmuOnline.Client
m_states[0] = m_states[1] = m_states[2] = m_states[3] = 0;
if (Controller0.ConnectSlot.HasValue) m_states[Controller0.ConnectSlot.Value] = Controller0.GetButtons();
else if (Controller0.AnyButtonDown()) Eventer.Instance.PostEvent(EEvent.OnLocalJoyDesireInvert, 0);
if (Controller1.ConnectSlot.HasValue) m_states[Controller1.ConnectSlot.Value] = Controller1.GetButtons();
else if (Controller1.AnyButtonDown()) Eventer.Instance.PostEvent(EEvent.OnLocalJoyDesireInvert, 1);
if (Controller2.ConnectSlot.HasValue) m_states[Controller2.ConnectSlot.Value] = Controller2.GetButtons();
else if (Controller2.AnyButtonDown()) Eventer.Instance.PostEvent(EEvent.OnLocalJoyDesireInvert, 2);
if (Controller3.ConnectSlot.HasValue) m_states[Controller3.ConnectSlot.Value] = Controller3.GetButtons();
else if (Controller3.AnyButtonDown()) Eventer.Instance.PostEvent(EEvent.OnLocalJoyDesireInvert, 3);
var result = new ControllerState(m_states);
return result;
}
public void SetConnect(uint? con0ToSlot = null,
uint? con1ToSlot = null,
uint? con2ToSlot = null,
uint? con3ToSlot = null)
{
Controller0.ConnectSlot = con0ToSlot;
Controller1.ConnectSlot = con1ToSlot;
Controller2.ConnectSlot = con2ToSlot;
Controller3.ConnectSlot = con3ToSlot;
}
public int? GetSlotConnectingControllerIndex(int slotIndex)
{
if (Controller0.ConnectSlot.HasValue && Controller0.ConnectSlot.Value == slotIndex) return 0;
else if (Controller1.ConnectSlot.HasValue && Controller1.ConnectSlot.Value == slotIndex) return 1;
else if (Controller2.ConnectSlot.HasValue && Controller2.ConnectSlot.Value == slotIndex) return 2;
else if (Controller3.ConnectSlot.HasValue && Controller3.ConnectSlot.Value == slotIndex) return 3;
else return null;
}
public IController GetSlotConnectingController(int slotIndex)
{
if (Controller0.ConnectSlot.HasValue && Controller0.ConnectSlot.Value == slotIndex) return Controller0;
else if (Controller1.ConnectSlot.HasValue && Controller1.ConnectSlot.Value == slotIndex) return Controller1;
else if (Controller2.ConnectSlot.HasValue && Controller2.ConnectSlot.Value == slotIndex) return Controller2;
else if (Controller3.ConnectSlot.HasValue && Controller3.ConnectSlot.Value == slotIndex) return Controller3;
else return null;
}
//static HashSet<uint> s_temp = new HashSet<uint>(4);
//低版本不能这样初始化
static HashSet<uint> s_temp = new HashSet<uint>();
public uint? GetFreeSlotIndex()
{
s_temp.Clear();
s_temp.Add(0);
s_temp.Add(1);
s_temp.Add(2);
s_temp.Add(3);
if (Controller0.ConnectSlot.HasValue) s_temp.Remove(Controller0.ConnectSlot.Value);
if (Controller1.ConnectSlot.HasValue) s_temp.Remove(Controller1.ConnectSlot.Value);
if (Controller2.ConnectSlot.HasValue) s_temp.Remove(Controller2.ConnectSlot.Value);
if (Controller3.ConnectSlot.HasValue) s_temp.Remove(Controller3.ConnectSlot.Value);
if (s_temp.Count > 0) return s_temp.First();
else return null;
}
public void LetControllerConnect(int conIndex, uint slotIndex)
{
Controller targetController;
switch (conIndex)
{
case 0: targetController = Controller0;break;
case 1: targetController = Controller1; break;
case 2: targetController = Controller2; break;
case 3: targetController = Controller3; break;
default:
throw new System.Exception($"Not Allowed conIndex Range: {conIndex}");
break;
}
//var targetController = conIndex switch
//{
// 0 => Controller0,
// 1 => Controller1,
// 2 => Controller2,
// 3 => Controller3,
// _ => throw new System.Exception($"Not Allowed conIndex Range: {conIndex}")
//};
if (targetController.ConnectSlot.HasValue) return;
targetController.ConnectSlot = slotIndex;
Eventer.Instance.PostEvent(EEvent.OnControllerConnectChanged);
}
/// <summary>
/// Nes控制器
/// </summary>
public class Controller
public class Controller : IController
{
/// <summary>
/// 控制器编号
@ -85,9 +175,30 @@ namespace AxibugEmuOnline.Client
return res;
}
public bool AnyButtonDown()
{
return
UP.IsDown ||
DOWN.IsDown ||
LEFT.IsDown ||
RIGHT.IsDown ||
A.IsDown ||
B.IsDown ||
SELECT.IsDown ||
START.IsDown ||
MIC.IsDown;
}
public static KeyListener GetKey(int controllerInput, EnumButtonType nesConBtnType)
{
string configKey = $"NES_{controllerInput}_{nesConBtnType}";
string configKey = $"NES_{controllerInput}_{nesConBtnType}";
//PSV平台固定键值
if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
{
return KeyListener.GetPSVitaKey(controllerInput, nesConBtnType);
}
if (PlayerPrefs.HasKey(configKey))
{
return new KeyListener(PlayerPrefs.GetString(configKey));
@ -115,6 +226,11 @@ namespace AxibugEmuOnline.Client
/// <summary> 按键监听器 </summary>
KeyListener m_keyListener;
/// <summary> 指示按钮是否正在按下状态 </summary>
public bool IsPressing => m_keyListener.IsPressing();
/// <summary> 指示按钮是否被按下 </summary>
public bool IsDown => m_keyListener.IsDown();
public Button(Controller controller, EnumButtonType buttonType)
{
m_hostController = controller;
@ -129,18 +245,18 @@ namespace AxibugEmuOnline.Client
/// <returns></returns>
public EnumButtonType SampleKey()
{
return m_keyListener.IsPressing() ? m_buttonType : 0;
return IsPressing ? m_buttonType : 0;
}
private void CreateListener()
{
m_keyListener = Controller.GetKey(m_hostController.ControllerIndex, m_buttonType);
}
}
//low C# readonly
//public readonly struct KeyListener
public struct KeyListener
}
//low C# readonly
//public readonly struct KeyListener
public struct KeyListener
{
private readonly KeyCode m_key;
@ -154,8 +270,8 @@ namespace AxibugEmuOnline.Client
{
m_key = KeyCode.None;
int result;
if (int.TryParse(confStr, out result))
int result;
if (int.TryParse(confStr, out result))
m_key = (KeyCode)result;
}
@ -163,6 +279,10 @@ namespace AxibugEmuOnline.Client
{
return Input.GetKey(m_key);
}
public bool IsDown()
{
return Input.GetKeyDown(m_key);
}
public override string ToString()
{
@ -173,7 +293,7 @@ namespace AxibugEmuOnline.Client
{
switch (controllerIndex)
{
case 1:
case 0:
switch (nesConBtnType)
{
case EnumButtonType.LEFT:
@ -197,7 +317,7 @@ namespace AxibugEmuOnline.Client
}
break;
case 2:
case 1:
switch (nesConBtnType)
{
case EnumButtonType.LEFT:
@ -223,19 +343,40 @@ namespace AxibugEmuOnline.Client
break;
}
return default(KeyListener);
}
public static KeyListener GetPSVitaKey(int controllerIndex, EnumButtonType nesConBtnType)
{
switch (controllerIndex)
{
case 0:
switch (nesConBtnType)
{
case EnumButtonType.LEFT:
return new KeyListener(PSVitaKey.Left);
case EnumButtonType.RIGHT:
return new KeyListener(PSVitaKey.Right);
case EnumButtonType.UP:
return new KeyListener(PSVitaKey.Up);
case EnumButtonType.DOWN:
return new KeyListener(PSVitaKey.Down);
case EnumButtonType.START:
return new KeyListener(PSVitaKey.Start);
case EnumButtonType.SELECT:
return new KeyListener(PSVitaKey.Select);
case EnumButtonType.A:
return new KeyListener(PSVitaKey.Circle);
case EnumButtonType.B:
return new KeyListener(PSVitaKey.Cross);
case EnumButtonType.MIC:
return new KeyListener(PSVitaKey.Block);
}
break;
}
return default(KeyListener);
}
}
public void SetConnect(uint? con0ToSlot = null,
uint? con1ToSlot = null,
uint? con2ToSlot = null,
uint? con3ToSlot = null)
{
Controller0.ConnectSlot = con0ToSlot;
Controller1.ConnectSlot = con1ToSlot;
Controller2.ConnectSlot = con2ToSlot;
Controller3.ConnectSlot = con3ToSlot;
}
}
}
}

View File

@ -16,12 +16,18 @@ namespace AxibugEmuOnline.Client
{
public VideoProvider VideoProvider;
public AudioProvider AudioProvider;
//模拟器核心实例化对象
public NES NesCore { get; private set; }
/// <summary> 是否暂停 </summary>
public bool IsPause { get; private set; }
public bool IsPause { get; private set; }
public NesControllerMapper ControllerMapper { get; private set; }
private void Awake()
{
ControllerMapper = new NesControllerMapper();
}
private void Start()
{
@ -38,9 +44,7 @@ namespace AxibugEmuOnline.Client
/// </summary>
private unsafe void Update()
{
if (IsPause) return;
if (NesCore != null)
if (NesCore != null && !IsPause)
{
PushEmulatorFrame();
if (InGameUI.Instance.IsNetPlay)
@ -49,10 +53,12 @@ namespace AxibugEmuOnline.Client
var screenBuffer = NesCore.ppu.GetScreenPtr();
VideoProvider.SetDrawData(screenBuffer);
}
VideoProvider.ApplyFilterEffect();
}
public EnumPlatform Platform => EnumPlatform.NES;
private CoreSupporter m_coreSupporter;
/// <summary>
/// 指定ROM开始游戏
/// </summary>
@ -60,7 +66,8 @@ namespace AxibugEmuOnline.Client
{
StopGame();
Supporter.Setup(new CoreSupporter());
m_coreSupporter = new CoreSupporter(ControllerMapper);
Supporter.Setup(m_coreSupporter);
Debuger.Setup(new CoreDebuger());
App.nesRomLib.AddRomFile(rom);
@ -140,7 +147,7 @@ namespace AxibugEmuOnline.Client
NesCore = null;
}
#if UNITY_EDITOR
private ControllerState m_lastState;
#endif
@ -158,8 +165,8 @@ namespace AxibugEmuOnline.Client
//推进帧
private bool PushEmulatorFrame()
{
Supporter.SampleInput(NesCore.FrameCount);
var controlState = Supporter.GetControllerState();
m_coreSupporter.SampleInput(NesCore.FrameCount);
var controlState = m_coreSupporter.GetControllerState();
//如果未收到Input数据,核心帧不推进
if (!controlState.valid) return false;
@ -204,8 +211,11 @@ namespace AxibugEmuOnline.Client
EditorUtility.SetDirty(db);
AssetDatabase.SaveAssets();
}
#endif
public IControllerSetuper GetControllerSetuper()
{
return ControllerMapper;
}
#endif
}
}

View File

@ -2,19 +2,24 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: NesEmulator_Screen
m_Shader: {fileID: 4800000, guid: b351396ff606116478d7f4412abe4e2e, type: 3}
m_ShaderKeywords:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
@ -58,6 +63,7 @@ Material:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
@ -85,3 +91,5 @@ Material:
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@ -102,10 +102,10 @@
{
float2 mapUV = IN.texcoord;
float start= 8.0/272.0;
float end = (272.0-8.0)/272.0;
float start= 0.02941535;
float end = 0.970582;
mapUV.x = lerp(start,end, mapUV.x);
//uv映射改为ugui BaseMeshEffect 机制实现uv映射,比shader代码更为平滑
half4 color = tex2D(_MainTex,mapUV);

View File

@ -27,7 +27,7 @@ namespace AxibugEmuOnline.Client
}
// スキャンラインカラー
private static int m_nScanlineColor => Supporter.Config.graphics.nScanlineColor;
private static int m_nScanlineColor => 75; //patternViewer调试器用的,参照EmulatorConfig.graphics.nScanlineColor的值
public static float[][] PalConvTbl = new float[8][]
{

View File

@ -1,3 +1,4 @@
using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Runtime.InteropServices;
using UnityEngine;
@ -14,26 +15,27 @@ namespace AxibugEmuOnline.Client
public RawImage Image;
#endregion
#region GPU_TURBO
//图像数据字节数
//图像数据字节数
private int TexBufferSize_gpu;
//图像数据指针
//图像数据指针
private IntPtr wrapTexBufferPointer_gpu;
//Unity 2D纹理对象,用于UI上绘制最终输出画面
//Unity 2D纹理对象,用于UI上绘制最终输出画面
private Texture2D wrapTex_gpu;
//nes调色板数据,已转换为unity纹理对象
//nes调色板数据,已转换为unity纹理对象
private Texture2D pPal_gpu;
[SerializeField]
private Material GPUTurboMat_gpu;
private RenderTexture rt_gpu;
#endregion
#region CPU
//图像数据字节数
//图像数据字节数
private int TexBufferSize_cpu;
//图像数据指针
//图像数据指针
private GCHandle wrapTexBufferGH;
private IntPtr wrapTexBufferPointer_cpu;
//Unity 2D纹理对象,用于UI上绘制最终输出画面
//Unity 2D纹理对象,用于UI上绘制最终输出画面
private Texture2D wrapTex_cpu;
#endregion
@ -42,25 +44,31 @@ namespace AxibugEmuOnline.Client
private void Awake()
{
DrawCanvas.worldCamera = Camera.main;
GPUTurboMat_gpu = Image.material;
}
private void OnDestroy()
{
if (wrapTexBufferGH.IsAllocated)
wrapTexBufferGH.Free();
if (rt_gpu != null)
{
RenderTexture.ReleaseTemporary(rt_gpu);
rt_gpu = null;
}
}
public unsafe void SetDrawData(uint* screenData)
{
PrepareUI(screenData);
if (GPUTurbo) PrepareForGPU(screenData);//判断使用GPU还是CPU
else PrepareForCPU(screenData);//使用CPU
if (GPUTurbo) PrepareForGPU(screenData);//判断使用GPU还是CPU
else PrepareForCPU(screenData);//使用CPU
if (GPUTurbo)
{
wrapTex_gpu.LoadRawTextureData(wrapTexBufferPointer_gpu, TexBufferSize_gpu);
wrapTex_gpu.Apply();
Graphics.Blit(wrapTex_gpu, rt_gpu, GPUTurboMat_gpu);
}
else
{
@ -69,27 +77,32 @@ namespace AxibugEmuOnline.Client
}
}
public void ApplyFilterEffect()
{
Image.texture = App.filter.ExecuteFilterRender(rt_gpu);
}
private unsafe void PrepareUI(uint* screenData)
{
if (GPUTurbo)
{
if (Image.material != GPUTurboMat_gpu) Image.material = GPUTurboMat_gpu;
if (wrapTex_gpu == null)
{
wrapTex_gpu = new Texture2D(PPU.SCREEN_WIDTH, PPU.SCREEN_HEIGHT, TextureFormat.RGBA32, false);
wrapTex_gpu.filterMode = FilterMode.Point;
wrapTexBufferPointer_gpu = (IntPtr)screenData;
rt_gpu = RenderTexture.GetTemporary(256, wrapTex_gpu.height, 0);
rt_gpu.filterMode = FilterMode.Point;
rt_gpu.anisoLevel = 0;
rt_gpu.antiAliasing = 1;
TexBufferSize_gpu = wrapTex_gpu.width * wrapTex_gpu.height * 4;
}
if (Image.texture != wrapTex_gpu) Image.texture = wrapTex_gpu;
if (Image.texture != rt_gpu) Image.texture = rt_gpu;
}
else
{
if (Image.material == GPUTurboMat_gpu) Image.material = null;
if (wrapTex_cpu == null)
{
wrapTex_cpu = new Texture2D(PPU.SCREEN_WIDTH - 16, PPU.SCREEN_HEIGHT, TextureFormat.RGBA32, false);
@ -103,6 +116,7 @@ namespace AxibugEmuOnline.Client
}
if (Image.texture != wrapTex_cpu) Image.texture = wrapTex_cpu;
}
}
private unsafe void PrepareForGPU(uint* screenData)
@ -141,7 +155,7 @@ namespace AxibugEmuOnline.Client
for (int line = 0; line < PPU.SCREEN_HEIGHT; line++)
{
//PS如果是CPU计算宽度减少16的不必要部分才能对齐
//PS如果是CPU计算宽度减少16的不必要部分才能对齐
width = PPU.SCREEN_WIDTH - 16;
while (width > 0)
@ -149,17 +163,17 @@ namespace AxibugEmuOnline.Client
var edx = screenData[pScn + 8];
uint index = edx & 0xFF;
//按下标颜色查找表中真实颜色
//按下标颜色查找表中真实颜色
var colorData = palRaw[index];
//dst中颜色排列为abgr,而colorData排列为argb
uint r = (colorData & 0x00FF0000) >> 16; // 提取Red通道
uint g = (colorData & 0x0000FF00) >> 8; // 提取Green通道
uint b = (colorData & 0x000000FF); // 提取Blue通道
//dst中颜色排列为abgr,而colorData排列为argb
uint r = (colorData & 0x00FF0000) >> 16; // 提取Red通道
uint g = (colorData & 0x0000FF00) >> 8; // 提取Green通道
uint b = (colorData & 0x000000FF); // 提取Blue通道
//用rgb构建颜色对象如果非unity 可以用这个rgb 构建System.Drawing.Color 单个颜色对象)
//用rgb构建颜色对象如果非unity 可以用这个rgb 构建System.Drawing.Color 单个颜色对象)
uint abgr = 0xFF000000 | (b << 16) | (g << 8) | (r << 0);
//放进颜色矩阵
//放进颜色矩阵
Dst[pDst] = abgr;
pScn += 1;

View File

@ -1,6 +1,7 @@
using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event;
using AxibugProtobuf;
using HaoYueNet.ClientNetworkNet.Standard2;
using HaoYueNet.ClientNetwork;
using System;
using System.Net.Sockets;
using System.Threading;
@ -99,6 +100,7 @@ namespace AxibugEmuOnline.Client.Network
public void OnConnectClose()
{
NetworkDeBugLog("OnConnectClose");
Eventer.Instance.PostEvent(EEvent.OnLossLoginState);
App.user.LoginOutData();

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 13795c31ef56b3648a06122c6b1864f3
guid: 4a4a14412f1bcc844bbd2c9bccf50db2
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -0,0 +1,63 @@
using System;
using UnityEngine;
public class SonyVitaCommonDialog : MonoBehaviour
{
static Action<string> resultAct = null;
void Awake()
{
#if UNITY_PSP2
Sony.Vita.Dialog.Ime.OnGotIMEDialogResult += OnGotIMEDialogResult;
Sony.Vita.Dialog.Main.Initialise();
#endif
}
public void ShowPSVitaIME(Action<string> callback, string placeHolder, string defaultText)
{
#if UNITY_PSP2
resultAct = callback;
Sony.Vita.Dialog.Ime.ImeDialogParams info = new Sony.Vita.Dialog.Ime.ImeDialogParams();
// Set supported languages, 'or' flags together or set to 0 to support all languages.
info.supportedLanguages = Sony.Vita.Dialog.Ime.FlagsSupportedLanguages.LANGUAGE_SIMPLIFIED_CHINESE |
Sony.Vita.Dialog.Ime.FlagsSupportedLanguages.LANGUAGE_JAPANESE |
Sony.Vita.Dialog.Ime.FlagsSupportedLanguages.LANGUAGE_ENGLISH_GB |
Sony.Vita.Dialog.Ime.FlagsSupportedLanguages.LANGUAGE_TRADITIONAL_CHINESE;
info.languagesForced = true;
info.type = Sony.Vita.Dialog.Ime.EnumImeDialogType.TYPE_DEFAULT;
info.option = 0;
info.canCancel = true;
info.textBoxMode = Sony.Vita.Dialog.Ime.FlagsTextBoxMode.TEXTBOX_MODE_WITH_CLEAR;
info.enterLabel = Sony.Vita.Dialog.Ime.EnumImeDialogEnterLabel.ENTER_LABEL_DEFAULT;
info.maxTextLength = 128;
info.title = placeHolder;
info.initialText = defaultText;
Sony.Vita.Dialog.Ime.Open(info);
#endif
}
#if UNITY_PSP2
void OnGotIMEDialogResult(Sony.Vita.Dialog.Messages.PluginMessage msg)
{
Sony.Vita.Dialog.Ime.ImeDialogResult result = Sony.Vita.Dialog.Ime.GetResult();
Debug.Log("IME result: " + result.result);
Debug.Log("IME button: " + result.button);
Debug.Log("IME text: " + result.text);
if (result.result == Sony.Vita.Dialog.Ime.EnumImeDialogResult.RESULT_OK)
{
resultAct.Invoke(result.text);
resultAct = null;
}
}
#endif
#if UNITY_PSP2
void Update ()
{
Sony.Vita.Dialog.Main.Update();
}
#endif
}

View File

@ -1,11 +1,8 @@
fileFormatVersion: 2
guid: 5354e2e13dbff91438a04b9de2351645
guid: 7bc72e9d59cc9134d8855521049ad788
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -66,7 +66,7 @@ namespace AxibugEmuOnline.Client
SetBaseInfo(m_romfile.Alias, m_romfile.Descript, m_romfile.GameTypeDes);
App.CacheMgr.GetSpriteCache(m_romfile.ImageURL, (img, url) =>
{
if (url != m_romfile.ImageURL) return;
if (!m_romfile.InfoReady || url != m_romfile.ImageURL) return;
m_romImage.sprite = img;
});

View File

@ -2,6 +2,7 @@
using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event;
using AxibugProtobuf;
using VirtualNes.Core;
namespace AxibugEmuOnline.Client
{
@ -111,7 +112,19 @@ namespace AxibugEmuOnline.Client
private void OnRoomCreated()
{
m_delayCreateRoom = false;
if (m_delayCreateRoom)
{
m_delayCreateRoom = false;
//延迟创建房间成功后,同步本地手柄连接状态
Dictionary<uint, uint> temp = new Dictionary<uint, uint>();
var setuper = App.emu.Core.GetControllerSetuper();
for (int i = 0; i < 4; i++)
{
var joyIndex = setuper.GetSlotConnectingControllerIndex(i);
if (joyIndex != null) temp[(uint)i] = (uint)joyIndex.Value;
}
App.roomMgr.SendChangePlaySlotIdxWithJoyIdx(temp);
}
}
private void OnLoggedIn()

View File

@ -1,3 +1,4 @@
using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections.Generic;
using UnityEngine;
@ -20,11 +21,13 @@ namespace AxibugEmuOnline.Client
m_InputUI.gameObject.SetActive(false);
}
public static InputUI Input(Action<string> callback, string placeHolder, string defaultText)
public static void Input(Action<string> callback, string placeHolder, string defaultText)
{
#if UNITY_PSP2 && !UNITY_EDITOR
App.sonyVitaCommonDialog.ShowPSVitaIME(callback, placeHolder, defaultText);
#else
s_ins.m_InputUI.Show(new ValueTuple<Action<string>, string, string>(callback, placeHolder, defaultText));
return s_ins.m_InputUI;
#endif
}
public static void PopSideBar<T>(List<T> menus, int defaultIndex = 0, Action onClose = null) where T : OptionMenu

View File

@ -3,142 +3,143 @@ using AxibugEmuOnline.Client.Event;
using AxibugEmuOnline.Client.Manager;
using AxibugEmuOnline.Client.UI;
using AxibugProtobuf;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Debug = System.Diagnostics.Debug;
namespace AxibugEmuOnline.Client
{
public class RoomItem : MenuItem, IVirtualItem
{
[SerializeField] Image m_roomPreview;
[SerializeField] Slider m_downloadProgress;
[SerializeField] GameObject m_downloadingFlag;
[SerializeField] GameObject m_romReadyFlag;
private RomFile m_romFile;
public int Index { get; set; }
public int RoomID { get; private set; }
protected override void Awake()
{
base.Awake();
Eventer.Instance.RegisterEvent<int>(EEvent.OnRoomListSingleUpdate, OnRoomSignelUpdate);
}
private void OnRoomSignelUpdate(int roomID)
{
if (this.RoomID != roomID) return;
Protobuf_Room_MiniInfo roomInfo;
if (App.roomMgr.GetRoomListMiniInfo(roomID, out roomInfo))
UpdateUI(roomInfo);
}
public void SetData(object data)
{
Debug.Assert(data is Protobuf_Room_MiniInfo);
var roomInfo = (Protobuf_Room_MiniInfo)data;
RoomID = roomInfo.RoomID;
UpdateUI(roomInfo);
}
public override bool OnEnterItem()
{
if (m_romFile == null) return false;
if (!m_romFile.RomReady)
{
m_romFile.BeginDownload();
return false;
}
else
{
Protobuf_Room_MiniInfo MiniInfo;
if (!App.roomMgr.GetRoomListMiniInfo(RoomID, out MiniInfo))
{
OverlayManager.PopTip("房间不存在");
return false;
}
int[] freeSlots;
if (!MiniInfo.GetFreeSlot(out freeSlots))
{
OverlayManager.PopTip("无空闲位置");
return false;
}
App.roomMgr.SendJoinRoom(RoomID);
return true;
}
}
private void UpdateUI(Protobuf_Room_MiniInfo roomInfo)
{
var hostNick = roomInfo.GetHostNickName();
int cur; int max;
roomInfo.GetRoomPlayers(out cur, out max);
SetBaseInfo("--", $"<b>{hostNick}</b>的房间", $"{cur}/{max}");
SetIcon(null);
roomInfo.FetchRomFileInRoomInfo(EnumPlatform.NES, (room, romFile) =>
{
if (room.RoomID != RoomID) return;
m_romFile = romFile;
Txt.text = romFile.Alias;
UpdateRomInfoView();
App.CacheMgr.GetSpriteCache(romFile.ImageURL, OnGetRomImage);
});
}
protected override void Update()
{
UpdateRomInfoView();
base.Update();
}
private void UpdateRomInfoView()
{
float? downloadingProgress = null;
bool romReady = false;
if (m_romFile != null)
{
if (m_romFile.IsDownloading)
downloadingProgress = m_romFile.Progress;
if (m_romFile.RomReady)
romReady = true;
}
m_downloadingFlag.SetActiveEx(downloadingProgress.HasValue);
if (downloadingProgress.HasValue)
m_downloadProgress.value = downloadingProgress.Value;
m_romReadyFlag.SetActiveEx(romReady);
}
private void OnGetRomImage(Sprite sprite, string url)
{
if (m_romFile == null) return;
if (m_romFile.ImageURL != url) return;
SetIcon(sprite);
}
public void SetDependencyProperty(object data)
{
SetSelectState((data is ThirdMenuRoot && ((ThirdMenuRoot)data).SelectIndex == Index));
}
public void Release()
{
Reset();
}
}
{
public class RoomItem : MenuItem, IVirtualItem
{
[SerializeField] Image m_roomPreview;
[SerializeField] Slider m_downloadProgress;
[SerializeField] GameObject m_downloadingFlag;
[SerializeField] GameObject m_romReadyFlag;
private RomFile m_romFile;
public int Index { get; set; }
public int RoomID { get; private set; }
protected override void Awake()
{
base.Awake();
Eventer.Instance.RegisterEvent<int>(EEvent.OnRoomListSingleUpdate, OnRoomSignelUpdate);
}
private void OnRoomSignelUpdate(int roomID)
{
if (this.RoomID != roomID) return;
Protobuf_Room_MiniInfo roomInfo;
if (App.roomMgr.GetRoomListMiniInfo(roomID, out roomInfo))
UpdateUI(roomInfo);
}
public void SetData(object data)
{
Debug.Assert(data is Protobuf_Room_MiniInfo);
var roomInfo = (Protobuf_Room_MiniInfo)data;
RoomID = roomInfo.RoomID;
UpdateUI(roomInfo);
}
public override bool OnEnterItem()
{
if (m_romFile == null) return false;
if (!m_romFile.RomReady)
{
m_romFile.BeginDownload();
return false;
}
else
{
Protobuf_Room_MiniInfo MiniInfo;
if (!App.roomMgr.GetRoomListMiniInfo(RoomID, out MiniInfo))
{
OverlayManager.PopTip("房间不存在");
return false;
}
List<int> freeSlots = new List<int>();
if (!MiniInfo.GetFreeSlot(ref freeSlots))
{
OverlayManager.PopTip("无空闲位置");
return false;
}
App.roomMgr.SendJoinRoom(RoomID);
return true;
}
}
private void UpdateUI(Protobuf_Room_MiniInfo roomInfo)
{
var hostNick = roomInfo.GetHostNickName();
int cur; int max;
roomInfo.GetRoomPlayers(out cur, out max);
SetBaseInfo("--", $"<b>{hostNick}</b>的房间", $"{cur}/{max}");
SetIcon(null);
roomInfo.FetchRomFileInRoomInfo(EnumPlatform.NES, (room, romFile) =>
{
if (room.RoomID != RoomID) return;
m_romFile = romFile;
Txt.text = romFile.Alias;
UpdateRomInfoView();
App.CacheMgr.GetSpriteCache(romFile.ImageURL, OnGetRomImage);
});
}
protected override void Update()
{
UpdateRomInfoView();
base.Update();
}
private void UpdateRomInfoView()
{
float? downloadingProgress = null;
bool romReady = false;
if (m_romFile != null)
{
if (m_romFile.IsDownloading)
downloadingProgress = m_romFile.Progress;
if (m_romFile.RomReady)
romReady = true;
}
m_downloadingFlag.SetActiveEx(downloadingProgress.HasValue);
if (downloadingProgress.HasValue)
m_downloadProgress.value = downloadingProgress.Value;
m_romReadyFlag.SetActiveEx(romReady);
}
private void OnGetRomImage(Sprite sprite, string url)
{
if (m_romFile == null) return;
if (m_romFile.ImageURL != url) return;
SetIcon(sprite);
}
public void SetDependencyProperty(object data)
{
SetSelectState((data is ThirdMenuRoot && ((ThirdMenuRoot)data).SelectIndex == Index));
}
public void Release()
{
Reset();
}
}
}

View File

@ -0,0 +1,139 @@
using AxibugEmuOnline.Client;
using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event;
using DG.Tweening;
using System;
using UnityEngine;
using UnityEngine.UI;
using VirtualNes.Core;
public class ControllerInfo : MonoBehaviour
{
[Header("手柄槽位序号[0,3]")]
[SerializeField]
int m_slotIndex;
[SerializeField]
GameObject m_connectInfoNode;
[SerializeField]
Image m_indexIcon;
[SerializeField]
Text m_playerName;
private bool m_islocal;
public int SlotIndex
{
get => m_slotIndex;
set
{
if (m_slotIndex == value) return;
m_slotIndex = value;
UpdateIndexIcon();
}
}
private void Awake()
{
UpdateIndexIcon();
}
private void OnEnable()
{
Eventer.Instance.RegisterEvent(EEvent.OnMineJoinRoom, OnJoinRoom);
Eventer.Instance.RegisterEvent(EEvent.OnMineRoomCreated, OnMineRoomCreated);
Eventer.Instance.RegisterEvent(EEvent.OnMineLeavnRoom, OnLeaveRoom);
Eventer.Instance.RegisterEvent(EEvent.OnLoginSucceed, OnLoginSuccess);
Eventer.Instance.RegisterEvent(EEvent.OnLossLoginState, OnLossLoginState);
Eventer.Instance.RegisterEvent(EEvent.OnControllerConnectChanged, OnControlConnectChanged);
UpdateConnectInfo();
}
private void OnDisable()
{
Eventer.Instance.UnregisterEvent(EEvent.OnMineJoinRoom, OnJoinRoom);
Eventer.Instance.UnregisterEvent(EEvent.OnMineRoomCreated, OnMineRoomCreated);
Eventer.Instance.UnregisterEvent(EEvent.OnMineLeavnRoom, OnLeaveRoom);
Eventer.Instance.UnregisterEvent(EEvent.OnLoginSucceed, OnLoginSuccess);
Eventer.Instance.UnregisterEvent(EEvent.OnLossLoginState, OnLossLoginState);
Eventer.Instance.UnregisterEvent(EEvent.OnControllerConnectChanged, OnControlConnectChanged);
}
private void Update()
{
if (m_islocal)
{
var controller = App.emu.Core.GetControllerSetuper().GetSlotConnectingController(m_slotIndex);
if (controller == null) return;
if (!controller.AnyButtonDown()) return;
m_indexIcon.rectTransform.DOShakePosition(0.1f);
}
}
private void OnMineRoomCreated() => UpdateConnectInfo();
private void OnJoinRoom() => UpdateConnectInfo();
private void OnLeaveRoom() => UpdateConnectInfo();
private void OnLoginSuccess() => UpdateConnectInfo();
private void OnLossLoginState() => UpdateConnectInfo();
private void OnControlConnectChanged() => UpdateConnectInfo();
private void UpdateConnectInfo()
{
if (App.roomMgr.InRoom)
{
var slotInfo = App.roomMgr.mineRoomMiniInfo.GamePlaySlotList[SlotIndex];
if (slotInfo.PlayerUID <= 0)
SetDisconnect();
else
UpdateStateView(App.user.userdata.UID == slotInfo.PlayerUID, slotInfo.PlayerNickName, slotInfo.PlayerLocalJoyIdx);
}
else
{
if (App.emu.Core.IsNull())
{
SetDisconnect();
return;
}
var connecter = App.emu.Core.GetControllerSetuper();
var localControlIndex = connecter.GetSlotConnectingControllerIndex(SlotIndex);
if (localControlIndex == null)
SetDisconnect();
else
{
if (App.user.IsLoggedIn)
UpdateStateView(true, App.user.userdata.NickName, localControlIndex.Value);
else
UpdateStateView(true, "Player", localControlIndex.Value);
}
}
}
private void UpdateStateView(bool isLocal, string playerName, int slotIndex)
{
m_islocal = isLocal;
m_connectInfoNode.SetActiveEx(true);
m_playerName.text = playerName;
}
private void SetDisconnect()
{
m_connectInfoNode.SetActiveEx(false);
m_playerName.text = null;
m_islocal = false;
}
private void UpdateIndexIcon()
{
switch (SlotIndex)
{
case 0: m_indexIcon.sprite = Resources.Load<Sprite>("UIImage/JoyImg/P1"); break;
case 1: m_indexIcon.sprite = Resources.Load<Sprite>("UIImage/JoyImg/P2"); break;
case 2: m_indexIcon.sprite = Resources.Load<Sprite>("UIImage/JoyImg/P3"); break;
case 3: m_indexIcon.sprite = Resources.Load<Sprite>("UIImage/JoyImg/P4"); break;
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 1bfe4359a48b5c349b439e88eb53b8b1

View File

@ -0,0 +1,45 @@
using AxibugEmuOnline.Client;
using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event;
using AxibugEmuOnline.Client.Manager;
using System;
using System.Collections.Generic;
using UnityEngine;
using VirtualNes.Core;
public class ControllerInfoPanel : MonoBehaviour
{
private void OnEnable()
{
Eventer.Instance.RegisterEvent<int>(EEvent.OnLocalJoyDesireInvert, OnLocalJoyDesireInvert);
}
private void OnDisable()
{
Eventer.Instance.UnregisterEvent<int>(EEvent.OnLocalJoyDesireInvert, OnLocalJoyDesireInvert);
}
static List<int> s_freeSlots = new List<int>(4);
private void OnLocalJoyDesireInvert(int joyIndex)
{
if (App.roomMgr.InRoom)
{
if (!App.roomMgr.mineRoomMiniInfo.GetFreeSlot(ref s_freeSlots)) return;
//找到第一个空闲手柄插槽
var freeSlotIndex = s_freeSlots[0];
App.roomMgr.SendChangePlaySlotIdxWithJoyIdx((uint)joyIndex, (uint)freeSlotIndex);
}
else //不在房间中,直接设置
{
if (App.emu.Core.IsNull()) return;
var setuper = App.emu.Core.GetControllerSetuper();
if (setuper == null) return;
var freeSlotIndex = setuper.GetFreeSlotIndex();
if (freeSlotIndex == null) return;
setuper.LetControllerConnect(joyIndex, freeSlotIndex.Value);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 909a5b71ba48a9c46a57d43017072837

View File

@ -1,4 +1,4 @@
using AxibugEmuOnline.Client;
using AxibugEmuOnline.Client;
using AxibugEmuOnline.Client.ClientCore;
using System;
using UnityEngine;
@ -14,6 +14,7 @@ public class XMBInfoBar : MonoBehaviour
public Text DelayValue;
public Text OnlinePlayerCount;
public Text FPS;
public GameObject ControlSlotInfoNode;
void OnEnable()
{
@ -21,6 +22,11 @@ public class XMBInfoBar : MonoBehaviour
RefreshAll();
}
private void Update()
{
ControlSlotInfoNode.SetActiveEx(!App.emu.Core.IsNull());
}
void OnDisable()
{
TickLoop.LoopAction_1s -= RefreshAll;
@ -32,31 +38,31 @@ public class XMBInfoBar : MonoBehaviour
RefreshPower();
RefreshDelay();
RefreshFps();
}
/// <summary>
/// (uint lastFrame, float lastTime)
/// </summary>
ValueTuple<uint,float> m_lastFrameInfo;
}
/// <summary>
/// (uint lastFrame, float lastTime)
/// </summary>
ValueTuple<uint, float> m_lastFrameInfo;
private void RefreshFps()
{
if (App.emu.Core.IsNull())
FPS.gameObject.SetActiveEx(false);
else
{
FPS.gameObject.SetActiveEx(true);
//var gap = App.emu.Core.Frame - m_lastFrameInfo.lastFrame;
//var time = Time.realtimeSinceStartup - m_lastFrameInfo.lastTime;
var gap = App.emu.Core.Frame - m_lastFrameInfo.Item1;
var time = Time.realtimeSinceStartup - m_lastFrameInfo.Item2;
var fps = gap / time;
FPS.text = $"FPS:{fps:.#}";
//m_lastFrameInfo.lastFrame = App.emu.Core.Frame;
//m_lastFrameInfo.lastTime = Time.realtimeSinceStartup;
m_lastFrameInfo.Item1 = App.emu.Core.Frame;
m_lastFrameInfo.Item2 = Time.realtimeSinceStartup;
}
FPS.gameObject.SetActiveEx(true);
//var gap = App.emu.Core.Frame - m_lastFrameInfo.lastFrame;
//var time = Time.realtimeSinceStartup - m_lastFrameInfo.lastTime;
var gap = App.emu.Core.Frame - m_lastFrameInfo.Item1;
var time = Time.realtimeSinceStartup - m_lastFrameInfo.Item2;
var fps = gap / time;
FPS.text = $"FPS:{fps:.#}";
//m_lastFrameInfo.lastFrame = App.emu.Core.Frame;
//m_lastFrameInfo.lastTime = Time.realtimeSinceStartup;
m_lastFrameInfo.Item1 = App.emu.Core.Frame;
m_lastFrameInfo.Item2 = Time.realtimeSinceStartup;
}
}
private void RefreshDelay()

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: fc7102c34a9fa4148b4aa74d54e82b1f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: ac852e7a0b9604940b0f7e0180fd2707
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 41cd7684d8de61f4499c3aa27a6c5b3a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 50dfce75937af2a44bafd221a0163501
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 091b4306faaa8fc4084836c5237b76c8
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: a5222bc76eba99e4c9fc92b70f4103bc
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 7abf09a3e3fd84648852e5d972dfd260
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 0fcf57d6e248ead4a874daa51181ec5f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -73,7 +73,7 @@ namespace VirtualNes.Core
public void Process(ISoundDataBuffer lpBuffer, uint dwSize)
{
int nBits = Supporter.Config.sound.nBits;
int nBits = Supporter.S.Config.sound.nBits;
uint dwLength = (uint)(dwSize / (nBits / 8));
int output;
QUEUEDATA q = new QUEUEDATA();
@ -82,11 +82,11 @@ namespace VirtualNes.Core
var pSoundBuf = m_SoundBuffer;
int nCcount = 0;
int nFilterType = Supporter.Config.sound.nFilterType;
int nFilterType = Supporter.S.Config.sound.nFilterType;
if (!Supporter.Config.sound.bEnable)
if (!Supporter.S.Config.sound.bEnable)
{
byte empty = (byte)(Supporter.Config.sound.nRate == 8 ? 128 : 0);
byte empty = (byte)(Supporter.S.Config.sound.nRate == 8 ? 128 : 0);
for (int i = 0; i < dwSize; i++)
lpBuffer.WriteByte(empty);
return;
@ -108,7 +108,7 @@ namespace VirtualNes.Core
MemoryUtility.ZEROMEMORY(vol, vol.Length);
var bMute = m_bMute;
var nVolume = Supporter.Config.sound.nVolume;
var nVolume = Supporter.S.Config.sound.nVolume;
int nMasterVolume = bMute[0] ? nVolume[0] : 0;
@ -151,7 +151,7 @@ namespace VirtualNes.Core
vol[23] = (int)(bMute[8] ? (FME7_VOL * nVolume[11] * nMasterVolume) / (100 * 100) : 0);
// double cycle_rate = ((double)FRAME_CYCLES*60.0/12.0)/(double)Config.sound.nRate;
double cycle_rate = (nes.nescfg.FrameCycles * 60.0 / 12.0) / Supporter.Config.sound.nRate;
double cycle_rate = (nes.nescfg.FrameCycles * 60.0 / 12.0) / Supporter.S.Config.sound.nRate;
// CPUサイクル数がループしてしまった時の対策処理
if (elapsed_time > nes.cpu.GetTotalCycles())
@ -253,7 +253,7 @@ namespace VirtualNes.Core
// DC成分のカット(HPF TEST)
{
// static double cutoff = (2.0*3.141592653579*40.0/44100.0);
double cutoff = cutofftemp / Supporter.Config.sound.nRate;
double cutoff = cutofftemp / Supporter.S.Config.sound.nRate;
double @in, @out;
@in = output;
@ -436,7 +436,7 @@ namespace VirtualNes.Core
public void SoundSetup()
{
float fClock = nes.nescfg.CpuClock;
int nRate = Supporter.Config.sound.nRate;
int nRate = Supporter.S.Config.sound.nRate;
@internal.Setup(fClock, nRate);
vrc6.Setup(fClock, nRate);
@ -460,7 +460,7 @@ namespace VirtualNes.Core
elapsed_time = 0;
float fClock = nes.nescfg.CpuClock;
int nRate = Supporter.Config.sound.nRate;
int nRate = Supporter.S.Config.sound.nRate;
@internal.Reset(fClock, nRate);
vrc6.Reset(fClock, nRate);

View File

@ -1,4 +1,4 @@

using System;
namespace VirtualNes.Core
@ -184,15 +184,15 @@ namespace VirtualNes.Core
Setup(fClock, nRate);
// $4011反場ヽ趙仄卅中
// $4011は初期化しない
ushort addr;
for (addr = 0x4000; addr <= 0x4010; addr++)
{
Write(addr, 0x00);
SyncWrite(addr, 0x00);
}
// Write( 0x4001, 0x08 ); // Reset媆反inc乒奈玉卞卅月?
// Write( 0x4005, 0x08 ); // Reset媆反inc乒奈玉卞卅月?
// Write( 0x4001, 0x08 ); // Reset時はincモードになる?
// Write( 0x4005, 0x08 ); // Reset時はincモードになる?
Write(0x4012, 0x00);
Write(0x4013, 0x00);
Write(0x4015, 0x00);
@ -200,7 +200,7 @@ namespace VirtualNes.Core
SyncWrite(0x4013, 0x00);
SyncWrite(0x4015, 0x00);
// $4017反𤩸五煋心匹場ヽ趙仄卅中(場ヽ乒奈玉互0匹丐月及毛ヽ渾仄凶末白玄互丐月鮋)
// $4017は書き込みで初期化しない(初期モードが0であるのを期待したソフトがある為)
FrameIRQ = 0xC0;
FrameCycle = 0;
FrameIRQoccur = 0;
@ -301,7 +301,7 @@ namespace VirtualNes.Core
case 0x4017:
break;
// VirtuaNES嘐衄禾奈玄
// VirtuaNES固有ポート
case 0x4018:
UpdateRectangle(ch0, data);
UpdateRectangle(ch1, data);
@ -635,7 +635,7 @@ namespace VirtualNes.Core
}
}
// 奶件民平堪中皿民用奶朮市永玄(TEST)
// インチキ臭いプチノイズカット(TEST)
ch4.dpcm_output_real = ((ch4.reg[1] & 0x01) + ch4.dpcm_value * 2) - 0x40;
if (Math.Abs(ch4.dpcm_output_real - ch4.dpcm_output_fake) <= 8)
{
@ -712,7 +712,7 @@ namespace VirtualNes.Core
private int RenderTriangle()
{
int vol;
if (Supporter.Config.sound.bDisableVolumeEffect)
if (Supporter.S.Config.sound.bDisableVolumeEffect)
{
vol = 256;
}
@ -731,7 +731,7 @@ namespace VirtualNes.Core
return ch2.nowvolume * vol / 256;
}
if (!(Supporter.Config.sound.bChangeTone && ChannelTone[2, 0] != 0))
if (!(Supporter.S.Config.sound.bChangeTone && ChannelTone[2, 0] != 0))
{
ch2.phaseacc -= cycle_rate;
if (ch2.phaseacc >= 0)
@ -756,7 +756,7 @@ namespace VirtualNes.Core
return ch2.nowvolume * vol / 256;
}
// 樓笭ⅸ歙
// 加重平均
int num_times, total;
num_times = total = 0;
while (ch2.phaseacc < 0)
@ -799,7 +799,7 @@ namespace VirtualNes.Core
return ch2.nowvolume * vol / 256;
}
// 樓笭ⅸ歙
// 加重平均
int num_times, total;
num_times = total = 0;
while (ch2.phaseacc < 0)
@ -832,9 +832,9 @@ namespace VirtualNes.Core
}
int volume = ch.nowvolume;
if (!(Supporter.Config.sound.bChangeTone && (ChannelTone[(ch.complement == 0) ? 0 : 1, ch.reg[0] >> 6]) != 0))
if (!(Supporter.S.Config.sound.bChangeTone && (ChannelTone[(ch.complement == 0) ? 0 : 1, ch.reg[0] >> 6]) != 0))
{
// 娗嶲<EFBFBD>
// 補間処理
double total;
double sample_weight = ch.phaseacc;
if (sample_weight > cycle_rate)
@ -864,7 +864,7 @@ namespace VirtualNes.Core
int x = ChannelTone[(ch.complement == 0) ? 0 : 1, ch.reg[0] >> 6] - 1;
int pTone = 0;
// 載陔剠仄
// 更新無し
ch.phaseacc -= cycle_rate * 2;
if (ch.phaseacc >= 0)
{
@ -872,7 +872,7 @@ namespace VirtualNes.Core
return temp * volume / ((1 << RECTANGLE_VOL_SHIFT) / 2);
}
// 1旦氾永皿分仃載陔
// 1ステップだけ更新
int freq = INT2FIX(ch.freq + 1);
if (freq > cycle_rate * 2)
{
@ -882,7 +882,7 @@ namespace VirtualNes.Core
return temp * volume / ((1 << RECTANGLE_VOL_SHIFT) / 2);
}
// 樓笭ⅸ歙
// 加重平均
int num_times, total;
num_times = total = 0;
while (ch.phaseacc < 0)
@ -1015,7 +1015,7 @@ namespace VirtualNes.Core
SyncWrite4017(data);
break;
// VirtuaNES娚葲<EFBFBD><EFBFBD><EFBFBD>
// VirtuaNES屌桳億乕僩
case 0x4018:
SyncUpdateRectangle(ch0, data);
SyncUpdateRectangle(ch1, data);

View File

@ -1110,7 +1110,7 @@ namespace VirtualNes.Core
case 0xD2: /* JAM */
case 0xF2: /* JAM */
default:
if (!Supporter.Config.emulator.bIllegalOp)
if (!Supporter.S.Config.emulator.bIllegalOp)
{
throw new Exception("IllegalOp");
}

View File

@ -40,7 +40,7 @@ namespace VirtualNes.Core
Debuger.Log($"SOUND CODE:{addr & 0x1F:X2}");
// OSDにするべきか…
if (Supporter.Config.sound.bExtraSoundEnable)
if (Supporter.S.Config.sound.bExtraSoundEnable)
{
//TODO : 似乎VirtuaNES有直接播放某个音频文件的功能
//DirectSound.EsfAllStop();

View File

@ -43,7 +43,7 @@ namespace VirtualNes.Core
}
// OSDにするべきか…
if (Supporter.Config.sound.bExtraSoundEnable)
if (Supporter.S.Config.sound.bExtraSoundEnable)
{
//TODO : 似乎VirtuaNES有直接播放某个音频文件的功能
//DirectSound.EsfAllStop();

View File

@ -57,7 +57,7 @@ namespace VirtualNes.Core
9,10, 8,11,13,12,14,15 };
// OSDにするべきか…
if (Supporter.Config.sound.bExtraSoundEnable)
if (Supporter.S.Config.sound.bExtraSoundEnable)
{
//TODO : 似乎VirtuaNES有直接播放某个音频文件的功能
Debuger.Log($"CODE {data:X2}");

View File

@ -326,7 +326,7 @@ namespace VirtualNes.Core
if (pad.GetExController() != (int)EXCONTROLLER.EXCONTROLLER_TURBOFILE)
return;
var fp = Supporter.OpenFile(Supporter.Config.path.szSavePath, "TurboFile.vtf");
var fp = Supporter.S.OpenFile(Supporter.S.Config.path.szSavePath, "TurboFile.vtf");
try
{
if (fp == null)
@ -367,10 +367,10 @@ namespace VirtualNes.Core
if (!rom.IsSAVERAM())
return;
var saveFileDir = Supporter.Config.path.szSavePath;
var saveFileDir = Supporter.S.Config.path.szSavePath;
var saveFileName = $"{rom.GetRomName()}.sav";
var fp = Supporter.OpenFile(saveFileDir, saveFileName);
var fp = Supporter.S.OpenFile(saveFileDir, saveFileName);
try
{
@ -502,13 +502,13 @@ namespace VirtualNes.Core
EmulationCPU(nescfg.ScanlineCycles);
if (bDraw)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
if (pad.IsZapperMode() && scanline == ZapperY)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
@ -518,7 +518,7 @@ namespace VirtualNes.Core
}
else
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
}
}
@ -535,13 +535,13 @@ namespace VirtualNes.Core
EmulationCPU(nescfg.HDrawCycles);
if (bDraw)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
if (pad.IsZapperMode() && scanline == ZapperY)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
@ -551,7 +551,7 @@ namespace VirtualNes.Core
}
else
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
}
}
@ -658,7 +658,7 @@ namespace VirtualNes.Core
// 僗僋儕乕儞昤夋(Scanline 1乣239)
if (bDraw)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
ppu.ScanlineNext();
EmulationCPU(FETCH_CYCLES * 10);
mapper.HSync(scanline);
@ -670,7 +670,7 @@ namespace VirtualNes.Core
{
if (pad.IsZapperMode() && scanline == ZapperY)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
ppu.ScanlineNext();
EmulationCPU(FETCH_CYCLES * 10);
mapper.HSync(scanline);
@ -694,7 +694,7 @@ namespace VirtualNes.Core
}
else
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
ppu.ScanlineNext();
EmulationCPU(FETCH_CYCLES * 10);
mapper.HSync(scanline);
@ -1095,7 +1095,7 @@ namespace VirtualNes.Core
Debuger.Log($"Saving SAVERAM...[{romName}]");
Supporter.SaveSRAMToFile(MMU.WRAM, romName);
Supporter.S.SaveSRAMToFile(MMU.WRAM, romName);
}
}
@ -1143,7 +1143,7 @@ namespace VirtualNes.Core
}
}
Supporter.SaveDISKToFile(contents.ToArray(), rom.GetRomName());
Supporter.S.SaveDISKToFile(contents.ToArray(), rom.GetRomName());
}
catch (Exception ex)
{
@ -1168,7 +1168,7 @@ namespace VirtualNes.Core
{
Debuger.Log("Saving TURBOFILE...");
Supporter.SaveFile(MMU.ERAM, Supporter.Config.path.szSavePath, "TurboFile.vtf");
Supporter.S.SaveFile(MMU.ERAM, Supporter.S.Config.path.szSavePath, "TurboFile.vtf");
}
}

View File

@ -181,7 +181,7 @@ namespace VirtualNes.Core
}
else
{
if (Supporter.Config.emulator.bFourPlayer)
if (Supporter.S.Config.emulator.bFourPlayer)
{
// NES type
pad1bit = padbitsync[0] | ((uint)padbitsync[2] << 8) | 0x00080000;

View File

@ -50,7 +50,7 @@ namespace VirtualNes.Core
try
{
fp = Supporter.OpenRom(fname);
fp = Supporter.S.OpenRom(fname);
if (fp == null)
{
throw new System.Exception($"Open Rom Failed:[{fname}]");
@ -167,7 +167,7 @@ namespace VirtualNes.Core
lpPRG[3] = 0x1A;
lpPRG[4] = (byte)diskno;
fp = Supporter.OpenFile_DISKSYS();
fp = Supporter.S.OpenFile_DISKSYS();
if (fp == null)
{
throw new Exception($"Not found DISKSYS.ROM for [{fname}]");
@ -217,7 +217,7 @@ namespace VirtualNes.Core
throw new Exception($"Unsupport format:[{fname}]");
}
Supporter.GetFilePathInfo(fname, out fullpath, out path);
Supporter.S.GetRomPathInfo(fname, out fullpath, out path);
name = Path.GetFileNameWithoutExtension(fullpath);
if (!bNSF)
{
@ -244,7 +244,7 @@ namespace VirtualNes.Core
FileNameCheck(fname);
if (Supporter.TryGetMapperNo(this, out int mapperNo))
if (Supporter.S.TryGetMapperNo(this, out int mapperNo))
{
Debuger.Log($"ROMDB Set Mapper #{mapper:000} to #{mapperNo:000}");
mapper = mapperNo;

View File

@ -51,9 +51,25 @@ namespace VirtualNes.Core
public override int GetHashCode()
{
//return CombineHashCode(raw0, raw1, raw2, raw3, valid);
return HashCode.Combine(raw0, raw1, raw2, raw3, valid);
}
/// <summary>
/// .NetStandard2.0编译备用函数
/// </summary>
/// <param name="raw0"></param>
/// <param name="raw1"></param>
/// <param name="raw2"></param>
/// <param name="raw3"></param>
/// <param name="valid"></param>
/// <returns></returns>
static int CombineHashCode(uint raw0, uint raw1, uint raw2, uint raw3, bool valid)
{
uint validUInt = valid ? 1u : 0u;
uint combinedHash = (raw0 * 31 + raw1) * 31 + raw2 * 31 + raw3 * 31 + validUInt;
return (int)combinedHash;
}
public static bool operator ==(ControllerState left, ControllerState right)
{
return

View File

@ -1,77 +1,16 @@
using System.IO;
using System.IO;
namespace VirtualNes.Core
{
public static class Supporter
{
private static ISupporterImpl s_support;
internal static ISupporterImpl S => s_support;
public static void Setup(ISupporterImpl supporter)
{
s_support = supporter;
}
public static Stream OpenRom(string fname)
{
return s_support.OpenRom(fname);
}
public static void GetFilePathInfo(string fname, out string fullPath, out string directPath)
{
s_support.GetRomPathInfo(fname, out fullPath, out directPath);
}
public static Stream OpenFile_DISKSYS()
{
return s_support.OpenFile_DISKSYS();
}
public static void SaveSRAMToFile(byte[] sramContent, string romName)
{
s_support.SaveSRAMToFile(sramContent, romName);
}
public static void SaveDISKToFile(byte[] diskFileContent, string romName)
{
s_support.SaveDISKToFile(diskFileContent, romName);
}
public static void PrepareDirectory(string directPath)
{
s_support.PrepareDirectory(directPath);
}
public static void SaveFile(byte[] fileData, string directPath, string fileName)
{
s_support.SaveFile(fileData, directPath, fileName);
}
public static Stream OpenFile(string directPath, string fileName)
{
return s_support.OpenFile(directPath, fileName);
}
public static bool TryGetMapperNo(ROM rom, out int mapperNo)
{
return s_support.TryGetMapperNo(rom, out mapperNo);
}
public static ControllerState GetControllerState()
{
return s_support.GetControllerState();
}
public static void SampleInput(uint frameCount)
{
s_support.SampleInput(frameCount);
}
public static IControllerSetuper GetControllerSetuper()
{
return s_support.GetControllerSetuper();
}
public static EmulatorConfig Config => s_support.Config;
}
public interface ISupporterImpl
@ -82,28 +21,11 @@ namespace VirtualNes.Core
void SaveSRAMToFile(byte[] sramContent, string romName);
void SaveDISKToFile(byte[] diskFileContent, string romName);
EmulatorConfig Config { get; }
void PrepareDirectory(string directPath);
void SaveFile(byte[] fileData, string directPath, string fileName);
Stream OpenFile(string directPath, string fileName);
bool TryGetMapperNo(ROM rom, out int mapperNo);
ControllerState GetControllerState();
void SampleInput(uint frameCount);
IControllerSetuper GetControllerSetuper();
}
/// <summary>
/// 负责管理本地控制器与具体游戏之间的槽位分配
/// </summary>
public interface IControllerSetuper
{
/// <summary>
/// 设置本地手柄与游戏手柄槽位的映射
/// </summary>
void SetConnect(
uint? con0ToSlot = null,
uint? con1ToSlot = null,
uint? con2ToSlot = null,
uint? con3ToSlot = null);
}
}

View File

@ -2,7 +2,6 @@
"dependencies": {
"com.unity.2d.sprite": "1.0.0",
"com.unity.ide.visualstudio": "2.0.22",
"com.unity.postprocessing": "3.4.0",
"com.unity.ugui": "2.0.0",
"com.unity.modules.accessibility": "1.0.0",
"com.unity.modules.ai": "1.0.0",

View File

@ -22,15 +22,6 @@
},
"url": "https://packages.unity.cn"
},
"com.unity.postprocessing": {
"version": "3.4.0",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.modules.physics": "1.0.0"
},
"url": "https://packages.unity.cn"
},
"com.unity.test-framework": {
"version": "1.4.5",
"depth": 1,

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AxibugEmuOnline.Web", "Axib
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AxibugEmuOnline.Server", "AxibugEmuOnline.Server\AxibugEmuOnline.Server.csproj", "{9F509DB4-CDB4-4CDB-9C10-805C5E644EEF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualNes.Core", "VirtualNes.Core\VirtualNes.Core.csproj", "{8A4771D6-74B9-453C-9932-6B774280E325}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualNes.Core", "Core\VirtualNes.Core\VirtualNes.Core.csproj", "{637EB35A-4D1A-41EA-9A7B-459E17E93981}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -23,10 +23,10 @@ Global
{9F509DB4-CDB4-4CDB-9C10-805C5E644EEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F509DB4-CDB4-4CDB-9C10-805C5E644EEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F509DB4-CDB4-4CDB-9C10-805C5E644EEF}.Release|Any CPU.Build.0 = Release|Any CPU
{8A4771D6-74B9-453C-9932-6B774280E325}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A4771D6-74B9-453C-9932-6B774280E325}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A4771D6-74B9-453C-9932-6B774280E325}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A4771D6-74B9-453C-9932-6B774280E325}.Release|Any CPU.Build.0 = Release|Any CPU
{637EB35A-4D1A-41EA-9A7B-459E17E93981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{637EB35A-4D1A-41EA-9A7B-459E17E93981}.Debug|Any CPU.Build.0 = Debug|Any CPU
{637EB35A-4D1A-41EA-9A7B-459E17E93981}.Release|Any CPU.ActiveCfg = Release|Any CPU
{637EB35A-4D1A-41EA-9A7B-459E17E93981}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -73,7 +73,7 @@ namespace VirtualNes.Core
public void Process(ISoundDataBuffer lpBuffer, uint dwSize)
{
int nBits = Supporter.Config.sound.nBits;
int nBits = Supporter.S.Config.sound.nBits;
uint dwLength = (uint)(dwSize / (nBits / 8));
int output;
QUEUEDATA q = new QUEUEDATA();
@ -82,11 +82,11 @@ namespace VirtualNes.Core
var pSoundBuf = m_SoundBuffer;
int nCcount = 0;
int nFilterType = Supporter.Config.sound.nFilterType;
int nFilterType = Supporter.S.Config.sound.nFilterType;
if (!Supporter.Config.sound.bEnable)
if (!Supporter.S.Config.sound.bEnable)
{
byte empty = (byte)(Supporter.Config.sound.nRate == 8 ? 128 : 0);
byte empty = (byte)(Supporter.S.Config.sound.nRate == 8 ? 128 : 0);
for (int i = 0; i < dwSize; i++)
lpBuffer.WriteByte(empty);
return;
@ -108,7 +108,7 @@ namespace VirtualNes.Core
MemoryUtility.ZEROMEMORY(vol, vol.Length);
var bMute = m_bMute;
var nVolume = Supporter.Config.sound.nVolume;
var nVolume = Supporter.S.Config.sound.nVolume;
int nMasterVolume = bMute[0] ? nVolume[0] : 0;
@ -151,7 +151,7 @@ namespace VirtualNes.Core
vol[23] = (int)(bMute[8] ? (FME7_VOL * nVolume[11] * nMasterVolume) / (100 * 100) : 0);
// double cycle_rate = ((double)FRAME_CYCLES*60.0/12.0)/(double)Config.sound.nRate;
double cycle_rate = (nes.nescfg.FrameCycles * 60.0 / 12.0) / Supporter.Config.sound.nRate;
double cycle_rate = (nes.nescfg.FrameCycles * 60.0 / 12.0) / Supporter.S.Config.sound.nRate;
// CPUサイクル数がループしてしまった時の対策処理
if (elapsed_time > nes.cpu.GetTotalCycles())
@ -253,7 +253,7 @@ namespace VirtualNes.Core
// DC成分のカット(HPF TEST)
{
// static double cutoff = (2.0*3.141592653579*40.0/44100.0);
double cutoff = cutofftemp / Supporter.Config.sound.nRate;
double cutoff = cutofftemp / Supporter.S.Config.sound.nRate;
double @in, @out;
@in = output;
@ -436,7 +436,7 @@ namespace VirtualNes.Core
public void SoundSetup()
{
float fClock = nes.nescfg.CpuClock;
int nRate = Supporter.Config.sound.nRate;
int nRate = Supporter.S.Config.sound.nRate;
@internal.Setup(fClock, nRate);
vrc6.Setup(fClock, nRate);
@ -460,7 +460,7 @@ namespace VirtualNes.Core
elapsed_time = 0;
float fClock = nes.nescfg.CpuClock;
int nRate = Supporter.Config.sound.nRate;
int nRate = Supporter.S.Config.sound.nRate;
@internal.Reset(fClock, nRate);
vrc6.Reset(fClock, nRate);

View File

@ -1,4 +1,4 @@

using System;
namespace VirtualNes.Core
@ -184,15 +184,15 @@ namespace VirtualNes.Core
Setup(fClock, nRate);
// $4011反場ヽ趙仄卅中
// $4011は初期化しない
ushort addr;
for (addr = 0x4000; addr <= 0x4010; addr++)
{
Write(addr, 0x00);
SyncWrite(addr, 0x00);
}
// Write( 0x4001, 0x08 ); // Reset媆反inc乒奈玉卞卅月?
// Write( 0x4005, 0x08 ); // Reset媆反inc乒奈玉卞卅月?
// Write( 0x4001, 0x08 ); // Reset時はincモードになる?
// Write( 0x4005, 0x08 ); // Reset時はincモードになる?
Write(0x4012, 0x00);
Write(0x4013, 0x00);
Write(0x4015, 0x00);
@ -200,7 +200,7 @@ namespace VirtualNes.Core
SyncWrite(0x4013, 0x00);
SyncWrite(0x4015, 0x00);
// $4017反𤩸五煋心匹場ヽ趙仄卅中(場ヽ乒奈玉互0匹丐月及毛ヽ渾仄凶末白玄互丐月鮋)
// $4017は書き込みで初期化しない(初期モードが0であるのを期待したソフトがある為)
FrameIRQ = 0xC0;
FrameCycle = 0;
FrameIRQoccur = 0;
@ -301,7 +301,7 @@ namespace VirtualNes.Core
case 0x4017:
break;
// VirtuaNES嘐衄禾奈玄
// VirtuaNES固有ポート
case 0x4018:
UpdateRectangle(ch0, data);
UpdateRectangle(ch1, data);
@ -635,7 +635,7 @@ namespace VirtualNes.Core
}
}
// 奶件民平堪中皿民用奶朮市永玄(TEST)
// インチキ臭いプチノイズカット(TEST)
ch4.dpcm_output_real = ((ch4.reg[1] & 0x01) + ch4.dpcm_value * 2) - 0x40;
if (Math.Abs(ch4.dpcm_output_real - ch4.dpcm_output_fake) <= 8)
{
@ -712,7 +712,7 @@ namespace VirtualNes.Core
private int RenderTriangle()
{
int vol;
if (Supporter.Config.sound.bDisableVolumeEffect)
if (Supporter.S.Config.sound.bDisableVolumeEffect)
{
vol = 256;
}
@ -731,7 +731,7 @@ namespace VirtualNes.Core
return ch2.nowvolume * vol / 256;
}
if (!(Supporter.Config.sound.bChangeTone && ChannelTone[2, 0] != 0))
if (!(Supporter.S.Config.sound.bChangeTone && ChannelTone[2, 0] != 0))
{
ch2.phaseacc -= cycle_rate;
if (ch2.phaseacc >= 0)
@ -756,7 +756,7 @@ namespace VirtualNes.Core
return ch2.nowvolume * vol / 256;
}
// 樓笭ⅸ歙
// 加重平均
int num_times, total;
num_times = total = 0;
while (ch2.phaseacc < 0)
@ -799,7 +799,7 @@ namespace VirtualNes.Core
return ch2.nowvolume * vol / 256;
}
// 樓笭ⅸ歙
// 加重平均
int num_times, total;
num_times = total = 0;
while (ch2.phaseacc < 0)
@ -832,9 +832,9 @@ namespace VirtualNes.Core
}
int volume = ch.nowvolume;
if (!(Supporter.Config.sound.bChangeTone && (ChannelTone[(ch.complement == 0) ? 0 : 1, ch.reg[0] >> 6]) != 0))
if (!(Supporter.S.Config.sound.bChangeTone && (ChannelTone[(ch.complement == 0) ? 0 : 1, ch.reg[0] >> 6]) != 0))
{
// 娗嶲<EFBFBD>
// 補間処理
double total;
double sample_weight = ch.phaseacc;
if (sample_weight > cycle_rate)
@ -864,7 +864,7 @@ namespace VirtualNes.Core
int x = ChannelTone[(ch.complement == 0) ? 0 : 1, ch.reg[0] >> 6] - 1;
int pTone = 0;
// 載陔剠仄
// 更新無し
ch.phaseacc -= cycle_rate * 2;
if (ch.phaseacc >= 0)
{
@ -872,7 +872,7 @@ namespace VirtualNes.Core
return temp * volume / ((1 << RECTANGLE_VOL_SHIFT) / 2);
}
// 1旦氾永皿分仃載陔
// 1ステップだけ更新
int freq = INT2FIX(ch.freq + 1);
if (freq > cycle_rate * 2)
{
@ -882,7 +882,7 @@ namespace VirtualNes.Core
return temp * volume / ((1 << RECTANGLE_VOL_SHIFT) / 2);
}
// 樓笭ⅸ歙
// 加重平均
int num_times, total;
num_times = total = 0;
while (ch.phaseacc < 0)
@ -1015,7 +1015,7 @@ namespace VirtualNes.Core
SyncWrite4017(data);
break;
// VirtuaNES娚葲<EFBFBD><EFBFBD><EFBFBD>
// VirtuaNES屌桳億乕僩
case 0x4018:
SyncUpdateRectangle(ch0, data);
SyncUpdateRectangle(ch1, data);

View File

@ -1110,7 +1110,7 @@ namespace VirtualNes.Core
case 0xD2: /* JAM */
case 0xF2: /* JAM */
default:
if (!Supporter.Config.emulator.bIllegalOp)
if (!Supporter.S.Config.emulator.bIllegalOp)
{
throw new Exception("IllegalOp");
}

View File

@ -40,7 +40,7 @@ namespace VirtualNes.Core
Debuger.Log($"SOUND CODE:{addr & 0x1F:X2}");
// OSDにするべきか…
if (Supporter.Config.sound.bExtraSoundEnable)
if (Supporter.S.Config.sound.bExtraSoundEnable)
{
//TODO : 似乎VirtuaNES有直接播放某个音频文件的功能
//DirectSound.EsfAllStop();

View File

@ -43,7 +43,7 @@ namespace VirtualNes.Core
}
// OSDにするべきか…
if (Supporter.Config.sound.bExtraSoundEnable)
if (Supporter.S.Config.sound.bExtraSoundEnable)
{
//TODO : 似乎VirtuaNES有直接播放某个音频文件的功能
//DirectSound.EsfAllStop();

View File

@ -57,7 +57,7 @@ namespace VirtualNes.Core
9,10, 8,11,13,12,14,15 };
// OSDにするべきか…
if (Supporter.Config.sound.bExtraSoundEnable)
if (Supporter.S.Config.sound.bExtraSoundEnable)
{
//TODO : 似乎VirtuaNES有直接播放某个音频文件的功能
Debuger.Log($"CODE {data:X2}");

View File

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
@ -249,7 +249,7 @@ namespace VirtualNes.Core
LoadDISK();
{
// Pad・ッ・鬣ケトレ、タ、ネウ<EFBFBD>レサッ・ソ・、・゚・<EFBFBD>ー、ャ゚W、、、ホ、ヌ、ウ、ウ、ヌ
// Padクラス内だと初期化タイミングが遅いのでここで
uint crc = rom.GetPROM_CRC();
if (
crc == 0xe792de94 // Best Play - Pro Yakyuu (New) (J)
@ -275,7 +275,7 @@ namespace VirtualNes.Core
LoadTurboFile();
// VS-Unisystem、ホ・ヌ・ユ・ゥ・<EFBFBD>ネヤOカィ
// VS-Unisystemのデフォルト設定
if (rom.IsVSUNISYSTEM())
{
uint crc = rom.GetPROM_CRC();
@ -286,13 +286,13 @@ namespace VirtualNes.Core
Reset();
// ・イゥ`・犹フモミ、ホ・ヌ・ユ・ゥ・<EFBDA9>ネ・ェ・ラ・キ・逾<EFBDA5><E980BE>Oカィ(ヤOカィ諾、ケ瓶、ヒハケ、ヲ樣)
// ゲーム固有のデフォルトオプションを設定(設定戻す時に使う為)
GameOption.defRenderMethod = (int)GetRenderMethod();
GameOption.defIRQtype = GetIrqType();
GameOption.defFrameIRQ = GetFrameIRQmode();
GameOption.defVideoMode = GetVideoMode();
// ヤOカィ、<EFBFBD>愰`・ノ、キ、ニヤOカィ、ケ、<EFBDB9>(・ィ・<EFBDA8>ネ・熙ャ殪、ア、<EFBDB1>ミ・ヌ・ユ・ゥ・<EFBDA9>ネ、ャネ<EFBDAC><EFBE88>)
// 設定をロードして設定する(エントリが無ければデフォルトが入る)
if (rom.GetMapperNo() != 20)
{
GameOption.Load(rom.GetPROM_CRC());
@ -326,17 +326,17 @@ namespace VirtualNes.Core
if (pad.GetExController() != (int)EXCONTROLLER.EXCONTROLLER_TURBOFILE)
return;
var fp = Supporter.OpenFile(Supporter.Config.path.szSavePath, "TurboFile.vtf");
var fp = Supporter.S.OpenFile(Supporter.S.Config.path.szSavePath, "TurboFile.vtf");
try
{
if (fp == null)
{
// xxx ・ユ・。・、・<EFBFBD><EFBFBD>_、ア、゙、サ、<EFBFBD>
// xxx ファイルを開けません
throw new Exception($"Can Not Open File [TurboFile.vtf]");
}
long size = fp.Length;
// ・ユ・。・、・<EFBFBD>オ・、・コネ。オテ
// ファイルサイズ取得
if (size > 32 * 1024)
{
size = 32 * 1024;
@ -354,7 +354,7 @@ namespace VirtualNes.Core
private void LoadDISK()
{
//todo : エナオ忞巐チネ。ヨァウヨ
//todo : 磁碟机读取支持
}
private void LoadSRAM()
@ -367,10 +367,10 @@ namespace VirtualNes.Core
if (!rom.IsSAVERAM())
return;
var saveFileDir = Supporter.Config.path.szSavePath;
var saveFileDir = Supporter.S.Config.path.szSavePath;
var saveFileName = $"{rom.GetRomName()}.sav";
var fp = Supporter.OpenFile(saveFileDir, saveFileName);
var fp = Supporter.S.OpenFile(saveFileDir, saveFileName);
try
{
@ -400,7 +400,7 @@ namespace VirtualNes.Core
{
int i;
// メモリクリア
// 儊儌儕僋儕傾
MemoryUtility.ZEROMEMORY(MMU.RAM, MMU.RAM.Length);
MemoryUtility.ZEROMEMORY(MMU.WRAM, MMU.WRAM.Length);
MemoryUtility.ZEROMEMORY(MMU.DRAM, MMU.DRAM.Length);
@ -420,11 +420,11 @@ namespace VirtualNes.Core
MMU.PROM = MMU.VROM = null;
// 0 除算防止対策
// 0 彍嶼杊巭懳嶔
MMU.PROM_8K_SIZE = MMU.PROM_16K_SIZE = MMU.PROM_32K_SIZE = 1;
MMU.VROM_1K_SIZE = MMU.VROM_2K_SIZE = MMU.VROM_4K_SIZE = MMU.VROM_8K_SIZE = 1;
// デフォルトバンク設定
// 僨僼僅儖僩僶儞僋愝掕
for (i = 0; i < 8; i++)
{
MMU.CPU_MEM_BANK[i] = null;
@ -432,11 +432,11 @@ namespace VirtualNes.Core
MMU.CPU_MEM_PAGE[i] = 0;
}
// 内臓RAM/WRAM
// 撪憻RAM/WRAM
MMU.SetPROM_Bank(0, MMU.RAM, MMU.BANKTYPE_RAM);
MMU.SetPROM_Bank(3, MMU.WRAM, MMU.BANKTYPE_RAM);
// ダミー
// 僟儈乕
MMU.SetPROM_Bank(1, MMU.XRAM, MMU.BANKTYPE_ROM);
MMU.SetPROM_Bank(2, MMU.XRAM, MMU.BANKTYPE_ROM);
@ -502,13 +502,13 @@ namespace VirtualNes.Core
EmulationCPU(nescfg.ScanlineCycles);
if (bDraw)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
if (pad.IsZapperMode() && scanline == ZapperY)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
@ -518,11 +518,11 @@ namespace VirtualNes.Core
}
else
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
}
}
ppu.ScanlineNext(); // これの位置でラスター系は画面が違う
ppu.ScanlineNext(); // 偙傟偺埵抲偱儔僗僞乕宯偼夋柺偑堘偆
if (RenderMethod == EnumRenderMethod.PRE_ALL_RENDER)
EmulationCPU(nescfg.ScanlineCycles);
@ -535,13 +535,13 @@ namespace VirtualNes.Core
EmulationCPU(nescfg.HDrawCycles);
if (bDraw)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
if (pad.IsZapperMode() && scanline == ZapperY)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
else
{
@ -551,7 +551,7 @@ namespace VirtualNes.Core
}
else
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
}
}
}
@ -583,7 +583,7 @@ namespace VirtualNes.Core
{
pad.VSync();
// VBLANK期間
// VBLANK婜娫
if (scanline == nescfg.TotalScanlines - 1)
{
ppu.VBlankEnd();
@ -642,7 +642,7 @@ namespace VirtualNes.Core
if (scanline == 0)
{
// ダミースキャンライン
// 僟儈乕僗僉儍儞儔僀儞
// H-Draw (4fetches*32)
EmulationCPU(FETCH_CYCLES * 128);
ppu.FrameStart();
@ -655,10 +655,10 @@ namespace VirtualNes.Core
}
else if (scanline < 240)
{
// スクリーン描画(Scanline 1239)
// 僗僋儕乕儞昤夋(Scanline 1乣239)
if (bDraw)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
ppu.ScanlineNext();
EmulationCPU(FETCH_CYCLES * 10);
mapper.HSync(scanline);
@ -670,7 +670,7 @@ namespace VirtualNes.Core
{
if (pad.IsZapperMode() && scanline == ZapperY)
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
ppu.ScanlineNext();
EmulationCPU(FETCH_CYCLES * 10);
mapper.HSync(scanline);
@ -694,7 +694,7 @@ namespace VirtualNes.Core
}
else
{
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
ppu.Scanline(scanline, Supporter.S.Config.graphics.bAllSprite, Supporter.S.Config.graphics.bLeftClip);
ppu.ScanlineNext();
EmulationCPU(FETCH_CYCLES * 10);
mapper.HSync(scanline);
@ -707,7 +707,7 @@ namespace VirtualNes.Core
}
else if (scanline == 240)
{
// ダミースキャンライン (Scanline 240)
// 僟儈乕僗僉儍儞儔僀儞 (Scanline 240)
mapper.VSync();
EmulationCPU(nescfg.HDrawCycles);
@ -720,7 +720,7 @@ namespace VirtualNes.Core
{
pad.VSync();
// VBLANK期間
// VBLANK婜娫
if (scanline == nescfg.TotalScanlines - 1)
{
ppu.VBlankEnd();
@ -864,7 +864,7 @@ namespace VirtualNes.Core
MMU.VROM_4K_SIZE = rom.GetVROM_SIZE() * 2;
MMU.VROM_8K_SIZE = rom.GetVROM_SIZE();
// デフォルトバンク
// 僨僼僅儖僩僶儞僋
if (MMU.VROM_8K_SIZE != 0)
{
MMU.SetVROM_8K_Bank(0);
@ -874,7 +874,7 @@ namespace VirtualNes.Core
MMU.SetCRAM_8K_Bank(0);
}
// ミラー
// 儈儔乕
if (rom.Is4SCREEN())
{
MMU.SetVRAM_Mirror(MMU.VRAM_MIRROR4);
@ -976,13 +976,13 @@ namespace VirtualNes.Core
reg.S = 0xFF;
reg.P = CPU.Z_FLAG | CPU.R_FLAG | CPU.I_FLAG;
// 安全対策を兼ねてあえてループに(1秒分)
// 埨慡懳嶔傪寭偹偰偁偊偰儖乕僾偵(1昩暘)
for (int i = 0; i < nescfg.TotalScanlines * 60; i++)
{
EmulationCPU(nescfg.ScanlineCycles);
cpu.GetContext(ref reg);
// 無限ループに入ったことを確認したら抜ける
// 柍尷儖乕僾偵擖偭偨偙偲傪妋擣偟偨傜敳偗傞
if (reg.PC == 0x4700)
{
break;
@ -993,7 +993,7 @@ namespace VirtualNes.Core
}
cpu.GetContext(ref reg);
// 無限ループに入っていたら再設定する
// 柍尷儖乕僾偵擖偭偰偄偨傜嵞愝掕偡傞
if (reg.PC == 0x4700)
{
reg.PC = 0x4720; // Play Address
@ -1009,7 +1009,7 @@ namespace VirtualNes.Core
else
{
cpu.GetContext(ref reg);
reg.PC = 0x4700; // 無限ループ
reg.PC = 0x4700; // 柍尷儖乕僾
reg.S = 0xFF;
EmulationCPU(nescfg.ScanlineCycles * nescfg.TotalScanlines);
@ -1095,7 +1095,7 @@ namespace VirtualNes.Core
Debuger.Log($"Saving SAVERAM...[{romName}]");
Supporter.SaveSRAMToFile(MMU.WRAM, romName);
Supporter.S.SaveSRAMToFile(MMU.WRAM, romName);
}
}
@ -1143,7 +1143,7 @@ namespace VirtualNes.Core
}
}
Supporter.SaveDISKToFile(contents.ToArray(), rom.GetRomName());
Supporter.S.SaveDISKToFile(contents.ToArray(), rom.GetRomName());
}
catch (Exception ex)
{
@ -1168,7 +1168,7 @@ namespace VirtualNes.Core
{
Debuger.Log("Saving TURBOFILE...");
Supporter.SaveFile(MMU.ERAM, Supporter.Config.path.szSavePath, "TurboFile.vtf");
Supporter.S.SaveFile(MMU.ERAM, Supporter.S.Config.path.szSavePath, "TurboFile.vtf");
}
}
@ -1186,7 +1186,7 @@ namespace VirtualNes.Core
if (m_BarcodeCycles > 1000)
{
m_BarcodeCycles = 0;
// 停止?
// 掆巭丠
if (m_BarcodeData[m_BarcodePtr] != 0xFF)
{
m_BarcodeOut = m_BarcodeData[m_BarcodePtr++];
@ -1227,7 +1227,7 @@ namespace VirtualNes.Core
return;
m_TapeCycles += (nescfg.CpuClock / 32000.0);
// m_TapeCycles += (nescfg.CpuClock / 22050.0); // 遅すぎてダメっぽい
// m_TapeCycles += (nescfg.CpuClock / 22050.0); // 抶偡偓偰僟儊偭傐偄
if (m_bTapePlay)
{
@ -1293,7 +1293,7 @@ namespace VirtualNes.Core
return MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF];
}
return 0x00; // Warning予防
return 0x00; // Warning梊杊
}
private byte ReadReg(ushort addr)
@ -1504,7 +1504,7 @@ namespace VirtualNes.Core
pad.Write(addr, data);
apu.Write(addr, data);
break;
// VirtuaNES固有ポート
// VirtuaNES屌桳億乕僩
case 0x18:
apu.Write(addr, data);
break;
@ -1596,7 +1596,7 @@ namespace VirtualNes.Core
ref state.reg.cpureg.FrameIRQ_type,
ref state.reg.cpureg.FrameIRQ,
ref state.reg.cpureg.FrameIRQ_occur);
state.reg.cpureg.FrameIRQ_cycles = cycles; // イホユユ、ャINT、ハ樣」ィ、ゥ
state.reg.cpureg.FrameIRQ_cycles = cycles; // 参照がINTな為
state.reg.cpureg.DMA_cycles = cpu.GetDmaCycles();
state.reg.cpureg.emul_cycles = emul_cycles;
@ -1625,7 +1625,7 @@ namespace VirtualNes.Core
MemoryUtility.memcpy(state.ram.SPPAL, MMU.SPPAL, state.ram.SPPAL.Length);
MemoryUtility.memcpy(state.ram.SPRAM, MMU.SPRAM, state.ram.SPRAM.Length);
// S-RAM STATE(ハケモテ/ホエハケモテ、ヒ騅、<E9A885>鬢コエ贇レ、ケ、<EFBDB9>ミ・サゥ`・ヨ、ケ、<EFBDB9>)
// S-RAM STATE(使用/未使用に関わらず存在すればセーブする)
if (rom.IsSAVERAM())
{
size = (uint)SAVERAM_SIZE;
@ -1649,9 +1649,9 @@ namespace VirtualNes.Core
uint size = 0;
// SAVE CPU MEMORY BANK DATA
// BANK0,1,2、マ・ミ・<EFBFBD>ッ・サゥ`・ヨ、ヒ騅4、ハ、キ
// VirtuaNES0.30、ォ、<EFBFBD>
// ・ミ・<EFBFBD>ッ」ウ、マSRAMハケモテ、ヒ騅、<EFBFBD>鬢コ・サゥ`・ヨ
// BANK0,1,2はバンクセーブに関係なし
// VirtuaNES0.30から
// バンクはSRAM使用に関わらずセーブ
for (int i = 3; i < 8; i++)
{
state.mmu.CPU_MEM_TYPE[i] = MMU.CPU_MEM_TYPE[i];
@ -1696,7 +1696,7 @@ namespace VirtualNes.Core
}
}
// WRITE VRAM MEMORY(ウ」、ヒ4Kキヨ、ケ、ル、ニ抱、ュ゙z、<EFBFBD>)
// WRITE VRAM MEMORY(常に4K分すべて書き込む)
state.VRAM = new byte[4 * 1024];
Array.Copy(MMU.VRAM, state.VRAM, state.VRAM.Length);
@ -1764,7 +1764,7 @@ namespace VirtualNes.Core
int DiskSize = 16 + 65500 * rom.GetDiskNo();
// マ珀`ハ<><EFBFBD>ォ・ヲ・<EFBDA6>
// 相違数をカウント
for (int i = 16; i < DiskSize; i++)
{
if (lpWrite[i] != 0)
@ -1874,9 +1874,9 @@ namespace VirtualNes.Core
//BANK STATE
{
// SAVE CPU MEMORY BANK DATA
// BANK0,1,2、マ・ミ・<EFBFBD>ッ・サゥ`・ヨ、ヒ騅4、ハ、キ
// VirtuaNES0.30、ォ、<EFBFBD>
// ・ミ・<EFBFBD>ッ」ウ、マSRAMハケモテ、ヒ騅、<EFBFBD>鬢コ・サゥ`・ヨ
// BANK0,1,2はバンクセーブに関係なし
// VirtuaNES0.30から
// バンクはSRAM使用に関わらずセーブ
for (byte i = 3; i < 8; i++)
{
MMU.CPU_MEM_TYPE[i] = state.mmu.CPU_MEM_TYPE[i];

View File

@ -181,7 +181,7 @@ namespace VirtualNes.Core
}
else
{
if (Supporter.Config.emulator.bFourPlayer)
if (Supporter.S.Config.emulator.bFourPlayer)
{
// NES type
pad1bit = padbitsync[0] | ((uint)padbitsync[2] << 8) | 0x00080000;

Some files were not shown because too many files have changed in this diff Show More